From b7a8c9b70758f9e2f1c2c9a894455d8250057878 Mon Sep 17 00:00:00 2001 From: cketti Date: Mon, 20 Oct 2014 19:30:20 -0400 Subject: [PATCH 01/39] Remove unused code --- src/com/fsck/k9/view/AttachmentView.java | 37 +----------------------- 1 file changed, 1 insertion(+), 36 deletions(-) diff --git a/src/com/fsck/k9/view/AttachmentView.java b/src/com/fsck/k9/view/AttachmentView.java index 9c5de50a0..ea748218f 100644 --- a/src/com/fsck/k9/view/AttachmentView.java +++ b/src/com/fsck/k9/view/AttachmentView.java @@ -10,7 +10,6 @@ import org.apache.commons.io.IOUtils; import android.content.Context; import android.content.Intent; -import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; @@ -55,7 +54,6 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo public String name; public String contentType; public long size; - public ImageView iconView; private AttachmentFileDownloadCallback callback; @@ -310,37 +308,6 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo } } - /** - * Check the {@link PackageManager} if the phone has an application - * installed to view this type of attachment. - * If not, {@link #viewButton} is disabled. - * This should be done in any place where - * attachment.viewButton.setEnabled(enabled); is called. - * This method is safe to be called from the UI-thread. - */ - public void checkViewable() { - if (viewButton.getVisibility() == View.GONE) { - // nothing to do - return; - } - if (!viewButton.isEnabled()) { - // nothing to do - return; - } - try { - Uri uri = AttachmentProvider.getAttachmentUriForViewing(mAccount, part.getAttachmentId()); - Intent intent = new Intent(Intent.ACTION_VIEW); - intent.setData(uri); - intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); - if (intent.resolveActivity(mContext.getPackageManager()) == null) { - viewButton.setEnabled(false); - } - // currently we do not cache re result. - } catch (Exception e) { - Log.e(K9.LOG_TAG, "Cannot resolve activity to determine if we shall show the 'view'-button for an attachment", e); - } - } - public void attachmentSaved(final String filename) { Toast.makeText(mContext, String.format( mContext.getString(R.string.message_view_status_attachment_saved), filename), @@ -352,9 +319,7 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo mContext.getString(R.string.message_view_status_attachment_not_saved), Toast.LENGTH_LONG).show(); } - public AttachmentFileDownloadCallback getCallback() { - return callback; - } + public void setCallback(AttachmentFileDownloadCallback callback) { this.callback = callback; } From dfe1771fcbcafd0e0583ee989d8509ffc55ac9e6 Mon Sep 17 00:00:00 2001 From: cketti Date: Mon, 20 Oct 2014 19:39:16 -0400 Subject: [PATCH 02/39] Fix formatting --- src/com/fsck/k9/view/AttachmentView.java | 38 ++++++++++++++---------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/src/com/fsck/k9/view/AttachmentView.java b/src/com/fsck/k9/view/AttachmentView.java index ea748218f..9c16777fc 100644 --- a/src/com/fsck/k9/view/AttachmentView.java +++ b/src/com/fsck/k9/view/AttachmentView.java @@ -1,5 +1,6 @@ package com.fsck.k9.view; + import java.io.File; import java.io.FileOutputStream; import java.io.IOException; @@ -42,6 +43,7 @@ import com.fsck.k9.mail.internet.MimeUtility; import com.fsck.k9.mail.store.LocalStore.LocalAttachmentBodyPart; import com.fsck.k9.provider.AttachmentProvider; + public class AttachmentView extends FrameLayout implements OnClickListener, OnLongClickListener { private Context mContext; public Button viewButton; @@ -61,10 +63,12 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo super(context, attrs, defStyle); mContext = context; } + public AttachmentView(Context context, AttributeSet attrs) { super(context, attrs); mContext = context; } + public AttachmentView(Context context) { super(context); mContext = context; @@ -79,6 +83,7 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo * and save the reference to the attachment view for later. * in his onActivityResult he can get the saved reference and * call the saveFile method of AttachmentView + * * @param view */ public void showFileBrowser(AttachmentView caller); @@ -86,7 +91,6 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo /** * Populates this view with information about the attachment. - * *

* This method also decides which attachments are displayed when the "show attachments" button * is pressed, and which attachments are only displayed after the "show more attachments" @@ -103,7 +107,7 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo * @return {@code true} for a regular attachment. {@code false}, otherwise. * * @throws MessagingException - * In case of an error + * In case of an error */ public boolean populateFromPart(Part inputPart, Message message, Account account, MessagingController controller, MessagingListener listener) throws MessagingException { @@ -216,10 +220,10 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo Bitmap icon = null; try { InputStream input = mContext.getContentResolver().openInputStream( - AttachmentProvider.getAttachmentThumbnailUri(mAccount, - part.getAttachmentId(), - 62, - 62)); + AttachmentProvider.getAttachmentThumbnailUri(mAccount, + part.getAttachmentId(), + 62, + 62)); icon = BitmapFactory.decodeStream(input); input.close(); } catch (Exception e) { @@ -232,7 +236,7 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo private void onViewButtonClicked() { if (mMessage != null) { - mController.loadAttachment(mAccount, mMessage, part, new Object[] { false, this }, mListener); + mController.loadAttachment(mAccount, mMessage, part, new Object[] {false, this}, mListener); } } @@ -243,7 +247,9 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo /** * Writes the attachment onto the given path - * @param directory: the base dir where the file should be saved. + * + * @param directory + * the base dir where the file should be saved. */ public void writeFile(File directory) { try { @@ -282,8 +288,8 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo * the time downloading it and then abort. */ Toast.makeText(mContext, - mContext.getString(R.string.message_view_status_attachment_not_saved), - Toast.LENGTH_SHORT).show(); + mContext.getString(R.string.message_view_status_attachment_not_saved), + Toast.LENGTH_SHORT).show(); return; } if (mMessage != null) { @@ -303,25 +309,25 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo mContext.startActivity(intent); } catch (Exception e) { Log.e(K9.LOG_TAG, "Could not display attachment of type " + contentType, e); - Toast toast = Toast.makeText(mContext, mContext.getString(R.string.message_view_no_viewer, contentType), Toast.LENGTH_LONG); + Toast toast = Toast.makeText(mContext, mContext.getString(R.string.message_view_no_viewer, contentType), + Toast.LENGTH_LONG); toast.show(); } } public void attachmentSaved(final String filename) { Toast.makeText(mContext, String.format( - mContext.getString(R.string.message_view_status_attachment_saved), filename), - Toast.LENGTH_LONG).show(); + mContext.getString(R.string.message_view_status_attachment_saved), filename), + Toast.LENGTH_LONG).show(); } public void attachmentNotSaved() { Toast.makeText(mContext, - mContext.getString(R.string.message_view_status_attachment_not_saved), - Toast.LENGTH_LONG).show(); + mContext.getString(R.string.message_view_status_attachment_not_saved), + Toast.LENGTH_LONG).show(); } public void setCallback(AttachmentFileDownloadCallback callback) { this.callback = callback; } - } From 187d760e5f48b42250f2f994ca7989631f1721e0 Mon Sep 17 00:00:00 2001 From: cketti Date: Mon, 20 Oct 2014 19:50:41 -0400 Subject: [PATCH 03/39] Extract code to display error/status messages to a separate method --- src/com/fsck/k9/view/AttachmentView.java | 25 ++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/com/fsck/k9/view/AttachmentView.java b/src/com/fsck/k9/view/AttachmentView.java index 9c16777fc..c7dc3841e 100644 --- a/src/com/fsck/k9/view/AttachmentView.java +++ b/src/com/fsck/k9/view/AttachmentView.java @@ -287,9 +287,8 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo * Abort early if there's no place to save the attachment. We don't want to spend * the time downloading it and then abort. */ - Toast.makeText(mContext, - mContext.getString(R.string.message_view_status_attachment_not_saved), - Toast.LENGTH_SHORT).show(); + String message = mContext.getString(R.string.message_view_status_attachment_not_saved); + displayMessageToUser(message); return; } if (mMessage != null) { @@ -309,22 +308,24 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo mContext.startActivity(intent); } catch (Exception e) { Log.e(K9.LOG_TAG, "Could not display attachment of type " + contentType, e); - Toast toast = Toast.makeText(mContext, mContext.getString(R.string.message_view_no_viewer, contentType), - Toast.LENGTH_LONG); - toast.show(); + + String message = mContext.getString(R.string.message_view_no_viewer, contentType); + displayMessageToUser(message); } } public void attachmentSaved(final String filename) { - Toast.makeText(mContext, String.format( - mContext.getString(R.string.message_view_status_attachment_saved), filename), - Toast.LENGTH_LONG).show(); + String message = mContext.getString(R.string.message_view_status_attachment_saved, filename); + displayMessageToUser(message); } public void attachmentNotSaved() { - Toast.makeText(mContext, - mContext.getString(R.string.message_view_status_attachment_not_saved), - Toast.LENGTH_LONG).show(); + String message = mContext.getString(R.string.message_view_status_attachment_not_saved); + displayMessageToUser(message); + } + + private void displayMessageToUser(String message) { + Toast.makeText(mContext, message, Toast.LENGTH_LONG).show(); } public void setCallback(AttachmentFileDownloadCallback callback) { From 33d12e416900acfb35b7870e275ff45aaeced02f Mon Sep 17 00:00:00 2001 From: cketti Date: Mon, 20 Oct 2014 19:52:42 -0400 Subject: [PATCH 04/39] Fix russian translation of 'message_view_no_viewer' --- res/values-ru/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 0760d9ce1..9e3963f91 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -229,7 +229,7 @@ K-9 Mail — почтовый клиент для Android. Вложения Показать вложения Извлечение вложений - Отсутствует просмотрщик %s %s + Отсутствует просмотрщик %s Загрузить полностью Загрузка… From 0ced8746af6f2f0b61a489d2fe56a1cb0e6f2d54 Mon Sep 17 00:00:00 2001 From: cketti Date: Mon, 20 Oct 2014 20:04:55 -0400 Subject: [PATCH 05/39] Remove old/unused code from click handler --- src/com/fsck/k9/fragment/MessageViewFragment.java | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/src/com/fsck/k9/fragment/MessageViewFragment.java b/src/com/fsck/k9/fragment/MessageViewFragment.java index 5f267bb64..c267797b1 100644 --- a/src/com/fsck/k9/fragment/MessageViewFragment.java +++ b/src/com/fsck/k9/fragment/MessageViewFragment.java @@ -503,15 +503,8 @@ public class MessageViewFragment extends Fragment implements OnClickListener, @Override public void onClick(View view) { - switch (view.getId()) { - case R.id.download: { - ((AttachmentView)view).saveFile(); - break; - } - case R.id.download_remainder: { - onDownloadRemainder(); - break; - } + if (view.getId() == R.id.download_remainder) { + onDownloadRemainder(); } } From 4a6c52947d22315028d926ab621aa4e329d85fc6 Mon Sep 17 00:00:00 2001 From: cketti Date: Mon, 20 Oct 2014 20:14:04 -0400 Subject: [PATCH 06/39] Make all fields of AttachmentView private --- src/com/fsck/k9/view/AttachmentView.java | 17 +++++++++++------ src/com/fsck/k9/view/SingleMessageView.java | 3 +-- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/com/fsck/k9/view/AttachmentView.java b/src/com/fsck/k9/view/AttachmentView.java index c7dc3841e..27ab0e657 100644 --- a/src/com/fsck/k9/view/AttachmentView.java +++ b/src/com/fsck/k9/view/AttachmentView.java @@ -46,16 +46,16 @@ import com.fsck.k9.provider.AttachmentProvider; public class AttachmentView extends FrameLayout implements OnClickListener, OnLongClickListener { private Context mContext; - public Button viewButton; - public Button downloadButton; - public LocalAttachmentBodyPart part; + private Button viewButton; + private Button downloadButton; + private LocalAttachmentBodyPart part; private Message mMessage; private Account mAccount; private MessagingController mController; private MessagingListener mListener; - public String name; - public String contentType; - public long size; + private String name; + private String contentType; + private long size; private AttachmentFileDownloadCallback callback; @@ -89,6 +89,11 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo public void showFileBrowser(AttachmentView caller); } + public void setButtonsEnabled(boolean enabled) { + viewButton.setEnabled(enabled); + downloadButton.setEnabled(enabled); + } + /** * Populates this view with information about the attachment. *

diff --git a/src/com/fsck/k9/view/SingleMessageView.java b/src/com/fsck/k9/view/SingleMessageView.java index 58a5821cf..2921ed494 100644 --- a/src/com/fsck/k9/view/SingleMessageView.java +++ b/src/com/fsck/k9/view/SingleMessageView.java @@ -607,8 +607,7 @@ public class SingleMessageView extends LinearLayout implements OnClickListener, public void setAttachmentsEnabled(boolean enabled) { for (int i = 0, count = mAttachments.getChildCount(); i < count; i++) { AttachmentView attachment = (AttachmentView) mAttachments.getChildAt(i); - attachment.viewButton.setEnabled(enabled); - attachment.downloadButton.setEnabled(enabled); + attachment.setButtonsEnabled(enabled); } } From 4299eb9771d63b53a94a7829f13c7c3855f243b5 Mon Sep 17 00:00:00 2001 From: cketti Date: Mon, 20 Oct 2014 20:28:38 -0400 Subject: [PATCH 07/39] Rename method and improve documentation --- .../fsck/k9/fragment/MessageViewFragment.java | 2 +- src/com/fsck/k9/view/AttachmentView.java | 19 +++++++------------ 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/src/com/fsck/k9/fragment/MessageViewFragment.java b/src/com/fsck/k9/fragment/MessageViewFragment.java index c267797b1..b66ebc618 100644 --- a/src/com/fsck/k9/fragment/MessageViewFragment.java +++ b/src/com/fsck/k9/fragment/MessageViewFragment.java @@ -207,7 +207,7 @@ public class MessageViewFragment extends Fragment implements OnClickListener, mMessageView.setAttachmentCallback(new AttachmentFileDownloadCallback() { @Override - public void showFileBrowser(final AttachmentView caller) { + public void pickDirectoryToSaveAttachmentTo(final AttachmentView caller) { FileBrowserHelper.getInstance() .showFileBrowserActivity(MessageViewFragment.this, null, diff --git a/src/com/fsck/k9/view/AttachmentView.java b/src/com/fsck/k9/view/AttachmentView.java index 27ab0e657..9a9fbf05e 100644 --- a/src/com/fsck/k9/view/AttachmentView.java +++ b/src/com/fsck/k9/view/AttachmentView.java @@ -7,8 +7,6 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import org.apache.commons.io.IOUtils; - import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; @@ -42,6 +40,7 @@ import com.fsck.k9.mail.internet.MimeHeader; import com.fsck.k9.mail.internet.MimeUtility; import com.fsck.k9.mail.store.LocalStore.LocalAttachmentBodyPart; import com.fsck.k9.provider.AttachmentProvider; +import org.apache.commons.io.IOUtils; public class AttachmentView extends FrameLayout implements OnClickListener, OnLongClickListener { @@ -77,16 +76,12 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo public interface AttachmentFileDownloadCallback { /** - * this method i called by the attachmentview when - * he wants to show a filebrowser - * the provider should show the filebrowser activity - * and save the reference to the attachment view for later. - * in his onActivityResult he can get the saved reference and - * call the saveFile method of AttachmentView - * - * @param view + * This method is called to ask the user to pick a directory to save the attachment to. + *

+ * After the user has selected a directory, the implementation of this interface has to call + * {@link #writeFile(File)} on the object supplied as argument in order for the attachment to be saved. */ - public void showFileBrowser(AttachmentView caller); + public void pickDirectoryToSaveAttachmentTo(AttachmentView caller); } public void setButtonsEnabled(boolean enabled) { @@ -214,7 +209,7 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo @Override public boolean onLongClick(View view) { if (view.getId() == R.id.download) { - callback.showFileBrowser(this); + callback.pickDirectoryToSaveAttachmentTo(this); return true; } From ca88f59c0550f65182674c9bb86b75e39fd2eafb Mon Sep 17 00:00:00 2001 From: cketti Date: Mon, 20 Oct 2014 20:46:46 -0400 Subject: [PATCH 08/39] Create named class for loading and displaying attachment thumbnails --- src/com/fsck/k9/view/AttachmentView.java | 71 +++++++++++++----------- 1 file changed, 39 insertions(+), 32 deletions(-) diff --git a/src/com/fsck/k9/view/AttachmentView.java b/src/com/fsck/k9/view/AttachmentView.java index 9a9fbf05e..144ecf40f 100644 --- a/src/com/fsck/k9/view/AttachmentView.java +++ b/src/com/fsck/k9/view/AttachmentView.java @@ -152,7 +152,6 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo contentType = MimeUtility.getMimeTypeForViewing(part.getMimeType(), name); TextView attachmentName = (TextView) findViewById(R.id.attachment_name); TextView attachmentInfo = (TextView) findViewById(R.id.attachment_info); - final ImageView attachmentIcon = (ImageView) findViewById(R.id.attachment_icon); viewButton = (Button) findViewById(R.id.view); downloadButton = (Button) findViewById(R.id.download); if ((!MimeUtility.mimeTypeMatches(contentType, K9.ACCEPTABLE_ATTACHMENT_VIEW_TYPES)) @@ -174,20 +173,9 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo attachmentName.setText(name); attachmentInfo.setText(SizeFormatter.formatSize(mContext, size)); - new AsyncTask() { - protected Bitmap doInBackground(Void... asyncTaskArgs) { - Bitmap previewIcon = getPreviewIcon(); - return previewIcon; - } - protected void onPostExecute(Bitmap previewIcon) { - if (previewIcon != null) { - attachmentIcon.setImageBitmap(previewIcon); - } else { - attachmentIcon.setImageResource(R.drawable.attached_image_placeholder); - } - } - }.execute(); + ImageView thumbnail = (ImageView) findViewById(R.id.attachment_icon); + new LoadAndDisplayThumbnailAsyncTask(thumbnail).execute(); return firstClassAttachment; } @@ -216,24 +204,6 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo return false; } - private Bitmap getPreviewIcon() { - Bitmap icon = null; - try { - InputStream input = mContext.getContentResolver().openInputStream( - AttachmentProvider.getAttachmentThumbnailUri(mAccount, - part.getAttachmentId(), - 62, - 62)); - icon = BitmapFactory.decodeStream(input); - input.close(); - } catch (Exception e) { - /* - * We don't care what happened, we just return null for the preview icon. - */ - } - return icon; - } - private void onViewButtonClicked() { if (mMessage != null) { mController.loadAttachment(mAccount, mMessage, part, new Object[] {false, this}, mListener); @@ -331,4 +301,41 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo public void setCallback(AttachmentFileDownloadCallback callback) { this.callback = callback; } + + private class LoadAndDisplayThumbnailAsyncTask extends AsyncTask { + private final ImageView thumbnail; + + public LoadAndDisplayThumbnailAsyncTask(ImageView thumbnail) { + this.thumbnail = thumbnail; + } + + protected Bitmap doInBackground(Void... asyncTaskArgs) { + return getPreviewIcon(); + } + + private Bitmap getPreviewIcon() { + Bitmap icon = null; + try { + InputStream input = mContext.getContentResolver().openInputStream( + AttachmentProvider.getAttachmentThumbnailUri(mAccount, + part.getAttachmentId(), + 62, + 62)); + icon = BitmapFactory.decodeStream(input); + input.close(); + } catch (Exception e) { + // We don't care what happened, we just return null for the preview icon. + } + + return icon; + } + + protected void onPostExecute(Bitmap previewIcon) { + if (previewIcon != null) { + thumbnail.setImageBitmap(previewIcon); + } else { + thumbnail.setImageResource(R.drawable.attached_image_placeholder); + } + } + } } From b3bc85ba109c8a482cb2660d7e7a0bfb8d9b46c9 Mon Sep 17 00:00:00 2001 From: cketti Date: Mon, 20 Oct 2014 21:06:31 -0400 Subject: [PATCH 09/39] Split 'populateFromPart' into multiple methods --- src/com/fsck/k9/view/AttachmentView.java | 29 +++++++++++++++++------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/src/com/fsck/k9/view/AttachmentView.java b/src/com/fsck/k9/view/AttachmentView.java index 144ecf40f..7fa29bb07 100644 --- a/src/com/fsck/k9/view/AttachmentView.java +++ b/src/com/fsck/k9/view/AttachmentView.java @@ -111,8 +111,23 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo */ public boolean populateFromPart(Part inputPart, Message message, Account account, MessagingController controller, MessagingListener listener) throws MessagingException { - boolean firstClassAttachment = true; + part = (LocalAttachmentBodyPart) inputPart; + mMessage = message; + mAccount = account; + mController = controller; + mListener = listener; + + boolean firstClassAttachment = extractAttachmentInformation(part); + + displayAttachmentInformation(); + + return firstClassAttachment; + } + + //TODO: extract this code to a helper class + private boolean extractAttachmentInformation(Part part) throws MessagingException { + boolean firstClassAttachment = true; contentType = MimeUtility.unfoldAndDecode(part.getContentType()); String contentDisposition = MimeUtility.unfoldAndDecode(part.getDisposition()); @@ -137,11 +152,6 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo firstClassAttachment = false; } - mAccount = account; - mMessage = message; - mController = controller; - mListener = listener; - String sizeParam = MimeUtility.getHeaderParameter(contentDisposition, "size"); if (sizeParam != null) { try { @@ -150,10 +160,15 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo } contentType = MimeUtility.getMimeTypeForViewing(part.getMimeType(), name); + return firstClassAttachment; + } + + private void displayAttachmentInformation() { TextView attachmentName = (TextView) findViewById(R.id.attachment_name); TextView attachmentInfo = (TextView) findViewById(R.id.attachment_info); viewButton = (Button) findViewById(R.id.view); downloadButton = (Button) findViewById(R.id.download); + if ((!MimeUtility.mimeTypeMatches(contentType, K9.ACCEPTABLE_ATTACHMENT_VIEW_TYPES)) || (MimeUtility.mimeTypeMatches(contentType, K9.UNACCEPTABLE_ATTACHMENT_VIEW_TYPES))) { viewButton.setVisibility(View.GONE); @@ -176,8 +191,6 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo ImageView thumbnail = (ImageView) findViewById(R.id.attachment_icon); new LoadAndDisplayThumbnailAsyncTask(thumbnail).execute(); - - return firstClassAttachment; } @Override From 1e89314f3e1e5758cf2cf3022943b3f4d45fb328 Mon Sep 17 00:00:00 2001 From: cketti Date: Mon, 20 Oct 2014 21:09:23 -0400 Subject: [PATCH 10/39] Remove "m" prefix for field names --- src/com/fsck/k9/view/AttachmentView.java | 58 ++++++++++++------------ 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/src/com/fsck/k9/view/AttachmentView.java b/src/com/fsck/k9/view/AttachmentView.java index 7fa29bb07..0dbec5bab 100644 --- a/src/com/fsck/k9/view/AttachmentView.java +++ b/src/com/fsck/k9/view/AttachmentView.java @@ -44,14 +44,14 @@ import org.apache.commons.io.IOUtils; public class AttachmentView extends FrameLayout implements OnClickListener, OnLongClickListener { - private Context mContext; + private Context context; private Button viewButton; private Button downloadButton; private LocalAttachmentBodyPart part; - private Message mMessage; - private Account mAccount; - private MessagingController mController; - private MessagingListener mListener; + private Message message; + private Account account; + private MessagingController controller; + private MessagingListener listener; private String name; private String contentType; private long size; @@ -60,17 +60,17 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo public AttachmentView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); - mContext = context; + this.context = context; } public AttachmentView(Context context, AttributeSet attrs) { super(context, attrs); - mContext = context; + this.context = context; } public AttachmentView(Context context) { super(context); - mContext = context; + this.context = context; } @@ -113,10 +113,10 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo MessagingController controller, MessagingListener listener) throws MessagingException { part = (LocalAttachmentBodyPart) inputPart; - mMessage = message; - mAccount = account; - mController = controller; - mListener = listener; + this.message = message; + this.account = account; + this.controller = controller; + this.listener = listener; boolean firstClassAttachment = extractAttachmentInformation(part); @@ -187,7 +187,7 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo downloadButton.setOnLongClickListener(this); attachmentName.setText(name); - attachmentInfo.setText(SizeFormatter.formatSize(mContext, size)); + attachmentInfo.setText(SizeFormatter.formatSize(context, size)); ImageView thumbnail = (ImageView) findViewById(R.id.attachment_icon); new LoadAndDisplayThumbnailAsyncTask(thumbnail).execute(); @@ -218,8 +218,8 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo } private void onViewButtonClicked() { - if (mMessage != null) { - mController.loadAttachment(mAccount, mMessage, part, new Object[] {false, this}, mListener); + if (message != null) { + controller.loadAttachment(account, message, part, new Object[] {false, this}, listener); } } @@ -238,15 +238,15 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo try { String filename = Utility.sanitizeFilename(name); File file = Utility.createUniqueFile(directory, filename); - Uri uri = AttachmentProvider.getAttachmentUri(mAccount, part.getAttachmentId()); - InputStream in = mContext.getContentResolver().openInputStream(uri); + Uri uri = AttachmentProvider.getAttachmentUri(account, part.getAttachmentId()); + InputStream in = context.getContentResolver().openInputStream(uri); OutputStream out = new FileOutputStream(file); IOUtils.copy(in, out); out.flush(); out.close(); in.close(); attachmentSaved(file.toString()); - new MediaScannerNotifier(mContext, file); + new MediaScannerNotifier(context, file); } catch (IOException ioe) { if (K9.DEBUG) { Log.e(K9.LOG_TAG, "Error saving attachment", ioe); @@ -270,45 +270,45 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo * Abort early if there's no place to save the attachment. We don't want to spend * the time downloading it and then abort. */ - String message = mContext.getString(R.string.message_view_status_attachment_not_saved); + String message = context.getString(R.string.message_view_status_attachment_not_saved); displayMessageToUser(message); return; } - if (mMessage != null) { - mController.loadAttachment(mAccount, mMessage, part, new Object[] {true, this}, mListener); + if (message != null) { + controller.loadAttachment(account, message, part, new Object[] {true, this}, listener); } } public void showFile() { - Uri uri = AttachmentProvider.getAttachmentUriForViewing(mAccount, part.getAttachmentId()); + Uri uri = AttachmentProvider.getAttachmentUriForViewing(account, part.getAttachmentId()); Intent intent = new Intent(Intent.ACTION_VIEW); // We explicitly set the ContentType in addition to the URI because some attachment viewers (such as Polaris office 3.0.x) choke on documents without a mime type intent.setDataAndType(uri, contentType); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); try { - mContext.startActivity(intent); + context.startActivity(intent); } catch (Exception e) { Log.e(K9.LOG_TAG, "Could not display attachment of type " + contentType, e); - String message = mContext.getString(R.string.message_view_no_viewer, contentType); + String message = context.getString(R.string.message_view_no_viewer, contentType); displayMessageToUser(message); } } public void attachmentSaved(final String filename) { - String message = mContext.getString(R.string.message_view_status_attachment_saved, filename); + String message = context.getString(R.string.message_view_status_attachment_saved, filename); displayMessageToUser(message); } public void attachmentNotSaved() { - String message = mContext.getString(R.string.message_view_status_attachment_not_saved); + String message = context.getString(R.string.message_view_status_attachment_not_saved); displayMessageToUser(message); } private void displayMessageToUser(String message) { - Toast.makeText(mContext, message, Toast.LENGTH_LONG).show(); + Toast.makeText(context, message, Toast.LENGTH_LONG).show(); } public void setCallback(AttachmentFileDownloadCallback callback) { @@ -329,8 +329,8 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo private Bitmap getPreviewIcon() { Bitmap icon = null; try { - InputStream input = mContext.getContentResolver().openInputStream( - AttachmentProvider.getAttachmentThumbnailUri(mAccount, + InputStream input = context.getContentResolver().openInputStream( + AttachmentProvider.getAttachmentThumbnailUri(account, part.getAttachmentId(), 62, 62)); From f6822c973dd67656fe4be665a202b89238535041 Mon Sep 17 00:00:00 2001 From: cketti Date: Mon, 20 Oct 2014 21:13:58 -0400 Subject: [PATCH 11/39] Clean up comments --- src/com/fsck/k9/view/AttachmentView.java | 23 ++++------------------- 1 file changed, 4 insertions(+), 19 deletions(-) diff --git a/src/com/fsck/k9/view/AttachmentView.java b/src/com/fsck/k9/view/AttachmentView.java index 0dbec5bab..55a874544 100644 --- a/src/com/fsck/k9/view/AttachmentView.java +++ b/src/com/fsck/k9/view/AttachmentView.java @@ -98,16 +98,7 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo * Inline attachments with content ID and unnamed attachments fall into the second category. *

* - * @param inputPart - * @param message - * @param account - * @param controller - * @param listener - * - * @return {@code true} for a regular attachment. {@code false}, otherwise. - * - * @throws MessagingException - * In case of an error + * @return {@code true} for a regular attachment. {@code false} for attachments that should be initially hidden. */ public boolean populateFromPart(Part inputPart, Message message, Account account, MessagingController controller, MessagingListener listener) throws MessagingException { @@ -229,10 +220,7 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo } /** - * Writes the attachment onto the given path - * - * @param directory - * the base dir where the file should be saved. + * Saves the attachment as file in the given directory */ public void writeFile(File directory) { try { @@ -255,10 +243,6 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo } } - /** - * saves the file to the defaultpath setting in the config, or if the config - * is not set => to the Environment - */ public void writeFile() { writeFile(new File(K9.getAttachmentDefaultPath())); } @@ -283,7 +267,8 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo public void showFile() { Uri uri = AttachmentProvider.getAttachmentUriForViewing(account, part.getAttachmentId()); Intent intent = new Intent(Intent.ACTION_VIEW); - // We explicitly set the ContentType in addition to the URI because some attachment viewers (such as Polaris office 3.0.x) choke on documents without a mime type + // We explicitly set the content type in addition to the URI because some attachment viewers + // (such as Polaris office 3.0.x) choke on documents without a MIME type. intent.setDataAndType(uri, contentType); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); From 83d876f246734a2880ca3544c1cf2093a358993b Mon Sep 17 00:00:00 2001 From: cketti Date: Mon, 20 Oct 2014 21:16:31 -0400 Subject: [PATCH 12/39] Inline method --- src/com/fsck/k9/view/AttachmentView.java | 28 +++++++++--------------- 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/src/com/fsck/k9/view/AttachmentView.java b/src/com/fsck/k9/view/AttachmentView.java index 55a874544..289ea4318 100644 --- a/src/com/fsck/k9/view/AttachmentView.java +++ b/src/com/fsck/k9/view/AttachmentView.java @@ -216,7 +216,16 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo private void onSaveButtonClicked() { - saveFile(); + boolean isExternalStorageMounted = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED); + if (!isExternalStorageMounted) { + String message = context.getString(R.string.message_view_status_attachment_not_saved); + displayMessageToUser(message); + return; + } + + if (message != null) { + controller.loadAttachment(account, message, part, new Object[] {true, this}, listener); + } } /** @@ -247,23 +256,6 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo writeFile(new File(K9.getAttachmentDefaultPath())); } - public void saveFile() { - //TODO: Can the user save attachments on the internal filesystem or sd card only? - if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { - /* - * Abort early if there's no place to save the attachment. We don't want to spend - * the time downloading it and then abort. - */ - String message = context.getString(R.string.message_view_status_attachment_not_saved); - displayMessageToUser(message); - return; - } - if (message != null) { - controller.loadAttachment(account, message, part, new Object[] {true, this}, listener); - } - } - - public void showFile() { Uri uri = AttachmentProvider.getAttachmentUriForViewing(account, part.getAttachmentId()); Intent intent = new Intent(Intent.ACTION_VIEW); From d3073be89a794a6d6889c3d9e04d5086d2d019ce Mon Sep 17 00:00:00 2001 From: cketti Date: Mon, 20 Oct 2014 21:21:09 -0400 Subject: [PATCH 13/39] Rearrange fields/methods --- src/com/fsck/k9/view/AttachmentView.java | 42 +++++++++++++----------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/src/com/fsck/k9/view/AttachmentView.java b/src/com/fsck/k9/view/AttachmentView.java index 289ea4318..1fc9bec71 100644 --- a/src/com/fsck/k9/view/AttachmentView.java +++ b/src/com/fsck/k9/view/AttachmentView.java @@ -45,18 +45,20 @@ import org.apache.commons.io.IOUtils; public class AttachmentView extends FrameLayout implements OnClickListener, OnLongClickListener { private Context context; - private Button viewButton; - private Button downloadButton; - private LocalAttachmentBodyPart part; private Message message; + private LocalAttachmentBodyPart part; private Account account; private MessagingController controller; private MessagingListener listener; + private AttachmentFileDownloadCallback callback; + + private Button viewButton; + private Button downloadButton; + private String name; private String contentType; private long size; - private AttachmentFileDownloadCallback callback; public AttachmentView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); @@ -73,17 +75,6 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo this.context = context; } - - public interface AttachmentFileDownloadCallback { - /** - * This method is called to ask the user to pick a directory to save the attachment to. - *

- * After the user has selected a directory, the implementation of this interface has to call - * {@link #writeFile(File)} on the object supplied as argument in order for the attachment to be saved. - */ - public void pickDirectoryToSaveAttachmentTo(AttachmentView caller); - } - public void setButtonsEnabled(boolean enabled) { viewButton.setEnabled(enabled); downloadButton.setEnabled(enabled); @@ -214,7 +205,6 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo } } - private void onSaveButtonClicked() { boolean isExternalStorageMounted = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED); if (!isExternalStorageMounted) { @@ -228,6 +218,10 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo } } + public void writeFile() { + writeFile(new File(K9.getAttachmentDefaultPath())); + } + /** * Saves the attachment as file in the given directory */ @@ -252,10 +246,6 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo } } - public void writeFile() { - writeFile(new File(K9.getAttachmentDefaultPath())); - } - public void showFile() { Uri uri = AttachmentProvider.getAttachmentUriForViewing(account, part.getAttachmentId()); Intent intent = new Intent(Intent.ACTION_VIEW); @@ -292,6 +282,18 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo this.callback = callback; } + + public interface AttachmentFileDownloadCallback { + /** + * This method is called to ask the user to pick a directory to save the attachment to. + *

+ * After the user has selected a directory, the implementation of this interface has to call + * {@link #writeFile(File)} on the object supplied as argument in order for the attachment to be saved. + */ + public void pickDirectoryToSaveAttachmentTo(AttachmentView caller); + } + + private class LoadAndDisplayThumbnailAsyncTask extends AsyncTask { private final ImageView thumbnail; From 3c4ad9161471be7d60872496d2dc03035ee3a99e Mon Sep 17 00:00:00 2001 From: cketti Date: Mon, 20 Oct 2014 21:24:18 -0400 Subject: [PATCH 14/39] Fix method names/visibility --- src/com/fsck/k9/view/AttachmentView.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/com/fsck/k9/view/AttachmentView.java b/src/com/fsck/k9/view/AttachmentView.java index 1fc9bec71..c4558d3b1 100644 --- a/src/com/fsck/k9/view/AttachmentView.java +++ b/src/com/fsck/k9/view/AttachmentView.java @@ -236,13 +236,13 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo out.flush(); out.close(); in.close(); - attachmentSaved(file.toString()); + displayAttachmentSavedMessage(file.toString()); new MediaScannerNotifier(context, file); } catch (IOException ioe) { if (K9.DEBUG) { Log.e(K9.LOG_TAG, "Error saving attachment", ioe); } - attachmentNotSaved(); + displayAttachmentNotSavedMessage(); } } @@ -264,12 +264,12 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo } } - public void attachmentSaved(final String filename) { + private void displayAttachmentSavedMessage(final String filename) { String message = context.getString(R.string.message_view_status_attachment_saved, filename); displayMessageToUser(message); } - public void attachmentNotSaved() { + private void displayAttachmentNotSavedMessage() { String message = context.getString(R.string.message_view_status_attachment_not_saved); displayMessageToUser(message); } From 6cb3c991dbee74656d80bcd554e2d03896308e4e Mon Sep 17 00:00:00 2001 From: cketti Date: Mon, 20 Oct 2014 21:26:18 -0400 Subject: [PATCH 15/39] No longer pretend there are attachment types we don't care about --- src/com/fsck/k9/K9.java | 27 ------------------------ src/com/fsck/k9/view/AttachmentView.java | 8 ------- 2 files changed, 35 deletions(-) diff --git a/src/com/fsck/k9/K9.java b/src/com/fsck/k9/K9.java index 593bc07a9..39051565a 100644 --- a/src/com/fsck/k9/K9.java +++ b/src/com/fsck/k9/K9.java @@ -282,33 +282,6 @@ public class K9 extends Application { */ private static boolean sDatabasesUpToDate = false; - - /** - * 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[] { - }; - /** * For use when displaying that no folder is selected */ diff --git a/src/com/fsck/k9/view/AttachmentView.java b/src/com/fsck/k9/view/AttachmentView.java index c4558d3b1..dc20de7ec 100644 --- a/src/com/fsck/k9/view/AttachmentView.java +++ b/src/com/fsck/k9/view/AttachmentView.java @@ -151,14 +151,6 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo viewButton = (Button) findViewById(R.id.view); downloadButton = (Button) findViewById(R.id.download); - if ((!MimeUtility.mimeTypeMatches(contentType, K9.ACCEPTABLE_ATTACHMENT_VIEW_TYPES)) - || (MimeUtility.mimeTypeMatches(contentType, K9.UNACCEPTABLE_ATTACHMENT_VIEW_TYPES))) { - viewButton.setVisibility(View.GONE); - } - if ((!MimeUtility.mimeTypeMatches(contentType, K9.ACCEPTABLE_ATTACHMENT_DOWNLOAD_TYPES)) - || (MimeUtility.mimeTypeMatches(contentType, K9.UNACCEPTABLE_ATTACHMENT_DOWNLOAD_TYPES))) { - downloadButton.setVisibility(View.GONE); - } if (size > K9.MAX_ATTACHMENT_DOWNLOAD_SIZE) { viewButton.setVisibility(View.GONE); downloadButton.setVisibility(View.GONE); From 11a9eff109495ea20977898a1c7669c57185098f Mon Sep 17 00:00:00 2001 From: cketti Date: Sun, 9 Nov 2014 20:46:46 +0100 Subject: [PATCH 16/39] Extract intent creation code to method --- src/com/fsck/k9/view/AttachmentView.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/com/fsck/k9/view/AttachmentView.java b/src/com/fsck/k9/view/AttachmentView.java index dc20de7ec..35740beeb 100644 --- a/src/com/fsck/k9/view/AttachmentView.java +++ b/src/com/fsck/k9/view/AttachmentView.java @@ -240,11 +240,7 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo public void showFile() { Uri uri = AttachmentProvider.getAttachmentUriForViewing(account, part.getAttachmentId()); - Intent intent = new Intent(Intent.ACTION_VIEW); - // We explicitly set the content type in addition to the URI because some attachment viewers - // (such as Polaris office 3.0.x) choke on documents without a MIME type. - intent.setDataAndType(uri, contentType); - intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); + Intent intent = createViewIntentForContentUri(contentType, uri); try { context.startActivity(intent); @@ -256,6 +252,14 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo } } + private Intent createViewIntentForContentUri(String mimeType, Uri uri) { + Intent intent = new Intent(Intent.ACTION_VIEW); + intent.setDataAndType(uri, mimeType); + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); + + return intent; + } + private void displayAttachmentSavedMessage(final String filename) { String message = context.getString(R.string.message_view_status_attachment_saved, filename); displayMessageToUser(message); From f87ab53b9bdbf0a712c74ec235d63029a51f9503 Mon Sep 17 00:00:00 2001 From: cketti Date: Sun, 9 Nov 2014 21:57:16 +0100 Subject: [PATCH 17/39] Try original and inferred MIME type to find best viewer for attachment In order for Android to find apps that are capable of opening an attachment for viewing the ACTION_VIEW Intent needs to contain an appropriate MIME type. Ideally, we'd use the MIME type specified for the attachment in the message. But often the supplied MIME type is wrong/useless. So we look at the file extension to try to come up with a sensible MIME type on our own. We then go on to ask Android which of the two MIME types leads to more apps claiming to be able to open our attachment for viewing and use that one. --- src/com/fsck/k9/view/AttachmentView.java | 49 ++++++++++++++++++++---- 1 file changed, 42 insertions(+), 7 deletions(-) diff --git a/src/com/fsck/k9/view/AttachmentView.java b/src/com/fsck/k9/view/AttachmentView.java index 35740beeb..bf1a918b6 100644 --- a/src/com/fsck/k9/view/AttachmentView.java +++ b/src/com/fsck/k9/view/AttachmentView.java @@ -6,9 +6,13 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.util.List; +import android.content.ActivityNotFoundException; import android.content.Context; import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; @@ -111,10 +115,11 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo private boolean extractAttachmentInformation(Part part) throws MessagingException { boolean firstClassAttachment = true; - contentType = MimeUtility.unfoldAndDecode(part.getContentType()); + contentType = part.getMimeType(); + String contentTypeHeader = MimeUtility.unfoldAndDecode(part.getContentType()); String contentDisposition = MimeUtility.unfoldAndDecode(part.getDisposition()); - name = MimeUtility.getHeaderParameter(contentType, "name"); + name = MimeUtility.getHeaderParameter(contentTypeHeader, "name"); if (name == null) { name = MimeUtility.getHeaderParameter(contentDisposition, "filename"); } @@ -141,7 +146,6 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo } catch (NumberFormatException e) { /* ignore */ } } - contentType = MimeUtility.getMimeTypeForViewing(part.getMimeType(), name); return firstClassAttachment; } @@ -239,12 +243,10 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo } public void showFile() { - Uri uri = AttachmentProvider.getAttachmentUriForViewing(account, part.getAttachmentId()); - Intent intent = createViewIntentForContentUri(contentType, uri); - + Intent intent = constructViewIntent(); try { context.startActivity(intent); - } catch (Exception e) { + } catch (ActivityNotFoundException e) { Log.e(K9.LOG_TAG, "Could not display attachment of type " + contentType, e); String message = context.getString(R.string.message_view_no_viewer, contentType); @@ -252,6 +254,30 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo } } + private Intent constructViewIntent() { + Intent intent; + Uri uri = AttachmentProvider.getAttachmentUriForViewing(account, part.getAttachmentId()); + + Intent originalMimeTypeIntent = createViewIntentForContentUri(contentType, uri); + int originalMimeTypeActivitiesCount = getResolvedIntentActivitiesCount(originalMimeTypeIntent); + + String inferredMimeType = MimeUtility.getMimeTypeByExtension(name); + if (inferredMimeType.equals(contentType)) { + intent = originalMimeTypeIntent; + } else { + Intent inferredMimeTypeIntent = createViewIntentForContentUri(inferredMimeType, uri); + int inferredMimeTypeActivitiesCount = getResolvedIntentActivitiesCount(inferredMimeTypeIntent); + + if (inferredMimeTypeActivitiesCount > originalMimeTypeActivitiesCount) { + intent = inferredMimeTypeIntent; + } else { + intent = originalMimeTypeIntent; + } + } + + return intent; + } + private Intent createViewIntentForContentUri(String mimeType, Uri uri) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(uri, mimeType); @@ -260,6 +286,15 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo return intent; } + private int getResolvedIntentActivitiesCount(Intent intent) { + PackageManager packageManager = context.getPackageManager(); + + List resolveInfos = + packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); + + return resolveInfos.size(); + } + private void displayAttachmentSavedMessage(final String filename) { String message = context.getString(R.string.message_view_status_attachment_saved, filename); displayMessageToUser(message); From 44ecf5d588aaa01e398e802455aeb13e2240134c Mon Sep 17 00:00:00 2001 From: cketti Date: Mon, 10 Nov 2014 00:56:24 +0100 Subject: [PATCH 18/39] Use MIME type used for intent resolution in content provider --- .../fsck/k9/provider/AttachmentProvider.java | 35 ++++++++++--------- src/com/fsck/k9/view/AttachmentView.java | 9 +++-- 2 files changed, 24 insertions(+), 20 deletions(-) diff --git a/src/com/fsck/k9/provider/AttachmentProvider.java b/src/com/fsck/k9/provider/AttachmentProvider.java index f3ba78590..5cc7e242c 100644 --- a/src/com/fsck/k9/provider/AttachmentProvider.java +++ b/src/com/fsck/k9/provider/AttachmentProvider.java @@ -51,11 +51,20 @@ public class AttachmentProvider extends ContentProvider { public static Uri getAttachmentUri(Account account, long id) { - return getAttachmentUri(account.getUuid(), id, true); + return CONTENT_URI.buildUpon() + .appendPath(account.getUuid()) + .appendPath(Long.toString(id)) + .appendPath(FORMAT_RAW) + .build(); } - public static Uri getAttachmentUriForViewing(Account account, long id) { - return getAttachmentUri(account.getUuid(), id, false); + public static Uri getAttachmentUriForViewing(Account account, long id, String mimeType) { + return CONTENT_URI.buildUpon() + .appendPath(account.getUuid()) + .appendPath(Long.toString(id)) + .appendPath(FORMAT_VIEW) + .appendPath(mimeType) + .build(); } public static Uri getAttachmentThumbnailUri(Account account, long id, int width, int height) { @@ -68,14 +77,6 @@ public class AttachmentProvider extends ContentProvider { .build(); } - private static Uri getAttachmentUri(String db, long id, boolean raw) { - return CONTENT_URI.buildUpon() - .appendPath(db) - .appendPath(Long.toString(id)) - .appendPath(raw ? FORMAT_RAW : FORMAT_VIEW) - .build(); - } - public static void clear(Context context) { /* * We use the cache dir as a temporary directory (since Android doesn't give us one) so @@ -146,8 +147,9 @@ public class AttachmentProvider extends ContentProvider { String dbName = segments.get(0); String id = segments.get(1); String format = segments.get(2); + String mimeType = (segments.size() < 4) ? null : segments.get(3); - return getType(dbName, id, format); + return getType(dbName, id, format, mimeType); } @Override @@ -165,7 +167,7 @@ public class AttachmentProvider extends ContentProvider { file = getThumbnailFile(getContext(), accountUuid, attachmentId); if (!file.exists()) { - String type = getType(accountUuid, attachmentId, FORMAT_VIEW); + String type = getType(accountUuid, attachmentId, FORMAT_VIEW, null); try { FileInputStream in = new FileInputStream(getFile(accountUuid, attachmentId)); try { @@ -258,7 +260,7 @@ public class AttachmentProvider extends ContentProvider { return null; } - private String getType(String dbName, String id, String format) { + private String getType(String dbName, String id, String format, String mimeType) { String type; if (FORMAT_THUMBNAIL.equals(format)) { type = "image/png"; @@ -269,10 +271,9 @@ public class AttachmentProvider extends ContentProvider { final LocalStore localStore = LocalStore.getLocalInstance(account, K9.app); AttachmentInfo attachmentInfo = localStore.getAttachmentInfo(id); - if (FORMAT_VIEW.equals(format)) { - type = MimeUtility.getMimeTypeForViewing(attachmentInfo.type, attachmentInfo.name); + if (FORMAT_VIEW.equals(format) && mimeType != null) { + type = mimeType; } else { - // When accessing the "raw" message we deliver the original MIME type. type = attachmentInfo.type; } } catch (MessagingException e) { diff --git a/src/com/fsck/k9/view/AttachmentView.java b/src/com/fsck/k9/view/AttachmentView.java index bf1a918b6..9e962a4e4 100644 --- a/src/com/fsck/k9/view/AttachmentView.java +++ b/src/com/fsck/k9/view/AttachmentView.java @@ -256,16 +256,19 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo private Intent constructViewIntent() { Intent intent; - Uri uri = AttachmentProvider.getAttachmentUriForViewing(account, part.getAttachmentId()); - Intent originalMimeTypeIntent = createViewIntentForContentUri(contentType, uri); + Uri originalMimeTypeUri = AttachmentProvider.getAttachmentUriForViewing(account, part.getAttachmentId(), + contentType); + Intent originalMimeTypeIntent = createViewIntentForContentUri(contentType, originalMimeTypeUri); int originalMimeTypeActivitiesCount = getResolvedIntentActivitiesCount(originalMimeTypeIntent); String inferredMimeType = MimeUtility.getMimeTypeByExtension(name); if (inferredMimeType.equals(contentType)) { intent = originalMimeTypeIntent; } else { - Intent inferredMimeTypeIntent = createViewIntentForContentUri(inferredMimeType, uri); + Uri inferredMimeTypeUri = AttachmentProvider.getAttachmentUriForViewing(account, part.getAttachmentId(), + inferredMimeType); + Intent inferredMimeTypeIntent = createViewIntentForContentUri(inferredMimeType, inferredMimeTypeUri); int inferredMimeTypeActivitiesCount = getResolvedIntentActivitiesCount(inferredMimeTypeIntent); if (inferredMimeTypeActivitiesCount > originalMimeTypeActivitiesCount) { From 6a1905b7b7977acffc7b39309fcc347b40f9817e Mon Sep 17 00:00:00 2001 From: cketti Date: Mon, 10 Nov 2014 05:37:22 +0100 Subject: [PATCH 19/39] If we can't find an app to view an attachment try again with a file:// URI Sadly, some apps only support the 'file' scheme in their intent filters. Among them is Android's own package installer. --- src/com/fsck/k9/view/AttachmentView.java | 167 ++++++++++++++++++++--- 1 file changed, 147 insertions(+), 20 deletions(-) diff --git a/src/com/fsck/k9/view/AttachmentView.java b/src/com/fsck/k9/view/AttachmentView.java index 9e962a4e4..19595c920 100644 --- a/src/com/fsck/k9/view/AttachmentView.java +++ b/src/com/fsck/k9/view/AttachmentView.java @@ -223,16 +223,10 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo */ public void writeFile(File directory) { try { - String filename = Utility.sanitizeFilename(name); - File file = Utility.createUniqueFile(directory, filename); - Uri uri = AttachmentProvider.getAttachmentUri(account, part.getAttachmentId()); - InputStream in = context.getContentResolver().openInputStream(uri); - OutputStream out = new FileOutputStream(file); - IOUtils.copy(in, out); - out.flush(); - out.close(); - in.close(); + File file = writeAttachmentToStorage(directory); + displayAttachmentSavedMessage(file.toString()); + new MediaScannerNotifier(context, file); } catch (IOException ioe) { if (K9.DEBUG) { @@ -242,20 +236,55 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo } } - public void showFile() { - Intent intent = constructViewIntent(); - try { - context.startActivity(intent); - } catch (ActivityNotFoundException e) { - Log.e(K9.LOG_TAG, "Could not display attachment of type " + contentType, e); + private File writeAttachmentToStorage(File directory) throws IOException { + String filename = Utility.sanitizeFilename(name); + File file = Utility.createUniqueFile(directory, filename); - String message = context.getString(R.string.message_view_no_viewer, contentType); - displayMessageToUser(message); + Uri uri = AttachmentProvider.getAttachmentUri(account, part.getAttachmentId()); + InputStream in = context.getContentResolver().openInputStream(uri); + try { + OutputStream out = new FileOutputStream(file); + try { + IOUtils.copy(in, out); + out.flush(); + } finally { + out.close(); + } + } finally { + in.close(); } + + return file; } - private Intent constructViewIntent() { + public void showFile() { + new ViewAttachmentAsyncTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + } + + private Intent getBestViewIntentAndSaveFileIfNecessary() { + IntentAndResolvedActivitiesCount resultForContentUri = getBestViewIntentForContentUri(); + if (resultForContentUri.getActivitiesCount() > 0) { + return resultForContentUri.getIntent(); + } + + IntentAndResolvedActivitiesCount resultForFileUri = getBestViewIntentForFileUri(); + if (resultForFileUri.getActivitiesCount() > 0) { + try { + File file = writeAttachmentToStorage(new File(K9.getAttachmentDefaultPath())); + return createViewIntentForFileUri(resultForFileUri.getMimeType(), Uri.fromFile(file)); + } catch (IOException e) { + if (K9.DEBUG) { + Log.e(K9.LOG_TAG, "Error while saving attachment to use file:// URI with ACTION_VIEW Intent", e); + } + } + } + + return resultForContentUri.getIntent(); + } + + private IntentAndResolvedActivitiesCount getBestViewIntentForContentUri() { Intent intent; + int activitiesCount; Uri originalMimeTypeUri = AttachmentProvider.getAttachmentUriForViewing(account, part.getAttachmentId(), contentType); @@ -265,6 +294,7 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo String inferredMimeType = MimeUtility.getMimeTypeByExtension(name); if (inferredMimeType.equals(contentType)) { intent = originalMimeTypeIntent; + activitiesCount = originalMimeTypeActivitiesCount; } else { Uri inferredMimeTypeUri = AttachmentProvider.getAttachmentUriForViewing(account, part.getAttachmentId(), inferredMimeType); @@ -273,22 +303,67 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo if (inferredMimeTypeActivitiesCount > originalMimeTypeActivitiesCount) { intent = inferredMimeTypeIntent; + activitiesCount = inferredMimeTypeActivitiesCount; } else { intent = originalMimeTypeIntent; + activitiesCount = originalMimeTypeActivitiesCount; } } - return intent; + return new IntentAndResolvedActivitiesCount(intent, activitiesCount); + } + + private IntentAndResolvedActivitiesCount getBestViewIntentForFileUri() { + Intent intent; + int activitiesCount; + + File dummyFile = new File(Utility.sanitizeFilename(name)); + Uri fileUri = Uri.fromFile(dummyFile); + + Intent originalMimeTypeIntent = createViewIntentForFileUri(contentType, fileUri); + int originalMimeTypeActivitiesCount = getResolvedIntentActivitiesCount(originalMimeTypeIntent); + + String inferredMimeType = MimeUtility.getMimeTypeByExtension(name); + if (inferredMimeType.equals(contentType)) { + intent = originalMimeTypeIntent; + activitiesCount = originalMimeTypeActivitiesCount; + } else { + Intent inferredMimeTypeIntent = createViewIntentForFileUri(inferredMimeType, fileUri); + int inferredMimeTypeActivitiesCount = getResolvedIntentActivitiesCount(inferredMimeTypeIntent); + + if (inferredMimeTypeActivitiesCount > originalMimeTypeActivitiesCount) { + intent = inferredMimeTypeIntent; + activitiesCount = inferredMimeTypeActivitiesCount; + } else { + intent = originalMimeTypeIntent; + activitiesCount = originalMimeTypeActivitiesCount; + } + } + + return new IntentAndResolvedActivitiesCount(intent, activitiesCount); } private Intent createViewIntentForContentUri(String mimeType, Uri uri) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(uri, mimeType); - intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + addUiIntentFlags(intent); return intent; } + private Intent createViewIntentForFileUri(String mimeType, Uri uri) { + Intent intent = new Intent(Intent.ACTION_VIEW); + intent.setDataAndType(uri, mimeType); + addUiIntentFlags(intent); + + return intent; + } + + private void addUiIntentFlags(Intent intent) { + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); + } + private int getResolvedIntentActivitiesCount(Intent intent) { PackageManager packageManager = context.getPackageManager(); @@ -328,6 +403,28 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo } + private static class IntentAndResolvedActivitiesCount { + private Intent intent; + private int activitiesCount; + + IntentAndResolvedActivitiesCount(Intent intent, int activitiesCount) { + this.intent = intent; + this.activitiesCount = activitiesCount; + } + + public Intent getIntent() { + return intent; + } + + public int getActivitiesCount() { + return activitiesCount; + } + + public String getMimeType() { + return intent.getType(); + } + } + private class LoadAndDisplayThumbnailAsyncTask extends AsyncTask { private final ImageView thumbnail; @@ -364,4 +461,34 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo } } } + + private class ViewAttachmentAsyncTask extends AsyncTask { + + @Override + protected void onPreExecute() { + viewButton.setEnabled(false); + } + + @Override + protected Intent doInBackground(Void... params) { + return getBestViewIntentAndSaveFileIfNecessary(); + } + + @Override + protected void onPostExecute(Intent intent) { + viewAttachment(intent); + viewButton.setEnabled(true); + } + + private void viewAttachment(Intent intent) { + try { + context.startActivity(intent); + } catch (ActivityNotFoundException e) { + Log.e(K9.LOG_TAG, "Could not display attachment of type " + contentType, e); + + String message = context.getString(R.string.message_view_no_viewer, contentType); + displayMessageToUser(message); + } + } + } } From dfd40659d140367bd2a564c3443aa6892294e281 Mon Sep 17 00:00:00 2001 From: cketti Date: Mon, 10 Nov 2014 05:46:38 +0100 Subject: [PATCH 20/39] Append file name to content:// URI This allows intent filters with patterns for file extensions to match. --- src/com/fsck/k9/provider/AttachmentProvider.java | 3 ++- src/com/fsck/k9/view/AttachmentView.java | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/com/fsck/k9/provider/AttachmentProvider.java b/src/com/fsck/k9/provider/AttachmentProvider.java index 5cc7e242c..15c81e6a2 100644 --- a/src/com/fsck/k9/provider/AttachmentProvider.java +++ b/src/com/fsck/k9/provider/AttachmentProvider.java @@ -58,12 +58,13 @@ public class AttachmentProvider extends ContentProvider { .build(); } - public static Uri getAttachmentUriForViewing(Account account, long id, String mimeType) { + public static Uri getAttachmentUriForViewing(Account account, long id, String mimeType, String filename) { return CONTENT_URI.buildUpon() .appendPath(account.getUuid()) .appendPath(Long.toString(id)) .appendPath(FORMAT_VIEW) .appendPath(mimeType) + .appendPath(filename) .build(); } diff --git a/src/com/fsck/k9/view/AttachmentView.java b/src/com/fsck/k9/view/AttachmentView.java index 19595c920..8dcef251d 100644 --- a/src/com/fsck/k9/view/AttachmentView.java +++ b/src/com/fsck/k9/view/AttachmentView.java @@ -287,7 +287,7 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo int activitiesCount; Uri originalMimeTypeUri = AttachmentProvider.getAttachmentUriForViewing(account, part.getAttachmentId(), - contentType); + contentType, name); Intent originalMimeTypeIntent = createViewIntentForContentUri(contentType, originalMimeTypeUri); int originalMimeTypeActivitiesCount = getResolvedIntentActivitiesCount(originalMimeTypeIntent); @@ -297,7 +297,7 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo activitiesCount = originalMimeTypeActivitiesCount; } else { Uri inferredMimeTypeUri = AttachmentProvider.getAttachmentUriForViewing(account, part.getAttachmentId(), - inferredMimeType); + inferredMimeType, name); Intent inferredMimeTypeIntent = createViewIntentForContentUri(inferredMimeType, inferredMimeTypeUri); int inferredMimeTypeActivitiesCount = getResolvedIntentActivitiesCount(inferredMimeTypeIntent); From c3f1420ef6102b636e659c0c939079a26ac2bc9c Mon Sep 17 00:00:00 2001 From: cketti Date: Mon, 10 Nov 2014 06:43:00 +0100 Subject: [PATCH 21/39] Don't open the file after the media scanner added it to the media content provider --- src/com/fsck/k9/helper/MediaScannerNotifier.java | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/src/com/fsck/k9/helper/MediaScannerNotifier.java b/src/com/fsck/k9/helper/MediaScannerNotifier.java index 8229b8297..dd8bfcdff 100644 --- a/src/com/fsck/k9/helper/MediaScannerNotifier.java +++ b/src/com/fsck/k9/helper/MediaScannerNotifier.java @@ -1,7 +1,6 @@ package com.fsck.k9.helper; import android.content.Context; -import android.content.Intent; import android.media.MediaScannerConnection; import android.media.MediaScannerConnection.MediaScannerConnectionClient; import android.net.Uri; @@ -12,14 +11,11 @@ import java.io.File; public class MediaScannerNotifier implements MediaScannerConnectionClient { private MediaScannerConnection mConnection; private File mFile; - private Context mContext; public MediaScannerNotifier(Context context, File file) { mFile = file; mConnection = new MediaScannerConnection(context, this); mConnection.connect(); - mContext = context; - } public void onMediaScannerConnected() { @@ -27,14 +23,6 @@ public class MediaScannerNotifier implements MediaScannerConnectionClient { } public void onScanCompleted(String path, Uri uri) { - try { - if (uri != null) { - Intent intent = new Intent(Intent.ACTION_VIEW); - intent.setData(uri); - mContext.startActivity(intent); - } - } finally { - mConnection.disconnect(); - } + mConnection.disconnect(); } } From e64ca84f1bc9e7e09c0ba87735d0982f4a476d55 Mon Sep 17 00:00:00 2001 From: cketti Date: Mon, 10 Nov 2014 06:43:26 +0100 Subject: [PATCH 22/39] Simplify MediaScannerNotifier --- .../fsck/k9/helper/MediaScannerNotifier.java | 25 +++++-------------- src/com/fsck/k9/view/AttachmentView.java | 2 +- 2 files changed, 7 insertions(+), 20 deletions(-) diff --git a/src/com/fsck/k9/helper/MediaScannerNotifier.java b/src/com/fsck/k9/helper/MediaScannerNotifier.java index dd8bfcdff..9dbed11ce 100644 --- a/src/com/fsck/k9/helper/MediaScannerNotifier.java +++ b/src/com/fsck/k9/helper/MediaScannerNotifier.java @@ -1,28 +1,15 @@ package com.fsck.k9.helper; -import android.content.Context; -import android.media.MediaScannerConnection; -import android.media.MediaScannerConnection.MediaScannerConnectionClient; -import android.net.Uri; import java.io.File; +import android.content.Context; +import android.media.MediaScannerConnection; -public class MediaScannerNotifier implements MediaScannerConnectionClient { - private MediaScannerConnection mConnection; - private File mFile; - public MediaScannerNotifier(Context context, File file) { - mFile = file; - mConnection = new MediaScannerConnection(context, this); - mConnection.connect(); - } - - public void onMediaScannerConnected() { - mConnection.scanFile(mFile.getAbsolutePath(), null); - } - - public void onScanCompleted(String path, Uri uri) { - mConnection.disconnect(); +public class MediaScannerNotifier { + public static void notify(Context context, File file) { + String[] paths = { file.getAbsolutePath() }; + MediaScannerConnection.scanFile(context, paths, null, null); } } diff --git a/src/com/fsck/k9/view/AttachmentView.java b/src/com/fsck/k9/view/AttachmentView.java index 8dcef251d..000cf2b87 100644 --- a/src/com/fsck/k9/view/AttachmentView.java +++ b/src/com/fsck/k9/view/AttachmentView.java @@ -227,7 +227,7 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo displayAttachmentSavedMessage(file.toString()); - new MediaScannerNotifier(context, file); + MediaScannerNotifier.notify(context, file); } catch (IOException ioe) { if (K9.DEBUG) { Log.e(K9.LOG_TAG, "Error saving attachment", ioe); From 34cfd8e5b422fa8c5b30fc0c526fb747e519feb0 Mon Sep 17 00:00:00 2001 From: cketti Date: Tue, 11 Nov 2014 01:04:39 +0100 Subject: [PATCH 23/39] Extract file related helper functions into separate class --- src/com/fsck/k9/helper/FileHelper.java | 165 +++++++++++++++++ src/com/fsck/k9/helper/Utility.java | 172 ------------------ .../fsck/k9/mail/store/LockableDatabase.java | 11 +- .../fsck/k9/preferences/SettingsExporter.java | 5 +- src/com/fsck/k9/view/AttachmentView.java | 8 +- src/com/fsck/k9/view/SingleMessageView.java | 5 +- 6 files changed, 181 insertions(+), 185 deletions(-) create mode 100644 src/com/fsck/k9/helper/FileHelper.java diff --git a/src/com/fsck/k9/helper/FileHelper.java b/src/com/fsck/k9/helper/FileHelper.java new file mode 100644 index 000000000..c33ed4cb9 --- /dev/null +++ b/src/com/fsck/k9/helper/FileHelper.java @@ -0,0 +1,165 @@ +package com.fsck.k9.helper; + + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.util.Locale; + +import android.util.Log; + +import com.fsck.k9.K9; + + +public class FileHelper { + /** + * Regular expression that represents characters we won't allow in file names. + * + *

+ * Allowed are: + *

    + *
  • word characters (letters, digits, and underscores): {@code \w}
  • + *
  • spaces: {@code " "}
  • + *
  • special characters: {@code !}, {@code #}, {@code $}, {@code %}, {@code &}, {@code '}, + * {@code (}, {@code )}, {@code -}, {@code @}, {@code ^}, {@code `}, {, + * }, {@code ~}, {@code .}, {@code ,}
  • + *

+ * + * @see #sanitizeFilename(String) + */ + private static final String INVALID_CHARACTERS = "[^\\w !#$%&'()\\-@\\^`{}~.,]+"; + + /** + * Invalid characters in a file name are replaced by this character. + * + * @see #sanitizeFilename(String) + */ + private static final String REPLACEMENT_CHARACTER = "_"; + + + /** + * Creates a unique file in the given directory by appending a hyphen + * and a number to the given filename. + */ + public static File createUniqueFile(File directory, String filename) { + File file = new File(directory, filename); + if (!file.exists()) { + 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(Locale.US, format, i)); + if (!file.exists()) { + return file; + } + } + return null; + } + + public static void touchFile(final File parentDir, final String name) { + final File file = new File(parentDir, name); + try { + if (!file.exists()) { + file.createNewFile(); + } else { + file.setLastModified(System.currentTimeMillis()); + } + } catch (Exception e) { + Log.d(K9.LOG_TAG, "Unable to touch file: " + file.getAbsolutePath(), e); + } + } + + public static boolean move(final File from, final File to) { + if (to.exists()) { + to.delete(); + } + to.getParentFile().mkdirs(); + + try { + FileInputStream in = new FileInputStream(from); + try { + FileOutputStream out = new FileOutputStream(to); + try { + byte[] buffer = new byte[1024]; + int count = -1; + while ((count = in.read(buffer)) > 0) { + out.write(buffer, 0, count); + } + } finally { + out.close(); + } + } finally { + try { in.close(); } catch (Throwable ignore) {} + } + from.delete(); + return true; + } catch (Exception e) { + Log.w(K9.LOG_TAG, "cannot move " + from.getAbsolutePath() + " to " + to.getAbsolutePath(), e); + return false; + } + + } + + public static void moveRecursive(final File fromDir, final File toDir) { + if (!fromDir.exists()) { + return; + } + if (!fromDir.isDirectory()) { + if (toDir.exists()) { + if (!toDir.delete()) { + Log.w(K9.LOG_TAG, "cannot delete already existing file/directory " + toDir.getAbsolutePath()); + } + } + if (!fromDir.renameTo(toDir)) { + Log.w(K9.LOG_TAG, "cannot rename " + fromDir.getAbsolutePath() + " to " + toDir.getAbsolutePath() + " - moving instead"); + move(fromDir, toDir); + } + return; + } + if (!toDir.exists() || !toDir.isDirectory()) { + if (toDir.exists()) { + toDir.delete(); + } + if (!toDir.mkdirs()) { + Log.w(K9.LOG_TAG, "cannot create directory " + toDir.getAbsolutePath()); + } + } + File[] files = fromDir.listFiles(); + for (File file : files) { + if (file.isDirectory()) { + moveRecursive(file, new File(toDir, file.getName())); + file.delete(); + } else { + File target = new File(toDir, file.getName()); + if (!file.renameTo(target)) { + Log.w(K9.LOG_TAG, "cannot rename " + file.getAbsolutePath() + " to " + target.getAbsolutePath() + " - moving instead"); + move(file, target); + } + } + } + if (!fromDir.delete()) { + Log.w(K9.LOG_TAG, "cannot delete " + fromDir.getAbsolutePath()); + } + } + + /** + * Replace characters we don't allow in file names with a replacement character. + * + * @param filename + * The original file name. + * + * @return The sanitized file name containing only allowed characters. + */ + public static String sanitizeFilename(String filename) { + return filename.replaceAll(INVALID_CHARACTERS, REPLACEMENT_CHARACTER); + } +} diff --git a/src/com/fsck/k9/helper/Utility.java b/src/com/fsck/k9/helper/Utility.java index a5bea3448..16466a7c1 100644 --- a/src/com/fsck/k9/helper/Utility.java +++ b/src/com/fsck/k9/helper/Utility.java @@ -17,40 +17,13 @@ import android.widget.TextView; import com.fsck.k9.K9; import com.fsck.k9.mail.filter.Base64; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.List; -import java.util.Locale; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Utility { - /** - * Regular expression that represents characters we won't allow in file names. - * - *

- * Allowed are: - *

    - *
  • word characters (letters, digits, and underscores): {@code \w}
  • - *
  • spaces: {@code " "}
  • - *
  • special characters: {@code !}, {@code #}, {@code $}, {@code %}, {@code &}, {@code '}, - * {@code (}, {@code )}, {@code -}, {@code @}, {@code ^}, {@code `}, {, - * }, {@code ~}, {@code .}, {@code ,}
  • - *

- * - * @see #sanitizeFilename(String) - */ - private static final String INVALID_CHARACTERS = "[^\\w !#$%&'()\\-@\\^`{}~.,]+"; - - /** - * Invalid characters in a file name are replaced by this character. - * - * @see #sanitizeFilename(String) - */ - private static final String REPLACEMENT_CHARACTER = "_"; // \u00A0 (non-breaking space) happens to be used by French MUA @@ -454,139 +427,6 @@ public class Utility { } } - /** - * @param parentDir - * @param name - * Never null. - */ - public static void touchFile(final File parentDir, final String name) { - final File file = new File(parentDir, name); - try { - if (!file.exists()) { - file.createNewFile(); - } else { - file.setLastModified(System.currentTimeMillis()); - } - } catch (Exception e) { - Log.d(K9.LOG_TAG, "Unable to touch file: " + file.getAbsolutePath(), e); - } - } - - /** - * Creates a unique file in the given directory by appending a hyphen - * and a number to the given filename. - * - * @param directory - * @param filename - * @return - */ - public static File createUniqueFile(File directory, String filename) { - File file = new File(directory, filename); - if (!file.exists()) { - 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(Locale.US, format, i)); - if (!file.exists()) { - return file; - } - } - return null; - } - - - - /** - * @param from - * @param to - * @return - */ - public static boolean move(final File from, final File to) { - if (to.exists()) { - to.delete(); - } - to.getParentFile().mkdirs(); - - try { - FileInputStream in = new FileInputStream(from); - try { - FileOutputStream out = new FileOutputStream(to); - try { - byte[] buffer = new byte[1024]; - int count = -1; - while ((count = in.read(buffer)) > 0) { - out.write(buffer, 0, count); - } - } finally { - out.close(); - } - } finally { - try { in.close(); } catch (Throwable ignore) {} - } - from.delete(); - return true; - } catch (Exception e) { - Log.w(K9.LOG_TAG, "cannot move " + from.getAbsolutePath() + " to " + to.getAbsolutePath(), e); - return false; - } - - } - - /** - * @param fromDir - * @param toDir - */ - public static void moveRecursive(final File fromDir, final File toDir) { - if (!fromDir.exists()) { - return; - } - if (!fromDir.isDirectory()) { - if (toDir.exists()) { - if (!toDir.delete()) { - Log.w(K9.LOG_TAG, "cannot delete already existing file/directory " + toDir.getAbsolutePath()); - } - } - if (!fromDir.renameTo(toDir)) { - Log.w(K9.LOG_TAG, "cannot rename " + fromDir.getAbsolutePath() + " to " + toDir.getAbsolutePath() + " - moving instead"); - move(fromDir, toDir); - } - return; - } - if (!toDir.exists() || !toDir.isDirectory()) { - if (toDir.exists()) { - toDir.delete(); - } - if (!toDir.mkdirs()) { - Log.w(K9.LOG_TAG, "cannot create directory " + toDir.getAbsolutePath()); - } - } - File[] files = fromDir.listFiles(); - for (File file : files) { - if (file.isDirectory()) { - moveRecursive(file, new File(toDir, file.getName())); - file.delete(); - } else { - File target = new File(toDir, file.getName()); - if (!file.renameTo(target)) { - Log.w(K9.LOG_TAG, "cannot rename " + file.getAbsolutePath() + " to " + target.getAbsolutePath() + " - moving instead"); - move(file, target); - } - } - } - if (!fromDir.delete()) { - Log.w(K9.LOG_TAG, "cannot delete " + fromDir.getAbsolutePath()); - } - } private static final String IMG_SRC_REGEX = "(?is:]+src\\s*=\\s*['\"]?([a-z]+)\\:)"; private static final Pattern IMG_PATTERN = Pattern.compile(IMG_SRC_REGEX); @@ -624,18 +464,6 @@ public class Utility { } } - /** - * Replace characters we don't allow in file names with a replacement character. - * - * @param filename - * The original file name. - * - * @return The sanitized file name containing only allowed characters. - */ - public static String sanitizeFilename(String filename) { - return filename.replaceAll(INVALID_CHARACTERS, REPLACEMENT_CHARACTER); - } - /** * Check to see if we have network connectivity. * @param app Current application (Hint: see if your base class has a getApplication() method.) diff --git a/src/com/fsck/k9/mail/store/LockableDatabase.java b/src/com/fsck/k9/mail/store/LockableDatabase.java index 81138d6e8..d1ede902b 100644 --- a/src/com/fsck/k9/mail/store/LockableDatabase.java +++ b/src/com/fsck/k9/mail/store/LockableDatabase.java @@ -14,7 +14,7 @@ import android.os.Build; import android.util.Log; import com.fsck.k9.K9; -import com.fsck.k9.helper.Utility; +import com.fsck.k9.helper.FileHelper; import com.fsck.k9.mail.MessagingException; public class LockableDatabase { @@ -337,9 +337,10 @@ public class LockableDatabase { prepareStorage(newProviderId); // move all database files - Utility.moveRecursive(oldDatabase, storageManager.getDatabase(uUid, newProviderId)); + FileHelper.moveRecursive(oldDatabase, storageManager.getDatabase(uUid, newProviderId)); // move all attachment files - Utility.moveRecursive(storageManager.getAttachmentDirectory(uUid, oldProviderId), storageManager.getAttachmentDirectory(uUid, newProviderId)); + FileHelper.moveRecursive(storageManager.getAttachmentDirectory(uUid, oldProviderId), + storageManager.getAttachmentDirectory(uUid, newProviderId)); // remove any remaining old journal files deleteDatabase(oldDatabase); @@ -425,7 +426,7 @@ public class LockableDatabase { // Android seems to be unmounting the storage... throw new UnavailableStorageException("Unable to access: " + databaseParentDir); } - Utility.touchFile(databaseParentDir, ".nomedia"); + FileHelper.touchFile(databaseParentDir, ".nomedia"); } final File attachmentDir; @@ -435,7 +436,7 @@ public class LockableDatabase { attachmentParentDir = attachmentDir.getParentFile(); if (!attachmentParentDir.exists()) { attachmentParentDir.mkdirs(); - Utility.touchFile(attachmentParentDir, ".nomedia"); + FileHelper.touchFile(attachmentParentDir, ".nomedia"); } if (!attachmentDir.exists()) { attachmentDir.mkdirs(); diff --git a/src/com/fsck/k9/preferences/SettingsExporter.java b/src/com/fsck/k9/preferences/SettingsExporter.java index e753e31f3..3921cfc41 100644 --- a/src/com/fsck/k9/preferences/SettingsExporter.java +++ b/src/com/fsck/k9/preferences/SettingsExporter.java @@ -12,6 +12,8 @@ import java.util.Map; import java.util.Set; import java.util.TreeMap; import java.util.Map.Entry; + +import com.fsck.k9.helper.FileHelper; import org.xmlpull.v1.XmlSerializer; import android.content.Context; @@ -23,7 +25,6 @@ import android.util.Xml; import com.fsck.k9.Account; import com.fsck.k9.K9; import com.fsck.k9.Preferences; -import com.fsck.k9.helper.Utility; import com.fsck.k9.mail.Store; import com.fsck.k9.mail.ServerSettings; import com.fsck.k9.mail.Transport; @@ -87,7 +88,7 @@ public class SettingsExporter { File dir = new File(Environment.getExternalStorageDirectory() + File.separator + context.getPackageName()); dir.mkdirs(); - File file = Utility.createUniqueFile(dir, EXPORT_FILENAME); + File file = FileHelper.createUniqueFile(dir, EXPORT_FILENAME); filename = file.getAbsolutePath(); os = new FileOutputStream(filename); diff --git a/src/com/fsck/k9/view/AttachmentView.java b/src/com/fsck/k9/view/AttachmentView.java index 000cf2b87..03a199b20 100644 --- a/src/com/fsck/k9/view/AttachmentView.java +++ b/src/com/fsck/k9/view/AttachmentView.java @@ -34,9 +34,9 @@ import com.fsck.k9.K9; import com.fsck.k9.R; import com.fsck.k9.controller.MessagingController; import com.fsck.k9.controller.MessagingListener; +import com.fsck.k9.helper.FileHelper; import com.fsck.k9.helper.MediaScannerNotifier; import com.fsck.k9.helper.SizeFormatter; -import com.fsck.k9.helper.Utility; import com.fsck.k9.mail.Message; import com.fsck.k9.mail.MessagingException; import com.fsck.k9.mail.Part; @@ -237,8 +237,8 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo } private File writeAttachmentToStorage(File directory) throws IOException { - String filename = Utility.sanitizeFilename(name); - File file = Utility.createUniqueFile(directory, filename); + String filename = FileHelper.sanitizeFilename(name); + File file = FileHelper.createUniqueFile(directory, filename); Uri uri = AttachmentProvider.getAttachmentUri(account, part.getAttachmentId()); InputStream in = context.getContentResolver().openInputStream(uri); @@ -317,7 +317,7 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo Intent intent; int activitiesCount; - File dummyFile = new File(Utility.sanitizeFilename(name)); + File dummyFile = new File(FileHelper.sanitizeFilename(name)); Uri fileUri = Uri.fromFile(dummyFile); Intent originalMimeTypeIntent = createViewIntentForFileUri(contentType, fileUri); diff --git a/src/com/fsck/k9/view/SingleMessageView.java b/src/com/fsck/k9/view/SingleMessageView.java index 2921ed494..aeb23c3e3 100644 --- a/src/com/fsck/k9/view/SingleMessageView.java +++ b/src/com/fsck/k9/view/SingleMessageView.java @@ -46,6 +46,7 @@ import com.fsck.k9.crypto.PgpData; import com.fsck.k9.fragment.MessageViewFragment; import com.fsck.k9.helper.ClipboardManager; import com.fsck.k9.helper.Contacts; +import com.fsck.k9.helper.FileHelper; import com.fsck.k9.helper.HtmlConverter; import com.fsck.k9.helper.Utility; import com.fsck.k9.mail.Address; @@ -842,10 +843,10 @@ public class SingleMessageView extends LinearLayout implements OnClickListener, filename += "." + extension; } - String sanitized = Utility.sanitizeFilename(filename); + String sanitized = FileHelper.sanitizeFilename(filename); File directory = new File(K9.getAttachmentDefaultPath()); - File file = Utility.createUniqueFile(directory, sanitized); + File file = FileHelper.createUniqueFile(directory, sanitized); FileOutputStream out = new FileOutputStream(file); try { IOUtils.copy(in, out); From 87ca0d3d2a9be0d4321e3d9c2532f33b0213b46d Mon Sep 17 00:00:00 2001 From: cketti Date: Tue, 11 Nov 2014 02:08:50 +0100 Subject: [PATCH 24/39] Use TemporaryAttachmentStore when viewing attachments using file:// URI --- .../k9/cache/TemporaryAttachmentStore.java | 59 +++++++++++++++++++ src/com/fsck/k9/view/AttachmentView.java | 18 ++++-- 2 files changed, 71 insertions(+), 6 deletions(-) create mode 100644 src/com/fsck/k9/cache/TemporaryAttachmentStore.java diff --git a/src/com/fsck/k9/cache/TemporaryAttachmentStore.java b/src/com/fsck/k9/cache/TemporaryAttachmentStore.java new file mode 100644 index 000000000..c2a4a264a --- /dev/null +++ b/src/com/fsck/k9/cache/TemporaryAttachmentStore.java @@ -0,0 +1,59 @@ +package com.fsck.k9.cache; + + +import java.io.File; +import java.io.IOException; + +import android.content.Context; +import android.util.Log; + +import com.fsck.k9.K9; +import com.fsck.k9.helper.FileHelper; + + +public class TemporaryAttachmentStore { + private static String TEMPORARY_ATTACHMENT_DIRECTORY = "attachments"; + private static long MAX_FILE_AGE = 12 * 60 * 60 * 1000; // 12h + + public static File getFile(Context context, String attachmentName) throws IOException { + File directory = createOrCleanAttachmentDirectory(context); + String filename = FileHelper.sanitizeFilename(attachmentName); + return new File(directory, filename); + } + + private static File createOrCleanAttachmentDirectory(Context context) throws IOException { + File directory = getTemporaryAttachmentDirectory(context); + if (directory.exists()) { + cleanOldFiles(directory); + } else { + if (!directory.mkdir()) { + throw new IOException("Couldn't create temporary attachment store: " + directory.getAbsolutePath()); + } + } + return directory; + } + + private static File getTemporaryAttachmentDirectory(Context context) { + return new File(context.getExternalCacheDir(), TEMPORARY_ATTACHMENT_DIRECTORY); + } + + private static void cleanOldFiles(File directory) { + File[] files = directory.listFiles(); + if (files == null) { + return; + } + + long cutOffTime = System.currentTimeMillis() - MAX_FILE_AGE; + for (File file : files) { + if (file.lastModified() < cutOffTime) { + if (file.delete()) { + if (K9.DEBUG) { + Log.d(K9.LOG_TAG, "Deleted from temporary attachment store: " + file.getName()); + } + } else { + Log.w(K9.LOG_TAG, "Couldn't delete from temporary attachment store: " + file.getName()); + } + } + } + } +} diff --git a/src/com/fsck/k9/view/AttachmentView.java b/src/com/fsck/k9/view/AttachmentView.java index 03a199b20..5367e66cd 100644 --- a/src/com/fsck/k9/view/AttachmentView.java +++ b/src/com/fsck/k9/view/AttachmentView.java @@ -32,6 +32,7 @@ import android.widget.Toast; import com.fsck.k9.Account; import com.fsck.k9.K9; import com.fsck.k9.R; +import com.fsck.k9.cache.TemporaryAttachmentStore; import com.fsck.k9.controller.MessagingController; import com.fsck.k9.controller.MessagingListener; import com.fsck.k9.helper.FileHelper; @@ -223,7 +224,7 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo */ public void writeFile(File directory) { try { - File file = writeAttachmentToStorage(directory); + File file = saveAttachmentWithUniqueFileName(directory); displayAttachmentSavedMessage(file.toString()); @@ -236,10 +237,16 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo } } - private File writeAttachmentToStorage(File directory) throws IOException { + private File saveAttachmentWithUniqueFileName(File directory) throws IOException { String filename = FileHelper.sanitizeFilename(name); File file = FileHelper.createUniqueFile(directory, filename); + writeAttachmentToStorage(file); + + return file; + } + + private void writeAttachmentToStorage(File file) throws IOException { Uri uri = AttachmentProvider.getAttachmentUri(account, part.getAttachmentId()); InputStream in = context.getContentResolver().openInputStream(uri); try { @@ -253,8 +260,6 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo } finally { in.close(); } - - return file; } public void showFile() { @@ -270,8 +275,9 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo IntentAndResolvedActivitiesCount resultForFileUri = getBestViewIntentForFileUri(); if (resultForFileUri.getActivitiesCount() > 0) { try { - File file = writeAttachmentToStorage(new File(K9.getAttachmentDefaultPath())); - return createViewIntentForFileUri(resultForFileUri.getMimeType(), Uri.fromFile(file)); + File tempFile = TemporaryAttachmentStore.getFile(context, name); + writeAttachmentToStorage(tempFile); + return createViewIntentForFileUri(resultForFileUri.getMimeType(), Uri.fromFile(tempFile)); } catch (IOException e) { if (K9.DEBUG) { Log.e(K9.LOG_TAG, "Error while saving attachment to use file:// URI with ACTION_VIEW Intent", e); From d9b6e10cbeda0bf189478ec18733b4fc7451c596 Mon Sep 17 00:00:00 2001 From: cketti Date: Tue, 18 Nov 2014 22:55:51 +0100 Subject: [PATCH 25/39] Change the way the best view intent is determined First we try the original MIME type unless it's application/octet-stream. Then we try the MIME type inferred from the attachment's file extension. Then we fall back to application/octet-stream. In all cases we first try the content:// URI, then a file:// URI. --- .../fsck/k9/mail/internet/MimeUtility.java | 16 +-- src/com/fsck/k9/view/AttachmentView.java | 115 ++++++++---------- 2 files changed, 51 insertions(+), 80 deletions(-) diff --git a/src/com/fsck/k9/mail/internet/MimeUtility.java b/src/com/fsck/k9/mail/internet/MimeUtility.java index c97e25df6..e787536b5 100644 --- a/src/com/fsck/k9/mail/internet/MimeUtility.java +++ b/src/com/fsck/k9/mail/internet/MimeUtility.java @@ -1138,20 +1138,8 @@ public class MimeUtility { return p.matcher(mimeType).matches(); } - /** - * Returns true if the given mimeType matches any of the matchAgainst specifications. - * @param mimeType A MIME type to check. - * @param matchAgainst An array of MIME types to check against. May include wildcards such - * as image/* or * /*. - * @return - */ - public static boolean mimeTypeMatches(String mimeType, String[] matchAgainst) { - for (String matchType : matchAgainst) { - if (mimeTypeMatches(mimeType, matchType)) { - return true; - } - } - return false; + public static boolean isDefaultMimeType(String mimeType) { + return DEFAULT_ATTACHMENT_MIME_TYPE.equalsIgnoreCase(mimeType); } /** diff --git a/src/com/fsck/k9/view/AttachmentView.java b/src/com/fsck/k9/view/AttachmentView.java index 5367e66cd..e18884734 100644 --- a/src/com/fsck/k9/view/AttachmentView.java +++ b/src/com/fsck/k9/view/AttachmentView.java @@ -267,89 +267,68 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo } private Intent getBestViewIntentAndSaveFileIfNecessary() { - IntentAndResolvedActivitiesCount resultForContentUri = getBestViewIntentForContentUri(); - if (resultForContentUri.getActivitiesCount() > 0) { - return resultForContentUri.getIntent(); + String inferredMimeType = MimeUtility.getMimeTypeByExtension(name); + + IntentAndResolvedActivitiesCount resolvedIntentInfo; + if (MimeUtility.isDefaultMimeType(contentType)) { + resolvedIntentInfo = getBestViewIntentForMimeType(inferredMimeType); + } else { + resolvedIntentInfo = getBestViewIntentForMimeType(contentType); + if (!resolvedIntentInfo.hasResolvedActivities() && !inferredMimeType.equals(contentType)) { + resolvedIntentInfo = getBestViewIntentForMimeType(inferredMimeType); + } } - IntentAndResolvedActivitiesCount resultForFileUri = getBestViewIntentForFileUri(); - if (resultForFileUri.getActivitiesCount() > 0) { + if (!resolvedIntentInfo.hasResolvedActivities()) { + resolvedIntentInfo = getBestViewIntentForMimeType(MimeUtility.DEFAULT_ATTACHMENT_MIME_TYPE); + } + + Intent viewIntent; + if (resolvedIntentInfo.hasResolvedActivities() && resolvedIntentInfo.containsFileUri()) { try { File tempFile = TemporaryAttachmentStore.getFile(context, name); writeAttachmentToStorage(tempFile); - return createViewIntentForFileUri(resultForFileUri.getMimeType(), Uri.fromFile(tempFile)); + viewIntent = createViewIntentForFileUri(resolvedIntentInfo.getMimeType(), Uri.fromFile(tempFile)); } catch (IOException e) { if (K9.DEBUG) { Log.e(K9.LOG_TAG, "Error while saving attachment to use file:// URI with ACTION_VIEW Intent", e); } + viewIntent = createViewIntentForAttachmentProviderUri(MimeUtility.DEFAULT_ATTACHMENT_MIME_TYPE); } - } - - return resultForContentUri.getIntent(); - } - - private IntentAndResolvedActivitiesCount getBestViewIntentForContentUri() { - Intent intent; - int activitiesCount; - - Uri originalMimeTypeUri = AttachmentProvider.getAttachmentUriForViewing(account, part.getAttachmentId(), - contentType, name); - Intent originalMimeTypeIntent = createViewIntentForContentUri(contentType, originalMimeTypeUri); - int originalMimeTypeActivitiesCount = getResolvedIntentActivitiesCount(originalMimeTypeIntent); - - String inferredMimeType = MimeUtility.getMimeTypeByExtension(name); - if (inferredMimeType.equals(contentType)) { - intent = originalMimeTypeIntent; - activitiesCount = originalMimeTypeActivitiesCount; } else { - Uri inferredMimeTypeUri = AttachmentProvider.getAttachmentUriForViewing(account, part.getAttachmentId(), - inferredMimeType, name); - Intent inferredMimeTypeIntent = createViewIntentForContentUri(inferredMimeType, inferredMimeTypeUri); - int inferredMimeTypeActivitiesCount = getResolvedIntentActivitiesCount(inferredMimeTypeIntent); - - if (inferredMimeTypeActivitiesCount > originalMimeTypeActivitiesCount) { - intent = inferredMimeTypeIntent; - activitiesCount = inferredMimeTypeActivitiesCount; - } else { - intent = originalMimeTypeIntent; - activitiesCount = originalMimeTypeActivitiesCount; - } + viewIntent = resolvedIntentInfo.getIntent(); } - return new IntentAndResolvedActivitiesCount(intent, activitiesCount); + return viewIntent; } - private IntentAndResolvedActivitiesCount getBestViewIntentForFileUri() { - Intent intent; - int activitiesCount; + private IntentAndResolvedActivitiesCount getBestViewIntentForMimeType(String mimeType) { + Intent contentUriIntent = createViewIntentForAttachmentProviderUri(mimeType); + int contentUriActivitiesCount = getResolvedIntentActivitiesCount(contentUriIntent); + if (contentUriActivitiesCount > 0) { + return new IntentAndResolvedActivitiesCount(contentUriIntent, contentUriActivitiesCount); + } + + Uri dummyFileUri = getDummyFileUri(); + Intent fileUriIntent = createViewIntentForFileUri(mimeType, dummyFileUri); + int fileUriActivitiesCount = getResolvedIntentActivitiesCount(fileUriIntent); + + if (fileUriActivitiesCount > 0) { + return new IntentAndResolvedActivitiesCount(fileUriIntent, fileUriActivitiesCount); + } + + return new IntentAndResolvedActivitiesCount(contentUriIntent, contentUriActivitiesCount); + } + + private Uri getDummyFileUri() { File dummyFile = new File(FileHelper.sanitizeFilename(name)); - Uri fileUri = Uri.fromFile(dummyFile); - - Intent originalMimeTypeIntent = createViewIntentForFileUri(contentType, fileUri); - int originalMimeTypeActivitiesCount = getResolvedIntentActivitiesCount(originalMimeTypeIntent); - - String inferredMimeType = MimeUtility.getMimeTypeByExtension(name); - if (inferredMimeType.equals(contentType)) { - intent = originalMimeTypeIntent; - activitiesCount = originalMimeTypeActivitiesCount; - } else { - Intent inferredMimeTypeIntent = createViewIntentForFileUri(inferredMimeType, fileUri); - int inferredMimeTypeActivitiesCount = getResolvedIntentActivitiesCount(inferredMimeTypeIntent); - - if (inferredMimeTypeActivitiesCount > originalMimeTypeActivitiesCount) { - intent = inferredMimeTypeIntent; - activitiesCount = inferredMimeTypeActivitiesCount; - } else { - intent = originalMimeTypeIntent; - activitiesCount = originalMimeTypeActivitiesCount; - } - } - - return new IntentAndResolvedActivitiesCount(intent, activitiesCount); + return Uri.fromFile(dummyFile); } - private Intent createViewIntentForContentUri(String mimeType, Uri uri) { + private Intent createViewIntentForAttachmentProviderUri(String mimeType) { + Uri uri = AttachmentProvider.getAttachmentUriForViewing(account, part.getAttachmentId(), mimeType, name); + Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(uri, mimeType); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); @@ -422,13 +401,17 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo return intent; } - public int getActivitiesCount() { - return activitiesCount; + public boolean hasResolvedActivities() { + return activitiesCount > 0; } public String getMimeType() { return intent.getType(); } + + public boolean containsFileUri() { + return "file".equals(intent.getData().getScheme()); + } } private class LoadAndDisplayThumbnailAsyncTask extends AsyncTask { From 56c30095e2bd638b2860b37f7202965dde3adab9 Mon Sep 17 00:00:00 2001 From: cketti Date: Tue, 18 Nov 2014 23:02:20 +0100 Subject: [PATCH 26/39] Don't use dummy file path when resolving intents --- src/com/fsck/k9/cache/TemporaryAttachmentStore.java | 8 +++++++- src/com/fsck/k9/view/AttachmentView.java | 12 ++++-------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/com/fsck/k9/cache/TemporaryAttachmentStore.java b/src/com/fsck/k9/cache/TemporaryAttachmentStore.java index c2a4a264a..098e919e9 100644 --- a/src/com/fsck/k9/cache/TemporaryAttachmentStore.java +++ b/src/com/fsck/k9/cache/TemporaryAttachmentStore.java @@ -15,7 +15,13 @@ public class TemporaryAttachmentStore { private static String TEMPORARY_ATTACHMENT_DIRECTORY = "attachments"; private static long MAX_FILE_AGE = 12 * 60 * 60 * 1000; // 12h - public static File getFile(Context context, String attachmentName) throws IOException { + public static File getFile(Context context, String attachmentName) { + File directory = getTemporaryAttachmentDirectory(context); + String filename = FileHelper.sanitizeFilename(attachmentName); + return new File(directory, filename); + } + + public static File getFileForWriting(Context context, String attachmentName) throws IOException { File directory = createOrCleanAttachmentDirectory(context); String filename = FileHelper.sanitizeFilename(attachmentName); return new File(directory, filename); diff --git a/src/com/fsck/k9/view/AttachmentView.java b/src/com/fsck/k9/view/AttachmentView.java index e18884734..93966d9b4 100644 --- a/src/com/fsck/k9/view/AttachmentView.java +++ b/src/com/fsck/k9/view/AttachmentView.java @@ -286,7 +286,7 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo Intent viewIntent; if (resolvedIntentInfo.hasResolvedActivities() && resolvedIntentInfo.containsFileUri()) { try { - File tempFile = TemporaryAttachmentStore.getFile(context, name); + File tempFile = TemporaryAttachmentStore.getFileForWriting(context, name); writeAttachmentToStorage(tempFile); viewIntent = createViewIntentForFileUri(resolvedIntentInfo.getMimeType(), Uri.fromFile(tempFile)); } catch (IOException e) { @@ -310,8 +310,9 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo return new IntentAndResolvedActivitiesCount(contentUriIntent, contentUriActivitiesCount); } - Uri dummyFileUri = getDummyFileUri(); - Intent fileUriIntent = createViewIntentForFileUri(mimeType, dummyFileUri); + File tempFile = TemporaryAttachmentStore.getFile(context, name); + Uri tempFileUri = Uri.fromFile(tempFile); + Intent fileUriIntent = createViewIntentForFileUri(mimeType, tempFileUri); int fileUriActivitiesCount = getResolvedIntentActivitiesCount(fileUriIntent); if (fileUriActivitiesCount > 0) { @@ -321,11 +322,6 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo return new IntentAndResolvedActivitiesCount(contentUriIntent, contentUriActivitiesCount); } - private Uri getDummyFileUri() { - File dummyFile = new File(FileHelper.sanitizeFilename(name)); - return Uri.fromFile(dummyFile); - } - private Intent createViewIntentForAttachmentProviderUri(String mimeType) { Uri uri = AttachmentProvider.getAttachmentUriForViewing(account, part.getAttachmentId(), mimeType, name); From 552e552e88dc9f1385e556cfed11f465e35b3c88 Mon Sep 17 00:00:00 2001 From: Art O Cathain Date: Tue, 11 Nov 2014 18:07:00 +0000 Subject: [PATCH 27/39] Add unit tests for FileHelper.sanitizeFilename() --- src/com/fsck/k9/helper/FileHelper.java | 3 +- .../com/fsck/k9/helper/FileHelperTest.java | 32 +++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 tests/src/com/fsck/k9/helper/FileHelperTest.java diff --git a/src/com/fsck/k9/helper/FileHelper.java b/src/com/fsck/k9/helper/FileHelper.java index c33ed4cb9..e4f98c322 100644 --- a/src/com/fsck/k9/helper/FileHelper.java +++ b/src/com/fsck/k9/helper/FileHelper.java @@ -12,6 +12,7 @@ import com.fsck.k9.K9; public class FileHelper { + /** * Regular expression that represents characters we won't allow in file names. * @@ -27,7 +28,7 @@ public class FileHelper { * * @see #sanitizeFilename(String) */ - private static final String INVALID_CHARACTERS = "[^\\w !#$%&'()\\-@\\^`{}~.,]+"; + private static final String INVALID_CHARACTERS = "[^\\w !#$%&'()\\-@\\^`{}~.,]"; /** * Invalid characters in a file name are replaced by this character. diff --git a/tests/src/com/fsck/k9/helper/FileHelperTest.java b/tests/src/com/fsck/k9/helper/FileHelperTest.java new file mode 100644 index 000000000..1e8260256 --- /dev/null +++ b/tests/src/com/fsck/k9/helper/FileHelperTest.java @@ -0,0 +1,32 @@ +package com.fsck.k9.helper; + +import junit.framework.TestCase; + +import java.lang.String; + +public class FileHelperTest extends TestCase { + + public void testSanitize1() { + checkSanitization(".._bla_", "../bla_"); + } + + public void testSanitize2() { + checkSanitization("_etc_bla", "/etc/bla"); + } + + public void testSanitize3() { + checkSanitization("_пPп", "+пPп"); + } + + public void testSanitize4() { + checkSanitization(".東京_!", ".東京?!"); + } + + public void testSanitize5() { + checkSanitization("Plan 9", "Plan 9"); + } + + private void checkSanitization(String expected, String actual) { + assertEquals(expected, FileHelper.sanitizeFilename(actual)); + } +} From 68cee3e9a3a4148663bd593f550f33017ae7a1cf Mon Sep 17 00:00:00 2001 From: cketti Date: Thu, 27 Nov 2014 21:33:47 +0100 Subject: [PATCH 28/39] Update changelog for 5.102 --- res/xml/changelog_master.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/res/xml/changelog_master.xml b/res/xml/changelog_master.xml index 0ce08f80b..5e7667b1f 100644 --- a/res/xml/changelog_master.xml +++ b/res/xml/changelog_master.xml @@ -8,6 +8,11 @@ They are automatically updated with "ant bump-version". --> + + Improved 'open' functionality for attachments + Removed APG legacy interface + Fixed bug in Russian translation + Fixed build problems that caused v5.100 to request the permissions READ_CALL_LOG and WRITE_CALL_LOG From 2c81495aeacb5f4f5687a8e2d6abb2bc2b6bfbf4 Mon Sep 17 00:00:00 2001 From: cketti Date: Thu, 27 Nov 2014 21:47:51 +0100 Subject: [PATCH 29/39] Bump version to 5.102 --- AndroidManifest.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 9a70ecfb2..de6848098 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -2,8 +2,8 @@ + android:versionCode="23020" + android:versionName="5.102"> Date: Wed, 3 Dec 2014 18:50:16 -0800 Subject: [PATCH 30/39] Force gradlew (and other shell scripts) to use lf line endings. --- .gitattributes | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..58f6c2a0e --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +*.sh text eol=lf +gradlew text eol=lf From aaf3963567e52e2bc861a7be031926d1ca5895f5 Mon Sep 17 00:00:00 2001 From: Danny Baumann Date: Thu, 4 Dec 2014 13:16:12 +0100 Subject: [PATCH 31/39] Don't throw CertificateValidationException for all SSLExceptions. An interrupted connection attempt to the server yields an SSLException as well, like this: E/k9 ( 6937): Caused by: javax.net.ssl.SSLHandshakeException: Connection closed by peer E/k9 ( 6937): at com.android.org.conscrypt.NativeCrypto.SSL_do_handshake(Native Method) E/k9 ( 6937): at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:302) E/k9 ( 6937): at com.android.org.conscrypt.OpenSSLSocketImpl.waitForHandshake(OpenSSLSocketImpl.java:598) E/k9 ( 6937): at com.android.org.conscrypt.OpenSSLSocketImpl.getInputStream(OpenSSLSocketImpl.java:560) E/k9 ( 6937): at com.fsck.k9.mail.store.ImapStore$ImapConnection.open(ImapStore.java:2459) We don't want the user to notify of 'certificate problems' in that case. Fix it by checking whether the SSLException was actually triggered by a CertificateException. --- src/com/fsck/k9/mail/store/ImapStore.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/com/fsck/k9/mail/store/ImapStore.java b/src/com/fsck/k9/mail/store/ImapStore.java index 9042f9d9b..89963ca5c 100644 --- a/src/com/fsck/k9/mail/store/ImapStore.java +++ b/src/com/fsck/k9/mail/store/ImapStore.java @@ -23,6 +23,7 @@ import java.nio.charset.CharsetDecoder; import java.nio.charset.CodingErrorAction; import java.security.GeneralSecurityException; import java.security.Security; +import java.security.cert.CertificateException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; @@ -2616,7 +2617,11 @@ public class ImapStore extends Store { } } catch (SSLException e) { - throw new CertificateValidationException(e.getMessage(), e); + if (e.getCause() instanceof CertificateException) { + throw new CertificateValidationException(e.getMessage(), e); + } else { + throw e; + } } catch (GeneralSecurityException gse) { throw new MessagingException( "Unable to open connection to IMAP server due to security error.", gse); From 1fa6e117e1c438bf611663f4e7d30449c25085c0 Mon Sep 17 00:00:00 2001 From: Andrew Chen Date: Wed, 3 Dec 2014 21:57:50 -0800 Subject: [PATCH 32/39] Add Lollipop lock screen notifications. Add vector versions for some notification icons (yay Illustrator) Add comments reminding people to add their settings to GlobalSettings. support for notification_new_messages_title Not sure why #ffffffff is resulting in black with targetSdk 17. --- AndroidManifest.xml | 4 - build.gradle | 7 +- gradle/wrapper/gradle-wrapper.properties | 4 +- images/drawable-src/ic_action_delete.svg | 11 ++ .../drawable-src/ic_action_mark_as_read.svg | 10 ++ .../ic_action_single_message_options.svg | 10 ++ .../ic_action_delete_dark_vector.xml | 15 +++ .../ic_action_mark_as_read_dark_vector.xml | 19 +++ ...ion_single_message_options_dark_vector.xml | 19 +++ .../ic_notify_new_mail_vector.xml | 13 ++ res/values-ca/strings.xml | 4 +- res/values-cs/strings.xml | 4 +- res/values-da/strings.xml | 4 +- res/values-de/strings.xml | 4 +- res/values-el/strings.xml | 4 +- res/values-es/strings.xml | 4 +- res/values-et/strings.xml | 4 +- res/values-eu/strings.xml | 4 +- res/values-fi/strings.xml | 4 +- res/values-fr/strings.xml | 4 +- res/values-gl-rES/strings.xml | 4 +- res/values-hu/strings.xml | 4 +- res/values-it/strings.xml | 4 +- res/values-ja/strings.xml | 4 +- res/values-ko/strings.xml | 4 +- res/values-lt/strings.xml | 4 +- res/values-lv/strings.xml | 4 +- res/values-nb/strings.xml | 4 +- res/values-nl/strings.xml | 4 +- res/values-pl/strings.xml | 4 +- res/values-pt-rBR/strings.xml | 4 +- res/values-ru/strings.xml | 4 +- res/values-sk/strings.xml | 4 +- res/values-sv/strings.xml | 4 +- res/values-tr/strings.xml | 4 +- res/values-uk/strings.xml | 4 +- res/values-v21/styles.xml | 11 ++ res/values-zh-rCN/strings.xml | 4 +- res/values-zh-rTW/strings.xml | 4 +- res/values/arrays.xml | 16 +++ res/values/strings.xml | 12 +- res/xml/global_preferences.xml | 8 ++ src/com/fsck/k9/K9.java | 42 ++++++ src/com/fsck/k9/activity/setup/Prefs.java | 15 +++ .../k9/controller/MessagingController.java | 125 ++++++++++++++++-- .../fsck/k9/preferences/GlobalSettings.java | 5 + src/com/fsck/k9/preferences/Settings.java | 2 +- 47 files changed, 408 insertions(+), 52 deletions(-) create mode 100644 images/drawable-src/ic_action_delete.svg create mode 100644 images/drawable-src/ic_action_mark_as_read.svg create mode 100644 images/drawable-src/ic_action_single_message_options.svg create mode 100644 res/drawable-nodpi-v21/ic_action_delete_dark_vector.xml create mode 100644 res/drawable-nodpi-v21/ic_action_mark_as_read_dark_vector.xml create mode 100644 res/drawable-nodpi-v21/ic_action_single_message_options_dark_vector.xml create mode 100644 res/drawable-nodpi-v21/ic_notify_new_mail_vector.xml create mode 100644 res/values-v21/styles.xml diff --git a/AndroidManifest.xml b/AndroidManifest.xml index de6848098..bf987e168 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -5,10 +5,6 @@ android:versionCode="23020" android:versionName="5.102"> - - diff --git a/build.gradle b/build.gradle index 1aeda0139..25176a138 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:0.12.2' + classpath 'com.android.tools.build:gradle:1.0.0-rc1' classpath 'com.jakewharton.sdkmanager:gradle-plugin:0.12.0' } } @@ -27,7 +27,8 @@ dependencies { compile 'commons-io:commons-io:2.0.1' compile 'com.jcraft:jzlib:1.0.7' compile 'com.beetstra.jutf7:jutf7:1.0.0' - compile 'com.android.support:support-v13:19.1.0' + compile 'com.android.support:support-v4:21.0.2' + compile 'com.android.support:support-v13:21.0.2' compile 'net.sourceforge.htmlcleaner:htmlcleaner:2.2' } @@ -43,7 +44,7 @@ subprojects { } android { - compileSdkVersion 19 + compileSdkVersion 21 buildToolsVersion '20.0.0' defaultConfig { diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 09a4e3c6b..eeab65ea7 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Sat Jun 14 01:43:40 CEST 2014 +#Sun Nov 30 16:02:23 PST 2014 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=http\://services.gradle.org/distributions/gradle-1.12-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip diff --git a/images/drawable-src/ic_action_delete.svg b/images/drawable-src/ic_action_delete.svg new file mode 100644 index 000000000..8f745143f --- /dev/null +++ b/images/drawable-src/ic_action_delete.svg @@ -0,0 +1,11 @@ + + + + + + + diff --git a/images/drawable-src/ic_action_mark_as_read.svg b/images/drawable-src/ic_action_mark_as_read.svg new file mode 100644 index 000000000..a6b7d252a --- /dev/null +++ b/images/drawable-src/ic_action_mark_as_read.svg @@ -0,0 +1,10 @@ + + + + + + + + diff --git a/images/drawable-src/ic_action_single_message_options.svg b/images/drawable-src/ic_action_single_message_options.svg new file mode 100644 index 000000000..0655775e5 --- /dev/null +++ b/images/drawable-src/ic_action_single_message_options.svg @@ -0,0 +1,10 @@ + + + + + + + + diff --git a/res/drawable-nodpi-v21/ic_action_delete_dark_vector.xml b/res/drawable-nodpi-v21/ic_action_delete_dark_vector.xml new file mode 100644 index 000000000..816e5f0d2 --- /dev/null +++ b/res/drawable-nodpi-v21/ic_action_delete_dark_vector.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/res/drawable-nodpi-v21/ic_action_mark_as_read_dark_vector.xml b/res/drawable-nodpi-v21/ic_action_mark_as_read_dark_vector.xml new file mode 100644 index 000000000..a32ab6ff7 --- /dev/null +++ b/res/drawable-nodpi-v21/ic_action_mark_as_read_dark_vector.xml @@ -0,0 +1,19 @@ + + + + + + diff --git a/res/drawable-nodpi-v21/ic_action_single_message_options_dark_vector.xml b/res/drawable-nodpi-v21/ic_action_single_message_options_dark_vector.xml new file mode 100644 index 000000000..25e2125c3 --- /dev/null +++ b/res/drawable-nodpi-v21/ic_action_single_message_options_dark_vector.xml @@ -0,0 +1,19 @@ + + + + + + diff --git a/res/drawable-nodpi-v21/ic_notify_new_mail_vector.xml b/res/drawable-nodpi-v21/ic_notify_new_mail_vector.xml new file mode 100644 index 000000000..fff71a3ee --- /dev/null +++ b/res/drawable-nodpi-v21/ic_notify_new_mail_vector.xml @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index e502dded3..4dadb926c 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -158,7 +158,9 @@ Si us plau, envia\'ns els errors, contribueix a millorar-lo a S\'està netejant el compte \"%s\" S\'està creant un compte \"%s\" Nou correu - %d missatges nous + + %d missatges nous + %d no llegit(s) (%s) i %d més a %s Respon diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index 1a7cebe0c..fc5eccac5 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -159,7 +159,9 @@ Posílejte prosím chybová hlášení, přispívejte novými funkcemi a ptejte Čistím účet \"%s\" Obnovuji účet \"%s\" Nová zpráva - %d nových zpráv + + %d nových zpráv + %d Nepřečteno (%s) + %d více v %s Odpovědět diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index 84ab860cc..03427f897 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -155,7 +155,9 @@ Vær venlig at sende fejlrapporter, anmodning om nye funktioner, og spørgsmål Renser konto \"%s\" Genskaber konto \"%s\" Ny mail - %d nye meddelelser + + %d nye meddelelser + %d ulæst(e) (%s) + %d yderligere på %s Svar diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 8479cd434..47edaf961 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -158,7 +158,9 @@ Um Fehler zu melden, neue Funktionen vorzuschlagen oder Fragen zu stellen, besuc Konto \'%s\' wird bereinigt Konto \"%s\' wird wieder hergestellt Neue Nachricht - %d neue Nachrichten + + %d neue Nachrichten + %d Ungelesen (%s) und %d weitere (%s) Antworten diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index 873ac62c8..48030480f 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -157,7 +157,9 @@ Καθαρισμός λογαριασμού \'%s\' Ανακατασκευή λογαριασμού \'%s\' Νέο μήνυμα - %d νέα μηνύματα + + %d νέα μηνύματα + %d μη αναγνωσμένα (%s) + %d περισσότερα στον %s Απάντηση diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 203fd9edf..7fc0b4a64 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -157,7 +157,9 @@ Por favor, envía los errores detectados, contribuye con nuevas funcionalidades Limpiando cuenta \"%s\" Recreando cuenta \"%s\" Correo nuevo - %d mensajes nuevos + + %d mensajes nuevos + %d Sin Leer (%s) + %d más en %s Responder diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml index 247ad5f89..db47e4b3e 100644 --- a/res/values-et/strings.xml +++ b/res/values-et/strings.xml @@ -159,7 +159,9 @@ Palun saada infot probleemidest, soovitavatest lisafunktsioonidest ja küsi küs Puhastab kontot \"%s\" Taasloob kontot \"%s\" Uus meilisõnum - %d uued sõnumid + + %d uued sõnumid + %d Lugemata (%s) + %d rohkemat %s Vasta diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml index 42b719d08..c9194e694 100644 --- a/res/values-eu/strings.xml +++ b/res/values-eu/strings.xml @@ -157,7 +157,9 @@ Arazoen berri emateko, ezaugarri berriak gehitzeko eta galderak egiteko \"%s\" kontua garbitzen \"%s\" kontua birsortzen Eposta berria - %d mezu berri + + %d mezu berri + %d irakurgabe (%s) + %d gehiago %s kontuan Erantzun diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index 4f2020a55..f4310709e 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -159,7 +159,9 @@ Virheraportit, osallistuminen projektiin ja kysymykset: Mene osoitteeseen Tyhjennetään tiliä \"%s\" Luodaan uudelleen tiliä \"%s\" Uusi sähköpostiviesti - %d uutta viestiä + + %d uutta viestiä + %d lukematonta (%s) + %d viestiä lisää tilillä %s Vastaa diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 508723594..c8ed8d14e 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -157,7 +157,9 @@ jusqu\'à %d de plus Effacement du compte «\u00A0%s\u00A0» Recréation du compte «\u00A0%s\u00A0» Nouveau courriel - %d nouveaux messages + + %d nouveaux messages + %d non lu(s) (%s) + %d de plus sur %s Répondre diff --git a/res/values-gl-rES/strings.xml b/res/values-gl-rES/strings.xml index 8424dbbc0..036eaaa87 100644 --- a/res/values-gl-rES/strings.xml +++ b/res/values-gl-rES/strings.xml @@ -156,7 +156,9 @@ Envía informes de erro, contribúe con novas funcionalidades e pregunta o que d A limpar a conta \"%s\" Volvendo crear a conta \"%s\" Correo novo - %d mensaxes novas + + %d mensaxes novas + %d sen ler (%s) + %d máis en %s Responder diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index 01a09c822..deec6e93b 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -156,7 +156,9 @@ Hibajelentéseivel hozzájárul az újabb verziók tökéletesítéséhez, kérd Fiók takarítása \"%s\" A \"%s\" újbóli létrehozása Új levél - %d új üzenet + + %d új üzenet + %d Olvasatlan (%s) + %d érkezett ide: %s Válasz diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 3ab66231f..485a491f5 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -158,7 +158,9 @@ Invia le tue segnalazioni, suggerisci nuove funzionalità e chiedi informazioni Rimozione account \"%s\" Ricrea account \"%s\" Nuova posta - %d nuovi messaggi + + %d nuovi messaggi + %d non letti (%s) + %d altri su %s Rispondi diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index 944684123..800c3bc35 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -157,7 +157,9 @@ K-9 は大多数のメールクライアントと同様に、ほとんどのフ アカウント \"%s\" をクリアしています アカウント \"%s\" を再作成しています 新着メール - %d 件の新着メッセージ + + %d 件の新着メッセージ + %d 未読 (%s) + %d more on %s 返信 diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index 36498b88d..92653136c 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -156,7 +156,9 @@ K-9 메일은 대부분의 무료 hotmail 계정을 지원하지 않으며, 다 계정 비우기 \"%s\" 계정 재생성 \"%s\" 새 메일 - %d 통의 새 메일 + + %d 통의 새 메일 + %d 통의 읽지 않은 메일 (%s) + %d 통의 메일 추가됨 (%s) 답장 diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index 63d846e0b..727314c8c 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -157,7 +157,9 @@ Praneškite apie klaidas, pridėkite naujų galimybių ir užduokite klausimus m Išvaloma paskyra \"%s\" Iš naujo kuriama paskyra \"%s\" Naujas laiškas - %d naujų laiškų + + %d naujų laiškų + %d Neskaitytų (%s) + %d daugiau %s Atsakyti diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index 1f938d02f..1014726b8 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -160,7 +160,9 @@ pat %d vairāk Iztukšot kontu \"%s\" Atjaunot kontu \"%s\" Jauna vēstule - %d jaunas vēstules + + %d jaunas vēstules + %d Nelasītas (%s) + %d vairāk %s Atbildēt diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index b2e90c59f..287474d0c 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -159,7 +159,9 @@ til %d flere Renser konto \"%s\" Gjenskaper konto \"%s\" Ny e-post - %d ny(e) melding(er) + + %d ny(e) melding(er) + %d Ulest(e) (%s) + %d flere på %s Svar diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index ec8ed7a95..f38e68cbf 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -157,7 +157,9 @@ Graag foutrapporten, bijdrage nieuwe functies en vragen stellen op Account \"%s\" wissen Account \"%s\" opnieuw instellen Nieuwe mail - %d nieuwe berichten + + %d nieuwe berichten + %d Ongelezen (%s) + %d meer op %s Antwoorden diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index c20525f89..c12bc3148 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -157,7 +157,9 @@ Wszelkie zgłoszenia usterek, zapytania oraz nowe pomysły prosimy przesyłać z Czyszczę konto \"%s\" Odtwarzam konto \"%s\" Nowa wiadomość - Nowych wiadomości: %d + + Nowych wiadomości: %d + Nowe: %d (%s) + %d więcej na %s Odpowiedz diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml index bfcd29914..eb8546786 100644 --- a/res/values-pt-rBR/strings.xml +++ b/res/values-pt-rBR/strings.xml @@ -156,7 +156,9 @@ Por favor, nos envie relatórios de bugs, contribua para novas melhorias e faça Limpando conta \"%s\" Recriando conta \"%s\" Novo e-mail - %d novas mensagens + + %d novas mensagens + %d não lidos (%s) + %d mais em %s Responder diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index aa573b580..86191181e 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -158,7 +158,9 @@ K-9 Mail — почтовый клиент для Android. Очистка ящика \"%s\" Пересоздание ящика \"%s\" Новая почта - %d новых + + %d новых + %d новых (%s) + %d в %s Ответить diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index c7143eb5b..3316105c6 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -158,7 +158,9 @@ Prosím, nahlasujte prípadné chyby, prispievajte novými funkciami a pýtajte Čistenie účtu \"%s\" Obnovovanie účtu \"%s\" Nová správa - Počet nových správ: %d + + Počet nových správ: %d + Počet neprečítaných správ: %d v %s + ďalších %d v %s Odpovedať diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index 2dff1941f..387be8a13 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -158,7 +158,9 @@ Anmäl fel, hjälp till med nya funktioner och ställ frågor på Rensar konto \"%s\" Återskapar konto \"%s\" Ny e-post - %d nya meddelanden + + %d nya meddelanden + %d olästa (%s) + %d ytterligare på %s Svara diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index 689006cc0..d85b23162 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -157,7 +157,9 @@ Lütfen hata raporlarınızı, istediğiniz yeni özellikleri ve sorularınızı Hesap temizleme \"%s\" Hesap yenileme \"%s\" Yeni posta - %d yeni mesaj + + %d yeni mesaj + %d Okunmadı (%s) %d daha fazla %s Yanıtla diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index 2e00ef7c2..f4af452ca 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -156,7 +156,9 @@ K-9 Mail це поштовий клієнт з відкритим вихідни Очищення скриньки \"%s\" Відновлення облікового запису\"%s\" Нова пошта - %d нові повідомлення + + %d нові повідомлення + %d Непрочитане (%s) + %d більше на %s Відповісти diff --git a/res/values-v21/styles.xml b/res/values-v21/styles.xml new file mode 100644 index 000000000..f4066afaf --- /dev/null +++ b/res/values-v21/styles.xml @@ -0,0 +1,11 @@ + + + + + diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 9e0dba3c5..bee136bdf 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -156,7 +156,9 @@ K-9改进的功能包括: 正在清理账户“%s 正在重建账户“%s 您有新邮件 - %d 新邮件 + + %d 新邮件 + 您有%d封未读邮件(%s 再加载 %d 条信息, 账户 %s 回复 diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index 982b26705..3244ba521 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -128,7 +128,9 @@ 正在清理帳戶「%s 正在重建帳戶「%s 您有新郵件 - %d 新訊息 + + %d 新訊息 + 您有%d封未讀郵件(%s + 來自%s已超過%d則訊息 回覆 diff --git a/res/values/arrays.xml b/res/values/arrays.xml index 4a55df480..63eb2eeac 100644 --- a/res/values/arrays.xml +++ b/res/values/arrays.xml @@ -727,6 +727,22 @@ ALWAYS + + @string/global_settings_lock_screen_notification_visibility_nothing + @string/global_settings_lock_screen_notification_visibility_app_name + @string/global_settings_lock_screen_notification_visibility_message_count + @string/global_settings_lock_screen_notification_visibility_senders + @string/global_settings_lock_screen_notification_visibility_everything + + + + NOTHING + APP_NAME + MESSAGE_COUNT + SENDERS + EVERYTHING + + @string/global_settings_splitview_always @string/global_settings_splitview_never diff --git a/res/values/strings.xml b/res/values/strings.xml index 37771b244..9a8f8c61a 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -200,7 +200,10 @@ Please submit bug reports, contribute new features and ask questions at Recreating account \"%s\" New mail - %d new messages + + %d new message + %d new messages + %d Unread (%s) + %d more on %s @@ -339,6 +342,13 @@ Please submit bug reports, contribute new features and ask questions at Always Show a button in the notification that allows quick message deletion + Lock Screen Notifications + No lock screen notifications + Application name + Unread message count + Message count and senders + Same as unlocked notification + Quiet Time Disable ringing, buzzing and flashing at night Quiet Time starts diff --git a/res/xml/global_preferences.xml b/res/xml/global_preferences.xml index f06afa116..be892ad93 100644 --- a/res/xml/global_preferences.xml +++ b/res/xml/global_preferences.xml @@ -328,6 +328,14 @@ android:summary="@string/global_settings_notification_quick_delete_description" /> + + + * If you're adding a preference here, odds are you'll need to add it to + * {@link com.fsck.k9.preferences.GlobalSettings}, too. + * + * @param editor Preferences to save into + */ public static void save(SharedPreferences.Editor editor) { editor.putBoolean("enableDebugLogging", K9.DEBUG); editor.putBoolean("enableSensitiveLogging", K9.DEBUG_SENSITIVE); @@ -523,6 +543,7 @@ public class K9 extends Application { editor.putString("notificationHideSubject", sNotificationHideSubject.toString()); editor.putString("notificationQuickDelete", sNotificationQuickDelete.toString()); + editor.putString("lockScreenNotificationVisibility", sLockScreenNotificationVisibility.toString()); editor.putString("attachmentdefaultpath", mAttachmentDefaultPath); editor.putBoolean("useBackgroundAsUnreadIndicator", sUseBackgroundAsUnreadIndicator); @@ -675,6 +696,14 @@ public class K9 extends Application { } } + /** + * Load preferences into our statics. + * + * If you're adding a preference here, odds are you'll need to add it to + * {@link com.fsck.k9.preferences.GlobalSettings}, too. + * + * @param prefs Preferences to load + */ public static void loadPrefs(Preferences prefs) { SharedPreferences sprefs = prefs.getPreferences(); DEBUG = sprefs.getBoolean("enableDebugLogging", false); @@ -745,6 +774,11 @@ public class K9 extends Application { sNotificationQuickDelete = NotificationQuickDelete.valueOf(notificationQuickDelete); } + String lockScreenNotificationVisibility = sprefs.getString("lockScreenNotificationVisibility", null); + if(lockScreenNotificationVisibility != null) { + sLockScreenNotificationVisibility = LockScreenNotificationVisibility.valueOf(lockScreenNotificationVisibility); + } + String splitViewMode = sprefs.getString("splitViewMode", null); if (splitViewMode != null) { sSplitViewMode = SplitViewMode.valueOf(splitViewMode); @@ -1197,6 +1231,14 @@ public class K9 extends Application { sNotificationQuickDelete = mode; } + public static LockScreenNotificationVisibility getLockScreenNotificationVisibility() { + return sLockScreenNotificationVisibility; + } + + public static void setLockScreenNotificationVisibility(final LockScreenNotificationVisibility visibility) { + sLockScreenNotificationVisibility = visibility; + } + public static boolean wrapFolderNames() { return mWrapFolderNames; } diff --git a/src/com/fsck/k9/activity/setup/Prefs.java b/src/com/fsck/k9/activity/setup/Prefs.java index f2d574557..96d34846d 100644 --- a/src/com/fsck/k9/activity/setup/Prefs.java +++ b/src/com/fsck/k9/activity/setup/Prefs.java @@ -82,6 +82,7 @@ public class Prefs extends K9PreferenceActivity { private static final String PREFERENCE_QUIET_TIME_STARTS = "quiet_time_starts"; private static final String PREFERENCE_QUIET_TIME_ENDS = "quiet_time_ends"; private static final String PREFERENCE_NOTIF_QUICK_DELETE = "notification_quick_delete"; + private static final String PREFERENCE_LOCK_SCREEN_NOTIFICATION_VISIBILITY = "lock_screen_notification_visibility"; private static final String PREFERENCE_HIDE_USERAGENT = "privacy_hide_useragent"; private static final String PREFERENCE_HIDE_TIMEZONE = "privacy_hide_timezone"; @@ -144,6 +145,7 @@ public class Prefs extends K9PreferenceActivity { private com.fsck.k9.preferences.TimePickerPreference mQuietTimeStarts; private com.fsck.k9.preferences.TimePickerPreference mQuietTimeEnds; private ListPreference mNotificationQuickDelete; + private ListPreference mLockScreenNotificationVisibility; private Preference mAttachmentPathPreference; private CheckBoxPreference mBackgroundAsUnreadIndicator; @@ -337,6 +339,14 @@ public class Prefs extends K9PreferenceActivity { mNotificationQuickDelete = null; } + mLockScreenNotificationVisibility = setupListPreference(PREFERENCE_LOCK_SCREEN_NOTIFICATION_VISIBILITY, + K9.getLockScreenNotificationVisibility().toString()); + if (!MessagingController.platformSupportsLockScreenNotifications()) { + ((PreferenceScreen) findPreference("notification_preferences")) + .removePreference(mLockScreenNotificationVisibility); + mLockScreenNotificationVisibility = null; + } + mBackgroundOps = setupListPreference(PREFERENCE_BACKGROUND_OPS, K9.getBackgroundOps().name()); mDebugLogging = (CheckBoxPreference)findPreference(PREFERENCE_DEBUG_LOGGING); @@ -484,6 +494,11 @@ public class Prefs extends K9PreferenceActivity { NotificationQuickDelete.valueOf(mNotificationQuickDelete.getValue())); } + if(mLockScreenNotificationVisibility != null) { + K9.setLockScreenNotificationVisibility( + K9.LockScreenNotificationVisibility.valueOf(mLockScreenNotificationVisibility.getValue())); + } + K9.setSplitViewMode(SplitViewMode.valueOf(mSplitViewMode.getValue())); K9.setAttachmentDefaultPath(mAttachmentPathPreference.getSummary().toString()); boolean needsRefresh = K9.setBackgroundOps(mBackgroundOps.getValue()); diff --git a/src/com/fsck/k9/controller/MessagingController.java b/src/com/fsck/k9/controller/MessagingController.java index 07f2f5e05..9ece56ee5 100644 --- a/src/com/fsck/k9/controller/MessagingController.java +++ b/src/com/fsck/k9/controller/MessagingController.java @@ -2,7 +2,6 @@ package com.fsck.k9.controller; import java.io.CharArrayWriter; import java.io.PrintWriter; -import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -13,6 +12,7 @@ import java.util.EnumSet; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; +import java.util.LinkedHashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -2633,13 +2633,16 @@ public class MessagingController implements Runnable { R.string.notification_certificate_error_title, account.getDescription()); final NotificationCompat.Builder builder = new NotificationCompat.Builder(context); - builder.setSmallIcon(R.drawable.ic_notify_new_mail); + builder.setSmallIcon(platformSupportsLockScreenNotifications() + ? R.drawable.ic_notify_new_mail_vector + : R.drawable.ic_notify_new_mail); builder.setWhen(System.currentTimeMillis()); builder.setAutoCancel(true); builder.setTicker(title); builder.setContentTitle(title); builder.setContentText(context.getString(R.string.notification_certificate_error_text)); builder.setContentIntent(pi); + builder.setVisibility(NotificationCompat.VISIBILITY_PUBLIC); configureNotification(builder, null, null, K9.NOTIFICATION_LED_FAILURE_COLOR, @@ -3343,6 +3346,7 @@ public class MessagingController implements Runnable { TaskStackBuilder stack = buildMessageListBackStack(mApplication, account, account.getInboxFolderName()); builder.setContentIntent(stack.getPendingIntent(0, 0)); + builder.setVisibility(NotificationCompat.VISIBILITY_PUBLIC); if (K9.NOTIFICATION_LED_WHILE_SYNCING) { configureNotification(builder, null, null, @@ -3377,7 +3381,9 @@ public class MessagingController implements Runnable { (NotificationManager) mApplication.getSystemService(Context.NOTIFICATION_SERVICE); NotificationCompat.Builder builder = new NotificationCompat.Builder(mApplication); - builder.setSmallIcon(R.drawable.ic_notify_new_mail); + builder.setSmallIcon(platformSupportsLockScreenNotifications() + ? R.drawable.ic_notify_new_mail_vector + : R.drawable.ic_notify_new_mail); builder.setWhen(System.currentTimeMillis()); builder.setAutoCancel(true); builder.setTicker(mApplication.getString(R.string.send_failure_subject)); @@ -3386,6 +3392,7 @@ public class MessagingController implements Runnable { TaskStackBuilder stack = buildFolderListBackStack(mApplication, account); builder.setContentIntent(stack.getPendingIntent(0, 0)); + builder.setVisibility(NotificationCompat.VISIBILITY_PUBLIC); configureNotification(builder, null, null, K9.NOTIFICATION_LED_FAILURE_COLOR, K9.NOTIFICATION_LED_BLINK_FAST, true); @@ -3424,6 +3431,7 @@ public class MessagingController implements Runnable { TaskStackBuilder stack = buildMessageListBackStack(mApplication, account, account.getInboxFolderName()); builder.setContentIntent(stack.getPendingIntent(0, 0)); + builder.setVisibility(NotificationCompat.VISIBILITY_PUBLIC); if (K9.NOTIFICATION_LED_WHILE_SYNCING) { configureNotification(builder, null, null, @@ -4769,6 +4777,10 @@ public class MessagingController implements Runnable { return Build.VERSION.SDK_INT >= 16; } + public static boolean platformSupportsLockScreenNotifications() { + return Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP; + } + private Message findNewestMessageForNotificationLocked(Context context, Account account, NotificationData data) { if (!data.messages.isEmpty()) { @@ -4793,6 +4805,9 @@ public class MessagingController implements Runnable { } } + // Maximum number of senders to display in a lock screen notification. + private static final int NUM_SENDERS_IN_LOCK_SCREEN_NOTIFICATION = 5; + private void notifyAccountWithDataLocked(Context context, Account account, Message message, NotificationData data) { boolean updateSilently = false; @@ -4858,7 +4873,8 @@ public class MessagingController implements Runnable { style.setSummaryText(context.getString(R.string.notification_additional_messages, data.droppedMessages.size(), accountDescr)); } - String title = context.getString(R.string.notification_new_messages_title, newMessages); + final String title = context.getResources().getQuantityString( + R.plurals.notification_new_messages_title, newMessages, newMessages); style.setBigContentTitle(title); builder.setContentTitle(title); builder.setSubText(accountDescr); @@ -4875,14 +4891,20 @@ public class MessagingController implements Runnable { builder.setContentTitle(sender); builder.setStyle(style); - builder.addAction(R.drawable.ic_action_single_message_options_dark, - context.getString(R.string.notification_action_reply), - NotificationActionService.getReplyIntent(context, account, message.makeMessageReference())); + builder.addAction( + platformSupportsExtendedNotifications() + ? R.drawable.ic_action_single_message_options_dark_vector + : R.drawable.ic_action_single_message_options_dark, + context.getString(R.string.notification_action_reply), + NotificationActionService.getReplyIntent(context, account, message.makeMessageReference())); } - builder.addAction(R.drawable.ic_action_mark_as_read_dark, - context.getString(R.string.notification_action_mark_as_read), - NotificationActionService.getReadAllMessagesIntent(context, account, allRefs)); + builder.addAction( + platformSupportsLockScreenNotifications() + ? R.drawable.ic_action_mark_as_read_dark_vector + : R.drawable.ic_action_mark_as_read_dark, + context.getString(R.string.notification_action_mark_as_read), + NotificationActionService.getReadAllMessagesIntent(context, account, allRefs)); NotificationQuickDelete deleteOption = K9.getNotificationQuickDeleteBehaviour(); boolean showDeleteAction = deleteOption == NotificationQuickDelete.ALWAYS || @@ -4891,9 +4913,12 @@ public class MessagingController implements Runnable { if (showDeleteAction) { // we need to pass the action directly to the activity, otherwise the // status bar won't be pulled up and we won't see the confirmation (if used) - builder.addAction(R.drawable.ic_action_delete_dark, - context.getString(R.string.notification_action_delete), - NotificationDeleteConfirmation.getIntent(context, account, allRefs)); + builder.addAction( + platformSupportsLockScreenNotifications() + ? R.drawable.ic_action_delete_dark_vector + : R.drawable.ic_action_delete_dark, + context.getString(R.string.notification_action_delete), + NotificationDeleteConfirmation.getIntent(context, account, allRefs)); } } else { String accountNotice = context.getString(R.string.notification_new_one_account_fmt, @@ -4952,6 +4977,8 @@ public class MessagingController implements Runnable { NotificationSetting n = account.getNotificationSetting(); + configureLockScreenNotification(builder, context, account, newMessages, unreadCount, accountDescr, sender, data.messages); + configureNotification( builder, (n.shouldRing()) ? n.getRingtone() : null, @@ -5064,6 +5091,78 @@ public class MessagingController implements Runnable { } } + /** + * Configure lock screen notifications on platforms that support it + * + * @param builder Unlocked notification + * @param context Context + * @param account Account being notified + * @param newMessages Number of new messages being notified for + * @param unreadCount Total number of unread messages in this account + * @param accountDescription Formatted account name for display + * @param formattedSender Formatted sender name for display + * @param messages List of messages if notifying for multiple messages. Null otherwise. + */ + private void configureLockScreenNotification(NotificationCompat.Builder builder, + Context context, + Account account, + int newMessages, + int unreadCount, + CharSequence accountDescription, + CharSequence formattedSender, + List messages) { + if (!platformSupportsLockScreenNotifications()) { + return; + } + + builder.setSmallIcon(R.drawable.ic_notify_new_mail_vector); + builder.setColor(account.getChipColor()); + + NotificationCompat.Builder publicNotification = new NotificationCompat.Builder(context); + publicNotification.setSmallIcon(R.drawable.ic_notify_new_mail_vector); + publicNotification.setColor(account.getChipColor()); + publicNotification.setNumber(unreadCount); + final String title = context.getResources().getQuantityString( + R.plurals.notification_new_messages_title, newMessages, newMessages); + publicNotification.setContentTitle(title); + + switch (K9.getLockScreenNotificationVisibility()) { + case NOTHING: + builder.setVisibility(NotificationCompat.VISIBILITY_SECRET); + break; + case APP_NAME: + // This is the Android default, but we should be explicit in case that changes in the future. + builder.setVisibility(NotificationCompat.VISIBILITY_PRIVATE); + break; + case SENDERS: + if (newMessages == 1) { + publicNotification.setContentText(formattedSender); + } else { + // Use a LinkedHashSet so that we preserve ordering (newest to oldest), but still remove duplicates + Set senders = new LinkedHashSet<>(NUM_SENDERS_IN_LOCK_SCREEN_NOTIFICATION); + for (Message message : messages) { + senders.add(getMessageSender(context, account, message)); + if (senders.size() == NUM_SENDERS_IN_LOCK_SCREEN_NOTIFICATION) { + break; + } + } + publicNotification.setContentText(TextUtils.join(", ", senders)); + } + + builder.setPublicVersion(publicNotification.build()); + break; + case EVERYTHING: + builder.setVisibility(NotificationCompat.VISIBILITY_PUBLIC); + break; + case MESSAGE_COUNT: + default: + publicNotification.setContentText(accountDescription); + + builder.setPublicVersion(publicNotification.build()); + break; + } + } + /** Cancel a notification of new email messages */ public void notifyAccountCancel(Context context, Account account) { NotificationManager notifMgr = diff --git a/src/com/fsck/k9/preferences/GlobalSettings.java b/src/com/fsck/k9/preferences/GlobalSettings.java index 38d134a8f..88e0e2a3f 100644 --- a/src/com/fsck/k9/preferences/GlobalSettings.java +++ b/src/com/fsck/k9/preferences/GlobalSettings.java @@ -23,6 +23,8 @@ import com.fsck.k9.R; import com.fsck.k9.Account.SortType; import com.fsck.k9.preferences.Settings.*; +import static com.fsck.k9.K9.LockScreenNotificationVisibility; + public class GlobalSettings { public static final Map> SETTINGS; public static final Map UPGRADERS; @@ -249,6 +251,9 @@ public class GlobalSettings { s.put("hideTimeZone", Settings.versions( new V(32, new BooleanSetting(false)) )); + s.put("lockScreenNotificationVisibility", Settings.versions( + new V(37, new EnumSetting<>(LockScreenNotificationVisibility.class, LockScreenNotificationVisibility.MESSAGE_COUNT)) + )); SETTINGS = Collections.unmodifiableMap(s); diff --git a/src/com/fsck/k9/preferences/Settings.java b/src/com/fsck/k9/preferences/Settings.java index f915141cc..0b814091b 100644 --- a/src/com/fsck/k9/preferences/Settings.java +++ b/src/com/fsck/k9/preferences/Settings.java @@ -35,7 +35,7 @@ public class Settings { * * @see SettingsExporter */ - public static final int VERSION = 36; + public static final int VERSION = 37; public static Map validate(int version, Map> settings, From 105948d78c3d6ab44518dd44d713db288ab24c2f Mon Sep 17 00:00:00 2001 From: Andrew Chen Date: Thu, 4 Dec 2014 19:14:22 -0800 Subject: [PATCH 33/39] Oops, checking wrong platform capability. --- src/com/fsck/k9/controller/MessagingController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/fsck/k9/controller/MessagingController.java b/src/com/fsck/k9/controller/MessagingController.java index 9ece56ee5..7f889650b 100644 --- a/src/com/fsck/k9/controller/MessagingController.java +++ b/src/com/fsck/k9/controller/MessagingController.java @@ -4892,7 +4892,7 @@ public class MessagingController implements Runnable { builder.setStyle(style); builder.addAction( - platformSupportsExtendedNotifications() + platformSupportsLockScreenNotifications() ? R.drawable.ic_action_single_message_options_dark_vector : R.drawable.ic_action_single_message_options_dark, context.getString(R.string.notification_action_reply), From 7177afa4d2526b12eb43a022f1c2d88ac7579131 Mon Sep 17 00:00:00 2001 From: cketti Date: Fri, 5 Dec 2014 23:04:51 +0100 Subject: [PATCH 34/39] Update Gradle Android Plugin to 1.0.0-rc4 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 25176a138..f9e4e3682 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:1.0.0-rc1' + classpath 'com.android.tools.build:gradle:1.0.0-rc4' classpath 'com.jakewharton.sdkmanager:gradle-plugin:0.12.0' } } From 410edd7107998a8f31680a5850fe41a6f6a6bb16 Mon Sep 17 00:00:00 2001 From: cketti Date: Sat, 6 Dec 2014 00:42:46 +0100 Subject: [PATCH 35/39] Change wording of setting option --- res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 9a8f8c61a..53c2699e4 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -347,7 +347,7 @@ Please submit bug reports, contribute new features and ask questions at Application name Unread message count Message count and senders - Same as unlocked notification + Same as when screen unlocked Quiet Time Disable ringing, buzzing and flashing at night From 3b2d625a0979f7ce7786230b41a67b30a89dbbd6 Mon Sep 17 00:00:00 2001 From: cketti Date: Sat, 6 Dec 2014 01:03:03 +0100 Subject: [PATCH 36/39] Pull updated translations from Transifex --- res/values-ca/strings.xml | 3 - res/values-cs/strings.xml | 277 ++++++----- res/values-da/strings.xml | 3 - res/values-de/strings.xml | 93 ++-- res/values-el/strings.xml | 3 - res/values-es/strings.xml | 35 +- res/values-et/strings.xml | 3 - res/values-eu/strings.xml | 23 +- res/values-fi/strings.xml | 11 +- res/values-fr/strings.xml | 7 + res/values-gl-rES/strings.xml | 3 - res/values-hr/strings.xml | 914 ++++++++++++++++++++++++++++++++++ res/values-hu/strings.xml | 61 ++- res/values-it/strings.xml | 5 + res/values-ja/strings.xml | 27 +- res/values-ko/strings.xml | 3 - res/values-lt/strings.xml | 3 - res/values-lv/strings.xml | 14 +- res/values-nb/strings.xml | 198 ++++++-- res/values-nl/strings.xml | 43 +- res/values-pl/strings.xml | 9 +- res/values-pt-rBR/strings.xml | 9 +- res/values-ru/strings.xml | 24 +- res/values-sk/strings.xml | 3 - res/values-sv/strings.xml | 3 - res/values-tr/strings.xml | 35 +- res/values-uk/strings.xml | 7 +- res/values-zh-rCN/strings.xml | 33 +- res/values-zh-rTW/strings.xml | 3 - 29 files changed, 1567 insertions(+), 288 deletions(-) create mode 100644 res/values-hr/strings.xml diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index 4dadb926c..37218b5b4 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -158,9 +158,6 @@ Si us plau, envia\'ns els errors, contribueix a millorar-lo a S\'està netejant el compte \"%s\" S\'està creant un compte \"%s\" Nou correu - - %d missatges nous - %d no llegit(s) (%s) i %d més a %s Respon diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index fc5eccac5..63fa93391 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -38,14 +38,14 @@ Vylepšené funkce K-9 zahrnují:
  • …a další
  • -Všimněte si prosím, že K-9 nepodporuje většinu zdarma účtů Hotmail a jako mnoho poštovních klientů vykazuje zvláštnosti při komunikaci s Microsoft Exchange. +Všimněte si prosím, že K-9 nepodporuje většinu bezplatných účtů Hotmail a jako mnoho poštovních klientů vykazuje zvláštnosti při komunikaci s Microsoft Exchange.

    Posílejte prosím chybová hlášení, přispívejte novými funkcemi a ptejte se na http://k9mail.googlecode.com/.

    ]]> - -- \nOdesláno z mého telefonu s Androidem pomocí pošty K-9 Mail. Omluvte prosím moji stručnost. + -- \nOdesláno aplikací K-9 Mail ze systému Android. Omluvte prosím moji stručnost. Účet \"%s\" bude odstraněn z K-9 Mail. Všechna místní data účtu \"%s\" budou z K-9 Mail odstraněna, ale nastavení účtu bude zachováno. @@ -57,13 +57,13 @@ Posílejte prosím chybová hlášení, přispívejte novými funkcemi a ptejte Autoři: %s Informace o revizi: %s Používáme tyto knihovny třetích stran: %s - Emoji icony: %s + Emoji ikony: %s Číst přílohy zpráv Povolit této aplikaci číst přílohy vašich zpráv. Číst zprávy Povolit této aplikaci číst vaši poštu. Mazat zprávy - Povolit této aplikaci mazat vaše zprávy. + Povolit této aplikaci mazat e-maily. O aplikaci %s Účty Složky @@ -98,7 +98,7 @@ Posílejte prosím chybová hlášení, přispívejte novými funkcemi a ptejte Nevyžádaná Přeposlat Přesunout - Vlastnosti zprávy… + Odeslat… Přesměrovat… Hotovo Zrušit @@ -114,7 +114,7 @@ Posílejte prosím chybová hlášení, přispívejte novými funkcemi a ptejte Možnosti Nastavení účtu Nastavení složky - Globální možnosti + Všeobecné nastavení Odstranit účet Vynulovat nevyřízené akce (nebezpečné!) Označit jako přečtené @@ -150,16 +150,18 @@ Posílejte prosím chybová hlášení, přispívejte novými funkcemi a ptejte Opakujte načtení více zpráv Načti až o %d více - GiB - MiB - KiB + GB + MB + KB B Účet \"%s\" byl stlačen z %s na %s - Stlačuji účet \"%s\" + Komprimuji účet \"%s\" Čistím účet \"%s\" Obnovuji účet \"%s\" Nová zpráva + %d nová zpráva + %d nové zprávy %d nových zpráv %d Nepřečteno (%s) @@ -190,7 +192,7 @@ Posílejte prosím chybová hlášení, přispívejte novými funkcemi a ptejte Verze: %s Povolit ladící záznam Zaznamenávat rozšířené diagnostické informace - Záznam citlivých informací + Záznamenávat citlivé informace V záznamech mohou být zobrazena hesla Načti více zpráv Komu:%s @@ -209,7 +211,7 @@ Posílejte prosím chybová hlášení, přispívejte novými funkcemi a ptejte %s napsal(a): %1$s, %2$s napsal: Musíte přidat alespoň jednoho příjemce. - Nemohla být nalezena adresa. + Adresa tohoto kontaktu nebyla nalezena. Některé přílohy nelze přeposlat, protože ještě nebyly staženy. Citovaná zpráva Přidat příjemce (Komu) @@ -233,7 +235,7 @@ Posílejte prosím chybová hlášení, přispívejte novými funkcemi a ptejte Stáhnout úplnou zprávu Stahuji… - Ne všechna záhlaví byla stažena nebo uložena. Povolte to pro příště zaškrtnutím volby \"Ukládat všechna záhlaví lokálně\" v nastavení serveru příchozí pošty účtu. + Ne všechna záhlaví byla stažena nebo uložena. Povolte to pro příště zaškrtnutím volby \"Ukládat všechna záhlaví lokálně\" v nastavení účtu serveru příchozí pošty. Všechna záhlaví byla stažena, ale nejsou dostupná žádná další k zobrazení. Načtení dalších záhlaví z databáze nebo poštovního serveru selhalo. Více od tohoto odesílatele @@ -247,14 +249,14 @@ Posílejte prosím chybová hlášení, přispívejte novými funkcemi a ptejte Zobraz jméno odesílatele Zobraz jméno odesílatele raději než adresu Odesílatel nad předmětem - Zobraz odesílatele nad řádkem předmětu radějí než pod ním + Zobraz odesílatele nad řádkem předmětu spíše než pod ním Zobrazit jména kontaktů Použít jména příjemců ze Seznamu kontaktů, je-li to možné Obarvit kontakty - Neobarvovat jména ve vašem seznamu kontaktů - Obarvit jména ve vašem seznamu kontaktů + Neobarvovat jména v seznamu kontaktů + Obarvit jména v seznamu kontaktů Zalomit dlouhé názvy složek - Použít více řádků pro názvy složek + Použít více řádků pro dlouhé názvy složek Písma s pevnou šířkou Použít písmo s pevnou šířkou při zobrazování textových zpráv Automatické přizpůsobení zpráv @@ -266,11 +268,11 @@ Posílejte prosím chybová hlášení, přispívejte novými funkcemi a ptejte Potvrzování akcí Zobrazit dialog, když provádíte zvolené akce Smazat - Smaž zprávy s hvězdickou (message view only) + Smaž zprávy s hvězdičkou (v zobrazení zpráv) Nevyžádaná Smazat (z oznámení) - Odstraň K-9 Agenta z hlaviček emalů - Použíj čas UTC v hlavičkách emailů + Odstraň K-9 Agenta z hlaviček emailů + Použít UTC čas v hlavičkách emailů Schovej předmet v upozorněních Nikdy Když je telefon uzamčený @@ -280,6 +282,11 @@ Posílejte prosím chybová hlášení, přispívejte novými funkcemi a ptejte Pro mazaní jedné zprávy Vždy Zobrazit tlačítko pro rychlé mazání zpráv + Oznámení na obrazovce uzamčení + Žádná oznámení na obrazovce uzamčení + Jméno aplikace + Počet nepřečtených zpráv + Počet zpráv a odesilatelů Doba klidu Zakázat v noci zvonění, vibrace a blikání Doba klidu začíná @@ -287,6 +294,7 @@ Posílejte prosím chybová hlášení, přispívejte novými funkcemi a ptejte Založit nový účet Emailová adresa Heslo + Zobrazit heslo Ruční nastavení Získávání informací o účtu\u2026 @@ -297,7 +305,7 @@ Posílejte prosím chybová hlášení, přispívejte novými funkcemi a ptejte Rušení\u2026 Téměř hotovo! Pojmenujte tento účet (volitelné): - Zadejte vaše jméno (zobrazuje se v odchozích zprávách): + Zadejte své jméno (zobrazuje se v odchozích zprávách): Typ účtu O jaký typ účtu jde? POP3 @@ -306,9 +314,11 @@ Posílejte prosím chybová hlášení, přispívejte novými funkcemi a ptejte Normální heslo Heslo přenášeno bez zabezpečení Zašifrované heslo + Klientský certifikát Nastavení serveru příchozí pošty Uživatelské jméno Heslo + Klientský certifikát Server POP3 Server IMAP Server Exchange (WebDAV) @@ -318,6 +328,7 @@ Posílejte prosím chybová hlášení, přispívejte novými funkcemi a ptejte Žádné SSL/TLS STARTTLS + \"%1$s = %2$s\" není platný s \"%3$s = %4$s\" Když smažu zprávu Nemazat ji na serveru Smazat na serveru @@ -343,7 +354,7 @@ Posílejte prosím chybová hlášení, přispívejte novými funkcemi a ptejte Název složky Nevyžádaná Zobrazit jen odebírané složky Aut. rozbalená složka - Cesta WebDAV (Exchange) + OWA cesta Volitelné Ověřovací cesta Volitelné @@ -357,9 +368,10 @@ Posílejte prosím chybová hlášení, přispívejte novými funkcemi a ptejte Uživatelské jméno Heslo Typ ověření + \"%1$s = %2$s\" není platný s \"%3$s = %4$s\" Neplatné nastavení: %s Možnosti účtu - Stlačit + Stlačit účet Vyčistit zprávy (nebezpečné!) Obnovit data (poslední možnost!) Frekvence dotazování složky @@ -412,14 +424,20 @@ Posílejte prosím chybová hlášení, přispívejte novými funkcemi a ptejte Rozšířené Nastavení účtu Výchozí účet - Odesílat poštu z tohoto účtu jako výchozí + Tento účet jako výchozí pro odesílání Oznamování nové pošty + Složky oznámení + Všechny + Jen složky 1. třídy + Složky 1. a 2. třídy + Všechny vyjma složek 2. třídy + Žádné Synchronizovat oznámení Vaše emailová adresa Oznamovat došlou poštu ve stavovém řádku - Oznamovat ve stavovém řádku zjišťování pošty - Oznamovat mnou odeslanou poštu - Oznamovat i v případě odeslání pošty s identitou účtu + Oznamovat zjišťování pošty ve stavovém řádku + Zahrnout odchozí poštu + Zobrazovat oznámení pro vlastní odeslanou poštu Oznámení otevírá nepřečtené zprávy Vyhledává nepřečtené zprávy, je-li otevřeno oznámení Označit jako přečtenou po otevření @@ -430,21 +448,21 @@ Posílejte prosím chybová hlášení, přispívejte novými funkcemi a ptejte Od kohokoli Odesílání zpráv Citovat původní zprávu když odpovídám - Když odpovídám na zprávu, původní zpráva je zahrnuta. + Zahrnout původní zprávu v odpovědi. Odpovědět za citovaným textem - Při odpovídání na zprávu se původní zpráva objeví nad vaší odpovědí. - Odstranit podpis z citované odpovšdi - Při odpovídání na zprávu, podpisy v citovaném texty budou odebrány + Původní zprávu zobrazit nad textem odpovědi. + Odstranit podpis z citované odpovědi + Budou odstraněny podpisy z citovaných zpráv Formát zprávy - Prostý text (obrázky a formátování bude odstraněno) - HTML (obrázky a formátování bude zachováno ) - Automaticky (prostý text dokud neodpovídáte na zprávu v HTML formátu) + Prostý text (odstraní obrázky a formátování) + HTML (zachová obrázky a formátování) + Automaticky Vždy zobrazit kopie/skrytá Potvrzení o přečtení Vždy požadovat potvrzení o přečtení Styl citace odpovědi - Prefix (jako Gmail, Pine) - Záhlaví (jako Outlook, Yahoo!, Hotmail) + Prefix (jako Gmail) + Záhlaví (jako Outlook) Hlavní nastavení Čtení zprávy Stahování pošty @@ -452,31 +470,32 @@ Posílejte prosím chybová hlášení, přispívejte novými funkcemi a ptejte Předpona citovaného textu Šifrování Poskytovatel OpenPGP + Není nainstalováno OpenPGP Frekvence dotazování složky Úložiště Barva účtu Vyberte barvu účtu používanou v seznamech složek a zpráv Barva oznamovací LED - Vyberte barvu, kterou má telefon blikat pro tento účet - Počet zobrazených zpráv + Barva, kterou má telefon blikat pro tento účet + Velikost místního adresáře Stahovat zprávy až do - 1 KiB - 2 KiB - 4 KiB - 8 KiB - 16 KiB - 32 KiB - 64 KiB - 128 KiB - 256 KiB - 512 KiB - 1 MiB - 2 MiB - 5 MiB - 10 MiB + 1 Kb + 2 Kb + 4 Kb + 8 Kb + 16 Kb + 32 Kb + 64 Kb + 128 Kb + 256 Kb + 512 Kb + 1 Mb + 2 Mb + 5 Mb + 10 Mb jakékoli velikosti (bez omezení) Synchronizovat odeslané zprávy - bez ohledu na datum + kdykoliv (bez omezení) dnešní za poslední 2 dny za poslední 3 dny @@ -529,6 +548,11 @@ Posílejte prosím chybová hlášení, přispívejte novými funkcemi a ptejte 1. třída 2. třída Stejná jako třída synchronizace + Třída synchronizace složky + Žádné + 1. třída + 2. třída + Stejná jako třída PUSH Server příchozí pošty Konfigurace serveru příchozí pošty Server odchozí pošty @@ -538,15 +562,15 @@ Posílejte prosím chybová hlášení, přispívejte novými funkcemi a ptejte Oznámení Vibrovat Vibrovat při příchodu zpráv - Vibrační vzorky + Vzory vibrování výchozí vzorek 1 vzorek 2 vzorek 3 vzorek 4 vzorek 5 - Opakovat vibraci - Nový vyzváněcí tón pošty + Opakovat vibrace + Zvuk při nové poště Blikání LED Blikat LED, když přijde pošta Možnosti tvorby nových zpráv @@ -576,15 +600,15 @@ Posílejte prosím chybová hlášení, přispívejte novými funkcemi a ptejte (Volitelné) Používat podpis Podpis - Prvotní identita - Vyberte identitu + Výchozí identita + Vybrat identitu Odeslat jako - Nemůžete odebrat vaši jedinou zbývající identitu - Nemůžete použít identitu bez emailové adresy + Nelze odebrat jedinou zbývající identitu + Nelze použít identitu bez emailové adresy Nejstarší zprávy první Nejnovější zprávy první - Předmět abecedně A->Z - Předmět abecedně Z->A + Předmět abecedně A-Z + Předmět abecedně Z-A Odesílatel A-Z Odesílatel Z-A S \u2605 první @@ -607,21 +631,21 @@ Posílejte prosím chybová hlášení, přispívejte novými funkcemi a ptejte Pokud chcete používat IMAP nebo POP3 s tímto poskytovatelem, měli byste povolit použití POP3 na stránce Nastavení pošty Au one. Pokud chcete používat IMAP nebo POP3 s tímto poskytovatelem, měli byste povolit použití POP3 na stránce Nastavení pošty Naver. Pokud chcete používat IMAP nebo POP3 s tímto poskytovatelem, měli byste povolit použití POP3 na stránce Nastavení pošty Hanmail(Daum). - Neznámý certifikát + Certifikát nebyl rozeznán Přijmout klíč Odmítnout klíč - Del (or D) - Smazat\nR - Odpovědět\nA - Odpovědět všem\nC - Vytvořit\nF - Předat\nM - Přesunout\nV - Archivovat\nY - Kopirovat\nZ - Označit (Ne)přečtené\nG - Hvězdička\nO - Uspořádat podle typu\nI - Uspořádat podle pořadí\nQ - Zpět k složkám\nS - Označit/odznačit\nJ or P - Předešlá zpráva\nK or N - Další zpráva - 1 - Zobrazit jen složky 1. třídy\n2 - Zobrazit složky 1. a 2. třídy\n3 - Zobrazit všechny vyjma složek 2. třídy\n4 - Zobrazit všechny složky\nQ - Návrat k účtům\nS - Upravit nastavení účtu + Del (or D) - Smazat\nR - Odpovědět\nA - Odpovědět všem\nC - Vytvořit\nF - Přeposlat\nM - Přesunout\nV - Archivovat\nY - Kopírovat\nZ - Označit (Ne)přečtené\nG - Hvězdička\nO - Uspořádat podle typu\nI - Uspořádat podle pořadí\nQ - Zpět k složkám\nS - Označit/odznačit\nJ or P - Předešlá zpráva\nK or N - Další zpráva + 1 - Zobrazit jen složky 1. třídy\n2 - Zobrazit složky 1. a 2. třídy\n3 - Zobrazit všechny mimo složek 2. třídy\n4 - Zobrazit všechny složky\nQ - Návrat k účtům\nS - Upravit nastavení účtu název složky obsahuje - Složky - Zobrazit všechny složky - Zobrazit jen složky 1. třídy - Zobrazit složky 1. a 2. třídy - Zobrazit všechny vyjma složek 2. třídy + Zobrazit složky… + Všechny složky + Složky 1. třídy + Složky 1. & 2. třídy + Skrýt složky 2. třídy Umístění podpisu - Před citovanými zprávami - Za citovanými zprávami - Použíj téma aplikace + Před citovanými textem + Za citovanými textem + Použít vzhled aplikace Tmavé Světlé Zobrazení @@ -634,13 +658,13 @@ Posílejte prosím chybová hlášení, přispívejte novými funkcemi a ptejte Seznam zpráv Zprávy Seznam složek - Téma - Téma náhledu zprávy - Téma psaní zprávy + Vzhled + Vzhled náhledu zprávy + Vzhled psaní zprávy Jazyk - Neměnné téma zpráv - Lze vybrat téma při prohlížení zprávy - Použíj neměnné téma při prohlížení zprávy + Neměnný vzhled zpráv + Lze vybrat vzhled při prohlížení zprávy + Použít neměnný vzhled při prohlížení zprávy Systémový výchozí Synchronizace na pozadí Nikdy @@ -662,13 +686,13 @@ Posílejte prosím chybová hlášení, přispívejte novými funkcemi a ptejte Navigace tlačítky hlasitosti Zobrazení zpráv Různá zobrazení seznamů - Začít v Integrovaná doručené poště + Začít v Integrované doručené poště Zobrazit velikost účtu Vypněte pro rychlejší zobrazování Počet výsledků hledání Vypněte pro rychlejší zobrazování - Skryj speciální učty - Skryj integrovanou doručenou složku a složku všech zpráv + Skrýt speciální účty + Skrýt integrovanou doručenou složku a složku všech zpráv %s %s - S \u2605 - Nepřečtené @@ -678,7 +702,7 @@ Posílejte prosím chybová hlášení, přispívejte novými funkcemi a ptejte Všechny zprávy v integrovaných složkách S hvězdičkou nebo nepřečtené zprávy zvolíte klepnutím na obálku nebo hvězdičku Integrovat - Nepřečtené zprávy jsou zobrazeny v Integrované doručené poště + Všechny zprávy jsou zobrazeny v Integrované doručené poště Prohledávané složky Všechny Zobrazitelné @@ -692,18 +716,18 @@ Posílejte prosím chybová hlášení, přispívejte novými funkcemi a ptejte Název složky Stav složky Seznam zpráv - Předmět zprávy - Odesílatel zprávy - Datum zprávy + Předmět + Odesílatel + Datum Náhled - Zobrazení zprávy - Odesílatel zprávy - Příjemce zprávy (Komu) - Příjemce zprávy (Kopie) + Zpráva + Odesílatel + Příjemce (Komu) + Příjemce (Kopie) Další záhlaví - Předmět zprávy - Datum a čas zprávy - Tělo zprávy + Předmět + Datum a čas + Tělo %d%% %1$s: %2$s Psaní zprávy @@ -722,11 +746,11 @@ Posílejte prosím chybová hlášení, přispívejte novými funkcemi a ptejte Šifrovat <neznámý> Formát zpráv PGP/MIME ještě není podporován. - Upozornění: přílohy ještě NELZE podepsat nebo šifrovat. + Varování: přílohy ještě NEJSOU podepsány nebo zašifrovány. Odeslání přerušeno. Uložit koncept zprávy? Uložit nebo zahodit tuto zprávu? - Odstranit zprávu? + Zahodit zprávu? Opravdu si přejete smazat tuto zprávu? Odmítnout uložení konceptu zprávy. Odmítnout uložení konceptu šifrované zprávy. @@ -749,7 +773,7 @@ Posílejte prosím chybová hlášení, přispívejte novými funkcemi a ptejte Ano Ne Stahuji přílohy - Ladící záznam do záznamového systému Androidu je povolen + Ladící záznam povolen » Nelze se připojit. @@ -765,19 +789,19 @@ Posílejte prosím chybová hlášení, přispívejte novými funkcemi a ptejte Importování nastavení… Skenuji soubor… Export nastavení uložen do %s - Importovano globální nastaveni z %s + Importováno globální nastaveni z %s Importováno %s z %s 1 účet %s účty %s účtů - Nepodařilo se exportovat nastavení + Export nastavení selhal Nepodařilo se importovat jakékoli nastavení z %s - Export byl uspěšný - Export se nazdařil - Import byl uspěšný - Import se nazdařil + Export úspěšný + Export selhal + Import úspěšný + Import selhal Aktivovat účet Pro používání účtu \"%s\" potřebujete zadat %s. @@ -792,20 +816,20 @@ Posílejte prosím chybová hlášení, přispívejte novými funkcemi a ptejte Nastavuji hesla… Nastavuji hesla… - Heslo pro příchozi server + Použít heslo pro příchozí server Aktivovat Účet \"%s\" je nedostupný; zkontrolujte úložiště Ukládat přílohy do… Uložit přílohu - Nenalezen žádný prohlížeč souborů. Kde byste chtěli uložit tuto přílohu? + Nebyl nalezen prohlížeč souborů. Kam chcete uložit tuto přílohu? Posunout nahoru Posunout dolů - Přesování účtu… + Přesouvání účtu… Zobrazit počet nepřečtených pro… Chybějící Správce souborů Zavřít Žádný text - Otevřít pro prohlížení + Otevřít odkaz Sdílet odkaz Zkopírovat odkaz do schránky Odkaz @@ -818,10 +842,10 @@ Posílejte prosím chybová hlášení, přispívejte novými funkcemi a ptejte Volat číslo Uložit do kontaktů Zkopírovat číslo do schránky - Telefoní číslo + Telefonní číslo Odeslat zprávu Uložit do kontaktů - Zkopírovat e-mailovou aderesu do schránky + Zkopírovat e-mailovou adresu do schránky E-mailová adresa Obrázek uložen jako \"%s\" Uložení obrázku se nezdařilo. @@ -838,56 +862,63 @@ Posílejte prosím chybová hlášení, přispívejte novými funkcemi a ptejte Zahrnout tělo zprávy do prohledávání serveru Prohledávání těl zpráv může být pomalé. Odeslání dotazu na server - Načátaní %d výsledků - Načítaní %1$d z %2$d výsledků + Načítání %d výsledků + Načítání %1$d z %2$d výsledků Vzdálené vyhledávání se nezdařilo Hledání Povolit vyhledávání na serveru Hledat zprávy na serveru navíc k těm v zařízení Hledat zprávy na serveru - Drž k prohledávání serveru… + Posuň k prohledání serveru… Uvolni k prohledávání serveru… - Vzdálené vyhledávání není k dipsozici bez připojení k síti. - Použít pozadí jako ukazatel (ne)přečtený - Zobrazit přečtené a nepřečtené zprávy s rozdílnou barvou pozadí - Zabrazení vláken + Vzdálené vyhledávání není k dispozici bez připojení k síti. + Ztmavit zprávy po přečtení + Přečtené zprávy budou mít šedé pozadí + Zobrazit vlákna Sjednotit zprávy patřící ke stejnému vláknu Aktualizace databází Aktualizuji databáze… - Aktualizuji databázi pro učet \"%s\" + Aktualizuji databázi pro účet \"%s\" Nahrávám… Zobraz rozdělení obrazovky Vždy Nikdy - Pouze na ležato - Prosím zvolte zprávu v levo + Pouze naležato + Prosím zvolte zprávu vlevo Zobraz obrázky u kontaktů Zobraz obrázky u kontaktů v seznamu zpráv Poslední obnova %s Poslední obnova %s (Push) v %s Označ vše jako přečtené - Zabarvit chybějcí obrázky kontaktů - Zabarví chybějcí obrázky u kontaktů + Obarvit obrázky kontaktů + Obarví chybějící obrázky u kontaktů Zobrazení funkcí zpráv Zobrazí vybrané funkce v dolním menu u zpráv Nahrávám přílohu… Odesílám zprávu Ukládám koncept Stahuji přílohu… + Nelze ověřit. Server neuvádí možnost SASL EXTERNAL. To by mohlo být kvůli problému s klientským certifikátem (vypršel, neznámá certifikační autorita), nebo nějaký jiný problém konfigurace. - Dešifrování / Ověřování… + Dešifrování/Ověřování… Úspěšné dešifrování Platný podpis (certifikován) - Platný podpis ale bez cerifikátu + Platný podpis ale bez certifikátu Neznámý signatář Neplatný podpis Chybí veřejný klíč k tomuto podpisu Úspěšné dešifrování a platný podpis (certifikován) - Úspěšné dešifrování a platný podpis ale bez cerifikátu + Úspěšné dešifrování a platný podpis ale bez certifikátu Úspěšné dešifrování, ale chybí veřejný klíč Vyhledávám chybějící klíč Chyba OpenPGP: Id uživatele + Použít klientský certifikát + Žádný klientský certifikát + Odstranit výběr klientského certifikátu + Chyba při získání klientského certifikátu pro alias \"%s\" + Pokročilé možnosti + Klientský certifikát \"%1$s\" vypršel nebo ještě není platný (%2$s) diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index 03427f897..adef4cb3a 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -155,9 +155,6 @@ Vær venlig at sende fejlrapporter, anmodning om nye funktioner, og spørgsmål Renser konto \"%s\" Genskaber konto \"%s\" Ny mail - - %d nye meddelelser - %d ulæst(e) (%s) + %d yderligere på %s Svar diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 47edaf961..a9e38946d 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -13,7 +13,7 @@ Google, das K-9-Team und viele Weitere. \u00a9 2008-%s The K-9 Dog Walkers. Teile \u00a9 2006-%s Android Open Source Project. - Lizenziert unter der Apache License, Version 2.0. + Lizenziert unter der Apache-Lizenz, Version 2.0. Willkommen bei K-9 Mail ]]> - -- \nDiese Nachricht wurde von meinem Android-Mobiltelefon mit K-9 Mail gesendet. + -- \nDiese Nachricht wurde von meinem Android-Gerät mit K-9 Mail gesendet. - Das Konto \"%s\" wird gelöscht. - Alle Daten des Kontos \"%s\" werden von K-9 Mail entfernt. Kontoeinstellungen werden beibehalten. - Alle Nachrichten des Kontos \"%s\" werden von K-9 Mail entfernt. Kontoeinstellungen werden beibehalten. + Das Konto \"%s\" wird aus K-9 Mail entfernt. + Alle lokalen Daten des Kontos \"%s\" werden entfernt. Kontoeinstellungen werden beibehalten. + Lokale Kopien von Nachrichten in \"%s\" werden entfernt. Kontoeinstellungen werden beibehalten. Es wurde keine geeignete Anwendung gefunden, um den Import durchzuführen. Bitte installieren Sie einen Dateimanager aus dem Play Store. Play Store öffnen @@ -58,12 +58,12 @@ Um Fehler zu melden, neue Funktionen vorzuschlagen oder Fragen zu stellen, besuc Versionsinformationen: %s Wir verwenden die folgenden externen Bibliotheken: %s Emoji-Bilder: %s - Anhänge der Nachricht lesen - Der Anwendung erlauben, die Anhänge Ihrer Nachrichten zu lesen. - Nachrichten lesen - Der Anwendung erlauben, Ihre Nachrichten zu lesen. - Nachrichten löschen - Der Anwendung erlauben, Ihre Nachrichten zu löschen. + E-Mail-Anhänge lesen + Der Anwendung erlauben, Ihre E-Mail-Anhänge zu lesen. + E-Mails lesen + Der Anwendung erlauben, Ihre E-Mails zu lesen. + E-Mails löschen + Der Anwendung erlauben, Ihre E-Mails zu löschen. Über %s Konten Ordner @@ -73,14 +73,14 @@ Um Fehler zu melden, neue Funktionen vorzuschlagen oder Fragen zu stellen, besuc Antworten Allen antworten Weiterleiten - Ordner wählen + Ordner auswählen Lade %s:%s%s Lade Kopfzeilen in %s:%s%s Sende %s%s Verarbeite %s:%s%s \u0020%s/%s Nächster Abruf %s - Synchronisation abgeschaltet + Synchronisation deaktiviert %d ausgewählt Weiter Zurück @@ -98,13 +98,13 @@ Um Fehler zu melden, neue Funktionen vorzuschlagen oder Fragen zu stellen, besuc Spam Weiterleiten Verschieben - Aktionen… + Senden… Umsortieren… Fertig Verwerfen - Speichern - Nachrichten abrufen - Nachricht senden + Als Entwurf speichern + E-Mail abrufen + Nachrichten senden Ordnerliste aktualisieren Ordner suchen Konto hinzufügen @@ -116,7 +116,7 @@ Um Fehler zu melden, neue Funktionen vorzuschlagen oder Fragen zu stellen, besuc Ordnereinstellungen Globale Einstellungen Konto entfernen - Ausstehende Aktionen abbrechen (Vorsicht!) + Ausstehende Aktionen löschen (Achtung!) Als gelesen markieren Teilen Anwendung auswählen @@ -126,8 +126,8 @@ Um Fehler zu melden, neue Funktionen vorzuschlagen oder Fragen zu stellen, besuc Text auswählen Kopfzeilen anzeigen Kopfzeilen verbergen - Dunkles Design verwenden - Helles Design verwenden + Dunkles Theme verwenden + Helles Theme verwenden Als ungelesen markieren CC/BCC hinzufügen Empfangsbestätigung @@ -135,9 +135,9 @@ Um Fehler zu melden, neue Funktionen vorzuschlagen oder Fragen zu stellen, besuc Es wird keine Empfangsbestätigung angefordert Anhang hinzufügen Papierkorb leeren - Bereinigen (Expunge) + Bereinigen Lokale Nachrichten löschen - Info + Über Einstellungen Kontooptionen @@ -146,8 +146,8 @@ Um Fehler zu melden, neue Funktionen vorzuschlagen oder Fragen zu stellen, besuc Lade Nachrichten werden geladen\u2026 Verbindungsfehler - Nachricht konnte nicht gefunden werden - Ladevorgang erneut starten + Nachricht nicht gefunden + Laden weiterer Nachrichten erneut starten Bis zu %d weitere abrufen GB MB @@ -156,9 +156,10 @@ Um Fehler zu melden, neue Funktionen vorzuschlagen oder Fragen zu stellen, besuc Konto \'%s\' von %s auf %s komprimiert Konto \'%s\' wird komprimiert Konto \'%s\' wird bereinigt - Konto \"%s\' wird wieder hergestellt - Neue Nachricht + Konto \"%s\' wird wiederhergestellt + Neue E-Mail + %d neue Nachricht %d neue Nachrichten %d Ungelesen (%s) @@ -167,11 +168,11 @@ Um Fehler zu melden, neue Funktionen vorzuschlagen oder Fragen zu stellen, besuc Gelesen Löschen Zertifikatsproblem (%s) - Servereinstellungen überprüfen - Neue Nachrichten in %s:%s werden abgerufen - Neue Nachrichten werden abgerufen - Nachricht in %s wird gesendet - Nachricht wird gesendet + Überprüfen Sie Ihre Servereinstellungen + Neue E-Mails in %s:%s werden abgerufen + E-Mails werden abgerufen + E-Mail in %s wird gesendet + E-Mail wird gesendet : Posteingang Postausgang @@ -187,11 +188,11 @@ Um Fehler zu melden, neue Funktionen vorzuschlagen oder Fragen zu stellen, besuc %s (Spam) Nachrichten konnten nicht gesendet werden Version: %s - Debug-Aufzeichnungen - Detaillierte Diagnose-Informationen aufzeichnen - Vertrauliche Daten aufzeichnen - Anmeldepasswörter bei Verbindungsaufbau aufzeichnen - Weitere Nachrichten abrufen + Debugprotokollierung aktivieren + Zusätzliche Diagnose-Informationen protokollieren + Vertrauliche Informationen protokollieren + Anmeldepasswörter bei Verbindungsaufbau protokollieren. + Weitere Nachrichten laden An:%s An CC @@ -207,11 +208,11 @@ Um Fehler zu melden, neue Funktionen vorzuschlagen oder Fragen zu stellen, besuc CC: %s schrieb: Am %1$s, schrieb %2$s: - Sie müssen mindestens einen Empfänger wählen. + Sie müssen mindestens einen Empfänger auswählen. Es wurde keine E-Mail-Adresse für diesen Kontakt gefunden. Einige Anhänge können nicht weitergeleitet werden, da diese nicht heruntergeladen wurden. Ursprüngliche Nachricht zitieren - Empfänger hinzufügen + Empfänger hinzufügen (An) Empfänger hinzufügen (CC) Empfänger hinzufügen (BCC) Zitierten Text entfernen @@ -227,7 +228,7 @@ Um Fehler zu melden, neue Funktionen vorzuschlagen oder Fragen zu stellen, besuc Nachricht anzeigen Anhänge anzeigen Mehr… - Anhang wird geladen + Anhang wird abgerufen. Es wurde kein Anzeigeprogramm für %s gefunden. Gesamte Nachricht herunterladen Nachricht wird heruntergeladen… @@ -279,6 +280,12 @@ Um Fehler zu melden, neue Funktionen vorzuschlagen oder Fragen zu stellen, besuc Für einzelne Nachricht Immer Der Benachrichtigung eine Schaltfläche zum Löschen der Nachrichten hinzufügen + Sperrbildschirm-Benachrichtigungen + Keine Sperrbildschirm-Benachrichtigungen + Anwendungsname + Anzahl der ungelesenen Nachrichten + Nachrichtenanzahl und Absender + Gleiche wie bei entsperrtem Bildschirm Ruhezeit Klingeln, Vibrieren und Leuchten in der Nacht deaktivieren Ruhezeit startet @@ -409,6 +416,7 @@ Um Fehler zu melden, neue Funktionen vorzuschlagen oder Fragen zu stellen, besuc Nachrichten, die nicht mit dem Server synchronisiert wurden, können nicht kopiert oder verschoben werden. Einrichtung konnte nicht abgeschlossen werden Benutzername oder Passwort ist falsch.\n(%s) + Der Server verwendet ein ungültiges SSL-Zertifikat. Dies könnte daran liegen das der Server falsch konfiguriert ist. Allerdings könnte es auch daran liegen das jemand versucht Sie oder ihren E-Mail Server anzugreifen. Falls Sie sich nicht sicher sind was der Grund ist klicken Sie abbrechen und kontaktieren Sie die Administratoren des E-Mail Servers. \n\n(%s) Kann nicht mit dem Server verbinden.\n(%s) Details bearbeiten Weiter @@ -460,12 +468,13 @@ Um Fehler zu melden, neue Funktionen vorzuschlagen oder Fragen zu stellen, besuc Ordner Zitat-Präfix Kryptographie - OpenPGP-Provider + OpenPGP-Anbieter + Kein OpenPGP-Anbieter installiert Häufigkeit der E-Mail-Abfrage Speicher Kontofarbe Farbe, in der das Konto in der Konten- und Ordnerliste dargestellt wird - LED-Farbe + Farbe der Benachrichtigungs-LED Farbe, die für die Benachrichtigungs-LED bei Benachrichtigungen für dieses Konto verwendet wird Anzahl anzuzeigender Nachrichten Nachrichten automatisch laden bis @@ -884,6 +893,7 @@ Um Fehler zu melden, neue Funktionen vorzuschlagen oder Fragen zu stellen, besuc Nachricht senden Entwurf speichern Anhang wird heruntergeladen… + Authentifizierung fehlgeschlagen. Der Server bietet nicht Simple Authentication and Security Layer, kurz SASL, an. Dies könnte durch ein Problem des Client Zertifikats (Zertifikat abgelaufen, unbekannte Zertifizierungsstelle) oder ein Konfigurationsproblem ausgelöst werden. Entschlüssle/Verifiziere… Erfolgreiche Entschlüsselung @@ -902,6 +912,7 @@ Um Fehler zu melden, neue Funktionen vorzuschlagen oder Fragen zu stellen, besuc Client-Zertifikat verwenden Kein Client-Zertifikat Client-Zertifikatsauswahl entfernen + Das Abrufen des Client-Zertifikats für den Pfad \"%s\" ist fehlgeschlagen Erweiterte Optionen Client-Zertifikat \"%1$s\" ist abgelaufen oder noch nicht gültig (%2$s) diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index 48030480f..6080fbe99 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -157,9 +157,6 @@ Καθαρισμός λογαριασμού \'%s\' Ανακατασκευή λογαριασμού \'%s\' Νέο μήνυμα - - %d νέα μηνύματα - %d μη αναγνωσμένα (%s) + %d περισσότερα στον %s Απάντηση diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 7fc0b4a64..08eef109b 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -45,6 +45,7 @@ Por favor, envía los errores detectados, contribuye con nuevas funcionalidades

    ]]>
    + -- \nEnviado desde mi dispositivo Android con K-9 Mail. Por favor disculpa mi brevedad. La cuenta \"%s\" será eliminada de K-9 Mail. Los datos de \"%s\" serán eliminados de K-9 Mail, pero se mantendrá su configuración. @@ -157,9 +158,6 @@ Por favor, envía los errores detectados, contribuye con nuevas funcionalidades Limpiando cuenta \"%s\" Recreando cuenta \"%s\" Correo nuevo - - %d mensajes nuevos - %d Sin Leer (%s) + %d más en %s Responder @@ -263,9 +261,12 @@ Por favor, envía los errores detectados, contribuye con nuevas funcionalidades Mostrar de manera predeterminada el siguiente mensaje después de borrar Confirmar acciones Mostrar un diálogo cuando se realice una de estas acciones + Borrar Borrar destacados (sólo en vista de mensajes) Spam Borrar (de notificaciones) + Eliminar el agente de usuario K-9 de las cabeceras de correo + Usar UTC como zona horaria en las cabeceras de correo Ocultar asunto en notificaciones Nunca Cuando el dispositivo está bloqueado @@ -282,6 +283,7 @@ Por favor, envía los errores detectados, contribuye con nuevas funcionalidades Configurar nueva cuenta Dirección de correo Contraseña + Mostrar la contraseña Configuración manual Recuperando información de cuenta\u2026 @@ -301,9 +303,11 @@ Por favor, envía los errores detectados, contribuye con nuevas funcionalidades Contraseña normal Contraseña, transmitida de manera no segura Contraseña cifrada + Certificado de cliente Configuración del servidor de entrada Usuario Contraseña + Certificado de cliente Servidor POP3 Servidor IMAP Servidor WebDAV (Exchange) @@ -313,6 +317,7 @@ Por favor, envía los errores detectados, contribuye con nuevas funcionalidades Ninguna SSL/TLS STARTTLS + \"%1$s = %2$s\" no es válido con \"%3$s = %4$s\" Cuando borre un mensaje No borrar del servidor Borrar del servidor @@ -352,6 +357,7 @@ Por favor, envía los errores detectados, contribuye con nuevas funcionalidades Usuario Contraseña Tipo de autentificación + \"%1$s = %2$s\" no es válido con \"%3$s = %4$s\" Configuración inválida: %s Opciones de cuenta Compactar @@ -399,6 +405,9 @@ Por favor, envía los errores detectados, contribuye con nuevas funcionalidades Todos los mensajes No se puede copiar/mover un mensaje no sincronizado con el servidor No se ha podido finalizar la Configuración + Usuario o contraseña incorrectos.\n(%s) + El servidor presentó un certificado SSL no válido. Algunas veces, esto es debido a un problema de configuración en el servidor. Otras veces es porque alguien está intentando atacarte o atacar tu servidor de correo. Si no estás seguro de qué ocurre, pulsa en Rechazar y contacta con quien gestiona tu servidor de correo.\n\n(%s) + No se pudo conectar con el servidor.\n(%s) Editar detalles Continuar Avanzado @@ -406,6 +415,12 @@ Por favor, envía los errores detectados, contribuye con nuevas funcionalidades Cuenta predeterminada Enviar mensajes desde esta cuenta de manera predeterminada Notificar mensajes nuevos + Carpetas de notificaciones + Todas + Sólo carpetas de 1ª clase + Carpetas de 1ª y 2ª clase + Todas excepto las carpetas de 2ª clase + Ninguna Notificar sincronización Su Dirección de correo Avisar cuando llegue correo nuevo @@ -521,6 +536,11 @@ Por favor, envía los errores detectados, contribuye con nuevas funcionalidades 1a Clase 2a Clase La misma que en sincronización + Clase de la carpeta de notificaciones + Ninguna + 1ª clase + 2ª clase + La misma clase que la carpeta \'push\' Servidor de entrada Configurar servidor de entrada Servidor de salida @@ -602,6 +622,8 @@ Por favor, envía los errores detectados, contribuye con nuevas funcionalidades Certificado desconocido Aceptar clave Rechazar clave + Del (or D) - Borrar\nR - Responder\nA - Responder a tdos\nC - Redactar\nF - Reenviar\nM - Mover\nV - Archivar\nY - Copiar\nZ - Marcar como (no) leído\nG - Estrella\nO - Tipo de ordenación\nI - Orden de ordenación\nQ - Volver a las carpetas\nS - Seleccionar/deseleccionar\nJ or P - Mensaje anterior\nK or N - Siguiente mensaje + 1 - Mostrar sólo carpetas de 1ª clase\n2 - Mostrar carpetas de 1ª y 2ª clase\n3 - Mostrar todo excepto las carpetas de 2ª clase\n4 - Mostrar todas las carpetas\nQ - Volver a las cuentas\nS - Editar ajustes de cuenta nombre carpeta contiene Mostrar carpetas… Ver todas las carpetas @@ -860,6 +882,7 @@ Por favor, envía los errores detectados, contribuye con nuevas funcionalidades Enviando mensaje Guardando borrador Recuperando adjunto… + No ha sido posible autenticarse. El servidor no anuncia la capacidad SASL EXTERNAL. Esto puede ser debido a un problema con el certificado de cliente (expirado, autoridad certificadora desconocida) o algún otro problema de configuración. Descifrando/Verificando… Descifrado correctamente @@ -875,4 +898,10 @@ Por favor, envía los errores detectados, contribuye con nuevas funcionalidades Error OpenPGP: Id de usuario + Usar certificado de cliente + Sin certificado de cliente + Borrar la selección de certificado de cliente + Fallo al recuperar certificado de cliente para el alias \"%s\" + Opciones avanzadas + El certificado de cliente \"%1$s\" ha expirado o aún no es válido (%2$s) diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml index db47e4b3e..1250fe863 100644 --- a/res/values-et/strings.xml +++ b/res/values-et/strings.xml @@ -159,9 +159,6 @@ Palun saada infot probleemidest, soovitavatest lisafunktsioonidest ja küsi küs Puhastab kontot \"%s\" Taasloob kontot \"%s\" Uus meilisõnum - - %d uued sõnumid - %d Lugemata (%s) + %d rohkemat %s Vasta diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml index c9194e694..ed0d68062 100644 --- a/res/values-eu/strings.xml +++ b/res/values-eu/strings.xml @@ -157,9 +157,6 @@ Arazoen berri emateko, ezaugarri berriak gehitzeko eta galderak egiteko \"%s\" kontua garbitzen \"%s\" kontua birsortzen Eposta berria - - %d mezu berri - %d irakurgabe (%s) + %d gehiago %s kontuan Erantzun @@ -262,6 +259,7 @@ Arazoen berri emateko, ezaugarri berriak gehitzeko eta galderak egiteko Mezuak ezabatzerakoan defektuz hurrengo mezua ikusi Baieztatzeko ekintzak Hautatutako ekintzak egiterakoan elkarrizketa koadroa ikusi + Ezabatu Izarduna ezabatu (mezu ikuspegian) Spam Ezabatu (Jakinarazpenetatik) @@ -281,6 +279,7 @@ Arazoen berri emateko, ezaugarri berriak gehitzeko eta galderak egiteko Kontu berria konfiguratu Eposta helbidea Pasahitza + Pasahitza erakutsi Eskuzko konfigurazioa Kontuaren informazioa eskuratzen\u2026 @@ -297,6 +296,8 @@ Arazoen berri emateko, ezaugarri berriak gehitzeko eta galderak egiteko POP3 IMAP Exchange (WebDAV) + Pasahitz zifratua + Bezero ziurtagiria Sarrerako zerbitzariaren ezarpenak Erabiltzaile izena Pasahitza @@ -307,6 +308,8 @@ Arazoen berri emateko, ezaugarri berriak gehitzeko eta galderak egiteko Segurtasuna Kautotzea Ezer + SSL/TLS + STARTTLS Mezu bat ezabatzen dudanean Ez ezabatu zerbitzarian Zerbitzarian ezabatu @@ -387,9 +390,14 @@ Arazoen berri emateko, ezaugarri berriak gehitzeko eta galderak egiteko 250 mezu 500 mezu 1000 mezu + 2500 mezu + 5000 mezu + 10000 mezu mezu guztiak Zerbitzariarekin sinkronizatuta ez dauden mezuak ezin dira kopiatu edo mugitu Konfigurazioak ezin izan du bukatu + Erabiltzaile izen edo pasahitz okerrak.\n(%s) + Ezin zerbitzarira konektatu.\n(%s) Xehetasunak editatu Jarraitu Aurreratua @@ -397,6 +405,11 @@ Arazoen berri emateko, ezaugarri berriak gehitzeko eta galderak egiteko Defektuzko kontua Eposta defektuz kontu honetatik bidali Eposta berriko jakinarazpenak + Guztiak + 1.en mailakoak bakarrik + 1.ngo eta 2. mailakoak + Guztiak 2. mailakoak ezik + Batez Sinkronizazio jakinarazpenak Zure posta helbidea Mezuak heltzean egoera barran jakinarazi @@ -512,6 +525,9 @@ Arazoen berri emateko, ezaugarri berriak gehitzeko eta galderak egiteko 1.go maila 2. maila Sinkronizatzeko klasearen berdina + Batez + 1.ng maila + 2. maila Sarrerako zerbitzaria Sarrerako zerbitzaria konfiguratu Irteera zerbitzaria @@ -851,4 +867,5 @@ Arazoen berri emateko, ezaugarri berriak gehitzeko eta galderak egiteko Eranskina eskuratzen… + Aukera aurreratuak diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index f4310709e..3c4d805c5 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -17,7 +17,7 @@ Tervetuloa K-9 Mailiin -K-9 Mail on tehokas avoimen lähdekoodin sähköpostiasiakasohjelma Android-käyttöjärjestelmälle. +K-9 Mail on tehokas avoimen lähdekoodin sähköpostiohjelma Android-käyttöjärjestelmälle.

    K-9:n parannettuja ominaisuuksia ovat mm.:

    @@ -48,7 +48,7 @@ Virheraportit, osallistuminen projektiin ja kysymykset: Mene osoitteeseen -- \nLähetetty Android-laitteestani K-9 Maililla. Pahoittelut vähäsanaisuudestani. - Tili \"%s\" poistetaan K-9 Mail -ohjelmasta. + Tili \"%s\" poistetaan K-9 Mailista. Kaikki tilin \"%s\" paikalliset tiedot poistetaan, mutta tilin asetukset säilyvät. Kaikki tilin \"%s\" paikalliset viestit poistetaan, mutta tilin asetukset säilyvät. @@ -160,6 +160,7 @@ Virheraportit, osallistuminen projektiin ja kysymykset: Mene osoitteeseen Luodaan uudelleen tiliä \"%s\" Uusi sähköpostiviesti + %d uusi viesti %d uutta viestiä %d lukematonta (%s) @@ -280,6 +281,11 @@ Virheraportit, osallistuminen projektiin ja kysymykset: Mene osoitteeseen Yksittäisen viestin ilmoituksessa Aina Näytä ilmoituksessa painike, joka mahdollistaa nopean viestin poistamisen + Lukitusruudun ilmoitukset + Ei lukitusruudun ilmoituksia + Sovelluksen nimi + Lukemattomien viestien määrä + Viestien määrä ja lähettäjät Hiljainen aika Poista käytöstä soittoäänen pirinä, pärinä ja vilkkuminen yöllä Hiljainen aika alkaa @@ -463,6 +469,7 @@ Virheraportit, osallistuminen projektiin ja kysymykset: Mene osoitteeseen Lainauksen etuliite Salausmenetelmä OpenPGP + OpenPGP-tarjoajaa ei ole asennettu Kansioiden tarkistus Tallennus Tilin väri diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index c8ed8d14e..b77ec472c 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -158,6 +158,7 @@ jusqu\'à %d de plus
    Recréation du compte «\u00A0%s\u00A0» Nouveau courriel + %d nouveau message %d nouveaux messages %d non lu(s) (%s) @@ -278,6 +279,11 @@ jusqu\'à %d de plus
    Pour la notification de message unique Toujours Afficher un bouton dans les notification permettant la suppression rapide des messages + Notifications d\'écran de verrouillage + Aucune notification d\'écran de verrouillage + Nom d\'application + Nombre de messages non lus + Nombre de messages et d\'expéditeurs Heures silencieuses Désactiver la sonnerie, la vibration et le clignotement pendant la nuit Début des heures silencieuses @@ -461,6 +467,7 @@ jusqu\'à %d de plus
    Préfixe de citation Cryptographie Fournisseur OpenPGP + Aucun fournisseur OpnPGP installé Fréquence de vérification du dossier Stockage Couleur du compte diff --git a/res/values-gl-rES/strings.xml b/res/values-gl-rES/strings.xml index 036eaaa87..41f69134e 100644 --- a/res/values-gl-rES/strings.xml +++ b/res/values-gl-rES/strings.xml @@ -156,9 +156,6 @@ Envía informes de erro, contribúe con novas funcionalidades e pregunta o que d A limpar a conta \"%s\" Volvendo crear a conta \"%s\" Correo novo - - %d mensaxes novas - %d sen ler (%s) + %d máis en %s Responder diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml new file mode 100644 index 000000000..432df995c --- /dev/null +++ b/res/values-hr/strings.xml @@ -0,0 +1,914 @@ + + + + + + K-9 Mail + K-9 Mail BETA + K-9 Računi + K-9 Nepročitano + K-9 Mail daljinski upravljač + Dozvoljava ovoj aplikaciji kontrolu K-9 aktivnosti i podešenja. + + Google, The K-9 Dog Walkers. + Copyright 2008-%s The K-9 Dog Walkers. Portions Copyright 2006-%s the Android Open Source Project. + Licencirano pod Apache License, Version 2.0. + + Dobrodošli u K-9 Mail + +K-9 Mail je moćan besplatan klijent e-pošte za Android. +

    +Poboljšane značajke uključuju: +

    +
      +
    • Slanje pošte koristeći IMAP BESPOSLENOST
    • +
    • Bolje performanse
    • +
    • Ponovno podnošenje poruke
    • +
    • Potpise E-Pošte
    • +
    • Bcc-sam-sebi
    • +
    • Upise mapa
    • +
    • Sinhronizacija svih mapa
    • +
    • Konfiguraciju porvratne adrese
    • +
    • Tipkovničke kratice
    • +
    • Bolju IMAP podršku
    • +
    • Spremanje privitaka na SD Karticu
    • +
    • Pražnjenje Smeća
    • +
    • Sortiranje poruka
    • +
    • …i više
    • +
    +

    +Molimo vas znajte da K-9 ne podržava većinu besplatnih Hotmail računa i poput drugih klijenata e-pošte ima nekih problema prilikom komunikacije sa Microsoft Exchange. +

    +Molimo vas pošaljite izvještaj o manama, učestvujte u novim značajkama i postavljajte pitanja na +http://k9mail.googlecode.com/. +

    + ]]>
    + + -- \nPoslano sa mog Android uređaja sa K-9 Mail. Molim vas oprostite na mojoj sažetosti. + + Račun \"%s\" će biti maknut iz K-9 Maila. + Svi lokalni podaci za \"%s\" biti će obrisani. Postavke računa će biti zadržane. + Lokalne kopije \"%s\" biti će izbrisane. Postavke računa biti će sačuvane. + + Molimo vas instalirajte upravitelj datoteka za nastavak uvoza. + Otvorite Trgovinu Play + + Autori: %s + Informacije Revizije: %s + Mi koristimo slijedeće biblioteke treće strane: %s + Emoji ikone: %s + čitanje privitaka E-Pošte + Dopušta ovoj aplikaciji čitanje vaših privitaka E-Pošte. + čitanje E-Pošte + Dopušta ovoj aplikaciji čitanje vaše E-Pošte + Brisanje E-Pošte + Dopušta ovoj aplikaciji brisanje vaše E-Pošte. + O %s + Računi + Mape + Napredno + %s:%s + Sastavi + Odgovori + Odgovori svima + Proslijedi + Odaberite Mapu + Provjera %s:%s%s + Dobavljanje zaglavlja %s:%s%s + Šaljem %s%s + Proc %s:%s%s + \u0020%s/%s + Slijedeća provjera %s + Sinhroniziranje je onemogućeno + %d odabrano + Slijedeća + Prethodna + + U REDU + Otkaži + Pošalji + Pošalji Ponovno + Označi + Odznači + Odgovori + Odgovori svima + Obriši + Arhiva + Neželjena pošta + Proslijedi + Premjesti + Pošalji… + Ponovno punjenje… + Gotovo + Otpusti + Spremi kao skicu + Provjeri E-Poštu + Pošalji poruke + Osvježi popis mape + Pronađi mapu + Dodaj račun + Sastavi + Pretraži + Rezultati pretraživanja + Podešenja + Postavke računa + Postavke mape + Općenite postavke + Obriši račun + Očisti radnje u tijeku (opasno!) + Označi pročitanim + Podijeli + Odaberi pošiljatelja + Dodaj zvjezdicu + Ukloni zvjezdicu + Kopiraj + Odaberi tekst + Prikaži zaglavlje + Sakrij zaglavlje + Prebaci na tamnu temu + Prebaci na svijetlu temu + Označi nepročitanim + Dodaj Cc/Bcc + Potvrda čitanja + Zahtjeva potvrdu čitanja + Ne zahtjeva potvrdu čitanja + Dodaj privitak + Isprazni Smeće + Izbrisati + Očistiti lokalne poruke + O + Podešenja + Opcije računa + + (Nema subjekta) + Nema pošiljatelja + Provjeravanje + Učitavanje poruka\u2026 + Greška veze + Poruka nije pronađena + pokušaj učitati više poruka + Učitati + za %d više + GB + MB + KB + B + Račun \"%s\" smanjeno sa %s na %s + Zbijanje računa \"%s\" + Čišćenje računa \"%s\" + Ponovno stvaranje računa \"%s\" + Nova pošta + %d Nepročitano (%s) + + %d više na %s + Odgovori + Označi Pročitanim + Obriši + Greška certifikata za %s + provjerite postavke vašeg poslužitelja + Provjeravam poštu: %s:%s + Provjeravanje pošte + Šaljem poštu: %s + Slanje pošte + : + Dolazna pošta + Odlazna pošta + Skice + Smeće + Poslano + Arhiva + Neželjena pošta + %s (Skice) + %s (Smeće) + %s (Poslano) + %s (Arhiva) + %s (Neželjena pošta) + Slanje nekih poruka nije uspjelo + Inačica: %s + Omogući zapisnik ispravljanja + Zapisuj posebne informacije dijagnoze + Zapisnik osjetljivih informacija + Mpže prikazati lozinke u zapisnicima. + Učitaj više poruka + Za:%s + Za + Cc + Bcc + Subjekt + Tekst poruke + Potpis + -------- Originalna Poruka -------- + Subject: + Poslano: + Od: + Za: + Cc: + %s je napisao: + Na %1$s, %2$s wrote: + Morate dodati barem jednog primatelja + Nije poronađena adrese e-pošte za ovaj kontakt. + Neki privici ne mogu biti proslijeđeni zato jer nisu preuzeti. + Citat poruke + Dodaj primatelja (Za) + Dodaj primatelja (CC) + Dodaj primatelja (BCC) + Maknuti citirani tekst + Urediti citirani tekst + Od: %s <%s> + Za: + Cc: + Otvori + Spremi + Privitak je spremljen na SD karticu kao %s. + Spremanje privitka na SD karticu nije moguće. + Prikaži slike + Prikaži poruke + Prikaži privitke + Više… + Dohvaćanje privitka. + Ne mogu pronaći preglednik za %s. + Preuzmi cijelu poruku + Preuzimam… + + Nisu sva zgalavlja preuzeta i sppemljena. Odaberite \"Spremi sva zaglavlja lokalno\" u postavkama dolaznog poslužitelja računa za omogućavanje ove značajke u buduće. + Sva zaglavlja su preuzeta, ali nema dodatnih zaglavlja za prikaz. + Dohvat dodatnih zaglavlja iz baze podataka ili poslužitelja pošte nije uspio. + Više od ovog pošiljatelja + Poruka odbačena + Poruka spremljena kao skica + Prikaži zvjezdice + Zvjezdice ukazuju na označene poruke + Kućice višestrukog odabira + Uvijek prikazuj kućice višestrukog odabira + Vrta predpregleda + Prikaži imena korespodenata + Rađe prikaži imena korespodenata nego njihove adrese e-pošte + Korespodent iznad subjekta + Prikaži imena korespodenata iznad linije subjekta, rađe nego ispod nje + Prikaži imena kontakata + Koristi imena iz Kontakata ako je moguće + Oboji kontakte + Ne boja imena u vašoj listi kontakata + Boja imena u vašoj listi kontakata + Skrati duge nazive mapa + Koristi višestruke linije za prikaz dugih naziva mapa + popravljena širina fontova + Koristi popravljenu širinu fonta prilikom prikaza običnog teksta poruke + Automatska prilstajanje poruke + Stisni poruke kako bi pristajale zaslonu + Vraćanje na popis nakon brisanja + Vraćanje na popis poruka nakon brisanja poruke + Prikaži slijedeću poruku nakon brisanja + Prikaži slijedeću poruku po zadanom nakon brisanja poruke + Potvrdi radnje + Prikazuje dijalog prilikom izvođenja odabranih radnji + Obriši + Obriši Označeno Zvjezdicom (u pregledu poruke) + Neželjena pošta + Obriši (iz obavijesti) + Makni K-9 Korisničkog agenta iz zaglavlja pošte + Koristi KSV kao vremensku zonu u zaglavlju pošte + Sakrij subjekt u obavijesti + Nikad + Kad je uređaj zaključan + Uvijek + Prikaži gumb \'Obriši\' + Nikada + Za pojedinačnu obavijest poruke + Uvijek + Prikaži gumb u traci obavijesti koji dozvoljava brzo brisanje poruke + Tiho Vrijeme + Onemogućava zvonjavu, vibriranje i blicanje noću + Vrijeme Tišine započinje + Vrijeme Tišine završava + Postavi novi račun + Adresa E-Pošte + Lozinka + Prikaži lozinku + Ručno postavljanje + + Dohvaćam informacije o računu\u2026 + Provjeravam postavke dolaznog poslužitelja\u2026 + Provjeravam postavke odlaznog poslužitelja\u2026 + Identifikacija\u2026 + Dohvaćam postavke računa\u2026 + Otkazujem\u2026 + Uskoro ste gotovi! + Dajte naziv ovom računu (opcionalno): + Unesite vaše ime (prikazuje se na odlaznim porukama): + Vrsta računa + Kakav je to račun? + POP3 + IMAP + Exchange (WebDAV) + Normalna lozinka + Loinka, nesigurno prenosiva + Šifrirana lozinka + Certifikat klijenta + Postavke dolaznog poslužitelja + Korisničko ime + Lozinka + Certifikat klijenta + POP3 poslužitelj + IMAP poslužitelj + Exchange poslužitelj + Ulaz + Sigurnost + Identifikacija + Bez + SSL/TLS + STARTTLS + \"%1$s = %2$s\" nije važeća sa \"%3$s = %4$s\" + Prilikom brisanja poruke + Nemoj brisati na poslužitelju + Obriši sa poslužitelja + Označi kao pročitano na poslužitelju + Koristi sabijanje na mreži: + Mobilna + Wi-Fi + Ostalo + Vanjska pohrana (SD kartica) + regularna unutarnja pohrana + %1$s dodatna interna pohrana + Mjesto pohrane + Obriši izbrisane poruke sa poslužitelja + Odmah + Prilikom provjere + Ručno + Automatsko otkrivanje IMAP naziva prostora + IMAP prefiks putanje + Mapa skica + Mapa poslanog + Mapa smeća + Mapa arhive + Mapa neželjene pošte + Prikaži samo pretplaćene mape + Automatsko proširivanje mapa + OWA putanja + Opcionalno + Putanja identifikacije + Opcionalno + Alias poštanskog sandučića + Opcionalno + Postavke odlaznog poslužitelja + SMTP poslužitelj + Ulaz + Sigurnost + Zahtjeva prijavu + Korisničko ime + Lozinka + Identifikacija + \"%1$s = %2$s\" nije važeća sa \"%3$s = %4$s\" + Nevažeće postavljanje: %s + Opcije računa + Sažmi račun + Očisti poruke (opasno!) + Ponovno kreiranje podataka (Posljednja Nada) + Učestalost provjera mapa + Nikad + Svake minute + Svakih 5 minuta + Svakih 10 minuta + Svakih 15 minuta + Svakih 30 minuta + Svaki sat + Svaka 2 sata + Svaka 3 sata + Svakih 6 sati + Svakih 12 sati + Svaka 24 sata + Provjeri prilikom povezivanja za guranje + Omogući poštu guranja za ovaj račun + Ako vaš poslužitelj podržava, nove poruke će se prikazivati odmah. Ova opcija može dramatično poboljšati ili pogoršati performanse. + Osvježi BESPOSLENU vezu + Svake minute + Svake 2 minute + Svake 3 minute + Svakih 6 minuta + Svakih 12 minuta + Svakih 24 minuta + Svakih 36 minuta + Svakih 48 minuta + Svakih 60 minuta + Obavijesti me kod primitka pošte + Obavijesti me prilikom provjere pošte + Broj poruka za prikaz + 10 poruka + 25 poruka + 50 poruka + 100 poruka + 250 poruka + 500 poruka + 1000 poruka + 2500 poruka + 5000 poruka + 10000 poruka + sve poruke + Nemogu kopirati ili premjestiti poruke koje nisu sinhronizirane sa poslužiteljem + Postavljanje nije moglo biti završeno + Netočno korisničko ime ili lozinka.\n(%s) + Poslužitelj ukazuje na nevažeći SSL certifikat. Ponekad je to zbog loše konfiguracije poslužitelja. Ponekad je zbog toga što netko pokušava napasi vas ili vaš poslužitelj. Ako niste sigurni o čemu se radi, kliknite Odbij i kontaktirajte ljude koji upravljaju vašim poslužiteljem pošte.\n\n(%s) + ne mogu se povezati na poslužitelj.\n(%s) + Uredi detalje + Nastavi + Napredno + Postavke računa + Zadani račun + Pošalji poštu s ovog računa po zadanom + Nova obavijest pošte + Mapa obavijesti + Svi + Samo mape 1. Razreda + Mape 1. i 2. Razreda + Sve osim mapa 2. Razreda + Ništa + Obavijesti sinhronitzacije + Vaša adresa e-pošte + Obavijesti me u traci stanja o pristigloj pošti + Obavijesti me u traci stanja dok se provjerava pošta + Uključi odlaznu poštu + Prikaži obavijest za poruke koje ja pošaljem + Obavijest otvara nepročitane poruke + Pretraga za nepročitanim porukama nakon otvaranja Obavijesti + Označi pročitanim prilikom otvaranja + Označava poruke pročitanima nakon otvaranja za pregled + Uvijek prikaži slike + Ne + Iz kontakata + Od bilo koga + Šaljem poštu + Citiraj poruku prilikom odgovaranja + Uključuje originalnu poruku u vaš odgovor. + Odgovori nakon citiranog teksta + Originalna poruka se prikazuje iznad vašeg odgovora. + Makni potpis u odgovoru + Potpisi će biti maknuti iz citiranih poruka + Format Poruke + Pbičan Tekst (miče slike i oblikovanje) + HTML (zadržava slike i oblikovanje) + Automatski + Uvijek prikazuj Cc/Bcc + Potvrda čitanja + Uvijek traži potvrdu čitanja + Stil citiranog odgovora + Prefiks (poput Gmail) + Zaglavlje (poput Outlook) + Opća podešavanja + Čitanje pošte + Dohvaćanje pošte + Mape + Prefiks citiranog teksta + Šifriranje + OpenPGP Davatelj Usluga + Nema instaliranog Open PGP Pružatelja Usluge + Učestalost provjere mape + Pohrana + Boja računa + Oznaka boje za ovaj račun koristi se za mape i popis računa + Boja LED obavijesti + LED boja vašeg uređaja koja bi trebala treptati za ovaj račun + Veličina lokalne mape + Dohvaćaj poruke do + 1Kb + 2Kb + 4Kb + 8Kb + 16Kb + 32Kb + 64Kb + 128Kb + 256Kb + 512Kb + 1Mb + 2Mb + 5Mb + 10Mb + bilo koje veličine (bez ograničenja) + Sinhroniziraj poruke od + bilo kada (bez ograničenja) + danas + posljednja 2 dana + posljednja 3 dana + posljednji tjedan dana + posljednja 2 tjedna + posljednja 3 tjedna + posljednijh mjesec dana + posljednja 2 mjeseca + posljednja 3 mjeseca + posljednjih 6 mjeseci + posljednjih godinu dana + Mape za prikaz + Sve + Samo mape 1. Razreda + Mape 1. i 2. Razreda + Sve osim mapa 2. Razreda + Provjera mapa + Sve + Samo mape 1. Razreda + Mape 1. i 2. Razreda + Sve osim mapa 2. Razreda + Nijedna + Mape guranja + Sve + Samo mape 1. Razreda + Mape 1. i 2. Razreda + Sve osim mapa 2. Razreda + Nijedna + Mape destinacije Premještanja/kopiranja + Sve + Samo mape 1. Razreda + Mape 1. i 2. Razreda + Sve osim mapa 2. Razreda + Sinhronizacija brisanja poslužitelja + Makni poruke prilikom brisanja sa poslužitelja + Postavke mape + Prikaži na vrhu grupe + Prikaži blizu vrha na popisu mapa + Razred prikaza mape + Nijedan + 1. Razreda + 2. Razreda + Razred sinhroniziranja mape + Nijedan + 1. Razreda + 2. Razreda + Isto kao razred prikaza + Razred guranja mape + Nijedan + 1. Ratreda + 2. Razreda + Isto kao i razred sinhronizacije + razred obavijesti mape + Nijedan + 1. Razreda + 2. Razreda + Isto kao i razred guranja + Dolazni poslužitelj + Postavite dolazni poslužitelj e-pošte + Odlazni poslužitelj + Postavite odlazni (SMTP) poslužitelj e-pošte + Naziv računa + vaše ime + Obavijesti + Vibriranje + Vibrira nakon primitka e-pošte + Uzorci vibriranja + zadano + uzorak 1 + uzorak 2 + uzorak 3 + uzorak 4 + uzorak 5 + Ponavljajuće vibriranje + Zvono nove e-pošte + LED treperenje + LED treptaji nakon primitka e-pošte + Opcije sastavljanja poruke + Zadano sastavljanje + Postavi svoje zadano Od, Bcc, i potpisa + Upravljanje identitetima + Postavite alternativno \'Od\' adrese i potpise + Upravljanje identitetima + Upravljaj identitetom + Uređivanje identiteta + Novi identitet + Bcc sve poruke na + Uredi + Pomakni gore + Pomakni dolje + Pomakni na vrh / napravi zadanim + Makni + Opis identiteta + (Opcionalno) + Vaše ime + (Opcionalno) + Adresa e-pošte + (Zahtjevano) + Odgovori na adresu + (Opcionalno) + Potpis + (Opcionalno) + Koristi Potpis + Potpis + Inicijalni identitet + Odaberite identitet + Pošalji kao + Ne možete maknuti vaš jedini identitet + Ne možete koristiti identitet bez adrese e-pošte + Prvo ranije poruke + Prvo kasnije poruke + Abecedno po subjektu + Obrnuto abecedno po subjektu + Abecedno po pošiljatelju + Obrnuto abecedno po pošiljatelju + Prvo poruke označene zvjezdicama + Prvo poruke neoznačene zvjezdicama + Prvo nepročitane poruke + Prvo pročitane poruke + Prvo poruke sa privicima + Prvo poruke bez privitaka + Sortiraj po… + datumu + Primitku + Subjektu + Pošiljatelju + Zvjezdici + Pročitano/nepročitano + Privicima + Obriši Račun + Obnovi Račun + Očisti Račun + Provjerite da li je omogućen IMAP ili POP3 na au one stranici podešavanja pošte. + Provjerite da li je omogućen IMAP ili POP3 na Naver stranici podešavanja pošte. + Provjerite da li je omogućen IMAP ili POP3 na Hanmail(Daum) stranici podešavanja pošte. + Nepoznat Certifikat + Prihvati Ključ + Odbij ključ + Del (or D) - Obriši\nR - Odgovori\nA - Odgovori Svima\nC - Sastavi\nF - Proslijedi\nM - Premjesti\nV - Arhiviraj\nY - Kopiraj\nZ - Označi (Ne)pročitano\nG - Zvjezdica\nO - Sortiranje vrste\nI - Poredak sortiranja\nQ - Povratak na Mape\nS - Označi/odznači\nJ or P - Prethodna Poruka\nK or N - Slijedeća Poruka + 1 - Prikaži samo mape 1. Razreda\n2 - Prikaži mape 1. i 2. Razreda\n3 - Prikaži sve osim mapa 2. Razreda\n4 - Prikaži sve mape\nQ - Povratak na Račune\nS - Uredi Postavei Računa + naziv mape sadrži + Prikaži mape… + Sve mape + Mape 1. Razreda + Mape 1. & 2. Razreda + Sakrij mape 2. Razreda + Pozicija potpisa + Poruke prije citiranja + Poruke nakon citiranja + Koristi temu aplikacije + Tamna + Svijetla + Zaslon + Opće + Ispravljanje Pogrešaka + Privatnost + Mreža + Interakcija + Popis računa + Popis poruka + Poruke + Popis mapa + Tema + Tema pregleda poruke + Tema sastavljanja poruke + Jezik + Popravljena tema poruke + Pdaberite temu poruke prilikom pregledavanja poruke + Koristi popravljenu temu pregleda poruke + Sistemski zadano + Pozadinska sinhronizacija + Nikada + Uvijek + Kad je \'Automatska sinhronizacija\' označena + Označi sve + Maksimum mapa za provjeru guranjem + 10 mapa + 25 mapa + 50 mapa + 100 mapa + 250 mapa + 500 mapa + 1000 mapa + Animacija + Koristi šarolike vizualne efekte + Geste + Omogući upravljanje gestama + Navigacija tipkama glasnoće + U pregledu poruka + U pregledu popisa + Započni u Objedinjenoj Dolaznoj Pošti + Prikaži veličinu računa + Isključite za brže prikazivanje + Brojač rezultata pretrage + Isključi za brži prikaz + Sakrij detalje računa + Sakrij objedinjeni pretinac dolazne pošte i sve račune poruka + %s %s + - Označeno Zvjezdicom + - Nepročitano + Sve poruke + Sve poruke uključene u mape pretraživanja + Objedinjena Dolazna Pošta + Sve poruke u objedinjenim mapama + Dodirnite omotnicu ili zvijezdicu za nepročitane ili za poruke sa zvjezdicom + Objedini + Sve poruke su prikazane u Objedinjenoj Dolaznoj Pošti + Mape za pretragu + Sve + Prikazane + Nijedna + Veličina fonta + Postavljanje veličine fonta + Popis računa + Naziv računa + Opis računa + Popis mapa + Naziv mape + Stanje Mape + Popis poruke + Subjekt + Pošiljatelj + Datum + Pedpregled + Poruke + Pošiljatelj + Za + Cc + Dodatna zaglavlja + Subjekt + Vrijeme i datum + Tijelo poruke + %d%% + %1$s: %2$s + Sastavljanje poruke + Polja unosa teksta + Zadano + Najsitnija + Sitno + Manja + Mala + Srednja + Velika + Veća + Razna + Nema prikladne aplikacije za ovu radnju. + Potpis + Enkriptiraj + <nepoznato> + PGP/MIME poruke još nisu podržane. + Upozorenje: privici još NISU potpisani ili enkriptirani + Slanje prekinuto. + Spremiti predložak poruke? + Spremiti ili Odbaciti ovu poruku? + Odbaciti poruku? + Jeste li sigurni da želite odbaciti ovu poruku? + Odbijanje spremanja predloška poruke. + Odbij spremanje predloška enkriptirane poruke. + Odaberi tekst za kopiranje.. + Potvrda brisanja + Da li želite obrisati ovu poruku? + + Da li stvarno želite obrisati ovu poruku? + Da li stvarno želite obrisati %1$d poruke? + Da li stvarno želite obrisati %1$d poruke? + + Da + Ne + Potvrda premještanja u mapu neželjena pošta + + Da li stvarno želite premjestiti ovu poruku u mapu otpada? + Da li stvarno želite obrisati %1$d poruke? + Da li stvarno želite obrisati %1$d poruke? + + Da + Ne + Preuzimam privitak + Opcija ispravljanja grešaka omogućena + » + + Ne mogu se povezati. + Podešenja Uvoz & Izvoz + Izvoz postavki računa + Izvoz postavki i računa + Uvoz + Izvoz + Uvoz postavki + Odabir uvoza + Opće postavke + Izvozim postavke… + Uvozim postavke… + Skeniram datoteku… + Spremi izvezene postavke u %s + Uvezene opće postavke iz %s + Uvezeni %s iz %s + + 1 račun + %s računa + %s računa + + Izvoz postavki nije uspio + Uvoz bilo kojih postavki iz %s nije uspio + Izvoz uspio + Izvoz nije uspio + Uvoz uspio + Uvoz nije uspio + Aktivirajte račun + Za mogućnost korištenja računa \"%s\" morate dati %s. + + lozinka poslužitelja + lozinka poslužitelja + lozinke poslužitelja + + Dolazni poslužitelj (%s): + Odlazni poslužitelj (%s): + + Postavljam lozinku… + Postavljam lozinku… + Postavljam lozinke… + + Koristi lozinku dolaznog poslužitelja + Aktiviranje + Račun \"%s\" je nedostupan, provjerite pohranu + Spremi privitke u… + Spremi privitak + Nije pronađen preglednik datoteka. Gdje biste željeli spremiti ovaj privitak? + Pomakni gore + Pomakni dolje + Premještam račun… + Prikaži brojač nepročitanih za… + Nedostaje Aplikacija Upravitelja Datoteka + Zatvori + Bez teksta + Otvori poveznicu + Podijeli poveznicu + Kopiraj poveznicu u međuspremnik + Poveznica + Slika + Pregled slike + Spremi sliku + Preuzmi sliku + Kopirajte URL slike u međuspremnik + URL Slike + Pozovi broj + Spremi u Kontakte + Kopiraj broj u međuspremnik + Broj telefona + Pošalji e-poštu + Spremi u Kontakte + Kopiraj adresu u međuspremnik + Adresa e-pošte + Spremi sliku kao \"%s\" + Spremanje slike nije uspjelo. + Sve + 10 + 25 + 50 + 100 + 250 + 500 + 1000 + Granica pretrage poslužitelja + Traženje će se zaustaviti nakon pronalaska %s rezultata. + Uključi tekst poruke u pretraživanje poslužitelja + Pretraga cijelog teksta može biti spora. + Šaljem upit poslužitelju + Zahvaćam %d rezultate + Dohvaćam %1$d of %2$d rezultata + Udaljeno pretraživanje nije uspjelo + Pretraga + Omogući pretraživanje poslužitelja + Pretraži poruke na poslužitelju a potom one na vašem uređaju + Pretraži poruke na poslužitelju + Povuci za pretragu poslužitelja… + Otpusti za pretragu poslužitelja… + Potrebna je mrežna veza za pretragu poslužitelja. + Zamagli poruke nakon čitanja + Siva pozadina ukazuje da je poruka pročitana + Pregled niza + Grupiraj poruke po konverzaciji + Nadograđujem baze podataka + Nadograđujem baze podataka… + Nadograđujem baze podataka računa \"%s\" + Učitavam… + Prikaži podijeljeni zaslon + Uvijek + Nikad + Kad je u Pezažnom položaju + Molimo vas odaberite poruku s lijeva + Prikaži slike kontakata + Prikaži slike kontakata u popisu poruka + Osvježeno %s + Osvježeno %s (Guranje aktivno) + na %s + Označi sve pročitanim + Oboji slike kontakta + Oboji slike kontakta koji nedostaje + Vidljive radnje poruke + Prikaži odabrane radnje u izborniku pregleda poruke + Učitavam privitak… + Slaje poruke + Spremanje skice + Dohvaćanje privitka… + Ne mogu identificirati. Poslužitelj ne oglašava SASL VANJSKU sposobnost. To može biti problem sa certifikatom klijenta (istekao, nepoznat izdavatelj certifikata) ili neki drugi konfiguracijski problem. + + Dekriptiranje/Verificiranje… + Dekripcija uspjela + Važeći potpis (certificiran) + Važeći potpis ali ne certificiran + Nepoznati potpisatelj + Nevažeći potpis + Nedostaje javni ključ za ovaj potpis + Uspješna dekripcija i važeći potpis (certificiran) + Uspješna dekripcija i važeći potpis ali ne certificiran + Uspješna dekripcija ali nedostaje javni kjuč + Potraži nedostajući ključ + OpenPGP Greška: + Korisnički ID + + Koristi certifikat klijenta + Nema certifikata klijenta + Makni odabir certifikata klijenta + Neuspješno dobivanje certifikata klijenta za alias \"%s\" + Napredne Opcije + Certifikat klijenta \"%1$s\" je istekao ili još nije važeći (%2$s) +
    diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index deec6e93b..929d7c2ef 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -45,6 +45,7 @@ Hibajelentéseivel hozzájárul az újabb verziók tökéletesítéséhez, kérd

    ]]> + -- \nEzt a levelet mobiltelefonról küldtem, K-9 Mail-el. Elnézést a levél rövidségéért és az esetleges hibákért. A \"%s\" fiók törölve a K9 Mail-ból. Az összes üzenet, melléklet, mappa és beállításai törlődni fognak a \"%s\" fiókból. A fiók beállításai megmaradnak. @@ -98,6 +99,7 @@ Hibajelentéseivel hozzájárul az újabb verziók tökéletesítéséhez, kérd Továbbítás Áthelyez Küldés… + Újratöltés… Rendben Mégsem Piszkozat @@ -156,9 +158,6 @@ Hibajelentéseivel hozzájárul az újabb verziók tökéletesítéséhez, kérd Fiók takarítása \"%s\" A \"%s\" újbóli létrehozása Új levél - - %d új üzenet - %d Olvasatlan (%s) + %d érkezett ide: %s Válasz @@ -204,6 +203,7 @@ Hibajelentéseivel hozzájárul az újabb verziók tökéletesítéséhez, kérd Címzett: Másolat: %s írta: + %1$s, %2$s írta: Legalább egy címzetted adjon meg. E-mail cím nem található. Néhány mellékletet nem lehet továbbítani, mert nem lettek letöltve. @@ -242,6 +242,7 @@ Hibajelentéseivel hozzájárul az újabb verziók tökéletesítéséhez, kérd Előnézeti sorok száma Nevek mutatása Ha a címtárban szerepel az email cím, a hozzá tartozó név megjelenítése + Küldő a tárgy felett Névjegyek mutatása Használja a címzettek nevét ha címtárban szerepel Névjegyek színe @@ -259,16 +260,21 @@ Hibajelentéseivel hozzájárul az újabb verziók tökéletesítéséhez, kérd A törlés után alapértelmezetten a következő üzenetet mutatja Parancsok megerősítése Üzenet megjelenítése a parancs végrehatása előtt + Törlés Csillagozott törlése (csak olvasható üzenet) Levélszemét Törlés (az értesítések közül) + K-9 Ügynök elrejtése a levél fejlécénél + UTC időzóna használata a levelek fejlécében Tárgy elrejtése az értesítésekben Soha Ha a készülék le van zárva Mindig \'Törlés\' gomb megjelenítése Soha + Egyszerű értesítés új levélnél Mindig + Gomb mutatása az értesítések között a gyors üzenettörlés engedélyezéséhez Csendes mód Éjszakára kikapcsolja a jelzőhangokat, rezgést, villogást Csendes mód kezdete @@ -276,6 +282,7 @@ Hibajelentéseivel hozzájárul az újabb verziók tökéletesítéséhez, kérd Új fiók létrehozása E-mail cím Jelszó + Jelszó mutatása Kézi beállítás Fiók adatainak ellenőrzése… @@ -292,9 +299,14 @@ Hibajelentéseivel hozzájárul az újabb verziók tökéletesítéséhez, kérd POP3 IMAP Exchange (WebDAV) + Egyszerű jelszó + Jelszó, nem biztonságos átvitellel + Titkosított jelszó + Ügyfél tanúsítvány Bejövő szerver Felhasználónév Jelszó + Ügyfél tanúsítvány POP3 szerver IMAP szerver Exchange szerver @@ -302,6 +314,8 @@ Hibajelentéseivel hozzájárul az újabb verziók tökéletesítéséhez, kérd Kapcsolat biztonsága Hitelesítés típus Nincs + SSL/TLS + STARTTLS Üzenet törlésekor Ne törlődjön a szerverről Törlődjön a szerverről @@ -382,9 +396,15 @@ Hibajelentéseivel hozzájárul az újabb verziók tökéletesítéséhez, kérd 250 levél 500 levél 1000 levél + 2500 levél + 5000 levél + 10000 levél Minden levél Ez a levél nem másolható illetve mozgatható máshova, mert nincs szinkronizálva a szerverrel. A konfigurálás nem sikerült + Felhasználónév vagy a jelszó hibás.\n(%s) + A szerver érvénytelen SSL tanúsítványt használ. Néha ez a szerver hibás beállításaiból fakadhat, néha azért, mert valaki megtámadta a levelező szervered. Ha nem vagy biztos benne, mi történt, bökj a Visszautasít gombra és vedd fel a kapcsolatot a levelezőszerver üzemeltetőivel.\n\n(%s) + Nem lehet kapcsolódni a szerverhez.\n(%s) Módosítás Tovább Haladó @@ -392,6 +412,10 @@ Hibajelentéseivel hozzájárul az újabb verziók tökéletesítéséhez, kérd Alapértelmezett fiók Levélküldéskor ez a fiók az alapértelmezett Értesítés új levélnél + Értesítési mappák + Összes + Mind, kivéve a 2Másodlagost + Nincs Értesítés szinkronizálásnál Az email címe Értesítés az állapotsoron ha új levél érkezett @@ -418,6 +442,8 @@ Hibajelentéseivel hozzájárul az újabb verziók tökéletesítéséhez, kérd HTML (képekkel és formázással) Automatikus A Cc/Bcc mindig jelenjen meg + Olvasási visszaigazolás + Mindig kérjen olvasási jelentést Válaszlevél stílusa Előtag (pl. Gmail, Pine) Fejléc (pl. Outlook, Yahoo!, Hotmail) @@ -428,6 +454,7 @@ Hibajelentéseivel hozzájárul az újabb verziók tökéletesítéséhez, kérd Idézett szöveg előtagja Titkosítás OpenPGP Provider + Nincs OpenPGP szolgáltató telepítve Frissítés gyakorisága Tárolás Fiók színe @@ -505,6 +532,10 @@ Hibajelentéseivel hozzájárul az újabb verziók tökéletesítéséhez, kérd Elsődleges Másodlagos Mint a szinkronizált + Értesítési mappa osztály + Nincs + Elsődleges + Másodlagos Bejövő szerver Beérkező levélszerver konfigurálása Kimenő szerver @@ -798,6 +829,9 @@ Hibajelentéseivel hozzájárul az újabb verziók tökéletesítéséhez, kérd 500 1000 Kiszolgáló keresési határa + A keresés %s találat után véget ér. + A teljes szöveges keresés lassabb lehet. + Kérés küldése a szerver felé %d letöltési eredmény %1$d letöltése a(z) %2$d eredményből A távoli keresés sikertelen @@ -828,12 +862,33 @@ Hibajelentéseivel hozzájárul az újabb verziók tökéletesítéséhez, kérd on %s Összes megjelölése olvasottként Partnerek képeinek színezése + Hiányzó partnerképek színezése Üzenetműveletek megjelenítése Kiválasztott művelet megjelenítése az üzenetnézet menüben Melléklet betöltése… Üzenet küldése Piszkozat mentése Melléklet letöltése… + Hitelesítés sikertelen. A szerver nem támogatja a SASL EXTERNAL lehetőséget. Ezt okozhatja valamilyen gond a kliens tanúsítványával (lejárt, ismeretlen hitelesítő), vagy bármi más beállítási probléma. + Titkosítás feloldása/Ellenőrzés… + Titkosítás sikeresen feloldva + Érvényes aláírás (tanúsított) + Érvényes aláírás, de nem tanúsított + Ismeretlen aláíró + Érvénytelen aláírás + Ehhez az aláíráshoz hiányzik a nyilvános kulcs + Titkosítás sikeresen feloldva és érvényes aláírás (tanúsított) + Titkosítás sikeresen feloldva és az aláírás érvényes, de nem tanúsított + Titkosítás sikeresen feloldva, de hiányzik a nyilvános kulcs + Hiányzó kulcs keresése + OpenPGP hiba: + Felhasználói Id + Ügyfél tanúsítvány használata + Ügyfél tanúsítvány nem található + Ügyfél tanúsítvány kiválasztásának megszüntetése + A klienstanúsítvány letöltése sikertelen a következő alias-nak: \"%s\" + Haladó beállítások + A kliens tanúsítványa \"%1$s\" lejárt, vagy még nem érvényes (%2$s) diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 485a491f5..9f8cea7a2 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -159,6 +159,7 @@ Invia le tue segnalazioni, suggerisci nuove funzionalità e chiedi informazioni Ricrea account \"%s\" Nuova posta + %d nuovo messaggio %d nuovi messaggi %d non letti (%s) @@ -279,6 +280,9 @@ Invia le tue segnalazioni, suggerisci nuove funzionalità e chiedi informazioni Per la notifica di un singolo messaggio Sempre Mostra un pulsante nella notifica che consente l\'eliminazione rapida + Nome applicazione + Numero messaggi non letti + Numero messaggi e mittenti Silenzioso a tempo Disabilita chiamata, vibrazione e lampeggi di notte Attiva alle @@ -462,6 +466,7 @@ Invia le tue segnalazioni, suggerisci nuove funzionalità e chiedi informazioni Prefisso testo citato Crittografia Fornitore OpenPGP + Nessun fornitore OpenPGP installato Frequenza verifica cartelle Archiviazione Colore dell\'account diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index 800c3bc35..b877e2eb6 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -157,9 +157,6 @@ K-9 は大多数のメールクライアントと同様に、ほとんどのフ アカウント \"%s\" をクリアしています アカウント \"%s\" を再作成しています 新着メール - - %d 件の新着メッセージ - %d 未読 (%s) + %d more on %s 返信 @@ -285,6 +282,7 @@ K-9 は大多数のメールクライアントと同様に、ほとんどのフ 電子メールセットアップ メールアドレス パスワード + パスワードを表示 手動設定 アカウント情報を取得中\u2026 @@ -304,9 +302,11 @@ K-9 は大多数のメールクライアントと同様に、ほとんどのフ パスワード パスワード (危険な方法で送信される) 暗号化されたパスワード + クライアント証明書 受信メールサーバ設定 アカウント名 パスワード + クライアント証明書 POP3 サーバ IMAP サーバ Exchange サーバ @@ -402,6 +402,8 @@ K-9 は大多数のメールクライアントと同様に、ほとんどのフ すべて サーバーと同期されていないメールをコピーまたは移動できません 設定エラー + ユーザ名またはパスワードが不正です\n(%s) + サーバに接続できません\n(%s) 詳細再編集 続行 プッシュ接続の拡張設定 @@ -409,6 +411,12 @@ K-9 は大多数のメールクライアントと同様に、ほとんどのフ 標準アカウント このアカウントをメール送信に利用する 受信メール通知 + 通知するフォルダ + すべて + 1st クラスフォルダのみ + 1st および 2nd クラスフォルダ + 2nd クラスフォルダを除くすべて + なし メール同期通知 メールアドレス ステータスバーにメール受信通知を表示する @@ -524,6 +532,11 @@ K-9 は大多数のメールクライアントと同様に、ほとんどのフ 1st クラス 2nd クラス 同期クラスと同一設定 + フォルダ通知クラス + 設定しない + 1st クラス + 2nd クラス + プッシュクラスと同一設定 受信メールサーバ設定 受信メールサーバの設定を行う 送信メールサーバ設定 @@ -605,6 +618,7 @@ K-9 は大多数のメールクライアントと同様に、ほとんどのフ 証明書が無効です 許可 拒否 + 1 - 1st クラスフォルダ表示\n2 - 1st と 2nd クラスフォルダ表示\n3 - 2nd クラスフォルダ以外を表示\n4 - 全フォルダ表示\nQ - アカウント設定に戻る\nS - アカウント設定編集 フォルダ名に含まれる文字 フォルダ表示… 全フォルダ @@ -859,6 +873,7 @@ K-9 は大多数のメールクライアントと同様に、ほとんどのフ メッセージ送信 下書き保存 添付ファイル取得中… + 認証できません。サーバはSASL EXTERNALが利用できることを示していません。これはクライアント証明書の問題(期限切れ、未知の認証局)またはなんらかの設定のためです 暗号解読/検証中… 解読成功 @@ -874,4 +889,10 @@ K-9 は大多数のメールクライアントと同様に、ほとんどのフ OpenPGP エラー: ユーザID + クライアント証明書を使う + クライアント証明書なし + クライアント証明書を削除します + 別名 \"%s\" のためのクライアント証明書の取得に失敗しました + 拡張オプション + クライアント証明書 \"%1$s\" が、期限切れまたは不正です (%2$s) diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index 92653136c..8125be373 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -156,9 +156,6 @@ K-9 메일은 대부분의 무료 hotmail 계정을 지원하지 않으며, 다 계정 비우기 \"%s\" 계정 재생성 \"%s\" 새 메일 - - %d 통의 새 메일 - %d 통의 읽지 않은 메일 (%s) + %d 통의 메일 추가됨 (%s) 답장 diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index 727314c8c..27ee08d13 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -157,9 +157,6 @@ Praneškite apie klaidas, pridėkite naujų galimybių ir užduokite klausimus m Išvaloma paskyra \"%s\" Iš naujo kuriama paskyra \"%s\" Naujas laiškas - - %d naujų laiškų - %d Neskaitytų (%s) + %d daugiau %s Atsakyti diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index 1014726b8..28189c615 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -160,9 +160,6 @@ pat %d vairāk Iztukšot kontu \"%s\" Atjaunot kontu \"%s\" Jauna vēstule - - %d jaunas vēstules - %d Nelasītas (%s) + %d vairāk %s Atbildēt @@ -420,6 +417,12 @@ pat %d vairāk Konts pēc noklusējuma Sūtīt pastu no šī konta pēc noklusējuma Jauna pasta paziņojumi + Paziņojumu mapes + Visu + Tikai 1. kategorijas mapes + 1. un 2. kategorijas mapes + Visu, izņemt 2. kategorijas mapes + Nevienu Sinhronizācijas paziņojumi Jūsu e-pasta adrese Paziņot statusa joslā, kad saņemts jauns pasts @@ -535,6 +538,11 @@ pat %d vairāk 1. kategorija 2. kategorija Tāda pati kā sinhronizēšanas kategorija + Mapes paziņojumu kategorija + Nevienu + 1. kategorija + 2. kategorija + Tāda pati, kā lejupielādēšanas kategorija Ienākošais serveris Iestatīt ienākošā pasta serveri Izejošais serveris diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index 287474d0c..182fb1330 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -17,7 +17,7 @@ Velkommen til K-9 E-post -K-9 e-post er et kraftig e-postprogram for Android. +K-9 e-post er en kraftig e-postklient til Android.

    Dets forbedrede egenskaper inkluderer:

    @@ -33,7 +33,7 @@ Dets forbedrede egenskaper inkluderer:
  • Tastatursnarveier
  • Bedre IMAP-støtte
  • Lagre vedlegg til SD
  • -
  • Tøm søppelbøtta
  • +
  • Søppeltømming
  • Meldingssortering
  • …og mye mer
  • @@ -41,11 +41,12 @@ Dets forbedrede egenskaper inkluderer: Vennligst merk deg at K-9 støtter ikke de fleste Hotmail-kontoer og, som mange andre e-postklienter, har det noe problemer med å kommunisere med Microsoft Exchange.

    -Vennligst send feilmeldinger, forbedringer og still spørsmål hos +Vennligst send feilmeldinger, forbedringer og still spørsmål på http://k9mail.googlecode.com/.

    ]]>
    + -- \nSendt fra min Android-enhet med K-9 E-post. Vennligst unnskyld min kortfattethet. Kontoen \"%s\" vil bli fjernet fra K-9 E-post Alle lokale data for \"%s\" vil bli fjernet. Kontoinnstillinger vil bli beholdt. @@ -93,30 +94,30 @@ Vennligst send feilmeldinger, forbedringer og still spørsmål hos Fjern valg Svar Svar til alle - Slet + Slett Arkiver Søppelpost Videresend Flytt - Send… + Send … Omorganiser … Ferdig Forkast Lagre som kladd Sjekk e-post - Send melding + Send meldinger Oppdater mappeliste Finn mappe Legg til konto Skriv Søk - Søkeresultat - Oppsett - Kontooppsett - Mappeoppsett - Globaloppsett + Søkeresultater + Innstillinger + Kontoinnstillinger + Mappeinnstillinger + Globale innstillinger Fjern konto - Fjern påventende handliger (farlig!) + Fjern påventende handlinger (fare!) Markér som lest Del Velg avsender @@ -126,15 +127,15 @@ Vennligst send feilmeldinger, forbedringer og still spørsmål hos Velg tekst Vis meldingshode Skul meldingshode - Veksl til mørkt tema - Veksl til lyst tema - Markér ulest - Legg til Kopi/blindkopi + Bytt til mørkt tema + Bytt til lyst tema + Merk uleste + Legg til kopi/blindkopi Lesekvittering Kommer til å be om lesekvittering Kommer ikke til å be om lesekvittering Legg til vedlegg - Tøm søppeldunk + Tøm søppel Tilintetgjør Fjern lokale meldinger Om @@ -145,7 +146,7 @@ Vennligst send feilmeldinger, forbedringer og still spørsmål hos Ingen avsender Sjekker Laster meldinger\u2026 - Kontaktfeil + Tilkoblingsfeil Melding ikke funnet Prøv igjen å laste flere meldinger Last opp @@ -159,16 +160,13 @@ til %d flere Renser konto \"%s\" Gjenskaper konto \"%s\" Ny e-post - - %d ny(e) melding(er) - %d Ulest(e) (%s) + %d flere på %s Svar - Marker som lest + Merk leste Slett Sertifikatfeil for %s - Sjekk dine serverinnstillinger + Sjekk dine tjenerinnstillinger Sjekker e-post: %s:%s Sjekker e-post Sender e-post: %s @@ -177,7 +175,7 @@ til %d flere Innboks Utboks Kladd - Søppelbøtte + Søppel Sendt Arkiv Søppelpost @@ -185,7 +183,7 @@ til %d flere %s (Søppel) %s (Sendt) %s (Arkiv) - %s (Søppelpost) + %s (Søppel) Feilet å sende noen meldinger Versjon: %s Aktiver feilsøkingslogg @@ -227,15 +225,15 @@ til %d flere Vis bilder Vis melding Vis vedlegg - Mer… + Mer … Henter vedlegg. Finner ikke visningsprogram for %s. Nedlaster komplett melding Nedlaster… - Ikke alle meldingshoder har blitt nedlastet eller lagret. Velg \"Lagre alle meldingshoder lokalt\" i kontoens innstilling for innkommende server for å tillate dette i framtiden. + Ikke alle meldingshoder har blitt nedlastet eller lagret. Velg \"Lagre alle meldingshoder lokalt\" i kontoens innstilling for innkommende tjener for å tillate dette i framtiden. Alle meldingshoder har blitt nedlastet, men det er ingen flere meldingshoder å vise. - Hentingen av flere meldigshoder fra databasen eller e-post-server feilet. + Hentingen av flere meldigshoder fra databasen eller e-posttjener feilet. Mer fra denne avsender Melding forkastet Melding lageret som kladd @@ -270,6 +268,8 @@ Vis neste melding som standard etter meldingssletting Slett stjernemerket (i meldingsvisning) Søppelpost Slett (fra varsel) + Fjern K-9 bruke-ragent fra meldingshode + Bruk UTC som tidssone i meldingshode Skjul emner i varslinger Aldri Når enhet er låst @@ -286,11 +286,12 @@ Vis neste melding som standard etter meldingssletting Sett opp en ny konto E-postadresse Passord + Vis passord Manuelt oppsett - Hent kontoinformasjon\u2026 - Sjekk innkommende serverinnstillinger\u2026 - Sjekk utgående serverinnstillinger\u2026 + Henter kontoinformasjon\u2026 + Kontrollerer innkommende tjenerinnstillinger\u2026 + Kontrollerer utgående tjenerinnstillinger\u2026 Autentisering\u2026 Henter kontoinnstillinger\u2026 Avbryter\u2026 @@ -305,22 +306,25 @@ Vis neste melding som standard etter meldingssletting Normalt passord Passord, overført uten sikkerhet Kryptert passord - Innkommende serverinnstillinger + Klientsertifikat + Innkommende tjenerinnstillinger Brukernavn Passord - POP3-server - IMAP-server - Exchange-server + Klientsertifikat + POP3-tjener + IMAP-tjener + Exchange-tjener Port Sikkerhet Autentisering Ingen SSL/TSL STARTTLS + \"%1$s = %2$s\" er ikke gyldig med \"%3$s = %4$s\" Når jeg sletter en melding - Ikke slett på server - Slett fra server - Angi som lest på server + Ikke slett på tjener + Slett fra tjener + Merk som lest på tjener Bruk kompresjon på nettverk: Mobil Wi-Fi @@ -329,7 +333,7 @@ Vis neste melding som standard etter meldingssletting Vanlig intern lagring %1$s ytterlig intern lagring Lagringsplassering - Fjern slettede meldinger på server + Fjern slettede meldinger på tjener Umiddelbart I forbindelse med sjekking av e-post Manuelt @@ -337,7 +341,7 @@ Vis neste melding som standard etter meldingssletting IMAP sti-prefix Kladd-mappe Sent-mappe - Papirkurv-mappe + Søppelmappe Arkiv-mappe Søppelpost-mappe Vis kun mapper du abonnerer på @@ -348,18 +352,21 @@ Vis neste melding som standard etter meldingssletting Valgfri Postkassealias Valgfri - Utgående serverinnstillinger - SMTP-server + Utgående tjener-innstillinger + SMTP-tjener Port Sikkerhet Krever pålogging. Brukernavn Passord Autentisering + \"%1$s = %2$s\" er ikke gyldig med \"%3$s = %4$s\" Ugyldig oppsett: %s Kontoinnstillinger + Komprimer konto Tøm meldinger (fare!) Gjenskap data (siste utvei!) + Oppdateringsfrekvens for mappen Aldri Hvert minutt Hvert 5. minutt @@ -372,7 +379,10 @@ Vis neste melding som standard etter meldingssletting Hver 6. time Hver 12. time Hver 24. time + Hent e-post samtidig som sending + Velg push e-post for denne konto Hvis tjeneren din støtter det, vil nye meldinger vises umiddelbart. Dette alternativet kan dramatisk forbedre eller skade ytelsen. + oppdatere IDLE tilkobling Hvert minutt Hvert 2. minutt Hvert 3. minutt @@ -382,7 +392,7 @@ Vis neste melding som standard etter meldingssletting Hvert 36. minutt Hvert 48. minutt Hvert 60. minutt - Varsle meg når e-post mottas + Varsle meg når e-post ankommer Varsle meg når det ses etter ny e-post Antall meldinger som skal vises 10 meldinger @@ -398,6 +408,9 @@ Vis neste melding som standard etter meldingssletting alle meldinger Kan ikke kopiere eller flytte en melding som ikke er synkronisert med tjeneren Oppsett kunne ikke fullføre + Brukernavn eller passord er feil.\n(%s) + Serveren presenterte et ugyldig SSL-sertifikat. Noen ganger skjer det fordi tjeneren er feilkonfigurert. Andre ganger fordi noen prøver å angripe deg eller din e-post-tjener. Hvis du ikke er sikker på hva som skjer: klikk avvis, og kontakt dem som administrerer din e-posttjener.\n\n(%s) + Kan ikke koble til tjener.\n(%s) Rediger detaljer Fortsett Avansert @@ -405,35 +418,57 @@ Vis neste melding som standard etter meldingssletting Standard konto Send e-post i fra denne kontoen som standard Varsel om ny e-post + Mapper med varslinger + Alle + Bare 1. klasses mapper + 1. og 2. klasses mapper + Alle utenom 2. klasses mapper + Ingen Synkroniseringsvarsel Din e-postadresse - Varsel i statuslinjen når ny e-post mottas + Varsel i statuslinjen når ny e-post ankommer Varsel i statuslinjen når det ses etter ny e-post Inkluder utgående e-post Vis et varsel for meldinger jeg sendte + Varslinger åpner uleste meldinger + Søker for uleste meldinger når Varslinger åpnes Merk som lest når åpnet Merk en melding som lest når den åpnes for visning Alltid vis bilder Nei Fra kontakter Fra hvem som helst - Sender e-post + Sende e-post Sitere melding når du svarer Legg til den opprinnelige meldingen i ditt svar. Svar etter sitert tekst Den opprinnelige meldingen vil vises over ditt svar. + Fjern signatur ved svar + Signaturer vil bli fjernet fra siterte meldinger Meldingsformat Ren tekst (fjern bilder og formatering) HTML (behold bilder og formatering) Automatisk + Alltid vis Kopi/Blindkopi + Lesebekreftelse + Alltid be om lesebekreftelse + Svarsiteringsstil + Prefiks (som Gmail) + Topptekst (som Outlook) Generelle innstillinger - Leser e-post - Henter e-post + Lese e-post + Hente e-post Mapper + Prefiks for sitert tekst Kryptografi OpenPGP-leverandør + Ingen OpenPGP leverandør installert + Oppdateringsfrekvens for mapper Lagring Kontofarge + Aksentfargen for denne konto brukes i mappe- og kontoliste + LED-varselfarge + Fargen som din enhets LED skal blinke for denne enhet. Lokal mappestørrelse Hent meldinger opp til 1Kb @@ -453,7 +488,7 @@ Vis neste melding som standard etter meldingssletting alle størrelser (ingen grense) Synkroniser meldinger fra når som helst (ingen grense) - i dag + idag de siste 2 dager de siste 3 dager den siste uken @@ -464,20 +499,24 @@ Vis neste melding som standard etter meldingssletting de siste 3 måneder de siste 6 måneder det siste året + Mapper å vise Alle Kun 1. klasse-mapper 1. og 2. klasse-mapper Alle unntatt 2. klasse-mapper + Sjekke-mapper Alle Kun 1. klasse-mapper 1. og 2. klasse-mapper Alle unntatt 2. klasse-mapper Ingen + Push-mapper Alle Kun 1. klasse-mapper 1. og 2. klasse-mapper Alle unntatt 2. klasse-mapper Ingen + Flytt/kopier mål-mapper Alle Kun 1. klasse-mapper 1. og 2. klasse-mapper @@ -496,10 +535,16 @@ Vis neste melding som standard etter meldingssletting 1. klasse 2. klasse Samme som visningsklasse + Push-klasse for mappe Ingen 1. klasse 2. klasse Samme som synkroniseringsklasse + Meldingsklasse for mappe + Ingen + 1. klasse + 2. klasse + Samme som push-klasse Innkommende tjener Konfigurer innkommende e-posttjener Utgående tjener @@ -508,7 +553,7 @@ Vis neste melding som standard etter meldingssletting Ditt navn Varslinger Vibrer - Vibrer når ny e-post mottas + Vibrer når ny e-post ankommer Vibreringsmønster standard mønster 1 @@ -518,12 +563,18 @@ Vis neste melding som standard etter meldingssletting mønster 5 Repeter vibrasjon Ringetone for ny e-post + Blink LED + Blink LED når e-post ankommer + Innstillinger for meldingskomposisjon + Komposisjonsstandard + Angi standard Avsender, Blind kopi og signatur Behandle identiteter Sett opp alternative «Fra»-adresser og signaturer. Behandle identiteter Behandle identitet Rediger identitet Ny identitet + Blind kopi til Rediger Flytt opp Flytt ned @@ -541,12 +592,17 @@ Vis neste melding som standard etter meldingssletting (Valgfri) Bruk signatur Signatur + Innledende identitet Velg identitet Send som Du kan ikke fjerne din eneste identitet Du kan ikke bruke en identitet uten en e-postadresse Tidligste meldinger først Seneste meldinger først + Alfabetisk etter emne + Omvendt alfabetisk etter emne + Alfabetisk etter avsender + Omvendt alfabetisk etter sender Stjernede meldinger først Ikke-stjernede meldinger først Uleste meldinger først @@ -564,11 +620,14 @@ Vis neste melding som standard etter meldingssletting Fjern konto Gjenopprett konto Tøm konto + Pass på å aktivere IMAP eller POP3 på e-postinnstillingssiden for \"au one mail\" Pass på å aktivere IMAP eller POP3 på e-postinnstillingssiden for Naver. Pass på å aktivere IMAP eller POP3 på e-postinnstillingssiden for Hanmail(Daum). Ukjent sertifikat Godta nøkkel Avvis nøkkel + Del (eller D) - Slett\nR - Svar\nA - Svar alle\nC - Skriv\nF - Videresend\nM - Flytt\nV - Arkiver\nY - Kopier\nZ - Marker (U)leste\nG - Stjerne\nO - Sorteringstype\nI - Sorteringsrekkefølge\nQ - Tilbake til mapper\nS - Velg/fjern valg\nJ eller P - Forrige melding\nK eller N - Neste melding + 1 - Vis bare 1. klasses mapper\n2 - Vis 1. og 2. klasses mapper\n3 - Vis alle utenom 1. og 2. klasses mapper\n4 - Vis alle mapper\nQ - Tilbake til Konti\nS - Rediger kontoinnstillinger mappenavn inneholder Vis mapper … Alle mapper @@ -578,9 +637,12 @@ Vis neste melding som standard etter meldingssletting Signaturplassering Før sitert melding Etter sitert melding + Bruk app-tema Mørk Lys + Visning Globalt + Feilretting Personvern Nettverk Samhandling @@ -589,13 +651,19 @@ Vis neste melding som standard etter meldingssletting Meldinger Mappelister Tema + Tema for meldingsvisning + Tema for skriving Språk + Fast meldingstema + Velg meldingsvisningstema for visning av meldinger. + Bruk fast melding visningstema Systemstandard Bakgrunnssynkronisering Aldri Alltid Når «Autosynkronisering» er merket Velg alle + Maks mapper for å sjekke ved push 10 mapper 25 mapper 50 mapper @@ -604,6 +672,9 @@ Vis neste melding som standard etter meldingssletting 500 mapper 1000 mapper Animering + Bruk glorete visuelle effekter + Gester + Velg gest-kontroll Navigering med volumknapp I meldingsvisninger I listevisninger @@ -612,7 +683,9 @@ Vis neste melding som standard etter meldingssletting Slå av for raskere visning Tell søkeresultater Slå av for raskere visning + Gjem spesialkonti Skjul den samlede innboksen og alle meldingskontoer + %s %s - Stjernede - Uleste Alle meldinger @@ -622,7 +695,9 @@ Vis neste melding som standard etter meldingssletting Trykk på konvolutt eller stjerne for uleste eller stjernede meldinger Samle Alle meldinger vises i samlet innboks + Mapper å søke Alle + Visbare Ingen Skriftstørrelse Konfigurer skriftstørrelse @@ -641,14 +716,17 @@ Vis neste melding som standard etter meldingssletting Avsender Til Kopi + Flere meldingshoder Emne Tid og dato Meldingstekst %d%% %1$s: %2$s + Skrive melding + Tekstskrivingsfelt Standard Minst - Lavere + Bitteliten Mindre Liten Medium @@ -661,12 +739,14 @@ Vis neste melding som standard etter meldingssletting <ukjent> PGP/MIME-meldinger støttes ikke enda. Advarsel: vedlegg er IKKE signert eller kryptert enda. + Sending avbrudt Lagre utkast? Lagre eller Forkast denne meldingen? Forkast melding? Er du sikker på at du vil forkaste denne meldingen? Nekt å lagre utkast. Nekt å lagre utkast som er merket kryptert. + Velg tekst til å kopiere Bekreft sletting Vil du slette denne meldingen? @@ -683,6 +763,9 @@ Vis neste melding som standard etter meldingssletting Ja Nei Laster ned vedlegg + Feilsøk-logging aktivert + » + Kan ikke koble til. Importer & Eksporter innstillinger Eksporter kontoinnstillinger @@ -778,6 +861,7 @@ Vis neste melding som standard etter meldingssletting En nettverksforbindelse er nødvendig for søk på tjener. Dimme leste meldinger En grå bakgrunn vil vise at en melding har blitt lest + Trådvisning Gruppére meldinger etter samtale Oppgraderer databaser Oppgraderer databaser … @@ -791,23 +875,37 @@ Vis neste melding som standard etter meldingssletting Vis kontaktbilder Vis kontaktbilder i meldingslisten Oppfrisket %s + Oppdatert %s (Push aktivert) den %s Merk alle som lest Fargelegg kontaktbilder Fargelegg manglende kontaktbilder Synlige meldingshandlinger + Vis valgte handlinger i meldingsvisningmenyen Laster vedlegg … Sender melding Lagrer utkast Henter vedlegg … + Ikke mulig å autentisere. Tjeneren annonserer ikke at den har støtte for \"SASL EXTERNAL\". Dette kan være på grunn av et problem med klientsertifikatet (utgått, ukjent sertifiseringsinstans) eller andre konfigurasjonsproblem. Dekrypterer/Bekrefter … Dekryptering vellykket + Gyldig signatur (sertifisert) + Gyldig signatur, men ikke sertifisert + Ukjent signerer Ugyldig signatur Mangler offentlig nøkkel for denne signaturen + Vellykket dekryptering og gyldig signatur (sertifisert) + Vellykket dekryptering og gyldig signatur, men ikke sertifisert Vellykket dekryptering, men mangler offentlig nøkkel Se etter manglende nøkkel OpenPGP feil: BrukerID + Bruk klientsertifikat + Ingen klientsertifikat + Fjern klientsertifikatvalg + Klarte ikke å hente klientsertifikat for alias \"%s\" + Avanserte valg + Klientsertifikatet, \"%1$s\", er utgått eller er ikke gyldig ennå (%2$s) diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index f38e68cbf..d672d7b86 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -45,6 +45,7 @@ Graag foutrapporten, bijdrage nieuwe functies en vragen stellen op

    ]]> + -- \nVerstuurd vanaf mijn Android apparaat met K-9 Mail. Excuseer mijn beknoptheid. De account \"%s\" wordt verwijderd van K-9 Mail. Alle data voor \"%s\" wordt verwijderd van K-9 Mail, maar account instellingen blijven behouden. @@ -157,9 +158,6 @@ Graag foutrapporten, bijdrage nieuwe functies en vragen stellen op Account \"%s\" wissen Account \"%s\" opnieuw instellen Nieuwe mail - - %d nieuwe berichten - %d Ongelezen (%s) + %d meer op %s Antwoorden @@ -263,9 +261,12 @@ Graag foutrapporten, bijdrage nieuwe functies en vragen stellen op Standaard volgend bericht laten zien na verwijderen Bevestig acties Toon een dialoogvenster altijd wanneer u de geselecteerde acties uitvoert + Verwijder Gemarkeerd verwijderen (in bericht-view) Spam Verwijder (van notificaties) + Verwijder K-9 User-Agent van de mail headers + Gebruik UT als tijdzone in mail headers Verberg onderwerp in notificaties Nooit Als toestel gelocked is @@ -282,6 +283,7 @@ Graag foutrapporten, bijdrage nieuwe functies en vragen stellen op Een nieuwe account instellen E-mailadres Wachtwoord + Toon wachtwoord Handmatige setup Ophalen account informatie\u2026 @@ -301,9 +303,11 @@ Graag foutrapporten, bijdrage nieuwe functies en vragen stellen op Normaal wachtwoord Wachtwoord, onveilig verzonden Versleuteld wachtwoord + Cliënt certificaat Inkomende server instellingen Gebruikersnaam Wachtwoord + Cliënt certificaat POP3 server IMAP server WebDAV (Exchange) server @@ -313,6 +317,7 @@ Graag foutrapporten, bijdrage nieuwe functies en vragen stellen op Geen SSL/TLS STARTTLS + \"%1$s = %2$s\" is niet geldig met \"%3$s = %4$s\" Wanneer ik een bericht verwijder Verwijder niet van server Verwijder van server @@ -352,6 +357,7 @@ Graag foutrapporten, bijdrage nieuwe functies en vragen stellen op Gebruikersnaam Wachtwoord Authenticatie type + \"%1$s = %2$s\" is niet geldig met \"%3$s = %4$s\" Ongeldige setup: %s Account opties Compact @@ -399,6 +405,9 @@ Graag foutrapporten, bijdrage nieuwe functies en vragen stellen op alle berichten Kan bericht niet kopiëren of verplaatsen omdat deze niet gesynchroniseerd is met de server Setup kon niet afronden + Gebruikersnaam of wachtwoord ongeldig.\n(%s) + De server presenteerde een ongeldig SSL certificaat. Dit kan komen door een verkeerd geconfigureerde server. Dit kan ook komen doordat iemand U of Uw mailserver aan probeert te vallen. Als U niet zeker weet wat er aan de hand is klik dan op Reject en neem contact op met de beheerder van Uw mailserver.\n\n(%s) + Kan geen verbinding met server maken.\n(%s) Aanpassen details Doorgaan Geavanceerd @@ -406,6 +415,12 @@ Graag foutrapporten, bijdrage nieuwe functies en vragen stellen op Standaard account Standaard mail verzenden vanaf deze account Nieuwe mail notificatie + Notificatie mappen + Alles + Alleen 1e klas mappen + 1e en 2e klas mappen + Alles behalve 2e klas mappen + Geen Sync notificatie Je e-mailadres Notificatie in statusbalk wanneer nieuwe mail binnenkomt @@ -444,6 +459,7 @@ Graag foutrapporten, bijdrage nieuwe functies en vragen stellen op Quote voorvoegsel Cryptografie OpenPGP Provider + Geen OpenPGP provider geïnstalleerd Mappen poll controleer frequentie Opslag Account kleur @@ -521,6 +537,11 @@ Graag foutrapporten, bijdrage nieuwe functies en vragen stellen op 1e klasse 2e klasse Zelfde als sync klasse + Map notificatie klas + Geen + 1e klas + 2e klas + Zelfde als push klas Inkomende server Instellen van de inkomende mail server Uitgaande server @@ -602,6 +623,8 @@ Graag foutrapporten, bijdrage nieuwe functies en vragen stellen op Onbekend Certificaat Accepteer Sleutel Verwerp Sleutel + Del (or D) - Verwijder\nR - Beantwoorden\nA - Alles Beantwoorden\nC - Opstellen\nF - Doorsturen\nM - Verplaatsen\nV - Archiveren\nY - Kopie\nZ - Markeer (niet)gelezen\nG - Ster\nO - Sorteer type\nI - Sorteer volgorde\nQ - Terug naar mappen\nS - Selecteer/deselecteer\nJ or P - Vorig bericht\nK or N - Volgende Bericht + 1 - Laat alleen 1e klas mappen zien\n2 - Laat 1e en 2e klas mappen zien\n3 - Laat alles zien behalve 2e klas mappen\n4 - Laat alle mappen zien\nQ - Terug naar Accounts\nS - Aanpassen Account Instellingen map naam bevat Mappen Laat alle mappen zien @@ -694,6 +717,8 @@ Graag foutrapporten, bijdrage nieuwe functies en vragen stellen op Bericht onderwerp Bericht tijd en datum Bericht inhoud + %d%% + %1$s: %2$s Bericht opstellen Tekst input velden Standaard @@ -858,8 +883,20 @@ Graag foutrapporten, bijdrage nieuwe functies en vragen stellen op Bericht wordt verstuurd Concept wordt opgeslagen Bijlage ophalen… + Kan niet authenticeren. De server ondersteunt geen SASL EXTERNAL. Dit kan komen door een probleem met het client certificaat (verlopen of onbekende CA) of een ander configuratieprobleem. + Ontsleutelen/verificeren… + Ontsleutelen succesvol + Geldige handtekening (gecertificeerd) + Geldige handtekening ongecertificeerd + Onbekende ondertekenaar + Ongeldige pgp handtekening + Geen publieke sleutel voor deze handtekening + Zoek de missende sleutel OpenPGP Fout: Gebruikers-id + Gebruik cliënt certificaat + Geen cliënt certificaat + Geavanceerde opties diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index c12bc3148..4b39db55b 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -157,9 +157,6 @@ Wszelkie zgłoszenia usterek, zapytania oraz nowe pomysły prosimy przesyłać z Czyszczę konto \"%s\" Odtwarzam konto \"%s\" Nowa wiadomość - - Nowych wiadomości: %d - Nowe: %d (%s) + %d więcej na %s Odpowiedz @@ -283,6 +280,7 @@ Wszelkie zgłoszenia usterek, zapytania oraz nowe pomysły prosimy przesyłać z Dodaj konto Adres email Hasło + Pokaż hasło Ustaw ręcznie Pobieram informacje… @@ -405,6 +403,7 @@ Wszelkie zgłoszenia usterek, zapytania oraz nowe pomysły prosimy przesyłać z Konto domyślne Domyślnie wysyłaj wiadomości z tego konta Nowe wiadomości + Żadna Synchronizacja konta Twój adres email Powiadomiaj na pasku statusu, gdy jest nowa wiadomość @@ -520,6 +519,9 @@ Wszelkie zgłoszenia usterek, zapytania oraz nowe pomysły prosimy przesyłać z Klasa 1 Klasa 2 Taka sama jak klasa synchronizacji + Żadna + Klasa 1 + Klasa 2 Poczta przychodząca Ustawienia serwera poczty przychodzącej Poczta wychodząca @@ -858,4 +860,5 @@ Wszelkie zgłoszenia usterek, zapytania oraz nowe pomysły prosimy przesyłać z Błąd OpenPGP: ID użytkownika + Zaawansowane ustawienia diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml index eb8546786..483443b44 100644 --- a/res/values-pt-rBR/strings.xml +++ b/res/values-pt-rBR/strings.xml @@ -156,9 +156,6 @@ Por favor, nos envie relatórios de bugs, contribua para novas melhorias e faça Limpando conta \"%s\" Recriando conta \"%s\" Novo e-mail - - %d novas mensagens - %d não lidos (%s) + %d mais em %s Responder @@ -284,6 +281,7 @@ Por favor, nos envie relatórios de bugs, contribua para novas melhorias e faça Configurar uma nova conta Endereço de e-mail Senha + Exibir senha Configuração manual Recuperando informações de conta\u2026 @@ -401,6 +399,8 @@ Por favor, nos envie relatórios de bugs, contribua para novas melhorias e faça Todas as Mensagens Não é possível copiar ou mover uma mensagem que não foi sincronizada com o servidor A configuração não pode ser concluída + Usuário ou senha incorretos.\n(%s) + Não é possível conectar-se ao servidor.\n(%s) Editar detalhes Continuar Avançado @@ -408,6 +408,9 @@ Por favor, nos envie relatórios de bugs, contribua para novas melhorias e faça Conta padrão Usar esta conta como padrão para envio de e-mail Novas notificações de e-mail + Pastas de Notificações + Tudo + Nenhum Notificações de sincronização Seu endereço de e-mail Mostrar na barra de status quando um e-mail chegar diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 86191181e..9eacb0926 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -3,9 +3,9 @@ - Почта - Почта β - Почтовый ящик + K-9 Mail + K-9 Mail бета + K-9 Учетные записи Не прочитано Удалённое управление Разрешить удалённое управление настройками и действиями K-9 Mail @@ -158,9 +158,6 @@ K-9 Mail — почтовый клиент для Android. Очистка ящика \"%s\" Пересоздание ящика \"%s\" Новая почта - - %d новых - %d новых (%s) + %d в %s Ответить @@ -418,6 +415,12 @@ K-9 Mail — почтовый клиент для Android. Ящик по умолчанию По умолчанию отправлять почту с этого ящика Уведомить о почте + Папки уведомлений + Все + Папки 1-го класса + Папки 1-го и 2-го Класса + Все кроме папок 2-го Класса + Ничего Уведомить о проверке Ваш адрес email Показать уведомление о новой почте @@ -503,7 +506,7 @@ K-9 Mail — почтовый клиент для Android. 1 и 2 классы Кроме 2 класса Нет - Push папок + Push папки Все 1 класс 1 и 2 классы @@ -528,11 +531,16 @@ K-9 Mail — почтовый клиент для Android. 1 класс 2 класс Как видимости - Push + Папка push класса Нет 1 класс 2 класс Как синхронизации + Папка класса уведомлений + Ничего + 1-ый Класс + 2-ой Класс + Такой же как и push класс Сервер входящих Настройки сервера входящей почты Сервер исходящих diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index 3316105c6..40caf6221 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -158,9 +158,6 @@ Prosím, nahlasujte prípadné chyby, prispievajte novými funkciami a pýtajte Čistenie účtu \"%s\" Obnovovanie účtu \"%s\" Nová správa - - Počet nových správ: %d - Počet neprečítaných správ: %d v %s + ďalších %d v %s Odpovedať diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index 387be8a13..0e2e6f6f0 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -158,9 +158,6 @@ Anmäl fel, hjälp till med nya funktioner och ställ frågor på Rensar konto \"%s\" Återskapar konto \"%s\" Ny e-post - - %d nya meddelanden - %d olästa (%s) + %d ytterligare på %s Svara diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index d85b23162..a1f8ae820 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -4,7 +4,7 @@ K-9 Posta - K-9 Mail BETA + K-9 Posta BETA K-9 Hesaplar K-9 Okunmamış K-9 Posta\'ya uzaktan erişim @@ -45,6 +45,7 @@ Lütfen hata raporlarınızı, istediğiniz yeni özellikleri ve sorularınızı

    ]]>
    + -- \nAndroid için K-9 Posta\'dan gönderildi. Lütfen bu kısa notumu mazur görün. Hesap \"%s\" K-9 Mail\'den kaldırılacak. Bütün bilgi \"%s\" için K-9 Mail\'den kaldırılacak, fakat hesap ayarları korunacak. @@ -157,9 +158,6 @@ Lütfen hata raporlarınızı, istediğiniz yeni özellikleri ve sorularınızı Hesap temizleme \"%s\" Hesap yenileme \"%s\" Yeni posta - - %d yeni mesaj - %d Okunmadı (%s) %d daha fazla %s Yanıtla @@ -285,6 +283,7 @@ Lütfen hata raporlarınızı, istediğiniz yeni özellikleri ve sorularınızı Bir yeni hesap kurun E-posta adresi Şifre + Şifreyi göster El ile ayar Hesap bilgisi alınıyor\u2026 @@ -304,9 +303,11 @@ Lütfen hata raporlarınızı, istediğiniz yeni özellikleri ve sorularınızı Normal şifre Güvenlik olmadan gönderilen şifre Şifreli parola + İstemci sertifikası Gelen sunucu ayarları Kullanıcı adı Şifre + İstemci sertifikası POP3 sunucu IMAP sunucu Exchange sunucu @@ -316,6 +317,7 @@ Lütfen hata raporlarınızı, istediğiniz yeni özellikleri ve sorularınızı Hiçbiri SSL/TLS STARTTLS + \"%1$s = %2$s\" bununla uyuşmuyor \"%3$s = %4$s\" Bir mesaj sildiğim zaman Sunucudan silme Sunucudan sil @@ -355,6 +357,7 @@ Lütfen hata raporlarınızı, istediğiniz yeni özellikleri ve sorularınızı Kullanıcı Adı Şifre Kimlik Doğrulama Tipi + \"%1$s = %2$s\" bununla uyuşmuyor \"%3$s = %4$s\" Geçersiz kurulum: %s Hesap seçenekleri Hesabı sıkıştır @@ -402,6 +405,9 @@ Lütfen hata raporlarınızı, istediğiniz yeni özellikleri ve sorularınızı Bütün mesajlar Sunucu ile eşleştirilmemiş bir mesaj kopyalanamaz veya taşınamaz. Kurulum bitirilmedi + Kullanıcı adı veya şifre doğru değil.\n(%s) + Sunucu geçersiz bir SSL sertifikası sundu. Bu bazen sunucunun düzgün yapılandırılmamasından kaynaklanır. Bazen de birisi size saldırıyor olabilir. Eğer ne olduğunu bilmiyorsanız, Reddet\'e tıklayın ve posta sunucunuzu yöneten kişilerle iletişime geçin.\n\n(%s) + Sunucuya bağlanılamadı.\n(%s) Ayrıntıları düzenle Devam Gelişmiş @@ -409,6 +415,12 @@ Lütfen hata raporlarınızı, istediğiniz yeni özellikleri ve sorularınızı Varsayılan hesap Postayı varsayılan olarak bu hesaptan gönder Yeni posta bildirimleri + Bildirimler klasörü + Hepsi + Sadece 1. Sınıf klasörler + 1. ve 2. Sınıfı klasörler + 2. Sınıf klasörler dışında hepsi + Hiçbiri Eşleştirme bildirimleri E-posta adresiniz Posta geldiğinde durum çubuğunda bildir @@ -447,6 +459,7 @@ Lütfen hata raporlarınızı, istediğiniz yeni özellikleri ve sorularınızı Alınan metinden önek Şifreleme OpenPGP Sağlayıcı + Hiç OpenPGP Sağlayıcı yüklenmemiş Klasör veri toplama sıklığı Depolama Hesap rengi @@ -524,6 +537,11 @@ Lütfen hata raporlarınızı, istediğiniz yeni özellikleri ve sorularınızı 1. Sınıf 2. Sınıf Aynı senkranizayon sınıfı + Klasör bildirim sınıfı + Hiçbiri + 1. Sınıf + 2. Sınıf + İtme sınıfıyla aynı Gelen Sunucu Gelen posta sunucusunu yapılandır Giden sunucu @@ -605,6 +623,8 @@ Lütfen hata raporlarınızı, istediğiniz yeni özellikleri ve sorularınızı Tanınmayan Sertifika Kabul Tuşu Reddetme Tuşu + Del (veya D) - Sil\nR - Cevapla\nA - Hepsini Cevapla\nC - Yeni\nF - İlet\nM - Taşı\nV - Arşiv\nY - Kopyala\nZ - Okun(ma)mış olarak İşaretle\nG - Yıldız\nO - Sıralama tipi\nI - Sıralama sırası\nQ - Klasörlere Dön\nS - Seç/Seçimi iptal et\nK veya P - Önceji Mesaj\nK veya N - Sonraki Mesaj + 1 - Yalnız 1. sınıf klasörleri göster\n2 - Yalnız 1. ve 2. sınıf klasörleri göster\n3 - 2. Sınıf klasörler hariç hepsini göster\n4 - Bütün klasörleri göster\nQ - Hesaplara dön\nS - Hesap ayarlarını düzenle klasör adı şunu içeriyor Klasörler Bütün klasörleri göster @@ -863,6 +883,7 @@ Lütfen hata raporlarınızı, istediğiniz yeni özellikleri ve sorularınızı Mesaj gönderiliyor Taslak kaydediliyor Ekler alınıyor… + Yetkilendirme yapılamıyor. Sunucu SASL EXTERNAL kabiliyeti olduğunu bildirmedi. Bu istemci sertifikasıyla ilgili bir sorun (tarihi geçmiş, bilinmeyen sertifika otoritesi) veya yapılandırma sorunu olabilir. Şifre çözme/Doğrulama… Şifre çözme başarılı @@ -878,4 +899,10 @@ Lütfen hata raporlarınızı, istediğiniz yeni özellikleri ve sorularınızı OpenPGP Hatası: Kullanıcı Kimliği + İstemci sertifikası kullan + İstemci sertifikası yok + İstemci sertifikası seçimini kaldır + \"%s\" için istemci sertifikası alımı başarısız oldu + Gelişmiş seçenekler + İstemci sertifikası \"%1$s\" tarihi geçmiş veya artık geçerli değil (%2$s) diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index f4af452ca..6263b1c8d 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -156,9 +156,6 @@ K-9 Mail це поштовий клієнт з відкритим вихідни Очищення скриньки \"%s\" Відновлення облікового запису\"%s\" Нова пошта - - %d нові повідомлення - %d Непрочитане (%s) + %d більше на %s Відповісти @@ -261,6 +258,7 @@ K-9 Mail це поштовий клієнт з відкритим вихідни За замовчуванням показувати наступне повідомлення після вилучення Підтвердження дій Показати діалогове вікно щоразу, коли ви виконуєте вибрані дії + Видалити Вилучити позначені зірочкою (лише перегляд повідомлень) Спам Видалити (з сповіщення) @@ -386,6 +384,9 @@ K-9 Mail це поштовий клієнт з відкритим вихідни 250 повідомлень 500 повідомлень 1000 повідомлень + 2500 повідомлень + 5000 повідомлень + 10000 повідомлень усі повідомлення Не можна копіювати чи переміщувати повідомлення, яке не синхронізоване з сервером Налаштування не завершено diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index bee136bdf..754d8e367 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -44,6 +44,7 @@ K-9改进的功能包括:

    ]]>
    + -- \n使用 K-9 Mail 发送自我的Android设备。 账户“%s”将从K-9 Mail中删除。 账户“%s”的全部数据将从K-9 Mail中删除,但是账户设置将保留。 @@ -156,9 +157,6 @@ K-9改进的功能包括: 正在清理账户“%s 正在重建账户“%s 您有新邮件 - - %d 新邮件 - 您有%d封未读邮件(%s 再加载 %d 条信息, 账户 %s 回复 @@ -284,6 +282,7 @@ K-9改进的功能包括: 设置新账户 电子邮件地址 密码 + 显示密码 手工设置 正在获取账户信息\u2026 @@ -303,9 +302,11 @@ K-9改进的功能包括: 普通密码 非安全传输的密码 加密的密码 + 客户端证书 收件服务器设置 用户名 密码 + 客户端证书 POP3服务器 IMAP服务器 WebDAV (Exchange)服务器 @@ -315,6 +316,7 @@ K-9改进的功能包括: SSL/TLS STARTTLS + \"%1$s = %2$s\" 对于 \"%3$s = %4$s\" 无效 当我删除邮件时 不要从服务器上删除 立刻从服务器上删除 @@ -354,6 +356,7 @@ K-9改进的功能包括: 用户名 密码 身份验证方法 + \"%1$s = %2$s\" 对于 \"%3$s = %4$s\" 无效 无效的设置:%s 账户选项 压缩 @@ -401,6 +404,9 @@ K-9改进的功能包括: 所有邮件 没有与服务器同步的邮件无法进行拷贝或移动 无法完成设置 + 用户名或密码不正确。\n(%s) + 服务器提供了一个无效的SSL证书。有时候这是由于不正确的服务器配置导致的;有时候这也可能是由于某人正在试图攻击您或者您的邮件服务器。如果您不能确定到底是什么原因,请单击”拒绝“,并联系您的邮件服务器管理人员。\n\n(%s) + 无法连接到服务器。\n(%s) 编辑详细信息 继续 高级 @@ -408,6 +414,12 @@ K-9改进的功能包括: 默认账户 默认使用这个账户发送邮件 新邮件通知 + 提醒文件夹 + 全部 + 仅1级文件夹 + 1级和2级文件夹 + 除了2级以外的所有文件夹 + 同步通知 您的电子邮件地址 新邮件到达时在通知栏中显示通知 @@ -446,6 +458,7 @@ K-9改进的功能包括: 引用文本前缀 加密 OpenPGP 提供者 + 未安装OpenPGP提供程序 文件夹检查频率 存储 账户颜色 @@ -523,6 +536,11 @@ K-9改进的功能包括: 初级 次级 使用与同步级别相同的级别 + 文件夹提醒级别 + + 1级 + 2级 + 与推送级别相同 收件服务器 配置收件服务器 发件服务器 @@ -604,6 +622,8 @@ K-9改进的功能包括: 无法识别的证书信息 接收密钥 拒绝密钥 + Del (或者 D) - 删除\nR - 回复\nA - 回复所有人\nC - 编写新消息\nF - 转发\nM - 移动\nV - 归档\nY - 复制\nZ - 标记为已读/未读\nG - 加星标\nO - 排序类别\nI - 排序顺序\nQ - 返回文件夹\nS - 选择/取消选择\nJ 或者 P - 上一条消息\nK 或者 N - 下一条消息 + 1 - 仅显示1级文件夹\n2 - 显示1级和2级文件夹\n3 - 显示除2级以外的所有文件夹\n4 - 显示所有文件夹\nQ - 返回帐户\nS - 编辑帐户设置 文件夹名字里包含 文件夹 显示全部文件夹 @@ -857,6 +877,7 @@ K-9改进的功能包括: 消息正在发送 正在保存草稿 正在获取附件… + 无法认证。服务器未公告SASL EXTERNAL。这可能是由于客户端证书有问题(已过期,或者未知的认证机构),或者是由于其它的配置问题。 正在解密/验证… 解密成功 @@ -872,4 +893,10 @@ K-9改进的功能包括: OpenPGP 错误: 用户标识 + 使用客户端证书 + 无客户端证书 + 移客户端证书选择 + 无法获取别名 \"%s\" 的客户端证书 + 高级选项 + 客户端证书 \"%1$s\" 已经过期,或者尚未开始生效。 (%2$s) diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index 3244ba521..3cf136a1f 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -128,9 +128,6 @@ 正在清理帳戶「%s 正在重建帳戶「%s 您有新郵件 - - %d 新訊息 - 您有%d封未讀郵件(%s + 來自%s已超過%d則訊息 回覆 From 7cbea6e4b23b0e2404eddffc5e2fa38fa12ed0ff Mon Sep 17 00:00:00 2001 From: cketti Date: Sat, 6 Dec 2014 01:36:10 +0100 Subject: [PATCH 37/39] Prepare changelog for 5.103 --- res/xml/changelog_master.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/res/xml/changelog_master.xml b/res/xml/changelog_master.xml index 5e7667b1f..84865ad4f 100644 --- a/res/xml/changelog_master.xml +++ b/res/xml/changelog_master.xml @@ -8,6 +8,11 @@ They are automatically updated with "ant bump-version". --> + + Added ability to customize lock screen notifications (Android 5.0+ only) + Fixed a bug where a certificate error was wrongly reported + Updated translation + Improved 'open' functionality for attachments Removed APG legacy interface From 272a4bc1cf75b3401f042b849c46b9c46c01a072 Mon Sep 17 00:00:00 2001 From: cketti Date: Sat, 6 Dec 2014 01:37:08 +0100 Subject: [PATCH 38/39] Bump version to 5.103 --- AndroidManifest.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index bf987e168..16ce08390 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -2,8 +2,8 @@ + android:versionCode="23030" + android:versionName="5.103"> Date: Tue, 9 Dec 2014 00:41:10 +0100 Subject: [PATCH 39/39] Update compileSdkVersion to 21 and Gradle Android Plugin to 1.0.0 --- build.gradle | 2 +- plugins/Android-PullToRefresh/library/build.gradle | 2 +- plugins/HoloColorPicker/build.gradle | 2 +- plugins/ckChangeLog/library/build.gradle | 2 +- plugins/openpgp-api-library/build.gradle | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/build.gradle b/build.gradle index f9e4e3682..c92857eb6 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:1.0.0-rc4' + classpath 'com.android.tools.build:gradle:1.0.0' classpath 'com.jakewharton.sdkmanager:gradle-plugin:0.12.0' } } diff --git a/plugins/Android-PullToRefresh/library/build.gradle b/plugins/Android-PullToRefresh/library/build.gradle index e56d030f7..e018fa664 100644 --- a/plugins/Android-PullToRefresh/library/build.gradle +++ b/plugins/Android-PullToRefresh/library/build.gradle @@ -1,7 +1,7 @@ apply plugin: 'com.android.library' android { - compileSdkVersion 19 + compileSdkVersion 21 buildToolsVersion '20.0.0' sourceSets { diff --git a/plugins/HoloColorPicker/build.gradle b/plugins/HoloColorPicker/build.gradle index 6880741e9..91b9588e2 100644 --- a/plugins/HoloColorPicker/build.gradle +++ b/plugins/HoloColorPicker/build.gradle @@ -1,7 +1,7 @@ apply plugin: 'com.android.library' android { - compileSdkVersion 19 + compileSdkVersion 21 buildToolsVersion '20.0.0' sourceSets { diff --git a/plugins/ckChangeLog/library/build.gradle b/plugins/ckChangeLog/library/build.gradle index f03c2e2e6..cb5a771d3 100644 --- a/plugins/ckChangeLog/library/build.gradle +++ b/plugins/ckChangeLog/library/build.gradle @@ -1,7 +1,7 @@ apply plugin: 'com.android.library' android { - compileSdkVersion 19 + compileSdkVersion 21 buildToolsVersion '20.0.0' sourceSets { diff --git a/plugins/openpgp-api-library/build.gradle b/plugins/openpgp-api-library/build.gradle index 91d20ebf6..effba1e16 100644 --- a/plugins/openpgp-api-library/build.gradle +++ b/plugins/openpgp-api-library/build.gradle @@ -5,14 +5,14 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:0.12.2' + classpath 'com.android.tools.build:gradle:1.0.0' } } apply plugin: 'com.android.library' android { - compileSdkVersion 19 + compileSdkVersion 21 buildToolsVersion '20.0.0' // NOTE: We are using the old folder structure to also support Eclipse