diff --git a/README.md b/README.md index 946eb9f48..5db157c98 100644 --- a/README.md +++ b/README.md @@ -167,7 +167,7 @@ If you don’t want this simply pick a server which does not offer Push Notifica You can find a detailed description of how your server, the app server and FCM are interacting with each other in the [README](https://github.com/iNPUTmice/p2/blob/master/README.md) of the Conversations App Server. - ¹ Your server only needs to support the server side of [XEP-0357: Push Notifications](http://xmpp.org/extensions/xep-0357.html). If you use the Play Store version you do **not** need to run your own app server. The server modules are called *mod_cloud_notify* on Prosody and *mod_push* on ejabberd. + ¹ If you use the Play Store version you do **not** need to run your own app server. Your server only needs to support the server side of [XEP-0357: Push Notifications](http://xmpp.org/extensions/xep-0357.html) and [XEP-0198: Stream Management](https://xmpp.org/extensions/xep-0198.html). The prosody server modules are called *mod_cloud_notify* and *mod_smacks*. The ejabberd server modules are called *mod_push* and *mod_stream_mgmt*. #### But why do I need a permanent notification if I use Google Push? diff --git a/art/ic_received_indicator.svg b/art/ic_received_indicator.svg deleted file mode 100644 index 43689c267..000000000 --- a/art/ic_received_indicator.svg +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - - - diff --git a/art/open_pdf_black.svg b/art/open_pdf_black.svg new file mode 100644 index 000000000..0fa22285a --- /dev/null +++ b/art/open_pdf_black.svg @@ -0,0 +1,55 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/art/open_pdf_white.svg b/art/open_pdf_white.svg new file mode 100644 index 000000000..a307529bb --- /dev/null +++ b/art/open_pdf_white.svg @@ -0,0 +1,55 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/art/render.rb b/art/render.rb index 898ddbaa0..86a0ddf79 100755 --- a/art/render.rb +++ b/art/render.rb @@ -23,9 +23,10 @@ images = { 'play_gif_white.svg' => ['play_gif_white', 128], 'play_video_black.svg' => ['play_video_black', 128], 'play_gif_black.svg' => ['play_gif_black', 128], + 'open_pdf_black.svg' => ['open_pdf_black', 128], + 'open_pdf_white.svg' => ['open_pdf_white', 128], 'conversations_mono.svg' => ['conversations/ic_notification', 24], 'quicksy_mono.svg' => ['quicksy/ic_notification', 24], - 'ic_received_indicator.svg' => ['ic_received_indicator', 12], 'ic_send_text_offline.svg' => ['ic_send_text_offline', 36], 'ic_send_text_offline_white.svg' => ['ic_send_text_offline_white', 36], 'ic_send_text_online.svg' => ['ic_send_text_online', 36], diff --git a/build.gradle b/build.gradle index 0ebc91ab6..68bc21c7e 100644 --- a/build.gradle +++ b/build.gradle @@ -91,7 +91,7 @@ android { minSdkVersion 16 targetSdkVersion 25 versionCode 363 - versionName "2.6.4.1" + versionName "2.7.0-beta" archivesBaseName += "-$versionName" applicationId "eu.sum7.conversations" resValue "string", "applicationId", applicationId diff --git a/src/conversations/res/values-es/strings.xml b/src/conversations/res/values-es/strings.xml index 148d47732..c6a5371d4 100644 --- a/src/conversations/res/values-es/strings.xml +++ b/src/conversations/res/values-es/strings.xml @@ -5,4 +5,7 @@ Crear nueva cuenta ¿Ya tienes una cuenta XMPP? Este puede ser el caso si ya estás usando un cliente XMPP diferente o has usado Conversations anteriormente. Si no es así, puedes crear una nueva cuenta XMPP ahora mismo.\nConsejo: Algunos proveedores de email también ofrecen una cuenta XMPP. XMPP es una red de mensajería instantánea independiente del proveedor. Puedes usar este cliente con cualquier servidor XMPP que elijas.\nSin embargo, para tu conveniencia, hacemos de forma sencilla la creación de una cuenta en chat.sum7.eu; un proveedor especializado para el uso con Conversations + Has sido invitado a %1$s. Te guiaremos durante el proceso de creación de la cuenta.\nCuando selecciones %1$s como proveedor podrás comunicarte con usuarios de otros servidores proporcionándoles tu dirección XMPP completa. + Has sido invitado a %1$s. Un nombre de usuario ya ha sido escogido para ti. Te guiaremos durante el proceso de creación de la cuenta.\nPodrás comunicarte con otros usuarios de otros servidores proporcionándoles tu dirección XMPP completa. + Tu invitación al servidor diff --git a/src/conversations/res/values-fr/strings.xml b/src/conversations/res/values-fr/strings.xml index f921580e6..8b9bf1d2d 100644 --- a/src/conversations/res/values-fr/strings.xml +++ b/src/conversations/res/values-fr/strings.xml @@ -5,4 +5,7 @@ Créer un nouveau compte Avez-vous déjà un compte XMPP ? Cela peut être le cas si vous utilisez déjà un autre client XMPP ou si vous avez déjà utilisé Conversations auparavant. Sinon, vous pouvez créer un nouveau compte XMPP dès maintenant. Remarque : Certains fournisseurs de messagerie proposent également des comptes XMPP. XMPP est un réseau de messagerie instantanée indépendant du fournisseur. Vous pouvez utiliser ce client avec n\'importe quel serveur XMPP de votre choix. Toutefois, pour votre commodité, nous avons facilité la création d\'un compte sur chat.sum7.eu ; un fournisseur spécialement conçu pour l\'utilisation avec Conversations. + Vous avez été invité à %1$s. Nous vous guiderons dans le processus de création d\'un compte.\nEn choisissant %1$s comme fournisseur, vous pourrez communiquer avec les utilisateurs d\'autres fournisseurs en leur donnant votre adresse XMPP complète. + Vous avez été invité par %1$s . Un nom d\'utilisateur a déjà été choisi pour vous. Nous vous guiderons dans le processus de création d\'un compte. Vous pourrez communiquer avec les utilisateurs d\'autres fournisseurs en leur donnant votre adresse XMPP complète. + Votre invitation au serveur diff --git a/src/conversations/res/values-it/strings.xml b/src/conversations/res/values-it/strings.xml index a01e869c8..06bf0ae0b 100644 --- a/src/conversations/res/values-it/strings.xml +++ b/src/conversations/res/values-it/strings.xml @@ -7,4 +7,7 @@ Suggerimento: alcuni provider di email forniscono anche un account XMPP. XMPP è una rete di instant messaging indipendente dal provider. Puoi usare questo client con qualsiasi server XMPP. In ogni caso per facilitare puoi creare facilmente un account su chat.sum7.eu, un provider pensato apposta per essere usato con Conversations. + Sei stato invitato su %1$s. Ti guideremo nel procedimento per creare un account.\nQuando scegli %1$s come fornitore sarai in grado di comunicare con utenti di altri fornitori dando loro l\'indirizzo XMPP completo. + Sei stato invitato su %1$s. È già stato scelto un nome utente per te. Ti guideremo nel procedimento per creare un account.\nSarai in grado di comunicare con utenti di altri fornitori dando loro l\'indirizzo XMPP completo. + Il tuo invito al server diff --git a/src/conversations/res/values-uk/strings.xml b/src/conversations/res/values-uk/strings.xml index 354b59915..02aa6c853 100644 --- a/src/conversations/res/values-uk/strings.xml +++ b/src/conversations/res/values-uk/strings.xml @@ -4,5 +4,5 @@ Скористатися chat.sum7.eu Створити новий обліковий запис Вже маєте обліковий запис XMPP? Можливо, користуєтеся іншою програмою XMPP або користувалися цією програмою раніше. Якщо ні, можете створити новий обліковий запис XMPP просто зараз.\nЗверніть увагу: Деякі постачальники електронної пошти водночас надають облікові записи XMPP. - XMPP — це мережа обміну повідомленнями, незалежна від постачальників. Можете використовувати цю програму з будь-яким XMPP сервером, який оберете.\nПроте, для зручності, ми спростили створення облікового запису на conversations.im¹ — в постачальника, який спеціально налаштований на роботу з цією програмою. + XMPP — це мережа обміну повідомленнями, незалежна від постачальників. Можете використовувати цю програму з будь-яким XMPP сервером, який оберете.\nПроте, для зручності, ми спростили створення облікового запису на chat.sum7.eu — в постачальника, який спеціально налаштований на роботу з цією програмою. diff --git a/src/conversations/res/values-zh-rCN/strings.xml b/src/conversations/res/values-zh-rCN/strings.xml index f8845a88d..8b7c54156 100644 --- a/src/conversations/res/values-zh-rCN/strings.xml +++ b/src/conversations/res/values-zh-rCN/strings.xml @@ -4,4 +4,8 @@ 使用 chat.sum7.eu 创建新账户 您已经拥有一个XMPP账户了吗?如果您之前使用过其他的XMPP客户端的话,那么您已经拥有这种账户了。如果没有账户的话,您可以现在创建一个。\n提示:有些电子邮件服务也提供XMPP账户。 - + XMPP是独立于提供程序的即时消息网络。 您可以将此客户端与所选的任何XMPP服务器一起使用。\ n不过,为了您的方便,我们很容易在对话中创建帐户。im¹; 特别适合与“对话”配合使用的提供商。 + 您已受邀参加%1$s。 我们将指导您完成创建帐户的过程。\n选择%1$s作为提供者后,您可以通过提供其他人的完整XMPP地址与其他提供者的用户进行交流。 + 您已受邀参加%1$s。 已经为您选择了一个用户名。 我们将指导您完成创建帐户的过程。\n您可以通过向其他提供商的用户提供完整的XMPP地址来与他们进行交流。 + 你的服务器邀请 + diff --git a/src/main/java/eu/siacs/conversations/Config.java b/src/main/java/eu/siacs/conversations/Config.java index ff0bbb1b3..d58bd2e21 100644 --- a/src/main/java/eu/siacs/conversations/Config.java +++ b/src/main/java/eu/siacs/conversations/Config.java @@ -100,7 +100,7 @@ public final class Config { public static final boolean REMOVE_BROKEN_DEVICES = false; public static final boolean OMEMO_PADDING = false; public static final boolean PUT_AUTH_TAG_INTO_KEY = true; - public static final boolean TWELVE_BYTE_IV = false; + public static final boolean TWELVE_BYTE_IV = true; public static final boolean USE_BOOKMARKS2 = false; diff --git a/src/main/java/eu/siacs/conversations/entities/Account.java b/src/main/java/eu/siacs/conversations/entities/Account.java index fdc5634da..365df734e 100644 --- a/src/main/java/eu/siacs/conversations/entities/Account.java +++ b/src/main/java/eu/siacs/conversations/entities/Account.java @@ -508,13 +508,7 @@ public class Account extends AbstractEntity implements AvatarService.Avatarable } } - public boolean hasBookmarkFor(final Jid jid) { - synchronized (this.bookmarks) { - return this.bookmarks.containsKey(jid.asBareJid()); - } - } - - Bookmark getBookmark(final Jid jid) { + public Bookmark getBookmark(final Jid jid) { synchronized (this.bookmarks) { return this.bookmarks.get(jid.asBareJid()); } diff --git a/src/main/java/eu/siacs/conversations/parser/MessageParser.java b/src/main/java/eu/siacs/conversations/parser/MessageParser.java index ed7f6ad96..a57f0eec8 100644 --- a/src/main/java/eu/siacs/conversations/parser/MessageParser.java +++ b/src/main/java/eu/siacs/conversations/parser/MessageParser.java @@ -452,6 +452,7 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece if (conversation.getMucOptions().isSelf(counterpart)) { status = Message.STATUS_SEND_RECEIVED; isCarbon = true; //not really carbon but received from another resource + //TODO this would be the place to change the body after something like mod_pastebin if (mXmppConnectionService.markMessage(conversation, remoteMsgId, status, serverMsgId)) { return; } else if (remoteMsgId == null || Config.IGNORE_ID_REWRITE_IN_MUC) { diff --git a/src/main/java/eu/siacs/conversations/persistance/FileBackend.java b/src/main/java/eu/siacs/conversations/persistance/FileBackend.java index 57a129f70..8958278eb 100644 --- a/src/main/java/eu/siacs/conversations/persistance/FileBackend.java +++ b/src/main/java/eu/siacs/conversations/persistance/FileBackend.java @@ -11,6 +11,7 @@ import android.graphics.Color; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.RectF; +import android.graphics.pdf.PdfRenderer; import android.media.MediaMetadataRetriever; import android.media.MediaScannerConnection; import android.net.Uri; @@ -25,6 +26,7 @@ import android.system.Os; import android.system.StructStat; import android.util.Base64; import android.util.Base64OutputStream; +import android.util.DisplayMetrics; import android.util.Log; import android.util.LruCache; @@ -59,6 +61,7 @@ import eu.siacs.conversations.services.AttachFileToConversationRunnable; import eu.siacs.conversations.services.XmppConnectionService; import eu.siacs.conversations.ui.RecordingActivity; import eu.siacs.conversations.ui.util.Attachment; +import eu.siacs.conversations.utils.Compatibility; import eu.siacs.conversations.utils.CryptoHelper; import eu.siacs.conversations.utils.ExifHelper; import eu.siacs.conversations.utils.FileUtils; @@ -421,18 +424,22 @@ public class FileBackend { } public Bitmap getPreviewForUri(Attachment attachment, int size, boolean cacheOnly) { - final String key = "attachment_" + attachment.getUuid().toString() + "_" + String.valueOf(size); + final String key = "attachment_" + attachment.getUuid().toString() + "_" + size; final LruCache cache = mXmppConnectionService.getBitmapCache(); Bitmap bitmap = cache.get(key); if (bitmap != null || cacheOnly) { return bitmap; } - if (attachment.getMime() != null && attachment.getMime().startsWith("video/")) { + final String mime = attachment.getMime(); + if ("application/pdf".equals(mime) && Compatibility.runsTwentyOne()) { + bitmap = cropCenterSquarePdf(attachment.getUri(), size); + drawOverlay(bitmap, paintOverlayBlackPdf(bitmap) ? R.drawable.open_pdf_black : R.drawable.open_pdf_white, 0.75f); + } else if (mime != null && mime.startsWith("video/")) { bitmap = cropCenterSquareVideo(attachment.getUri(), size); drawOverlay(bitmap, paintOverlayBlack(bitmap) ? R.drawable.play_video_black : R.drawable.play_video_white, 0.75f); } else { bitmap = cropCenterSquare(attachment.getUri(), size); - if (bitmap != null && "image/gif".equals(attachment.getMime())) { + if (bitmap != null && "image/gif".equals(mime)) { Bitmap withGifOverlay = bitmap.copy(Bitmap.Config.ARGB_8888, true); drawOverlay(withGifOverlay, paintOverlayBlack(withGifOverlay) ? R.drawable.play_gif_black : R.drawable.play_gif_white, 1.0f); bitmap.recycle(); @@ -509,7 +516,6 @@ public class FileBackend { } - public DownloadableFile getFileForPath(String path) { return getFileForPath(path, MimeUtils.guessMimeTypeFromExtension(MimeUtils.extractRelevantExtension(path))); } @@ -818,10 +824,12 @@ public class FileBackend { } DownloadableFile file = getFile(message); final String mime = file.getMimeType(); - if (mime.startsWith("video/")) { + if ("application/pdf".equals(mime) && Compatibility.runsTwentyOne()) { + thumbnail = getPdfDocumentPreview(file, size); + } else if (mime.startsWith("video/")) { thumbnail = getVideoPreview(file, size); } else { - Bitmap fullsize = getFullsizeImagePreview(file, size); + Bitmap fullsize = getFullSizeImagePreview(file, size); if (fullsize == null) { throw new FileNotFoundException(); } @@ -840,7 +848,7 @@ public class FileBackend { return thumbnail; } - private Bitmap getFullsizeImagePreview(File file, int size) { + private Bitmap getFullSizeImagePreview(File file, int size) { BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = calcSampleSize(file, size); try { @@ -882,6 +890,21 @@ public class FileBackend { return record < 0; } + private boolean paintOverlayBlackPdf(final Bitmap bitmap) { + final int h = bitmap.getHeight(); + final int w = bitmap.getWidth(); + int white = 0; + for (int y = 0; y < h; ++y) { + for (int x = 0; x < w; ++x) { + int pixel = bitmap.getPixel(x, y); + if ((Color.red(pixel) * 0.299 + Color.green(pixel) * 0.587 + Color.blue(pixel) * 0.114) > 186) { + white++; + } + } + } + return white > (h * w * 0.4f); + } + private Bitmap cropCenterSquareVideo(Uri uri, int size) { MediaMetadataRetriever metadataRetriever = new MediaMetadataRetriever(); Bitmap frame; @@ -897,8 +920,8 @@ public class FileBackend { } } - private Bitmap getVideoPreview(File file, int size) { - MediaMetadataRetriever metadataRetriever = new MediaMetadataRetriever(); + private Bitmap getVideoPreview(final File file, final int size) { + final MediaMetadataRetriever metadataRetriever = new MediaMetadataRetriever(); Bitmap frame; try { metadataRetriever.setDataSource(file.getAbsolutePath()); @@ -913,6 +936,49 @@ public class FileBackend { return frame; } + @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) + private Bitmap getPdfDocumentPreview(final File file, final int size) { + try { + final ParcelFileDescriptor fileDescriptor = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY); + final Bitmap rendered = renderPdfDocument(fileDescriptor, size, true); + drawOverlay(rendered, paintOverlayBlackPdf(rendered) ? R.drawable.open_pdf_black : R.drawable.open_pdf_white, 0.75f); + return rendered; + } catch (IOException e) { + Log.d(Config.LOGTAG, "unable to render PDF document preview", e); + final Bitmap placeholder = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888); + placeholder.eraseColor(0xff000000); + return placeholder; + } + } + + + @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) + private Bitmap cropCenterSquarePdf(final Uri uri, final int size) { + try { + ParcelFileDescriptor fileDescriptor = mXmppConnectionService.getContentResolver().openFileDescriptor(uri, "r"); + final Bitmap bitmap = renderPdfDocument(fileDescriptor, size, false); + return cropCenterSquare(bitmap, size); + } catch (Exception e) { + final Bitmap placeholder = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888); + placeholder.eraseColor(0xff000000); + return placeholder; + } + } + + @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) + private Bitmap renderPdfDocument(ParcelFileDescriptor fileDescriptor, int targetSize, boolean fit) throws IOException { + final PdfRenderer pdfRenderer = new PdfRenderer(fileDescriptor); + final PdfRenderer.Page page = pdfRenderer.openPage(0); + final Dimensions dimensions = scalePdfDimensions(new Dimensions(page.getHeight(), page.getWidth()), targetSize, fit); + final Bitmap rendered = Bitmap.createBitmap(dimensions.width, dimensions.height, Bitmap.Config.ARGB_8888); + rendered.eraseColor(0xffffffff); + page.render(rendered, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY); + page.close(); + pdfRenderer.close(); + fileDescriptor.close(); + return rendered; + } + public Uri getTakePhotoUri() { File file; if (Config.ONLY_INTERNAL_STORAGE) { @@ -1210,14 +1276,22 @@ public class FileBackend { final boolean image = message.getType() == Message.TYPE_IMAGE || (mime != null && mime.startsWith("image/")); final boolean video = mime != null && mime.startsWith("video/"); final boolean audio = mime != null && mime.startsWith("audio/"); + final boolean pdf = "application/pdf".equals(mime); final StringBuilder body = new StringBuilder(); if (url != null) { body.append(url.toString()); } body.append('|').append(file.getSize()); - if (image || video) { + if (image || video || (pdf && Compatibility.runsTwentyOne())) { try { - Dimensions dimensions = image ? getImageDimensions(file) : getVideoDimensions(file); + final Dimensions dimensions; + if (video) { + dimensions = getVideoDimensions(file); + } else if (pdf && Compatibility.runsTwentyOne()) { + dimensions = getPdfDocumentDimensions(file); + } else { + dimensions = getImageDimensions(file); + } if (dimensions.valid()) { body.append('|').append(dimensions.width).append('|').append(dimensions.height); } @@ -1264,6 +1338,49 @@ public class FileBackend { return getVideoDimensions(metadataRetriever); } + @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) + private Dimensions getPdfDocumentDimensions(final File file) { + final ParcelFileDescriptor fileDescriptor; + try { + fileDescriptor = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY); + if (fileDescriptor == null) { + return new Dimensions(0, 0); + } + } catch (FileNotFoundException e) { + return new Dimensions(0, 0); + } + try { + final PdfRenderer pdfRenderer = new PdfRenderer(fileDescriptor); + final PdfRenderer.Page page = pdfRenderer.openPage(0); + final int height = page.getHeight(); + final int width = page.getWidth(); + page.close(); + pdfRenderer.close(); + return scalePdfDimensions(new Dimensions(height, width)); + } catch (IOException e) { + Log.d(Config.LOGTAG, "unable to get dimensions for pdf document", e); + return new Dimensions(0, 0); + } + } + + private Dimensions scalePdfDimensions(Dimensions in) { + final DisplayMetrics displayMetrics = mXmppConnectionService.getResources().getDisplayMetrics(); + final int target = (int) (displayMetrics.density * 288); + return scalePdfDimensions(in, target, true); + } + + private static Dimensions scalePdfDimensions(final Dimensions in, final int target, final boolean fit) { + final int w, h; + if (fit == (in.width <= in.height)) { + w = Math.max((int) (in.width / ((double) in.height / target)), 1); + h = target; + } else { + w = target; + h = Math.max((int) (in.height / ((double) in.width / target)), 1); + } + return new Dimensions(h, w); + } + public Bitmap getAvatar(String avatar, int size) { if (avatar == null) { return null; @@ -1275,10 +1392,6 @@ public class FileBackend { return bm; } - public boolean isFileAvailable(Message message) { - return getFile(message).exists(); - } - private static class Dimensions { public final int width; public final int height; diff --git a/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java b/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java index f3f4ded42..abfae615b 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java @@ -454,7 +454,11 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers setTitle(mucOptions.isPrivateAndNonAnonymous() ? R.string.action_muc_details : R.string.channel_details); this.binding.editMucNameButton.setVisibility((self.getAffiliation().ranks(MucOptions.Affiliation.OWNER) || mucOptions.canChangeSubject()) ? View.VISIBLE : View.GONE); this.binding.detailsAccount.setText(getString(R.string.using_account, account)); - this.binding.jid.setText(mConversation.getJid().asBareJid().toEscapedString()); + if (mConversation.isPrivateAndNonAnonymous()) { + this.binding.jid.setText(getString(R.string.hosted_on, mConversation.getJid().getDomain())); + } else { + this.binding.jid.setText(mConversation.getJid().asBareJid().toEscapedString()); + } AvatarWorkerTask.loadAvatar(mConversation, binding.yourPhoto, R.dimen.avatar_on_details_screen_size); String roomName = mucOptions.getName(); String subject = mucOptions.getSubject(); @@ -490,7 +494,7 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers this.binding.mucRole.setText(getStatus(self)); if (mucOptions.getSelf().getAffiliation().ranks(MucOptions.Affiliation.OWNER)) { this.binding.mucSettings.setVisibility(View.VISIBLE); - this.binding.mucConferenceType.setText(MucConfiguration.describe(this,mucOptions)); + this.binding.mucConferenceType.setText(MucConfiguration.describe(this, mucOptions)); } else if (!mucOptions.isPrivateAndNonAnonymous() && mucOptions.nonanonymous()) { this.binding.mucSettings.setVisibility(View.VISIBLE); this.binding.mucConferenceType.setText(R.string.group_chat_will_make_your_jabber_id_public); diff --git a/src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java b/src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java index a75ef519b..6b9880ad5 100644 --- a/src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java @@ -1032,10 +1032,12 @@ public class StartConversationActivity extends XmppActivity implements XmppConne } if (isBookmarkChecked) { - if (account.hasBookmarkFor(conferenceJid)) { - layout.setError(getString(R.string.bookmark_already_exists)); + Bookmark bookmark = account.getBookmark(conferenceJid); + if (bookmark != null) { + dialog.dismiss(); + openConversationsForBookmark(bookmark); } else { - final Bookmark bookmark = new Bookmark(account, conferenceJid.asBareJid()); + bookmark = new Bookmark(account, conferenceJid.asBareJid()); bookmark.setAutojoin(getBooleanPreference("autojoin", R.bool.autojoin)); final String nick = conferenceJid.getResource(); if (nick != null && !nick.isEmpty() && !nick.equals(MucOptions.defaultNick(account))) { @@ -1145,6 +1147,10 @@ public class StartConversationActivity extends XmppActivity implements XmppConne final AdapterView.AdapterContextMenuInfo acmi = (AdapterContextMenuInfo) menuInfo; if (mResContextMenu == R.menu.conference_context) { activity.conference_context_id = acmi.position; + final Bookmark bookmark = (Bookmark) activity.conferences.get(acmi.position); + final Conversation conversation = bookmark.getConversation(); + final MenuItem share = menu.findItem(R.id.context_share_uri); + share.setVisible(conversation == null || !conversation.isPrivateAndNonAnonymous()); } else if (mResContextMenu == R.menu.contact_context) { activity.contact_context_id = acmi.position; final Contact contact = (Contact) activity.contacts.get(acmi.position); @@ -1155,7 +1161,7 @@ public class StartConversationActivity extends XmppActivity implements XmppConne showContactDetailsItem.setVisible(false); } deleteContactMenuItem.setVisible(contact.showInRoster() && !contact.getOption(Contact.Options.SYNCED_VIA_OTHER)); - XmppConnection xmpp = contact.getAccount().getXmppConnection(); + final XmppConnection xmpp = contact.getAccount().getXmppConnection(); if (xmpp != null && xmpp.getFeatures().blocking() && !contact.isSelf()) { if (contact.isBlocked()) { blockUnblockItem.setTitle(R.string.unblock_contact); diff --git a/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java b/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java index 016eb46fb..c68bc537b 100644 --- a/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java +++ b/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java @@ -539,15 +539,15 @@ public class MessageAdapter extends ArrayAdapter implements CopyTextVie this.audioPlayer.init(audioPlayer, message); } - private void displayImageMessage(ViewHolder viewHolder, final Message message, final boolean darkBackground) { + private void displayMediaPreviewMessage(ViewHolder viewHolder, final Message message, final boolean darkBackground) { toggleWhisperInfo(viewHolder, message, darkBackground); viewHolder.download_button.setVisibility(View.GONE); viewHolder.audioPlayer.setVisibility(View.GONE); viewHolder.image.setVisibility(View.VISIBLE); - FileParams params = message.getFileParams(); - double target = metrics.density * 288; - int scaledW; - int scaledH; + final FileParams params = message.getFileParams(); + final double target = metrics.density * 288; + final int scaledW; + final int scaledH; if (Math.max(params.height, params.width) * metrics.density <= target) { scaledW = (int) (params.width * metrics.density); scaledH = (int) (params.height * metrics.density); @@ -746,7 +746,7 @@ public class MessageAdapter extends ArrayAdapter implements CopyTextVie } } else if (message.isFileOrImage() && message.getEncryption() != Message.ENCRYPTION_PGP && message.getEncryption() != Message.ENCRYPTION_DECRYPTION_FAILED) { if (message.getFileParams().width > 0 && message.getFileParams().height > 0) { - displayImageMessage(viewHolder, message, darkBackground); + displayMediaPreviewMessage(viewHolder, message, darkBackground); } else if (message.getFileParams().runtime > 0) { displayAudioMessage(viewHolder, message, darkBackground); } else { diff --git a/src/main/java/eu/siacs/conversations/ui/adapter/UserAdapter.java b/src/main/java/eu/siacs/conversations/ui/adapter/UserAdapter.java index 521e55da8..aa0d5e172 100644 --- a/src/main/java/eu/siacs/conversations/ui/adapter/UserAdapter.java +++ b/src/main/java/eu/siacs/conversations/ui/adapter/UserAdapter.java @@ -111,6 +111,8 @@ public class UserAdapter extends ListAdapter= Build.VERSION_CODES.O; + public static boolean runsTwentyOne() { + return Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP; } - public static boolean runsTwentyFour() { + private static boolean runsTwentyFour() { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.N; } + public static boolean runsTwentySix() { + return Build.VERSION.SDK_INT >= Build.VERSION_CODES.O; + } + public static boolean twentyEight() { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.P; } diff --git a/src/main/java/eu/siacs/conversations/xml/XmlElementReader.java b/src/main/java/eu/siacs/conversations/xml/XmlElementReader.java new file mode 100644 index 000000000..cce6fc163 --- /dev/null +++ b/src/main/java/eu/siacs/conversations/xml/XmlElementReader.java @@ -0,0 +1,20 @@ +package eu.siacs.conversations.xml; + +import com.google.common.io.ByteSource; + +import java.io.IOException; +import java.io.InputStream; + +public class XmlElementReader { + + public static Element read(byte[] bytes) throws IOException { + return read(ByteSource.wrap(bytes).openStream()); + } + + public static Element read(InputStream inputStream) throws IOException { + final XmlReader xmlReader = new XmlReader(); + xmlReader.setInputStream(inputStream); + return xmlReader.readElement(xmlReader.readTag()); + } + +} diff --git a/src/main/java/eu/siacs/conversations/xml/XmlReader.java b/src/main/java/eu/siacs/conversations/xml/XmlReader.java index 1540e5f61..240b92b7a 100644 --- a/src/main/java/eu/siacs/conversations/xml/XmlReader.java +++ b/src/main/java/eu/siacs/conversations/xml/XmlReader.java @@ -87,8 +87,7 @@ public class XmlReader implements Closeable { return null; } - public Element readElement(Tag currentTag) throws XmlPullParserException, - IOException { + public Element readElement(Tag currentTag) throws IOException { Element element = new Element(currentTag.getName()); element.setAttributes(currentTag.getAttributes()); Tag nextTag = this.readTag(); diff --git a/src/main/res/drawable-hdpi/open_pdf_black.png b/src/main/res/drawable-hdpi/open_pdf_black.png new file mode 100644 index 000000000..a94935def Binary files /dev/null and b/src/main/res/drawable-hdpi/open_pdf_black.png differ diff --git a/src/main/res/drawable-hdpi/open_pdf_white.png b/src/main/res/drawable-hdpi/open_pdf_white.png new file mode 100644 index 000000000..ddfb33656 Binary files /dev/null and b/src/main/res/drawable-hdpi/open_pdf_white.png differ diff --git a/src/main/res/drawable-mdpi/open_pdf_black.png b/src/main/res/drawable-mdpi/open_pdf_black.png new file mode 100644 index 000000000..0d7191603 Binary files /dev/null and b/src/main/res/drawable-mdpi/open_pdf_black.png differ diff --git a/src/main/res/drawable-mdpi/open_pdf_white.png b/src/main/res/drawable-mdpi/open_pdf_white.png new file mode 100644 index 000000000..2403468c0 Binary files /dev/null and b/src/main/res/drawable-mdpi/open_pdf_white.png differ diff --git a/src/main/res/drawable-xhdpi/open_pdf_black.png b/src/main/res/drawable-xhdpi/open_pdf_black.png new file mode 100644 index 000000000..755a14e85 Binary files /dev/null and b/src/main/res/drawable-xhdpi/open_pdf_black.png differ diff --git a/src/main/res/drawable-xhdpi/open_pdf_white.png b/src/main/res/drawable-xhdpi/open_pdf_white.png new file mode 100644 index 000000000..bba78987a Binary files /dev/null and b/src/main/res/drawable-xhdpi/open_pdf_white.png differ diff --git a/src/main/res/drawable-xxhdpi/open_pdf_black.png b/src/main/res/drawable-xxhdpi/open_pdf_black.png new file mode 100644 index 000000000..952dc0932 Binary files /dev/null and b/src/main/res/drawable-xxhdpi/open_pdf_black.png differ diff --git a/src/main/res/drawable-xxhdpi/open_pdf_white.png b/src/main/res/drawable-xxhdpi/open_pdf_white.png new file mode 100644 index 000000000..e550b574c Binary files /dev/null and b/src/main/res/drawable-xxhdpi/open_pdf_white.png differ diff --git a/src/main/res/drawable-xxxhdpi/open_pdf_black.png b/src/main/res/drawable-xxxhdpi/open_pdf_black.png new file mode 100644 index 000000000..361414e89 Binary files /dev/null and b/src/main/res/drawable-xxxhdpi/open_pdf_black.png differ diff --git a/src/main/res/drawable-xxxhdpi/open_pdf_white.png b/src/main/res/drawable-xxxhdpi/open_pdf_white.png new file mode 100644 index 000000000..95611f496 Binary files /dev/null and b/src/main/res/drawable-xxxhdpi/open_pdf_white.png differ diff --git a/src/main/res/values-ar/strings.xml b/src/main/res/values-ar/strings.xml index e53a6789c..2727dceba 100644 --- a/src/main/res/values-ar/strings.xml +++ b/src/main/res/values-ar/strings.xml @@ -219,7 +219,6 @@ دمر القناة لم نتمكن مِن تدمير فريق المحادثة لم نتمكن مِن تدمير القناة - موجوده بالمفضلة سابقا تعديل موضوع مجموعة المحادثة الموضوع في صدد الإنظمام إلى مجموعة المحادثة ... diff --git a/src/main/res/values-bg/strings.xml b/src/main/res/values-bg/strings.xml index 3676db05d..ac241ffd9 100644 --- a/src/main/res/values-bg/strings.xml +++ b/src/main/res/values-bg/strings.xml @@ -221,7 +221,6 @@ Унищожаване на груповия разговор Наистина ли искате да унищожите този групов разговор?\n\nВнимание: Груповият разговор ще бъде премахнат от сървъра. Груповият разговор не може да бъде унищожен - Вече съществува такава отметка Редактиране на темата на груповия разговор Тема Присъединяване в групов разговор… diff --git a/src/main/res/values-ca/strings.xml b/src/main/res/values-ca/strings.xml index 2889d54d2..42dfa6499 100644 --- a/src/main/res/values-ca/strings.xml +++ b/src/main/res/values-ca/strings.xml @@ -221,7 +221,6 @@ Elimina dels marcadors Destrueix el xat en grup Destrueix el canal - Aquest marcador ja existeix Edita el tema del xat de grup Assumpte S\'està unint al xat de grup… diff --git a/src/main/res/values-cs/strings.xml b/src/main/res/values-cs/strings.xml index d8d186302..55230764c 100644 --- a/src/main/res/values-cs/strings.xml +++ b/src/main/res/values-cs/strings.xml @@ -191,7 +191,6 @@ Vstoupit Uložit jako záložku Smazat záložku - Tato záložka již existuje Odejít Kontakt přidán do seznamu Opět přidat diff --git a/src/main/res/values-de/strings.xml b/src/main/res/values-de/strings.xml index b0a0b7db6..6f7e93786 100644 --- a/src/main/res/values-de/strings.xml +++ b/src/main/res/values-de/strings.xml @@ -236,7 +236,6 @@ Bist du sicher, dass du diesen öffentlichen Channel löschen willst?\n\nAchtung: Der Channel wird dabei vollständig auf dem Server gelöscht. Gruppenchat konnte nicht gelöscht werden Channel konnte nicht gelöscht werden - Die Konferenz befindet sich bereits auf deiner Kontaktliste Gruppenchatthema bearbeiten Thema Gruppenchat wird beigetreten… @@ -557,6 +556,7 @@ Privatsphäre Design Wähle die Farbpalette aus + Automatisch Helles Design Dunkles Design Verbindung zu OpenKeychain nicht möglich diff --git a/src/main/res/values-el/strings.xml b/src/main/res/values-el/strings.xml index 05a27fa01..eb99b3141 100644 --- a/src/main/res/values-el/strings.xml +++ b/src/main/res/values-el/strings.xml @@ -234,7 +234,6 @@ Είστε βέβαιοι ότι θέλετε να καταστρέψετε αυτό το δημόσιο κανάλι;\n\nΠροσοχή:Το κανάλι θα διαγραφεί πλήρως από τον διακομιστή. Δεν ήταν δυνατή η καταστροφή της ομαδικής συζήτησης Δεν ήταν δυνατή η καταστροφή του καναλιού - Αυτός ο σελιδοδείκτης υπάρχει ήδη Επεξεργασία θέματος ομαδικής συζήτησης Θέμα Συμμετοχή σε ομαδική συζήτηση... diff --git a/src/main/res/values-es/strings.xml b/src/main/res/values-es/strings.xml index c9b90ace8..e31f04c55 100644 --- a/src/main/res/values-es/strings.xml +++ b/src/main/res/values-es/strings.xml @@ -155,6 +155,7 @@ El identificador ya está en uso Registro completado El servidor no soporta registros + Token de registro inválido Error de negociación TLS Policy violation Servidor incompatible @@ -235,7 +236,6 @@ ¿Estás seguro de que quieres destruir este canal público?\n\nAviso:El canal será eliminado completamente en el servidor. No se ha podido destruir la conversación en grupo No se ha podido destruir el canal - Este marcador ya existe Editar asunto de la conversación Asunto Uniéndose a conversación... @@ -556,6 +556,7 @@ Privacidad Tema Selecciona el color de la paleta + Automático Tema claro Tema oscuro No se ha podido conectar a OpenKeychain diff --git a/src/main/res/values-eu/strings.xml b/src/main/res/values-eu/strings.xml index f4334ef9c..1f6aa6a6e 100644 --- a/src/main/res/values-eu/strings.xml +++ b/src/main/res/values-eu/strings.xml @@ -234,7 +234,6 @@ Kanal publiko hau deuseztatu nahi duzu?\n\nAbisua: Kanala zerbitzaritik guztiz kenduko da. Ezin izan da taldea deuseztatu Ezin izan da kanala deuseztatu - Laster-marka hau existitzen da dagoeneko Taldearen gaia editatu Gaia Taldera batzen... diff --git a/src/main/res/values-fr/strings.xml b/src/main/res/values-fr/strings.xml index d40f547db..54459d2e4 100644 --- a/src/main/res/values-fr/strings.xml +++ b/src/main/res/values-fr/strings.xml @@ -235,7 +235,6 @@ Êtes-vous sûr de vouloir détruire ce canal public? \ On \ Avertissement: le canal sera complètement supprimé du serveur. Impossible de détruire le chat en groupe Impossible de détruire le canal - Le favori existe déjà Modifier le sujet de la conversation de groupe Sujet Rejoindre la conversation de groupe @@ -842,7 +841,7 @@ N\'importe qui peut inviter d\'autres personnes. Les adresses XMPP sont visibles par les administrateurs. Les adresses XMPP sont visibles par tous. - Ce canal publique n\'a pas de participants. Invitez vos contacts ou utilisez le bouton de partage pour distribuer son adresse XMPP. + Ce canal public n\'a pas de participants. Invitez vos contacts ou utilisez le bouton de partage pour distribuer son adresse XMPP. Ce chat de groupe privé n\'a aucun participant. Gérer les privilèges Rechercher des participants diff --git a/src/main/res/values-gl/strings.xml b/src/main/res/values-gl/strings.xml index acaad6dc6..32a7ea038 100644 --- a/src/main/res/values-gl/strings.xml +++ b/src/main/res/values-gl/strings.xml @@ -34,7 +34,7 @@ enviando… Descifrando a mensaxe. Por favor agarde... Mensaxe cifrado con OpenPGP - O apodo xa está en uso + O alcume xa está en uso Alcume non válido Admin Dono @@ -93,7 +93,7 @@ Enviar mensaxe cifrada con OMEMO Enviar mensaxe cifrada v\\OMEMO Enviar mensaxe cifrado con OpenPGP - Modificouse o teu apodo + Modificouse o teu alcume Enviar sen cifrar Fallou o descifrado. Quizábeis non teñas a clave privada apropiada. OpenKeychain @@ -236,7 +236,6 @@ Está segura de que quere eliminar o canal?\n\nAviso: O canal eliminarase completamente do servidor. Non se desfixo a conversa en grupo Non se puido eliminar o canal - Este marcador xa existe Editar o tema da conversa en grupo Asunto Entrando na conversa en grupo @@ -557,6 +556,7 @@ Intimidade Decorado Escolla a gama de cores + Automático Decorado claro Decorado escuro Non se puido conectar con OpenKeychain diff --git a/src/main/res/values-hu/strings.xml b/src/main/res/values-hu/strings.xml index 958812f78..edbe10a9b 100644 --- a/src/main/res/values-hu/strings.xml +++ b/src/main/res/values-hu/strings.xml @@ -236,7 +236,6 @@ Biztosan meg szeretné szüntetni ezt a nyilvános csatornát?\n\nFigyelmeztetés: A csatorna teljesen el lesz távolítva a kiszolgálóról. Nem sikerült megszüntetni a csoportos csevegést Nem sikerült megszüntetni a csatornát - A könyvjelző már létezik Csoportos csevegés tárgyának szerkesztése Téma Csatlakozás csoportos csevegéshez… diff --git a/src/main/res/values-id/strings.xml b/src/main/res/values-id/strings.xml index a0352c89e..fb098f521 100644 --- a/src/main/res/values-id/strings.xml +++ b/src/main/res/values-id/strings.xml @@ -172,7 +172,6 @@ Gabung Simpan sebagai bookmark Hapus bookmark - Bookmark ini sudah ada Tinggalkan Kontak ditambahkan ke daftar anda Tambah kembali diff --git a/src/main/res/values-it/strings.xml b/src/main/res/values-it/strings.xml index c92bda396..5b0b549c3 100644 --- a/src/main/res/values-it/strings.xml +++ b/src/main/res/values-it/strings.xml @@ -155,6 +155,7 @@ Nome utente già in uso Registrazione completata Il Server non supporta la registrazione + Token di registrazione non valido Negoziazione TLS fallita Violazione della policy Server non compatibile @@ -235,7 +236,6 @@ Sei sicuro di voler distruggere questo canale pubblico?\n\nAttenzione: il canale verrà completamente rimosso sul server. Distruzione della chat di gruppo fallita Distruzione canale fallita - Questo segnalibro esiste già Modifica titolo chat di gruppo Argomento Ingresso nella chat di gruppo... @@ -556,6 +556,7 @@ Privacy Tema Seleziona il colore + Automatico Tema chiaro Tema scuro Impossibile connettersi a OpenKeychain @@ -877,4 +878,8 @@ Metodo di scoperta canali Backup Al riguardo + + Vedi %1$d partecipante + Vedi %1$d partecipanti + diff --git a/src/main/res/values-iw/strings.xml b/src/main/res/values-iw/strings.xml index 7300c187e..f64ca7ad6 100644 --- a/src/main/res/values-iw/strings.xml +++ b/src/main/res/values-iw/strings.xml @@ -164,7 +164,6 @@ הצטרף שמור בתור סימנייה מחק סימנייה - סימנייה זו כבר קיימת עזוב איש קשר הוסיף אותך אל רשימת קשר הוסף בחזרה diff --git a/src/main/res/values-ja/strings.xml b/src/main/res/values-ja/strings.xml index 4ddd4917f..93c4b7473 100644 --- a/src/main/res/values-ja/strings.xml +++ b/src/main/res/values-ja/strings.xml @@ -226,7 +226,6 @@ グループチャットを破棄する このグループチャットを破棄してもよろしいですか?\n\n警告: グループチャットはサーバーから完全に削除されます。 グループチャットを削除できません - このブックマークはすでに存在します 談話室の題を編集 トピック 談話室に参加しています… diff --git a/src/main/res/values-ko/strings.xml b/src/main/res/values-ko/strings.xml index 943a8a0e0..536a59753 100644 --- a/src/main/res/values-ko/strings.xml +++ b/src/main/res/values-ko/strings.xml @@ -192,7 +192,6 @@ 참석 즐겨찾기로 저장 즐겨찾기 삭제 - 즐겨찾기가 이미 존재합니다 퇴장 연락처가 당신을 연락처 목록에 추가했습니다 Add back diff --git a/src/main/res/values-nb-rNO/strings.xml b/src/main/res/values-nb-rNO/strings.xml index 149313e75..c55cafd36 100644 --- a/src/main/res/values-nb-rNO/strings.xml +++ b/src/main/res/values-nb-rNO/strings.xml @@ -204,7 +204,6 @@ Ta del i Lagre som bokmerke Slett bokmerke - Dette bokmerket finnes allerede Endre gruppesludringsemne Tar del i gruppesludring… Forlat diff --git a/src/main/res/values-nl/strings.xml b/src/main/res/values-nl/strings.xml index bb099a5b4..7e1201df2 100644 --- a/src/main/res/values-nl/strings.xml +++ b/src/main/res/values-nl/strings.xml @@ -234,7 +234,6 @@ Weet je zeker dat je dit openbare kanaal wilt vernietigen?\n\nWaarschuwing: Dit kanaal wordt volledig verwijderd van de server. Kan groepsgesprek niet vernietigen Kan kanaal niet vernietigen - Deze bladwijzer bestaat al Gespreksonderwerp bewerken Onderwerp Deelnemen aan groepsgesprek… diff --git a/src/main/res/values-pl/strings.xml b/src/main/res/values-pl/strings.xml index 162da6607..8c1e45e05 100644 --- a/src/main/res/values-pl/strings.xml +++ b/src/main/res/values-pl/strings.xml @@ -236,7 +236,6 @@ Czy na pewno chcesz usunąć ten kanał publiczny?\n\nOstrzeżenie: Ten kanał zostanie całkowicie usunięty z serwera. Usuwanie konferencji nieudane Nie można usunąć kanału - Zakładka już istnieje Edytuj tytuł konferencji Temat Dołączanie do konferencji @@ -560,6 +559,7 @@ Prywatność Skórka Wybierz paletę kolorów + Automatycznie Jasna skórka Ciemna skórka Nie można połączyć się z OpenKeychain diff --git a/src/main/res/values-pt-rBR/strings.xml b/src/main/res/values-pt-rBR/strings.xml index ddc3bd0f3..5cee06e8e 100644 --- a/src/main/res/values-pt-rBR/strings.xml +++ b/src/main/res/values-pt-rBR/strings.xml @@ -236,7 +236,6 @@ Tem certeza que deseja destruir esse canal público?\n\nAtenção: O canal será removido completamente do servidor. Não foi possível destruir a conversa em grupo Não foi possível destruir o canal - Esse favorito já existe Editar o assunto da conversa em grupo Tópico Entrando na conversa em grupo... diff --git a/src/main/res/values-pt/strings.xml b/src/main/res/values-pt/strings.xml index 6bccb60fa..30f52a823 100644 --- a/src/main/res/values-pt/strings.xml +++ b/src/main/res/values-pt/strings.xml @@ -199,7 +199,6 @@ Juntar Guardar como favorito Apagar favorito - O favorito já existe Editar tema da conversa em grupo Tópico Sair diff --git a/src/main/res/values-ro-rRO/strings.xml b/src/main/res/values-ro-rRO/strings.xml index a45eb22b7..16246c0e8 100644 --- a/src/main/res/values-ro-rRO/strings.xml +++ b/src/main/res/values-ro-rRO/strings.xml @@ -27,7 +27,7 @@ Alegeți contactele Partajează cu cont Listă contacte blocate - în acest moment + acum acum un minut acum %d minute %d conversații necitite @@ -86,7 +86,7 @@ Șterge fișierul Sigur doriți să ștergeți acest fișier?\n\nAtenție: Această acțiune nu va șterge copiile acestui fișier care sunt stocate pe alte dispozitive sau servere. Închide conversația după ștergere - Alegeți dispozitiv + Alege dispozitiv Trimite mesaje necriptate Trimite mesaj Trimite mesaj către %s @@ -135,7 +135,7 @@ Trimite actualizări de prezență Primește actualizări de prezență Cere actualizări de prezență - Alegeți o imagine + Alege o imagine Fă o poză Acorda anticipat cererea de abonare Fișierul selectat nu este o imagine @@ -236,7 +236,6 @@ Sigur doriți distrugerea acestui canal public?\n\nAtenție: Canalul public v-a fi complet șters de pe server. Nu s-a putut distruge discuția de grup Nu s-a putut distruge canalul - Acest semn de carte există deja Editează subiectul discuției de grup Subiect discuție Vă alăturați discuției de grup... @@ -323,7 +322,7 @@ Se restaurează din copia de siguranță Copia de siguranță a fost restaurată Nu uitați să activați contul. - Alegeți un fișier + Alege un fișier Primesc %1$s (%2$d%% complet) Descarcă %s Șterge %s @@ -560,6 +559,7 @@ sau chiar pierderea mesajelor.\nÎn continuare veți fi rugați să dezactivați Intimitate Temă Selecție paletă culori interfață + Automată Luminoasă Întunecată Nu s-a putut contacta OpenKeychain diff --git a/src/main/res/values-ru/strings.xml b/src/main/res/values-ru/strings.xml index c192ba618..a6e369994 100644 --- a/src/main/res/values-ru/strings.xml +++ b/src/main/res/values-ru/strings.xml @@ -221,7 +221,6 @@ Удалить закладку Уничтожить конференцию Уничтожить канал - Такая закладка уже существует Редактировать тему конференции Тема Вход в конференцию… diff --git a/src/main/res/values-sk/strings.xml b/src/main/res/values-sk/strings.xml index 2c88c6796..1908493ec 100644 --- a/src/main/res/values-sk/strings.xml +++ b/src/main/res/values-sk/strings.xml @@ -161,7 +161,6 @@ Vstúpiť Uložiť ako záložku Vymazať záložku - Táto záložka už existuje Odísť Kontakt pridaný do zoznamu Znova pridať diff --git a/src/main/res/values-sr/strings.xml b/src/main/res/values-sr/strings.xml index f74530ec4..e5579ae9c 100644 --- a/src/main/res/values-sr/strings.xml +++ b/src/main/res/values-sr/strings.xml @@ -208,7 +208,6 @@ Придружи се Сачувај као обележивач Обриши обележивач - Овај обележивач већ постоји Уреди предмет групног ћаскања Тема Улазим у групно ћаскање… diff --git a/src/main/res/values-sv/strings.xml b/src/main/res/values-sv/strings.xml index 3ef3eee0e..bb842740f 100644 --- a/src/main/res/values-sv/strings.xml +++ b/src/main/res/values-sv/strings.xml @@ -221,7 +221,6 @@ Gå med Spara som bokmärke Ta bort bokmärke - Detta bokmärke finns redan Ämne Går med i gruppchatt... Lämna diff --git a/src/main/res/values-tr-rTR/strings.xml b/src/main/res/values-tr-rTR/strings.xml index fab1f77d4..d53969318 100644 --- a/src/main/res/values-tr-rTR/strings.xml +++ b/src/main/res/values-tr-rTR/strings.xml @@ -192,7 +192,6 @@ Katıl Yer imi olarak kaydet Yer imini sil - Bu yer imi zaten mevcut Ayrıl Kişi sizi listesine ekledi Siz de ekleyin diff --git a/src/main/res/values-uk/strings.xml b/src/main/res/values-uk/strings.xml index bc0b778c0..b43305870 100644 --- a/src/main/res/values-uk/strings.xml +++ b/src/main/res/values-uk/strings.xml @@ -232,7 +232,6 @@ Упевнені, що бажаєте знищити цей публічний канал?\n\nУвага: Канал буде повністю знищено та видалено з сервера. Видалити цей груповий чат не вдалось Не вдалося знищити канал - Ця закладка вже існує Редагувати тему групи Тема Приєднання до групи… diff --git a/src/main/res/values-vi/strings.xml b/src/main/res/values-vi/strings.xml index 2335bdd05..82bbfc97f 100644 --- a/src/main/res/values-vi/strings.xml +++ b/src/main/res/values-vi/strings.xml @@ -192,7 +192,6 @@ Tham gia Lưu thành đánh dấu Xoá đánh dấu - Đã có đánh dấu này rồi Rời khỏi Liên hệ đã thêm bạn vào danh bạ Thêm họ vào diff --git a/src/main/res/values-zh-rCN/strings.xml b/src/main/res/values-zh-rCN/strings.xml index 7c19a277d..32526494d 100644 --- a/src/main/res/values-zh-rCN/strings.xml +++ b/src/main/res/values-zh-rCN/strings.xml @@ -119,6 +119,7 @@ 铃声 收到新消息时响铃 静默期限 + 在您的其他设备之一上检测到活动之后,时间通知的长度将被静音。 高级 从不发送崩溃报告 通过发送堆栈跟踪,您可以帮助Conversations持续发展 @@ -154,6 +155,7 @@ 用户名已存在 注册完成 服务器不支持注册 + 无效的注册令牌 TLS 协商失败 违反政策 服务器不兼容 @@ -234,7 +236,6 @@ 您确定要解散此公共频道吗?\n\n警告:该频道将在服务器上完全删除。 无法解散群聊 无法解散频道 - 该书签已存在 编辑群聊主题 主题 正在加入群聊… @@ -332,6 +333,7 @@ 可以下载 %s 取消传输 文件传输失败 + 文件传输已取消 文件已经删除 没有可以打开此文件的应用 没有可以打开此链接的应用 @@ -504,6 +506,7 @@ 禁用通知 暂停通知 图像压缩 + 提示:使用“选择文件”而不是“选择图片”来发送未经压缩的单个图像,无论此设置如何。 总是 启用节电模式 你的设备正在为Conversations进行电池优化,这可能导致通知的延迟甚至消息的丢失。 @@ -857,4 +860,6 @@ 请输入此账户的密码 无法执行此操作 加入公开群聊 + 备份 + 关于 diff --git a/src/main/res/values-zh-rTW/strings.xml b/src/main/res/values-zh-rTW/strings.xml index bd3878209..47c9b400f 100644 --- a/src/main/res/values-zh-rTW/strings.xml +++ b/src/main/res/values-zh-rTW/strings.xml @@ -196,7 +196,6 @@ 加入 保存為書簽 刪除書簽 - 該書簽已存在 離開 連絡人已添加你到連絡人列表 反向添加 diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index 6f81d37df..526a57d8a 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -236,7 +236,6 @@ Are you sure you want to destroy this public channel?\n\nWarning: The channel will be completely removed on the server. Could not destroy group chat Could not destroy channel - This bookmark already exists Edit group chat subject Topic Joining group chat… @@ -293,6 +292,7 @@ The group chat was shut down You are no longer in this group chat using account %s + hosted on %s Checking %s on HTTP host You are not connected. Try again later Check %s size diff --git a/src/quicksy/AndroidManifest.xml b/src/quicksy/AndroidManifest.xml index 24b2f5e2f..ed68582b3 100644 --- a/src/quicksy/AndroidManifest.xml +++ b/src/quicksy/AndroidManifest.xml @@ -10,12 +10,12 @@ + android:launchMode="singleTop" /> + android:launchMode="singleTop" /> - + + android:padding="16dp" + android:text="@string/enter_your_name_instructions" + android:textAppearance="@style/TextAppearance.Conversations.Body1" /> +