aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian S <christian@pix-art.de>2015-08-24 11:24:04 +0200
committerChristian S <christian@pix-art.de>2015-08-24 11:24:04 +0200
commitc3abe068063fea43b9e1d42955962ea8281049d1 (patch)
tree5adcc2ce6a0400b76fc2a69ac8a399603ede133e
parentf4a2e4f2ce9361cadbd7ef96c45a90d9b29626d4 (diff)
parentdfe58eaf341efe988f80faf5dc888900d28aa37a (diff)
Merge branch 'development'
-rw-r--r--CHANGELOG.md17
-rw-r--r--build.gradle8
-rw-r--r--src/main/AndroidManifest.xml2
-rw-r--r--src/main/java/eu/siacs/conversations/crypto/axolotl/AxolotlService.java247
-rw-r--r--src/main/java/eu/siacs/conversations/crypto/sasl/ScramSha1.java3
-rw-r--r--src/main/java/eu/siacs/conversations/entities/Conversation.java8
-rw-r--r--src/main/java/eu/siacs/conversations/parser/IqParser.java12
-rw-r--r--src/main/java/eu/siacs/conversations/persistance/FileBackend.java13
-rw-r--r--src/main/java/eu/siacs/conversations/services/MessageArchiveService.java2
-rw-r--r--src/main/java/eu/siacs/conversations/services/NotificationService.java22
-rw-r--r--src/main/java/eu/siacs/conversations/services/XmppConnectionService.java107
-rw-r--r--src/main/java/eu/siacs/conversations/utils/MimeUtils.java2
-rw-r--r--src/main/java/eu/siacs/conversations/utils/PhoneHelper.java2
-rw-r--r--src/main/java/eu/siacs/conversations/xml/Element.java5
-rw-r--r--src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java245
-rw-r--r--src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnection.java9
-rw-r--r--src/main/java/eu/siacs/conversations/xmpp/jingle/JingleInbandTransport.java2
-rw-r--r--src/main/java/eu/siacs/conversations/xmpp/stanzas/AbstractAcknowledgeableStanza.java17
-rw-r--r--src/main/java/eu/siacs/conversations/xmpp/stanzas/AbstractStanza.java8
-rw-r--r--src/main/java/eu/siacs/conversations/xmpp/stanzas/IqPacket.java7
-rw-r--r--src/main/java/eu/siacs/conversations/xmpp/stanzas/MessagePacket.java2
-rw-r--r--src/main/java/eu/siacs/conversations/xmpp/stanzas/PresencePacket.java2
-rw-r--r--src/main/res/layout/activity_publish_profile_picture.xml4
-rw-r--r--src/main/res/layout/contact.xml1
-rw-r--r--src/main/res/layout/conversation_list_row.xml2
-rw-r--r--src/main/res/values-bg/strings.xml48
-rw-r--r--src/main/res/values-ca/strings.xml1
-rw-r--r--src/main/res/values-cs/strings.xml30
-rw-r--r--src/main/res/values-de/strings.xml35
-rw-r--r--src/main/res/values-el/strings.xml1
-rw-r--r--src/main/res/values-es/strings.xml30
-rw-r--r--src/main/res/values-eu/strings.xml30
-rw-r--r--src/main/res/values-fr/strings.xml1
-rw-r--r--src/main/res/values-id/strings.xml1
-rw-r--r--src/main/res/values-it/strings.xml2
-rw-r--r--src/main/res/values-ja/strings.xml34
-rw-r--r--src/main/res/values-ko/strings.xml1
-rw-r--r--src/main/res/values-nl/strings.xml286
-rw-r--r--src/main/res/values-pl/strings.xml3
-rw-r--r--src/main/res/values-pt/strings.xml1
-rw-r--r--src/main/res/values-ru/strings.xml1
-rw-r--r--src/main/res/values-sk/strings.xml5
-rw-r--r--src/main/res/values-sr/strings.xml32
-rw-r--r--src/main/res/values-sv/strings.xml30
-rw-r--r--src/main/res/values/strings.xml7
45 files changed, 823 insertions, 505 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index aaed07a7b..609f5d897 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,9 +1,20 @@
###Changelog
+####Version 1.6.3
+* bug fixes
+
+####Version 1.6.2
+* fixed issues with connection time out when server does not support ping
+
+####Version 1.6.1
+* fixed crashes
+
####Version 1.6.0
* new multi-end-to-multi-end encryption method
* show unexpected encryption changes as red chat bubbles
* always notify in private/non-anonymous conferences
+* some bugfixes
+* hard coded pix-art.de as standard server
####Version 1.5.2
* added new message bubbles
@@ -13,11 +24,13 @@
####Version 1.5.1
* fixed rare crashes
* improved otr support
+* moved typing info to ActionBar
####Version 1.5.0
-* upload files to HTTP host and share them in MUCs. requires new [HttpUploadComponent](https://github.com/siacs/HttpUploadComponent) on server side
-* bigger avatars
+* new file transfer mode to offline contacts and conferences for files smaller than 20 MB: upload files to HTTP host and share them in MUCs. requires new [HttpUploadComponent](https://github.com/siacs/HttpUploadComponent) on server side
* default image format is JPEG
+* small layout modifications with bigger avatars
+* show contacts name in locations shared in conferences
####Version 1.4.5
* fixes to message parser to not display some ejabberd muc status messages
diff --git a/build.gradle b/build.gradle
index d6f77ebf5..3e920ad92 100644
--- a/build.gradle
+++ b/build.gradle
@@ -31,8 +31,8 @@ dependencies {
compile 'org.bouncycastle:bcprov-jdk15on:1.51'
compile 'org.jitsi:org.otr4j:0.22'
compile 'org.gnu.inet:libidn:1.15'
- compile 'com.google.zxing:core:3.1.0'
- compile 'com.google.zxing:android-integration:3.1.0'
+ compile 'com.google.zxing:core:3.2.1'
+ compile 'com.google.zxing:android-integration:3.2.1'
compile 'de.measite.minidns:minidns:0.1.3'
compile 'de.timroes.android:EnhancedListView:0.3.4'
compile 'me.leolin:ShortcutBadger:1.1.3@aar'
@@ -48,8 +48,8 @@ android {
defaultConfig {
minSdkVersion 14
targetSdkVersion 21
- versionCode 83
- versionName "1.6.0"
+ versionCode 87
+ versionName "1.6.3"
}
compileOptions {
diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml
index 15d5bc255..7f07a39c7 100644
--- a/src/main/AndroidManifest.xml
+++ b/src/main/AndroidManifest.xml
@@ -15,6 +15,8 @@
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.NFC" />
+ <uses-permission android:name="android.permission.READ_PHONE_STATE" tools:node="remove" />
+
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
diff --git a/src/main/java/eu/siacs/conversations/crypto/axolotl/AxolotlService.java b/src/main/java/eu/siacs/conversations/crypto/axolotl/AxolotlService.java
index f3775b793..d700b644b 100644
--- a/src/main/java/eu/siacs/conversations/crypto/axolotl/AxolotlService.java
+++ b/src/main/java/eu/siacs/conversations/crypto/axolotl/AxolotlService.java
@@ -307,21 +307,25 @@ public class AxolotlService {
mXmppConnectionService.sendIqPacket(account, packet, new OnIqPacketReceived() {
@Override
public void onIqPacketReceived(Account account, IqPacket packet) {
- Element item = mXmppConnectionService.getIqParser().getItem(packet);
- Set<Integer> deviceIds = mXmppConnectionService.getIqParser().deviceIds(item);
- if (deviceIds == null) {
- deviceIds = new HashSet<Integer>();
- }
- if (!deviceIds.contains(getOwnDeviceId())) {
- deviceIds.add(getOwnDeviceId());
- IqPacket publish = mXmppConnectionService.getIqGenerator().publishDeviceIds(deviceIds);
- Log.d(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Own device " + getOwnDeviceId() + " not in PEP devicelist. Publishing: " + publish);
- mXmppConnectionService.sendIqPacket(account, publish, new OnIqPacketReceived() {
- @Override
- public void onIqPacketReceived(Account account, IqPacket packet) {
- // TODO: implement this!
- }
- });
+ if (packet.getType() == IqPacket.TYPE.RESULT) {
+ Element item = mXmppConnectionService.getIqParser().getItem(packet);
+ Set<Integer> deviceIds = mXmppConnectionService.getIqParser().deviceIds(item);
+ if (deviceIds == null) {
+ deviceIds = new HashSet<Integer>();
+ }
+ if (!deviceIds.contains(getOwnDeviceId())) {
+ deviceIds.add(getOwnDeviceId());
+ IqPacket publish = mXmppConnectionService.getIqGenerator().publishDeviceIds(deviceIds);
+ Log.d(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Own device " + getOwnDeviceId() + " not in PEP devicelist. Publishing: " + publish);
+ mXmppConnectionService.sendIqPacket(account, publish, new OnIqPacketReceived() {
+ @Override
+ public void onIqPacketReceived(Account account, IqPacket packet) {
+ // TODO: implement this!
+ }
+ });
+ }
+ } else {
+ Log.d(Config.LOGTAG, getLogprefix(account) + "Error received while publishing device ID:" + packet.findChild("error"));
}
}
});
@@ -332,88 +336,92 @@ public class AxolotlService {
mXmppConnectionService.sendIqPacket(account, packet, new OnIqPacketReceived() {
@Override
public void onIqPacketReceived(Account account, IqPacket packet) {
- PreKeyBundle bundle = mXmppConnectionService.getIqParser().bundle(packet);
- Map<Integer, ECPublicKey> keys = mXmppConnectionService.getIqParser().preKeyPublics(packet);
- boolean flush = false;
- if (bundle == null) {
- Log.w(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Received invalid bundle:" + packet);
- bundle = new PreKeyBundle(-1, -1, -1, null, -1, null, null, null);
- flush = true;
- }
- if (keys == null) {
- Log.w(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Received invalid prekeys:" + packet);
- }
- try {
- boolean changed = false;
- // Validate IdentityKey
- IdentityKeyPair identityKeyPair = axolotlStore.getIdentityKeyPair();
- if (flush || !identityKeyPair.getPublicKey().equals(bundle.getIdentityKey())) {
- Log.i(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Adding own IdentityKey " + identityKeyPair.getPublicKey() + " to PEP.");
- changed = true;
+ if (packet.getType() == IqPacket.TYPE.RESULT) {
+ PreKeyBundle bundle = mXmppConnectionService.getIqParser().bundle(packet);
+ Map<Integer, ECPublicKey> keys = mXmppConnectionService.getIqParser().preKeyPublics(packet);
+ boolean flush = false;
+ if (bundle == null) {
+ Log.w(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Received invalid bundle:" + packet);
+ bundle = new PreKeyBundle(-1, -1, -1, null, -1, null, null, null);
+ flush = true;
+ }
+ if (keys == null) {
+ Log.w(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Received invalid prekeys:" + packet);
}
-
- // Validate signedPreKeyRecord + ID
- SignedPreKeyRecord signedPreKeyRecord;
- int numSignedPreKeys = axolotlStore.loadSignedPreKeys().size();
try {
- signedPreKeyRecord = axolotlStore.loadSignedPreKey(bundle.getSignedPreKeyId());
- if (flush
- || !bundle.getSignedPreKey().equals(signedPreKeyRecord.getKeyPair().getPublicKey())
- || !Arrays.equals(bundle.getSignedPreKeySignature(), signedPreKeyRecord.getSignature())) {
+ boolean changed = false;
+ // Validate IdentityKey
+ IdentityKeyPair identityKeyPair = axolotlStore.getIdentityKeyPair();
+ if (flush || !identityKeyPair.getPublicKey().equals(bundle.getIdentityKey())) {
+ Log.i(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Adding own IdentityKey " + identityKeyPair.getPublicKey() + " to PEP.");
+ changed = true;
+ }
+
+ // Validate signedPreKeyRecord + ID
+ SignedPreKeyRecord signedPreKeyRecord;
+ int numSignedPreKeys = axolotlStore.loadSignedPreKeys().size();
+ try {
+ signedPreKeyRecord = axolotlStore.loadSignedPreKey(bundle.getSignedPreKeyId());
+ if (flush
+ || !bundle.getSignedPreKey().equals(signedPreKeyRecord.getKeyPair().getPublicKey())
+ || !Arrays.equals(bundle.getSignedPreKeySignature(), signedPreKeyRecord.getSignature())) {
+ Log.i(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Adding new signedPreKey with ID " + (numSignedPreKeys + 1) + " to PEP.");
+ signedPreKeyRecord = KeyHelper.generateSignedPreKey(identityKeyPair, numSignedPreKeys + 1);
+ axolotlStore.storeSignedPreKey(signedPreKeyRecord.getId(), signedPreKeyRecord);
+ changed = true;
+ }
+ } catch (InvalidKeyIdException e) {
Log.i(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Adding new signedPreKey with ID " + (numSignedPreKeys + 1) + " to PEP.");
signedPreKeyRecord = KeyHelper.generateSignedPreKey(identityKeyPair, numSignedPreKeys + 1);
axolotlStore.storeSignedPreKey(signedPreKeyRecord.getId(), signedPreKeyRecord);
changed = true;
}
- } catch (InvalidKeyIdException e) {
- Log.i(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Adding new signedPreKey with ID " + (numSignedPreKeys + 1) + " to PEP.");
- signedPreKeyRecord = KeyHelper.generateSignedPreKey(identityKeyPair, numSignedPreKeys + 1);
- axolotlStore.storeSignedPreKey(signedPreKeyRecord.getId(), signedPreKeyRecord);
- changed = true;
- }
- // Validate PreKeys
- Set<PreKeyRecord> preKeyRecords = new HashSet<>();
- if (keys != null) {
- for (Integer id : keys.keySet()) {
- try {
- PreKeyRecord preKeyRecord = axolotlStore.loadPreKey(id);
- if (preKeyRecord.getKeyPair().getPublicKey().equals(keys.get(id))) {
- preKeyRecords.add(preKeyRecord);
+ // Validate PreKeys
+ Set<PreKeyRecord> preKeyRecords = new HashSet<>();
+ if (keys != null) {
+ for (Integer id : keys.keySet()) {
+ try {
+ PreKeyRecord preKeyRecord = axolotlStore.loadPreKey(id);
+ if (preKeyRecord.getKeyPair().getPublicKey().equals(keys.get(id))) {
+ preKeyRecords.add(preKeyRecord);
+ }
+ } catch (InvalidKeyIdException ignored) {
}
- } catch (InvalidKeyIdException ignored) {
}
}
- }
- int newKeys = NUM_KEYS_TO_PUBLISH - preKeyRecords.size();
- if (newKeys > 0) {
- List<PreKeyRecord> newRecords = KeyHelper.generatePreKeys(
- axolotlStore.getCurrentPreKeyId() + 1, newKeys);
- preKeyRecords.addAll(newRecords);
- for (PreKeyRecord record : newRecords) {
- axolotlStore.storePreKey(record.getId(), record);
+ int newKeys = NUM_KEYS_TO_PUBLISH - preKeyRecords.size();
+ if (newKeys > 0) {
+ List<PreKeyRecord> newRecords = KeyHelper.generatePreKeys(
+ axolotlStore.getCurrentPreKeyId() + 1, newKeys);
+ preKeyRecords.addAll(newRecords);
+ for (PreKeyRecord record : newRecords) {
+ axolotlStore.storePreKey(record.getId(), record);
+ }
+ changed = true;
+ Log.i(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Adding " + newKeys + " new preKeys to PEP.");
}
- changed = true;
- Log.i(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Adding " + newKeys + " new preKeys to PEP.");
- }
- if (changed) {
- IqPacket publish = mXmppConnectionService.getIqGenerator().publishBundles(
- signedPreKeyRecord, axolotlStore.getIdentityKeyPair().getPublicKey(),
- preKeyRecords, getOwnDeviceId());
- Log.d(Config.LOGTAG, AxolotlService.getLogprefix(account) + ": Bundle " + getOwnDeviceId() + " in PEP not current. Publishing: " + publish);
- mXmppConnectionService.sendIqPacket(account, publish, new OnIqPacketReceived() {
- @Override
- public void onIqPacketReceived(Account account, IqPacket packet) {
- // TODO: implement this!
- Log.d(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Published bundle, got: " + packet);
- }
- });
+ if (changed) {
+ IqPacket publish = mXmppConnectionService.getIqGenerator().publishBundles(
+ signedPreKeyRecord, axolotlStore.getIdentityKeyPair().getPublicKey(),
+ preKeyRecords, getOwnDeviceId());
+ Log.d(Config.LOGTAG, AxolotlService.getLogprefix(account) + ": Bundle " + getOwnDeviceId() + " in PEP not current. Publishing: " + publish);
+ mXmppConnectionService.sendIqPacket(account, publish, new OnIqPacketReceived() {
+ @Override
+ public void onIqPacketReceived(Account account, IqPacket packet) {
+ // TODO: implement this!
+ Log.d(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Published bundle, got: " + packet);
+ }
+ });
+ }
+ } catch (InvalidKeyException e) {
+ Log.e(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Failed to publish bundle " + getOwnDeviceId() + ", reason: " + e.getMessage());
+ return;
}
- } catch (InvalidKeyException e) {
- Log.e(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Failed to publish bundle " + getOwnDeviceId() + ", reason: " + e.getMessage());
- return;
+ } else {
+ Log.d(Config.LOGTAG, getLogprefix(account) + "Error received while publishing Bundle:" + packet.findChild("error"));
}
}
});
@@ -453,45 +461,52 @@ public class AxolotlService {
@Override
public void onIqPacketReceived(Account account, IqPacket packet) {
- Log.d(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Received preKey IQ packet, processing...");
- final IqParser parser = mXmppConnectionService.getIqParser();
- final List<PreKeyBundle> preKeyBundleList = parser.preKeys(packet);
- final PreKeyBundle bundle = parser.bundle(packet);
- if (preKeyBundleList.isEmpty() || bundle == null) {
- Log.e(Config.LOGTAG, AxolotlService.getLogprefix(account) + "preKey IQ packet invalid: " + packet);
- fetchStatusMap.put(address, FetchStatus.ERROR);
+ if (packet.getType() == IqPacket.TYPE.RESULT) {
+ Log.d(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Received preKey IQ packet, processing...");
+ final IqParser parser = mXmppConnectionService.getIqParser();
+ final List<PreKeyBundle> preKeyBundleList = parser.preKeys(packet);
+ final PreKeyBundle bundle = parser.bundle(packet);
+ if (preKeyBundleList.isEmpty() || bundle == null) {
+ Log.e(Config.LOGTAG, AxolotlService.getLogprefix(account) + "preKey IQ packet invalid: " + packet);
+ fetchStatusMap.put(address, FetchStatus.ERROR);
+ finish();
+ return;
+ }
+ Random random = new Random();
+ final PreKeyBundle preKey = preKeyBundleList.get(random.nextInt(preKeyBundleList.size()));
+ if (preKey == null) {
+ //should never happen
+ fetchStatusMap.put(address, FetchStatus.ERROR);
+ finish();
+ return;
+ }
+
+ final PreKeyBundle preKeyBundle = new PreKeyBundle(0, address.getDeviceId(),
+ preKey.getPreKeyId(), preKey.getPreKey(),
+ bundle.getSignedPreKeyId(), bundle.getSignedPreKey(),
+ bundle.getSignedPreKeySignature(), bundle.getIdentityKey());
+
+ axolotlStore.saveIdentity(address.getName(), bundle.getIdentityKey());
+
+ try {
+ SessionBuilder builder = new SessionBuilder(axolotlStore, address);
+ builder.process(preKeyBundle);
+ XmppAxolotlSession session = new XmppAxolotlSession(account, axolotlStore, address, bundle.getIdentityKey().getFingerprint().replaceAll("\\s", ""));
+ sessions.put(address, session);
+ fetchStatusMap.put(address, FetchStatus.SUCCESS);
+ } catch (UntrustedIdentityException | InvalidKeyException e) {
+ Log.e(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Error building session for " + address + ": "
+ + e.getClass().getName() + ", " + e.getMessage());
+ fetchStatusMap.put(address, FetchStatus.ERROR);
+ }
+
finish();
- return;
- }
- Random random = new Random();
- final PreKeyBundle preKey = preKeyBundleList.get(random.nextInt(preKeyBundleList.size()));
- if (preKey == null) {
- //should never happen
+ } else {
fetchStatusMap.put(address, FetchStatus.ERROR);
+ Log.d(Config.LOGTAG, getLogprefix(account) + "Error received while building session:" + packet.findChild("error"));
finish();
return;
}
-
- final PreKeyBundle preKeyBundle = new PreKeyBundle(0, address.getDeviceId(),
- preKey.getPreKeyId(), preKey.getPreKey(),
- bundle.getSignedPreKeyId(), bundle.getSignedPreKey(),
- bundle.getSignedPreKeySignature(), bundle.getIdentityKey());
-
- axolotlStore.saveIdentity(address.getName(), bundle.getIdentityKey());
-
- try {
- SessionBuilder builder = new SessionBuilder(axolotlStore, address);
- builder.process(preKeyBundle);
- XmppAxolotlSession session = new XmppAxolotlSession(account, axolotlStore, address, bundle.getIdentityKey().getFingerprint().replaceAll("\\s", ""));
- sessions.put(address, session);
- fetchStatusMap.put(address, FetchStatus.SUCCESS);
- } catch (UntrustedIdentityException | InvalidKeyException e) {
- Log.e(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Error building session for " + address + ": "
- + e.getClass().getName() + ", " + e.getMessage());
- fetchStatusMap.put(address, FetchStatus.ERROR);
- }
-
- finish();
}
});
} catch (InvalidJidException e) {
diff --git a/src/main/java/eu/siacs/conversations/crypto/sasl/ScramSha1.java b/src/main/java/eu/siacs/conversations/crypto/sasl/ScramSha1.java
index c95a62df3..f47677f6e 100644
--- a/src/main/java/eu/siacs/conversations/crypto/sasl/ScramSha1.java
+++ b/src/main/java/eu/siacs/conversations/crypto/sasl/ScramSha1.java
@@ -101,6 +101,9 @@ public class ScramSha1 extends SaslMechanism {
public String getResponse(final String challenge) throws AuthenticationException {
switch (state) {
case AUTH_TEXT_SENT:
+ if (challenge == null) {
+ throw new AuthenticationException("challenge can not be null");
+ }
serverFirstMessage = Base64.decode(challenge, Base64.DEFAULT);
final Tokenizer tokenizer = new Tokenizer(serverFirstMessage);
String nonce = "";
diff --git a/src/main/java/eu/siacs/conversations/entities/Conversation.java b/src/main/java/eu/siacs/conversations/entities/Conversation.java
index 3a73f78bf..cea0d700f 100644
--- a/src/main/java/eu/siacs/conversations/entities/Conversation.java
+++ b/src/main/java/eu/siacs/conversations/entities/Conversation.java
@@ -344,14 +344,14 @@ public class Conversation extends AbstractEntity implements Blockable {
return this.getContact().getDisplayName();
}
}
-
+
public String getParticipants() {
if (getMode() == MODE_MULTI) {
String generatedName = getMucOptions().createNameFromParticipants();
if (generatedName != null) {
return generatedName;
} else {
- return null; //getJid().getLocalpart();
+ return null;
}
} else {
return null;
@@ -566,7 +566,7 @@ public class Conversation extends AbstractEntity implements Blockable {
private int getMostRecentlyUsedOutgoingEncryption() {
synchronized (this.messages) {
for(int i = this.messages.size() -1; i >= 0; --i) {
- final Message m = this.messages.get(0);
+ final Message m = this.messages.get(i);
if (!m.isCarbon() && m.getStatus() != Message.STATUS_RECEIVED) {
final int e = m.getEncryption();
if (e == Message.ENCRYPTION_DECRYPTED || e == Message.ENCRYPTION_DECRYPTION_FAILED) {
@@ -583,7 +583,7 @@ public class Conversation extends AbstractEntity implements Blockable {
private int getMostRecentlyUsedIncomingEncryption() {
synchronized (this.messages) {
for(int i = this.messages.size() -1; i >= 0; --i) {
- final Message m = this.messages.get(0);
+ final Message m = this.messages.get(i);
if (m.getStatus() == Message.STATUS_RECEIVED) {
final int e = m.getEncryption();
if (e == Message.ENCRYPTION_DECRYPTED || e == Message.ENCRYPTION_DECRYPTION_FAILED) {
diff --git a/src/main/java/eu/siacs/conversations/parser/IqParser.java b/src/main/java/eu/siacs/conversations/parser/IqParser.java
index e74cb65c0..cef5b03d9 100644
--- a/src/main/java/eu/siacs/conversations/parser/IqParser.java
+++ b/src/main/java/eu/siacs/conversations/parser/IqParser.java
@@ -236,7 +236,9 @@ public class IqParser extends AbstractParser implements OnIqPacketReceived {
@Override
public void onIqPacketReceived(final Account account, final IqPacket packet) {
- if (packet.hasChild("query", Xmlns.ROSTER) && packet.fromServer(account)) {
+ if (packet.getType() == IqPacket.TYPE.ERROR || packet.getType() == IqPacket.TYPE.TIMEOUT) {
+ return;
+ } else if (packet.hasChild("query", Xmlns.ROSTER) && packet.fromServer(account)) {
final Element query = packet.findChild("query");
// If this is in response to a query for the whole roster:
if (packet.getType() == IqPacket.TYPE.RESULT) {
@@ -306,15 +308,13 @@ public class IqParser extends AbstractParser implements OnIqPacketReceived {
final IqPacket response = packet.generateResponse(IqPacket.TYPE.RESULT);
mXmppConnectionService.sendIqPacket(account, response, null);
} else {
- if ((packet.getType() == IqPacket.TYPE.GET)
- || (packet.getType() == IqPacket.TYPE.SET)) {
+ if (packet.getType() == IqPacket.TYPE.GET || packet.getType() == IqPacket.TYPE.SET) {
final IqPacket response = packet.generateResponse(IqPacket.TYPE.ERROR);
final Element error = response.addChild("error");
error.setAttribute("type", "cancel");
- error.addChild("feature-not-implemented",
- "urn:ietf:params:xml:ns:xmpp-stanzas");
+ error.addChild("feature-not-implemented","urn:ietf:params:xml:ns:xmpp-stanzas");
account.getXmppConnection().sendIqPacket(response, null);
- }
+ }
}
}
diff --git a/src/main/java/eu/siacs/conversations/persistance/FileBackend.java b/src/main/java/eu/siacs/conversations/persistance/FileBackend.java
index d610fcab8..a0c676bf9 100644
--- a/src/main/java/eu/siacs/conversations/persistance/FileBackend.java
+++ b/src/main/java/eu/siacs/conversations/persistance/FileBackend.java
@@ -133,7 +133,6 @@ public class FileBackend {
if (path == null) {
return false;
}
- Log.d(Config.LOGTAG,"using image as is. path: "+path);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
try {
@@ -358,11 +357,7 @@ public class FileBackend {
file.delete();
return false;
}
- } catch (FileNotFoundException e) {
- return false;
- } catch (IOException e) {
- return false;
- } catch (NoSuchAlgorithmException e) {
+ } catch (IllegalArgumentException | IOException | NoSuchAlgorithmException e) {
return false;
} finally {
close(os);
@@ -389,6 +384,9 @@ public class FileBackend {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = calcSampleSize(image, size);
is = mXmppConnectionService.getContentResolver().openInputStream(image);
+ if (is == null) {
+ return null;
+ }
Bitmap input = BitmapFactory.decodeStream(is, null, options);
if (input == null) {
return null;
@@ -415,6 +413,9 @@ public class FileBackend {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = calcSampleSize(image,Math.max(newHeight, newWidth));
is = mXmppConnectionService.getContentResolver().openInputStream(image);
+ if (is == null) {
+ return null;
+ }
Bitmap source = BitmapFactory.decodeStream(is, null, options);
if (source == null) {
return null;
diff --git a/src/main/java/eu/siacs/conversations/services/MessageArchiveService.java b/src/main/java/eu/siacs/conversations/services/MessageArchiveService.java
index 0bc428c88..a31848a7c 100644
--- a/src/main/java/eu/siacs/conversations/services/MessageArchiveService.java
+++ b/src/main/java/eu/siacs/conversations/services/MessageArchiveService.java
@@ -111,7 +111,7 @@ public class MessageArchiveService implements OnAdvancedStreamFeaturesLoaded {
this.mXmppConnectionService.sendIqPacket(account, packet, new OnIqPacketReceived() {
@Override
public void onIqPacketReceived(Account account, IqPacket packet) {
- if (packet.getType() == IqPacket.TYPE.ERROR) {
+ if (packet.getType() != IqPacket.TYPE.RESULT) {
Log.d(Config.LOGTAG, account.getJid().toBareJid().toString() + ": error executing mam: " + packet.toString());
finalizeQuery(query);
}
diff --git a/src/main/java/eu/siacs/conversations/services/NotificationService.java b/src/main/java/eu/siacs/conversations/services/NotificationService.java
index 7dcf2e83a..3b8da6b39 100644
--- a/src/main/java/eu/siacs/conversations/services/NotificationService.java
+++ b/src/main/java/eu/siacs/conversations/services/NotificationService.java
@@ -62,12 +62,12 @@ public class NotificationService {
public boolean notify(final Message message) {
return (message.getStatus() == Message.STATUS_RECEIVED)
- && notificationsEnabled()
- && !message.getConversation().isMuted()
- && (message.getConversation().isPnNA()
- || conferenceNotificationsEnabled()
- || wasHighlightedOrPrivate(message)
- );
+ && notificationsEnabled()
+ && !message.getConversation().isMuted()
+ && (message.getConversation().isPnNA()
+ || conferenceNotificationsEnabled()
+ || wasHighlightedOrPrivate(message)
+ );
}
public void notifyPebble(final Message message) {
@@ -153,7 +153,9 @@ public class NotificationService {
notifications.put(conversationUuid, mList);
}
final Account account = message.getConversation().getAccount();
- final boolean doNotify = !account.inGracePeriod() && !this.inMiniGracePeriod(account);
+ final boolean doNotify = (!(this.mIsInForeground && this.mOpenConversation == null) || !isScreenOn)
+ && !account.inGracePeriod()
+ && !this.inMiniGracePeriod(account);
updateNotification(doNotify);
if (doNotify) {
notifyPebble(message);
@@ -295,7 +297,7 @@ public class NotificationService {
final ArrayList<Message> messages, final boolean notify) {
try {
final Bitmap bitmap = mXmppConnectionService.getFileBackend()
- .getThumbnail(message, getPixel(288), false);
+ .getThumbnail(message, getPixel(200), false);
final ArrayList<Message> tmp = new ArrayList<>();
for (final Message msg : messages) {
if (msg.getType() == Message.TYPE_TEXT
@@ -436,7 +438,7 @@ public class NotificationService {
private PendingIntent createDisableAccountIntent(final Account account) {
final Intent intent = new Intent(mXmppConnectionService,XmppConnectionService.class);
intent.setAction(XmppConnectionService.ACTION_DISABLE_ACCOUNT);
- intent.putExtra("account", account.getJid().toBareJid().toString());
+ intent.putExtra("account",account.getJid().toBareJid().toString());
return PendingIntent.getService(mXmppConnectionService,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);
}
@@ -557,4 +559,4 @@ public class NotificationService {
mBuilder.setContentIntent(resultPendingIntent);
mNotificationManager.notify(ERROR_NOTIFICATION_ID, mBuilder.build());
}
-}
+} \ No newline at end of file
diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java
index a9a2f2117..b08a71bfa 100644
--- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java
+++ b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java
@@ -150,13 +150,23 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
@Override
public void onBind(final Account account) {
account.getRoster().clearPresences();
- account.pendingConferenceJoins.clear();
- account.pendingConferenceLeaves.clear();
fetchRosterFromServer(account);
fetchBookmarks(account);
sendPresence(account);
connectMultiModeConversations(account);
- updateConversationUi();
+ for (Conversation conversation : account.pendingConferenceLeaves) {
+ leaveMuc(conversation);
+ }
+ account.pendingConferenceLeaves.clear();
+ for (Conversation conversation : account.pendingConferenceJoins) {
+ joinMuc(conversation);
+ }
+ account.pendingConferenceJoins.clear();
+ mMessageArchiveService.executePendingQueries(account);
+ mJingleConnectionManager.cancelInTransmission();
+ syncDirtyContacts(account);
+ account.getAxolotlService().publishOwnDeviceIdIfNeeded();
+ account.getAxolotlService().publishBundlesIfNeeded();
}
};
private final OnMessageAcknowledged mOnMessageAcknowledgedListener = new OnMessageAcknowledged() {
@@ -214,7 +224,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
private OnIqPacketReceived mDefaultIqHandler = new OnIqPacketReceived() {
@Override
public void onIqPacketReceived(Account account, IqPacket packet) {
- if (packet.getType() == IqPacket.TYPE.ERROR) {
+ if (packet.getType() != IqPacket.TYPE.RESULT) {
Element error = packet.findChild("error");
String text = error != null ? error.findChildContent("text") : null;
if (text != null) {
@@ -248,14 +258,15 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
mOnAccountUpdate.onAccountUpdate();
}
if (account.getStatus() == Account.State.ONLINE) {
- for (Conversation conversation : account.pendingConferenceLeaves) {
- leaveMuc(conversation);
- }
- for (Conversation conversation : account.pendingConferenceJoins) {
- joinMuc(conversation);
+ if (connection != null && connection.getFeatures().csi()) {
+ if (checkListeners()) {
+ Log.d(Config.LOGTAG, account.getJid().toBareJid()+ " sending csi//inactive");
+ connection.sendInactive();
+ } else {
+ Log.d(Config.LOGTAG, account.getJid().toBareJid()+ " sending csi//active");
+ connection.sendActive();
+ }
}
- mMessageArchiveService.executePendingQueries(account);
- mJingleConnectionManager.cancelInTransmission();
List<Conversation> conversations = getConversations();
for (Conversation conversation : conversations) {
if (conversation.getAccount() == account) {
@@ -263,23 +274,9 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
sendUnsentMessages(conversation);
}
}
- if (connection != null && connection.getFeatures().csi()) {
- if (checkListeners()) {
- Log.d(Config.LOGTAG, account.getJid().toBareJid()
- + " sending csi//inactive");
- connection.sendInactive();
- } else {
- Log.d(Config.LOGTAG, account.getJid().toBareJid()
- + " sending csi//active");
- connection.sendActive();
- }
- }
- syncDirtyContacts(account);
- account.getAxolotlService().publishOwnDeviceIdIfNeeded();
- account.getAxolotlService().publishBundlesIfNeeded();
-
scheduleWakeUpCall(Config.PING_MAX_INTERVAL, account.getUuid().hashCode());
} else if (account.getStatus() == Account.State.OFFLINE) {
+ resetSendingToWaiting(account);
if (!account.isOptionSet(Account.OPTION_DISABLED)) {
int timeToReconnect = mRandom.nextInt(20) + 10;
scheduleWakeUpCall(timeToReconnect,account.getUuid().hashCode());
@@ -859,7 +856,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": fetching roster");
}
iqPacket.query(Xmlns.ROSTER).setAttribute("ver", account.getRosterVersion());
- sendIqPacket(account,iqPacket,mIqParser);
+ sendIqPacket(account, iqPacket, mIqParser);
}
public void fetchBookmarks(final Account account) {
@@ -870,28 +867,31 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
@Override
public void onIqPacketReceived(final Account account, final IqPacket packet) {
- final Element query = packet.query();
- final List<Bookmark> bookmarks = new CopyOnWriteArrayList<>();
- final Element storage = query.findChild("storage",
- "storage:bookmarks");
- if (storage != null) {
- for (final Element item : storage.getChildren()) {
- if (item.getName().equals("conference")) {
- final Bookmark bookmark = Bookmark.parse(item, account);
- bookmarks.add(bookmark);
- Conversation conversation = find(bookmark);
- if (conversation != null) {
- conversation.setBookmark(bookmark);
- } else if (bookmark.autojoin() && bookmark.getJid() != null) {
- conversation = findOrCreateConversation(
- account, bookmark.getJid(), true);
- conversation.setBookmark(bookmark);
- joinMuc(conversation);
+ if (packet.getType() == IqPacket.TYPE.RESULT) {
+ final Element query = packet.query();
+ final List<Bookmark> bookmarks = new CopyOnWriteArrayList<>();
+ final Element storage = query.findChild("storage", "storage:bookmarks");
+ if (storage != null) {
+ for (final Element item : storage.getChildren()) {
+ if (item.getName().equals("conference")) {
+ final Bookmark bookmark = Bookmark.parse(item, account);
+ bookmarks.add(bookmark);
+ Conversation conversation = find(bookmark);
+ if (conversation != null) {
+ conversation.setBookmark(bookmark);
+ } else if (bookmark.autojoin() && bookmark.getJid() != null) {
+ conversation = findOrCreateConversation(
+ account, bookmark.getJid(), true);
+ conversation.setBookmark(bookmark);
+ joinMuc(conversation);
+ }
}
}
}
+ account.setBookmarks(bookmarks);
+ } else {
+ Log.d(Config.LOGTAG,account.getJid().toBareJid()+": could not fetch bookmarks");
}
- account.setBookmarks(bookmarks);
}
};
sendIqPacket(account, iqPacket, callback);
@@ -1478,6 +1478,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
}
}
+
public void joinMuc(Conversation conversation) {
Account account = conversation.getAccount();
account.pendingConferenceJoins.remove(conversation);
@@ -1674,7 +1675,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
sendIqPacket(conversation.getAccount(), request, new OnIqPacketReceived() {
@Override
public void onIqPacketReceived(Account account, IqPacket packet) {
- if (packet.getType() != IqPacket.TYPE.ERROR) {
+ if (packet.getType() == IqPacket.TYPE.RESULT) {
ArrayList<String> features = new ArrayList<>();
for (Element child : packet.query().getChildren()) {
if (child != null && child.getName().equals("feature")) {
@@ -1698,7 +1699,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
sendIqPacket(conversation.getAccount(), request, new OnIqPacketReceived() {
@Override
public void onIqPacketReceived(Account account, IqPacket packet) {
- if (packet.getType() != IqPacket.TYPE.ERROR) {
+ if (packet.getType() == IqPacket.TYPE.RESULT) {
Data data = Data.parse(packet.query().findChild("x", "jabber:x:data"));
for (Field field : data.getFields()) {
if (options.containsKey(field.getName())) {
@@ -1712,12 +1713,10 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
sendIqPacket(account, set, new OnIqPacketReceived() {
@Override
public void onIqPacketReceived(Account account, IqPacket packet) {
- if (packet.getType() == IqPacket.TYPE.RESULT) {
- if (callback != null) {
+ if (callback != null) {
+ if (packet.getType() == IqPacket.TYPE.RESULT) {
callback.onPushSucceeded();
- }
- } else {
- if (callback != null) {
+ } else {
callback.onPushFailed();
}
}
@@ -1954,10 +1953,8 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
final IqPacket packet = XmppConnectionService.this.mIqGenerator
.publishAvatarMetadata(avatar);
sendIqPacket(account, packet, new OnIqPacketReceived() {
-
@Override
- public void onIqPacketReceived(Account account,
- IqPacket result) {
+ public void onIqPacketReceived(Account account, IqPacket result) {
if (result.getType() == IqPacket.TYPE.RESULT) {
if (account.setAvatar(avatar.getFilename())) {
getAvatarService().clear(account);
diff --git a/src/main/java/eu/siacs/conversations/utils/MimeUtils.java b/src/main/java/eu/siacs/conversations/utils/MimeUtils.java
index a9e89d1b7..d45444240 100644
--- a/src/main/java/eu/siacs/conversations/utils/MimeUtils.java
+++ b/src/main/java/eu/siacs/conversations/utils/MimeUtils.java
@@ -458,7 +458,7 @@ public final class MimeUtils {
if (extension == null || extension.isEmpty()) {
return null;
}
- return extensionToMimeTypeMap.get(extension);
+ return extensionToMimeTypeMap.get(extension.toLowerCase());
}
/**
* Returns true if the given extension has a registered MIME type.
diff --git a/src/main/java/eu/siacs/conversations/utils/PhoneHelper.java b/src/main/java/eu/siacs/conversations/utils/PhoneHelper.java
index b90f06ff9..a37f60a0f 100644
--- a/src/main/java/eu/siacs/conversations/utils/PhoneHelper.java
+++ b/src/main/java/eu/siacs/conversations/utils/PhoneHelper.java
@@ -97,7 +97,7 @@ public class PhoneHelper {
if (packageName != null) {
try {
return context.getPackageManager().getPackageInfo(packageName, 0).versionName;
- } catch (final PackageManager.NameNotFoundException e) {
+ } catch (final PackageManager.NameNotFoundException | RuntimeException e) {
return "unknown";
}
} else {
diff --git a/src/main/java/eu/siacs/conversations/xml/Element.java b/src/main/java/eu/siacs/conversations/xml/Element.java
index dc5a68f6c..7b4937b26 100644
--- a/src/main/java/eu/siacs/conversations/xml/Element.java
+++ b/src/main/java/eu/siacs/conversations/xml/Element.java
@@ -69,10 +69,9 @@ public class Element {
public Element findChild(String name, String xmlns) {
for (Element child : this.children) {
- if (child.getName().equals(name)
- && (child.getAttribute("xmlns").equals(xmlns))) {
+ if (name.equals(child.getName()) && xmlns.equals(child.getAttribute("xmlns"))) {
return child;
- }
+ }
}
return null;
}
diff --git a/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java b/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java
index 5ac089766..376858323 100644
--- a/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java
+++ b/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java
@@ -1,13 +1,10 @@
package eu.siacs.conversations.xmpp;
-import android.content.Context;
-import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.Parcelable;
import android.os.PowerManager;
import android.os.PowerManager.WakeLock;
import android.os.SystemClock;
-import android.preference.PreferenceManager;
import android.util.Log;
import android.util.Pair;
import android.util.SparseArray;
@@ -37,7 +34,6 @@ import java.util.Hashtable;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
-import java.util.Map;
import java.util.Map.Entry;
import javax.net.ssl.HostnameVerifier;
@@ -52,6 +48,7 @@ import eu.siacs.conversations.crypto.sasl.Plain;
import eu.siacs.conversations.crypto.sasl.SaslMechanism;
import eu.siacs.conversations.crypto.sasl.ScramSha1;
import eu.siacs.conversations.entities.Account;
+import eu.siacs.conversations.entities.Message;
import eu.siacs.conversations.generator.IqGenerator;
import eu.siacs.conversations.services.XmppConnectionService;
import eu.siacs.conversations.utils.CryptoHelper;
@@ -65,6 +62,7 @@ import eu.siacs.conversations.xmpp.jid.InvalidJidException;
import eu.siacs.conversations.xmpp.jid.Jid;
import eu.siacs.conversations.xmpp.jingle.OnJinglePacketReceived;
import eu.siacs.conversations.xmpp.jingle.stanzas.JinglePacket;
+import eu.siacs.conversations.xmpp.stanzas.AbstractAcknowledgeableStanza;
import eu.siacs.conversations.xmpp.stanzas.AbstractStanza;
import eu.siacs.conversations.xmpp.stanzas.IqPacket;
import eu.siacs.conversations.xmpp.stanzas.MessagePacket;
@@ -87,14 +85,14 @@ public class XmppConnection implements Runnable {
private XmlReader tagReader;
private TagWriter tagWriter;
private final Features features = new Features(this);
- private boolean shouldBind = true;
+ private boolean needsBinding = true;
private boolean shouldAuthenticate = true;
private Element streamFeatures;
private final HashMap<Jid, Info> disco = new HashMap<>();
private String streamId = null;
private int smVersion = 3;
- private final SparseArray<String> mStanzaReceipts = new SparseArray<>();
+ private final SparseArray<AbstractAcknowledgeableStanza> mStanzaQueue = new SparseArray<>();
private int stanzasReceived = 0;
private int stanzasSent = 0;
@@ -103,7 +101,7 @@ public class XmppConnection implements Runnable {
private long lastConnect = 0;
private long lastSessionStarted = 0;
private int attempt = 0;
- private final Map<String, Pair<IqPacket, OnIqPacketReceived>> packetCallbacks = new Hashtable<>();
+ private final Hashtable<String, Pair<IqPacket, OnIqPacketReceived>> packetCallbacks = new Hashtable<>();
private OnPresencePacketReceived presenceListener = null;
private OnJinglePacketReceived jingleListener = null;
private OnIqPacketReceived unregisteredIqListener = null;
@@ -149,10 +147,9 @@ public class XmppConnection implements Runnable {
lastPingSent = SystemClock.elapsedRealtime();
this.attempt++;
try {
- shouldAuthenticate = shouldBind = !account.isOptionSet(Account.OPTION_REGISTER);
+ shouldAuthenticate = needsBinding = !account.isOptionSet(Account.OPTION_REGISTER);
tagReader = new XmlReader(wakeLock);
tagWriter = new TagWriter();
- packetCallbacks.clear();
this.changeStatus(Account.State.CONNECTING);
if (DNSHelper.isIp(account.getServer().toString())) {
socket = new Socket();
@@ -199,10 +196,7 @@ public class XmppConnection implements Runnable {
socket = new Socket();
socket.connect(addr, Config.SOCKET_TIMEOUT * 1000);
socketError = false;
- } catch (final UnknownHostException e) {
- Log.d(Config.LOGTAG, account.getJid().toBareJid().toString() + ": " + e.getMessage());
- i++;
- } catch (final IOException e) {
+ } catch (final Throwable e) {
Log.d(Config.LOGTAG, account.getJid().toBareJid().toString() + ": " + e.getMessage());
i++;
}
@@ -322,7 +316,7 @@ public class XmppConnection implements Runnable {
+ ") enabled (resumable)");
} else {
Log.d(Config.LOGTAG, account.getJid().toBareJid().toString()
- + ": stream managment(" + smVersion + ") enabled");
+ + ": stream management(" + smVersion + ") enabled");
}
this.lastSessionStarted = SystemClock.elapsedRealtime();
this.stanzasReceived = 0;
@@ -342,22 +336,26 @@ public class XmppConnection implements Runnable {
Log.d(Config.LOGTAG, account.getJid().toBareJid().toString() + ": session resumed");
}
acknowledgeStanzaUpTo(serverCount);
- ArrayList<IqPacket> failedIqPackets = new ArrayList<>();
- for(int i = 0; i < this.mStanzaReceipts.size(); ++i) {
- String id = mStanzaReceipts.valueAt(i);
- Pair<IqPacket,OnIqPacketReceived> pair = id == null ? null : this.packetCallbacks.get(id);
- if (pair != null) {
- failedIqPackets.add(pair.first);
- }
+ ArrayList<AbstractAcknowledgeableStanza> failedStanzas = new ArrayList<>();
+ for(int i = 0; i < this.mStanzaQueue.size(); ++i) {
+ failedStanzas.add(mStanzaQueue.valueAt(i));
}
- mStanzaReceipts.clear();
- Log.d(Config.LOGTAG,"resending "+failedIqPackets.size()+" iq stanza");
- for(IqPacket packet : failedIqPackets) {
- sendUnmodifiedIqPacket(packet,null);
+ mStanzaQueue.clear();
+ Log.d(Config.LOGTAG,"resending "+failedStanzas.size()+" stanzas");
+ for(AbstractAcknowledgeableStanza packet : failedStanzas) {
+ if (packet instanceof MessagePacket) {
+ MessagePacket message = (MessagePacket) packet;
+ mXmppConnectionService.markMessage(account,
+ message.getTo().toBareJid(),
+ message.getId(),
+ Message.STATUS_UNSEND);
+ }
+ sendPacket(packet);
}
} catch (final NumberFormatException ignored) {
}
- sendInitialPing();
+ Log.d(Config.LOGTAG, account.getJid().toBareJid()+ ": online with resource " + account.getResource());
+ changeStatus(Account.State.ONLINE);
} else if (nextTag.isStart("r")) {
tagReader.readElement(nextTag);
if (Config.EXTENDED_SM_LOGGING) {
@@ -399,36 +397,22 @@ public class XmppConnection implements Runnable {
}
private void acknowledgeStanzaUpTo(int serverCount) {
- for (int i = 0; i < mStanzaReceipts.size(); ++i) {
- if (serverCount >= mStanzaReceipts.keyAt(i)) {
+ for (int i = 0; i < mStanzaQueue.size(); ++i) {
+ if (serverCount >= mStanzaQueue.keyAt(i)) {
if (Config.EXTENDED_SM_LOGGING) {
- Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": server acknowledged stanza #" + mStanzaReceipts.keyAt(i));
+ Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": server acknowledged stanza #" + mStanzaQueue.keyAt(i));
}
- String id = mStanzaReceipts.valueAt(i);
- if (acknowledgedListener != null) {
- acknowledgedListener.onMessageAcknowledged(account, id);
+ AbstractAcknowledgeableStanza stanza = mStanzaQueue.valueAt(i);
+ if (stanza instanceof MessagePacket && acknowledgedListener != null) {
+ MessagePacket packet = (MessagePacket) stanza;
+ acknowledgedListener.onMessageAcknowledged(account, packet.getId());
}
- mStanzaReceipts.removeAt(i);
+ mStanzaQueue.removeAt(i);
i--;
}
}
}
- private void sendInitialPing() {
- Log.d(Config.LOGTAG, account.getJid().toBareJid().toString() + ": sending intial ping");
- final IqPacket iq = new IqPacket(IqPacket.TYPE.GET);
- iq.setFrom(account.getJid());
- iq.addChild("ping", "urn:xmpp:ping");
- this.sendIqPacket(iq, new OnIqPacketReceived() {
- @Override
- public void onIqPacketReceived(final Account account, final IqPacket packet) {
- Log.d(Config.LOGTAG, account.getJid().toBareJid().toString()
- + ": online with resource " + account.getResource());
- changeStatus(Account.State.ONLINE);
- }
- });
- }
-
private Element processPacket(final Tag currentTag, final int packetType)
throws XmlPullParserException, IOException {
Element element;
@@ -489,26 +473,28 @@ public class XmppConnection implements Runnable {
this.jingleListener.onJinglePacketReceived(account,(JinglePacket) packet);
}
} else {
- if (packetCallbacks.containsKey(packet.getId())) {
- final Pair<IqPacket, OnIqPacketReceived> packetCallbackDuple = packetCallbacks.get(packet.getId());
- // Packets to the server should have responses from the server
- if (packetCallbackDuple.first.toServer(account)) {
- if (packet.fromServer(account)) {
- packetCallbackDuple.second.onIqPacketReceived(account, packet);
- packetCallbacks.remove(packet.getId());
- } else {
- Log.e(Config.LOGTAG,account.getJid().toBareJid().toString()+": ignoring spoofed iq packet");
- }
- } else {
- if (packet.getFrom().equals(packetCallbackDuple.first.getTo())) {
- packetCallbackDuple.second.onIqPacketReceived(account, packet);
- packetCallbacks.remove(packet.getId());
+ synchronized (this.packetCallbacks) {
+ if (packetCallbacks.containsKey(packet.getId())) {
+ final Pair<IqPacket, OnIqPacketReceived> packetCallbackDuple = packetCallbacks.get(packet.getId());
+ // Packets to the server should have responses from the server
+ if (packetCallbackDuple.first.toServer(account)) {
+ if (packet.fromServer(account)) {
+ packetCallbackDuple.second.onIqPacketReceived(account, packet);
+ packetCallbacks.remove(packet.getId());
+ } else {
+ Log.e(Config.LOGTAG, account.getJid().toBareJid().toString() + ": ignoring spoofed iq packet");
+ }
} else {
- Log.e(Config.LOGTAG,account.getJid().toBareJid().toString()+": ignoring spoofed iq packet");
+ if (packet.getFrom().equals(packetCallbackDuple.first.getTo())) {
+ packetCallbackDuple.second.onIqPacketReceived(account, packet);
+ packetCallbacks.remove(packet.getId());
+ } else {
+ Log.e(Config.LOGTAG, account.getJid().toBareJid().toString() + ": ignoring spoofed iq packet");
+ }
}
+ } else if (packet.getType() == IqPacket.TYPE.GET || packet.getType() == IqPacket.TYPE.SET) {
+ this.unregisteredIqListener.onIqPacketReceived(account, packet);
}
- } else if (packet.getType() == IqPacket.TYPE.GET|| packet.getType() == IqPacket.TYPE.SET) {
- this.unregisteredIqListener.onIqPacketReceived(account, packet);
}
}
}
@@ -629,19 +615,18 @@ public class XmppConnection implements Runnable {
} else {
throw new IncompatibleServerException();
}
- } else if (this.streamFeatures.hasChild("sm", "urn:xmpp:sm:"
- + smVersion)
- && streamId != null) {
+ } else if (this.streamFeatures.hasChild("sm", "urn:xmpp:sm:" + smVersion) && streamId != null) {
if (Config.EXTENDED_SM_LOGGING) {
Log.d(Config.LOGTAG,account.getJid().toBareJid()+": resuming after stanza #"+stanzasReceived);
}
final ResumePacket resume = new ResumePacket(this.streamId, stanzasReceived, smVersion);
this.tagWriter.writeStanzaAsync(resume);
- } else if (this.streamFeatures.hasChild("bind") && shouldBind) {
- sendBindRequest();
- } else {
- disconnect(true);
- changeStatus(Account.State.INCOMPATIBLE_SERVER);
+ } else if (needsBinding) {
+ if (this.streamFeatures.hasChild("bind")) {
+ sendBindRequest();
+ } else {
+ throw new IncompatibleServerException();
+ }
}
}
@@ -662,8 +647,8 @@ public class XmppConnection implements Runnable {
@Override
public void onIqPacketReceived(final Account account, final IqPacket packet) {
- final Element instructions = packet.query().findChild("instructions");
- if (packet.query().hasChild("username")
+ if (packet.getType() == IqPacket.TYPE.RESULT
+ && packet.query().hasChild("username")
&& (packet.query().hasChild("password"))) {
final IqPacket register = new IqPacket(IqPacket.TYPE.SET);
final Element username = new Element("username").setContent(account.getUsername());
@@ -690,6 +675,7 @@ public class XmppConnection implements Runnable {
}
});
} else {
+ final Element instructions = packet.query().findChild("instructions");
changeStatus(Account.State.REGISTRATION_FAILED);
disconnect(true);
Log.d(Config.LOGTAG, account.getJid().toBareJid()
@@ -707,6 +693,7 @@ public class XmppConnection implements Runnable {
} catch (final InterruptedException ignored) {
}
}
+ needsBinding = false;
clearIqCallbacks();
final IqPacket iq = new IqPacket(IqPacket.TYPE.SET);
iq.addChild("bind", "urn:ietf:params:xml:ns:xmpp-bind")
@@ -729,9 +716,11 @@ public class XmppConnection implements Runnable {
sendPostBindInitialization();
}
} else {
+ Log.d(Config.LOGTAG,account.getJid()+": disconnecting because of bind failure");
disconnect(true);
}
} else {
+ Log.d(Config.LOGTAG,account.getJid()+": disconnecting because of bind failure");
disconnect(true);
}
}
@@ -739,14 +728,24 @@ public class XmppConnection implements Runnable {
}
private void clearIqCallbacks() {
- Log.d(Config.LOGTAG,account.getJid().toBareJid()+": clearing iq iq callbacks");
- final IqPacket failurePacket = new IqPacket(IqPacket.TYPE.ERROR);
- Iterator<Entry<String, Pair<IqPacket, OnIqPacketReceived>>> iterator = this.packetCallbacks.entrySet().iterator();
- while(iterator.hasNext()) {
- Entry<String, Pair<IqPacket, OnIqPacketReceived>> entry = iterator.next();
- entry.getValue().second.onIqPacketReceived(account,failurePacket);
- iterator.remove();
+ final IqPacket failurePacket = new IqPacket(IqPacket.TYPE.TIMEOUT);
+ final ArrayList<OnIqPacketReceived> callbacks = new ArrayList<>();
+ synchronized (this.packetCallbacks) {
+ if (this.packetCallbacks.size() == 0) {
+ return;
+ }
+ Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": clearing "+this.packetCallbacks.size()+" iq callbacks");
+ final Iterator<Pair<IqPacket, OnIqPacketReceived>> iterator = this.packetCallbacks.values().iterator();
+ while (iterator.hasNext()) {
+ Pair<IqPacket, OnIqPacketReceived> entry = iterator.next();
+ callbacks.add(entry.second);
+ iterator.remove();
+ }
+ }
+ for(OnIqPacketReceived callback : callbacks) {
+ callback.onIqPacketReceived(account,failurePacket);
}
+ Log.d(Config.LOGTAG,account.getJid().toBareJid()+": done clearing iq callbacks. "+this.packetCallbacks.size()+" left");
}
private void sendStartSession() {
@@ -758,6 +757,7 @@ public class XmppConnection implements Runnable {
if (packet.getType() == IqPacket.TYPE.RESULT) {
sendPostBindInitialization();
} else {
+ Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": could not init sessions");
disconnect(true);
}
}
@@ -775,7 +775,7 @@ public class XmppConnection implements Runnable {
final EnablePacket enable = new EnablePacket(smVersion);
tagWriter.writeStanzaAsync(enable);
stanzasSent = 0;
- mStanzaReceipts.clear();
+ mStanzaQueue.clear();
}
features.carbonsEnabled = false;
features.blockListRequested = false;
@@ -783,10 +783,11 @@ public class XmppConnection implements Runnable {
sendServiceDiscoveryInfo(account.getServer());
sendServiceDiscoveryInfo(account.getJid().toBareJid());
sendServiceDiscoveryItems(account.getServer());
+ Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": online with resource " + account.getResource());
+ changeStatus(Account.State.ONLINE);
if (bindListener != null) {
bindListener.onBind(account);
}
- sendInitialPing();
}
private void sendServiceDiscoveryInfo(final Jid jid) {
@@ -802,26 +803,29 @@ public class XmppConnection implements Runnable {
@Override
public void onIqPacketReceived(final Account account, final IqPacket packet) {
- final List<Element> elements = packet.query().getChildren();
- final Info info = new Info();
- for (final Element element : elements) {
- if (element.getName().equals("identity")) {
- String type = element.getAttribute("type");
- String category = element.getAttribute("category");
- if (type != null && category != null) {
- info.identities.add(new Pair<>(category,type));
+ if (packet.getType() == IqPacket.TYPE.RESULT) {
+ final List<Element> elements = packet.query().getChildren();
+ final Info info = new Info();
+ for (final Element element : elements) {
+ if (element.getName().equals("identity")) {
+ String type = element.getAttribute("type");
+ String category = element.getAttribute("category");
+ if (type != null && category != null) {
+ info.identities.add(new Pair<>(category, type));
+ }
+ } else if (element.getName().equals("feature")) {
+ info.features.add(element.getAttribute("var"));
}
- } else if (element.getName().equals("feature")) {
- info.features.add(element.getAttribute("var"));
}
- }
- disco.put(jid, info);
-
- if (account.getServer().equals(jid)) {
- enableAdvancedStreamFeatures();
- for (final OnAdvancedStreamFeaturesLoaded listener : advancedStreamFeaturesLoadedListeners) {
- listener.onAdvancedStreamFeaturesAvailable(account);
+ disco.put(jid, info);
+ if (account.getServer().equals(jid)) {
+ enableAdvancedStreamFeatures();
+ for (final OnAdvancedStreamFeaturesLoaded listener : advancedStreamFeaturesLoadedListeners) {
+ listener.onAdvancedStreamFeaturesAvailable(account);
+ }
}
+ } else {
+ Log.d(Config.LOGTAG,account.getJid().toBareJid()+": could not query disco info for "+jid.toString());
}
}
});
@@ -846,14 +850,18 @@ public class XmppConnection implements Runnable {
@Override
public void onIqPacketReceived(final Account account, final IqPacket packet) {
- final List<Element> elements = packet.query().getChildren();
- for (final Element element : elements) {
- if (element.getName().equals("item")) {
- final Jid jid = element.getAttributeAsJid("jid");
- if (jid != null && !jid.equals(account.getServer())) {
- sendServiceDiscoveryInfo(jid);
+ if (packet.getType() == IqPacket.TYPE.RESULT) {
+ final List<Element> elements = packet.query().getChildren();
+ for (final Element element : elements) {
+ if (element.getName().equals("item")) {
+ final Jid jid = element.getAttributeAsJid("jid");
+ if (jid != null && !jid.equals(account.getServer())) {
+ sendServiceDiscoveryInfo(jid);
+ }
}
}
+ } else {
+ Log.d(Config.LOGTAG,account.getJid().toBareJid()+": could not query disco items of "+server);
}
}
});
@@ -887,6 +895,8 @@ public class XmppConnection implements Runnable {
Log.d(Config.LOGTAG,
account.getJid().toBareJid() + ": switching resource due to conflict ("
+ account.getResource() + ")");
+ } else if (streamError != null) {
+ Log.d(Config.LOGTAG,account.getJid().toBareJid()+": stream error "+streamError.toString());
}
}
@@ -917,7 +927,9 @@ public class XmppConnection implements Runnable {
packet.setAttribute("id", id);
}
if (callback != null) {
- packetCallbacks.put(packet.getId(), new Pair<>(packet, callback));
+ synchronized (this.packetCallbacks) {
+ packetCallbacks.put(packet.getId(), new Pair<>(packet, callback));
+ }
}
this.sendPacket(packet);
}
@@ -937,16 +949,17 @@ public class XmppConnection implements Runnable {
return;
}
final String name = packet.getName();
- if (name.equals("iq") || name.equals("message") || name.equals("presence")) {
- ++stanzasSent;
- }
tagWriter.writeStanzaAsync(packet);
- if ((packet instanceof MessagePacket || packet instanceof IqPacket) && packet.getId() != null && this.streamId != null) {
- if (Config.EXTENDED_SM_LOGGING) {
- Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": requesting ack for stanza #" + stanzasSent);
+ if (packet instanceof AbstractAcknowledgeableStanza) {
+ AbstractAcknowledgeableStanza stanza = (AbstractAcknowledgeableStanza) packet;
+ ++stanzasSent;
+ this.mStanzaQueue.put(stanzasSent, stanza);
+ if (stanza instanceof MessagePacket && stanza.getId() != null && this.streamId != null) {
+ if (Config.EXTENDED_SM_LOGGING) {
+ Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": requesting ack for message stanza #" + stanzasSent);
+ }
+ tagWriter.writeStanzaAsync(new RequestPacket(this.smVersion));
}
- this.mStanzaReceipts.put(stanzasSent, packet.getId());
- tagWriter.writeStanzaAsync(new RequestPacket(this.smVersion));
}
}
diff --git a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnection.java b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnection.java
index 7b140842a..4f733b10e 100644
--- a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnection.java
+++ b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnection.java
@@ -85,7 +85,7 @@ public class JingleConnection implements Transferable {
@Override
public void onIqPacketReceived(Account account, IqPacket packet) {
- if (packet.getType() == IqPacket.TYPE.ERROR) {
+ if (packet.getType() != IqPacket.TYPE.RESULT) {
fail();
}
}
@@ -449,7 +449,7 @@ public class JingleConnection implements Transferable {
@Override
public void onIqPacketReceived(Account account, IqPacket packet) {
- if (packet.getType() != IqPacket.TYPE.ERROR) {
+ if (packet.getType() == IqPacket.TYPE.RESULT) {
Log.d(Config.LOGTAG,account.getJid().toBareJid()+": other party received offer");
mJingleStatus = JINGLE_STATUS_INITIATED;
mXmppConnectionService.markMessage(message, Message.STATUS_OFFERED);
@@ -634,12 +634,11 @@ public class JingleConnection implements Transferable {
@Override
public void onIqPacketReceived(Account account,
IqPacket packet) {
- if (packet.getType() == IqPacket.TYPE.ERROR) {
+ if (packet.getType() != IqPacket.TYPE.RESULT) {
onProxyActivated.failed();
} else {
onProxyActivated.success();
- sendProxyActivated(connection
- .getCandidate().getCid());
+ sendProxyActivated(connection.getCandidate().getCid());
}
}
});
diff --git a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleInbandTransport.java b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleInbandTransport.java
index ab7ab73b8..85280c5ce 100644
--- a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleInbandTransport.java
+++ b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleInbandTransport.java
@@ -74,7 +74,7 @@ public class JingleInbandTransport extends JingleTransport {
@Override
public void onIqPacketReceived(Account account,
IqPacket packet) {
- if (packet.getType() == IqPacket.TYPE.ERROR) {
+ if (packet.getType() != IqPacket.TYPE.RESULT) {
callback.failed();
} else {
callback.established();
diff --git a/src/main/java/eu/siacs/conversations/xmpp/stanzas/AbstractAcknowledgeableStanza.java b/src/main/java/eu/siacs/conversations/xmpp/stanzas/AbstractAcknowledgeableStanza.java
new file mode 100644
index 000000000..a5de4a847
--- /dev/null
+++ b/src/main/java/eu/siacs/conversations/xmpp/stanzas/AbstractAcknowledgeableStanza.java
@@ -0,0 +1,17 @@
+package eu.siacs.conversations.xmpp.stanzas;
+
+abstract public class AbstractAcknowledgeableStanza extends AbstractStanza {
+
+ protected AbstractAcknowledgeableStanza(String name) {
+ super(name);
+ }
+
+
+ public String getId() {
+ return this.getAttribute("id");
+ }
+
+ public void setId(final String id) {
+ setAttribute("id", id);
+ }
+}
diff --git a/src/main/java/eu/siacs/conversations/xmpp/stanzas/AbstractStanza.java b/src/main/java/eu/siacs/conversations/xmpp/stanzas/AbstractStanza.java
index bd706b57b..a6144df28 100644
--- a/src/main/java/eu/siacs/conversations/xmpp/stanzas/AbstractStanza.java
+++ b/src/main/java/eu/siacs/conversations/xmpp/stanzas/AbstractStanza.java
@@ -18,10 +18,6 @@ public class AbstractStanza extends Element {
return getAttributeAsJid("from");
}
- public String getId() {
- return this.getAttribute("id");
- }
-
public void setTo(final Jid to) {
if (to != null) {
setAttribute("to", to.toString());
@@ -34,10 +30,6 @@ public class AbstractStanza extends Element {
}
}
- public void setId(final String id) {
- setAttribute("id", id);
- }
-
public boolean fromServer(final Account account) {
return getFrom() == null
|| getFrom().equals(account.getServer())
diff --git a/src/main/java/eu/siacs/conversations/xmpp/stanzas/IqPacket.java b/src/main/java/eu/siacs/conversations/xmpp/stanzas/IqPacket.java
index 398102e12..4d16f2e5d 100644
--- a/src/main/java/eu/siacs/conversations/xmpp/stanzas/IqPacket.java
+++ b/src/main/java/eu/siacs/conversations/xmpp/stanzas/IqPacket.java
@@ -2,14 +2,15 @@ package eu.siacs.conversations.xmpp.stanzas;
import eu.siacs.conversations.xml.Element;
-public class IqPacket extends AbstractStanza {
+public class IqPacket extends AbstractAcknowledgeableStanza {
- public static enum TYPE {
+ public enum TYPE {
ERROR,
SET,
RESULT,
GET,
- INVALID
+ INVALID,
+ TIMEOUT
}
public IqPacket(final TYPE type) {
diff --git a/src/main/java/eu/siacs/conversations/xmpp/stanzas/MessagePacket.java b/src/main/java/eu/siacs/conversations/xmpp/stanzas/MessagePacket.java
index 6b6909125..941b4b5f6 100644
--- a/src/main/java/eu/siacs/conversations/xmpp/stanzas/MessagePacket.java
+++ b/src/main/java/eu/siacs/conversations/xmpp/stanzas/MessagePacket.java
@@ -5,7 +5,7 @@ import android.util.Pair;
import eu.siacs.conversations.parser.AbstractParser;
import eu.siacs.conversations.xml.Element;
-public class MessagePacket extends AbstractStanza {
+public class MessagePacket extends AbstractAcknowledgeableStanza {
public static final int TYPE_CHAT = 0;
public static final int TYPE_NORMAL = 2;
public static final int TYPE_GROUPCHAT = 3;
diff --git a/src/main/java/eu/siacs/conversations/xmpp/stanzas/PresencePacket.java b/src/main/java/eu/siacs/conversations/xmpp/stanzas/PresencePacket.java
index 7ea320995..c321498d8 100644
--- a/src/main/java/eu/siacs/conversations/xmpp/stanzas/PresencePacket.java
+++ b/src/main/java/eu/siacs/conversations/xmpp/stanzas/PresencePacket.java
@@ -1,6 +1,6 @@
package eu.siacs.conversations.xmpp.stanzas;
-public class PresencePacket extends AbstractStanza {
+public class PresencePacket extends AbstractAcknowledgeableStanza {
public PresencePacket() {
super("presence");
diff --git a/src/main/res/layout/activity_publish_profile_picture.xml b/src/main/res/layout/activity_publish_profile_picture.xml
index 8864f6d68..d7321ae13 100644
--- a/src/main/res/layout/activity_publish_profile_picture.xml
+++ b/src/main/res/layout/activity_publish_profile_picture.xml
@@ -20,7 +20,9 @@
android:layout_height="wrap_content"
android:maxHeight="384dp"
android:maxWidth="384dp"
- android:adjustViewBounds="true"/>
+ android:adjustViewBounds="true"
+ android:padding="1dp"
+ android:background="@drawable/message_border" />
</LinearLayout>
<TextView
diff --git a/src/main/res/layout/contact.xml b/src/main/res/layout/contact.xml
index 8d2e0b9bf..653bb9176 100644
--- a/src/main/res/layout/contact.xml
+++ b/src/main/res/layout/contact.xml
@@ -11,7 +11,6 @@
android:layout_width="56dp"
android:layout_height="56dp"
android:layout_alignParentLeft="true"
- android:scaleType="centerCrop"
android:src="@drawable/ic_profile"
android:background="@drawable/message_border"
android:padding="1dp"
diff --git a/src/main/res/layout/conversation_list_row.xml b/src/main/res/layout/conversation_list_row.xml
index 446c65874..ddd88bc33 100644
--- a/src/main/res/layout/conversation_list_row.xml
+++ b/src/main/res/layout/conversation_list_row.xml
@@ -70,7 +70,7 @@
<ImageView
android:id="@+id/conversation_lastimage"
android:layout_width="fill_parent"
- android:layout_height="36dp"
+ android:layout_height="14dp"
android:background="@color/black87"
android:scaleType="centerCrop" />
</LinearLayout>
diff --git a/src/main/res/values-bg/strings.xml b/src/main/res/values-bg/strings.xml
index 17c9061c6..caea7a090 100644
--- a/src/main/res/values-bg/strings.xml
+++ b/src/main/res/values-bg/strings.xml
@@ -76,9 +76,10 @@
<string name="delete_messages">Изтриване на съобщенията</string>
<string name="also_end_conversation">Този разговор да приключи след това</string>
<string name="choose_presence">Изберете присъствие за контакта</string>
- <string name="send_plain_text_message">Изпращане на обикновено текстово съобщение</string>
- <string name="send_otr_message">Изпращане на съобщение, шифровано чрез OTP</string>
- <string name="send_pgp_message">Изпращане на съобщение, шифровано чрез OpenPGP</string>
+ <string name="send_plain_text_message">Изпр. на обикновено текстово съобщение</string>
+ <string name="send_otr_message">Изпр. на съобщение, шифр. чрез OTP</string>
+ <string name="send_omemo_message">Изпр. на съобщение, шифр. чрез OMEMO</string>
+ <string name="send_pgp_message">Изпр. на съобщение, шифр. чрез OpenPGP</string>
<string name="your_nick_has_been_changed">Псевдонимът Ви беше променен</string>
<string name="send_unencrypted">Изпращане нешифровано</string>
<string name="decryption_failed">Неуспешно дешифроване. Възможно е да нямате правилния частен ключ.</string>
@@ -105,6 +106,8 @@
<string name="pref_vibrate_summary">Също така да има и вибрация при получаване на ново съобщение</string>
<string name="pref_sound">Звук</string>
<string name="pref_sound_summary">Изпълнение на звук с известието</string>
+ <string name="pref_conference_notifications">Известия в публичните беседи</string>
+ <string name="pref_conference_notifications_summary">Известяване винаги, когато пристигне ново съобщение в публична беседа, а не само когато тя е отбелязана</string>
<string name="pref_notification_grace_period">Продължителност на отсрочване на известията</string>
<string name="pref_notification_grace_period_summary">Изключва известията за кратко, след като бъде получено копие на съобщение</string>
<string name="pref_advanced_options">Разширени настройки</string>
@@ -150,6 +153,7 @@
<string name="encryption_choice_none">Обикновен текст</string>
<string name="encryption_choice_otr">OTR</string>
<string name="encryption_choice_pgp">OpenPGP</string>
+ <string name="encryption_choice_omemo">OMEMO</string>
<string name="mgmt_account_edit">Редактиране на профила</string>
<string name="mgmt_account_delete">Изтриване на профила</string>
<string name="mgmt_account_disable">Временно деактивиране</string>
@@ -197,11 +201,18 @@
<string name="last_seen_days">последно видян преди %d дни</string>
<string name="never_seen">не е виждан никога</string>
<string name="install_openkeychain">Шифровано съобщение. Моля, инсталирайте OpenKeychain, за да го дешифровате.</string>
- <string name="unknown_otr_fingerprint">Непознат OTR отпечатък</string>
+ <string name="unknown_otr_fingerprint">Непознат отпечатък OTR</string>
<string name="openpgp_messages_found">Открити са съобщения, шифровани чрез OpenPGP</string>
<string name="reception_failed">Неуспешно получаване</string>
<string name="your_fingerprint">Вашият отпечатък</string>
- <string name="otr_fingerprint">OTR отпечатък</string>
+ <string name="otr_fingerprint">Отпечатък OTR</string>
+ <string name="omemo_fingerprint">Отпечатък OMEMO</string>
+ <string name="omemo_fingerprint_selected_message">Отпечатък OMEMO на съобщението</string>
+ <string name="this_device_omemo_fingerprint">Собствен отпечатък OMEMO</string>
+ <string name="other_devices">Други устройства</string>
+ <string name="trust_omemo_fingerprints">Доверяване на отпечатъци OMEMO</string>
+ <string name="fetching_keys">Изтегляне на ключовете...</string>
+ <string name="done">Готово</string>
<string name="verify">Потвърждаване</string>
<string name="decrypt">Дешифроване</string>
<string name="conferences">Беседи</string>
@@ -281,7 +292,8 @@
<string name="pref_expert_options_other">Други</string>
<string name="pref_conference_name">Име на беседата</string>
<string name="pref_conference_name_summary">Използване на темата на стаята вместо JID идентификатора за беседите</string>
- <string name="toast_message_otr_fingerprint">OTR отпечатъкът е копиран!</string>
+ <string name="toast_message_otr_fingerprint">Отпечатъкът OTR е копиран!</string>
+ <string name="toast_message_omemo_fingerprint">Отпечатъкът OMEMO е копиран!</string>
<string name="conference_banned">Достъпът Ви до тази беседа беше забранен</string>
<string name="conference_members_only">Тази беседа е само за членове</string>
<string name="conference_kicked">Бяхте изритан от тази конференция</string>
@@ -324,7 +336,7 @@
<string name="pref_keep_foreground_service_summary">Предотвратява прекъсването на връзката Ви от операционната система</string>
<string name="choose_file">Изберете файл</string>
<string name="receiving_x_file">Получаване на %1$s (%2$d%% завършено)</string>
- <string name="download_x_file">Изтегляне на %s</string>
+ <string name="download_x_file">Сваляне на %s</string>
<string name="file">файл</string>
<string name="open_x_file">Отваряне на %s</string>
<string name="sending_file">изпращане (%1$d%% завършено)</string>
@@ -336,7 +348,7 @@
<string name="no_application_found_to_open_file">Няма намерено приложение за отваряне на файла</string>
<string name="could_not_verify_fingerprint">Неуспешна проверка на отпечатъка</string>
<string name="manually_verify">Ръчна проверка</string>
- <string name="are_you_sure_verify_fingerprint">Сигурни ли сте, че искате да проверите OTR отпечатъка на контактите си?</string>
+ <string name="are_you_sure_verify_fingerprint">Сигурни ли сте, че искате да проверите отпечатъка OTR на контактите си?</string>
<string name="pref_show_dynamic_tags">Динамични етикети</string>
<string name="pref_show_dynamic_tags_summary">Показване на етикети, предназначени само за четене под контактите</string>
<string name="enable_notifications">Включване на известията</string>
@@ -347,7 +359,15 @@
<string name="secret_accepted">Тайната е приета!</string>
<string name="reset">Възстановяване</string>
<string name="account_image_description">Аватар на профила</string>
- <string name="copy_otr_clipboard_description">Копиране на OTR отпечатъка</string>
+ <string name="copy_otr_clipboard_description">Копиране на отпечатъка OTR</string>
+ <string name="copy_omemo_clipboard_description">Копиране на отпечатъка OMEMO</string>
+ <string name="regenerate_omemo_key">Повторно създаване на ключа OMEMO</string>
+ <string name="wipe_omemo_pep">Изчистване на другите устройства от PEP</string>
+ <string name="clear_other_devices">Премахване на устройствата</string>
+ <string name="clear_other_devices_desc">Сигурни ли сте, че искате да премахнете всички останали устройства от обявлението OMEMO? Следващия път, когато устройствата Ви се свържат, те ще обявят себе си отново, но може да не получат съобщенията, изпратени междувременно.</string>
+ <string name="purge_key">Изтриване на ключа</string>
+ <string name="purge_key_desc_part1">Сигурни ли сте, че искате да изтриете този ключ?</string>
+ <string name="purge_key_desc_part2">След това той ще бъде необратимо приет за грешен и повече няма да можете да създавате сесии с него.</string>
<string name="fetching_history_from_server">Получаване на историята от сървъра</string>
<string name="no_more_history_on_server">Няма повече история на сървъра</string>
<string name="updating">Актуализиране...</string>
@@ -415,6 +435,7 @@
<string name="hide_offline">Скриване на тези извън линия</string>
<string name="disable_account">Деактивиране на профила</string>
<string name="contact_is_typing">%s пише...</string>
+ <string name="is_typing">пише...</string>
<string name="contact_has_stopped_typing">%s спря да пише</string>
<string name="pref_chat_states">Известия за писането</string>
<string name="pref_chat_states_summary">Позволяване на контакта Ви да вижда, когато пишете ново съобщение</string>
@@ -446,6 +467,13 @@
<string name="none">Нищо</string>
<string name="recently_used">Използвани наскоро</string>
<string name="choose_quick_action">Изберете бързо действие</string>
- <string name="file_not_found_on_remote_host">Файлът не е открит на отдалечения сървър</string>
<string name="search_for_contacts_or_groups">Търсене на контакти или групи</string>
+ <string name="send_private_message">Изпращане на лично съобщение</string>
+ <string name="user_has_left_conference">%s напусна беседата!</string>
+ <string name="username">Потребителско име</string>
+ <string name="username_hint">Потребителско име</string>
+ <string name="invalid_username">Това не е правилно потребителско име</string>
+ <string name="download_failed_server_not_found">Неуспешно сваляне: Сървърът не е открит</string>
+ <string name="download_failed_file_not_found">Неуспешно сваляне: Файлът не е открит</string>
+ <string name="download_failed_could_not_connect">Неуспешно сваляне: Неуспешна връзка със сървъра</string>
</resources>
diff --git a/src/main/res/values-ca/strings.xml b/src/main/res/values-ca/strings.xml
index 74d87736b..643ff62fb 100644
--- a/src/main/res/values-ca/strings.xml
+++ b/src/main/res/values-ca/strings.xml
@@ -412,6 +412,7 @@
<string name="hide_offline">Amaga el fora de línia</string>
<string name="disable_account">Deshabilita el compte</string>
<string name="contact_is_typing">%s està escrivint...</string>
+ <string name="is_typing">està escrivint...</string>
<string name="contact_has_stopped_typing">%s ha deixat d\'escriure</string>
<string name="pref_chat_states">Notificacions d\'escriptura</string>
<string name="pref_chat_states_summary">Permet el teu contacte saber quan estàs escrivint un missatge nou</string>
diff --git a/src/main/res/values-cs/strings.xml b/src/main/res/values-cs/strings.xml
index 6463d7638..c7e103c0f 100644
--- a/src/main/res/values-cs/strings.xml
+++ b/src/main/res/values-cs/strings.xml
@@ -78,6 +78,7 @@
<string name="choose_presence">Vybrat aktualizaci stavu pro kontakt</string>
<string name="send_plain_text_message">Poslat textovou zprávu</string>
<string name="send_otr_message">Poslat OTR šifrovanou zprávu</string>
+ <string name="send_omemo_message">Poslat OMEMO šifrovanou zprávu</string>
<string name="send_pgp_message">Poslat OpenPGP šifrovanou zprávu</string>
<string name="your_nick_has_been_changed">Přezdívka byla změněna</string>
<string name="send_unencrypted">Poslat nešifrované</string>
@@ -105,6 +106,8 @@
<string name="pref_vibrate_summary">Vibrovat při přijetí nové zprávy</string>
<string name="pref_sound">Zvuk</string>
<string name="pref_sound_summary">Přehrát zvuk společně s upozorněním</string>
+ <string name="pref_conference_notifications">Upozornění ve veřejných konferencích</string>
+ <string name="pref_conference_notifications_summary">Vždy upozornit při příchodu zprávy ve veřejných konferencích místo jen pouze pokud je zvýrazněno</string>
<string name="pref_notification_grace_period">Četnost upozornění</string>
<string name="pref_notification_grace_period_summary">Neupozorňovat krátce poté co byla obdržena kopie zprávy</string>
<string name="pref_advanced_options">Pokročilé nastavení</string>
@@ -150,6 +153,7 @@
<string name="encryption_choice_none">Čistý text</string>
<string name="encryption_choice_otr">OTR</string>
<string name="encryption_choice_pgp">OpenPGP</string>
+ <string name="encryption_choice_omemo">OMEMO</string>
<string name="mgmt_account_edit">Upravit účet</string>
<string name="mgmt_account_delete">Smazat účet</string>
<string name="mgmt_account_disable">Dočasně vypnout</string>
@@ -202,6 +206,13 @@
<string name="reception_failed">Příjem selhal</string>
<string name="your_fingerprint">Váš identifikátor</string>
<string name="otr_fingerprint">OTR identifikátor</string>
+ <string name="omemo_fingerprint">OMEMO otisk</string>
+ <string name="omemo_fingerprint_selected_message">OMEMO otisk zprávy</string>
+ <string name="this_device_omemo_fingerprint">Můj OMEMO otisk</string>
+ <string name="other_devices">Ostatní přístroje</string>
+ <string name="trust_omemo_fingerprints">Věřit OMEMO otiskům</string>
+ <string name="fetching_keys">Získávám klíče...</string>
+ <string name="done">Hotovo</string>
<string name="verify">Ověřit</string>
<string name="decrypt">Dešifrovat</string>
<string name="conferences">Konference</string>
@@ -282,6 +293,7 @@
<string name="pref_conference_name">Jméno konference</string>
<string name="pref_conference_name_summary">Pro identifikaci konferencí použít téma místnosti místo jejího JID</string>
<string name="toast_message_otr_fingerprint">OTR otisk zkopírován do schránky!</string>
+ <string name="toast_message_omemo_fingerprint">OMEMO otisk zkopírován do schránky!</string>
<string name="conference_banned">Vstup do konference byl zakázán</string>
<string name="conference_members_only">Tato konference je pouze pro členy</string>
<string name="conference_kicked">Vykopli tě z této konference</string>
@@ -348,6 +360,14 @@
<string name="reset">Reset</string>
<string name="account_image_description">Avatar účtu</string>
<string name="copy_otr_clipboard_description">Zkopírovat otisk OTR do schránky</string>
+ <string name="copy_omemo_clipboard_description">Zkopírovat OMEMO otisk do schránky</string>
+ <string name="regenerate_omemo_key">Znovu vytvořit OMEMO klíč</string>
+ <string name="wipe_omemo_pep">Smazat ostatní přístroje z PEP</string>
+ <string name="clear_other_devices">Smazat přístroje</string>
+ <string name="clear_other_devices_desc">Opravdu chcete vymazat ostatní přístroje z OMEMO upozornění? Až se příště vaše přístroje připojí, znovu se ohlásí, ale pravděpodobně neobdrží zprávy odeslané v mezičase mezi přihlášeními.</string>
+ <string name="purge_key">Vymazat klíč</string>
+ <string name="purge_key_desc_part1">Opravdu si přejete vymazat tento klíč?</string>
+ <string name="purge_key_desc_part2">Bude neodvolatelně pokládán jako kompromitovaný a již s jeho pomocí nebudete moci nikdy spustit jiné sezení.</string>
<string name="fetching_history_from_server">Načíst historii ze serveru</string>
<string name="no_more_history_on_server">Na serveru není žádná další historie</string>
<string name="updating">Aktualizuji...</string>
@@ -415,6 +435,7 @@
<string name="hide_offline">Skrýt offline</string>
<string name="disable_account">Vypnout účet</string>
<string name="contact_is_typing">%s píše...</string>
+ <string name="is_typing">píše...</string>
<string name="contact_has_stopped_typing">%s přestal(a) psát</string>
<string name="pref_chat_states">Upozornění při psaní</string>
<string name="pref_chat_states_summary">Oznamovat kontaktům že píšete novou zprávu</string>
@@ -448,6 +469,13 @@
<string name="none">Žádná</string>
<string name="recently_used">Naposledy použitá</string>
<string name="choose_quick_action">Vybrat rychlou akci</string>
- <string name="file_not_found_on_remote_host">Soubor nenalezen na vzdáleném serveru</string>
<string name="search_for_contacts_or_groups">Hledat kontakty či skupiny</string>
+ <string name="send_private_message">Poslat soukromou zprávu</string>
+ <string name="user_has_left_conference">%s opustil(a) konferenci!</string>
+ <string name="username">Uživatelské jméno</string>
+ <string name="username_hint">Uživatelské jméno</string>
+ <string name="invalid_username">Toto není platné uživatelské jméno</string>
+ <string name="download_failed_server_not_found">Stahování selhalo: Server nenalezen</string>
+ <string name="download_failed_file_not_found">Stahování selhalo: Soubor nenalezen</string>
+ <string name="download_failed_could_not_connect">Stahování selhalo: Nelze se připojit k hostu</string>
</resources>
diff --git a/src/main/res/values-de/strings.xml b/src/main/res/values-de/strings.xml
index 05c273054..1be779f3f 100644
--- a/src/main/res/values-de/strings.xml
+++ b/src/main/res/values-de/strings.xml
@@ -1,4 +1,4 @@
-<?xml version='1.0' encoding='UTF-8'?>
+<?xml version='1.0' encoding='UTF-8'?>
<resources>
<string name="action_settings">Einstellungen</string>
<string name="action_add">Neue Unterhaltung</string>
@@ -78,6 +78,7 @@
<string name="choose_presence">Ressource des Kontakts auswählen</string>
<string name="send_plain_text_message">Normal schreiben…</string>
<string name="send_otr_message">OTR-verschlüsselt schreiben…</string>
+ <string name="send_omemo_message">OMEMO-verschlüsselt schreiben…</string>
<string name="send_pgp_message">OpenPGP-verschlüsselt schreiben…</string>
<string name="your_nick_has_been_changed">Dein Nickname wurde geändert</string>
<string name="send_unencrypted">Normal verschicken</string>
@@ -105,6 +106,8 @@
<string name="pref_vibrate_summary">Vibriere, wenn eine neue Nachricht ankommt</string>
<string name="pref_sound">Klingelton</string>
<string name="pref_sound_summary">Spiele Klingelton, wenn eine neue Nachricht ankommt</string>
+ <string name="pref_conference_notifications">öffentliche Konferenz-Benachrichtigungen</string>
+ <string name="pref_conference_notifications_summary">Bei jeder Nachricht in öffentlichen Konferenzen benachrichtigen und nicht nur, wenn ich angesprochen werde</string>
<string name="pref_notification_grace_period">Gnadenfrist</string>
<string name="pref_notification_grace_period_summary">Deaktiviere Benachrichtigungen für eine kurze Zeit nach Erhalt einer Nachricht, die von einem anderen deiner Clients kommt.</string>
<string name="pref_advanced_options">Erweiterte Optionen</string>
@@ -150,6 +153,7 @@
<string name="encryption_choice_none">Klartext</string>
<string name="encryption_choice_otr">OTR</string>
<string name="encryption_choice_pgp">OpenPGP</string>
+ <string name="encryption_choice_omemo">OMEMO</string>
<string name="mgmt_account_edit">Konto bearbeiten</string>
<string name="mgmt_account_delete">Löschen</string>
<string name="mgmt_account_disable">Vorübergehend abschalten</string>
@@ -202,6 +206,13 @@
<string name="reception_failed">Empfang ist fehlgeschlagen</string>
<string name="your_fingerprint">Dein Fingerabdruck</string>
<string name="otr_fingerprint">OTR-Fingerabdruck</string>
+ <string name="omemo_fingerprint">OMEMO-Fingerabdruck</string>
+ <string name="omemo_fingerprint_selected_message">OMEMO-Fingerabdruck der Nachricht</string>
+ <string name="this_device_omemo_fingerprint">Eigener OMEMO-Fingerabdruck</string>
+ <string name="other_devices">Andere Geräte</string>
+ <string name="trust_omemo_fingerprints">OMEMO-Fingerabdruck vertrauen</string>
+ <string name="fetching_keys">Schlüssel abrufen…</string>
+ <string name="done">Erledigt</string>
<string name="verify">Verifizieren</string>
<string name="decrypt">Entschlüsseln</string>
<string name="conferences">Konferenzen</string>
@@ -282,6 +293,7 @@
<string name="pref_conference_name">Konferenz-Name</string>
<string name="pref_conference_name_summary">Konferenz-Thema statt Raum-JID als Namen verwenden</string>
<string name="toast_message_otr_fingerprint">OTR-Fingerabdruck in die Zwischenablage kopiert!</string>
+ <string name="toast_message_omemo_fingerprint">OMEMO-Fingerabdruck in die Zwischenablage kopiert!</string>
<string name="conference_banned">Du wurdest von der Konferenz ausgeschlossen</string>
<string name="conference_members_only">Die Konferenz ist nur für Mitglieder</string>
<string name="conference_kicked">Du wurdest aus der Konferenz geworfen</string>
@@ -348,6 +360,14 @@
<string name="reset">Zurücksetzen</string>
<string name="account_image_description">Konto-Avatar</string>
<string name="copy_otr_clipboard_description">OTR-Fingerabdruck in Zwischenablage kopieren</string>
+ <string name="copy_omemo_clipboard_description">OMEMO-Fingerabdruck in Zwischenablage kopieren</string>
+ <string name="regenerate_omemo_key">OMEMO-Schlüssel erneuern</string>
+ <string name="wipe_omemo_pep">Andere Geräte von PEP entfernen</string>
+ <string name="clear_other_devices">Geräte entfernen</string>
+ <string name="clear_other_devices_desc">Alle anderen Geräte aus der OMEMO-Bekanntmachung entfernen? Die Bekanntmachung wird bei der nächsten Verbindung erneuert, möglicherweise werden aber nicht alle Nachrichten empfangen, die in der Zwischenzeit versendet wurden.</string>
+ <string name="purge_key">Schlüssel löschen</string>
+ <string name="purge_key_desc_part1">Soll dieser Schlüssel gelöscht werden?</string>
+ <string name="purge_key_desc_part2">Dieser Vorgang kann nicht rückgängig gemacht werden und es kann nie wieder eine Verbindung mit diesem Schlüssel hergestellt werden.</string>
<string name="fetching_history_from_server">Lade Chatverlauf…</string>
<string name="no_more_history_on_server">Keine weiteren Nachrichten vorhanden</string>
<string name="updating">Aktualisiere…</string>
@@ -415,6 +435,7 @@
<string name="hide_offline">verstecke offline</string>
<string name="disable_account">Konto abschalten</string>
<string name="contact_is_typing">%s schreibt…</string>
+ <string name="is_typing">schreibt…</string>
<string name="contact_has_stopped_typing">%s schreibt nicht mehr</string>
<string name="pref_chat_states">Tipp-Benachrichtigung</string>
<string name="pref_chat_states_summary">Informiere deine Kontakte, wenn du eine Nachricht eintippst.</string>
@@ -446,10 +467,14 @@
<string name="none">keine</string>
<string name="recently_used">zuletzt verwendet</string>
<string name="choose_quick_action">wähle Schnell-Taste</string>
- <string name="file_not_found_on_remote_host">Datei auf Server nicht gefunden</string>
<string name="search_for_contacts_or_groups">Nach Kontakten oder Konferenzen suchen</string>
- <string name="is_typing">schreibt...</string>
+ <string name="elv_undo">Rückgängig</string>
+ <string name="send_private_message">Private Nachricht senden</string>
+ <string name="user_has_left_conference">%s hat die Konferenz verlassen!</string>
<string name="username">Benutzername</string>
- <string name="username_hint">Benutzername</string>
- <string name="invalid_username">Das ist kein gültiger Benutzername</string>
+ <string name="username_hint">Benutzername</string>
+ <string name="invalid_username">Ungültiger Benutzername</string>
+ <string name="download_failed_server_not_found">Download fehlgeschlagen: Server nicht gefunden</string>
+ <string name="download_failed_file_not_found">Download fehlgeschlagen: Datei nicht gefunden</string>
+ <string name="download_failed_could_not_connect">Download fehlgeschlagen: keine Verbindung zum Host</string>
</resources>
diff --git a/src/main/res/values-el/strings.xml b/src/main/res/values-el/strings.xml
index b9fc352ce..fbafcaaa2 100644
--- a/src/main/res/values-el/strings.xml
+++ b/src/main/res/values-el/strings.xml
@@ -412,6 +412,7 @@
<string name="hide_offline">Απόκρυψη των εκτός σύνδεσης</string>
<string name="disable_account">Απενεργοποίηση λογαριασμού</string>
<string name="contact_is_typing">Ο χρήστης %s γράφει...</string>
+ <string name="is_typing">Ο χρήστης γράφει...</string>
<string name="contact_has_stopped_typing">Ο χρήστης %s σταμάτησε να γράφει</string>
<string name="pref_chat_states">Ειδοποιήσεις πληκτρολόγησης</string>
<string name="pref_chat_states_summary">Επιτρέψτε στην επαφή σας να γνωρίζει πότε γράφετε ένα νέο μήνυμα</string>
diff --git a/src/main/res/values-es/strings.xml b/src/main/res/values-es/strings.xml
index f1b5d54c0..313b203ca 100644
--- a/src/main/res/values-es/strings.xml
+++ b/src/main/res/values-es/strings.xml
@@ -78,6 +78,7 @@
<string name="choose_presence">Selecciona recurso del contacto</string>
<string name="send_plain_text_message">Enviar mensaje de texto</string>
<string name="send_otr_message">Enviar mensaje cifrado con OTR</string>
+ <string name="send_omemo_message">Enviar mensaje cifrado con OMEMO </string>
<string name="send_pgp_message">Enviar mensaje cifrado con OpenPGP</string>
<string name="your_nick_has_been_changed">Tu apodo se ha modificado</string>
<string name="send_unencrypted">Enviar sin cifrar</string>
@@ -105,6 +106,8 @@
<string name="pref_vibrate_summary">Vibra cuando llega un nuevo mensaje</string>
<string name="pref_sound">Sonido</string>
<string name="pref_sound_summary">Reproduce tono con la notificación</string>
+ <string name="pref_conference_notifications">Notif. conversación grupo pública</string>
+ <string name="pref_conference_notifications_summary">Siempre notifica cuando llega un mensaje a una conversación en grupo pública y no solo cuando alguien menciona tu nombre en un mensaje</string>
<string name="pref_notification_grace_period">Notificaciones Carbons</string>
<string name="pref_notification_grace_period_summary">Deshabilita las notificaciones durante un corto periodo de tiempo después de recibir la copia del mensaje carbon</string>
<string name="pref_advanced_options">Opciones avanzadas</string>
@@ -150,6 +153,7 @@
<string name="encryption_choice_none">Texto plano</string>
<string name="encryption_choice_otr">OTR</string>
<string name="encryption_choice_pgp">OpenPGP</string>
+ <string name="encryption_choice_omemo">OMEMO</string>
<string name="mgmt_account_edit">Editar cuenta</string>
<string name="mgmt_account_delete">Eliminar cuenta</string>
<string name="mgmt_account_disable">Deshabilitar temporalmente</string>
@@ -202,6 +206,13 @@
<string name="reception_failed">Error al recibir</string>
<string name="your_fingerprint">Tu huella digital</string>
<string name="otr_fingerprint">Huella digital OTR</string>
+ <string name="omemo_fingerprint">Huella digital OMEMO</string>
+ <string name="omemo_fingerprint_selected_message">Huella digital OMEMO del mensaje</string>
+ <string name="this_device_omemo_fingerprint">Tu huella digital OMEMO</string>
+ <string name="other_devices">Otros dispositivos</string>
+ <string name="trust_omemo_fingerprints">Huellas digitales OMEMO de confianza</string>
+ <string name="fetching_keys">Buscando claves...</string>
+ <string name="done">Hecho</string>
<string name="verify">Verificar</string>
<string name="decrypt">Descifrar</string>
<string name="conferences">Conversación Grupo</string>
@@ -282,6 +293,7 @@
<string name="pref_conference_name">Nombre conversación grupo</string>
<string name="pref_conference_name_summary">Usar el asunto de la conversación en lugar del identificador jabber como nombre en las conversaciones en grupo</string>
<string name="toast_message_otr_fingerprint">¡Huella digital OTR copiada al portapapeles!</string>
+ <string name="toast_message_omemo_fingerprint">¡Huella digital OMEMO copiada al portapapeles!</string>
<string name="conference_banned">Tu entrada a esta conversación ha sido prohibida</string>
<string name="conference_members_only">Esta conversación es solo para miembros</string>
<string name="conference_kicked">Has sido expulsado de esta conversación</string>
@@ -348,6 +360,14 @@
<string name="reset">Reinicializar</string>
<string name="account_image_description">Imagen de perfil</string>
<string name="copy_otr_clipboard_description">Copiar huella digital OTR al portapapeles</string>
+ <string name="copy_omemo_clipboard_description">Copiar huella digital OMEMO al portapapeles</string>
+ <string name="regenerate_omemo_key">Regenerar clave OMEMO</string>
+ <string name="wipe_omemo_pep">Limpiar otros dispositivos de PEP</string>
+ <string name="clear_other_devices">Limpiar dispositivos</string>
+ <string name="clear_other_devices_desc">¿Estás seguro de que quieres limpiar todos los otros dispositivos del anuncio OMEMO? La próxima vez que tus dispositivos conecten, tendrán que volver a anunciarse, pero estos podrían no recibir los mensajes enviados durante el proceso.</string>
+ <string name="purge_key">Eliminar clave</string>
+ <string name="purge_key_desc_part1">¿Estás seguro de que quieres eliminar esta clave?</string>
+ <string name="purge_key_desc_part2">Esto será irreversible y nunca podrás iniciar sesión con esta clave de nuevo.</string>
<string name="fetching_history_from_server">Buscando historial en el servidor</string>
<string name="no_more_history_on_server">No hay más historial en el servidor</string>
<string name="updating">Actualizando…</string>
@@ -415,6 +435,7 @@
<string name="hide_offline">Ocultar desconectados</string>
<string name="disable_account">Deshabilitar Cuenta</string>
<string name="contact_is_typing">%s está escribiendo...</string>
+ <string name="is_typing">está escribiendo...</string>
<string name="contact_has_stopped_typing">%s ha dejado de escribir</string>
<string name="pref_chat_states">Notificación de escritura</string>
<string name="pref_chat_states_summary">Permite a tus contactos saber cuando estás escribiendo un nuevo mensaje</string>
@@ -446,6 +467,13 @@
<string name="none">Ninguna</string>
<string name="recently_used">Usada más recientemente</string>
<string name="choose_quick_action">Elegir acción rápida</string>
- <string name="file_not_found_on_remote_host">Archivo no encontrado en servidor remoto</string>
<string name="search_for_contacts_or_groups">Buscar contactos o grupos</string>
+ <string name="send_private_message">Enviar mensaje privado</string>
+ <string name="user_has_left_conference">¡%s ha dejado la conversación!</string>
+ <string name="username">Usuario</string>
+ <string name="username_hint">Usuario</string>
+ <string name="invalid_username">Esto no es un usuario válido</string>
+ <string name="download_failed_server_not_found">Error al descargar: Servidor no encontrado</string>
+ <string name="download_failed_file_not_found">Error al descargar: Archivo no encontrado</string>
+ <string name="download_failed_could_not_connect">Error al descargar: No se ha podido conectar con el servidor</string>
</resources>
diff --git a/src/main/res/values-eu/strings.xml b/src/main/res/values-eu/strings.xml
index 0bb59671f..a19cd111e 100644
--- a/src/main/res/values-eu/strings.xml
+++ b/src/main/res/values-eu/strings.xml
@@ -78,6 +78,7 @@
<string name="choose_presence">Hautatu agerpena kontaktuarentzat</string>
<string name="send_plain_text_message">Testu mezua bidali</string>
<string name="send_otr_message">OTRz enkriptatutako mezua bidali</string>
+ <string name="send_omemo_message">OMEMOz enkriptatutako mezua bidali</string>
<string name="send_pgp_message">OpenPGPz enkriptatutako mezua bidali</string>
<string name="your_nick_has_been_changed">Zure ezizena aldatu da</string>
<string name="send_unencrypted">Enkriptatu gabe bidali</string>
@@ -105,6 +106,8 @@
<string name="pref_vibrate_summary">Dardaratu ere mezu berri bat heltzerakoan</string>
<string name="pref_sound">Soinua</string>
<string name="pref_sound_summary">Dei-tonua jo jakinarazpenarekin</string>
+ <string name="pref_conference_notifications">Konferentzia publikoen jakinarazpenak</string>
+ <string name="pref_conference_notifications_summary">Beti jakinarazi konferentzia publiko batean mezu berri bat heltzerakoan eta ez soilik nabarmentzerakoan</string>
<string name="pref_notification_grace_period">Jakinarazpenen grazia epea</string>
<string name="pref_notification_grace_period_summary">Jakinarazpenak denbora labur baterako ezgaitu ikatz-kopia bat jaso ondoren</string>
<string name="pref_advanced_options">Aukera aurreratuak</string>
@@ -150,6 +153,7 @@
<string name="encryption_choice_none">Testu laua</string>
<string name="encryption_choice_otr">OTR</string>
<string name="encryption_choice_pgp">OpenPGP</string>
+ <string name="encryption_choice_omemo">OMEMO</string>
<string name="mgmt_account_edit">Kontua editatu</string>
<string name="mgmt_account_delete">Kontua ezabatu</string>
<string name="mgmt_account_disable">Aldi baterako ezgaitu</string>
@@ -202,6 +206,13 @@
<string name="reception_failed">Jasotzeak huts egin du</string>
<string name="your_fingerprint">Zure hatz-marka</string>
<string name="otr_fingerprint">OTR hatz-marka</string>
+ <string name="omemo_fingerprint">OMEMO hatz-marka</string>
+ <string name="omemo_fingerprint_selected_message">Mezuaren OMEMO hatz-marka</string>
+ <string name="this_device_omemo_fingerprint">Norberaren OMEMO hatz-marka</string>
+ <string name="other_devices">Beste gailuak</string>
+ <string name="trust_omemo_fingerprints">OMEMO hatz-marketaz fidatu</string>
+ <string name="fetching_keys">Gakoak eskuratzen...</string>
+ <string name="done">Eginda</string>
<string name="verify">Egiaztatu</string>
<string name="decrypt">Desenkriptatu</string>
<string name="conferences">Konferentziak</string>
@@ -282,6 +293,7 @@
<string name="pref_conference_name">Konferentziaren izena</string>
<string name="pref_conference_name_summary">Erabili gelaren gaia konferentziak identifikatzeko eta ez JIDa</string>
<string name="toast_message_otr_fingerprint">OTR hatz-marka arbelara kopiatu da</string>
+ <string name="toast_message_omemo_fingerprint">OMEMO hatz-marka arbelara kopiatu da</string>
<string name="conference_banned">Konferentzia honetara sartzea debekatuta duzu</string>
<string name="conference_members_only">Konferentzia hau kideentzat da soilik</string>
<string name="conference_kicked">Konferentzia honetatik kanporatua izan zara</string>
@@ -348,6 +360,14 @@
<string name="reset">Berrezarri</string>
<string name="account_image_description">Kontuaren profileko argazkia</string>
<string name="copy_otr_clipboard_description">OTR hatz-marka arbelera kopiatu</string>
+ <string name="copy_omemo_clipboard_description">OMEMO hatz-marka arbelara kopiatu</string>
+ <string name="regenerate_omemo_key">OMEMO gakoa birsortu</string>
+ <string name="wipe_omemo_pep">Beste gailuak PEPetik garbitu</string>
+ <string name="clear_other_devices">Gailuak garbitu</string>
+ <string name="clear_other_devices_desc">Ziur al zaude OMEMO iragarpenetik beste gailu guztiak garbitu nahi dituzulaz? Zure gailuak konektatzen diren hurrengoan, beraiek berriragarriko dira, baina agian ez dute mezurik jasoko bitartean.</string>
+ <string name="purge_key">Gakoa purgatu</string>
+ <string name="purge_key_desc_part1">Ziur al zaude gako hau purgatu nahi duzulaz?</string>
+ <string name="purge_key_desc_part2">Modu itzulezinean arriskutsutzat hartuko da, eta ezingo duzu gakoarekin berriro saio berri bat sortu.</string>
<string name="fetching_history_from_server">Mezuak zerbitzaritik eskuratzen</string>
<string name="no_more_history_on_server">Mezu gehiagorik ez zerbitzarian</string>
<string name="updating">Eguneratzen...</string>
@@ -415,6 +435,7 @@
<string name="hide_offline">Lineaz kanpokoak ezkutatu</string>
<string name="disable_account">Kontua ezgaitu</string>
<string name="contact_is_typing">%s idazten ari da...</string>
+ <string name="is_typing">idazten ari da...</string>
<string name="contact_has_stopped_typing">%s(e)k idazteari utzi dio</string>
<string name="pref_chat_states">Idazketa jakinarazpenak</string>
<string name="pref_chat_states_summary">Zure kontaktuak mezu berri bat noiz idazten ari zaren jakin dezan baimendu</string>
@@ -446,6 +467,13 @@
<string name="none">Bat ere ez</string>
<string name="recently_used">Azkenengo aldiz erabilitakoa</string>
<string name="choose_quick_action">Ekintza azkarra aukeratu</string>
- <string name="file_not_found_on_remote_host">Fitxategia ez da aurkitu urruneko zerbitzarian</string>
<string name="search_for_contacts_or_groups">Kontaktuak edo taldeak bilatu</string>
+ <string name="send_private_message">Mezu pribatua bidali</string>
+ <string name="user_has_left_conference">%s(e)k konferentzia utzi egin du</string>
+ <string name="username">Erabiltzaile izena</string>
+ <string name="username_hint">Erabiltzaile izena</string>
+ <string name="invalid_username">Hau ez da erabiltzaile izen baliodun bat</string>
+ <string name="download_failed_server_not_found">Deskargak huts egin du: zerbitzaria ez da aurkitu</string>
+ <string name="download_failed_file_not_found">Deskargak huts egin du: fitxategia ez da aurkitu</string>
+ <string name="download_failed_could_not_connect">Deskargak huts egin du: ezin izan da ostalarira konektatu</string>
</resources>
diff --git a/src/main/res/values-fr/strings.xml b/src/main/res/values-fr/strings.xml
index 646f54141..d8849b46f 100644
--- a/src/main/res/values-fr/strings.xml
+++ b/src/main/res/values-fr/strings.xml
@@ -411,6 +411,7 @@
<string name="hide_offline">Cacher hors-ligne</string>
<string name="disable_account">Désactiver le compte</string>
<string name="contact_is_typing">%s écrit un message...</string>
+ <string name="is_typing">écrit un message...</string>
<string name="contact_has_stopped_typing">%s a arrêté d\'écrire</string>
<string name="pref_chat_states">Notifications d\'écriture</string>
<string name="pref_chat_states_summary">Permettre à votre contact de savoir que vous écrivez un message</string>
diff --git a/src/main/res/values-id/strings.xml b/src/main/res/values-id/strings.xml
index f859bde1a..ea818150c 100644
--- a/src/main/res/values-id/strings.xml
+++ b/src/main/res/values-id/strings.xml
@@ -412,6 +412,7 @@
<string name="hide_offline">Sembunyikan Offline</string>
<string name="disable_account">Nonaktifkan Akun</string>
<string name="contact_is_typing">%s sedang mengetik...</string>
+ <string name="is_typing">sedang mengetik...</string>
<string name="contact_has_stopped_typing">%s telah berhenti mengetik</string>
<string name="pref_chat_states">Notifikasi ketik pesan</string>
<string name="pref_chat_states_summary">Biarkan kontak Anda tahu ketika Anda sedang menulis pesan baru</string>
diff --git a/src/main/res/values-it/strings.xml b/src/main/res/values-it/strings.xml
index 372b87e24..0d5581c7e 100644
--- a/src/main/res/values-it/strings.xml
+++ b/src/main/res/values-it/strings.xml
@@ -413,6 +413,7 @@
<string name="hide_offline">Nascondi i contatti offline</string>
<string name="disable_account">Disabilita l\'account</string>
<string name="contact_is_typing">%s sta digitando...</string>
+ <string name="is_typing">sta digitando...</string>
<string name="contact_has_stopped_typing">%s ha smesso di digitare</string>
<string name="pref_chat_states_summary">Permetti al tuo contatto di vedere quando stai digitando</string>
<string name="send_location">Invia la posizione</string>
@@ -440,6 +441,5 @@
</plurals>
<string name="none">Nessuno</string>
<string name="recently_used">Usati recentemente</string>
- <string name="file_not_found_on_remote_host">File non trovato sul server remoto</string>
<string name="search_for_contacts_or_groups">Cerca contatti o gruppi</string>
</resources>
diff --git a/src/main/res/values-ja/strings.xml b/src/main/res/values-ja/strings.xml
index 35ccc7dd6..82c9c73cb 100644
--- a/src/main/res/values-ja/strings.xml
+++ b/src/main/res/values-ja/strings.xml
@@ -78,6 +78,7 @@
<string name="choose_presence">連絡する参加を選択</string>
<string name="send_plain_text_message">プレーンテキストを送信</string>
<string name="send_otr_message">OTR 暗号化メッセージを送信</string>
+ <string name="send_omemo_message">OMEMO 暗号化メッセージを送信</string>
<string name="send_pgp_message">OpenPGP 暗号化メッセージを送信</string>
<string name="your_nick_has_been_changed">あなたのニックネームが変更されました</string>
<string name="send_unencrypted">暗号化されていない送信</string>
@@ -105,6 +106,8 @@
<string name="pref_vibrate_summary">新しいメッセージが到着したときに振動もします</string>
<string name="pref_sound">サウンド</string>
<string name="pref_sound_summary">通知で着信音を再生します</string>
+ <string name="pref_conference_notifications">公開会議で通知</string>
+ <string name="pref_conference_notifications_summary">強調表示されたときだけではなく、公開会議にメッセージが到着したときにいつも通知します</string>
<string name="pref_notification_grace_period">通知猶予期間</string>
<string name="pref_notification_grace_period_summary">カーボンコピーを受信した後、短時間、通知を無効にします</string>
<string name="pref_advanced_options">詳細オプション</string>
@@ -150,6 +153,7 @@
<string name="encryption_choice_none">プレーンテキスト</string>
<string name="encryption_choice_otr">OTR</string>
<string name="encryption_choice_pgp">OpenPGP</string>
+ <string name="encryption_choice_omemo">OMEMO</string>
<string name="mgmt_account_edit">アカウントの編集</string>
<string name="mgmt_account_delete">アカウントを削除</string>
<string name="mgmt_account_disable">一時的に無効にする</string>
@@ -202,6 +206,13 @@
<string name="reception_failed">受信に失敗しました</string>
<string name="your_fingerprint">あなたのフィンガープリント</string>
<string name="otr_fingerprint">OTR フィンガープリント</string>
+ <string name="omemo_fingerprint">OMEMO フィンガープリント</string>
+ <string name="omemo_fingerprint_selected_message">メッセージの OMEMO フィンガープリント</string>
+ <string name="this_device_omemo_fingerprint">自分の OMEMO フィンガープリント</string>
+ <string name="other_devices">他のデバイス</string>
+ <string name="trust_omemo_fingerprints">OMEMO フィンガープリントを信頼</string>
+ <string name="fetching_keys">鍵の取得中...</string>
+ <string name="done">完了</string>
<string name="verify">検証</string>
<string name="decrypt">復号化</string>
<string name="conferences">会議</string>
@@ -282,6 +293,7 @@
<string name="pref_conference_name">会議名</string>
<string name="pref_conference_name_summary">会議を識別するために JID の代わりにルームのテーマを使用します</string>
<string name="toast_message_otr_fingerprint">OTR フィンガープリントをクリップボードにコピーしました!</string>
+ <string name="toast_message_omemo_fingerprint">OMEMO フィンガープリントをクリップボードにコピーしました!</string>
<string name="conference_banned">あなたはこの会議から禁止されています</string>
<string name="conference_members_only">この会議はメンバーのみです</string>
<string name="conference_kicked">あなたはこの会議からキックされました</string>
@@ -347,7 +359,15 @@
<string name="secret_accepted">秘密を受取ました!</string>
<string name="reset">リセット</string>
<string name="account_image_description">アカウント アバター</string>
- <string name="copy_otr_clipboard_description">OTR フィンガープリントをクリップボードにコピーしました</string>
+ <string name="copy_otr_clipboard_description">OTR フィンガープリントをクリップボードにコピー</string>
+ <string name="copy_omemo_clipboard_description">OMEMO フィンガープリントをクリップボードにコピー</string>
+ <string name="regenerate_omemo_key">OMEMO キーを再生成</string>
+ <string name="wipe_omemo_pep">PEP から他のデバイスを消去</string>
+ <string name="clear_other_devices">デバイスをクリア</string>
+ <string name="clear_other_devices_desc">OMEMO のアナウンスから他のすべてのデバイスをクリアしてもよろしいですか? お使いのデバイスが次回接続したとき、それらは自分自身を再アナウンスしますが、それらはその間に送信されたメッセージを受信できない場合があります。</string>
+ <string name="purge_key">鍵を消去</string>
+ <string name="purge_key_desc_part1">この鍵を消去してもよろしいですか?</string>
+ <string name="purge_key_desc_part2">これは不可逆的に侵害とみなされ、あなたは再びそのセッションを構築することはできません。</string>
<string name="fetching_history_from_server">サーバーから履歴を取得中</string>
<string name="no_more_history_on_server">サーバーにこれ以上履歴はありません</string>
<string name="updating">アップデート中…</string>
@@ -415,6 +435,7 @@
<string name="hide_offline">オフラインを非表示にする</string>
<string name="disable_account">アカウントを無効にする</string>
<string name="contact_is_typing">%s は入力中...</string>
+ <string name="is_typing">は入力中...</string>
<string name="contact_has_stopped_typing">%s は入力を停止しました</string>
<string name="pref_chat_states">入力中通知</string>
<string name="pref_chat_states_summary">あなたが新しいメッセージを書いている時に、連絡先に知らせます</string>
@@ -424,7 +445,7 @@
<string name="location">位置</string>
<string name="received_location">位置を受信しました</string>
<string name="title_undo_swipe_out_conversation">会話が閉じられました</string>
- <string name="title_undo_swipe_out_muc">退出した会話</string>
+ <string name="title_undo_swipe_out_muc">会議を退出しました</string>
<string name="pref_dont_trust_system_cas_title">システムの CA を信頼しない</string>
<string name="pref_dont_trust_system_cas_summary">すべての証明書を手動で承認する必要があります</string>
<string name="pref_remove_trusted_certificates_title">証明書を削除</string>
@@ -444,6 +465,13 @@
<string name="none">なし</string>
<string name="recently_used">最近使用した</string>
<string name="choose_quick_action">クイックアクションの選択</string>
- <string name="file_not_found_on_remote_host">リモートサーバーにファイルが見つかりません</string>
<string name="search_for_contacts_or_groups">連絡先またはグループの検索</string>
+ <string name="send_private_message">プライベートメッセージを送信</string>
+ <string name="user_has_left_conference">%s が会議を退出しました!</string>
+ <string name="username">ユーザー名</string>
+ <string name="username_hint">ユーザー名</string>
+ <string name="invalid_username">これは有効なユーザー名ではありません</string>
+ <string name="download_failed_server_not_found">ダウンロードに失敗しました: サーバーが見つかりません</string>
+ <string name="download_failed_file_not_found">ダウンロードに失敗しました: ファイルが見つかりません</string>
+ <string name="download_failed_could_not_connect">ダウンロードに失敗しました: ホストに接続できませんでした</string>
</resources>
diff --git a/src/main/res/values-ko/strings.xml b/src/main/res/values-ko/strings.xml
index a164dd101..5c51b293a 100644
--- a/src/main/res/values-ko/strings.xml
+++ b/src/main/res/values-ko/strings.xml
@@ -412,6 +412,7 @@
<string name="hide_offline">오프라인 숨기기 </string>
<string name="disable_account">계정 해제 </string>
<string name="contact_is_typing">%s 이(가) 입력중입니다... </string>
+ <string name="is_typing">이(가) 입력중입니다... </string>
<string name="contact_has_stopped_typing">%s 이(가) 입력을 중단했습니다 </string>
<string name="pref_chat_states">입력 알림 </string>
<string name="pref_chat_states_summary">새 메세지를 작성할 때 이를 연락처에게 알립니다 </string>
diff --git a/src/main/res/values-nl/strings.xml b/src/main/res/values-nl/strings.xml
index a4ef81abd..6bbf61d24 100644
--- a/src/main/res/values-nl/strings.xml
+++ b/src/main/res/values-nl/strings.xml
@@ -2,25 +2,25 @@
<resources>
<string name="action_settings">Instellingen</string>
<string name="action_add">Nieuw gesprek</string>
- <string name="action_accounts">Beheer account</string>
- <string name="action_end_conversation">Beëindig gesprek</string>
+ <string name="action_accounts">Accounts beheren</string>
+ <string name="action_end_conversation">Gesprek beëindigen</string>
<string name="action_contact_details">Contactgegevens</string>
<string name="action_muc_details">Gespreksgegevens</string>
<string name="action_secure">Beveiligd gesprek</string>
- <string name="action_add_account">Voeg account toe</string>
- <string name="action_edit_contact">Verander naam</string>
- <string name="action_add_phone_book">Voeg toe aan telefoonboek</string>
- <string name="action_delete_contact">Verwijder uit lijst</string>
- <string name="action_block_contact">Blokkeer contact</string>
- <string name="action_unblock_contact">Deblokkeer contact</string>
- <string name="action_block_domain">Blokkeer domein</string>
- <string name="action_unblock_domain">Deblokkeer domein</string>
- <string name="title_activity_manage_accounts">Beheer accounts</string>
+ <string name="action_add_account">Account toevoegen</string>
+ <string name="action_edit_contact">Naam veranderen</string>
+ <string name="action_add_phone_book">Toevoegen aan telefoonboek</string>
+ <string name="action_delete_contact">Verwijderen uit lijst</string>
+ <string name="action_block_contact">Contact blokkeren</string>
+ <string name="action_unblock_contact">Contact deblokkeren</string>
+ <string name="action_block_domain">Domein blokkeren</string>
+ <string name="action_unblock_domain">Domein deblokkeren</string>
+ <string name="title_activity_manage_accounts">Accounts beheren</string>
<string name="title_activity_settings">Instellingen</string>
<string name="title_activity_conference_details">Groepsgespreksgegevens</string>
<string name="title_activity_contact_details">Contactgegevens</string>
<string name="title_activity_sharewith">Delen met gesprek</string>
- <string name="title_activity_start_conversation">Start gesprek</string>
+ <string name="title_activity_start_conversation">Gesprek starten</string>
<string name="title_activity_choose_contact">Kies contact</string>
<string name="title_activity_block_list">Geblokkeerde contacten</string>
<string name="just_now">net</string>
@@ -42,99 +42,102 @@
<string name="unblock_domain_text">Alle contacten van %s deblokkeren?</string>
<string name="contact_blocked">Contact geblokkeerd</string>
<string name="remove_bookmark_text">Wil je %s als bladwijzer verwijderen? Het gesprek met deze account zal niet worden verwijderd.</string>
- <string name="register_account">Registreer nieuwe account op server</string>
- <string name="change_password_on_server">Verander wachtwoord op server</string>
- <string name="share_with">Deel met</string>
- <string name="start_conversation">Start gesprek</string>
- <string name="invite_contact">Nodig contact uit</string>
+ <string name="register_account">Nieuwe account op server registreren</string>
+ <string name="change_password_on_server">Wachtwoord op server veranderen</string>
+ <string name="share_with">Delen met…</string>
+ <string name="start_conversation">Gesprek starten</string>
+ <string name="invite_contact">Contact uitnodigen</string>
<string name="contacts">Contacten</string>
- <string name="cancel">Annuleer</string>
- <string name="set">Stel in</string>
- <string name="add">Voeg toe</string>
- <string name="edit">Bewerk</string>
- <string name="delete">Verwijder</string>
- <string name="block">Blokkeer</string>
- <string name="unblock">Deblokkeer</string>
- <string name="save">Sla op</string>
- <string name="ok">OK</string>
+ <string name="cancel">Annuleren</string>
+ <string name="set">Instellen</string>
+ <string name="add">Toevoegen</string>
+ <string name="edit">Bewerken</string>
+ <string name="delete">Verwijderen</string>
+ <string name="block">Blokkeren</string>
+ <string name="unblock">Deblokkeren</string>
+ <string name="save">Opslaan</string>
+ <string name="ok">Oké</string>
<string name="crash_report_title">Conversations is gecrasht</string>
- <string name="crash_report_message">Door het versturen van crash rapportages help je de ontwikkeling van Conversations.\n\n<b>Waarschuwing:</b> Deze app zal je XMPP account gebruiken om de crash rapportages te versturen naar de ontwikkelaars.</string>
+ <string name="crash_report_message">Door het versturen van crashrapportages help je de ontwikkeling van Conversations.\n\n<b>Waarschuwing:</b> Deze app zal je XMPP-account gebruiken om de crashrapportages te versturen naar de ontwikkelaars.</string>
<string name="send_now">Nu versturen</string>
<string name="send_never">Niet opnieuw vragen</string>
<string name="problem_connecting_to_account">Account verbinden mislukt</string>
<string name="problem_connecting_to_accounts">Verbinden met meerdere accounts mislukt</string>
<string name="touch_to_fix">Raak hier aan om accounts te beheren</string>
- <string name="attach_file">Voeg bestand bij</string>
- <string name="not_in_roster">Het contact is geen onderdeel van uw lijst. Wil je het toevoegen?</string>
- <string name="add_contact">Voeg contact toe</string>
+ <string name="attach_file">Bestand bijvoegen</string>
+ <string name="not_in_roster">Het contact is geen onderdeel van je lijst. Wil je hem/haar toevoegen?</string>
+ <string name="add_contact">Contact toevoegen</string>
<string name="send_failed">afleveren mislukt</string>
<string name="send_rejected">geweigerd</string>
<string name="preparing_image">Bezig met voorbereiden van versturen van afbeelding</string>
- <string name="action_clear_history">Wis geschiedenis</string>
- <string name="clear_conversation_history">Wis gespreksgeschiedenis</string>
+ <string name="action_clear_history">Geschiedenis wissen</string>
+ <string name="clear_conversation_history">Gespreksgeschiedenis wissen</string>
<string name="clear_histor_msg">Wil je alle berichten in dit gesprek verwijderen?\n\n<b>Waarschuwing:</b> Dit zal geen invloed hebben op de berichten opgeslagen op andere apparaten of servers.</string>
- <string name="delete_messages">Verwijder berichten</string>
+ <string name="delete_messages">Berichten verwijderen</string>
<string name="also_end_conversation">Beëindig dit gesprek na afloop</string>
<string name="choose_presence">Kies aanwezigheid om te tonen aan contact</string>
- <string name="send_plain_text_message">Verstuur eenvoudig tekst bericht</string>
- <string name="send_otr_message">Verstuur OTR versleuteld bericht</string>
- <string name="send_pgp_message">Verstuur OpenPGP versleuteld bericht</string>
+ <string name="send_plain_text_message">Verstuur onversleuteld bericht</string>
+ <string name="send_otr_message">Verstuur OTR-versleuteld bericht</string>
+ <string name="send_omemo_message">Verstuur OMEMO-versleuteld bericht</string>
+ <string name="send_pgp_message">Verstuur OpenPGP-versleuteld bericht</string>
<string name="your_nick_has_been_changed">Je naam is veranderd</string>
<string name="send_unencrypted">Verstuur onversleuteld</string>
<string name="decryption_failed">Ontsleutelen mislukt. Misschien heb je niet de juiste private sleutel.</string>
<string name="openkeychain_required">OpenKeychain</string>
<string name="openkeychain_required_long">Conversations gebruikt een derde partij app genaamd <b>OpenKeychain</b> om berichten te versleutelen en ontsleutelen, en om publieke sleutels te beheren.\n\nOpenKeychain is beschikbaar onder de GPLv3 en beschikbaar op F-Droid en Google Play.\n\n<small>(Herstart Conversations na installatie.)</small></string>
- <string name="restart">Herstart</string>
- <string name="install">Installeer</string>
- <string name="offering">offering…</string>
+ <string name="restart">Herstarten</string>
+ <string name="install">Installeren</string>
+ <string name="offering">bezig met aanbieden…</string>
<string name="waiting">wachten…</string>
- <string name="no_pgp_key">Geen OpenPGP sleutel gevonden</string>
+ <string name="no_pgp_key">Geen OpenPGP-sleutel gevonden</string>
<string name="contact_has_no_pgp_key">Conversations kan je berichten niet versleutelen omdat je contact geen publieke sleutel heeft ingesteld.\n\n<small>Vraag je contact om OpenPGP te configureren.</small></string>
- <string name="no_pgp_keys">Geen OpenPGP sleutels gevonden</string>
+ <string name="no_pgp_keys">Geen OpenPGP-sleutels gevonden</string>
<string name="contacts_have_no_pgp_keys">Conversations kan je berichten niet versleutelen omdat je contacten geen publieke sleutel hebben ingesteld.\n\n<small>Vraag je contacten om OpenPGP te configureren.</small></string>
<string name="encrypted_message_received"><i>Versleuteld bericht ontvangen. Raak aan om te bekijken en te ontsleutelen.</i></string>
<string name="pref_general">Algemeen</string>
- <string name="pref_xmpp_resource">XMPP resource</string>
- <string name="pref_xmpp_resource_summary">De naam waarmee deze client zich identificeert</string>
- <string name="pref_accept_files">Accepteer bestanden</string>
- <string name="pref_accept_files_summary">Accepteer automatisch bestanden kleiner dan…</string>
+ <string name="pref_xmpp_resource">XMPP-bron</string>
+ <string name="pref_xmpp_resource_summary">De naam waarmee deze cliënt zich identificeert</string>
+ <string name="pref_accept_files">Aanvaard bestanden</string>
+ <string name="pref_accept_files_summary">Aanvaard automatisch bestanden kleiner dan…</string>
<string name="pref_notification_settings">Meldingsinstellingen</string>
<string name="pref_notifications">Meldingen</string>
<string name="pref_notifications_summary">Melding als een nieuw bericht arriveert</string>
<string name="pref_vibrate">Trillen</string>
<string name="pref_vibrate_summary">Tril ook wanneer een nieuw bericht arriveert</string>
<string name="pref_sound">Geluid</string>
- <string name="pref_sound_summary">Speel ringtone af bij melding</string>
+ <string name="pref_sound_summary">Speel beltoon af bij melding</string>
+ <string name="pref_conference_notifications">Meldingen bij groepsgespreken</string>
+ <string name="pref_conference_notifications_summary">Laat altijd een melding zien wanneer er berichten zijn ontvangen in groepsgesprekken in plaats van alleen bij het noemen van je naam</string>
<string name="pref_notification_grace_period">Uitstelperiode voor meldingen</string>
- <string name="pref_notification_grace_period_summary">Zet meldingen voor korte tijd uit als er een carbon copy wordt ontvangen</string>
+ <string name="pref_notification_grace_period_summary">Schakel meldingen voor korte tijd uit als er een carbon copy wordt ontvangen</string>
<string name="pref_advanced_options">Geavanceerde instellingen</string>
- <string name="pref_never_send_crash">Verstuur nooit crash rapportages</string>
- <string name="pref_never_send_crash_summary">Door crash rapportages te versturen help je de ontwikkeling van Conversations</string>
+ <string name="pref_never_send_crash">Verstuur nooit crashrapportages</string>
+ <string name="pref_never_send_crash_summary">Door crashrapportages te versturen help je de ontwikkeling van Conversations</string>
<string name="pref_confirm_messages">Bevestig berichten</string>
<string name="pref_confirm_messages_summary">Laat je contacten weten wanneer je berichten hebt ontvangen en gelezen</string>
- <string name="pref_ui_options">UI opties</string>
+ <string name="pref_ui_options">UI-opties</string>
<string name="openpgp_error">OpenKeychain rapporteerde een fout</string>
- <string name="error_decrypting_file">I/O fout tijdens ontsleutelen bestand</string>
- <string name="accept">Aanvaard</string>
+ <string name="error_decrypting_file">I/O-fout tijdens ontsleutelen van bestand</string>
+ <string name="accept">Aanvaarden</string>
<string name="error">Er is een fout opgetreden</string>
<string name="pref_grant_presence_updates">Verleen toestemming voor aanwezigheidsupdates</string>
- <string name="pref_grant_presence_updates_summary">Op voorhand toestemming verlenen en vragen aan contacten die je hebt aangemaakt</string>
+ <string name="pref_grant_presence_updates_summary">Op voorhand toestemming voor aanwezigheidsabonnementen verlenen en vragen aan contacten die je hebt aangemaakt</string>
<string name="subscriptions">Abonnementen</string>
<string name="your_account">Je account</string>
<string name="keys">Sleutels</string>
<string name="send_presence_updates">Verstuur aanwezigheidsupdates</string>
<string name="receive_presence_updates">Ontvang aanwezigheidsupdates</string>
<string name="ask_for_presence_updates">Vraag naar aanwezigheidsupdates</string>
- <string name="attach_choose_picture">Kies afbeelding</string>
- <string name="attach_take_picture">Neem foto</string>
+ <string name="attach_choose_picture">Afbeelding kiezen</string>
+ <string name="attach_take_picture">Foto nemen</string>
<string name="preemptively_grant">Op voorhand toestemming verlenen voor abonneren</string>
<string name="error_not_an_image_file">Het bestand dat je gekozen hebt is geen afbeelding</string>
<string name="error_compressing_image">Fout tijdens converteren van afbeelding</string>
<string name="error_file_not_found">Bestand niet gevonden</string>
- <string name="error_io_exception">Algemene I/O fout. Misschien is er geen opslagruimte meer beschikbaar?</string>
- <string name="error_security_exception_during_image_copy">De app die je gebruikte om de afbeelding te selecteren heeft niet voldoende toegang geleverd om het bestand te lezen.\n\n<small>Gebruik een andere app om een afbeelding te kiezen</small></string>
+ <string name="error_io_exception">Algemene I/O-fout. Misschien is er geen opslagruimte meer beschikbaar?</string>
+ <string name="error_security_exception_during_image_copy">De app die je gebruikte om de afbeelding te selecteren heeft niet voldoende toegang geleverd om het bestand te lezen.\n\n<small>Gebruik een andere bestandsbeheerder om een afbeelding te kiezen</small></string>
<string name="account_status_unknown">Onbekend</string>
- <string name="account_status_disabled">Tijdelijk uitgezet</string>
+ <string name="account_status_disabled">Tijdelijk uitgeschakeld</string>
<string name="account_status_online">Online</string>
<string name="account_status_connecting">Verbinden\u2026</string>
<string name="account_status_offline">Offline</string>
@@ -142,31 +145,32 @@
<string name="account_status_not_found">Server niet gevonden</string>
<string name="account_status_no_internet">Geen verbinding</string>
<string name="account_status_regis_fail">Registratie mislukt</string>
- <string name="account_status_regis_conflict">Gebruikersnaam bezet</string>
- <string name="account_status_regis_success">Registratie compleet</string>
+ <string name="account_status_regis_conflict">Gebruikersnaam is al in gebruik</string>
+ <string name="account_status_regis_success">Registratie voltooid</string>
<string name="account_status_regis_not_sup">Server ondersteunt geen registratie</string>
<string name="account_status_security_error">Fout bij beveiliging</string>
<string name="account_status_incompatible_server">Incompatibele server</string>
<string name="encryption_choice_none">Onversleuteld</string>
<string name="encryption_choice_otr">OTR</string>
<string name="encryption_choice_pgp">OpenPGP</string>
- <string name="mgmt_account_edit">Bewerk account</string>
- <string name="mgmt_account_delete">Verwijder</string>
- <string name="mgmt_account_disable">Tijdelijk uitzetten</string>
- <string name="mgmt_account_publish_avatar">Publish avatar</string>
- <string name="mgmt_account_publish_pgp">Publish OpenPGP public key</string>
- <string name="mgmt_account_enable">Aanzetten</string>
+ <string name="encryption_choice_omemo">OMEMO</string>
+ <string name="mgmt_account_edit">Account bewerken</string>
+ <string name="mgmt_account_delete">Account verwijderen</string>
+ <string name="mgmt_account_disable">Tijdelijk uitschakelen</string>
+ <string name="mgmt_account_publish_avatar">Avatar publiceren</string>
+ <string name="mgmt_account_publish_pgp">Publiceer OpenPGP publieke sleutel</string>
+ <string name="mgmt_account_enable">Account inschakelen</string>
<string name="mgmt_account_are_you_sure">Ben je zeker?</string>
<string name="mgmt_account_delete_confirm_text">Als je je account verwijdert wordt je volledige gespreksgeschiedenis gewist</string>
- <string name="attach_record_voice">Neem stem op</string>
- <string name="account_settings_jabber_id">Jabber ID:</string>
+ <string name="attach_record_voice">Stem opnemen</string>
+ <string name="account_settings_jabber_id">Jabber-ID:</string>
<string name="account_settings_password">Wachtwoord:</string>
<string name="account_settings_example_jabber_id">gebruikersnaam@voorbeeld.nl</string>
- <string name="account_settings_confirm_password">Bevestig wachtwoord:</string>
+ <string name="account_settings_confirm_password">Wachtwoord bevestigen</string>
<string name="password">Wachtwoord</string>
- <string name="confirm_password">Bevestig wachtwoord</string>
+ <string name="confirm_password">Wachtwoord bevestigen</string>
<string name="passwords_do_not_match">Wachtwoorden komen niet overeen</string>
- <string name="invalid_jid">Dit is geen geldig Jabber ID</string>
+ <string name="invalid_jid">Dit is geen geldige Jabber-ID</string>
<string name="error_out_of_memory">Geen geheugen beschikbaar. Afbeelding is te groot</string>
<string name="add_phone_book_text">Wil je %s toevoegen aan de contactenlijst op je telefoon?</string>
<string name="contact_status_online">online</string>
@@ -177,7 +181,7 @@
<string name="contact_status_offline">offline</string>
<string name="muc_details_conference">Groepsgesprek</string>
<string name="muc_details_other_members">Andere leden</string>
- <string name="server_info_show_more">Server info</string>
+ <string name="server_info_show_more">Server-info</string>
<string name="server_info_mam">XEP-0313: MAM</string>
<string name="server_info_carbon_messages">XEP-0280: Message Carbons</string>
<string name="server_info_csi">XEP-0352: Client State Indication</string>
@@ -187,7 +191,7 @@
<string name="server_info_pep">XEP-0163: PEP (Avatars)</string>
<string name="server_info_available">beschikbaar</string>
<string name="server_info_unavailable">niet beschikbaar</string>
- <string name="missing_public_keys">Ontbrekende publieke sleutel aankondigingen</string>
+ <string name="missing_public_keys">Ontbrekende publieke sleutel-aankondigingen</string>
<string name="last_seen_now">zonet voor het laatst gezien</string>
<string name="last_seen_min">1 minuut geleden voor het laatst gezien</string>
<string name="last_seen_mins">%d minuten geleden voor het laatst gezien</string>
@@ -197,21 +201,28 @@
<string name="last_seen_days">%d dagen geleden voor het laatst gezien</string>
<string name="never_seen">nog nooit gezien</string>
<string name="install_openkeychain">Versleuteld bericht. Installeer OpenKeychain om te ontsleutelen.</string>
- <string name="unknown_otr_fingerprint">Onbekende OTR vingerafdruk</string>
+ <string name="unknown_otr_fingerprint">Onbekende OTR-vingerafdruk</string>
<string name="openpgp_messages_found">OpenPGP-versleutelde berichten gevonden</string>
<string name="reception_failed">Ontvangen mislukt</string>
<string name="your_fingerprint">Jouw vingerafdruk</string>
- <string name="otr_fingerprint">OTR vingerafdruk</string>
- <string name="verify">Bevestig</string>
- <string name="decrypt">Ontsleutel</string>
+ <string name="otr_fingerprint">OTR-vingerafdruk</string>
+ <string name="omemo_fingerprint">OMEMO-vingerafdruk</string>
+ <string name="omemo_fingerprint_selected_message">OMEMO-vingerafdruk van bericht</string>
+ <string name="this_device_omemo_fingerprint">Eigen OMEMO-vingerafdruk</string>
+ <string name="other_devices">Andere apparaten</string>
+ <string name="trust_omemo_fingerprints">Vertrouw OMEMO-vingerafdrukken</string>
+ <string name="fetching_keys">Ophalen van de sleutels...</string>
+ <string name="done">Klaar</string>
+ <string name="verify">Bevestigen</string>
+ <string name="decrypt">Ontsleutelen</string>
<string name="conferences">Groepsgesprekken</string>
<string name="search">Zoeken</string>
- <string name="create_contact">Maak contact aan</string>
+ <string name="create_contact">Contact aanmaken</string>
<string name="join_conference">Aan groepsgesprek deelnemen</string>
- <string name="delete_contact">Verwijder contact</string>
- <string name="view_contact_details">Bekijk contactgegevens</string>
- <string name="block_contact">Blokkeer contact</string>
- <string name="unblock_contact">Deblokkeer contact</string>
+ <string name="delete_contact">Contact verwijderen</string>
+ <string name="view_contact_details">Contactgegevens bekijken</string>
+ <string name="block_contact">Contact blokkeren</string>
+ <string name="unblock_contact">Contact deblokkeren</string>
<string name="create">Aanmaken</string>
<string name="contact_already_exists">Het contact bestaat al</string>
<string name="join">Deelnemen</string>
@@ -221,15 +232,15 @@
<string name="delete_bookmark">Bladwijzer verwijderen</string>
<string name="bookmark_already_exists">Deze bladwijzer bestaat al</string>
<string name="you">Jij</string>
- <string name="action_edit_subject">Onderwerp groepsgesprek bewerken</string>
+ <string name="action_edit_subject">Onderwerp van groepsgesprek bewerken</string>
<string name="conference_not_found">Groepsgesprek niet gevonden</string>
<string name="leave">Verlaten</string>
<string name="contact_added_you">Contact heeft je toegevoegd aan zijn/haar contacten</string>
<string name="add_back">Contact toevoegen aan eigen contacten</string>
<string name="contact_has_read_up_to_this_point">%s heeft tot hier gelezen</string>
- <string name="publish">Publiceer</string>
+ <string name="publish">Publiceren</string>
<string name="touch_to_choose_picture">Raak avatar aan om een foto uit de galerij te kiezen</string>
- <string name="publish_avatar_explanation"><b>Aandacht:</b> Iedereen die je aanwezigheidsupdates ontvangt zal deze foto kunnen zien.</string>
+ <string name="publish_avatar_explanation">Let op: iedereen die je aanwezigheidsupdates ontvangt zal deze foto kunnen zien.</string>
<string name="publishing">Publiceren…</string>
<string name="error_publish_avatar_server_reject">De server weigerde de publicatie van je afbeelding</string>
<string name="error_publish_avatar_converting">Fout bij converteren van afbeelding</string>
@@ -238,19 +249,19 @@
<string name="error_publish_avatar_no_server_support">Je server ondersteunt de publicatie van avatars niet</string>
<string name="private_message">gefluisterd</string>
<string name="private_message_to">naar %s</string>
- <string name="send_private_message_to">Stuur privébericht naar %s</string>
+ <string name="send_private_message_to">Privébericht sturen naar %s</string>
<string name="connect">Verbinden</string>
<string name="account_already_exists">Deze account bestaat al</string>
<string name="next">Volgende</string>
<string name="server_info_session_established">Huidige sessie gevestigd</string>
<string name="additional_information">Bijkomstige informatie</string>
<string name="skip">Overslaan</string>
- <string name="disable_notifications">Meldingen uitzetten</string>
- <string name="disable_notifications_for_this_conversation">Meldingen uitzetten voor dit gesprek</string>
- <string name="notifications_disabled">Meldingen zijn uitgezet</string>
- <string name="enable">Aanzetten</string>
+ <string name="disable_notifications">Meldingen uitschakelen</string>
+ <string name="disable_notifications_for_this_conversation">Meldingen uitschakelen voor dit gesprek</string>
+ <string name="notifications_disabled">Meldingen zijn uitgeschakeld</string>
+ <string name="enable">Inschakelen</string>
<string name="conference_requires_password">Wachtwoord nodig voor toegang tot groepsgesprek</string>
- <string name="enter_password">Wachtwoord:</string>
+ <string name="enter_password">Wachtwoord invoeren</string>
<string name="missing_presence_updates">Ontbrekende aanwezigheidsupdates van contact</string>
<string name="request_presence_updates">Vraag eerst aanwezigheidsupdates van je contact aan.\n\n<small>Dit wordt gebruikt om te bepalen welke client(s) je contact gebruikt.</small></string>
<string name="request_now">Nu aanvragen</string>
@@ -259,10 +270,10 @@
<string name="ignore">Negeren</string>
<string name="without_mutual_presence_updates"><b>Waarschuwing:</b> Dit verzenden zonder wederzijdse aanwezigheidsupdates kan voor onverwachte problemen zorgen.\n\n<small>Ga naar contactgegevens om je aanwezigheidsupdates te bevestigen.</small></string>
<string name="pref_encryption_settings">Versleutelingsinstellingen</string>
- <string name="pref_force_encryption">Verplicht end-to-end versleuteling</string>
+ <string name="pref_force_encryption">Verplicht end-to-end-versleuteling</string>
<string name="pref_force_encryption_summary">Stuur berichten altijd versleuteld (behalve in groepsgesprekken)</string>
<string name="pref_dont_save_encrypted">Sla versleutelde berichten niet op</string>
- <string name="pref_dont_save_encrypted_summary"><b>Waarschuwing:</b> Dit kan leiden tot verlies van berichten</string>
+ <string name="pref_dont_save_encrypted_summary">Waarschuwing: dit kan leiden tot verlies van berichten</string>
<string name="pref_expert_options">Expert-instellingen</string>
<string name="pref_expert_options_summary">Wees voorzichtig met deze instellingen</string>
<string name="title_activity_about">Over Conversations</string>
@@ -270,7 +281,7 @@
<string name="title_pref_quiet_hours">Stille uren</string>
<string name="title_pref_quiet_hours_start_time">Begintijd</string>
<string name="title_pref_quiet_hours_end_time">Eindtijd</string>
- <string name="title_pref_enable_quiet_hours">Stille uren aanzetten</string>
+ <string name="title_pref_enable_quiet_hours">Stille uren inschakelen</string>
<string name="pref_quiet_hours_summary">Tijdens stille uren worden meldingen onderdrukt</string>
<string name="pref_use_larger_font">Vergroot lettergrootte</string>
<string name="pref_use_larger_font_summary">Gebruik grotere lettertypes over de hele app</string>
@@ -281,28 +292,29 @@
<string name="pref_expert_options_other">Andere</string>
<string name="pref_conference_name">Groepsgespreksnaam</string>
<string name="pref_conference_name_summary">Gebruik onderwerp van kamer ipv JID om groepsgesprekken te identificeren</string>
- <string name="toast_message_otr_fingerprint">OTR vingerafdruk naar klembord gekopieerd!</string>
+ <string name="toast_message_otr_fingerprint">OTR-vingerafdruk gekopieerd naar klembord!</string>
+ <string name="toast_message_omemo_fingerprint">OMEMO-vingerafdruk gekopieerd naar klembord!</string>
<string name="conference_banned">Je bent verbannen uit dit groepsgesprek</string>
<string name="conference_members_only">Dit groepsgesprek is enkel voor leden</string>
<string name="conference_kicked">Je bent uit dit groepsgesprek geschopt</string>
- <string name="using_account">account %s gebruiken</string>
- <string name="checking_x">%s op HTTP host nakijken</string>
+ <string name="using_account">met account %s</string>
+ <string name="checking_x">%s op HTTP-host nakijken</string>
<string name="not_connected_try_again">Je bent niet verbonden. Probeer later opnieuw</string>
- <string name="check_x_filesize">Bekijk bestandsgrootte van %s</string>
+ <string name="check_x_filesize">Bestandsgrootte van %s controleren</string>
<string name="message_options">Berichtopties</string>
- <string name="copy_text">Kopieer tekst</string>
- <string name="copy_original_url">Kopieer oorspronkelijke URL</string>
- <string name="send_again">Verstuur opnieuw</string>
+ <string name="copy_text">Tekst kopiëren</string>
+ <string name="copy_original_url">Oorspronkelijke URL kopiëren</string>
+ <string name="send_again">Opnieuw versturen</string>
<string name="file_url">Bestands-URL</string>
<string name="message_text">Berichttekst</string>
<string name="url_copied_to_clipboard">URL gekopieerd naar klembord</string>
<string name="message_copied_to_clipboard">Bericht gekopieerd naar klembord</string>
<string name="image_transmission_failed">Versturen van afbeelding mislukt</string>
- <string name="scan_qr_code">Scan QR code</string>
- <string name="show_qr_code">Toon QR code</string>
- <string name="show_block_list">Toon geblokkeerde contacten</string>
+ <string name="scan_qr_code">QR-code scannen</string>
+ <string name="show_qr_code">QR-code tonen</string>
+ <string name="show_block_list">Geblokkeerde contacten weergeven</string>
<string name="account_details">Accountgegevens</string>
- <string name="verify_otr">Bevestig OTR</string>
+ <string name="verify_otr">OTR bevestigen</string>
<string name="remote_fingerprint">Externe vingerafdruk</string>
<string name="scan">scan</string>
<string name="or_touch_phones">(of raak gsm\'s aan)</string>
@@ -320,17 +332,17 @@
<string name="smp_requested">Contact vraagt SMP-bevestiging</string>
<string name="no_otr_session_found">Geen geldige OTR-sessie gevonden!</string>
<string name="conversations_foreground_service">Conversations</string>
- <string name="pref_keep_foreground_service">Hou service in voorgrond</string>
+ <string name="pref_keep_foreground_service">Dienst in voorgrond houden</string>
<string name="pref_keep_foreground_service_summary">Belet het besturingssysteem van je verbinding te onderbreken</string>
- <string name="choose_file">Kies bestand</string>
+ <string name="choose_file">Bestand kiezen</string>
<string name="receiving_x_file">Ontvangen van %1$s (%2$d%% voltooid)</string>
- <string name="download_x_file">Download %s</string>
+ <string name="download_x_file">%s downloaden</string>
<string name="file">bestand</string>
- <string name="open_x_file">Open %s</string>
+ <string name="open_x_file">%s openen</string>
<string name="sending_file">versturen (%1$d%% voltooid)</string>
<string name="preparing_file">Bestand klaarmaken voor versturen</string>
<string name="x_file_offered_for_download">%s aangeboden om te downloaden</string>
- <string name="cancel_transmission">Annuleer bestandsoverdracht</string>
+ <string name="cancel_transmission">Bestandsoverdracht annuleren</string>
<string name="file_transmission_failed">bestandsoverdracht mislukt</string>
<string name="file_deleted">Het bestand is verwijderd</string>
<string name="no_application_found_to_open_file">Geen applicatie om bestand te openen</string>
@@ -339,7 +351,7 @@
<string name="are_you_sure_verify_fingerprint">Ben je zeker dat je de OTR-vingerafdruk van je contact wil bevestigen?</string>
<string name="pref_show_dynamic_tags">Toon dynamische tags</string>
<string name="pref_show_dynamic_tags_summary">Toon enkel-lezen tags onder contacten</string>
- <string name="enable_notifications">Meldingen aanzetten</string>
+ <string name="enable_notifications">Meldingen inschakelen</string>
<string name="conference_with">Groepsgesprek aanmaken met…</string>
<string name="no_conference_server_found">Geen groepsgespreksserver gevonden</string>
<string name="conference_creation_failed">Aanmaken van groepsgesprek mislukt!</string>
@@ -347,7 +359,15 @@
<string name="secret_accepted">Geheim aanvaard!</string>
<string name="reset">Opnieuw instellen</string>
<string name="account_image_description">Account-avatar</string>
- <string name="copy_otr_clipboard_description">Kopieer OTR-vingerafdruk naar klembord</string>
+ <string name="copy_otr_clipboard_description">OTR-vingerafdruk kopiëren naar klembord</string>
+ <string name="copy_omemo_clipboard_description">OMEMO-vingerafdruk kopiëren naar klembord</string>
+ <string name="regenerate_omemo_key">OMEMO-sleutel opnieuw aanmaken</string>
+ <string name="wipe_omemo_pep">Andere apparaten van PEP verwijderen</string>
+ <string name="clear_other_devices">Apparaten wissen</string>
+ <string name="clear_other_devices_desc">Ben je zeker dat je alle andere apparaten van de OMEMO-aankondiging wil wissen? De volgende keer dat je apparaten verbinding maken zullen ze zich opnieuw aankondigen, maar zullen ze misschien niet de berichten ontvangen die intussen zijn verzonden.</string>
+ <string name="purge_key">Sleutel verwijderen</string>
+ <string name="purge_key_desc_part1">Ben je zeker dat je deze sleutel wil verwijderen?</string>
+ <string name="purge_key_desc_part2">Ze zal onherroepelijk beschouwd worden als gecompromitteerd en je zal er nooit meer een nieuwe sessie mee kunnen bouwen.</string>
<string name="fetching_history_from_server">Geschiedenis van server halen</string>
<string name="no_more_history_on_server">Geen verdere geschiedenis op server</string>
<string name="updating">Bijwerken…</string>
@@ -364,8 +384,8 @@
<string name="current_password">Huidig wachtwoord</string>
<string name="new_password">Nieuw wachtwoord</string>
<string name="password_should_not_be_empty">Wachtwoord zou niet leeg mogen zijn</string>
- <string name="enable_all_accounts">Alle accounts aanzetten</string>
- <string name="disable_all_accounts">Alle accounts uitzetten</string>
+ <string name="enable_all_accounts">Alle accounts inschakelen</string>
+ <string name="disable_all_accounts">Alle accounts uitschakelen</string>
<string name="perform_action_with">Actie uitvoeren met</string>
<string name="no_affiliation">Geen aansluiting</string>
<string name="no_role">Geen rol</string>
@@ -376,7 +396,7 @@
<string name="remove_membership">Lidmaatschap verwijderen</string>
<string name="grant_admin_privileges">Administratorprivileges verlenen</string>
<string name="remove_admin_privileges">Administratorprivileges verwijderen</string>
- <string name="remove_from_room">Verwijderen uit kamer</string>
+ <string name="remove_from_room">Verwijderen uit groepsgesprek</string>
<string name="could_not_change_affiliation">Kon aansluiting niet wijzigen</string>
<string name="ban_from_conference">Verbannen uit groepsgesprek</string>
<string name="removing_from_public_conference">Je probeert %s te verwijderen uit een publiek groepsgesprek. De enige manier om dat te doen is door hem/haar permanent te verbannen.</string>
@@ -395,7 +415,7 @@
<string name="two_hours">2 uur</string>
<string name="eight_hours">8 uur</string>
<string name="until_further_notice">Voor onbepaalde duur</string>
- <string name="pref_input_options">Input-opties</string>
+ <string name="pref_input_options">Invoer-opties</string>
<string name="pref_enter_is_send">Enter is versturen</string>
<string name="pref_enter_is_send_summary">Gebruik de enter-toets om berichten te versturen</string>
<string name="pref_display_enter_key">Toon enter-toets</string>
@@ -407,32 +427,33 @@
<string name="apk">Android-applicatie</string>
<string name="vcard">Contact</string>
<string name="received_x_file">%s ontvangen</string>
- <string name="disable_foreground_service">Voorgrond-service uitzetten</string>
+ <string name="disable_foreground_service">Voorgronddienst uitschakelen</string>
<string name="touch_to_open_conversations">Raak aan om Conversations te openen</string>
<string name="avatar_has_been_published">Avatar is gepubliceerd!</string>
<string name="sending_x_file">Bezig met versturen van %s</string>
<string name="offering_x_file">Bezig met aanbieden van %s</string>
- <string name="hide_offline">Offline verbergen</string>
- <string name="disable_account">Account uitzetten</string>
+ <string name="hide_offline">Offline contacten verbergen</string>
+ <string name="disable_account">Account uitschakelen</string>
<string name="contact_is_typing">%s is aan het typen...</string>
+ <string name="is_typing">is aan het typen...</string>
<string name="contact_has_stopped_typing">%s is gestopt met typen</string>
- <string name="pref_chat_states">Aan het typen meldingen</string>
+ <string name="pref_chat_states">Aan-het-typen-meldingen</string>
<string name="pref_chat_states_summary">Laat je contacten weten wanneer je een nieuw bericht aan het schrijven bent</string>
<string name="send_location">Locatie versturen</string>
<string name="show_location">Locatie weergeven</string>
- <string name="no_application_found_to_display_location">Geen applicatie gevonden om locatie weer te geven</string>
+ <string name="no_application_found_to_display_location">Geen applicatie om locatie weer te geven</string>
<string name="location">Locatie</string>
<string name="received_location">Locatie ontvangen</string>
<string name="title_undo_swipe_out_conversation">Gesprek gesloten</string>
<string name="title_undo_swipe_out_muc">Groepsgesprek verlaten</string>
- <string name="pref_dont_trust_system_cas_title">Vertrouw geen systeem-CA\'s.</string>
+ <string name="pref_dont_trust_system_cas_title">Systeem-CA\'s niet vertrouwen</string>
<string name="pref_dont_trust_system_cas_summary">Alle certificaten moeten handmatig goedgekeurd worden</string>
- <string name="pref_remove_trusted_certificates_title">Verwijder certificaten</string>
- <string name="pref_remove_trusted_certificates_summary">Verwijder handmatig goedgekeurde certificaten</string>
+ <string name="pref_remove_trusted_certificates_title">Certificaten verwijderen</string>
+ <string name="pref_remove_trusted_certificates_summary">Handmatig goedgekeurde certificaten verwijderen</string>
<string name="toast_no_trusted_certs">Geen handmatig goedgekeurde certificaten</string>
- <string name="dialog_manage_certs_title">Verwijder certificaten</string>
- <string name="dialog_manage_certs_positivebutton">Verwijder selectie</string>
- <string name="dialog_manage_certs_negativebutton">Annuleer</string>
+ <string name="dialog_manage_certs_title">Certificaten verwijderen</string>
+ <string name="dialog_manage_certs_positivebutton">Selectie verwijderen</string>
+ <string name="dialog_manage_certs_negativebutton">Annuleren</string>
<plurals name="toast_delete_certificates">
<item quantity="one">%d certificaat verwijderd</item>
<item quantity="other">%d certificaten verwijderd</item>
@@ -445,7 +466,14 @@
<string name="pref_quick_action">Snelle actie</string>
<string name="none">Geen</string>
<string name="recently_used">Recent gebruikt</string>
- <string name="choose_quick_action">Kies snelle actie</string>
- <string name="file_not_found_on_remote_host">Bestand niet gevonden op externe server</string>
+ <string name="choose_quick_action">Snelle actie kiezen</string>
<string name="search_for_contacts_or_groups">Zoeken naar contacten of groepen</string>
+ <string name="send_private_message">Privébericht sturen</string>
+ <string name="user_has_left_conference">%s heeft het groepsgesprek verlaten!</string>
+ <string name="username">Gebruikersnaam</string>
+ <string name="username_hint">Gebruikersnaam</string>
+ <string name="invalid_username">Dit is geen geldige gebruikersnaam</string>
+ <string name="download_failed_server_not_found">Downloaden mislukt: server niet gevonden</string>
+ <string name="download_failed_file_not_found">Downloaden mislukt: bestand niet gevonden</string>
+ <string name="download_failed_could_not_connect">Downloaden mislukt: kon geen verbinding maken met host</string>
</resources>
diff --git a/src/main/res/values-pl/strings.xml b/src/main/res/values-pl/strings.xml
index fb94c6051..a1150e687 100644
--- a/src/main/res/values-pl/strings.xml
+++ b/src/main/res/values-pl/strings.xml
@@ -202,6 +202,7 @@
<string name="reception_failed">Odbiór nieudany</string>
<string name="your_fingerprint">Twój odcisk klucza</string>
<string name="otr_fingerprint">Odcisk klucza OTR</string>
+ <string name="other_devices">Pozostałe urządzenia</string>
<string name="verify">Weryfikuj</string>
<string name="decrypt">Odszyfruj</string>
<string name="conferences">Konferencje</string>
@@ -412,6 +413,7 @@
<string name="hide_offline">Ukryj niedostępnych</string>
<string name="disable_account">Wyłącz konto</string>
<string name="contact_is_typing">%s pisze...</string>
+ <string name="is_typing">pisze...</string>
<string name="contact_has_stopped_typing">%s przestał(a) pisać</string>
<string name="pref_chat_states">Powiadomienia pisania</string>
<string name="pref_chat_states_summary">Powiadamiaj rozmówcę, kiedy rozpoczynasz nową wiadomość</string>
@@ -445,4 +447,5 @@
<string name="none">Brak</string>
<string name="recently_used">Ostatnio używana</string>
<string name="choose_quick_action">Wybierz szybką akcję</string>
+ <string name="user_has_left_conference">%s opuścił(a) konferencję!</string>
</resources>
diff --git a/src/main/res/values-pt/strings.xml b/src/main/res/values-pt/strings.xml
index 041b5e2dc..08238d66a 100644
--- a/src/main/res/values-pt/strings.xml
+++ b/src/main/res/values-pt/strings.xml
@@ -285,6 +285,7 @@
<string name="sending_x_file">Enviando %s</string>
<string name="offering_x_file">Oferecendo %s</string>
<string name="contact_is_typing">%s está digitando...</string>
+ <string name="is_typing">está digitando...</string>
<string name="contact_has_stopped_typing">%s parou de digitar</string>
<string name="pref_chat_states">Notificações de digitação</string>
<string name="send_location">Enviar localização</string>
diff --git a/src/main/res/values-ru/strings.xml b/src/main/res/values-ru/strings.xml
index 053a675c9..61a51b6a4 100644
--- a/src/main/res/values-ru/strings.xml
+++ b/src/main/res/values-ru/strings.xml
@@ -412,6 +412,7 @@
<string name="hide_offline">Скрыть пользователей вне сети</string>
<string name="disable_account">Отключить учётную запись</string>
<string name="contact_is_typing">%s набирает сообщение...</string>
+ <string name="is_typing">набирает сообщение...</string>
<string name="contact_has_stopped_typing">%s прекратил набор</string>
<string name="pref_chat_states">Оповещения о наборе</string>
<string name="pref_chat_states_summary">Позволяет вашим контактам видеть когда вы пишете новое сообщение</string>
diff --git a/src/main/res/values-sk/strings.xml b/src/main/res/values-sk/strings.xml
index 6f3bf982c..4a6e9420b 100644
--- a/src/main/res/values-sk/strings.xml
+++ b/src/main/res/values-sk/strings.xml
@@ -414,6 +414,7 @@
<string name="hide_offline">Skryť neprihlásených</string>
<string name="disable_account">Vypnúť účet</string>
<string name="contact_is_typing">%s píše...</string>
+ <string name="is_typing">píše...</string>
<string name="contact_has_stopped_typing">%s prestal písať</string>
<string name="pref_chat_states">Upozornenia pri písaní</string>
<string name="pref_chat_states_summary">Upozorniť kontakt, keď píšete novú správu</string>
@@ -447,5 +448,7 @@
<string name="none">Žiadny</string>
<string name="recently_used">Naposledy použitý</string>
<string name="choose_quick_action">Vybrať rýchlu voľbu</string>
- <string name="file_not_found_on_remote_host">Súbor sa na vzdialenom serveri nenašiel</string>
+ <string name="search_for_contacts_or_groups">Hľadať kontakty alebo skupiny</string>
+ <string name="send_private_message">Poslať súkromnú správu</string>
+ <string name="user_has_left_conference">%s opustil skupinovú konverzáciu!</string>
</resources>
diff --git a/src/main/res/values-sr/strings.xml b/src/main/res/values-sr/strings.xml
index 96db8b7e3..25ab944e2 100644
--- a/src/main/res/values-sr/strings.xml
+++ b/src/main/res/values-sr/strings.xml
@@ -78,6 +78,7 @@
<string name="choose_presence">Избор присутности за контакта</string>
<string name="send_plain_text_message">Пошаљи обичну текстуалну поруку</string>
<string name="send_otr_message">Пошаљи ОТР шифровану поруку</string>
+ <string name="send_omemo_message">Пошаљи ОМЕМО шифровану поруку</string>
<string name="send_pgp_message">Пошаљи ОпенПГП шифровану поруку</string>
<string name="your_nick_has_been_changed">Ваш надимак је промењен</string>
<string name="send_unencrypted">Пошаљи нешифровано</string>
@@ -105,6 +106,8 @@
<string name="pref_vibrate_summary">Вибрирај кад стигне нова порука</string>
<string name="pref_sound">Звук</string>
<string name="pref_sound_summary">Звуци обавештења</string>
+ <string name="pref_conference_notifications">Обавештења у јавним конференцијама</string>
+ <string name="pref_conference_notifications_summary">Увек обавести кад стигне порука у конференцији уместо само кад је означена</string>
<string name="pref_notification_grace_period">Период одгоде обавештења</string>
<string name="pref_notification_grace_period_summary">Онемогући обавештења на кратко по примању карбон копије</string>
<string name="pref_advanced_options">Напредне поставке</string>
@@ -150,6 +153,7 @@
<string name="encryption_choice_none">Обичан текст</string>
<string name="encryption_choice_otr">ОТР</string>
<string name="encryption_choice_pgp">ОпенПГП</string>
+ <string name="encryption_choice_omemo">ОМЕМО</string>
<string name="mgmt_account_edit">Уреди налог</string>
<string name="mgmt_account_delete">Обриши налог</string>
<string name="mgmt_account_disable">Привремено онемогући</string>
@@ -202,6 +206,13 @@
<string name="reception_failed">Примање није успело</string>
<string name="your_fingerprint">Ваш отисак</string>
<string name="otr_fingerprint">ОТР отисак</string>
+ <string name="omemo_fingerprint">ОМЕМО отисак</string>
+ <string name="omemo_fingerprint_selected_message">ОМЕМО отисак поруке</string>
+ <string name="this_device_omemo_fingerprint">Сопствени ОМЕМО отисак</string>
+ <string name="other_devices">Остали уређаји</string>
+ <string name="trust_omemo_fingerprints">Поуздај се у ОМЕМО отиске</string>
+ <string name="fetching_keys">Добављам кључеве...</string>
+ <string name="done">Готово</string>
<string name="verify">Овери</string>
<string name="decrypt">Дешифруј</string>
<string name="conferences">Конференције</string>
@@ -282,6 +293,7 @@
<string name="pref_conference_name">Име конференције</string>
<string name="pref_conference_name_summary">Предмет собе уместо ЈИД-а идентификује конференцију</string>
<string name="toast_message_otr_fingerprint">ОТР отисак копиран на клипборд!</string>
+ <string name="toast_message_omemo_fingerprint">ОМЕМО отисак копиран на клипборд!</string>
<string name="conference_banned">Забрањени сте на овој конференцији</string>
<string name="conference_members_only">Ова конференција је само за чланове</string>
<string name="conference_kicked">Шутнути сте из ове конференције</string>
@@ -348,6 +360,14 @@
<string name="reset">Ресетуј</string>
<string name="account_image_description">Аватар налога</string>
<string name="copy_otr_clipboard_description">Копирај ОТР отисак на клипборд</string>
+ <string name="copy_omemo_clipboard_description">Копирај ОМЕМО отисак на клипборд</string>
+ <string name="regenerate_omemo_key">Поново генериши ОМЕМО кључ</string>
+ <string name="wipe_omemo_pep">Уклони остале уређаје са ПЕП-а</string>
+ <string name="clear_other_devices">Очисти уређаје</string>
+ <string name="clear_other_devices_desc">Желите ли заиста да уклоните све остале уређаје са ОМЕМО објаве? Када се ваши уређаји следећи пут повежу, објавиће се сами, али у међувремену можда неће примати поруке.</string>
+ <string name="purge_key">Очисти кључ</string>
+ <string name="purge_key_desc_part1">Желите ли заиста да очистите овај кључ?</string>
+ <string name="purge_key_desc_part2">Неповратно ће бити сматран компровитованим, и њиме више никад нећете моћи да успоставите сесију.</string>
<string name="fetching_history_from_server">Добављам историјат са сервера</string>
<string name="no_more_history_on_server">Нема више историјата на серверу</string>
<string name="updating">Ажурирам…</string>
@@ -415,6 +435,7 @@
<string name="hide_offline">Сакриј неповезане</string>
<string name="disable_account">Онемогући налог</string>
<string name="contact_is_typing">%s куца...</string>
+ <string name="is_typing">куца...</string>
<string name="contact_has_stopped_typing">%s престаде да куца</string>
<string name="pref_chat_states">Обавештења о куцању</string>
<string name="pref_chat_states_summary">Обзнаните контакту кад куцате нову поруку</string>
@@ -425,7 +446,7 @@
<string name="received_location">Примљена локација</string>
<string name="title_undo_swipe_out_conversation">Преписка затворена</string>
<string name="title_undo_swipe_out_muc">Напусти конференцију</string>
- <string name="pref_dont_trust_system_cas_title">Не веруј системским сертификационим телима</string>
+ <string name="pref_dont_trust_system_cas_title">Не поуздај се у системска сертификациона тела</string>
<string name="pref_dont_trust_system_cas_summary">Сви сертификати морају ручно да се одобре</string>
<string name="pref_remove_trusted_certificates_title">Уклони сертификате</string>
<string name="pref_remove_trusted_certificates_summary">Обриши ручно одобрене сертификате</string>
@@ -448,6 +469,13 @@
<string name="none">Ниједна</string>
<string name="recently_used">Недавно коришћена</string>
<string name="choose_quick_action">Изаберите брзу радњу</string>
- <string name="file_not_found_on_remote_host">Фајл није нађен на удаљеном серверу</string>
<string name="search_for_contacts_or_groups">Тражите контакте или групе</string>
+ <string name="send_private_message">Пошаљи личну поруку</string>
+ <string name="user_has_left_conference">%s напусти конференцију!</string>
+ <string name="username">Корисничко име</string>
+ <string name="username_hint">Корисничко име</string>
+ <string name="invalid_username">Ово није исправно корисничко име</string>
+ <string name="download_failed_server_not_found">Преузимање није успело: сервер није нађен</string>
+ <string name="download_failed_file_not_found">Преузимање није успело: фајл није нађен</string>
+ <string name="download_failed_could_not_connect">Преузимање није успело: не могу да се повежем са домаћином</string>
</resources>
diff --git a/src/main/res/values-sv/strings.xml b/src/main/res/values-sv/strings.xml
index 6c4436a8b..90ca685c8 100644
--- a/src/main/res/values-sv/strings.xml
+++ b/src/main/res/values-sv/strings.xml
@@ -78,6 +78,7 @@
<string name="choose_presence">Välj tillgänglighet till kontakt</string>
<string name="send_plain_text_message">Skicka meddelande i klartext</string>
<string name="send_otr_message">Skicka OTR-krypterat meddelande</string>
+ <string name="send_omemo_message">Skicka OMEMO-krypterat meddelande</string>
<string name="send_pgp_message">Skicka OpenPGP-krypterat meddelande</string>
<string name="your_nick_has_been_changed">Ditt nick har ändrats</string>
<string name="send_unencrypted">Skicka okrypterat</string>
@@ -105,6 +106,8 @@
<string name="pref_vibrate_summary">Vibrera när meddelande tagits emot</string>
<string name="pref_sound">Ljud</string>
<string name="pref_sound_summary">Spela ljud med notifiering</string>
+ <string name="pref_conference_notifications">Notifieringar i publika konferenser</string>
+ <string name="pref_conference_notifications_summary">Notifiera alltid för meddelande i en publik konferens istället för endast vid highlight</string>
<string name="pref_notification_grace_period">Notifieringsfrist</string>
<string name="pref_notification_grace_period_summary">Inaktivera notifieringar en kort stund efter att en carbon copy tagits emot</string>
<string name="pref_advanced_options">Avancerade inställningar</string>
@@ -150,6 +153,7 @@
<string name="encryption_choice_none">Klartext</string>
<string name="encryption_choice_otr">OTR</string>
<string name="encryption_choice_pgp">OpenPGP</string>
+ <string name="encryption_choice_omemo">OMEMO</string>
<string name="mgmt_account_edit">Ändra konto</string>
<string name="mgmt_account_delete">Ta bort</string>
<string name="mgmt_account_disable">Inaktivera tillfälligt</string>
@@ -202,6 +206,13 @@
<string name="reception_failed">Mottagning misslyckades</string>
<string name="your_fingerprint">Ditt fingeravtryck</string>
<string name="otr_fingerprint">OTR-fingeravtryck</string>
+ <string name="omemo_fingerprint">OMEMO-fingeravtryck</string>
+ <string name="omemo_fingerprint_selected_message">Meddelandets OMEMO-fingeravtryck</string>
+ <string name="this_device_omemo_fingerprint">Eget OMEMO-fingeravtryck</string>
+ <string name="other_devices">Andra enheter</string>
+ <string name="trust_omemo_fingerprints">Lita på OMEMO-fingeravtryck</string>
+ <string name="fetching_keys">Hämtar nycklar...</string>
+ <string name="done">Klar</string>
<string name="verify">Verifiera</string>
<string name="decrypt">Avkryptera</string>
<string name="conferences">Konferenser</string>
@@ -282,6 +293,7 @@
<string name="pref_conference_name">Konferensnamn</string>
<string name="pref_conference_name_summary">Använd konferensens ämne istället för JID för att identifiera konferenser</string>
<string name="toast_message_otr_fingerprint">OTR-fingeravtryck har kopierats till urklipp!</string>
+ <string name="toast_message_omemo_fingerprint">OMEMO-fingeravtryck har kopierats till urklipp!</string>
<string name="conference_banned">Du är bannlyst från denna konferens</string>
<string name="conference_members_only">Medlemsskap krävs för denna konferens</string>
<string name="conference_kicked">Du har blivit utsparkad från denna konferens</string>
@@ -348,6 +360,14 @@
<string name="reset">Återställ</string>
<string name="account_image_description">Kontots avatarbild</string>
<string name="copy_otr_clipboard_description">Kopiera OTR-fingeravtryck till urklipp</string>
+ <string name="copy_omemo_clipboard_description">Kopiera OMEMO-fingeravtryck till urklipp</string>
+ <string name="regenerate_omemo_key">Regenerera OMEMO-nyckel</string>
+ <string name="wipe_omemo_pep">Rensa andra enheter från PEP</string>
+ <string name="clear_other_devices">Rensa enheter</string>
+ <string name="clear_other_devices_desc">Är du säker på att du vill rensa alla andra enheter från OMEMO-annonsering? Nästa gång dina enheter ansluter kommer de att återannonsera sig, men de kanske inte tar emot enheter under tiden.</string>
+ <string name="purge_key">Rensa nyckel</string>
+ <string name="purge_key_desc_part1">Är du säker på att du vill rensa denna nyckel?</string>
+ <string name="purge_key_desc_part2">Den kommer att antas oåterkalleligt komprometterat och du kommer aldrig kunna bygga en session med den igen.</string>
<string name="fetching_history_from_server">Hämtar historik från server</string>
<string name="no_more_history_on_server">Ingen mer historik på server</string>
<string name="updating">Uppdaterar…</string>
@@ -415,6 +435,7 @@
<string name="hide_offline">Dölj ej anslutna</string>
<string name="disable_account">Deaktivera konton</string>
<string name="contact_is_typing">%s skriver...</string>
+ <string name="is_typing">skriver...</string>
<string name="contact_has_stopped_typing">%s har slutat skriva</string>
<string name="pref_chat_states">Skriv-notifieringar</string>
<string name="pref_chat_states_summary">Låter dina kontakter veta när du skriver ett nytt meddelande</string>
@@ -446,6 +467,13 @@
<string name="none">Ingen</string>
<string name="recently_used">Senast använd</string>
<string name="choose_quick_action">Välj snabbfunktion</string>
- <string name="file_not_found_on_remote_host">Filen hittas ej på servern</string>
<string name="search_for_contacts_or_groups">Sök efter kontakter eller grupper</string>
+ <string name="send_private_message">Skicka privat meddelande</string>
+ <string name="user_has_left_conference">%s har lämnat konferensen!</string>
+ <string name="username">Användarnamn</string>
+ <string name="username_hint">Användarnamn</string>
+ <string name="invalid_username">Inte ett giltigt användanamn</string>
+ <string name="download_failed_server_not_found">Nerladdning gick fel: Server hittades inte</string>
+ <string name="download_failed_file_not_found">Nerladdning gick fel: Filen hittades inte</string>
+ <string name="download_failed_could_not_connect">Nerladdningen gick fel: Kunder inte ansluta till server</string>
</resources>
diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
index d1d593476..185494bc3 100644
--- a/src/main/res/values/strings.xml
+++ b/src/main/res/values/strings.xml
@@ -214,7 +214,7 @@
<string name="this_device_omemo_fingerprint">Own OMEMO fingerprint</string>
<string name="other_devices">Other devices</string>
<string name="trust_omemo_fingerprints">Trust OMEMO Fingerprints</string>
- <string name="fetching_keys">Fetching keys...</string>
+ <string name="fetching_keys">Fetching keys…</string>
<string name="done">Done</string>
<string name="verify">Verify</string>
<string name="decrypt">Decrypt</string>
@@ -469,7 +469,8 @@
<string name="offering_x_file">Offering %s</string>
<string name="hide_offline">Hide offline</string>
<string name="disable_account">Disable Account</string>
- <string name="contact_is_typing">%s is typing...</string>
+ <string name="contact_is_typing">%s is typing…</string>
+ <string name="is_typing">is typing…</string>
<string name="contact_has_stopped_typing">%s has stopped typing</string>
<string name="pref_chat_states">Typing notifications</string>
<string name="pref_chat_states_summary">Let your contact know when you are writing a new message</string>
@@ -504,11 +505,11 @@
<string name="search_for_contacts_or_groups">Search for contacts or groups</string>
<string name="send_private_message">Send private message</string>
<string name="user_has_left_conference">%s has left the conference!</string>
- <string name="is_typing">is typing...</string>
<string name="username">Username</string>
<string name="username_hint">Username</string>
<string name="invalid_username">This is not a valid username</string>
<string name="download_failed_server_not_found">Download failed: Server not found</string>
<string name="download_failed_file_not_found">Download failed: File not found</string>
<string name="download_failed_could_not_connect">Download failed: Could not connect to host</string>
+ <string name="elv_undo">undo</string>
</resources>