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 @@
-
-
-
-
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 @@
+
+
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 @@
+
+
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 compteAvez-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 marcadorsDestrueix el xat en grupDestrueix el canal
- Aquest marcador ja existeixEdita el tema del xat de grupAssumpteS\'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 @@
VstoupitUložit jako záložkuSmazat záložku
- Tato záložka již existujeOdejítKontakt přidán do seznamuOpě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 werdenChannel konnte nicht gelöscht werden
- Die Konferenz befindet sich bereits auf deiner KontaktlisteGruppenchatthema bearbeitenThemaGruppenchat wird beigetreten…
@@ -557,6 +556,7 @@
PrivatsphäreDesignWähle die Farbpalette aus
+ AutomatischHelles DesignDunkles DesignVerbindung 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 usoRegistro completadoEl servidor no soporta registros
+ Token de registro inválidoError de negociación TLSPolicy violationServidor 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 grupoNo se ha podido destruir el canal
- Este marcador ya existeEditar asunto de la conversaciónAsuntoUniéndose a conversación...
@@ -556,6 +556,7 @@
PrivacidadTemaSelecciona el color de la paleta
+ AutomáticoTema claroTema oscuroNo 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 deuseztatuEzin izan da kanala deuseztatu
- Laster-marka hau existitzen da dagoenekoTaldearen gaia editatuGaiaTaldera 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 groupeImpossible de détruire le canal
- Le favori existe déjàModifier le sujet de la conversation de groupeSujetRejoindre 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ègesRechercher 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 usoAlcume non válidoAdminDono
@@ -93,7 +93,7 @@
Enviar mensaxe cifrada con OMEMOEnviar mensaxe cifrada v\\OMEMOEnviar mensaxe cifrado con OpenPGP
- Modificouse o teu apodo
+ Modificouse o teu alcumeEnviar sen cifrarFallou 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 grupoNon se puido eliminar o canal
- Este marcador xa existeEditar o tema da conversa en grupoAsuntoEntrando na conversa en grupo
@@ -557,6 +556,7 @@
IntimidadeDecoradoEscolla a gama de cores
+ AutomáticoDecorado claroDecorado escuroNon 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éstNem sikerült megszüntetni a csatornát
- A könyvjelző már létezikCsoportos csevegés tárgyának szerkesztéseTémaCsatlakozá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 @@
GabungSimpan sebagai bookmarkHapus bookmark
- Bookmark ini sudah adaTinggalkanKontak ditambahkan ke daftar andaTambah 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 usoRegistrazione completataIl Server non supporta la registrazione
+ Token di registrazione non validoNegoziazione TLS fallitaViolazione della policyServer 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 fallitaDistruzione canale fallita
- Questo segnalibro esiste giàModifica titolo chat di gruppoArgomentoIngresso nella chat di gruppo...
@@ -556,6 +556,7 @@
PrivacyTemaSeleziona il colore
+ AutomaticoTema chiaroTema scuroImpossibile connettersi a OpenKeychain
@@ -877,4 +878,8 @@
Metodo di scoperta canaliBackupAl 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 iLagre som bokmerkeSlett bokmerke
- Dette bokmerket finnes alleredeEndre gruppesludringsemneTar 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 vernietigenKan kanaal niet vernietigen
- Deze bladwijzer bestaat alGespreksonderwerp bewerkenOnderwerpDeelnemen 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 nieudaneNie można usunąć kanału
- Zakładka już istniejeEdytuj tytuł konferencjiTematDołączanie do konferencji
@@ -560,6 +559,7 @@
PrywatnośćSkórkaWybierz paletę kolorów
+ AutomatycznieJasna skórkaCiemna skórkaNie 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 grupoNão foi possível destruir o canal
- Esse favorito já existeEditar o assunto da conversa em grupoTópicoEntrando 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 @@
JuntarGuardar como favoritoApagar favorito
- O favorito já existeEditar tema da conversa em grupoTópicoSair
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 contactelePartajează cu contListă contacte blocate
- în acest moment
+ acumacum un minutacum %d minute%d conversații necitite
@@ -86,7 +86,7 @@
Șterge fișierulSigur 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 dispozitivTrimite mesaje necriptateTrimite mesajTrimite 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 imagineFă o pozăAcorda anticipat cererea de abonareFiș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 grupNu s-a putut distruge canalul
- Acest semn de carte există dejaEditează subiectul discuției de grupSubiect discuțieVă 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șierPrimesc %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
IntimitateTemă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žkuVymazať záložku
- Táto záložka už existujeOdísťKontakt pridaný do zoznamuZnova 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å medSpara som bokmärkeTa bort bokmärke
- Detta bokmärke finns redanÄmneGå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ılYer imi olarak kaydetYer imini sil
- Bu yer imi zaten mevcutAyrılKişi sizi listesine eklediSiz 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 giaLưu thành đánh dấuXoá đánh dấu
- Đã có đánh dấu này rồiRời khỏiLiê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 chatCould not destroy channel
- This bookmark already existsEdit group chat subjectTopicJoining group chat…
@@ -293,6 +292,7 @@
The group chat was shut downYou are no longer in this group chatusing account %s
+ hosted on %sChecking %s on HTTP hostYou are not connected. Try again laterCheck %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" />
+
+ android:textColor="?colorAccent" />
diff --git a/src/quicksy/res/layout/activity_enter_number.xml b/src/quicksy/res/layout/activity_enter_number.xml
index ba2e3c1ff..b76faba19 100644
--- a/src/quicksy/res/layout/activity_enter_number.xml
+++ b/src/quicksy/res/layout/activity_enter_number.xml
@@ -6,103 +6,108 @@
android:layout_height="match_parent"
android:orientation="vertical">
-
+
+
-
-
-
+ android:layout_height="match_parent"
+ android:fillViewport="true">
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ android:gravity="center_horizontal"
+ android:padding="16dp"
+ android:text="@string/enter_country_code_and_phone_number"
+ android:textAppearance="@style/TextAppearance.Conversations.Body1" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/quicksy/res/layout/activity_verify.xml b/src/quicksy/res/layout/activity_verify.xml
index 6d9d13ef4..b46aa0910 100644
--- a/src/quicksy/res/layout/activity_verify.xml
+++ b/src/quicksy/res/layout/activity_verify.xml
@@ -154,8 +154,9 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
+ android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
- android:text="@string/next"/>
+ android:text="@string/next" />
@@ -182,8 +184,8 @@
style="?android:attr/progressBarStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_centerHorizontal="true"
- android:layout_below="@+id/pin_box" />
+ android:layout_below="@+id/pin_box"
+ android:layout_centerHorizontal="true" />
diff --git a/src/quicksy/res/layout/country_item.xml b/src/quicksy/res/layout/country_item.xml
index 27cf5b320..47e50d910 100644
--- a/src/quicksy/res/layout/country_item.xml
+++ b/src/quicksy/res/layout/country_item.xml
@@ -1,25 +1,30 @@
+
+ android:background="?android:selectableItemBackground"
+ android:padding="16dp">
+
+ android:text="Germany"
+ android:textAppearance="@style/TextAppearance.Conversations.Subhead.Bold" />
+
+ android:text="+49"
+ android:textAppearance="@style/TextAppearance.Conversations.Subhead.Bold.Secondary" />