aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.md3
-rw-r--r--README.md7
-rw-r--r--build.gradle4
-rw-r--r--src/free/java/eu/siacs/conversations/services/PushManagementService.java4
-rw-r--r--src/main/java/eu/siacs/conversations/Config.java2
-rw-r--r--src/main/java/eu/siacs/conversations/crypto/axolotl/AxolotlService.java13
-rw-r--r--src/main/java/eu/siacs/conversations/crypto/axolotl/CryptoFailedException.java5
-rw-r--r--src/main/java/eu/siacs/conversations/crypto/axolotl/FingerprintStatus.java10
-rw-r--r--src/main/java/eu/siacs/conversations/crypto/axolotl/XmppAxolotlMessage.java15
-rw-r--r--src/main/java/eu/siacs/conversations/crypto/axolotl/XmppAxolotlSession.java52
-rw-r--r--src/main/java/eu/siacs/conversations/crypto/sasl/ScramMechanism.java228
-rw-r--r--src/main/java/eu/siacs/conversations/crypto/sasl/ScramSha1.java210
-rw-r--r--src/main/java/eu/siacs/conversations/crypto/sasl/ScramSha256.java30
-rw-r--r--src/main/java/eu/siacs/conversations/entities/Conversation.java44
-rw-r--r--src/main/java/eu/siacs/conversations/http/HttpDownloadConnection.java8
-rw-r--r--src/main/java/eu/siacs/conversations/http/HttpUploadConnection.java2
-rw-r--r--src/main/java/eu/siacs/conversations/persistance/FileBackend.java10
-rw-r--r--src/main/java/eu/siacs/conversations/services/AbstractConnectionManager.java14
-rw-r--r--src/main/java/eu/siacs/conversations/services/MessageArchiveService.java4
-rw-r--r--src/main/java/eu/siacs/conversations/services/NotificationService.java19
-rw-r--r--src/main/java/eu/siacs/conversations/services/XmppConnectionService.java18
-rw-r--r--src/main/java/eu/siacs/conversations/ui/ContactDetailsActivity.java8
-rw-r--r--src/main/java/eu/siacs/conversations/ui/ConversationActivity.java16
-rw-r--r--src/main/java/eu/siacs/conversations/ui/ConversationFragment.java21
-rw-r--r--src/main/java/eu/siacs/conversations/ui/EditAccountActivity.java2
-rw-r--r--src/main/java/eu/siacs/conversations/ui/OmemoActivity.java20
-rw-r--r--src/main/java/eu/siacs/conversations/ui/ShareWithActivity.java56
-rw-r--r--src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java16
-rw-r--r--src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java62
-rw-r--r--src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnection.java10
-rw-r--r--src/main/res/layout/activity_contact_details.xml1
-rw-r--r--src/main/res/menu/omemo_key_context.xml4
-rw-r--r--src/main/res/values-bg/strings.xml15
-rw-r--r--src/main/res/values-cs/strings.xml3
-rw-r--r--src/main/res/values-de/strings.xml33
-rw-r--r--src/main/res/values-es/strings.xml3
-rw-r--r--src/main/res/values-eu/strings.xml3
-rw-r--r--src/main/res/values-fr/strings.xml3
-rw-r--r--src/main/res/values-it/strings.xml15
-rw-r--r--src/main/res/values-iw/strings.xml3
-rw-r--r--src/main/res/values-ja/strings.xml15
-rw-r--r--src/main/res/values-ko/strings.xml86
-rw-r--r--src/main/res/values-nb-rNO/strings.xml169
-rw-r--r--src/main/res/values-nl/strings.xml15
-rw-r--r--src/main/res/values-pl/strings.xml76
-rw-r--r--src/main/res/values-pt-rBR/strings.xml7
-rw-r--r--src/main/res/values-pt/strings.xml3
-rw-r--r--src/main/res/values-ro-rRO/strings.xml15
-rw-r--r--src/main/res/values-ru/strings.xml3
-rw-r--r--src/main/res/values-sr/strings.xml3
-rw-r--r--src/main/res/values-sv/strings.xml3
-rw-r--r--src/main/res/values-tr-rTR/strings.xml15
-rw-r--r--src/main/res/values-uk/strings.xml3
-rw-r--r--src/main/res/values-vi/strings.xml3
-rw-r--r--src/main/res/values-zh-rCN/strings.xml3
-rw-r--r--src/main/res/values-zh-rTW/strings.xml3
-rw-r--r--src/main/res/values/strings.xml6
-rw-r--r--src/playstore/java/eu/siacs/conversations/services/PushManagementService.java4
58 files changed, 972 insertions, 456 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 499866ea..0727d3cb 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,8 @@
###Changelog
+####Version 1.15.4
+* bug fixes
+
####Version 1.15.3
* show offline contacts in MUC as grayed-out
* don't transcode gifs. add overlay indication to gifs
diff --git a/README.md b/README.md
index 38e8f512..39ac91c2 100644
--- a/README.md
+++ b/README.md
@@ -120,8 +120,13 @@ My Bitcoin Address is: `1NxSU1YxYzJVDpX1rcESAA3NJki7kRgeeu`
#### How do I create an account?
XMPP, like email, is a federated protocol, which means that there is not one company you can create an *official XMPP account* with. Instead there are hundreds, or even thousands, of providers out there. One of those providers is our very own [conversations.im](https://account.conversations.im). If you don’t like to use *conversations.im* use a web search engine of your choice to find another provider. Or maybe your university has one. Or you can run your own. Or ask a friend to run one. Once you've found one, you can use Conversations to create an account. Just select *register new account* on server within the create account dialog.
+##### Domain hosting
+Using your own domain not only gives you a more recognizable Jabber ID, it also gives you the flexibilty to migrate your account between different XMPP providers. This is a good compromise between the responsibilities of having to operate your own server and the downsides of being dependent on a single provider.
+
+Learn more about [conversations.im Jabber/XMPP domain hosting](https://account.conversations.im/domain/).
+
##### Running your own
-If you have a server somewhere and are willing to put some work in, the best alternative-in the spirit of federation-is to run your own. We recommend either [Prosody](https://prosody.im/) or [ejabberd](https://www.ejabberd.im/). Both of which have their own strengths. Ejabberd is slightly more mature nowadays but Prosody is arguably easier to set up.
+If you already have a server somewhere and are willing and able to put the necessary work in, one alternative-in the spirit of federation-is to run your own. We recommend either [Prosody](https://prosody.im/) or [ejabberd](https://www.ejabberd.im/). Both of which have their own strengths. Ejabberd is slightly more mature nowadays but Prosody is arguably easier to set up.
For Prosody you need a couple of so called [community modules](https://modules.prosody.im/) most of which are maintained by the same people that develop Prosody.
diff --git a/build.gradle b/build.gradle
index 3bc46c49..7ece3db1 100644
--- a/build.gradle
+++ b/build.gradle
@@ -55,8 +55,8 @@ android {
defaultConfig {
minSdkVersion 14
targetSdkVersion 25
- versionCode 189
- versionName "1.15.3"
+ versionCode 192
+ versionName "1.15.4"
archivesBaseName += "-$versionName"
applicationId "eu.siacs.conversations"
}
diff --git a/src/free/java/eu/siacs/conversations/services/PushManagementService.java b/src/free/java/eu/siacs/conversations/services/PushManagementService.java
index c6c5d232..ffce90b8 100644
--- a/src/free/java/eu/siacs/conversations/services/PushManagementService.java
+++ b/src/free/java/eu/siacs/conversations/services/PushManagementService.java
@@ -21,4 +21,8 @@ public class PushManagementService {
public boolean isStub() {
return true;
}
+
+ public boolean availableAndUseful(Account account) {
+ return false;
+ }
}
diff --git a/src/main/java/eu/siacs/conversations/Config.java b/src/main/java/eu/siacs/conversations/Config.java
index 1a992e48..48d2620a 100644
--- a/src/main/java/eu/siacs/conversations/Config.java
+++ b/src/main/java/eu/siacs/conversations/Config.java
@@ -109,7 +109,7 @@ public final class Config {
public static final int MAM_MAX_MESSAGES = 500;
public static final long FREQUENT_RESTARTS_DETECTION_WINDOW = 12 * 60 * 60 * 1000; // 10 hours
- public static final long FREQUENT_RESTARTS_THRESHOLD = 16;
+ public static final long FREQUENT_RESTARTS_THRESHOLD = 0; // previous value was 16;
public static final ChatState DEFAULT_CHATSTATE = ChatState.ACTIVE;
public static final int TYPING_TIMEOUT = 8;
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 65ac7b0a..6bde0fe7 100644
--- a/src/main/java/eu/siacs/conversations/crypto/axolotl/AxolotlService.java
+++ b/src/main/java/eu/siacs/conversations/crypto/axolotl/AxolotlService.java
@@ -439,8 +439,10 @@ public class AxolotlService implements OnAdvancedStreamFeaturesLoaded {
mXmppConnectionService.sendIqPacket(account, publish, null);
}
- public void purgeKey(final String fingerprint) {
- axolotlStore.setFingerprintStatus(fingerprint.replaceAll("\\s", ""), FingerprintStatus.createCompromised());
+ public void distrustFingerprint(final String fingerprint) {
+ final String fp = fingerprint.replaceAll("\\s", "");
+ final FingerprintStatus fingerprintStatus = axolotlStore.getFingerprintStatus(fp);
+ axolotlStore.setFingerprintStatus(fp,fingerprintStatus.toUntrusted());
}
public void publishOwnDeviceIdIfNeeded() {
@@ -1120,7 +1122,7 @@ public class AxolotlService implements OnAdvancedStreamFeaturesLoaded {
session.resetPreKeyId();
}
} catch (CryptoFailedException e) {
- Log.w(Config.LOGTAG, getLogprefix(account) + "Failed to decrypt message: " + e.getMessage());
+ Log.w(Config.LOGTAG, getLogprefix(account) + "Failed to decrypt message from "+message.getFrom()+": " + e.getMessage());
}
if (session.isFresh() && plaintextMessage != null) {
@@ -1134,7 +1136,12 @@ public class AxolotlService implements OnAdvancedStreamFeaturesLoaded {
XmppAxolotlMessage.XmppAxolotlKeyTransportMessage keyTransportMessage;
XmppAxolotlSession session = getReceivingSession(message);
+ try {
keyTransportMessage = message.getParameters(session, getOwnDeviceId());
+ } catch (CryptoFailedException e) {
+ Log.d(Config.LOGTAG,"could not decrypt keyTransport message "+e.getMessage());
+ keyTransportMessage = null;
+ }
if (session.isFresh() && keyTransportMessage != null) {
putFreshSession(session);
diff --git a/src/main/java/eu/siacs/conversations/crypto/axolotl/CryptoFailedException.java b/src/main/java/eu/siacs/conversations/crypto/axolotl/CryptoFailedException.java
index 5796ef30..e549598c 100644
--- a/src/main/java/eu/siacs/conversations/crypto/axolotl/CryptoFailedException.java
+++ b/src/main/java/eu/siacs/conversations/crypto/axolotl/CryptoFailedException.java
@@ -1,6 +1,11 @@
package eu.siacs.conversations.crypto.axolotl;
public class CryptoFailedException extends Exception {
+
+ public CryptoFailedException(String msg) {
+ super(msg);
+ }
+
public CryptoFailedException(Exception e){
super(e);
}
diff --git a/src/main/java/eu/siacs/conversations/crypto/axolotl/FingerprintStatus.java b/src/main/java/eu/siacs/conversations/crypto/axolotl/FingerprintStatus.java
index 31b2264b..56f4a5d2 100644
--- a/src/main/java/eu/siacs/conversations/crypto/axolotl/FingerprintStatus.java
+++ b/src/main/java/eu/siacs/conversations/crypto/axolotl/FingerprintStatus.java
@@ -126,17 +126,17 @@ public class FingerprintStatus implements Comparable<FingerprintStatus> {
return trust;
}
- public static FingerprintStatus createCompromised() {
+ public FingerprintStatus toVerified() {
FingerprintStatus status = new FingerprintStatus();
- status.active = false;
- status.trust = Trust.COMPROMISED;
+ status.active = active;
+ status.trust = Trust.VERIFIED;
return status;
}
- public FingerprintStatus toVerified() {
+ public FingerprintStatus toUntrusted() {
FingerprintStatus status = new FingerprintStatus();
status.active = active;
- status.trust = Trust.VERIFIED;
+ status.trust = Trust.UNTRUSTED;
return status;
}
diff --git a/src/main/java/eu/siacs/conversations/crypto/axolotl/XmppAxolotlMessage.java b/src/main/java/eu/siacs/conversations/crypto/axolotl/XmppAxolotlMessage.java
index 1f532370..cac298e0 100644
--- a/src/main/java/eu/siacs/conversations/crypto/axolotl/XmppAxolotlMessage.java
+++ b/src/main/java/eu/siacs/conversations/crypto/axolotl/XmppAxolotlMessage.java
@@ -23,7 +23,6 @@ import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import eu.siacs.conversations.Config;
-import eu.siacs.conversations.utils.CryptoHelper;
import eu.siacs.conversations.xml.Element;
import eu.siacs.conversations.xmpp.jid.Jid;
@@ -251,16 +250,16 @@ public class XmppAxolotlMessage {
return encryptionElement;
}
- private byte[] unpackKey(XmppAxolotlSession session, Integer sourceDeviceId) {
+ private byte[] unpackKey(XmppAxolotlSession session, Integer sourceDeviceId) throws CryptoFailedException {
XmppAxolotlSession.AxolotlKey encryptedKey = keys.get(sourceDeviceId);
- return (encryptedKey != null) ? session.processReceiving(encryptedKey) : null;
+ if (encryptedKey == null) {
+ throw new CryptoFailedException("Message was not encrypted for this device");
+ }
+ return session.processReceiving(encryptedKey);
}
- public XmppAxolotlKeyTransportMessage getParameters(XmppAxolotlSession session, Integer sourceDeviceId) {
- byte[] key = unpackKey(session, sourceDeviceId);
- return (key != null)
- ? new XmppAxolotlKeyTransportMessage(session.getFingerprint(), key, getIV())
- : null;
+ public XmppAxolotlKeyTransportMessage getParameters(XmppAxolotlSession session, Integer sourceDeviceId) throws CryptoFailedException {
+ return new XmppAxolotlKeyTransportMessage(session.getFingerprint(), unpackKey(session, sourceDeviceId), getIV());
}
public XmppAxolotlPlaintextMessage decrypt(XmppAxolotlSession session, Integer sourceDeviceId) throws CryptoFailedException {
diff --git a/src/main/java/eu/siacs/conversations/crypto/axolotl/XmppAxolotlSession.java b/src/main/java/eu/siacs/conversations/crypto/axolotl/XmppAxolotlSession.java
index 773b6857..359cb7fd 100644
--- a/src/main/java/eu/siacs/conversations/crypto/axolotl/XmppAxolotlSession.java
+++ b/src/main/java/eu/siacs/conversations/crypto/axolotl/XmppAxolotlSession.java
@@ -4,6 +4,7 @@ import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.Log;
+import org.bouncycastle.math.ec.PreCompInfo;
import org.whispersystems.libaxolotl.AxolotlAddress;
import org.whispersystems.libaxolotl.DuplicateMessageException;
import org.whispersystems.libaxolotl.IdentityKey;
@@ -18,9 +19,11 @@ import org.whispersystems.libaxolotl.UntrustedIdentityException;
import org.whispersystems.libaxolotl.protocol.CiphertextMessage;
import org.whispersystems.libaxolotl.protocol.PreKeyWhisperMessage;
import org.whispersystems.libaxolotl.protocol.WhisperMessage;
+import org.whispersystems.libaxolotl.util.guava.Optional;
import eu.siacs.conversations.Config;
import eu.siacs.conversations.entities.Account;
+import eu.siacs.conversations.utils.CryptoHelper;
public class XmppAxolotlSession implements Comparable<XmppAxolotlSession> {
private final SessionCipher cipher;
@@ -82,42 +85,43 @@ public class XmppAxolotlSession implements Comparable<XmppAxolotlSession> {
}
@Nullable
- public byte[] processReceiving(AxolotlKey encryptedKey) {
- byte[] plaintext = null;
+ public byte[] processReceiving(AxolotlKey encryptedKey) throws CryptoFailedException {
+ byte[] plaintext;
FingerprintStatus status = getTrust();
if (!status.isCompromised()) {
try {
+ CiphertextMessage ciphertextMessage;
try {
- PreKeyWhisperMessage message = new PreKeyWhisperMessage(encryptedKey.key);
- if (!message.getPreKeyId().isPresent()) {
- Log.w(Config.LOGTAG, AxolotlService.getLogprefix(account) + "PreKeyWhisperMessage did not contain a PreKeyId");
- return null;
+ ciphertextMessage = new PreKeyWhisperMessage(encryptedKey.key);
+ Optional<Integer> optionalPreKeyId = ((PreKeyWhisperMessage) ciphertextMessage).getPreKeyId();
+ IdentityKey identityKey = ((PreKeyWhisperMessage) ciphertextMessage).getIdentityKey();
+ if (!optionalPreKeyId.isPresent()) {
+ throw new CryptoFailedException("PreKeyWhisperMessage did not contain a PreKeyId");
+ }
+ preKeyId = optionalPreKeyId.get();
+ if (this.identityKey != null && !this.identityKey.equals(identityKey)) {
+ throw new CryptoFailedException("Received PreKeyWhisperMessage but preexisting identity key changed.");
+ }
+ this.identityKey = identityKey;
+ } catch (InvalidVersionException | InvalidMessageException e) {
+ ciphertextMessage = new WhisperMessage(encryptedKey.key);
}
- Log.i(Config.LOGTAG, AxolotlService.getLogprefix(account) + "PreKeyWhisperMessage received, new session ID:" + message.getSignedPreKeyId() + "/" + message.getPreKeyId());
- IdentityKey msgIdentityKey = message.getIdentityKey();
- if (this.identityKey != null && !this.identityKey.equals(msgIdentityKey)) {
- Log.e(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Had session with fingerprint " + this.getFingerprint() + ", received message with fingerprint " + msgIdentityKey.getFingerprint());
+ if (ciphertextMessage instanceof PreKeyWhisperMessage) {
+ plaintext = cipher.decrypt((PreKeyWhisperMessage) ciphertextMessage);
} else {
- this.identityKey = msgIdentityKey;
- plaintext = cipher.decrypt(message);
- preKeyId = message.getPreKeyId().get();
+ plaintext = cipher.decrypt((WhisperMessage) ciphertextMessage);
}
- } catch (InvalidMessageException | InvalidVersionException e) {
- Log.i(Config.LOGTAG, AxolotlService.getLogprefix(account) + "WhisperMessage received");
- WhisperMessage message = new WhisperMessage(encryptedKey.key);
- plaintext = cipher.decrypt(message);
- } catch (InvalidKeyException | InvalidKeyIdException | UntrustedIdentityException e) {
- Log.w(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Error decrypting axolotl header, " + e.getClass().getName() + ": " + e.getMessage());
+ } catch (InvalidKeyException | LegacyMessageException | InvalidMessageException | DuplicateMessageException | NoSessionException | InvalidKeyIdException | UntrustedIdentityException e) {
+ if (!(e instanceof DuplicateMessageException)) {
+ e.printStackTrace();
}
- } catch (LegacyMessageException | InvalidMessageException | DuplicateMessageException | NoSessionException e) {
- Log.w(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Error decrypting axolotl header, " + e.getClass().getName() + ": " + e.getMessage());
+ throw new CryptoFailedException("Error decrypting WhisperMessage " + e.getClass().getSimpleName() + ": " + e.getMessage());
}
-
- if (plaintext != null) {
if (!status.isActive()) {
setTrust(status.toActive());
}
- }
+ } else {
+ throw new CryptoFailedException("not encrypting omemo message from fingerprint "+getFingerprint()+" because it was marked as compromised");
}
return plaintext;
}
diff --git a/src/main/java/eu/siacs/conversations/crypto/sasl/ScramMechanism.java b/src/main/java/eu/siacs/conversations/crypto/sasl/ScramMechanism.java
new file mode 100644
index 00000000..566835d6
--- /dev/null
+++ b/src/main/java/eu/siacs/conversations/crypto/sasl/ScramMechanism.java
@@ -0,0 +1,228 @@
+package eu.siacs.conversations.crypto.sasl;
+
+import android.annotation.TargetApi;
+import android.os.Build;
+import android.util.Base64;
+import android.util.LruCache;
+
+import org.bouncycastle.crypto.Digest;
+import org.bouncycastle.crypto.macs.HMac;
+import org.bouncycastle.crypto.params.KeyParameter;
+
+import java.math.BigInteger;
+import java.nio.charset.Charset;
+import java.security.InvalidKeyException;
+import java.security.SecureRandom;
+
+import eu.siacs.conversations.entities.Account;
+import eu.siacs.conversations.utils.CryptoHelper;
+import eu.siacs.conversations.xml.TagWriter;
+
+@TargetApi(Build.VERSION_CODES.HONEYCOMB_MR1)
+abstract class ScramMechanism extends SaslMechanism {
+ // TODO: When channel binding (SCRAM-SHA1-PLUS) is supported in future, generalize this to indicate support and/or usage.
+ private final static String GS2_HEADER = "n,,";
+ private String clientFirstMessageBare;
+ private final String clientNonce;
+ private byte[] serverSignature = null;
+ static HMac HMAC;
+ static Digest DIGEST;
+ private static final byte[] CLIENT_KEY_BYTES = "Client Key".getBytes();
+ private static final byte[] SERVER_KEY_BYTES = "Server Key".getBytes();
+
+ private static class KeyPair {
+ final byte[] clientKey;
+ final byte[] serverKey;
+
+ KeyPair(final byte[] clientKey, final byte[] serverKey) {
+ this.clientKey = clientKey;
+ this.serverKey = serverKey;
+ }
+ }
+
+ static {
+ CACHE = new LruCache<String, KeyPair>(10) {
+ protected KeyPair create(final String k) {
+ // Map keys are "bytesToHex(JID),bytesToHex(password),bytesToHex(salt),iterations".
+ // Changing any of these values forces a cache miss. `CryptoHelper.bytesToHex()'
+ // is applied to prevent commas in the strings breaking things.
+ final String[] kparts = k.split(",", 4);
+ try {
+ final byte[] saltedPassword, serverKey, clientKey;
+ saltedPassword = hi(CryptoHelper.hexToString(kparts[1]).getBytes(),
+ Base64.decode(CryptoHelper.hexToString(kparts[2]), Base64.DEFAULT), Integer.valueOf(kparts[3]));
+ serverKey = hmac(saltedPassword, SERVER_KEY_BYTES);
+ clientKey = hmac(saltedPassword, CLIENT_KEY_BYTES);
+
+ return new KeyPair(clientKey, serverKey);
+ } catch (final InvalidKeyException | NumberFormatException e) {
+ return null;
+ }
+ }
+ };
+ }
+
+ private static final LruCache<String, KeyPair> CACHE;
+
+ protected State state = State.INITIAL;
+
+ ScramMechanism(final TagWriter tagWriter, final Account account, final SecureRandom rng) {
+ super(tagWriter, account, rng);
+
+ // This nonce should be different for each authentication attempt.
+ clientNonce = new BigInteger(100, this.rng).toString(32);
+ clientFirstMessageBare = "";
+ }
+
+ @Override
+ public String getClientFirstMessage() {
+ if (clientFirstMessageBare.isEmpty() && state == State.INITIAL) {
+ clientFirstMessageBare = "n=" + CryptoHelper.saslEscape(CryptoHelper.saslPrep(account.getUsername())) +
+ ",r=" + this.clientNonce;
+ state = State.AUTH_TEXT_SENT;
+ }
+ return Base64.encodeToString(
+ (GS2_HEADER + clientFirstMessageBare).getBytes(Charset.defaultCharset()),
+ Base64.NO_WRAP);
+ }
+
+ @Override
+ 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");
+ }
+ byte[] serverFirstMessage = Base64.decode(challenge, Base64.DEFAULT);
+ final Tokenizer tokenizer = new Tokenizer(serverFirstMessage);
+ String nonce = "";
+ int iterationCount = -1;
+ String salt = "";
+ for (final String token : tokenizer) {
+ if (token.charAt(1) == '=') {
+ switch (token.charAt(0)) {
+ case 'i':
+ try {
+ iterationCount = Integer.parseInt(token.substring(2));
+ } catch (final NumberFormatException e) {
+ throw new AuthenticationException(e);
+ }
+ break;
+ case 's':
+ salt = token.substring(2);
+ break;
+ case 'r':
+ nonce = token.substring(2);
+ break;
+ case 'm':
+ /*
+ * RFC 5802:
+ * m: This attribute is reserved for future extensibility. In this
+ * version of SCRAM, its presence in a client or a server message
+ * MUST cause authentication failure when the attribute is parsed by
+ * the other end.
+ */
+ throw new AuthenticationException("Server sent reserved token: `m'");
+ }
+ }
+ }
+
+ if (iterationCount < 0) {
+ throw new AuthenticationException("Server did not send iteration count");
+ }
+ if (nonce.isEmpty() || !nonce.startsWith(clientNonce)) {
+ throw new AuthenticationException("Server nonce does not contain client nonce: " + nonce);
+ }
+ if (salt.isEmpty()) {
+ throw new AuthenticationException("Server sent empty salt");
+ }
+
+ final String clientFinalMessageWithoutProof = "c=" + Base64.encodeToString(
+ GS2_HEADER.getBytes(), Base64.NO_WRAP) + ",r=" + nonce;
+ final byte[] authMessage = (clientFirstMessageBare + ',' + new String(serverFirstMessage) + ','
+ + clientFinalMessageWithoutProof).getBytes();
+
+ // Map keys are "bytesToHex(JID),bytesToHex(password),bytesToHex(salt),iterations".
+ final KeyPair keys = CACHE.get(
+ CryptoHelper.bytesToHex(account.getJid().toBareJid().toString().getBytes()) + ","
+ + CryptoHelper.bytesToHex(account.getPassword().getBytes()) + ","
+ + CryptoHelper.bytesToHex(salt.getBytes()) + ","
+ + String.valueOf(iterationCount)
+ );
+ if (keys == null) {
+ throw new AuthenticationException("Invalid keys generated");
+ }
+ final byte[] clientSignature;
+ try {
+ serverSignature = hmac(keys.serverKey, authMessage);
+ final byte[] storedKey = digest(keys.clientKey);
+
+ clientSignature = hmac(storedKey, authMessage);
+
+ } catch (final InvalidKeyException e) {
+ throw new AuthenticationException(e);
+ }
+
+ final byte[] clientProof = new byte[keys.clientKey.length];
+
+ for (int i = 0; i < clientProof.length; i++) {
+ clientProof[i] = (byte) (keys.clientKey[i] ^ clientSignature[i]);
+ }
+
+
+ final String clientFinalMessage = clientFinalMessageWithoutProof + ",p=" +
+ Base64.encodeToString(clientProof, Base64.NO_WRAP);
+ state = State.RESPONSE_SENT;
+ return Base64.encodeToString(clientFinalMessage.getBytes(), Base64.NO_WRAP);
+ case RESPONSE_SENT:
+ try {
+ final String clientCalculatedServerFinalMessage = "v=" +
+ Base64.encodeToString(serverSignature, Base64.NO_WRAP);
+ if (!clientCalculatedServerFinalMessage.equals(new String(Base64.decode(challenge, Base64.DEFAULT)))) {
+ throw new Exception();
+ }
+ state = State.VALID_SERVER_RESPONSE;
+ return "";
+ } catch(Exception e) {
+ throw new AuthenticationException("Server final message does not match calculated final message");
+ }
+ default:
+ throw new InvalidStateException(state);
+ }
+ }
+
+ private static synchronized byte[] hmac(final byte[] key, final byte[] input)
+ throws InvalidKeyException {
+ HMAC.init(new KeyParameter(key));
+ HMAC.update(input, 0, input.length);
+ final byte[] out = new byte[HMAC.getMacSize()];
+ HMAC.doFinal(out, 0);
+ return out;
+ }
+
+ public static synchronized byte[] digest(byte[] bytes) {
+ DIGEST.reset();
+ DIGEST.update(bytes, 0, bytes.length);
+ final byte[] out = new byte[DIGEST.getDigestSize()];
+ DIGEST.doFinal(out, 0);
+ return out;
+ }
+
+ /*
+ * Hi() is, essentially, PBKDF2 [RFC2898] with HMAC() as the
+ * pseudorandom function (PRF) and with dkLen == output length of
+ * HMAC() == output length of H().
+ */
+ private static synchronized byte[] hi(final byte[] key, final byte[] salt, final int iterations)
+ throws InvalidKeyException {
+ byte[] u = hmac(key, CryptoHelper.concatenateByteArrays(salt, CryptoHelper.ONE));
+ byte[] out = u.clone();
+ for (int i = 1; i < iterations; i++) {
+ u = hmac(key, u);
+ for (int j = 0; j < u.length; j++) {
+ out[j] ^= u[j];
+ }
+ }
+ return out;
+ }
+}
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 f40eec55..13593778 100644
--- a/src/main/java/eu/siacs/conversations/crypto/sasl/ScramSha1.java
+++ b/src/main/java/eu/siacs/conversations/crypto/sasl/ScramSha1.java
@@ -1,77 +1,21 @@
package eu.siacs.conversations.crypto.sasl;
-import android.util.Base64;
-import android.util.LruCache;
-
-import org.bouncycastle.crypto.Digest;
import org.bouncycastle.crypto.digests.SHA1Digest;
import org.bouncycastle.crypto.macs.HMac;
-import org.bouncycastle.crypto.params.KeyParameter;
-import java.math.BigInteger;
-import java.nio.charset.Charset;
-import java.security.InvalidKeyException;
import java.security.SecureRandom;
import eu.siacs.conversations.entities.Account;
-import eu.siacs.conversations.utils.CryptoHelper;
import eu.siacs.conversations.xml.TagWriter;
-public class ScramSha1 extends SaslMechanism {
- // TODO: When channel binding (SCRAM-SHA1-PLUS) is supported in future, generalize this to indicate support and/or usage.
- final private static String GS2_HEADER = "n,,";
- private String clientFirstMessageBare;
- final private String clientNonce;
- private byte[] serverSignature = null;
- private static HMac HMAC;
- private static Digest DIGEST;
- private static final byte[] CLIENT_KEY_BYTES = "Client Key".getBytes();
- private static final byte[] SERVER_KEY_BYTES = "Server Key".getBytes();
-
- public static class KeyPair {
- final public byte[] clientKey;
- final public byte[] serverKey;
-
- public KeyPair(final byte[] clientKey, final byte[] serverKey) {
- this.clientKey = clientKey;
- this.serverKey = serverKey;
- }
- }
-
- private static final LruCache<String, KeyPair> CACHE;
-
+public class ScramSha1 extends ScramMechanism {
static {
DIGEST = new SHA1Digest();
HMAC = new HMac(new SHA1Digest());
- CACHE = new LruCache<String, KeyPair>(10) {
- protected KeyPair create(final String k) {
- // Map keys are "bytesToHex(JID),bytesToHex(password),bytesToHex(salt),iterations".
- // Changing any of these values forces a cache miss. `CryptoHelper.bytesToHex()'
- // is applied to prevent commas in the strings breaking things.
- final String[] kparts = k.split(",", 4);
- try {
- final byte[] saltedPassword, serverKey, clientKey;
- saltedPassword = hi(CryptoHelper.hexToString(kparts[1]).getBytes(),
- Base64.decode(CryptoHelper.hexToString(kparts[2]), Base64.DEFAULT), Integer.valueOf(kparts[3]));
- serverKey = hmac(saltedPassword, SERVER_KEY_BYTES);
- clientKey = hmac(saltedPassword, CLIENT_KEY_BYTES);
-
- return new KeyPair(clientKey, serverKey);
- } catch (final InvalidKeyException | NumberFormatException e) {
- return null;
- }
- }
- };
}
- private State state = State.INITIAL;
-
public ScramSha1(final TagWriter tagWriter, final Account account, final SecureRandom rng) {
super(tagWriter, account, rng);
-
- // This nonce should be different for each authentication attempt.
- clientNonce = new BigInteger(100, this.rng).toString(32);
- clientFirstMessageBare = "";
}
@Override
@@ -83,156 +27,4 @@ public class ScramSha1 extends SaslMechanism {
public String getMechanism() {
return "SCRAM-SHA-1";
}
-
- @Override
- public String getClientFirstMessage() {
- if (clientFirstMessageBare.isEmpty() && state == State.INITIAL) {
- clientFirstMessageBare = "n=" + CryptoHelper.saslEscape(CryptoHelper.saslPrep(account.getUsername())) +
- ",r=" + this.clientNonce;
- state = State.AUTH_TEXT_SENT;
- }
- return Base64.encodeToString(
- (GS2_HEADER + clientFirstMessageBare).getBytes(Charset.defaultCharset()),
- Base64.NO_WRAP);
- }
-
- @Override
- 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");
- }
- byte[] serverFirstMessage = Base64.decode(challenge, Base64.DEFAULT);
- final Tokenizer tokenizer = new Tokenizer(serverFirstMessage);
- String nonce = "";
- int iterationCount = -1;
- String salt = "";
- for (final String token : tokenizer) {
- if (token.charAt(1) == '=') {
- switch (token.charAt(0)) {
- case 'i':
- try {
- iterationCount = Integer.parseInt(token.substring(2));
- } catch (final NumberFormatException e) {
- throw new AuthenticationException(e);
- }
- break;
- case 's':
- salt = token.substring(2);
- break;
- case 'r':
- nonce = token.substring(2);
- break;
- case 'm':
- /*
- * RFC 5802:
- * m: This attribute is reserved for future extensibility. In this
- * version of SCRAM, its presence in a client or a server message
- * MUST cause authentication failure when the attribute is parsed by
- * the other end.
- */
- throw new AuthenticationException("Server sent reserved token: `m'");
- }
- }
- }
-
- if (iterationCount < 0) {
- throw new AuthenticationException("Server did not send iteration count");
- }
- if (nonce.isEmpty() || !nonce.startsWith(clientNonce)) {
- throw new AuthenticationException("Server nonce does not contain client nonce: " + nonce);
- }
- if (salt.isEmpty()) {
- throw new AuthenticationException("Server sent empty salt");
- }
-
- final String clientFinalMessageWithoutProof = "c=" + Base64.encodeToString(
- GS2_HEADER.getBytes(), Base64.NO_WRAP) + ",r=" + nonce;
- final byte[] authMessage = (clientFirstMessageBare + ',' + new String(serverFirstMessage) + ','
- + clientFinalMessageWithoutProof).getBytes();
-
- // Map keys are "bytesToHex(JID),bytesToHex(password),bytesToHex(salt),iterations".
- final KeyPair keys = CACHE.get(
- CryptoHelper.bytesToHex(account.getJid().toBareJid().toString().getBytes()) + ","
- + CryptoHelper.bytesToHex(account.getPassword().getBytes()) + ","
- + CryptoHelper.bytesToHex(salt.getBytes()) + ","
- + String.valueOf(iterationCount)
- );
- if (keys == null) {
- throw new AuthenticationException("Invalid keys generated");
- }
- final byte[] clientSignature;
- try {
- serverSignature = hmac(keys.serverKey, authMessage);
- final byte[] storedKey = digest(keys.clientKey);
-
- clientSignature = hmac(storedKey, authMessage);
-
- } catch (final InvalidKeyException e) {
- throw new AuthenticationException(e);
- }
-
- final byte[] clientProof = new byte[keys.clientKey.length];
-
- for (int i = 0; i < clientProof.length; i++) {
- clientProof[i] = (byte) (keys.clientKey[i] ^ clientSignature[i]);
- }
-
-
- final String clientFinalMessage = clientFinalMessageWithoutProof + ",p=" +
- Base64.encodeToString(clientProof, Base64.NO_WRAP);
- state = State.RESPONSE_SENT;
- return Base64.encodeToString(clientFinalMessage.getBytes(), Base64.NO_WRAP);
- case RESPONSE_SENT:
- try {
- final String clientCalculatedServerFinalMessage = "v=" +
- Base64.encodeToString(serverSignature, Base64.NO_WRAP);
- if (!clientCalculatedServerFinalMessage.equals(new String(Base64.decode(challenge, Base64.DEFAULT)))) {
- throw new Exception();
- };
- state = State.VALID_SERVER_RESPONSE;
- return "";
- } catch(Exception e) {
- throw new AuthenticationException("Server final message does not match calculated final message");
- }
- default:
- throw new InvalidStateException(state);
- }
- }
-
- public static synchronized byte[] hmac(final byte[] key, final byte[] input)
- throws InvalidKeyException {
- HMAC.init(new KeyParameter(key));
- HMAC.update(input, 0, input.length);
- final byte[] out = new byte[HMAC.getMacSize()];
- HMAC.doFinal(out, 0);
- return out;
- }
-
- public static synchronized byte[] digest(byte[] bytes) {
- DIGEST.reset();
- DIGEST.update(bytes, 0, bytes.length);
- final byte[] out = new byte[DIGEST.getDigestSize()];
- DIGEST.doFinal(out, 0);
- return out;
- }
-
- /*
- * Hi() is, essentially, PBKDF2 [RFC2898] with HMAC() as the
- * pseudorandom function (PRF) and with dkLen == output length of
- * HMAC() == output length of H().
- */
- private static synchronized byte[] hi(final byte[] key, final byte[] salt, final int iterations)
- throws InvalidKeyException {
- byte[] u = hmac(key, CryptoHelper.concatenateByteArrays(salt, CryptoHelper.ONE));
- byte[] out = u.clone();
- for (int i = 1; i < iterations; i++) {
- u = hmac(key, u);
- for (int j = 0; j < u.length; j++) {
- out[j] ^= u[j];
- }
- }
- return out;
- }
}
diff --git a/src/main/java/eu/siacs/conversations/crypto/sasl/ScramSha256.java b/src/main/java/eu/siacs/conversations/crypto/sasl/ScramSha256.java
new file mode 100644
index 00000000..1b7a969d
--- /dev/null
+++ b/src/main/java/eu/siacs/conversations/crypto/sasl/ScramSha256.java
@@ -0,0 +1,30 @@
+package eu.siacs.conversations.crypto.sasl;
+
+import org.bouncycastle.crypto.digests.SHA256Digest;
+import org.bouncycastle.crypto.macs.HMac;
+
+import java.security.SecureRandom;
+
+import eu.siacs.conversations.entities.Account;
+import eu.siacs.conversations.xml.TagWriter;
+
+public class ScramSha256 extends ScramMechanism {
+ static {
+ DIGEST = new SHA256Digest();
+ HMAC = new HMac(new SHA256Digest());
+ }
+
+ public ScramSha256(final TagWriter tagWriter, final Account account, final SecureRandom rng) {
+ super(tagWriter, account, rng);
+ }
+
+ @Override
+ public int getPriority() {
+ return 25;
+ }
+
+ @Override
+ public String getMechanism() {
+ return "SCRAM-SHA-256";
+ }
+}
diff --git a/src/main/java/eu/siacs/conversations/entities/Conversation.java b/src/main/java/eu/siacs/conversations/entities/Conversation.java
index ced48913..fa74c418 100644
--- a/src/main/java/eu/siacs/conversations/entities/Conversation.java
+++ b/src/main/java/eu/siacs/conversations/entities/Conversation.java
@@ -680,25 +680,41 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl
return this.nextCounterpart;
}
- private int getMostRecentlyUsedIncomingEncryption() {
- synchronized (this.messages) {
- for(int i = this.messages.size() -1; i >= 0; --i) {
- 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) {
- return Message.ENCRYPTION_PGP;
- } else {
- return e;
- }
+ public int getNextEncryption() {
+ return fixAvailableEncryption(this.getIntAttribute(ATTRIBUTE_NEXT_ENCRYPTION, getDefaultEncryption()));
}
+
+ private int fixAvailableEncryption(int selectedEncryption) {
+ switch(selectedEncryption) {
+ case Message.ENCRYPTION_NONE:
+ return Config.supportUnencrypted() ? selectedEncryption : getDefaultEncryption();
+ case Message.ENCRYPTION_AXOLOTL:
+ return Config.supportOmemo() ? selectedEncryption : getDefaultEncryption();
+ case Message.ENCRYPTION_OTR:
+ return Config.supportOtr() ? selectedEncryption : getDefaultEncryption();
+ case Message.ENCRYPTION_PGP:
+ case Message.ENCRYPTION_DECRYPTED:
+ case Message.ENCRYPTION_DECRYPTION_FAILED:
+ return Config.supportOpenPgp() ? Message.ENCRYPTION_PGP : getDefaultEncryption();
+ default:
+ return getDefaultEncryption();
}
}
+
+ private int getDefaultEncryption() {
+ AxolotlService axolotlService = account.getAxolotlService();
+ if (Config.supportUnencrypted()) {
+ return Message.ENCRYPTION_NONE;
+ } else if (Config.supportOmemo()
+ && (axolotlService != null && axolotlService.isConversationAxolotlCapable(this) || !Config.multipleEncryptionChoices())) {
+ return Message.ENCRYPTION_AXOLOTL;
+ } else if (Config.supportOtr() && mode == MODE_SINGLE) {
+ return Message.ENCRYPTION_OTR;
+ } else if (Config.supportOpenPgp()) {
+ return Message.ENCRYPTION_PGP;
+ } else {
return Message.ENCRYPTION_NONE;
}
-
- public int getNextEncryption() {
- return Math.max(this.getIntAttribute(ATTRIBUTE_NEXT_ENCRYPTION, Message.ENCRYPTION_NONE), Message.ENCRYPTION_NONE);
}
public void setNextEncryption(int encryption) {
diff --git a/src/main/java/eu/siacs/conversations/http/HttpDownloadConnection.java b/src/main/java/eu/siacs/conversations/http/HttpDownloadConnection.java
index 356856dc..970ace6f 100644
--- a/src/main/java/eu/siacs/conversations/http/HttpDownloadConnection.java
+++ b/src/main/java/eu/siacs/conversations/http/HttpDownloadConnection.java
@@ -120,7 +120,7 @@ public class HttpDownloadConnection implements Transferable {
} else {
message.setTransferable(null);
}
- mXmppConnectionService.updateConversationUi();
+ mHttpConnectionManager.updateConversationUi(true);
}
private void finish() {
@@ -131,7 +131,7 @@ public class HttpDownloadConnection implements Transferable {
if (message.getEncryption() == Message.ENCRYPTION_PGP) {
notify = message.getConversation().getAccount().getPgpDecryptionService().decrypt(message, notify);
}
- mXmppConnectionService.updateConversationUi();
+ mHttpConnectionManager.updateConversationUi(true);
if (notify) {
mXmppConnectionService.getNotificationService().push(message);
}
@@ -139,7 +139,7 @@ public class HttpDownloadConnection implements Transferable {
private void changeStatus(int status) {
this.mStatus = status;
- mXmppConnectionService.updateConversationUi();
+ mHttpConnectionManager.updateConversationUi(true);
}
private void showToastForException(Exception e) {
@@ -340,7 +340,7 @@ public class HttpDownloadConnection implements Transferable {
public void updateProgress(int i) {
this.mProgress = i;
- mXmppConnectionService.updateConversationUi();
+ mHttpConnectionManager.updateConversationUi(false);
}
@Override
diff --git a/src/main/java/eu/siacs/conversations/http/HttpUploadConnection.java b/src/main/java/eu/siacs/conversations/http/HttpUploadConnection.java
index 63a3884b..06a325d0 100644
--- a/src/main/java/eu/siacs/conversations/http/HttpUploadConnection.java
+++ b/src/main/java/eu/siacs/conversations/http/HttpUploadConnection.java
@@ -182,7 +182,7 @@ public class HttpUploadConnection implements Transferable {
while (((count = mFileInputStream.read(buffer)) != -1) && !canceled) {
transmitted += count;
os.write(buffer, 0, count);
- mXmppConnectionService.updateConversationUi();
+ mHttpConnectionManager.updateConversationUi(false);
}
os.flush();
os.close();
diff --git a/src/main/java/eu/siacs/conversations/persistance/FileBackend.java b/src/main/java/eu/siacs/conversations/persistance/FileBackend.java
index 3239ce3d..bc9ed259 100644
--- a/src/main/java/eu/siacs/conversations/persistance/FileBackend.java
+++ b/src/main/java/eu/siacs/conversations/persistance/FileBackend.java
@@ -555,6 +555,7 @@ public class FileBackend {
File file = new File(getAvatarPath(hash));
FileInputStream is = null;
try {
+ avatar.size = file.length();
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(file.getAbsolutePath(), options);
@@ -574,6 +575,7 @@ public class FileBackend {
avatar.image = new String(mByteArrayOutputStream.toByteArray());
avatar.height = options.outHeight;
avatar.width = options.outWidth;
+ avatar.type = options.outMimeType;
return avatar;
} catch (IOException e) {
return null;
@@ -593,6 +595,7 @@ public class FileBackend {
File file;
if (isAvatarCached(avatar)) {
file = new File(getAvatarPath(avatar.getFilename()));
+ avatar.size = file.length();
} else {
String filename = getAvatarPath(avatar.getFilename());
file = new File(filename + ".tmp");
@@ -604,7 +607,8 @@ public class FileBackend {
MessageDigest digest = MessageDigest.getInstance("SHA-1");
digest.reset();
DigestOutputStream mDigestOutputStream = new DigestOutputStream(os, digest);
- mDigestOutputStream.write(avatar.getImageAsBytes());
+ final byte[] bytes = avatar.getImageAsBytes();
+ mDigestOutputStream.write(bytes);
mDigestOutputStream.flush();
mDigestOutputStream.close();
String sha1sum = CryptoHelper.bytesToHex(digest.digest());
@@ -615,13 +619,13 @@ public class FileBackend {
file.delete();
return false;
}
+ avatar.size = bytes.length;
} catch (IllegalArgumentException | IOException | NoSuchAlgorithmException e) {
return false;
} finally {
close(os);
}
}
- avatar.size = file.length();
return true;
}
@@ -691,7 +695,7 @@ public class FileBackend {
Bitmap dest = Bitmap.createBitmap(newWidth, newHeight, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(dest);
canvas.drawBitmap(source, null, targetRect, null);
- if (source != null && !source.isRecycled()) {
+ if (source.isRecycled()) {
source.recycle();
}
return dest;
diff --git a/src/main/java/eu/siacs/conversations/services/AbstractConnectionManager.java b/src/main/java/eu/siacs/conversations/services/AbstractConnectionManager.java
index dfe4cb28..18512997 100644
--- a/src/main/java/eu/siacs/conversations/services/AbstractConnectionManager.java
+++ b/src/main/java/eu/siacs/conversations/services/AbstractConnectionManager.java
@@ -5,6 +5,7 @@ import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.PowerManager;
+import android.os.SystemClock;
import android.util.Log;
import android.util.Pair;
@@ -22,6 +23,7 @@ import java.io.OutputStream;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
+import java.util.concurrent.atomic.AtomicLong;
import javax.crypto.Cipher;
import javax.crypto.CipherInputStream;
@@ -36,6 +38,9 @@ import eu.siacs.conversations.entities.DownloadableFile;
public class AbstractConnectionManager {
protected XmppConnectionService mXmppConnectionService;
+ private static final int UI_REFRESH_THRESHOLD = 250;
+ private static final AtomicLong LAST_UI_UPDATE_CALL = new AtomicLong(0);
+
public AbstractConnectionManager(XmppConnectionService service) {
this.mXmppConnectionService = service;
}
@@ -136,6 +141,15 @@ public class AbstractConnectionManager {
}
}
+ public void updateConversationUi(boolean force) {
+ synchronized (LAST_UI_UPDATE_CALL) {
+ if (force || SystemClock.elapsedRealtime() - LAST_UI_UPDATE_CALL.get() >= UI_REFRESH_THRESHOLD) {
+ LAST_UI_UPDATE_CALL.set(SystemClock.elapsedRealtime());
+ mXmppConnectionService.updateConversationUi();
+ }
+ }
+ }
+
public PowerManager.WakeLock createWakeLock(String name) {
PowerManager powerManager = (PowerManager) mXmppConnectionService.getSystemService(Context.POWER_SERVICE);
return powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,name);
diff --git a/src/main/java/eu/siacs/conversations/services/MessageArchiveService.java b/src/main/java/eu/siacs/conversations/services/MessageArchiveService.java
index a27e6c3e..a352ea8a 100644
--- a/src/main/java/eu/siacs/conversations/services/MessageArchiveService.java
+++ b/src/main/java/eu/siacs/conversations/services/MessageArchiveService.java
@@ -111,7 +111,9 @@ public class MessageArchiveService implements OnAdvancedStreamFeaturesLoaded {
return null;
}
final Query query = new Query(conversation, start, end,PagingOrder.REVERSE);
+ if (start==0) {
query.reference = conversation.getFirstMamReference();
+ }
this.queries.add(query);
this.execute(query);
return query;
@@ -224,7 +226,7 @@ public class MessageArchiveService implements OnAdvancedStreamFeaturesLoaded {
this.finalizeQuery(query, done);
Log.d(Config.LOGTAG,query.getAccount().getJid().toBareJid()+": finished mam after "+query.getTotalCount()+" messages. messages left="+Boolean.toString(!done));
if (query.getWith() == null && query.getMessageCount() > 0) {
- mXmppConnectionService.getNotificationService().finishBacklog(true);
+ mXmppConnectionService.getNotificationService().finishBacklog(true,query.getAccount());
}
} else {
final Query nextQuery;
diff --git a/src/main/java/eu/siacs/conversations/services/NotificationService.java b/src/main/java/eu/siacs/conversations/services/NotificationService.java
index 47364b30..904392ee 100644
--- a/src/main/java/eu/siacs/conversations/services/NotificationService.java
+++ b/src/main/java/eu/siacs/conversations/services/NotificationService.java
@@ -100,12 +100,27 @@ public class NotificationService {
}
}
- public void finishBacklog(boolean notify) {
+ public void finishBacklog(boolean notify, Account account) {
synchronized (notifications) {
mXmppConnectionService.updateUnreadCountBadge();
+ if (account == null || !notify) {
updateNotification(notify);
+ } else {
+ boolean hasPendingMessages = false;
+ for(ArrayList<Message> messages : notifications.values()) {
+ if (messages.size() > 0 && messages.get(0).getConversation().getAccount() == account) {
+ hasPendingMessages = true;
+ break;
+ }
+ }
+ updateNotification(hasPendingMessages);
}
}
+ }
+
+ public void finishBacklog(boolean notify) {
+ finishBacklog(notify,null);
+ }
private void pushToStack(final Message message) {
final String conversationUuid = message.getConversationUuid();
@@ -507,7 +522,7 @@ public class NotificationService {
return (m.find() || message.getType() == Message.TYPE_PRIVATE);
}
- private static Pattern generateNickHighlightPattern(final String nick) {
+ public static Pattern generateNickHighlightPattern(final String nick) {
// We expect a word boundary, i.e. space or start of string, followed by
// the
// nick (matched in case-insensitive manner), followed by optional
diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java
index ce49b2b6..e53b2524 100644
--- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java
+++ b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java
@@ -2639,14 +2639,13 @@ public class XmppConnectionService extends Service {
}
public void publishAvatar(Account account, final Avatar avatar, final UiCallback<Avatar> callback) {
- final IqPacket packet = this.mIqGenerator.publishAvatar(avatar);
+ IqPacket packet = this.mIqGenerator.publishAvatar(avatar);
this.sendIqPacket(account, packet, new OnIqPacketReceived() {
@Override
public void onIqPacketReceived(Account account, IqPacket result) {
if (result.getType() == IqPacket.TYPE.RESULT) {
- final IqPacket packet = XmppConnectionService.this.mIqGenerator
- .publishAvatarMetadata(avatar);
+ final IqPacket packet = XmppConnectionService.this.mIqGenerator.publishAvatarMetadata(avatar);
sendIqPacket(account, packet, new OnIqPacketReceived() {
@Override
public void onIqPacketReceived(Account account, IqPacket result) {
@@ -2655,25 +2654,22 @@ public class XmppConnectionService extends Service {
getAvatarService().clear(account);
databaseBackend.updateAccount(account);
}
+ Log.d(Config.LOGTAG,account.getJid().toBareJid()+": published avatar "+(avatar.size/1024)+"KiB");
if (callback != null) {
callback.success(avatar);
- } else {
- Log.d(Config.LOGTAG,account.getJid().toBareJid()+": published avatar");
}
} else {
if (callback != null) {
- callback.error(
- R.string.error_publish_avatar_server_reject,
- avatar);
+ callback.error(R.string.error_publish_avatar_server_reject,avatar);
}
}
}
});
} else {
+ Element error = result.findChild("error");
+ Log.d(Config.LOGTAG,account.getJid().toBareJid()+": server rejected avatar "+(avatar.size/1024)+"KiB "+(error!=null?error.toString():""));
if (callback != null) {
- callback.error(
- R.string.error_publish_avatar_server_reject,
- avatar);
+ callback.error(R.string.error_publish_avatar_server_reject, avatar);
}
}
}
diff --git a/src/main/java/eu/siacs/conversations/ui/ContactDetailsActivity.java b/src/main/java/eu/siacs/conversations/ui/ContactDetailsActivity.java
index 69936b1d..1b76173a 100644
--- a/src/main/java/eu/siacs/conversations/ui/ContactDetailsActivity.java
+++ b/src/main/java/eu/siacs/conversations/ui/ContactDetailsActivity.java
@@ -116,6 +116,7 @@ public class ContactDetailsActivity extends OmemoActivity implements OnAccountUp
private Button mShowInactiveDevicesButton;
private QuickContactBadge badge;
private LinearLayout keys;
+ private LinearLayout keysWrapper;
private FlowLayout tags;
private boolean showDynamicTags = false;
private boolean showLastSeen = false;
@@ -220,6 +221,7 @@ public class ContactDetailsActivity extends OmemoActivity implements OnAccountUp
}
});
keys = (LinearLayout) findViewById(R.id.details_contact_keys);
+ keysWrapper = (LinearLayout) findViewById(R.id.keys_wrapper);
tags = (FlowLayout) findViewById(R.id.tags);
mShowInactiveDevicesButton = (Button) findViewById(R.id.show_inactive_devices);
if (getActionBar() != null) {
@@ -521,11 +523,7 @@ public class ContactDetailsActivity extends OmemoActivity implements OnAccountUp
});
keys.addView(view);
}
- if (hasKeys) {
- keys.setVisibility(View.VISIBLE);
- } else {
- keys.setVisibility(View.GONE);
- }
+ keysWrapper.setVisibility(hasKeys ? View.VISIBLE : View.GONE);
List<ListItem.Tag> tagList = contact.getTags(this);
if (tagList.size() == 0 || !this.showDynamicTags) {
diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java b/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java
index 11fa76c2..189879a6 100644
--- a/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java
+++ b/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java
@@ -99,6 +99,7 @@ public class ConversationActivity extends XmppActivity
private String mOpenConversation = null;
private boolean mPanelOpen = true;
+ private AtomicBoolean mShouldPanelBeOpen = new AtomicBoolean(false);
private Pair<Integer,Integer> mScrollPosition = null;
final private List<Uri> mPendingImageUris = new ArrayList<>();
final private List<Uri> mPendingFileUris = new ArrayList<>();
@@ -134,6 +135,7 @@ public class ConversationActivity extends XmppActivity
public void showConversationsOverview() {
if (mContentView instanceof SlidingPaneLayout) {
SlidingPaneLayout mSlidingPaneLayout = (SlidingPaneLayout) mContentView;
+ mShouldPanelBeOpen.set(true);
mSlidingPaneLayout.openPane();
}
}
@@ -151,6 +153,7 @@ public class ConversationActivity extends XmppActivity
public void hideConversationsOverview() {
if (mContentView instanceof SlidingPaneLayout) {
SlidingPaneLayout mSlidingPaneLayout = (SlidingPaneLayout) mContentView;
+ mShouldPanelBeOpen.set(false);
mSlidingPaneLayout.closePane();
}
}
@@ -161,8 +164,7 @@ public class ConversationActivity extends XmppActivity
public boolean isConversationsOverviewVisable() {
if (mContentView instanceof SlidingPaneLayout) {
- SlidingPaneLayout mSlidingPaneLayout = (SlidingPaneLayout) mContentView;
- return mSlidingPaneLayout.isOpen();
+ return mShouldPanelBeOpen.get();
} else {
return true;
}
@@ -302,18 +304,19 @@ public class ConversationActivity extends XmppActivity
@Override
public void onPanelOpened(View arg0) {
+ mShouldPanelBeOpen.set(true);
updateActionBarTitle();
invalidateOptionsMenu();
hideKeyboard();
if (xmppConnectionServiceBound) {
- xmppConnectionService.getNotificationService()
- .setOpenConversation(null);
+ xmppConnectionService.getNotificationService().setOpenConversation(null);
}
closeContextMenu();
}
@Override
public void onPanelClosed(View arg0) {
+ mShouldPanelBeOpen.set(false);
listView.discardUndo();
openConversation();
}
@@ -1266,6 +1269,9 @@ public class ConversationActivity extends XmppActivity
if (!ExceptionHelper.checkForCrash(this, this.xmppConnectionService)) {
openBatteryOptimizationDialogIfNeeded();
}
+ if (isConversationsOverviewVisable() && isConversationsOverviewHideable()) {
+ xmppConnectionService.getNotificationService().setOpenConversation(null);
+ }
}
private void handleViewConversationIntent(final Intent intent) {
@@ -1498,7 +1504,7 @@ public class ConversationActivity extends XmppActivity
private boolean hasAccountWithoutPush() {
for(Account account : xmppConnectionService.getAccounts()) {
if (account.getStatus() != Account.State.DISABLED
- && !xmppConnectionService.getPushManagementService().available(account)) {
+ && !xmppConnectionService.getPushManagementService().availableAndUseful(account)) {
return true;
}
}
diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java
index 709244dd..e6d99579 100644
--- a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java
+++ b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java
@@ -34,6 +34,7 @@ import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView;
import android.widget.AdapterView.AdapterContextMenuInfo;
+import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.RelativeLayout;
@@ -849,16 +850,22 @@ public class ConversationFragment extends Fragment implements EditMessage.Keyboa
}
protected void highlightInConference(String nick) {
- String oldString = mEditMessage.getText().toString().trim();
- if (oldString.isEmpty() || mEditMessage.getSelectionStart() == 0) {
+ final Editable editable = mEditMessage.getText();
+ String oldString = editable.toString().trim();
+ final int pos = mEditMessage.getSelectionStart();
+ if (oldString.isEmpty() || pos == 0) {
mEditMessage.getText().insert(0, nick + ": ");
} else {
- if (mEditMessage.getText().charAt(
- mEditMessage.getSelectionStart() - 1) != ' ') {
- nick = " " + nick;
+ final char before = editable.charAt(pos - 1);
+ final char after = editable.length() > pos ? editable.charAt(pos) : '\0';
+ if (before == '\n') {
+ editable.insert(pos, nick + ": ");
+ } else {
+ editable.insert(pos,(Character.isWhitespace(before)? "" : " ") + nick + (Character.isWhitespace(after) ? "" : " "));
+ if (Character.isWhitespace(after)) {
+ mEditMessage.setSelection(mEditMessage.getSelectionStart()+1);
+ }
}
- mEditMessage.getText().insert(mEditMessage.getSelectionStart(),
- nick + " ");
}
}
diff --git a/src/main/java/eu/siacs/conversations/ui/EditAccountActivity.java b/src/main/java/eu/siacs/conversations/ui/EditAccountActivity.java
index 81d26b39..2080ddc0 100644
--- a/src/main/java/eu/siacs/conversations/ui/EditAccountActivity.java
+++ b/src/main/java/eu/siacs/conversations/ui/EditAccountActivity.java
@@ -836,7 +836,7 @@ public class EditAccountActivity extends OmemoActivity implements OnAccountUpdat
if (this.mAccount.isOnlineAndConnected() && !this.mFetchingAvatar) {
Features features = this.mAccount.getXmppConnection().getFeatures();
this.mStats.setVisibility(View.VISIBLE);
- boolean showBatteryWarning = !xmppConnectionService.getPushManagementService().available(mAccount) && isOptimizingBattery();
+ boolean showBatteryWarning = !xmppConnectionService.getPushManagementService().availableAndUseful(mAccount) && isOptimizingBattery();
boolean showDataSaverWarning = isAffectedByDataSaver();
showOsOptimizationWarning(showBatteryWarning,showDataSaverWarning);
this.mSessionEst.setText(UIHelper.readableTimeDifferenceFull(this, this.mAccount.getXmppConnection()
diff --git a/src/main/java/eu/siacs/conversations/ui/OmemoActivity.java b/src/main/java/eu/siacs/conversations/ui/OmemoActivity.java
index 8ce8c14d..7929e073 100644
--- a/src/main/java/eu/siacs/conversations/ui/OmemoActivity.java
+++ b/src/main/java/eu/siacs/conversations/ui/OmemoActivity.java
@@ -24,8 +24,6 @@ import eu.siacs.conversations.R;
import eu.siacs.conversations.crypto.axolotl.FingerprintStatus;
import eu.siacs.conversations.crypto.axolotl.XmppAxolotlSession;
import eu.siacs.conversations.entities.Account;
-import eu.siacs.conversations.ui.TrustKeysActivity;
-import eu.siacs.conversations.ui.XmppActivity;
import eu.siacs.conversations.ui.widget.Switch;
import eu.siacs.conversations.utils.CryptoHelper;
import eu.siacs.conversations.utils.XmppUri;
@@ -51,16 +49,17 @@ public abstract class OmemoActivity extends XmppActivity {
&& fingerprint instanceof String
&& fingerprintStatus instanceof FingerprintStatus) {
getMenuInflater().inflate(R.menu.omemo_key_context, menu);
- MenuItem purgeItem = menu.findItem(R.id.purge_omemo_key);
+ MenuItem distrust = menu.findItem(R.id.distrust_key);
MenuItem verifyScan = menu.findItem(R.id.verify_scan);
if (this instanceof TrustKeysActivity) {
- purgeItem.setVisible(false);
+ distrust.setVisible(false);
verifyScan.setVisible(false);
} else {
FingerprintStatus status = (FingerprintStatus) fingerprintStatus;
if (!status.isActive() || status.isVerified()) {
verifyScan.setVisible(false);
}
+ distrust.setVisible(status.isVerified());
}
this.mSelectedAccount = (Account) account;
this.mSelectedFingerprint = (String) fingerprint;
@@ -70,7 +69,7 @@ public abstract class OmemoActivity extends XmppActivity {
@Override
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()) {
- case R.id.purge_omemo_key:
+ case R.id.distrust_key:
showPurgeKeyDialog(mSelectedAccount,mSelectedFingerprint);
break;
case R.id.copy_omemo_key:
@@ -242,17 +241,14 @@ public abstract class OmemoActivity extends XmppActivity {
public void showPurgeKeyDialog(final Account account, final String fingerprint) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
- builder.setTitle(getString(R.string.purge_key));
- builder.setIconAttribute(android.R.attr.alertDialogIcon);
- builder.setMessage(getString(R.string.purge_key_desc_part1)
- + "\n\n" + CryptoHelper.prettifyFingerprint(fingerprint.substring(2))
- + "\n\n" + getString(R.string.purge_key_desc_part2));
+ builder.setTitle(R.string.distrust_omemo_key);
+ builder.setMessage(R.string.distrust_omemo_key_text);
builder.setNegativeButton(getString(R.string.cancel), null);
- builder.setPositiveButton(getString(R.string.purge_key),
+ builder.setPositiveButton(R.string.confirm,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
- account.getAxolotlService().purgeKey(fingerprint);
+ account.getAxolotlService().distrustFingerprint(fingerprint);
refreshUi();
}
});
diff --git a/src/main/java/eu/siacs/conversations/ui/ShareWithActivity.java b/src/main/java/eu/siacs/conversations/ui/ShareWithActivity.java
index 9a7414ef..f5724fc6 100644
--- a/src/main/java/eu/siacs/conversations/ui/ShareWithActivity.java
+++ b/src/main/java/eu/siacs/conversations/ui/ShareWithActivity.java
@@ -310,15 +310,61 @@ public class ShareWithActivity extends XmppActivity implements XmppConnectionSer
} else {
if (mReturnToPrevious && this.share.text != null && !this.share.text.isEmpty() ) {
final OnPresenceSelected callback = new OnPresenceSelected() {
+
+ private void finishAndSend(Message message) {
+ xmppConnectionService.sendMessage(message);
+ replaceToast(getString(R.string.shared_text_with_x, conversation.getName()));
+ finish();
+ }
+
+ private UiCallback<Message> messageEncryptionCallback = new UiCallback<Message>() {
+ @Override
+ public void success(final Message message) {
+ message.setEncryption(Message.ENCRYPTION_DECRYPTED);
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ finishAndSend(message);
+ }
+ });
+ }
+
+ @Override
+ public void error(final int errorCode, Message object) {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ replaceToast(getString(errorCode));
+ finish();
+ }
+ });
+ }
+
+ @Override
+ public void userInputRequried(PendingIntent pi, Message object) {
+ finish();
+ }
+ };
+
@Override
public void onPresenceSelected() {
- Message message = new Message(conversation,share.text, conversation.getNextEncryption());
- if (conversation.getNextEncryption() == Message.ENCRYPTION_OTR) {
+
+ final int encryption = conversation.getNextEncryption();
+
+ Message message = new Message(conversation,share.text, encryption);
+
+ Log.d(Config.LOGTAG,"on presence selected encrpytion="+encryption);
+
+ if (encryption == Message.ENCRYPTION_PGP) {
+ replaceToast(getString(R.string.encrypting_message));
+ xmppConnectionService.getPgpEngine().encrypt(message,messageEncryptionCallback);
+ return;
+ }
+
+ if (encryption == Message.ENCRYPTION_OTR) {
message.setCounterpart(conversation.getNextCounterpart());
}
- xmppConnectionService.sendMessage(message);
- replaceToast(getString(R.string.shared_text_with_x, conversation.getName()));
- finish();
+ finishAndSend(message);
}
};
if (conversation.getNextEncryption() == Message.ENCRYPTION_OTR) {
diff --git a/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java b/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java
index ce56e30c..a01689ec 100644
--- a/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java
+++ b/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java
@@ -52,6 +52,7 @@ import eu.siacs.conversations.entities.Message;
import eu.siacs.conversations.entities.Message.FileParams;
import eu.siacs.conversations.entities.Transferable;
import eu.siacs.conversations.persistance.FileBackend;
+import eu.siacs.conversations.services.NotificationService;
import eu.siacs.conversations.ui.ConversationActivity;
import eu.siacs.conversations.ui.text.DividerSpan;
import eu.siacs.conversations.ui.text.QuoteSpan;
@@ -88,6 +89,12 @@ public class MessageAdapter extends ArrayAdapter<Message> implements CopyTextVie
}
}
};
+ private static final Linkify.MatchFilter WEBURL_MATCH_FILTER = new Linkify.MatchFilter() {
+ @Override
+ public boolean acceptMatch(CharSequence charSequence, int start, int end) {
+ return start < 1 || charSequence.charAt(start-1) != '@';
+ }
+ };
private ConversationActivity activity;
@@ -442,8 +449,15 @@ public class MessageAdapter extends ArrayAdapter<Message> implements CopyTextVie
privateMarkerIndex + 1 + nick.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
- Linkify.addLinks(body, Patterns.AUTOLINK_WEB_URL, "http", null, WEBURL_TRANSFORM_FILTER);
+ if (message.getConversation().getMode() == Conversation.MODE_MULTI && message.getStatus() == Message.STATUS_RECEIVED) {
+ Pattern pattern = NotificationService.generateNickHighlightPattern(message.getConversation().getMucOptions().getActualNick());
+ Matcher matcher = pattern.matcher(body);
+ while(matcher.find()) {
+ body.setSpan(new StyleSpan(Typeface.BOLD), matcher.start(), matcher.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+ }
+ }
Linkify.addLinks(body, XMPP_PATTERN, "xmpp");
+ Linkify.addLinks(body, Patterns.AUTOLINK_WEB_URL, "http", WEBURL_MATCH_FILTER, WEBURL_TRANSFORM_FILTER);
Linkify.addLinks(body, GeoHelper.GEO_URI, "geo");
viewHolder.messageBody.setAutoLinkMask(0);
viewHolder.messageBody.setText(body);
diff --git a/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java b/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java
index 7cd4707d..08dbdc18 100644
--- a/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java
+++ b/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java
@@ -13,8 +13,6 @@ import android.util.Log;
import android.util.Pair;
import android.util.SparseArray;
-import org.json.JSONException;
-import org.json.JSONObject;
import org.xmlpull.v1.XmlPullParserException;
import java.io.ByteArrayInputStream;
@@ -26,8 +24,8 @@ import java.net.IDN;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
-import java.net.UnknownHostException;
import java.net.URL;
+import java.net.UnknownHostException;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.Principal;
@@ -61,6 +59,7 @@ import eu.siacs.conversations.crypto.sasl.External;
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.crypto.sasl.ScramSha256;
import eu.siacs.conversations.entities.Account;
import eu.siacs.conversations.entities.Message;
import eu.siacs.conversations.entities.ServiceDiscoveryResult;
@@ -178,8 +177,6 @@ public class XmppConnection implements Runnable {
}
}
- private Identity mServerIdentity = Identity.UNKNOWN;
-
public final OnIqPacketReceived registrationResponseListener = new OnIqPacketReceived() {
@Override
public void onIqPacketReceived(Account account, IqPacket packet) {
@@ -253,17 +250,6 @@ public class XmppConnection implements Runnable {
Log.d(Config.LOGTAG, account.getJid().toBareJid().toString() + ": connecting");
features.encryptionEnabled = false;
this.attempt++;
- switch (account.getJid().getDomainpart()) {
- case "chat.facebook.com":
- mServerIdentity = Identity.FACEBOOK;
- break;
- case "nimbuzz.com":
- mServerIdentity = Identity.NIMBUZZ;
- break;
- default:
- mServerIdentity = Identity.UNKNOWN;
- break;
- }
try {
Socket localSocket;
shouldAuthenticate = needsBinding = !account.isOptionSet(Account.OPTION_REGISTER);
@@ -747,7 +733,7 @@ public class XmppConnection implements Runnable {
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) || mServerIdentity == Identity.FACEBOOK) {
+ if (packet.fromServer(account)) {
callback = packetCallbackDuple.second;
packetCallbacks.remove(packet.getId());
} else {
@@ -868,6 +854,8 @@ public class XmppConnection implements Runnable {
auth.setAttribute("xmlns", "urn:ietf:params:xml:ns:xmpp-sasl");
if (mechanisms.contains("EXTERNAL") && account.getPrivateKeyAlias() != null) {
saslMechanism = new External(tagWriter, account, mXmppConnectionService.getRNG());
+ } else if (mechanisms.contains("SCRAM-SHA-256")) {
+ saslMechanism = new ScramSha256(tagWriter, account, mXmppConnectionService.getRNG());
} else if (mechanisms.contains("SCRAM-SHA-1")) {
saslMechanism = new ScramSha1(tagWriter, account, mXmppConnectionService.getRNG());
} else if (mechanisms.contains("PLAIN")) {
@@ -1099,7 +1087,7 @@ public class XmppConnection implements Runnable {
this.disco.clear();
}
mPendingServiceDiscoveries.set(0);
- mWaitForDisco.set(mServerIdentity != Identity.NIMBUZZ && smVersion != 0);
+ mWaitForDisco.set(smVersion != 0 && !account.getJid().getDomainpart().equalsIgnoreCase("nimbuzz.com"));
lastDiscoStarted = SystemClock.elapsedRealtime();
Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": starting service discovery");
mXmppConnectionService.scheduleWakeUpCall(Config.CONNECT_DISCO_TIMEOUT, account.getUuid().hashCode());
@@ -1138,24 +1126,6 @@ public class XmppConnection implements Runnable {
boolean advancedStreamFeaturesLoaded;
synchronized (XmppConnection.this.disco) {
ServiceDiscoveryResult result = new ServiceDiscoveryResult(packet);
- for (final ServiceDiscoveryResult.Identity id : result.getIdentities()) {
- if (mServerIdentity == Identity.UNKNOWN && id.getType().equals("im") &&
- id.getCategory().equals("server") && id.getName() != null &&
- jid.equals(account.getServer())) {
- switch (id.getName()) {
- case "Prosody":
- mServerIdentity = Identity.PROSODY;
- break;
- case "ejabberd":
- mServerIdentity = Identity.EJABBERD;
- break;
- case "Slack-XMPP":
- mServerIdentity = Identity.SLACK;
- break;
- }
- Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": server name: " + id.getName());
- }
- }
if (jid.equals(account.getServer())) {
mXmppConnectionService.databaseBackend.insertDiscoveryResult(result);
}
@@ -1540,7 +1510,25 @@ public class XmppConnection implements Runnable {
}
public Identity getServerIdentity() {
- return mServerIdentity;
+ synchronized (this.disco) {
+ ServiceDiscoveryResult result = disco.get(account.getJid().toDomainJid());
+ if (result == null) {
+ return Identity.UNKNOWN;
+ }
+ for (final ServiceDiscoveryResult.Identity id : result.getIdentities()) {
+ if (id.getType().equals("im") && id.getCategory().equals("server") && id.getName() != null) {
+ switch (id.getName()) {
+ case "Prosody":
+ return Identity.PROSODY;
+ case "ejabberd":
+ return Identity.EJABBERD;
+ case "Slack-XMPP":
+ return Identity.SLACK;
+ }
+ }
+ }
+ }
+ return Identity.UNKNOWN;
}
private class UnauthorizedException extends IOException {
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 5461b9c6..0c0c054d 100644
--- a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnection.java
+++ b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnection.java
@@ -388,7 +388,7 @@ public class JingleConnection implements Transferable {
long size = Long.parseLong(fileSize.getContent());
message.setBody(Long.toString(size));
conversation.add(message);
- mXmppConnectionService.updateConversationUi();
+ mJingleConnectionManager.updateConversationUi(true);
if (mJingleConnectionManager.hasStoragePermission()
&& size < this.mJingleConnectionManager.getAutoAcceptFileSize()
&& mXmppConnectionService.isDataSaverDisabled()) {
@@ -510,7 +510,7 @@ public class JingleConnection implements Transferable {
private void sendAccept() {
mJingleStatus = JINGLE_STATUS_ACCEPTED;
this.mStatus = Transferable.STATUS_DOWNLOADING;
- mXmppConnectionService.updateConversationUi();
+ this.mJingleConnectionManager.updateConversationUi(true);
this.mJingleConnectionManager.getPrimaryCandidate(this.account, new OnPrimaryCandidateFound() {
@Override
public void onPrimaryCandidateFound(boolean success, final JingleCandidate candidate) {
@@ -842,7 +842,7 @@ public class JingleConnection implements Transferable {
if (this.file!=null) {
file.delete();
}
- this.mXmppConnectionService.updateConversationUi();
+ this.mJingleConnectionManager.updateConversationUi(true);
} else {
this.mXmppConnectionService.markMessage(this.message,
Message.STATUS_SEND_FAILED);
@@ -868,7 +868,7 @@ public class JingleConnection implements Transferable {
if (this.file!=null) {
file.delete();
}
- this.mXmppConnectionService.updateConversationUi();
+ this.mJingleConnectionManager.updateConversationUi(true);
} else {
this.mXmppConnectionService.markMessage(this.message,
Message.STATUS_SEND_FAILED,
@@ -1016,7 +1016,7 @@ public class JingleConnection implements Transferable {
public void updateProgress(int i) {
this.mProgress = i;
- mXmppConnectionService.updateConversationUi();
+ mJingleConnectionManager.updateConversationUi(false);
}
public String getTransportId() {
diff --git a/src/main/res/layout/activity_contact_details.xml b/src/main/res/layout/activity_contact_details.xml
index f739eca6..0a677597 100644
--- a/src/main/res/layout/activity_contact_details.xml
+++ b/src/main/res/layout/activity_contact_details.xml
@@ -109,6 +109,7 @@
</RelativeLayout>
<LinearLayout
+ android:id="@+id/keys_wrapper"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/activity_horizontal_margin"
diff --git a/src/main/res/menu/omemo_key_context.xml b/src/main/res/menu/omemo_key_context.xml
index 1e825902..87c2edc7 100644
--- a/src/main/res/menu/omemo_key_context.xml
+++ b/src/main/res/menu/omemo_key_context.xml
@@ -5,8 +5,8 @@
android:title="@string/scan_qr_code"
/>
<item
- android:id="@+id/purge_omemo_key"
- android:title="@string/purge_key"/>
+ android:id="@+id/distrust_key"
+ android:title="@string/distrust_omemo_key"/>
<item
android:id="@+id/copy_omemo_key"
android:title="@string/copy_fingerprint"/>
diff --git a/src/main/res/values-bg/strings.xml b/src/main/res/values-bg/strings.xml
index f0054b7c..471fd732 100644
--- a/src/main/res/values-bg/strings.xml
+++ b/src/main/res/values-bg/strings.xml
@@ -332,6 +332,7 @@
<string name="message_options">Настройки за съобщенята</string>
<string name="copy_text">Копиране на текста</string>
<string name="select_text">Избиране на текста</string>
+ <string name="quote">Цитат</string>
<string name="copy_original_url">Копиране на оригиналния адрес</string>
<string name="send_again">Повторно изпращане</string>
<string name="file_url">Адрес на файла</string>
@@ -396,9 +397,6 @@
<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="error_no_keys_to_trust_server_error">Няма ключове, които могат да бъдат използвани за този контакт.\nИзтеглянето на нови ключове от сървъра беше неуспешно. Възможно е да има проблем със сървъра на контактите Ви.</string>
<string name="error_no_keys_to_trust">Няма ключове, които могат да бъдат използвани за този контакт. Ако сте изчистили някои от ключовете му, то той трябва да създаде нови.</string>
<string name="error_trustkeys_title">Грешка</string>
@@ -682,4 +680,15 @@
<string name="blindly_trusted_omemo_keys">Приети на сляпо ключове OMEMO</string>
<string name="not_trusted">Неприети</string>
<string name="invalid_barcode">Грешен 2-измерен баркод</string>
+ <string name="pref_clean_cache_summary">Изчистване на папката с кеша (използвана от камерата)</string>
+ <string name="pref_clean_cache">Изчистване на кеша</string>
+ <string name="pref_clean_private_storage">Изчистване на личното място за съхранение</string>
+ <string name="pref_clean_private_storage_summary">Изчистване на мястото, където се съхраняват личните файлове. (Те могат да бъдат повторно изтеглени от сървъра.)</string>
+ <string name="i_followed_this_link_from_a_trusted_source">Последвах тази връзка от доверено място</string>
+ <string name="verifying_omemo_keys_trusted_source">На път сте да потвърдите ключовете OMEMO на %1$s, след като сте щракнали връзка. Това е безопасна операция, само ако сте последвали тази връзка от доверено място, където само %2$s би могъл да я публикува.</string>
+ <string name="verify_omemo_keys">Потвърждаване на ключове OMEMO</string>
+ <string name="show_inactive_devices">Показване на неактивните устройства</string>
+ <string name="hide_inactive_devices">Скриване на неактивните устройства</string>
+ <string name="distrust_omemo_key">Сваляне на доверието</string>
+ <string name="distrust_omemo_key_text">Наистина ли искате да заличите потвърждението на това устройство?\nТова устройство и съобщенията, идващи от него, ще бъдат отбелязани като „непроверени“.</string>
</resources>
diff --git a/src/main/res/values-cs/strings.xml b/src/main/res/values-cs/strings.xml
index c18a6346..6db5af33 100644
--- a/src/main/res/values-cs/strings.xml
+++ b/src/main/res/values-cs/strings.xml
@@ -391,9 +391,6 @@
<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ě tyto 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="error_no_keys_to_trust_server_error">Pro tento kontakt nejsou dostupné žádné použitelné klíče.\nNahrání klíčů ze serveru nebylo úspěšné. Možná je něco špatně se serverem vašeho kontaktu.</string>
<string name="error_no_keys_to_trust">Pro tento kontakt nejsou dostupné žádné použitelné klíče. Pokud jste smazali jakýkoliv z jeho klíčů bude třeba vygenerovat nové.</string>
<string name="error_trustkeys_title">Chyba</string>
diff --git a/src/main/res/values-de/strings.xml b/src/main/res/values-de/strings.xml
index 08993950..8cd814f2 100644
--- a/src/main/res/values-de/strings.xml
+++ b/src/main/res/values-de/strings.xml
@@ -332,6 +332,7 @@
<string name="message_options">Nachrichtenoptionen</string>
<string name="copy_text">Text kopieren</string>
<string name="select_text">Text markieren</string>
+ <string name="quote">Zitat</string>
<string name="copy_original_url">Original-URL kopieren</string>
<string name="send_again">Erneut senden</string>
<string name="file_url">Datei-URL</string>
@@ -396,9 +397,6 @@
<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="error_no_keys_to_trust_server_error">Für diesen Kontakt sind keine benutzbaren Schlüssel verfügbar.\nNeue Schlüssel vom Server herunterzuladen war nicht erfolgreich. Vielleicht stimmt etwas mit dem Server deines Kontakts nicht.</string>
<string name="error_no_keys_to_trust">Es sind keine Schlüssel für diesen Kontakt verfügbar. Falls sie gelöscht wurden, müssen diese neu erstellt werden.</string>
<string name="error_trustkeys_title">Fehler</string>
@@ -481,7 +479,7 @@
<string name="received_location">Standort empfangen</string>
<string name="title_undo_swipe_out_conversation">Unterhaltung beendet</string>
<string name="title_undo_swipe_out_muc">Konferenz verlassen</string>
- <string name="pref_dont_trust_system_cas_title">Zertifizierungsstellen misstrauen</string>
+ <string name="pref_dont_trust_system_cas_title">Zertifizierungsstellen nicht vertrauen</string>
<string name="pref_dont_trust_system_cas_summary">Alle Zertifikate müssen manuell bestätigt werden</string>
<string name="pref_remove_trusted_certificates_title">Zertifikate löschen</string>
<string name="pref_remove_trusted_certificates_summary">Als vertrauenswürdig bestätigte Zertifikate löschen</string>
@@ -499,9 +497,9 @@
</plurals>
<string name="pref_quick_action_summary">Ersetze Absende-Knopf durch Schnell-Tasten</string>
<string name="pref_quick_action">Schnell-Tasten</string>
- <string name="none">keine</string>
- <string name="recently_used">zuletzt verwendet</string>
- <string name="choose_quick_action">wähle Schnell-Taste</string>
+ <string name="none">Keine</string>
+ <string name="recently_used">Zuletzt verwendet</string>
+ <string name="choose_quick_action">Wähle Schnell-Taste</string>
<string name="search_for_contacts_or_groups">Nach Kontakten oder Konferenzen suchen</string>
<string name="send_private_message">Private Nachricht senden</string>
<string name="user_has_left_conference">%s hat die Konferenz verlassen!</string>
@@ -543,7 +541,7 @@
<string name="jid_does_not_match_certificate">Jabber-ID stimmt nicht dem Zertifikat überein</string>
<string name="action_renew_certificate">Zertifikat erneuern</string>
<string name="error_fetching_omemo_key">Kann OMEMO-Schlüssel nicht empfangen!</string>
- <string name="verified_omemo_key_with_certificate">OMEMO-Schlüssel mit Zertifikat bestätigt!</string>
+ <string name="verified_omemo_key_with_certificate">Überprüfter OMEMO-Schlüssel mit Zertifikat!</string>
<string name="device_does_not_support_certificates">Dein Gerät unterstützt das Auswählen von Client-Zertifikaten nicht!</string>
<string name="pref_connection_options">Verbindung</string>
<string name="pref_use_tor">Über Tor verbinden</string>
@@ -657,7 +655,7 @@
<string name="wrong_conference_configuration">Dies ist keine private, nicht-anonyme Konferenz.</string>
<string name="this_conference_has_no_members">Diese Konferenz enthält keine Teilnehmer.</string>
<string name="report_jid_as_spammer">Melde die JID als Sender unerwünschter Nachrichten.</string>
- <string name="pref_delete_omemo_identities">OMEMO Identitäten zurücksetzen</string>
+ <string name="pref_delete_omemo_identities">OMEMO-Identitäten zurücksetzen</string>
<string name="pref_delete_omemo_identities_summary">Regeneriere deine OMEMO-Schlüssel. Alle deine Kontakte müssen dich neu verifizieren. Nutze dies als letzten Ausweg.</string>
<string name="delete_selected_keys">Ausgewählte Schlüssel löschen</string>
<string name="error_publish_avatar_offline">Du musst verbunden sein um deinen Avatar zu veröffentlichen</string>
@@ -667,9 +665,9 @@
<string name="data_saver_enabled_explained">Dein Betriebssystem verbietet Conversations im Hintergrund den Zugang zum Internet. Um Benachrichtigungen erhalten zu können, solltest du Conversations den Zugang erlauben, wenn der Datensparmodus aktiv ist. Conversations wird dennoch versuchen, so viele Daten wie möglich einzusparen.</string>
<string name="device_does_not_support_data_saver">Dein Gerät unterstützt den Datensparmodus für Conversations nicht.</string>
<string name="error_unable_to_create_temporary_file">Temporäre Datei kann nicht erstellt werden</string>
- <string name="this_device_has_been_verified">Dieses Gerät wurde verifiziert</string>
+ <string name="this_device_has_been_verified">Dieses Gerät wurde überprüft</string>
<string name="copy_fingerprint">Fingerabdruck kopieren</string>
- <string name="all_omemo_keys_have_been_verified">Alle OMEMO-Schlüssel wurden verifiziert</string>
+ <string name="all_omemo_keys_have_been_verified">Alle OMEMO-Schlüssel wurden überprüft</string>
<string name="barcode_does_not_contain_fingerprints_for_this_conversation">Barcode enthält keine Fingerabdrücke für diese Unterhaltung.</string>
<string name="verified_fingerprints">Überprüfte Fingerabdrücke</string>
<string name="use_camera_icon_to_scan_barcode">Nutze Kamera, um Barcodes deiner Kontakte zu scannen</string>
@@ -678,8 +676,19 @@
<string name="share_as_uri">Als XMPP URI teilen</string>
<string name="share_as_http">Als HTTP Link teilen</string>
<string name="pref_blind_trust_before_verification">Blind vertrauen vor der Überprüfung</string>
- <string name="pref_blind_trust_before_verification_summary">Vertraue automatisch allen neuen Geräten von Kontakten, die noch nicht überprüft wurden und zeige eine Aufforderung zur manuellen Bestätigung an, wenn ein verifizierter Kontakt ein neues Gerät hinzufügt.</string>
+ <string name="pref_blind_trust_before_verification_summary">Vertraue automatisch allen neuen Geräten von Kontakten, die noch nicht überprüft wurden und zeige eine Aufforderung zur manuellen Bestätigung an, wenn ein bereits überprüfter Kontakt ein neues Gerät hinzufügt.</string>
<string name="blindly_trusted_omemo_keys">Blind vertraute OMEMO-Schlüssel</string>
<string name="not_trusted">Nicht vertraut</string>
<string name="invalid_barcode">Ungültiger Barcode</string>
+ <string name="pref_clean_cache_summary">Lösche Cache-Ordner (wurde von der Kamera benutzt)</string>
+ <string name="pref_clean_cache">Lösche Cache</string>
+ <string name="pref_clean_private_storage">Lösche privaten Speicher</string>
+ <string name="pref_clean_private_storage_summary">Lösche privaten Speicher, in dem die Dateien gespeichert werden (sie können erneut vom Server heruntergeladen werden)</string>
+ <string name="i_followed_this_link_from_a_trusted_source">Ich habe diesen Link aus einer vertrauenswürdigen Quelle erhalten</string>
+ <string name="verifying_omemo_keys_trusted_source">Du bist dabei, die OMEMO-Schlüssel von %1$s nach dem Klick auf diesen Link zu überprüfen. Dies ist nur sicher, wenn du diesen Link von einer vertrauenswürdigen Quelle erhalten hast, der nur von %2$s veröffentlicht werden konnte.</string>
+ <string name="verify_omemo_keys">Überprüfe OMEMO-Schlüssel</string>
+ <string name="show_inactive_devices">Inaktive Geräte anzeigen</string>
+ <string name="hide_inactive_devices">Inaktive Geräte nicht anzeigen</string>
+ <string name="distrust_omemo_key">Gerät nicht mehr vertrauen</string>
+ <string name="distrust_omemo_key_text">Möchtest du die vorhandene Überprüfung für dieses Gerät löschen?\nDas Gerät und gesendete Nachrichten von diesem Gerät werden als nicht vertrauenswürdig markiert.</string>
</resources>
diff --git a/src/main/res/values-es/strings.xml b/src/main/res/values-es/strings.xml
index 0cd14367..90f80086 100644
--- a/src/main/res/values-es/strings.xml
+++ b/src/main/res/values-es/strings.xml
@@ -396,9 +396,6 @@
<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="error_no_keys_to_trust_server_error">No hay claves usables disponibles para este contacto. La búsqueda de nuevas claves al servidor ha fallado. Puede que exista un problema con el servidor de tus contactos.</string>
<string name="error_no_keys_to_trust">No hay claves usables disponibles para este contacto. Si has eliminado alguna de sus claves, tus contactos necesitarán generar nuevas claves.</string>
<string name="error_trustkeys_title">Error</string>
diff --git a/src/main/res/values-eu/strings.xml b/src/main/res/values-eu/strings.xml
index 8e5ef28e..76d86b0c 100644
--- a/src/main/res/values-eu/strings.xml
+++ b/src/main/res/values-eu/strings.xml
@@ -396,9 +396,6 @@
<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="error_no_keys_to_trust_server_error">Ez dago gako erabilgarririk kontaktu honetarako.\nEzin izan da zerbitzaritik gako berririk eskuratu. Agian akatsen bat dago zure kontaktuen zerbitzariarekin.</string>
<string name="error_no_keys_to_trust">Kontaktu honetarako gako erabilgarririk ez dago. Bere gakoak purgatu badituzu, berri batzuk sortu behar dituzte.</string>
<string name="error_trustkeys_title">Akatsa</string>
diff --git a/src/main/res/values-fr/strings.xml b/src/main/res/values-fr/strings.xml
index aae588b3..860b0808 100644
--- a/src/main/res/values-fr/strings.xml
+++ b/src/main/res/values-fr/strings.xml
@@ -396,9 +396,6 @@
<string name="wipe_omemo_pep">Effacer les autres appareils de PEP</string>
<string name="clear_other_devices">Supprimer les appareils</string>
<string name="clear_other_devices_desc">Êtes-vous sûr de vouloir supprimer les autres appareils de l\'annonce OMEMO ? Ils s\'annonceront de nouveau à leur prochaine connexion, mais ils peuvent ne pas recevoir les messages envoyés entre temps.</string>
- <string name="purge_key">Supprimer la clef</string>
- <string name="purge_key_desc_part1">Êtes-vous sûr de vouloir supprimer cette clef ?</string>
- <string name="purge_key_desc_part2">Elle sera considérée compromise de manière irréversible, et vous ne pourrez plus générer de session avec.</string>
<string name="error_no_keys_to_trust_server_error">Il n\'y a aucune clef utilisable disponible pour ce contact.\nLa récupération de nouvelles clefs sur le serveur a échoué. Peut-être y a-t-il un problème avec votre serveur de contacts ?</string>
<string name="error_no_keys_to_trust">il n\'y a pas de clef disponible pour ce contact. Si vous avez purgé toutes ses clefs, il doit en générer de nouvelles.</string>
<string name="error_trustkeys_title">Erreur</string>
diff --git a/src/main/res/values-it/strings.xml b/src/main/res/values-it/strings.xml
index 5444fd74..1adbaef0 100644
--- a/src/main/res/values-it/strings.xml
+++ b/src/main/res/values-it/strings.xml
@@ -332,6 +332,7 @@
<string name="message_options">Opzioni del messaggio</string>
<string name="copy_text">Copia testo</string>
<string name="select_text">Seleziona testo</string>
+ <string name="quote">Quota</string>
<string name="copy_original_url">Copia URL originale</string>
<string name="send_again">Invia di nuovo</string>
<string name="file_url">URL del file</string>
@@ -396,9 +397,6 @@
<string name="wipe_omemo_pep">Cancella altri dispositivi da PEP</string>
<string name="clear_other_devices">Pulisci dispositivi</string>
<string name="clear_other_devices_desc">Sei sicuro/a di voler rimuovere tutti gli altri dispositivi dall\'annuncio OMEMO? La prossima volta che si connetteranno si riannunceranno, ma potrebbero non ricevere i messaggi inviati nel frattempo.</string>
- <string name="purge_key">Elimina chiave</string>
- <string name="purge_key_desc_part1">Sei sicuro/a di voler cancellare questa chiave?</string>
- <string name="purge_key_desc_part2">Verrà considerata irreversibilmente compromessa, e non potrai più creare una sessione con essa.</string>
<string name="error_no_keys_to_trust_server_error">Non ci sono chiavi utilizzabili per questo contatto.\nLa raccolta di nuove chiavi dal server è fallita. Forse qualcosa non va con il tuo server dei contatti.</string>
<string name="error_no_keys_to_trust">Non ci sono chiavi usabili per questo contatto. Se hai cancellato qualsiasi loro chiave, devono generarne di nuove.</string>
<string name="error_trustkeys_title">Errore</string>
@@ -682,4 +680,15 @@
<string name="blindly_trusted_omemo_keys">Chiavi OMEMO fidate ciecamente</string>
<string name="not_trusted">Non fidato</string>
<string name="invalid_barcode">Codice a barre 2D non valido</string>
+ <string name="pref_clean_cache_summary">Svuota la cartella della cache (usata dall\'app fotocamera)</string>
+ <string name="pref_clean_cache">Svuota cache</string>
+ <string name="pref_clean_private_storage">Svuota archivio privato</string>
+ <string name="pref_clean_private_storage_summary">Svuota l\'archivio privato nella quale sono memorizzati i file (possono essere riscaricati dal server)</string>
+ <string name="i_followed_this_link_from_a_trusted_source">Ho seguito questo link da una fonte fidata</string>
+ <string name="verifying_omemo_keys_trusted_source">Stai per verificare le chiavi OMEMO di %1$s cliccando un link. Questo metodo è sicuro solo se hai seguito il link da una fonte fidata dove solo %2$s può averlo pubblicato.</string>
+ <string name="verify_omemo_keys">Verifica chiavi OMEMO</string>
+ <string name="show_inactive_devices">Mostra dispositivi inattivi</string>
+ <string name="hide_inactive_devices">Nascondi dispositivi inattivi</string>
+ <string name="distrust_omemo_key">Diffida il dispositvo</string>
+ <string name="distrust_omemo_key_text">Sei sicuro di volere rimuovere la verifica per questo dispositivo?\nIl dispositivo e i messaggi provenienti da esso verranno segnati come non fidati.</string>
</resources>
diff --git a/src/main/res/values-iw/strings.xml b/src/main/res/values-iw/strings.xml
index a02b3c23..82e1ff39 100644
--- a/src/main/res/values-iw/strings.xml
+++ b/src/main/res/values-iw/strings.xml
@@ -339,9 +339,6 @@
<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="error_no_keys_to_trust">אין מפתחות שימושיים עבור איש קשר זה. אם מחקת אחד מהמפתחות שלהם, יהיה עליהם ליצר מפתח חדש.</string>
<string name="error_trustkeys_title">שגיאה</string>
<string name="fetching_history_from_server">הורדת היסטוריה מהשרת</string>
diff --git a/src/main/res/values-ja/strings.xml b/src/main/res/values-ja/strings.xml
index 1aa424f6..5573dd32 100644
--- a/src/main/res/values-ja/strings.xml
+++ b/src/main/res/values-ja/strings.xml
@@ -332,6 +332,7 @@
<string name="message_options">メッセージオプション</string>
<string name="copy_text">テキストをコピー</string>
<string name="select_text">テキストを選択</string>
+ <string name="quote">引用</string>
<string name="copy_original_url">元の URL をコピー</string>
<string name="send_again">再送</string>
<string name="file_url">ファイル URL</string>
@@ -396,9 +397,6 @@
<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="error_no_keys_to_trust_server_error">この連絡先で利用可能な鍵がありません。\nサーバーから新しい鍵の取得に失敗しました。おそらく、お使いの連絡先サーバーに何か問題があります。</string>
<string name="error_no_keys_to_trust">この連絡先で利用可能な鍵はありません。あなたがその鍵を消去している場合は、新しいものを生成してもらう必要があります。</string>
<string name="error_trustkeys_title">エラー</string>
@@ -679,4 +677,15 @@
<string name="blindly_trusted_omemo_keys">OMEMO 鍵を白紙信託しました</string>
<string name="not_trusted">信頼されていない</string>
<string name="invalid_barcode">不正な 2D バーコード</string>
+ <string name="pref_clean_cache_summary">キャッシュフォルダーをクリアします (カメラアプリケーションで使用)</string>
+ <string name="pref_clean_cache">キャッシュをクリア</string>
+ <string name="pref_clean_private_storage">プライベートストレージをクリア</string>
+ <string name="pref_clean_private_storage_summary">ファイルが保存されているプライベートストレージをクリアします (サーバーから再ダウンロードできます)</string>
+ <string name="i_followed_this_link_from_a_trusted_source">信頼できるソースからこのリンクをたどりました</string>
+ <string name="verifying_omemo_keys_trusted_source">リンクをクリックした後、%1$s の OMEMO 鍵を検証しようとしています。 これは、%2$s がこのリンクを公開した、信頼できるソースからこのリンクをたどった場合にのみ安全です。</string>
+ <string name="verify_omemo_keys">OMEMO 鍵を検証</string>
+ <string name="show_inactive_devices">非アクティブのデバイスを表示</string>
+ <string name="hide_inactive_devices">非アクティブのデバイスを非表示</string>
+ <string name="distrust_omemo_key">信頼できないデバイス</string>
+ <string name="distrust_omemo_key_text">このデバイスの検証を削除してもよろしいですか?\nこのデバイスと、そのデバイスからのメッセージは信頼できないとマークされます。</string>
</resources>
diff --git a/src/main/res/values-ko/strings.xml b/src/main/res/values-ko/strings.xml
index 52510f50..260d5fb7 100644
--- a/src/main/res/values-ko/strings.xml
+++ b/src/main/res/values-ko/strings.xml
@@ -106,6 +106,7 @@
<string name="pref_accept_files_summary">이 크기보다 작은 파일을 자동으로 수락 </string>
<string name="pref_attachments">첨부파일</string>
<string name="pref_return_to_previous">빠른 공유</string>
+ <string name="pref_return_to_previous_summary">공유 한 후 대화를 열지 않고 바로 이전 작업으로 돌아갑니다</string>
<string name="pref_notification_settings">알림 </string>
<string name="pref_notifications">알림 </string>
<string name="pref_notifications_summary">새 메세지 도착시 알림 </string>
@@ -115,16 +116,19 @@
<string name="pref_led_summary">새 메세지 도착시 LED 깜빡이기</string>
<string name="pref_sound">알림음</string>
<string name="pref_sound_summary">새 메세지 도착시 알림음 재생</string>
+ <string name="pref_notification_grace_period">유예기간</string>
<string name="pref_advanced_options">고급</string>
<string name="pref_never_send_crash">충돌 보고서 보내지 않음 </string>
<string name="pref_never_send_crash_summary">Stack trace 정보를 보냄으로서 Conversations의 개발에 기여할 수 있습니다 </string>
<string name="pref_confirm_messages">메세지 확인 </string>
+ <string name="pref_confirm_messages_summary">당신이 메시지를 수신하고 읽을 때 친구에게 그 사실을 알려줍니다</string>
<string name="pref_ui_options">UI</string>
<string name="openpgp_error">OpenKeychain이 오류를 보고합니다 </string>
<string name="error_decrypting_file">파일 복호화 입출력 오류 </string>
<string name="accept">수락 </string>
<string name="error">오류가 발생했습니다 </string>
<string name="pref_grant_presence_updates">프레즌스 업데이트 허가 </string>
+ <string name="pref_grant_presence_updates_summary">미리 작성한 연락처에 대한 권한을 부여하여 참여 구독을 요구합니다</string>
<string name="subscriptions">구독 </string>
<string name="your_account">당신의 계정 </string>
<string name="keys">키 </string>
@@ -152,6 +156,7 @@
<string name="account_status_regis_success">등록 성공 </string>
<string name="account_status_regis_not_sup">서버가 등록을 지원하지 않습니다</string>
<string name="account_status_security_error">보안 오류 </string>
+ <string name="account_status_policy_violation">정책 위반</string>
<string name="account_status_incompatible_server">호환되지 않는 서버 </string>
<string name="account_status_stream_error">스트림 오류</string>
<string name="encryption_choice_unencrypted">암호화되지 않음</string>
@@ -163,6 +168,8 @@
<string name="mgmt_account_disable">임시로 해제</string>
<string name="mgmt_account_publish_avatar">아바타 공개 </string>
<string name="mgmt_account_publish_pgp">OpenPGP 공개 키 공개 </string>
+ <string name="openpgp_has_been_published">OpenPGP 공개키를 공개했습니다.</string>
+ <string name="republish_pgp_keys">OpenPGP 공개 키를 다시 공개하는 것을 잊지 마세요!</string>
<string name="mgmt_account_enable">계정 사용 </string>
<string name="mgmt_account_are_you_sure">확실합니까? </string>
<string name="mgmt_account_delete_confirm_text">계정을 삭제하면 당신의 모든 대화 기록이 사라집니다 </string>
@@ -194,6 +201,7 @@
<string name="server_info_stream_management">XEP-0198: Stream Management </string>
<string name="server_info_pep">XEP-0163: PEP (Avatars / OMEMO)</string>
<string name="server_info_http_upload">XEP-0363: HTTP 파일 업로드</string>
+ <string name="server_info_push">XEP-0357: Push</string>
<string name="server_info_available">가능 </string>
<string name="server_info_unavailable">불가 </string>
<string name="missing_public_keys">공개 키 선언 누락 </string>
@@ -211,6 +219,7 @@
<string name="reception_failed">접수 실패 </string>
<string name="your_fingerprint">당신의 핑거프린트</string>
<string name="otr_fingerprint">OTR 핑거프린트</string>
+ <string name="otr_fingerprint_selected_message">메시지 OTR 지문</string>
<string name="openpgp_key_id">OpenPGP 키ID</string>
<string name="omemo_fingerprint">OMEMO 핑거프린트</string>
<string name="omemo_fingerprint_x509">v\\OMEMO 핑거프린트</string>
@@ -237,11 +246,14 @@
<string name="contact_already_exists">이미 존재하는 연락처입니다 </string>
<string name="join">참석 </string>
<string name="conference_address">회의 주소 </string>
+ <string name="conference_address_example">room@conference.example.com/nick</string>
<string name="save_as_bookmark">즐겨찾기로 저장 </string>
<string name="delete_bookmark">즐겨찾기 삭제 </string>
<string name="bookmark_already_exists">즐겨찾기가 이미 존재합니다 </string>
<string name="you">당신 </string>
<string name="action_edit_subject">회의 제목 편집 </string>
+ <string name="edit_subject_hint">해당 회의의 제목</string>
+ <string name="joining_conference">회의에 참가중...</string>
<string name="leave">퇴장 </string>
<string name="contact_added_you">연락처가 당신을 연락처 목록에 추가했습니다 </string>
<string name="add_back">Add back</string>
@@ -270,6 +282,7 @@
<string name="conference_requires_password">회의에 암호가 필요합니다 </string>
<string name="enter_password">암호 입력 </string>
<string name="missing_presence_updates">연락처로부터 프레즌스 업데이트 찾을 수 없음 </string>
+ <string name="missing_presence_subscription"> 참가구독이 필요합니다</string>
<string name="request_presence_updates">먼저 연락처로부터 프레즌스 업데이트를 요청하세요. 이는 당신의 연락처가 어떤 클라이언트를 사용하는지 결정하는 데 사용됩니다. </string>
<string name="request_now">지금 요청 </string>
<string name="delete_fingerprint">핑거프린트 삭제 </string>
@@ -279,6 +292,8 @@
<string name="pref_security_settings">보안</string>
<string name="pref_force_encryption">강제적인 종단간 암호화</string>
<string name="pref_force_encryption_summary">언제나 암호화 메세지로 전송 (회의 제외) </string>
+ <string name="pref_allow_message_correction">메세지 정정 허가</string>
+ <string name="pref_allow_message_correction_summary">친구들이 메세지를 소급 수정할 수 있도록 허가</string>
<string name="pref_dont_save_encrypted">암호화된 메세지 저장하지 않음 </string>
<string name="pref_dont_save_encrypted_summary">경고: 메세지가 손실될 수 있습니다 </string>
<string name="pref_expert_options">전문가 설정</string>
@@ -299,15 +314,20 @@
<string name="pref_expert_options_other">기타 </string>
<string name="pref_conference_name">회의 이름 </string>
<string name="pref_conference_name_summary">회의를 식별하기 위해 JID 대신 방 제목을 사용 </string>
+ <string name="pref_autojoin">회의에 자동 참가</string>
+ <string name="pref_autojoin_summary">회의 북마크의 자동 참가 플래그를 존중</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>
+ <string name="conference_shutdown">회의가 종료되었습니다</string>
+ <string name="conference_unknown_error">해당 회의에 더 이상 참가하지 않습니다</string>
<string name="using_account">using account %s</string>
<string name="checking_x">HTTP 호스트에서 %s 확인 중</string>
<string name="not_connected_try_again">접속중이 아닙니다. 다시 시도하세요. </string>
<string name="check_x_filesize">%s 크기 확인</string>
+ <string name="check_x_filesize_on_host">%2$s의 %1$s 크기 확인</string>
<string name="message_options">메세지 설정 </string>
<string name="copy_text">텍스트 복사 </string>
<string name="select_text">텍스트를 선택</string>
@@ -318,6 +338,8 @@
<string name="url_copied_to_clipboard">URL이 클립보드에 복사되었습니다 </string>
<string name="message_copied_to_clipboard">메세지가 클립보드에 복사되었습니다 </string>
<string name="image_transmission_failed">이미지 전송 실패 </string>
+ <string name="scan_qr_code">2D 바코드를 스캔하세요</string>
+ <string name="show_qr_code">2D 바코드를 보여주세요</string>
<string name="show_block_list">차단 목록 보기 </string>
<string name="account_details">계정 정보 </string>
<string name="verify_otr">OTR 검증 </string>
@@ -339,6 +361,8 @@
<string name="conversations_foreground_service">Conversations</string>
<string name="pref_keep_foreground_service">포어그라운드에서 서비스 유지 </string>
<string name="pref_keep_foreground_service_summary">운영체제가 접속을 해제하지 못하도록 예방합니다 </string>
+ <string name="pref_export_logs">히스토리 내보내기</string>
+ <string name="pref_export_logs_summary">SD카드에 히스토리 로그 쓰기</string>
<string name="notification_export_logs_title">기록을 SD 카드에 쓰는 중</string>
<string name="choose_file">파일 선택 </string>
<string name="receiving_x_file">수신중 %1$s (%2$d%% 완료) </string>
@@ -371,9 +395,6 @@
<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="error_no_keys_to_trust_server_error">이 연락처에 사용할 수 있는 키가 없습니다. \n서버로부터 새로운 키를 가져올 수 없습니다. 아마 연락처의 서버에 오류가 있는 것 같습니다.</string>
<string name="error_no_keys_to_trust">이 연락처에 사용할 수 있는 키가 없습니다. 당신이 그들의 키 중에서 어떤 것이든 제거했다면, 그들이 새로운 키를 만들어야 합니다.</string>
<string name="error_trustkeys_title">오류</string>
@@ -426,6 +447,7 @@
<string name="two_hours">2시간 </string>
<string name="eight_hours">8시간 </string>
<string name="until_further_notice">나중에 알릴때까지 </string>
+ <string name="pref_input_options">입력</string>
<string name="pref_enter_is_send">엔터 키로 전송 </string>
<string name="pref_enter_is_send_summary">엔터 키로 메세지를 보냅니다 </string>
<string name="pref_display_enter_key">엔터 키 표시 </string>
@@ -447,6 +469,7 @@
<string name="contact_is_typing">%s 이(가) 입력중입니다...</string>
<string name="contact_has_stopped_typing">%s 이(가) 입력을 중단했습니다 </string>
<string name="pref_chat_states">입력 알림 </string>
+ <string name="pref_chat_states_summary">메세지를 쓸 때 친구들이 알게 합니다</string>
<string name="send_location">위치 전송 </string>
<string name="show_location">위치 표시 </string>
<string name="no_application_found_to_display_location">위치를 표시할 수 있는 앱이 발견되지 않았습니다 </string>
@@ -479,21 +502,36 @@
<string name="username">사용자 이름</string>
<string name="username_hint">사용자 이름</string>
<string name="invalid_username">이것은 올바른 사용자 이름이 아닙니다</string>
+ <string name="conference_name">회의 이름</string>
+ <string name="invalid_conference_name">유효한 회의 이름이 아닙니다</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>
+ <string name="download_failed_could_not_write_file">다운로드 실패: 파일을 쓸 수 없습니다</string>
<string name="pref_use_white_background">하얀색 배경 사용</string>
<string name="pref_use_white_background_summary">받은 메세지를 하얀색 배경에 검은색 글씨로 표시</string>
<string name="account_status_tor_unavailable">Tor 네트워크 사용할 수 없음</string>
+ <string name="account_status_bind_failure">바인드 실패</string>
+ <string name="account_status_host_unknown">서버가 도메인에 응답하지 않습니다</string>
<string name="server_info_broken">손상됨</string>
+ <string name="pref_presence_settings">참가</string>
<string name="pref_away_when_screen_off">화면이 꺼져있을 경우 자리 비움으로 표시</string>
<string name="pref_away_when_screen_off_summary">화면이 꺼져있을 경우에 자리 비움으로 상태를 표시함</string>
<string name="pref_xa_on_silent_mode">음소거 모드에서는 사용할 수 없음</string>
<string name="pref_xa_on_silent_mode_summary">기기가 음소거 모드일때는 사용할 수 없음으로 상태를 표시함</string>
+ <string name="pref_treat_vibrate_as_silent">진동을 자동으로 처리</string>
+ <string name="pref_treat_vibrate_as_silent_summary">장치가 진동 할 때 자원을 사용할 수없는 것으로 표시합니다</string>
+ <string name="pref_show_connection_options">확장 연결 설정</string>
+ <string name="pref_show_connection_options_summary">계정을 설정할 때 호스트 이름과 포트 설정을 표시합니다</string>
<string name="hostname_example">xmpp.example.com</string>
<string name="action_add_account_with_certificate">인증서가 있는 계정 추가</string>
<string name="unable_to_parse_certificate">인증서를 분석할 수 없음</string>
+ <string name="mam_prefs">보관 설정</string>
+ <string name="server_side_mam_prefs">서버 사이드의 보관 설정</string>
+ <string name="fetching_mam_prefs">보관 설정을 얻고 있습니다. 잠시 기다려주십시오 ...</string>
+ <string name="unable_to_fetch_mam_prefs">보관 설정을 가져올 수 없습니다.</string>
<string name="captcha_required">Captcha가 필요함</string>
+ <string name="captcha_hint">위의 이미지에서 텍스트를 입력하십시오</string>
<string name="certificate_chain_is_not_trusted">인증서 체인을 신뢰할 수 없습니다</string>
<string name="jid_does_not_match_certificate">Jabber ID가 인증서와 일치하지 않습니다</string>
<string name="action_renew_certificate">인증서 갱신</string>
@@ -515,6 +553,8 @@
<string name="load_more_messages">메세지 더 불러오기</string>
<string name="shared_file_with_x">파일을 %s와 공유함</string>
<string name="shared_image_with_x">이미지를 %s와 공유함</string>
+ <string name="shared_images_with_x">%s로 이미지를 공유</string>
+ <string name="shared_text_with_x">%s 에서 텍스트를 공유</string>
<string name="no_storage_permission">Conversations는 외부 저장소로의 접근을 필요로 합니다</string>
<string name="sync_with_contacts">연락처와 동기화</string>
<string name="sync_with_contacts_long">Conversations는 XMPP 명단과 연락처 명단을 대조시켜서 이름과 아바타를 표시하고자 합니다.\n\nConversations는 당신의 서버에 업로드하지 않고 기기 내부적으로만 연락처를 읽고 대조를 할 것입니다.\n\n이제 연락처에 접근할 권한을 당신에게 물어볼 것입니다.</string>
@@ -531,6 +571,7 @@
<string name="notify_never">알림 해제됨</string>
<string name="notify_paused">알림 일시중지됨</string>
<string name="pref_picture_compression">사진 압축</string>
+ <string name="pref_picture_compression_summary">사진 크기 조정 및 압축</string>
<string name="always">항상</string>
<string name="automatically">자동</string>
<string name="battery_optimizations_enabled">배터리 최적화 사용됨</string>
@@ -538,23 +579,57 @@
<string name="battery_optimizations_enabled_dialog">당신의 기기는 메세지를 받지 못하게 되거나 알림을 지연시킬 수도 있는 고강도의 배터리 최적화를 Conversations에 하고 있습니다.\n이것을 해제할 것인지 물어볼 것입니다.</string>
<string name="disable">해제</string>
<string name="selection_too_large">선택된 영역이 너무 큽니다</string>
+ <string name="no_accounts">(활성화 된 계정이 없습니다)</string>
+ <string name="this_field_is_required">반드시 작성해야 합니다</string>
<string name="correct_message">메세지 정정</string>
<string name="send_corrected_message">정정한 메세지 전송</string>
+ <string name="no_keys_just_confirm">이미 이 연락처를 신뢰하고 있습니다. \'완료\'를 선택하면 %s가 이 회의의 참가자임을 확인합니다.</string>
<string name="select_image_and_crop">이미지 선택 후 자르기</string>
+ <string name="this_account_is_disabled">이 계정을 비활성화했습니다</string>
+ <string name="security_error_invalid_file_access">보안 오류 : 잘못된 파일 액세스</string>
+ <string name="no_application_to_share_uri">URI를 공유하는 응용 프로그램을 찾을 수 없습니다</string>
+ <string name="share_uri_with">URI를 공유할 대상...</string>
+ <string name="welcome_text">XMPP는 제공자에 의존하지 않는 프로토콜입니다. 지금까지 당신이 선택한 어떤 XMPP 서버에서든 이 클라이언트를 사용할 수 있습니다. \n 그러나 당신이 편리하게, Conversations에서 사용하기에 적합한 제공자인 conversations.im¹에서 쉽게 계정을 만들 수 있도록하고 있습니다.</string>
+ <string name="magic_create_text">conversations. im 계정을 만드는 단계를 안내합니다. \n 제공자로 conversations. im을 선택하면 당신의 완전한 Jabber ID를 지정하여 다른 공급자의 사용자와 통신 할 수 있습니다.</string>
<string name="your_full_jid_will_be">나의 전체 Jabber ID: %s</string>
<string name="create_account">계정 생성</string>
<string name="use_own_provider">다른 서버 이용</string>
<string name="pick_your_username">유저네임을 고르세요</string>
+ <string name="pref_manually_change_presence">참가를 수동으로 변경</string>
+ <string name="pref_manually_change_presence_summary">아바타를 터치하여 참여를 변경합니다</string>
+ <string name="change_presence">참여를 변경</string>
<string name="status_message">상태 메세지</string>
+ <string name="all_accounts_on_this_device">이 장치의 모든 계정에 대해 설정</string>
<string name="presence_chat">대화 가능 </string>
<string name="presence_online">접속중 </string>
<string name="presence_away">자리 비움 </string>
<string name="presence_xa">사용할 수 없음</string>
<string name="presence_dnd">바쁨</string>
<string name="secure_password_generated">안전한 비밀번호가 생성되었습니다</string>
+ <string name="device_does_not_support_battery_op">장치가 배터리 최적화 정지를 지원하지 않습니다</string>
<string name="show_password">패스워드 보이기</string>
+ <string name="registration_please_wait">등록에 실패했습니다. 나중에 다시 시도하십시오</string>
+ <string name="registration_password_too_weak">등록에 실패했습니다 : 암호가 너무 약합니다</string>
<string name="create_conference">회의 개설</string>
<string name="join_or_create_conference">회의에 참여하거나 하나를 개설하세요</string>
+ <string name="conference_subject">제목</string>
+ <string name="choose_participants">참가자를 선택</string>
+ <string name="creating_conference">회의 만드는 중...</string>
+ <string name="invite_again">다시 초대</string>
+ <string name="gp_short">짧음</string>
+ <string name="gp_medium">중간</string>
+ <string name="gp_long">김</string>
+ <string name="pref_broadcast_last_activity">마지막 사용자 대화를 방송</string>
+ <string name="pref_broadcast_last_activity_summary">Conversations를 사용하면 모든 친구들에게 알림</string>
+ <string name="pref_privacy">프라이버시</string>
+ <string name="pref_theme_options">테마</string>
+ <string name="pref_theme_options_summary">색상 팔레트를 선택</string>
+ <string name="pref_theme_light">라이트 테마</string>
+ <string name="pref_theme_dark">다크 테마</string>
+ <string name="pref_use_green_background">초록색 배경</string>
+ <string name="pref_use_green_background_summary">받은 메시지에 녹색 배경을 사용합니다</string>
+ <string name="unable_to_connect_to_keychain">OpenKeychain 에 연결할 수 없습니다</string>
+ <string name="this_device_is_no_longer_in_use">이 장치는 현재 사용되고 있지 않습니다</string>
<string name="type_pc">컴퓨터</string>
<string name="type_phone">휴대폰</string>
<string name="type_tablet">태블릿</string>
@@ -563,20 +638,25 @@
<string name="payment_required">지불 필요</string>
<string name="missing_internet_permission">인터넷 권한이 없음</string>
<string name="me">나</string>
+ <string name="contact_asks_for_presence_subscription">연락처가 참가 구독을 문의합니다</string>
<string name="allow">허가</string>
<string name="no_permission_to_access_x">%s에 접근할 권한이 없음</string>
<string name="remote_server_not_found">원격 서버 찾을 수 없음</string>
<string name="unable_to_update_account">계정을 업데이트 할수없음</string>
+ <string name="pref_delete_omemo_identities_summary">OMEMO 키를 다시 생성합니다. 모든 연락처를 다시 확인해야합니다. 최후의 수단으로만 사용하십시오.</string>
<string name="error_publish_avatar_offline">아바타를 게시하려면 연결된 상태여야 합니다.</string>
<string name="show_error_message">에러 메세지 보이기</string>
<string name="error_message">에러 메세지</string>
<string name="data_saver_enabled">데이터 서버 활성화됨</string>
+ <string name="data_saver_enabled_explained">운영 시스템은 Conversations 백그라운드 때 인터넷에 액세스하는 것을 제한하고 있습니다. 새 메시지 알림을 수신하려면 데이터 보호기가 켜져있을 때, Conversations에 무제한 액세스를 허용해야합니다. \n Conversations는 가능하면 데이터를 저장하기 위해 노력하고 있습니다.</string>
+ <string name="device_does_not_support_data_saver">장치는 Conversations 데이터 보호기를 해제 할 수 없습니다.</string>
<string name="this_device_has_been_verified">해당 장치가 인증되었습니다</string>
<string name="copy_fingerprint">핑거프린트 복사</string>
<string name="verified_fingerprints">인증된 핑거프린트</string>
<string name="share_as_barcode">바코드로 공유</string>
<string name="share_as_uri">XMPP URI로 공유</string>
<string name="share_as_http">HTTP 링크로 공유</string>
+ <string name="pref_blind_trust_before_verification_summary">이전에 확인되지 않은 연락처의 새로운 장치를 자동으로 신뢰하고, 신속히 연락처가 새로운 장치를 추가 할 때마다 수동으로 확인하도록 요청합니다.</string>
<string name="not_trusted">신뢰되지 않음</string>
<string name="invalid_barcode">잘못된 2D 바코드</string>
</resources>
diff --git a/src/main/res/values-nb-rNO/strings.xml b/src/main/res/values-nb-rNO/strings.xml
index 9efdd00f..b21ff0df 100644
--- a/src/main/res/values-nb-rNO/strings.xml
+++ b/src/main/res/values-nb-rNO/strings.xml
@@ -71,6 +71,8 @@
<string name="send_failed">forsendelse feilet</string>
<string name="send_rejected">avslått</string>
<string name="preparing_image">Forbereder bilde for forsendelse</string>
+ <string name="preparing_images">Forbereder bilder for forsendelse</string>
+ <string name="sharing_files_please_wait">Deler filer. Vent…</string>
<string name="action_clear_history">Tøm historikk</string>
<string name="clear_conversation_history">Tøm samtalehistorikk</string>
<string name="clear_histor_msg">Ønsker du å slette alle meldinger i denne samtalen?\n\n<b>Advarsel:</b> Dette har ingen innvirkning på meldinger lagret på andre enheter eller tjenere.</string>
@@ -103,19 +105,31 @@
<string name="pref_accept_files">Godta filer</string>
<string name="pref_accept_files_summary">Automatisk godkjenning av filer mindre enn...</string>
<string name="pref_attachments">Vedlegg</string>
+ <string name="pref_return_to_previous">Rask deling</string>
+ <string name="pref_return_to_previous_summary">Gå tilbake til tidligere aktivitet etter å ha delt noe, istedenfor å bli i samtalen</string>
+ <string name="pref_notification_settings">Merknad</string>
<string name="pref_notifications">Varslinger</string>
<string name="pref_notifications_summary">Varsle når en ny melding ankommer</string>
<string name="pref_vibrate">Vibrer</string>
+ <string name="pref_vibrate_summary">Vibrer når en ny melding ankommer</string>
+ <string name="pref_led">LED-merknad</string>
+ <string name="pref_led_summary">Blink merknadslyset når en ny melding ankommer</string>
<string name="pref_sound">Ringetone</string>
+ <string name="pref_sound_summary">Spill en lyd når en ny melding ankommer</string>
+ <string name="pref_notification_grace_period">Fristperiode</string>
+ <string name="pref_notification_grace_period_summary">Mengden tid Conversations forholder seg rolig i, etter å ha sett aktivitet på en annen enhet</string>
<string name="pref_advanced_options">Avansert</string>
<string name="pref_never_send_crash">Aldri send feilrettingsrapporter</string>
<string name="pref_never_send_crash_summary">Ved å sende inn stabelsporinger hjelper du den pågående utviklingen av Conversations</string>
<string name="pref_confirm_messages">Bekreft meldinger</string>
+ <string name="pref_confirm_messages_summary">Lar dine kontakter vite når du har mottatt og lest deres meldinger</string>
+ <string name="pref_ui_options">Grensesnitt</string>
<string name="openpgp_error">Feilmelding fra OpenKeychain</string>
<string name="error_decrypting_file">I/O-feil ved dekryptering av fil</string>
<string name="accept">Godta</string>
<string name="error">En feil har inntruffet</string>
<string name="pref_grant_presence_updates">Tillat oppdateringer for tilstedeværelse</string>
+ <string name="pref_grant_presence_updates_summary">Gi oppdatering for tilstedeværelse på forhånd til kontakter du har lagt til</string>
<string name="subscriptions">Abonnement</string>
<string name="your_account">Din konto</string>
<string name="keys">Nøkler</string>
@@ -143,7 +157,9 @@
<string name="account_status_regis_success">Registrering fullført</string>
<string name="account_status_regis_not_sup">Tjeneren støtter ikke registrering</string>
<string name="account_status_security_error">Sikkerhetsfeil</string>
+ <string name="account_status_policy_violation">Praksisbrudd</string>
<string name="account_status_incompatible_server">Ukompatibel tjener</string>
+ <string name="account_status_stream_error">Strømmingsfeil</string>
<string name="encryption_choice_unencrypted">Ukryptert</string>
<string name="encryption_choice_otr">OTR</string>
<string name="encryption_choice_pgp">OpenPGP</string>
@@ -153,6 +169,8 @@
<string name="mgmt_account_disable">Skru av midlertidig</string>
<string name="mgmt_account_publish_avatar">Publiser avatar</string>
<string name="mgmt_account_publish_pgp">Publiser OpenPGP offentlig nøkkel</string>
+ <string name="openpgp_has_been_published">Offentlig OpenPGP-nøkkel har blitt offentliggjort.</string>
+ <string name="republish_pgp_keys">Husk å offentliggjøre dine offentlige OpenPGP nøkler igjen!</string>
<string name="mgmt_account_enable">Skru på konto</string>
<string name="mgmt_account_are_you_sure">Bekreft.</string>
<string name="mgmt_account_delete_confirm_text">Hvis du sletter din konto vil hele din konversasjonshistorikk gå tapt</string>
@@ -184,6 +202,7 @@
<string name="server_info_stream_management">XEP-0198: Behandling av dataflyt</string>
<string name="server_info_pep">XEP-0163: PEP (Avatarer / OMEMO)</string>
<string name="server_info_http_upload">XEP-0363: HTTP-filopplasting</string>
+ <string name="server_info_push">XEP-0357: Push</string>
<string name="server_info_available">tilgjengelig</string>
<string name="server_info_unavailable">utilgjengelig</string>
<string name="missing_public_keys">Manglende annonsering av offentlig nøkkel</string>
@@ -201,6 +220,8 @@
<string name="reception_failed">Mottak mislyktes</string>
<string name="your_fingerprint">Ditt fingeravtrykk</string>
<string name="otr_fingerprint">OTR-fingeravtrykk</string>
+ <string name="otr_fingerprint_selected_message">Meldingens OTR-fingeravtrykk</string>
+ <string name="openpgp_key_id">OpenPGP nøkkel-ID</string>
<string name="omemo_fingerprint">OMEMO-fingeravtrykk</string>
<string name="omemo_fingerprint_x509">v\\OMEMO-fingeravtrykk</string>
<string name="omemo_fingerprint_selected_message">Meldingens OMEMO-fingeravtrykk</string>
@@ -226,18 +247,21 @@
<string name="contact_already_exists">Kontakten finnes allerede</string>
<string name="join">Ta del i</string>
<string name="conference_address">Konferanse-adresse</string>
+ <string name="conference_address_example">rom@konferanse.eksempel.no/kallenavn</string>
<string name="save_as_bookmark">Lagre som bokmerke</string>
<string name="delete_bookmark">Slett bokmerke</string>
<string name="bookmark_already_exists">Dette bokmerket finnes allerede</string>
<string name="you">Deg</string>
<string name="action_edit_subject">Rediger temaet for konferansen</string>
+ <string name="edit_subject_hint">Temaet for denne konferansen</string>
+ <string name="joining_conference">Tar del i konferanse…</string>
<string name="leave">Forlat</string>
<string name="contact_added_you">Kontakt la deg til i sin liste</string>
<string name="add_back">Gjengjeld tjenesten</string>
<string name="contact_has_read_up_to_this_point">%s har lest hit</string>
<string name="publish">Publiser</string>
<string name="touch_to_choose_picture">Trykk på avataren for å velge blide fra galleriet</string>
- <string name="publish_avatar_explanation">Merk, alle som kan se dine tilgjengelighetsoppdateringer vil kunne se dette bildet.</string>
+ <string name="publish_avatar_explanation">Merk, alle som kan se dine tilstedeværelsesoppdateringer vil kunne se dette bildet.</string>
<string name="publishing">Publiserer…</string>
<string name="error_publish_avatar_server_reject">Tjeneren avslo din publisering</string>
<string name="error_publish_avatar_converting">Noe gikk galt under konvertering av bildet ditt</string>
@@ -258,17 +282,22 @@
<string name="enable">Skru på</string>
<string name="conference_requires_password">Konferansen krever passord</string>
<string name="enter_password">Skriv inn passord</string>
- <string name="missing_presence_updates">Mangler tilgjengelighetsoppdateringer fra kontakt</string>
+ <string name="missing_presence_updates">Mangler tilstedeværelsesoppdateringer fra kontakt</string>
+ <string name="missing_presence_subscription">Mangler tilstedeværelsesabonnement</string>
<string name="request_presence_updates">Forespør tilstedeværelseoppdateringer fra din kontakt først.\n\n<small>Dette brukes til å fastslå hvilke(n) klient(er) din kontakt bruker.</small></string>
<string name="request_now">Send forespørsel nå</string>
<string name="delete_fingerprint">Slett fingeravtrykk</string>
<string name="sure_delete_fingerprint">Bekreft fjerning av fingeravtrykk.</string>
<string name="ignore">Ignorer</string>
- <string name="without_mutual_presence_updates"><b>Advarsel:</b> Å sende dette uten at tilstandsoppdateringer er i overenstemmelse kan forårsake uventede problemer.\n\n<small>Gå til kontaktdetaljer for å bekrefte dine tilstedeværelsesabonnementer.</small></string>
+ <string name="without_mutual_presence_updates"><b>Advarsel:</b> Å sende dette uten at tilstedeværelsesoppdateringer er i overenstemmelse kan forårsake uventede problemer.\n\n<small>Gå til kontaktdetaljer for å bekrefte dine tilstedeværelsesabonnementer.</small></string>
+ <string name="pref_security_settings">Sikkerhet</string>
<string name="pref_force_encryption">Krev ende-til-ende-kryptering</string>
<string name="pref_force_encryption_summary">Alltid send meldinger kryptert (bortsett fra konferanser)</string>
+ <string name="pref_allow_message_correction">Tillat meldingskorrigering</string>
+ <string name="pref_allow_message_correction_summary">La dine kontakter korrigere sine meldinger i ettertid</string>
<string name="pref_dont_save_encrypted">Ikke lagre krypterte meldinger</string>
<string name="pref_dont_save_encrypted_summary">Advarsel: Dette kan føre til at meldinger går tapt</string>
+ <string name="pref_expert_options">Ekspertinnstillinger</string>
<string name="pref_expert_options_summary">Vær forsiktig med disse</string>
<string name="title_activity_about">Om Conversations</string>
<string name="pref_about_conversations_summary">Utgave og lisensinformasjon</string>
@@ -286,15 +315,20 @@
<string name="pref_expert_options_other">Annet</string>
<string name="pref_conference_name">Konferanse-rom</string>
<string name="pref_conference_name_summary">Bruk rommets samtaletema istedenfor JID til å identifisere konferanser</string>
+ <string name="pref_autojoin">Ta del i konferanser automatisk</string>
+ <string name="pref_autojoin_summary">Respekter flagget for automatisk tilknytning i konferansebokmerker</string>
<string name="toast_message_otr_fingerprint">OTR-fingeravtrykk kopiert til utklippstavle!</string>
<string name="toast_message_omemo_fingerprint">OMEMO-fingeravtrykk kopiert til utklippstavle!</string>
<string name="conference_banned">Du er bannlyst fra denne konferansen</string>
<string name="conference_members_only">Denne konferansen er forbeholdt medlemmer</string>
<string name="conference_kicked">Du har blitt kastet ut av denne konferansen</string>
+ <string name="conference_shutdown">Denne konferansen ble avsluttet</string>
+ <string name="conference_unknown_error">Du er ikke lenger i denne konferansen</string>
<string name="using_account">bruker konto %s</string>
<string name="checking_x">Sjekker %s på HTTP-tjener</string>
<string name="not_connected_try_again">Du er ikke tilkoblet. Prøv igjen senere</string>
<string name="check_x_filesize">Sjekk %s størrelse</string>
+ <string name="check_x_filesize_on_host">Sjekk %1$s størrelse på %2$s</string>
<string name="message_options">Meldingsvalg</string>
<string name="copy_text">Kopier tekst</string>
<string name="select_text">Velg tekst</string>
@@ -305,6 +339,8 @@
<string name="url_copied_to_clipboard">Nettadresse kopiert til utklippstavle</string>
<string name="message_copied_to_clipboard">Melding kopiert til utklippstavle</string>
<string name="image_transmission_failed">Bildeoverføring feilet</string>
+ <string name="scan_qr_code">Skann 2D-strekkode</string>
+ <string name="show_qr_code">Vis 2D-strekkode</string>
<string name="show_block_list">Vis blokkeringsliste</string>
<string name="account_details">Kontodetaljer</string>
<string name="verify_otr">Bekreft OTR</string>
@@ -326,10 +362,13 @@
<string name="conversations_foreground_service">Conversations</string>
<string name="pref_keep_foreground_service">Behold tjenesten i forgrunnen</string>
<string name="pref_keep_foreground_service_summary">Forhindrer operativsystemet fra å drepe tilkoblingen din</string>
+ <string name="pref_export_logs">Eksporter historikk</string>
+ <string name="pref_export_logs_summary">Skriv loggføring av samtalehistorikk til SD-kort</string>
<string name="notification_export_logs_title">Skriver loggføringer til SD-kort</string>
<string name="choose_file">Velg fil</string>
<string name="receiving_x_file">Mottak av %1$s (%2$d%% fullført)</string>
<string name="download_x_file">Last ned %s</string>
+ <string name="delete_x_file">Slett %s</string>
<string name="file">fil</string>
<string name="open_x_file">Åpne %s</string>
<string name="sending_file">forsendelse av (%1$d%% fullført)</string>
@@ -341,6 +380,7 @@
<string name="no_application_found_to_open_file">Fant inget program til åpning av fil</string>
<string name="could_not_verify_fingerprint">Kunne ikke bekrefte fingeravtrykk</string>
<string name="manually_verify">Bekreft manuelt</string>
+ <string name="are_you_sure_verify_fingerprint">Er du sikker på at du ønsker å bekrefte denne kontaktens OTR-fingeravtrykk?</string>
<string name="pref_show_dynamic_tags">Vis dynamiske merkelapper</string>
<string name="pref_show_dynamic_tags_summary">Vis \"bare-les\"-merkelapper under kontakter</string>
<string name="enable_notifications">Aktiver varslinger</string>
@@ -356,9 +396,6 @@
<string name="wipe_omemo_pep">Rens andre enheter fra PEP</string>
<string name="clear_other_devices">Rens enheter</string>
<string name="clear_other_devices_desc">Bekreft rensinga av alla andre enheter fra OMEMO-kunngjøringen. Neste gang dine enheter kobler til, vil de tilkjennegi seg på ny, men det kan hende de ikke mottar meldinger sendt i mellomtiden.</string>
- <string name="purge_key">Tilintetgjør nøkkel</string>
- <string name="purge_key_desc_part1">Tilintetgjør denne nøkkelen?</string>
- <string name="purge_key_desc_part2">Den vil for all fremtid bli ansett som kompromittert, og du kan aldri starte en økt med den igjen.</string>
<string name="error_no_keys_to_trust_server_error">Ingen brukbare nøkler tilgjengelige for denne kontakten.\nInnhenting av nye nøkler fra tjeneren var ikke vellykket. Kanskje det er noe galt med tjeneren kontakten din bruker?</string>
<string name="error_no_keys_to_trust">Ingen brukbare nøkler tilgjengelige for denne kontakten. Hvis du har tilintetgjort noen av nøklene deres, må de generere nye.</string>
<string name="error_trustkeys_title">Feil</string>
@@ -382,6 +419,7 @@
<string name="disable_all_accounts">Koble fra alle kontoer</string>
<string name="perform_action_with">Utfør handling med</string>
<string name="no_affiliation">Ingen tilknytning</string>
+ <string name="no_role">Frakoblet</string>
<string name="outcast">Fredløs</string>
<string name="member">Medlem</string>
<string name="advanced_mode">Avansert modus</string>
@@ -410,6 +448,7 @@
<string name="two_hours">2 timer</string>
<string name="eight_hours">8 timer</string>
<string name="until_further_notice">Til videre beskjed</string>
+ <string name="pref_input_options">Inndata</string>
<string name="pref_enter_is_send">Enter er forsendelsesknapp</string>
<string name="pref_enter_is_send_summary">Bruk enter for å sende en melding</string>
<string name="pref_display_enter_key">Vis enter-tast</string>
@@ -431,6 +470,7 @@
<string name="contact_is_typing">%s skriver…</string>
<string name="contact_has_stopped_typing">%s har sluttet å skrive</string>
<string name="pref_chat_states">Varsler for skriving</string>
+ <string name="pref_chat_states_summary">Lar dine kontakter få nyss om at du skriver til dem</string>
<string name="send_location">Send plasseringsdata</string>
<string name="show_location">Vis plasseringsdata</string>
<string name="no_application_found_to_display_location">Ingen programmer funnet til visning av plasseringsdata</string>
@@ -465,27 +505,44 @@
<string name="username">Brukernavn</string>
<string name="username_hint">Brukernavn</string>
<string name="invalid_username">Dette er ikke et gyldig brukernavn</string>
+ <string name="conference_name">Konferansenavn</string>
+ <string name="invalid_conference_name">Dette er ikke et gyldig konferansenavn</string>
<string name="download_failed_server_not_found">Nedlasting feilet: Fant ikke tjener</string>
<string name="download_failed_file_not_found">Nedlasting feilet: Fant ikke fila</string>
<string name="download_failed_could_not_connect">Nedlasting feilet: Kunne ikke koble til tjeneren</string>
+ <string name="download_failed_could_not_write_file">Nedlasting mislyktes: Kunne ikke skrive fil</string>
<string name="pref_use_white_background">Bruk hvit bakgrunn</string>
<string name="pref_use_white_background_summary">Vis mottatte meldinger som svart tekst på hvit bakgrunn</string>
<string name="account_status_tor_unavailable">Tor-nettverk utilgjengelig</string>
+ <string name="account_status_bind_failure">Klarte ikke å binde</string>
+ <string name="account_status_host_unknown">Tjeneren er ikke ansvarlig for domene</string>
<string name="server_info_broken">Knekt</string>
+ <string name="pref_presence_settings">Tilstedeværelse</string>
<string name="pref_away_when_screen_off">Borte når skjermen er av</string>
<string name="pref_away_when_screen_off_summary">Markerer din ressurs som borte når skjermen er avskrudd</string>
<string name="pref_xa_on_silent_mode">Ikke tilgjengelig i stille-modus</string>
<string name="pref_xa_on_silent_mode_summary">Markerer din ressurs som \'ikke tilgjengelig\' når enheten er i stille-modus.</string>
+ <string name="pref_treat_vibrate_as_silent">Behandle vibrering som stille-modus</string>
+ <string name="pref_treat_vibrate_as_silent_summary">Markerer din ressurs som ikke tilgjengelig når enheten er skrudd til vibrering</string>
+ <string name="pref_show_connection_options">Utvidede tilkoblingsinnstillinger</string>
+ <string name="pref_show_connection_options_summary">Vis vertsnavn og portinnstillinger når du setter opp en ny konto</string>
+ <string name="hostname_example">xmpp.eksempel.no</string>
<string name="action_add_account_with_certificate">Legg til konto med sertifikat</string>
<string name="unable_to_parse_certificate">Kunne ikke behandle sertifikat</string>
<string name="authenticate_with_certificate">La stå tom for bekreftelse med sertifikat</string>
+ <string name="mam_prefs">Arkiveringsinnstillinger</string>
+ <string name="server_side_mam_prefs">Arkiveringsinnstillinger på tjenersiden</string>
+ <string name="fetching_mam_prefs">Henter inn arkiveringsinnstillinger. Vent…</string>
+ <string name="unable_to_fetch_mam_prefs">Klarte ikke å hente inn arkiveringsinnstillinger</string>
<string name="captcha_required">CAPTCHA-påkrevd</string>
+ <string name="captcha_hint">Skriv inn teksten fra bildet ovenfor</string>
<string name="certificate_chain_is_not_trusted">Sertifikat-kjeden er ikke betrodd</string>
<string name="jid_does_not_match_certificate">Jabber-ID-en samsvarer ikke med sertifikatet</string>
<string name="action_renew_certificate">Forny sertifikat</string>
<string name="error_fetching_omemo_key">Feil ved innhenting av OMEMO-nøkkel!</string>
<string name="verified_omemo_key_with_certificate">Bekreftet OMEMO-nøkkel med sertifikat!</string>
<string name="device_does_not_support_certificates">Din enhet støtter ikke valg av klientsertifikat!</string>
+ <string name="pref_connection_options">Tilkobling</string>
<string name="pref_use_tor">Koble til via Tor</string>
<string name="pref_use_tor_summary">Send alle tilkoblinger i tunnel gjennom Tor-nettverket. Krever Orbot</string>
<string name="account_settings_hostname">Tjenernavn</string>
@@ -498,8 +555,11 @@
<item quantity="one">%d melding</item>
<item quantity="other">%dmeldinger</item>
</plurals>
+ <string name="load_more_messages">Last inn flere meldinger</string>
<string name="shared_file_with_x">Fil delt med %s</string>
<string name="shared_image_with_x">Bilde delt med %s</string>
+ <string name="shared_images_with_x">Del bilder med %s</string>
+ <string name="shared_text_with_x">Del tekst med %s</string>
<string name="no_storage_permission">Conversations trenger tilgang til eksternt lagringsmedie</string>
<string name="sync_with_contacts">Synkroniser med kontakter</string>
<string name="sync_with_contacts_long">Conversations vil jamføre din XMPP-kontaktliste med dine kontakter for å vise dem med navn og profilbilde.\n\nConversations leser bare dine kontakter for å jamføre dem lokalt, uten å laste dem opp til tjeneren din.\n\nDu kommer nå til å bli spurt om tilgangstillatelse til dine kontakter.</string>
@@ -508,6 +568,7 @@
<string name="certificate_issuer">Utsteder</string>
<string name="certificate_cn">Vanlig navn</string>
<string name="certificate_o">Organisasjon</string>
+ <string name="certificate_sha1">SHA-1</string>
<string name="certicate_info_not_available">(Ikke tilgjengelig)</string>
<string name="certificate_not_found">Fant ikke noe sertifikat</string>
<string name="notify_on_all_messages">Varsle ved alle meldinger</string>
@@ -515,6 +576,7 @@
<string name="notify_never">Varslinger deaktivert</string>
<string name="notify_paused">Varslinger pauset</string>
<string name="pref_picture_compression">Komprimer bilder</string>
+ <string name="pref_picture_compression_summary">Endre størrelse og komprimer bilder</string>
<string name="always">Alltid</string>
<string name="automatically">Automatisk</string>
<string name="battery_optimizations_enabled">Batterioptimaliseringer aktivert</string>
@@ -522,4 +584,99 @@
<string name="battery_optimizations_enabled_dialog">Enheten din gjør noen tunge batterioptimaliseringer på Conversations som kan føre til forsinkede varslinger eller tap av meldinger.\n\nDu vil nå bli bedt om å deaktivere disse.</string>
<string name="disable">Deaktiver</string>
<string name="selection_too_large">Det valgte området er for stort</string>
+ <string name="no_accounts">(Ingen aktiverte kontoer)</string>
+ <string name="this_field_is_required">Dette feltet er påkrevd</string>
+ <string name="correct_message">Korriger melding</string>
+ <string name="send_corrected_message">Send korrigert melding</string>
+ <string name="no_keys_just_confirm">Du stoler allerede på denne kontakten. Ved å velge \'ferdig\' bekrefter du bare at %s er en del av denne konferansen.</string>
+ <string name="select_image_and_crop">Velg bilde og utsnitt</string>
+ <string name="this_account_is_disabled">Du har skrudd av denne kontoen</string>
+ <string name="security_error_invalid_file_access">Sikkerhetsfeil: Ugyldig filtilgang</string>
+ <string name="no_application_to_share_uri">Fant inget program til deling av URI</string>
+ <string name="share_uri_with">Del URI med…</string>
+ <string name="welcome_text">XMPP er en protokoll uavhengig av tilbydere. Du kan bruke denne klienten med hvilken XMPP-tjener du ønsker.\nAv beleilighetshensyn har vi dog gjort det lett å opprette en konto på conversations.im¹; en tilbyder spesielt myntet på bruk med Conversations.</string>
+ <string name="magic_create_text">Vi geleider deg gjennom prosessen med å opprette en konto på conversations.im.¹\nNår du velger conversations.im som tilbyder vil du kunne snakke med brukere fra andre tilbyder ved å gi dem din fulle Jabber-ID.</string>
+ <string name="your_full_jid_will_be">Din fulle Jabber-ID vil være: %s</string>
+ <string name="create_account">Opprett konto</string>
+ <string name="use_own_provider">Bruk min egen tilbyder</string>
+ <string name="pick_your_username">Velg ditt brukernavn</string>
+ <string name="pref_manually_change_presence">Endre tilstedeværelse manuelt</string>
+ <string name="pref_manually_change_presence_summary">Trykk på avataren din for å endre tilstedeværelse</string>
+ <string name="change_presence">Endre tilstedeværelse</string>
+ <string name="status_message">Statusmelding</string>
+ <string name="all_accounts_on_this_device">Sett for alle kontoene på denne enheten</string>
+ <string name="presence_chat">Ledig for sludring</string>
+ <string name="presence_online">Pålogget</string>
+ <string name="presence_away">Borte</string>
+ <string name="presence_xa">Ikke tilgjengelig</string>
+ <string name="presence_dnd">Opptatt</string>
+ <string name="secure_password_generated">Et sikkert passord har blitt opprettet</string>
+ <string name="device_does_not_support_battery_op">Din enhet støtter ikke å melde seg ut av batterioptimeringsprogrammet</string>
+ <string name="show_password">Vis passord</string>
+ <string name="registration_please_wait">Registrering mislyktes: Prøv igjen senere</string>
+ <string name="registration_password_too_weak">Registrering mislyktes: Passordet er for svakt</string>
+ <string name="create_conference">Opprett konferanse</string>
+ <string name="join_or_create_conference">Ta del i eller opprett konferanse</string>
+ <string name="conference_subject">Tema</string>
+ <string name="choose_participants">Velg deltagere</string>
+ <string name="creating_conference">Opprett konferanse…</string>
+ <string name="invite_again">Inviter igjen</string>
+ <string name="gp_short">Kort</string>
+ <string name="gp_medium">Middels</string>
+ <string name="gp_long">Lang</string>
+ <string name="pref_broadcast_last_activity">Kringkast siste brukerhandling</string>
+ <string name="pref_broadcast_last_activity_summary">La alle dine kontakter vite når du bruker Conversations</string>
+ <string name="pref_privacy">Personvern</string>
+ <string name="pref_theme_options">Drakt</string>
+ <string name="pref_theme_options_summary">Velg fargepalett </string>
+ <string name="pref_theme_light">Lys drakt</string>
+ <string name="pref_theme_dark">Mørk drakt</string>
+ <string name="pref_use_green_background">Grønn bakgrunn</string>
+ <string name="pref_use_green_background_summary">Bruk grønn bakgrunn for mottatte meldinger</string>
+ <string name="unable_to_connect_to_keychain">Kunne ikke koble til OpenKeychain</string>
+ <string name="this_device_is_no_longer_in_use">Denne enheten er ikke lenger i bruk</string>
+ <string name="type_pc">Datamaskin</string>
+ <string name="type_phone">Mobiltelefon</string>
+ <string name="type_tablet">Nettbrett</string>
+ <string name="type_web">Nettleser</string>
+ <string name="type_console">Konsoll</string>
+ <string name="payment_required">Betaling kreves</string>
+ <string name="missing_internet_permission">Mangler internettilgang</string>
+ <string name="me">Meg</string>
+ <string name="contact_asks_for_presence_subscription">Kontakt ber om tilstedeværelsesabonnement</string>
+ <string name="allow">Tillat</string>
+ <string name="no_permission_to_access_x">Ingen tilgang til %s</string>
+ <string name="remote_server_not_found">Fjerntjener ble ikke funnet</string>
+ <string name="unable_to_update_account">Kunne ikke oppdatere konto</string>
+ <string name="missing_presence_subscription_with_x">Manglende tilstedeværelsesabonnement med %s.</string>
+ <string name="missing_keys_from_x">Mangler OMEMO-nøkler fra %s.</string>
+ <string name="missing_omemo_keys">Mangler OMEMO-nøkler</string>
+ <string name="wrong_conference_configuration">Dette er ikke en privat, ikke-anonym konferanse.</string>
+ <string name="this_conference_has_no_members">Det er ingen medlemmer i denne konferansen.</string>
+ <string name="report_jid_as_spammer">Rapporter at denne JID-en sender uønskede meldinger eller søppelpost.</string>
+ <string name="pref_delete_omemo_identities">Slett OMEMO-identiteter</string>
+ <string name="pref_delete_omemo_identities_summary">Regenerer dine OMEMO-nøkler. Alle dine kontakter vil måtte bekrefte deg igjen. Bruk dette bare som en siste utvei.</string>
+ <string name="delete_selected_keys">Slett valgte nøkler</string>
+ <string name="error_publish_avatar_offline">Du må være tilkoblet for å publisere din avatar.</string>
+ <string name="show_error_message">Vis feilmelding</string>
+ <string name="error_message">Feilmelding</string>
+ <string name="data_saver_enabled">Datasparing påskrudd</string>
+ <string name="data_saver_enabled_explained">Ditt operativsystem hindrer Conversations i å nå Internett når det er i bakgrunnen. For å motta merknader og nye meldinger bør du gi Conversations ubegrenset tilgang når dataspareren er på.\nConversations vil fremdeles gjøre et forsøk på å spare data når det er mulig.</string>
+ <string name="device_does_not_support_data_saver">Din enhet støtter ikke å skru av datasparing for Conversations.</string>
+ <string name="error_unable_to_create_temporary_file">Kunne ikke opprette midlertidig fil</string>
+ <string name="this_device_has_been_verified">Denne enheten har blitt bekreftet</string>
+ <string name="copy_fingerprint">Kopier fingeravtrykk</string>
+ <string name="all_omemo_keys_have_been_verified">Alle OMEMO-nøkler har blitt bekreftet</string>
+ <string name="barcode_does_not_contain_fingerprints_for_this_conversation">Strekkoden inneholder ikke fingeravtrykk for denne samtalen.</string>
+ <string name="verified_fingerprints">Bekreftede fingeravtrykk</string>
+ <string name="use_camera_icon_to_scan_barcode">Bruk kameraet for å skanne en kontakts strekkode</string>
+ <string name="please_wait_for_keys_to_be_fetched">Vent på innhenting av nøkler</string>
+ <string name="share_as_barcode">Del som strekkode</string>
+ <string name="share_as_uri">Del som XMPP-URI</string>
+ <string name="share_as_http">Del som HTTP-lenke</string>
+ <string name="pref_blind_trust_before_verification">Blind tillit før bekreftelse</string>
+ <string name="pref_blind_trust_before_verification_summary">Stol automatisk på nye enheter tilhørende kontakter jeg ikke har bekreftet før, og spør meg om manuell bekreftelse hver gang en bekreftet kontakt legger til en ny enhet.</string>
+ <string name="blindly_trusted_omemo_keys">OMEMO-nøkler du stoler blindt på</string>
+ <string name="not_trusted">Ikke betrodd</string>
+ <string name="invalid_barcode">Ugyldig 2D-strekkode</string>
</resources>
diff --git a/src/main/res/values-nl/strings.xml b/src/main/res/values-nl/strings.xml
index e87a430f..dfe7f976 100644
--- a/src/main/res/values-nl/strings.xml
+++ b/src/main/res/values-nl/strings.xml
@@ -332,6 +332,7 @@
<string name="message_options">Berichtopties</string>
<string name="copy_text">Tekst kopiëren</string>
<string name="select_text">Tekst selecteren</string>
+ <string name="quote">Citeren</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>
@@ -396,9 +397,6 @@
<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">Weet je zeker dat je alle andere apparaten uit de OMEMO-aankondiging wilt weglaten? De volgende keer dat je apparaten verbinding maken zullen ze zich opnieuw aankondigen, maar zullen ze misschien niet de berichten ontvangen die in de tussentijd zijn verzonden.</string>
- <string name="purge_key">Sleutel verwijderen</string>
- <string name="purge_key_desc_part1">Weet je zeker dat je deze sleutel wilt 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 opzetten.</string>
<string name="error_no_keys_to_trust_server_error">Er zijn geen bruikbare sleutels beschikbaar voor dit contact.\nHet ophalen van nieuwe sleutels van de server is mislukt. Misschien is er iets mis met de server van je contact.</string>
<string name="error_no_keys_to_trust">Er zijn geen bruikbare sleutels beschikbaar voor dit contact. Als je zijn/haar sleutels hebt verwijderd dient hij/zij nieuwe aan te maken.</string>
<string name="error_trustkeys_title">Fout</string>
@@ -682,4 +680,15 @@
<string name="blindly_trusted_omemo_keys">Blindelings vertrouwde OMEMO-sleutels</string>
<string name="not_trusted">Onvertrouwd</string>
<string name="invalid_barcode">Ongeldige 2D-streepjescode</string>
+ <string name="pref_clean_cache_summary">Cachemap wissen (wordt gebruikt door Camera)</string>
+ <string name="pref_clean_cache">Cache wissen</string>
+ <string name="pref_clean_private_storage">Privéopslag wissen</string>
+ <string name="pref_clean_private_storage_summary">Privéopslag waar bestanden worden bijgehouden wissen (de bestanden kunnen opnieuw gedownload worden van de server)</string>
+ <string name="i_followed_this_link_from_a_trusted_source">Ik heb deze koppeling gevolgd van een vertrouwde bron</string>
+ <string name="verifying_omemo_keys_trusted_source">Je staat op het punt de OMEMO-sleutels van %1$s te verifiëren door op een koppeling te klikken. Dit is enkel veilig als je de koppeling van een vertrouwde bron hebt gevolgd, waarbij enkel %2$s de koppeling gepubliceerd kan hebben.</string>
+ <string name="verify_omemo_keys">OMEMO-sleutels verifiëren</string>
+ <string name="show_inactive_devices">Toon niet-actieve apparaten</string>
+ <string name="hide_inactive_devices">Verberg niet-actieve apparaten</string>
+ <string name="distrust_omemo_key">Apparaat niet meer vertrouwen</string>
+ <string name="distrust_omemo_key_text">Weet je zeker dat je de verificatie voor dit apparaat wil verwijderen?\nHet apparaat en alle berichten die het verstuurt zullen als niet-vertrouwd worden weergegeven.</string>
</resources>
diff --git a/src/main/res/values-pl/strings.xml b/src/main/res/values-pl/strings.xml
index da1e50e6..c6fc40a3 100644
--- a/src/main/res/values-pl/strings.xml
+++ b/src/main/res/values-pl/strings.xml
@@ -117,6 +117,7 @@
<string name="pref_sound">Dzwonek</string>
<string name="pref_sound_summary">Odtwórz dźwięk gdy nadejdzie wiadomość</string>
<string name="pref_notification_grace_period">Czas Bez Powiadomień</string>
+ <string name="pref_notification_grace_period_summary">Czas od ostatniej aktywności na innym urządzeniu, przez który Conversations nie odzywa się</string>
<string name="pref_advanced_options">Zaawansowane</string>
<string name="pref_never_send_crash">Nie wysyłaj raportów awarii</string>
<string name="pref_never_send_crash_summary">Wysyłając ślady stosu pomagasz rozwijać Conversations</string>
@@ -128,6 +129,7 @@
<string name="accept">Akceptuj</string>
<string name="error">Wystąpił błąd</string>
<string name="pref_grant_presence_updates">Zezwól na powiadomienia obecności</string>
+ <string name="pref_grant_presence_updates_summary">Automatycznie zezwalaj i pytaj o powiadomienia obecności, kiedy utworzysz kontakt</string>
<string name="subscriptions">Subskrypcje</string>
<string name="your_account">Twoje konto</string>
<string name="keys">Klucze</string>
@@ -155,7 +157,9 @@
<string name="account_status_regis_success">Zarejestrowano pomyślnie</string>
<string name="account_status_regis_not_sup">Serwer nie umożliwia rejestracji</string>
<string name="account_status_security_error">Błąd zabezpieczeń</string>
+ <string name="account_status_policy_violation">Naruszenie zasad</string>
<string name="account_status_incompatible_server">Serwer niekompatybilny</string>
+ <string name="account_status_stream_error">Błąd strumienia</string>
<string name="encryption_choice_unencrypted">Bez szyfrowania</string>
<string name="encryption_choice_otr">OTR</string>
<string name="encryption_choice_pgp">OpenPGP</string>
@@ -166,6 +170,7 @@
<string name="mgmt_account_publish_avatar">Publikuj awatar</string>
<string name="mgmt_account_publish_pgp">Udostępnij klucz publiczny OpenPGP</string>
<string name="openpgp_has_been_published">Klucz publiczny OpenPGP został opublikowany.</string>
+ <string name="republish_pgp_keys">Pamiętaj, by ponownie opublikować swoje klucze publiczne OpenPGP!</string>
<string name="mgmt_account_enable">Włącz konto</string>
<string name="mgmt_account_are_you_sure">Czy na pewno?</string>
<string name="mgmt_account_delete_confirm_text">Wraz z kontem zostanie nieodwracalnie usunięta powiązana historia konwersacji.</string>
@@ -215,6 +220,8 @@
<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="otr_fingerprint_selected_message">Odcisk palca wiadomości OTR</string>
+ <string name="openpgp_key_id">ID klucza OpenPGP</string>
<string name="omemo_fingerprint">Odcisk OMEMO</string>
<string name="omemo_fingerprint_x509">Odcisk v\\OMEMO</string>
<string name="omemo_fingerprint_selected_message">Odcisk OMEMO wiadomości</string>
@@ -246,6 +253,7 @@
<string name="bookmark_already_exists">Zakładka już istnieje</string>
<string name="you">Ty</string>
<string name="action_edit_subject">Edytuj temat konferencji</string>
+ <string name="edit_subject_hint">Temat konferencji</string>
<string name="joining_conference">Dołączenie do konferencji...</string>
<string name="leave">Opuść pokój</string>
<string name="contact_added_you">Kontakt został dodany do listy</string>
@@ -331,6 +339,8 @@
<string name="url_copied_to_clipboard">URL obrazu został skopiowany do schowka</string>
<string name="message_copied_to_clipboard">Wiadomość została skopiowana do schowka</string>
<string name="image_transmission_failed">Błąd podczas przesyłania obrazu</string>
+ <string name="scan_qr_code">Zeskanuj kod</string>
+ <string name="show_qr_code">Pokaż kod QR</string>
<string name="show_block_list">Wyświetl listę banów</string>
<string name="account_details">Szczegóły konta</string>
<string name="verify_otr">Weryfikuj OTR</string>
@@ -352,6 +362,8 @@
<string name="conversations_foreground_service">Conversations</string>
<string name="pref_keep_foreground_service">Usługa na pierwszym planie</string>
<string name="pref_keep_foreground_service_summary">Uniemożliwia systemowi przerwanie połączenia</string>
+ <string name="pref_export_logs">Wyeksportuj historię rozmów</string>
+ <string name="pref_export_logs_summary">Zapisz historię rozmów na karcie SD</string>
<string name="notification_export_logs_title">Zapisywanie historii na karcie SD...</string>
<string name="choose_file">Wybierz plik</string>
<string name="receiving_x_file">Odbieranie %1$s (ukończono %2$d%%)</string>
@@ -368,6 +380,8 @@
<string name="no_application_found_to_open_file">Nie odnaleziono aplikacji skojarzonej z typem pliku</string>
<string name="could_not_verify_fingerprint">Weryfikacja odcisku klucza nieudana</string>
<string name="manually_verify">Weryfikuj ręcznie</string>
+ <string name="are_you_sure_verify_fingerprint">Czy na pewno chcesz zweryfikować odcisk klucza OTR kontaktu?
+</string>
<string name="pref_show_dynamic_tags">Etykiety kontaktów</string>
<string name="pref_show_dynamic_tags_summary">Wyświetlaj etykiety pod kontaktami</string>
<string name="enable_notifications">Włącz powiadomienia</string>
@@ -383,9 +397,6 @@
<string name="wipe_omemo_pep">Usuń inne urządzenia z PEP</string>
<string name="clear_other_devices">Wyczyść urządzenia</string>
<string name="clear_other_devices_desc">Czy na pewno chcesz usunąć wszystkie inne urządzenia z ogłoszenia OMEMO? Następnym razem gdy połączą się Twoje urdzącenia, ogłoszą się one ponownie, ale mogą nie otrzymać wiadomości wysłanych w międzyczasie.</string>
- <string name="purge_key">Skasuj klucz</string>
- <string name="purge_key_desc_part1">Czy na pewno chcesz skasować usunąć odcisk klucza?</string>
- <string name="purge_key_desc_part2">Zostanie bez odwołania uznane za zdradzone, i nigdy więcej nie będzie można stworzyć z nim sesji.</string>
<string name="error_no_keys_to_trust_server_error">Nie ma dostępnych kluczy dl atego kontaktu.\nPobieranie nowych kluczy z serwera nie powiodło się. Byćmoże jest coś nie tak z Twoim serwerem kontaktów?</string>
<string name="error_no_keys_to_trust">Nie ma dostępnych żadnych użytecznych kluczy dla tego kontaktu. Jeśli usunąłeś jakieś jego klucze, kontakt będzie musiał wygenerować nowe.</string>
<string name="error_trustkeys_title">Błąd</string>
@@ -409,6 +420,7 @@
<string name="disable_all_accounts">Wyłącz wszystkie konta</string>
<string name="perform_action_with">Użyj</string>
<string name="no_affiliation">Brak stanowiska</string>
+ <string name="no_role">Offline</string>
<string name="outcast">Wykluczony</string>
<string name="member">Członek</string>
<string name="advanced_mode">Tryb zaawansowany</string>
@@ -459,6 +471,7 @@
<string name="contact_is_typing">%s 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>
<string name="send_location">Wyślij lokalizację</string>
<string name="show_location">Pokaż lokalizację</string>
<string name="no_application_found_to_display_location">Nie odnaleziono aplikacji do wyświetlenia lokalizacji</string>
@@ -500,10 +513,12 @@
<string name="download_failed_server_not_found">Pobieranie nieudane: Nie odnaleziono serwera</string>
<string name="download_failed_file_not_found">Pobieranie nieudane: Nie odnaleziono pliku</string>
<string name="download_failed_could_not_connect">Pobieranie nieudane: Nie można połączyć z hostem</string>
+ <string name="download_failed_could_not_write_file">Pobieranie niepowiodło się: brak możliwości zapisu pliku</string>
<string name="pref_use_white_background">Białe tło</string>
<string name="pref_use_white_background_summary">Pokazuj otrzymane wiadomości jako czarny tekst na białym tle</string>
<string name="account_status_tor_unavailable">Sieć TOR jest niedostepna</string>
<string name="account_status_bind_failure">Błąd połączenia (zasób)</string>
+ <string name="account_status_host_unknown">Serwer nie odpowiada domenie</string>
<string name="server_info_broken">Zepsute</string>
<string name="pref_presence_settings">Obecność</string>
<string name="pref_away_when_screen_off">Status \"Oddalony\" gdy wyświetlacz jest wyłączony</string>
@@ -583,6 +598,8 @@
<string name="security_error_invalid_file_access">Błąd bezpieczeństwa: nieprawidłowy dostęp do pliku</string>
<string name="no_application_to_share_uri">Nie odnaleziono aplikacji skojarzonej z URI</string>
<string name="share_uri_with">Udostępnij URI za pomocą...</string>
+ <string name="welcome_text">XMPP jest protokołem niezależnym od dostawcy usług. Możesz używać tego klienta z dowolnym serwerem XMPP.\nJednak dla Twojej wygody ułatwiliśmy Ci stworzenie konta na conversations.im, serwerze specjalnie przystosowanym do używania z Conversations.</string>
+ <string name="magic_create_text">Przeprowadzimy Cię przez proces tworzenia konta na conversations.im.\nKiedy wybierzesz konto na serwerze conversations.im, będziesz mógł komunikować się z użytkownikami na innych serwerach podając im swój pełen Jabber ID.</string>
<string name="your_full_jid_will_be">Twój pełen Jabber ID będzie następujący: %s</string>
<string name="create_account">Utwórz Konto</string>
<string name="use_own_provider">Użyj innego serwera</string>
@@ -600,6 +617,48 @@
<string name="secure_password_generated">Zostało wygenerowane bezpieczne hasło</string>
<string name="device_does_not_support_battery_op">Twoje urządzenie nie pozwala na wyłączenie optymalizacji baterii</string>
<string name="show_password">Pokaż hasło</string>
+ <string name="registration_please_wait">Rejestracja nie powiodła się. Spróbuj później</string>
+ <string name="registration_password_too_weak">Rejestracja nie powiodła się: hasło zbyt słabe</string>
+ <string name="create_conference">Utwórz konferencję</string>
+ <string name="join_or_create_conference">Dołącz, lub stwórz konferencję</string>
+ <string name="conference_subject">Temat</string>
+ <string name="choose_participants">Wybierz członków</string>
+ <string name="creating_conference">Tworzenie konferencji...</string>
+ <string name="invite_again">Zaproś ponownie</string>
+ <string name="gp_short">Krótki</string>
+ <string name="gp_medium">Średni</string>
+ <string name="gp_long">Długi</string>
+ <string name="pref_broadcast_last_activity">Dziel się ostatnią interakcją.</string>
+ <string name="pref_broadcast_last_activity_summary">Powiadamiaj kontakty, że używasz Conversations</string>
+ <string name="pref_privacy">Prywatność</string>
+ <string name="pref_theme_options">Skórka</string>
+ <string name="pref_theme_options_summary">Wybierz paletę kolorów</string>
+ <string name="pref_theme_light">Jasna skórka</string>
+ <string name="pref_theme_dark">Ciemna skórka</string>
+ <string name="pref_use_green_background">Zielone tło</string>
+ <string name="pref_use_green_background_summary">Używaj zielonego tła dla otrzymanych wiadomości</string>
+ <string name="unable_to_connect_to_keychain">Nie można połączyć się z OpenKeychain</string>
+ <string name="this_device_is_no_longer_in_use">Urządzenie to nie jest już używane</string>
+ <string name="type_pc">Komputer</string>
+ <string name="type_phone">Komórka</string>
+ <string name="type_tablet">Tablet</string>
+ <string name="type_web">Przeglądarka</string>
+ <string name="type_console">Konsola</string>
+ <string name="payment_required">Płatność wymagana</string>
+ <string name="missing_internet_permission">Brak pozwolenia na korzystanie z Internetu</string>
+ <string name="me">Ja</string>
+ <string name="contact_asks_for_presence_subscription">Kontakt prosi o udostępnienie statusu</string>
+ <string name="allow">Pozwól</string>
+ <string name="no_permission_to_access_x">Brak pozwolenia na dostęp do %s</string>
+ <string name="remote_server_not_found">Nie znaleziono serwera</string>
+ <string name="unable_to_update_account">Nie można zaktualizować konta</string>
+ <string name="missing_presence_subscription_with_x">Brakuje subskrypcji obecności dla %s</string>
+ <string name="missing_keys_from_x">Brakuje kluczy OMEMO od %s</string>
+ <string name="missing_omemo_keys">Brakuje kluczy OMEMO</string>
+ <string name="wrong_conference_configuration">To nie jest prywatna, nieanonimowa konferencja.</string>
+ <string name="this_conference_has_no_members">Nikogo tu nie ma</string>
+ <string name="report_jid_as_spammer">Raportuj ten JID jako rozsyłający spam</string>
+ <string name="pref_delete_omemo_identities">Usuń tożsamości OMEMO</string>
<string name="pref_delete_omemo_identities_summary">Wygeneruj jeszcze raz klucze OMEMO. Wszystkie Twoje kontakty będą musiały zweryfikować Twoje nowe klucze. Użyj tego tylko w ostateczności.</string>
<string name="delete_selected_keys">Usuń zaznaczone klucze</string>
<string name="error_publish_avatar_offline">Musisz być połączony/na, aby opublikować swój awatar.</string>
@@ -625,4 +684,15 @@ Conversations będzie wciąż ograniczał transfer danych, kiedy tylko to jest m
<string name="blindly_trusted_omemo_keys">Ślepo ufaj kluczom OMEMO</string>
<string name="not_trusted">Niezaufane</string>
<string name="invalid_barcode">Nieprawidłowy kod kreskowy 2D</string>
+ <string name="pref_clean_cache_summary">Wyczyść cache (używane przez kamerę)</string>
+ <string name="pref_clean_cache">Wyczyść cache</string>
+ <string name="pref_clean_private_storage">Wyczyść prywatny magazyn</string>
+ <string name="pref_clean_private_storage_summary">Wyczyść prywatny magazyn gdzie trzymane są pliki (mogą zostać pobrane ponownie z serwera)</string>
+ <string name="i_followed_this_link_from_a_trusted_source">Trafiłem na ten link w zaufanym źródle</string>
+ <string name="verifying_omemo_keys_trusted_source">Zaraz zweryfikujesz klucz OMEMO %1$s klikając w link. Jest to bezpieczne jedynie, kiedy link pochodzi z zaufanego źródła gdzie tylko %2$s mógł go opublikować.</string>
+ <string name="verify_omemo_keys">Zweryfikuj klucze OMEMO</string>
+ <string name="show_inactive_devices">Pokaż nieaktywne urządzenia</string>
+ <string name="hide_inactive_devices">Ukryj nieaktywne urządzenia</string>
+ <string name="distrust_omemo_key">Przestań ufać urządzeniu</string>
+ <string name="distrust_omemo_key_text">Czy jesteś pewien, że chcesz cofnąć weryfikację tego urządzenia?\nUrządzenie to, i wiadomości z niego przychodzące będą oznaczane jako niezaufane.</string>
</resources>
diff --git a/src/main/res/values-pt-rBR/strings.xml b/src/main/res/values-pt-rBR/strings.xml
index 5f3cf85e..896351d5 100644
--- a/src/main/res/values-pt-rBR/strings.xml
+++ b/src/main/res/values-pt-rBR/strings.xml
@@ -332,6 +332,7 @@
<string name="message_options">Opções da mensagem</string>
<string name="copy_text">Copiar o texto</string>
<string name="select_text">Selecionar o texto</string>
+ <string name="quote">Citar</string>
<string name="copy_original_url">Copiar a URL original</string>
<string name="send_again">Enviar novamente</string>
<string name="file_url">URL do arquivo</string>
@@ -396,9 +397,6 @@
<string name="wipe_omemo_pep">Remover outros dispositivos do PEP</string>
<string name="clear_other_devices">Remover dispositivos</string>
<string name="clear_other_devices_desc">Deseja realmente remover todos os outros dispositivos dos anúncios OMEMO? Na próxima vez que seus dispositivos conectarem eles se reanunciarão, entretanto, eles podem não receber mensagens nesse intervalo de tempo.</string>
- <string name="purge_key">Expurgar a chave</string>
- <string name="purge_key_desc_part1">Deseja realmente expurgar essa chave?</string>
- <string name="purge_key_desc_part2">Ela será considerada irreversivelmente comprometida e você nunca mais conseguirá estabelecer uma sessão com ela.</string>
<string name="error_no_keys_to_trust_server_error">Não existe nenhuma chave utilizável para esse contato.\nNão foi possível obter nenhuma chave nova do servidor. Pode haver alguma coisa errada com o seu servidor de contatos.</string>
<string name="error_no_keys_to_trust">Não existe nenhuma chave utilizável para esse contato. Caso você tenha expurgado alguma chave dele, ele terá que gerar uma nova.</string>
<string name="error_trustkeys_title">Erro</string>
@@ -682,4 +680,7 @@
<string name="blindly_trusted_omemo_keys">Chaves OMEMO aceitas cegamente</string>
<string name="not_trusted">Não confiável</string>
<string name="invalid_barcode">Código de barras 2D inválido</string>
+ <string name="pref_clean_cache_summary">Limpar a pasta de cache (usado pela aplicação de câmera)</string>
+ <string name="pref_clean_cache">Limpar o cache</string>
+ <string name="pref_clean_private_storage">Limpar o armazenamento privado</string>
</resources>
diff --git a/src/main/res/values-pt/strings.xml b/src/main/res/values-pt/strings.xml
index 09ab0747..726cf555 100644
--- a/src/main/res/values-pt/strings.xml
+++ b/src/main/res/values-pt/strings.xml
@@ -379,9 +379,6 @@
<string name="wipe_omemo_pep">Apagar outros dispositivos do PEP</string>
<string name="clear_other_devices">Apagar dispositivos</string>
<string name="clear_other_devices_desc">Tem a certeza que quer apagar todos os outros dispositivos do anúncio OMEMO? A próxima vez que os seus dispositivos se conectem, irão ser eles mesmos a fazerem o anúncio novamente, mas podem não receber as mensagems enviadas entretanto.</string>
- <string name="purge_key">Remover chave</string>
- <string name="purge_key_desc_part1">Tem a certeza que quer remover esta chave?</string>
- <string name="purge_key_desc_part2">Irá ser considerada comprometida irreversivelmente, e não poderá construir uma sessão com ela novamente.</string>
<string name="error_no_keys_to_trust_server_error">Não existem chaves disponíveis para serem utilizadas para este contacto.\nNão foi possível obter chaves novas do servidor. Talvez exista algum problema com o seu servidor de contactos.</string>
<string name="error_no_keys_to_trust">Não existem chaves disponíveis para serem utilizadas para este contacto. Se removeu alguma das chaves dele, ele irá necessitar de gerar chaves novas. </string>
<string name="error_trustkeys_title">Erro</string>
diff --git a/src/main/res/values-ro-rRO/strings.xml b/src/main/res/values-ro-rRO/strings.xml
index b26a4935..cbe51e61 100644
--- a/src/main/res/values-ro-rRO/strings.xml
+++ b/src/main/res/values-ro-rRO/strings.xml
@@ -332,6 +332,7 @@
<string name="message_options">Optiuni mesaje</string>
<string name="copy_text">Copiaza text</string>
<string name="select_text">Selecteaza text</string>
+ <string name="quote">Citeaza</string>
<string name="copy_original_url">Copiaza URL original</string>
<string name="send_again">Trimite din nou</string>
<string name="file_url">URL fisier</string>
@@ -396,9 +397,6 @@
<string name="wipe_omemo_pep">Sterge alte dispozitive din PEP</string>
<string name="clear_other_devices">Curata lista dispozitive</string>
<string name="clear_other_devices_desc">Sigur vrei sa inlaturi toate celelalte dispozitive din mesajul de anunt OMEMO? Data viitoare cand dispozitivele se vor conecta, se vor anunta din nou, dar se poate ca ele sa nu fi primit mesajele trimise intre timp.</string>
- <string name="purge_key">Sterge cheia</string>
- <string name="purge_key_desc_part1">Sigur vrei sa stergi aceasta cheie?</string>
- <string name="purge_key_desc_part2">Va fi considera compromisa ireversibil si nu vei mai putea crea o sesiune cu ea niciodata.</string>
<string name="error_no_keys_to_trust_server_error">Nu exista chei utilizabile pentru acest contact.\nIncercarea de a descarca o cheie de pe server a esuat. Se poate sa fie o problema cu serverul de contacte.</string>
<string name="error_no_keys_to_trust">Nu exista chei disponibile si utilizabile pentru acest contact. Daca ai sters vreuna din cheile contactului, trebuie sa generezi o alta noua.</string>
<string name="error_trustkeys_title">Eroare</string>
@@ -686,4 +684,15 @@ Emitent</string>
<string name="blindly_trusted_omemo_keys">Incredere oarba in aceste chei OMEMO</string>
<string name="not_trusted">De neincredere</string>
<string name="invalid_barcode">Cod de bare 2D invalid</string>
+ <string name="pref_clean_cache_summary">Locul unde sunt pozele temporar salvate (folosit de aplicatia camera foto)</string>
+ <string name="pref_clean_cache">Curata memoria temporara</string>
+ <string name="pref_clean_private_storage">Curata stocarea privata</string>
+ <string name="pref_clean_private_storage_summary">Locul unde sunt fisierele pastrate (pot fi descarcate de pe server din nou)</string>
+ <string name="i_followed_this_link_from_a_trusted_source">Am urmat aceasta legatura de la o sursa de incredere</string>
+ <string name="verifying_omemo_keys_trusted_source">Urmeaza sa verificati cheile OMEMO pentru %1$s dupa ce veti deschide legatura. Acest lucru se poate face in siguranta doar daca ati primit legatura de la o sursa de incredere unde doar %2$s putea publica.</string>
+ <string name="verify_omemo_keys">Verifica cheile OMEMO</string>
+ <string name="show_inactive_devices">Arata dispozitivele inactive</string>
+ <string name="hide_inactive_devices">Ascunde dispozitivele inactive</string>
+ <string name="distrust_omemo_key">Pierde increderea in acest dispozitiv</string>
+ <string name="distrust_omemo_key_text">Sigur doriti sa stergeti datele de verificare pentru acest dispozitiv?\nAcest dispozitiv precum si mesajele venind de la el vor fi marcate ca ne fiind de incredere.</string>
</resources>
diff --git a/src/main/res/values-ru/strings.xml b/src/main/res/values-ru/strings.xml
index 86669105..88e60be8 100644
--- a/src/main/res/values-ru/strings.xml
+++ b/src/main/res/values-ru/strings.xml
@@ -396,9 +396,6 @@
<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="error_no_keys_to_trust_server_error">Для этого контакта не существует доступных ключей.\nПопытка получения новых ключей с сервера оказалась неудачной. Возможно, что-то не так с сервером контактов.</string>
<string name="error_no_keys_to_trust">Для этого контакта не существует доступных ключей. Если вы очистили все его ключи, ему необходимо создать новые.</string>
<string name="error_trustkeys_title">Ошибка</string>
diff --git a/src/main/res/values-sr/strings.xml b/src/main/res/values-sr/strings.xml
index 2be517be..7278b035 100644
--- a/src/main/res/values-sr/strings.xml
+++ b/src/main/res/values-sr/strings.xml
@@ -396,9 +396,6 @@
<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="error_no_keys_to_trust_server_error">Нема употребљивих кључева за овај контакт.\nДобављање нових кључева са сервера није било успешно. Можда нешто није у реду са сервером ваших контаката.</string>
<string name="error_no_keys_to_trust">Нема употребљивих кључева за овај контакт. Ако сте очистили било који од тих кључева, контакт мора да генерише нови.</string>
<string name="error_trustkeys_title">Грешка</string>
diff --git a/src/main/res/values-sv/strings.xml b/src/main/res/values-sv/strings.xml
index 92288264..d50717bf 100644
--- a/src/main/res/values-sv/strings.xml
+++ b/src/main/res/values-sv/strings.xml
@@ -396,9 +396,6 @@
<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="error_no_keys_to_trust_server_error">Det finns inga användbara nycklar tillgängliga för den här kontakten.\nHämtning av nya nyckar från servern har inte lyckats. Kanske är det något fel på din kontakts server.</string>
<string name="error_no_keys_to_trust">Det finns inga användbara nycklar tillgängliga för den här kontakten. Om du har rensat någon av dennes nycklar behöver de generera nya.</string>
<string name="error_trustkeys_title">Fel</string>
diff --git a/src/main/res/values-tr-rTR/strings.xml b/src/main/res/values-tr-rTR/strings.xml
index dc6f310a..5a4f8728 100644
--- a/src/main/res/values-tr-rTR/strings.xml
+++ b/src/main/res/values-tr-rTR/strings.xml
@@ -332,6 +332,7 @@
<string name="message_options">İleti seçenekleri</string>
<string name="copy_text">Metni kopyala</string>
<string name="select_text">Metni seç</string>
+ <string name="quote">Alıntı</string>
<string name="copy_original_url">Orijinal URL\'i kopyala</string>
<string name="send_again">Yeniden gönder</string>
<string name="file_url">Dosya URL</string>
@@ -396,9 +397,6 @@
<string name="wipe_omemo_pep">PEP’teki diğer aygıtları sil</string>
<string name="clear_other_devices">Aygıtları sil</string>
<string name="clear_other_devices_desc">OMEMO bildirimindeki diğer aygıtların hepsini silmek istediğinizden emin misiniz? Aygıtlarınız yeniden bağlandıklarında kendilerini yeniden bildirecekler ama bu süre zarfındaki iletileri alamayabilirler.</string>
- <string name="purge_key">Anahtarı sil</string>
- <string name="purge_key_desc_part1">Bu anahtarı silmek istediğinizden emin misiniz?</string>
- <string name="purge_key_desc_part2">Anahtar geri dönüşü olmayacak şekilde zedelenmiş kabul edilecek bir daha onunla bir oturum başlatamayacaksınız.</string>
<string name="error_no_keys_to_trust_server_error">Bu kişi için kullanılabilr anahtar mevcut değil\nSunucudan yeni anahtarlar alınamadı. Sunucunuzla ilgili bir sorun olabilir.</string>
<string name="error_no_keys_to_trust">Bu kişi için kullanılabilecek bir anahtar bulunmuyor. Eğer anahtarlarını sildiyseniz, yeni anahtar oluşturmaları gerekiyor.</string>
<string name="error_trustkeys_title">Hata</string>
@@ -679,4 +677,15 @@
<string name="blindly_trusted_omemo_keys">Körü körüne güvenilen OMEMO anahtarları</string>
<string name="not_trusted">Güvenilmeyen</string>
<string name="invalid_barcode">Geçersiz 2D barkod</string>
+ <string name="pref_clean_cache_summary">Önbellek dizinini temizle (Kamera uygulamasının kullandığı)</string>
+ <string name="pref_clean_cache">Önbelleği temizle</string>
+ <string name="pref_clean_private_storage">Özel depolama alanını temizle</string>
+ <string name="pref_clean_private_storage_summary">Dosyaların tutulduğu özel depolama alanını temizle (Sunucu üzerinden tekrar indirilebilir)</string>
+ <string name="i_followed_this_link_from_a_trusted_source">Bu bağlantıyı güvenilir bir kaynaktan takip ettim</string>
+ <string name="verifying_omemo_keys_trusted_source">Bir bağlantıyı tıkladıktan sonra %1$s in OMEMO anahtarını doğrulamış olacaksınız. Bu yalnızca bağlantının %2$s tarafından yayınladığından eminseniz güvenlidir.</string>
+ <string name="verify_omemo_keys">OMEMO anahtarlarını doğrula</string>
+ <string name="show_inactive_devices">Aktif olmayan cihazları göster</string>
+ <string name="hide_inactive_devices">Aktif olmayan cihazları gizle</string>
+ <string name="distrust_omemo_key">Güvensiz aygıt</string>
+ <string name="distrust_omemo_key_text">Bu cihazın doğrulamasını kaldırmak istediğinizden emin misiniz? \ Bu cihaz ve cihazdan gelen mesajlar güvenilmez olarak işaretlenecektir.</string>
</resources>
diff --git a/src/main/res/values-uk/strings.xml b/src/main/res/values-uk/strings.xml
index 421bf980..15a4130b 100644
--- a/src/main/res/values-uk/strings.xml
+++ b/src/main/res/values-uk/strings.xml
@@ -385,9 +385,6 @@
<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="error_no_keys_to_trust_server_error">Немає ключів, які би можна було використати для цього контакта.\nОтримання нових ключів із сервера не вдалося. Можливо, щось пішло не так з Вашим сервером контактів.</string>
<string name="error_no_keys_to_trust">Немає ключів, які би можна було використати для цього контакта. Якщо ви очистили які-небудь з їх ключів, їм потрібно згенерувати нові.</string>
<string name="error_trustkeys_title">Помилка</string>
diff --git a/src/main/res/values-vi/strings.xml b/src/main/res/values-vi/strings.xml
index dd2a1d02..e0d0be13 100644
--- a/src/main/res/values-vi/strings.xml
+++ b/src/main/res/values-vi/strings.xml
@@ -350,9 +350,6 @@
<string name="wipe_omemo_pep">Xoá các thiết bị khác khỏi PEP</string>
<string name="clear_other_devices">Xoá các thiết bị</string>
<string name="clear_other_devices_desc">Có chắc là bạn muốn xoá toàn bộ các thiết bị khác khỏi thông báo OMEMO? Lần sau khi kết nối, các thiết bị sẽ tự thông báo lại nhưng có khả năng chúng sẽ không nhận được tin nhắn đã gửi trong khoảng thời gian đó.</string>
- <string name="purge_key">Xoá khoá</string>
- <string name="purge_key_desc_part1">Có chắc là bạn muốn xoá khoá này không?</string>
- <string name="purge_key_desc_part2">Nó sẽ bị xem là hỏng mãi mãi và bạn sẽ không thể dựng một phiên khác với nó nữa.</string>
<string name="error_no_keys_to_trust_server_error">Không có khoá nào dùng được cho liên hệ này.\nViệc nhận khoá mới từ máy chủ cũng thất bại. Có lẽ là máy chủ dành cho các liên hệ đã gặp sự cố gì đó.</string>
<string name="error_no_keys_to_trust">Không còn khoá nào sẵn có cho liên hệ này. Nếu bạn đã xoá bất kỳ khoá nào, họ phải tạo khoá mới.</string>
<string name="error_trustkeys_title">Lỗi</string>
diff --git a/src/main/res/values-zh-rCN/strings.xml b/src/main/res/values-zh-rCN/strings.xml
index 06e37d42..0bdc5858 100644
--- a/src/main/res/values-zh-rCN/strings.xml
+++ b/src/main/res/values-zh-rCN/strings.xml
@@ -396,9 +396,6 @@
<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="error_no_keys_to_trust_server_error">此联系人没有可用的密钥。\n从服务器获取密钥失败。也许你的联系人所在服务器发生问题。</string>
<string name="error_no_keys_to_trust">此联系人没有可用的密钥。如果你曾经清除过他们的密钥,那么需要他们生成新的密钥。</string>
<string name="error_trustkeys_title">错误</string>
diff --git a/src/main/res/values-zh-rTW/strings.xml b/src/main/res/values-zh-rTW/strings.xml
index e8df9d29..b63ead81 100644
--- a/src/main/res/values-zh-rTW/strings.xml
+++ b/src/main/res/values-zh-rTW/strings.xml
@@ -391,9 +391,6 @@
<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="error_no_keys_to_trust_server_error">此連絡人沒有可用的金鑰。\n從伺服器獲取金鑰失敗。也許你的連絡人所在伺服器發生問題。</string>
<string name="error_no_keys_to_trust">此連絡人沒有可用的金鑰。如果你曾經清除過他們的金鑰,那麼需要他們生成新的金鑰。</string>
<string name="error_trustkeys_title">錯誤</string>
diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
index be3b262d..9ad0d63d 100644
--- a/src/main/res/values/strings.xml
+++ b/src/main/res/values/strings.xml
@@ -429,9 +429,6 @@
<string name="wipe_omemo_pep">Wipe other devices from PEP</string>
<string name="clear_other_devices">Clear devices</string>
<string name="clear_other_devices_desc">Are you sure you want to clear all other devices from the OMEMO announcement? The next time your devices connect, they will reannounce themselves, but they might not receive messages sent in the meantime.</string>
- <string name="purge_key">Purge key</string>
- <string name="purge_key_desc_part1">Are you sure you want to purge this key?</string>
- <string name="purge_key_desc_part2">It will irreversibly be considered compromised, and you can never build a session with it again.</string>
<string name="error_no_keys_to_trust_server_error">There are no usable keys available for this contact.\nFetching new keys from the server has been unsuccessful. Maybe there is something wrong with your contacts server.</string>
<string name="error_no_keys_to_trust">There are no usable keys available for this contact. If you have purged any of their keys, they need to generate new ones.</string>
<string name="error_trustkeys_title">Error</string>
@@ -725,4 +722,7 @@
<string name="verify_omemo_keys">Verify OMEMO keys</string>
<string name="show_inactive_devices">Show inactive devices</string>
<string name="hide_inactive_devices">Hide inactive devices</string>
+ <string name="distrust_omemo_key">Distrust device</string>
+ <string name="distrust_omemo_key_text">Are you sure you want to remove the verification for this device?\nThis device and messages coming from that device will be marked as untrusted.</string>
+ <string name="encrypting_message">Encrypting message</string>
</resources>
diff --git a/src/playstore/java/eu/siacs/conversations/services/PushManagementService.java b/src/playstore/java/eu/siacs/conversations/services/PushManagementService.java
index ae86f8c2..83d20aed 100644
--- a/src/playstore/java/eu/siacs/conversations/services/PushManagementService.java
+++ b/src/playstore/java/eu/siacs/conversations/services/PushManagementService.java
@@ -106,6 +106,10 @@ public class PushManagementService {
return connection != null && connection.getFeatures().push() && playServicesAvailable();
}
+ public boolean availableAndUseful(Account account) {
+ return account.getServerIdentity() == XmppConnection.Identity.EJABBERD && available(account);
+ }
+
private boolean playServicesAvailable() {
return GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(mXmppConnectionService) == ConnectionResult.SUCCESS;
}