1
0
Fork 1

Version 1.6.5

This commit is contained in:
Christian S 2015-08-26 20:02:36 +02:00
commit 391086f7dc
66 changed files with 460 additions and 256 deletions
.travis.ymlCHANGELOG.md
art
build.gradle
src/main
java/eu/siacs/conversations
res

View file

@ -3,8 +3,9 @@ android:
components:
- platform-tools
- tools
- build-tools-23.0.0
- build-tools-22.0.1
- build-tools-21.1.2
- build-tools-19.1.0
- android-22
- android-23
- extra-android-m2repository

View file

@ -1,5 +1,13 @@
###Changelog
####Version 1.6.5
* more OMEMO fixes
####Version 1.6.4
* setting to enable white chat bubbles
* limit OMEMO key publish attempts to work around broken PEP
* various bug fixes
####Version 1.6.3
* bug fixes

View file

@ -0,0 +1,165 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="36"
height="26"
id="svg2"
version="1.1"
inkscape:version="0.48.5 r10040"
sodipodi:docname="message_bubble_received.svg">
<defs
id="defs4">
<filter
x="-0.25"
y="-0.25"
width="1.5"
height="1.5"
inkscape:label="Drop Shadow"
id="filter3811"
color-interpolation-filters="sRGB">
<feFlood
flood-opacity="0.25"
flood-color="rgb(0,0,0)"
result="flood"
id="feFlood3813" />
<feComposite
in="flood"
in2="SourceGraphic"
operator="in"
result="composite1"
id="feComposite3815" />
<feGaussianBlur
stdDeviation="0.5"
result="blur"
id="feGaussianBlur3817" />
<feOffset
dx="0"
dy="1"
result="offset"
id="feOffset3819" />
<feComposite
in="SourceGraphic"
in2="offset"
operator="over"
result="composite2"
id="feComposite3821" />
</filter>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="16"
inkscape:cx="25.745257"
inkscape:cy="9.618802"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
inkscape:window-width="989"
inkscape:window-height="755"
inkscape:window-x="22"
inkscape:window-y="16"
inkscape:window-maximized="0"
showguides="true"
inkscape:guide-bbox="true"
guidecolor="#000000"
guideopacity="0.49803922">
<inkscape:grid
type="xygrid"
id="grid2985"
empspacing="4"
visible="true"
enabled="true"
snapvisiblegridlinesonly="true"
spacingx="1px"
spacingy="1px"
originx="0px"
originy="0px"
color="#0000ff"
opacity="0.03137255" />
<sodipodi:guide
orientation="1,0"
position="20,26"
id="guide3060" />
<sodipodi:guide
orientation="1,0"
position="24,26"
id="guide3062" />
<sodipodi:guide
orientation="0,1"
position="36,22"
id="guide3064" />
<sodipodi:guide
orientation="0,1"
position="36,6"
id="guide3066" />
<sodipodi:guide
orientation="1,0"
position="26,0"
id="guide3068" />
<sodipodi:guide
orientation="1,0"
position="18,0"
id="guide3070" />
<sodipodi:guide
orientation="0,1"
position="0,10"
id="guide3074" />
<sodipodi:guide
orientation="0,1"
position="0,8"
id="guide3076" />
</sodipodi:namedview>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer"
inkscape:groupmode="layer"
id="layer"
transform="translate(0,-2)">
<g
id="g3759"
style="fill:#fafafa;fill-opacity:1;stroke:none;fill-rule:nonzero;filter:url(#filter3811)">
<path
style="display:none"
d="m 8,6 c 2,2 4,6 4,10 L 16,6 z"
id="path3805"
inkscape:connector-curvature="0"
transform="translate(0,2)"
sodipodi:nodetypes="cccc" />
<path
inkscape:connector-curvature="0"
id="path2989"
d="M 4,4 16,16 16,4 z"
sodipodi:nodetypes="cccc" />
<rect
ry="2"
y="4"
x="12"
height="20"
width="20"
id="rect2987" />
</g>
</g>
</svg>

After

(image error) Size: 4.2 KiB

View file

@ -45,6 +45,7 @@ images = {
'md_switch_thumb_on_pressed.svg' => ['switch_thumb_on_pressed', 48],
'message_bubble_received.svg' => ['message_bubble_received.9', 0],
'message_bubble_received_warning.svg' => ['message_bubble_received_warning.9', 0],
'message_bubble_received_white.svg' => ['message_bubble_received_white.9', 0],
'message_bubble_sent.svg' => ['message_bubble_sent.9', 0],
}

View file

@ -6,7 +6,7 @@ buildscript {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.2.3'
classpath 'com.android.tools.build:gradle:1.3.1'
}
}
@ -27,29 +27,30 @@ repositories {
dependencies {
compile project(':libs:openpgp-api-lib')
compile project(':libs:MemorizingTrustManager')
compile 'com.android.support:support-v13:21.0.3'
compile 'org.bouncycastle:bcprov-jdk15on:1.51'
compile 'com.android.support:support-v13:23.0.0'
compile 'org.bouncycastle:bcprov-jdk15on:1.52'
compile 'org.jitsi:org.otr4j:0.22'
compile 'org.gnu.inet:libidn:1.15'
compile 'com.google.zxing:core:3.2.1'
compile 'com.google.zxing:android-integration:3.2.1'
compile 'de.measite.minidns:minidns:0.1.3'
compile 'de.measite.minidns:minidns:0.1.7'
compile 'de.timroes.android:EnhancedListView:0.3.4'
compile 'me.leolin:ShortcutBadger:1.1.3@aar'
compile 'com.kyleduo.switchbutton:library:1.2.8'
compile 'org.whispersystems:axolotl-android:1.3.4'
compile 'com.makeramen:roundedimageview:2.1.1'
compile 'com.makeramen:roundedimageview:2.2.0'
}
android {
compileSdkVersion 22
buildToolsVersion "22.0.1"
compileSdkVersion 23
buildToolsVersion "23.0.0"
defaultConfig {
minSdkVersion 14
targetSdkVersion 21
versionCode 87
versionName "1.6.3"
versionCode 90
versionName "1.6.5"
project.ext.set(archivesBaseName, archivesBaseName + "-" + versionName);
}
compileOptions {
@ -89,8 +90,6 @@ android {
if (output.zipAlign != null) {
output.zipAlign.outputFile = new File(output.outputFile.parent, rootProject.name + "-${variant.versionName}.apk")
}
output.packageApplication.outputFile = new File(output.outputFile.parent, output.packageApplication.outputFile.name
.replace(".apk", "-${variant.versionName}.apk"))
}
}
}

View file

@ -19,7 +19,7 @@ public final class Config {
public static final int PING_TIMEOUT = 10;
public static final int SOCKET_TIMEOUT = 15;
public static final int CONNECT_TIMEOUT = 90;
public static final int CARBON_GRACE_PERIOD = 60;
public static final int CARBON_GRACE_PERIOD = 90;
public static final int MINI_GRACE_PERIOD = 750;
public static final int AVATAR_SIZE = 384;

View file

@ -50,6 +50,7 @@ public class AxolotlService {
public static final String LOGPREFIX = "AxolotlService";
public static final int NUM_KEYS_TO_PUBLISH = 100;
public static final int publishTriesThreshold = 3;
private final Account account;
private final XmppConnectionService mXmppConnectionService;
@ -59,6 +60,8 @@ public class AxolotlService {
private final Map<String, XmppAxolotlMessage> messageCache;
private final FetchStatusMap fetchStatusMap;
private final SerialSingleThreadExecutor executor;
private int numPublishTriesOnEmptyPep = 0;
private boolean pepBroken = false;
private static class AxolotlAddressMap<T> {
protected Map<String, Map<Integer, T>> map;
@ -228,8 +231,7 @@ public class AxolotlService {
axolotlStore.regenerate();
sessions.clear();
fetchStatusMap.clear();
publishBundlesIfNeeded();
publishOwnDeviceIdIfNeeded();
publishBundlesIfNeeded(true);
}
public int getOwnDeviceId() {
@ -255,8 +257,15 @@ public class AxolotlService {
public void registerDevices(final Jid jid, @NonNull final Set<Integer> deviceIds) {
if (jid.toBareJid().equals(account.getJid().toBareJid())) {
if (!deviceIds.isEmpty()) {
Log.d(Config.LOGTAG, getLogprefix(account) + "Received non-empty own device list. Resetting publish attemps and pepBroken status.");
pepBroken = false;
numPublishTriesOnEmptyPep = 0;
}
if (deviceIds.contains(getOwnDeviceId())) {
deviceIds.remove(getOwnDeviceId());
} else {
publishOwnDeviceId(deviceIds);
}
for (Integer deviceId : deviceIds) {
AxolotlAddress ownDeviceAddress = new AxolotlAddress(jid.toBareJid().toString(), deviceId);
@ -282,10 +291,13 @@ public class AxolotlService {
XmppAxolotlSession.Trust.UNTRUSTED);
this.deviceIds.put(jid, deviceIds);
mXmppConnectionService.keyStatusUpdated();
publishOwnDeviceIdIfNeeded();
}
public void wipeOtherPepDevices() {
if (pepBroken) {
Log.d(Config.LOGTAG, getLogprefix(account) + "wipeOtherPepDevices called, but PEP is broken. Ignoring... ");
return;
}
Set<Integer> deviceIds = new HashSet<>();
deviceIds.add(getOwnDeviceId());
IqPacket publish = mXmppConnectionService.getIqGenerator().publishDeviceIds(deviceIds);
@ -303,6 +315,10 @@ public class AxolotlService {
}
public void publishOwnDeviceIdIfNeeded() {
if (pepBroken) {
Log.d(Config.LOGTAG, getLogprefix(account) + "publishOwnDeviceIdIfNeeded called, but PEP is broken. Ignoring... ");
return;
}
IqPacket packet = mXmppConnectionService.getIqGenerator().retrieveDeviceIds(account.getJid().toBareJid());
mXmppConnectionService.sendIqPacket(account, packet, new OnIqPacketReceived() {
@Override
@ -310,118 +326,148 @@ public class AxolotlService {
if (packet.getType() == IqPacket.TYPE.RESULT) {
Element item = mXmppConnectionService.getIqParser().getItem(packet);
Set<Integer> deviceIds = mXmppConnectionService.getIqParser().deviceIds(item);
if (deviceIds == null) {
deviceIds = new HashSet<Integer>();
}
if (!deviceIds.contains(getOwnDeviceId())) {
deviceIds.add(getOwnDeviceId());
IqPacket publish = mXmppConnectionService.getIqGenerator().publishDeviceIds(deviceIds);
Log.d(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Own device " + getOwnDeviceId() + " not in PEP devicelist. Publishing: " + publish);
mXmppConnectionService.sendIqPacket(account, publish, new OnIqPacketReceived() {
@Override
public void onIqPacketReceived(Account account, IqPacket packet) {
// TODO: implement this!
}
});
publishOwnDeviceId(deviceIds);
}
} else {
Log.d(Config.LOGTAG, getLogprefix(account) + "Error received while publishing device ID:" + packet.findChild("error"));
Log.d(Config.LOGTAG, getLogprefix(account) + "Error received while retrieving Device Ids" + packet.findChild("error"));
}
}
});
}
public void publishBundlesIfNeeded() {
public void publishOwnDeviceId(Set<Integer> deviceIds) {
if (!deviceIds.contains(getOwnDeviceId())) {
Log.d(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Own device " + getOwnDeviceId() + " not in PEP devicelist.");
if (deviceIds.isEmpty()) {
if (numPublishTriesOnEmptyPep >= publishTriesThreshold) {
Log.w(Config.LOGTAG, getLogprefix(account) + "Own device publish attempt threshold exceeded, aborting...");
pepBroken = true;
return;
} else {
numPublishTriesOnEmptyPep++;
Log.w(Config.LOGTAG, getLogprefix(account) + "Own device list empty, attempting to publish (try " + numPublishTriesOnEmptyPep + ")");
}
} else {
numPublishTriesOnEmptyPep = 0;
}
deviceIds.add(getOwnDeviceId());
IqPacket publish = mXmppConnectionService.getIqGenerator().publishDeviceIds(deviceIds);
mXmppConnectionService.sendIqPacket(account, publish, new OnIqPacketReceived() {
@Override
public void onIqPacketReceived(Account account, IqPacket packet) {
if (packet.getType() != IqPacket.TYPE.RESULT) {
Log.d(Config.LOGTAG, getLogprefix(account) + "Error received while publishing own device id" + packet.findChild("error"));
}
}
});
}
}
public void publishBundlesIfNeeded(final boolean announceAfter) {
if (pepBroken) {
Log.d(Config.LOGTAG, getLogprefix(account) + "publishBundlesIfNeeded called, but PEP is broken. Ignoring... ");
return;
}
IqPacket packet = mXmppConnectionService.getIqGenerator().retrieveBundlesForDevice(account.getJid().toBareJid(), getOwnDeviceId());
mXmppConnectionService.sendIqPacket(account, packet, new OnIqPacketReceived() {
@Override
public void onIqPacketReceived(Account account, IqPacket packet) {
if (packet.getType() == IqPacket.TYPE.RESULT) {
PreKeyBundle bundle = mXmppConnectionService.getIqParser().bundle(packet);
Map<Integer, ECPublicKey> keys = mXmppConnectionService.getIqParser().preKeyPublics(packet);
boolean flush = false;
if (bundle == null) {
Log.w(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Received invalid bundle:" + packet);
bundle = new PreKeyBundle(-1, -1, -1, null, -1, null, null, null);
flush = true;
PreKeyBundle bundle = mXmppConnectionService.getIqParser().bundle(packet);
Map<Integer, ECPublicKey> keys = mXmppConnectionService.getIqParser().preKeyPublics(packet);
boolean flush = false;
if (bundle == null) {
Log.w(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Received invalid bundle:" + packet);
bundle = new PreKeyBundle(-1, -1, -1, null, -1, null, null, null);
flush = true;
}
if (keys == null) {
Log.w(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Received invalid prekeys:" + packet);
}
try {
boolean changed = false;
// Validate IdentityKey
IdentityKeyPair identityKeyPair = axolotlStore.getIdentityKeyPair();
if (flush || !identityKeyPair.getPublicKey().equals(bundle.getIdentityKey())) {
Log.i(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Adding own IdentityKey " + identityKeyPair.getPublicKey() + " to PEP.");
changed = true;
}
if (keys == null) {
Log.w(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Received invalid prekeys:" + packet);
}
try {
boolean changed = false;
// Validate IdentityKey
IdentityKeyPair identityKeyPair = axolotlStore.getIdentityKeyPair();
if (flush || !identityKeyPair.getPublicKey().equals(bundle.getIdentityKey())) {
Log.i(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Adding own IdentityKey " + identityKeyPair.getPublicKey() + " to PEP.");
changed = true;
}
// Validate signedPreKeyRecord + ID
SignedPreKeyRecord signedPreKeyRecord;
int numSignedPreKeys = axolotlStore.loadSignedPreKeys().size();
try {
signedPreKeyRecord = axolotlStore.loadSignedPreKey(bundle.getSignedPreKeyId());
if (flush
|| !bundle.getSignedPreKey().equals(signedPreKeyRecord.getKeyPair().getPublicKey())
|| !Arrays.equals(bundle.getSignedPreKeySignature(), signedPreKeyRecord.getSignature())) {
Log.i(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Adding new signedPreKey with ID " + (numSignedPreKeys + 1) + " to PEP.");
signedPreKeyRecord = KeyHelper.generateSignedPreKey(identityKeyPair, numSignedPreKeys + 1);
axolotlStore.storeSignedPreKey(signedPreKeyRecord.getId(), signedPreKeyRecord);
changed = true;
}
} catch (InvalidKeyIdException e) {
// Validate signedPreKeyRecord + ID
SignedPreKeyRecord signedPreKeyRecord;
int numSignedPreKeys = axolotlStore.loadSignedPreKeys().size();
try {
signedPreKeyRecord = axolotlStore.loadSignedPreKey(bundle.getSignedPreKeyId());
if (flush
|| !bundle.getSignedPreKey().equals(signedPreKeyRecord.getKeyPair().getPublicKey())
|| !Arrays.equals(bundle.getSignedPreKeySignature(), signedPreKeyRecord.getSignature())) {
Log.i(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Adding new signedPreKey with ID " + (numSignedPreKeys + 1) + " to PEP.");
signedPreKeyRecord = KeyHelper.generateSignedPreKey(identityKeyPair, numSignedPreKeys + 1);
axolotlStore.storeSignedPreKey(signedPreKeyRecord.getId(), signedPreKeyRecord);
changed = true;
}
// Validate PreKeys
Set<PreKeyRecord> preKeyRecords = new HashSet<>();
if (keys != null) {
for (Integer id : keys.keySet()) {
try {
PreKeyRecord preKeyRecord = axolotlStore.loadPreKey(id);
if (preKeyRecord.getKeyPair().getPublicKey().equals(keys.get(id))) {
preKeyRecords.add(preKeyRecord);
}
} catch (InvalidKeyIdException ignored) {
}
}
}
int newKeys = NUM_KEYS_TO_PUBLISH - preKeyRecords.size();
if (newKeys > 0) {
List<PreKeyRecord> newRecords = KeyHelper.generatePreKeys(
axolotlStore.getCurrentPreKeyId() + 1, newKeys);
preKeyRecords.addAll(newRecords);
for (PreKeyRecord record : newRecords) {
axolotlStore.storePreKey(record.getId(), record);
}
changed = true;
Log.i(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Adding " + newKeys + " new preKeys to PEP.");
}
if (changed) {
IqPacket publish = mXmppConnectionService.getIqGenerator().publishBundles(
signedPreKeyRecord, axolotlStore.getIdentityKeyPair().getPublicKey(),
preKeyRecords, getOwnDeviceId());
Log.d(Config.LOGTAG, AxolotlService.getLogprefix(account) + ": Bundle " + getOwnDeviceId() + " in PEP not current. Publishing: " + publish);
mXmppConnectionService.sendIqPacket(account, publish, new OnIqPacketReceived() {
@Override
public void onIqPacketReceived(Account account, IqPacket packet) {
// TODO: implement this!
Log.d(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Published bundle, got: " + packet);
}
});
}
} catch (InvalidKeyException e) {
Log.e(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Failed to publish bundle " + getOwnDeviceId() + ", reason: " + e.getMessage());
return;
} catch (InvalidKeyIdException e) {
Log.i(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Adding new signedPreKey with ID " + (numSignedPreKeys + 1) + " to PEP.");
signedPreKeyRecord = KeyHelper.generateSignedPreKey(identityKeyPair, numSignedPreKeys + 1);
axolotlStore.storeSignedPreKey(signedPreKeyRecord.getId(), signedPreKeyRecord);
changed = true;
}
} else {
Log.d(Config.LOGTAG, getLogprefix(account) + "Error received while publishing Bundle:" + packet.findChild("error"));
// Validate PreKeys
Set<PreKeyRecord> preKeyRecords = new HashSet<>();
if (keys != null) {
for (Integer id : keys.keySet()) {
try {
PreKeyRecord preKeyRecord = axolotlStore.loadPreKey(id);
if (preKeyRecord.getKeyPair().getPublicKey().equals(keys.get(id))) {
preKeyRecords.add(preKeyRecord);
}
} catch (InvalidKeyIdException ignored) {
}
}
}
int newKeys = NUM_KEYS_TO_PUBLISH - preKeyRecords.size();
if (newKeys > 0) {
List<PreKeyRecord> newRecords = KeyHelper.generatePreKeys(
axolotlStore.getCurrentPreKeyId() + 1, newKeys);
preKeyRecords.addAll(newRecords);
for (PreKeyRecord record : newRecords) {
axolotlStore.storePreKey(record.getId(), record);
}
changed = true;
Log.i(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Adding " + newKeys + " new preKeys to PEP.");
}
if (changed) {
IqPacket publish = mXmppConnectionService.getIqGenerator().publishBundles(
signedPreKeyRecord, axolotlStore.getIdentityKeyPair().getPublicKey(),
preKeyRecords, getOwnDeviceId());
Log.d(Config.LOGTAG, AxolotlService.getLogprefix(account) + ": Bundle " + getOwnDeviceId() + " in PEP not current. Publishing: " + publish);
mXmppConnectionService.sendIqPacket(account, publish, new OnIqPacketReceived() {
@Override
public void onIqPacketReceived(Account account, IqPacket packet) {
if (packet.getType() == IqPacket.TYPE.RESULT) {
Log.d(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Successfully published bundle. ");
if (announceAfter) {
Log.d(Config.LOGTAG, getLogprefix(account) + "Announcing device " + getOwnDeviceId());
publishOwnDeviceIdIfNeeded();
}
} else {
Log.d(Config.LOGTAG, getLogprefix(account) + "Error received while publishing bundle: " + packet.findChild("error"));
}
}
});
} else {
Log.d(Config.LOGTAG, getLogprefix(account) + "Bundle " + getOwnDeviceId() + " in PEP was current");
if (announceAfter) {
Log.d(Config.LOGTAG, getLogprefix(account) + "Announcing device " + getOwnDeviceId());
publishOwnDeviceIdIfNeeded();
}
}
} catch (InvalidKeyException e) {
Log.e(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Failed to publish bundle " + getOwnDeviceId() + ", reason: " + e.getMessage());
return;
}
}
});
@ -699,7 +745,7 @@ public class AxolotlService {
plaintextMessage = message.decrypt(session, getOwnDeviceId());
Integer preKeyId = session.getPreKeyId();
if (preKeyId != null) {
publishBundlesIfNeeded();
publishBundlesIfNeeded(false);
session.resetPreKeyId();
}
} catch (CryptoFailedException e) {

View file

@ -202,14 +202,25 @@ public class Conversation extends AbstractEntity implements Blockable {
}
}
public Message findSentMessageWithUuid(String uuid) {
public Message findSentMessageWithUuidOrRemoteId(String id) {
synchronized (this.messages) {
for (Message message : this.messages) {
if (uuid.equals(message.getUuid())
|| (message.getStatus() >= Message.STATUS_SEND && uuid
.equals(message.getRemoteMsgId()))) {
if (id.equals(message.getUuid())
|| (message.getStatus() >= Message.STATUS_SEND
&& id.equals(message.getRemoteMsgId()))) {
return message;
}
}
}
}
return null;
}
public Message findSentMessageWithUuid(String id) {
synchronized (this.messages) {
for (Message message : this.messages) {
if (id.equals(message.getUuid())) {
return message;
}
}
}
return null;

View file

@ -138,7 +138,7 @@ public class IqParser extends AbstractParser implements OnIqPacketReceived {
}
try {
publicKey = Curve.decodePoint(Base64.decode(signedPreKeyPublic.getContent(),Base64.DEFAULT), 0);
} catch (InvalidKeyException e) {
} catch (InvalidKeyException | IllegalArgumentException e) {
Log.e(Config.LOGTAG, AxolotlService.LOGPREFIX+" : "+"Invalid signedPreKeyPublic in PEP: " + e.getMessage());
}
return publicKey;

View file

@ -311,10 +311,9 @@ public class MessageParser extends AbstractParser implements
status = Message.STATUS_SEND_RECEIVED;
if (mXmppConnectionService.markMessage(conversation, remoteMsgId, status)) {
return;
} else {
Message message = conversation.findSentMessageWithBody(body);
} else if (remoteMsgId == null) {
Message message = conversation.findSentMessageWithBody(packet.getBody());
if (message != null) {
message.setRemoteMsgId(remoteMsgId);
mXmppConnectionService.markMessage(message, status);
return;
}

View file

@ -1,6 +1,5 @@
package eu.siacs.conversations.persistance;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
@ -8,7 +7,6 @@ import android.graphics.Matrix;
import android.graphics.RectF;
import android.net.Uri;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Base64;
import android.util.Base64OutputStream;
import android.util.Log;
@ -137,6 +135,9 @@ public class FileBackend {
options.inJustDecodeBounds = true;
try {
BitmapFactory.decodeStream(mXmppConnectionService.getContentResolver().openInputStream(uri), null, options);
if (options == null || options.outMimeType == null) {
return false;
}
return (options.outWidth <= Config.IMAGE_SIZE && options.outHeight <= Config.IMAGE_SIZE && options.outMimeType.contains(Config.IMAGE_FORMAT.name().toLowerCase()));
} catch (FileNotFoundException e) {
return false;

View file

@ -84,9 +84,9 @@ import eu.siacs.conversations.xml.Element;
import eu.siacs.conversations.xmpp.OnBindListener;
import eu.siacs.conversations.xmpp.OnContactStatusChanged;
import eu.siacs.conversations.xmpp.OnIqPacketReceived;
import eu.siacs.conversations.xmpp.OnKeyStatusUpdated;
import eu.siacs.conversations.xmpp.OnMessageAcknowledged;
import eu.siacs.conversations.xmpp.OnMessagePacketReceived;
import eu.siacs.conversations.xmpp.OnKeyStatusUpdated;
import eu.siacs.conversations.xmpp.OnPresencePacketReceived;
import eu.siacs.conversations.xmpp.OnStatusChanged;
import eu.siacs.conversations.xmpp.OnUpdateBlocklist;
@ -165,8 +165,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
mMessageArchiveService.executePendingQueries(account);
mJingleConnectionManager.cancelInTransmission();
syncDirtyContacts(account);
account.getAxolotlService().publishOwnDeviceIdIfNeeded();
account.getAxolotlService().publishBundlesIfNeeded();
account.getAxolotlService().publishBundlesIfNeeded(true);
}
};
private final OnMessageAcknowledged mOnMessageAcknowledgedListener = new OnMessageAcknowledged() {
@ -2216,7 +2215,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
}
for (Conversation conversation : getConversations()) {
if (conversation.getJid().toBareJid().equals(recipient) && conversation.getAccount() == account) {
final Message message = conversation.findSentMessageWithUuid(uuid);
final Message message = conversation.findSentMessageWithUuidOrRemoteId(uuid);
if (message != null) {
markMessage(message, status);
}
@ -2226,8 +2225,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
return null;
}
public boolean markMessage(Conversation conversation, String uuid,
int status) {
public boolean markMessage(Conversation conversation, String uuid, int status) {
if (uuid == null) {
return false;
} else {

View file

@ -985,6 +985,9 @@ public class ConversationActivity extends XmppActivity
mPendingGeoUri = null;
setSelectedConversation(conversationList.get(0));
this.mConversationFragment.reInit(getSelectedConversation());
} else {
this.mConversationFragment.messageListAdapter.updatePreferences();
this.mConversationFragment.messagesView.invalidateViews();
}
if(!forbidProcessingPendings) {
@ -1163,7 +1166,7 @@ public class ConversationActivity extends XmppActivity
}
prepareFileToast = Toast.makeText(getApplicationContext(),getText(R.string.preparing_file), Toast.LENGTH_LONG);
prepareFileToast.show();
xmppConnectionService.attachFileToConversation(conversation,uri, new UiCallback<Message>() {
xmppConnectionService.attachFileToConversation(conversation, uri, new UiCallback<Message>() {
@Override
public void success(Message message) {
hidePrepareFileToast();
@ -1193,7 +1196,7 @@ public class ConversationActivity extends XmppActivity
@Override
public void userInputRequried(PendingIntent pi,
Message object) {
Message object) {
hidePrepareFileToast();
}
@ -1275,6 +1278,10 @@ public class ConversationActivity extends XmppActivity
return getPreferences().getBoolean("indicate_received", false);
}
public boolean useWhiteBackground() {
return getPreferences().getBoolean("use_white_background",false);
}
protected boolean trustKeysIfNeeded(int requestCode) {
return trustKeysIfNeeded(requestCode, ATTACHMENT_CHOICE_INVALID);
}

View file

@ -327,7 +327,7 @@ public class ConversationFragment extends Fragment implements EditMessage.Keyboa
switch (conversation.getNextEncryption()) {
case Message.ENCRYPTION_NONE:
mEditMessage
.setHint(getString(R.string.send_plain_text_message));
.setHint(getString(R.string.send_unencrypted_message));
break;
case Message.ENCRYPTION_OTR:
mEditMessage.setHint(getString(R.string.send_otr_message));
@ -662,6 +662,7 @@ public class ConversationFragment extends Fragment implements EditMessage.Keyboa
this.mEditMessage.setText("");
this.mEditMessage.append(this.conversation.getNextMessage());
this.mEditMessage.setKeyboardListener(this);
messageListAdapter.updatePreferences();
this.messagesView.setAdapter(messageListAdapter);
updateMessages();
this.messagesLoaded = true;

View file

@ -3,7 +3,6 @@ package eu.siacs.conversations.ui.adapter;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.graphics.Color;
import android.graphics.Typeface;
import android.net.Uri;
import android.text.Spannable;
@ -60,11 +59,14 @@ public class MessageAdapter extends ArrayAdapter<Message> {
return true;
}
};
private boolean mIndicateReceived = false;
private boolean mUseWhiteBackground = false;
public MessageAdapter(ConversationActivity activity, List<Message> messages) {
super(activity, 0, messages);
this.activity = activity;
metrics = getContext().getResources().getDisplayMetrics();
updatePreferences();
}
public void setOnContactPictureClicked(OnContactPictureClicked listener) {
@ -96,15 +98,15 @@ public class MessageAdapter extends ArrayAdapter<Message> {
return this.getItemViewType(getItem(position));
}
private int getMessageTextColor(int type, boolean primary) {
if (type == SENT) {
return activity.getResources().getColor(primary ? R.color.black87 : R.color.black54);
} else {
private int getMessageTextColor(boolean onDark, boolean primary) {
if (onDark) {
return activity.getResources().getColor(primary ? R.color.white : R.color.white70);
} else {
return activity.getResources().getColor(primary ? R.color.black87 : R.color.black54);
}
}
private void displayStatus(ViewHolder viewHolder, Message message, int type) {
private void displayStatus(ViewHolder viewHolder, Message message, int type, boolean darkBackground) {
String filesize = null;
String info = null;
boolean error = false;
@ -140,12 +142,12 @@ public class MessageAdapter extends ArrayAdapter<Message> {
info = getContext().getString(R.string.offering);
break;
case Message.STATUS_SEND_RECEIVED:
if (activity.indicateReceived()) {
if (mIndicateReceived) {
viewHolder.indicatorReceived.setVisibility(View.VISIBLE);
}
break;
case Message.STATUS_SEND_DISPLAYED:
if (activity.indicateReceived()) {
if (mIndicateReceived) {
viewHolder.indicatorReceived.setVisibility(View.VISIBLE);
}
break;
@ -162,11 +164,12 @@ public class MessageAdapter extends ArrayAdapter<Message> {
if (error && type == SENT) {
viewHolder.time.setTextColor(activity.getWarningTextColor());
} else {
viewHolder.time.setTextColor(this.getMessageTextColor(type,false));
viewHolder.time.setTextColor(this.getMessageTextColor(darkBackground,false));
}
if (message.getEncryption() == Message.ENCRYPTION_NONE) {
viewHolder.indicator.setVisibility(View.GONE);
} else {
viewHolder.indicator.setImageResource(darkBackground ? R.drawable.ic_secure_indicator_white : R.drawable.ic_secure_indicator);
viewHolder.indicator.setVisibility(View.VISIBLE);
if (message.getEncryption() == Message.ENCRYPTION_AXOLOTL) {
XmppAxolotlSession.Trust trust = message.getConversation()
@ -178,18 +181,18 @@ public class MessageAdapter extends ArrayAdapter<Message> {
viewHolder.indicator.setAlpha(1.0f);
} else {
viewHolder.indicator.clearColorFilter();
if (type == SENT) {
viewHolder.indicator.setAlpha(0.57f);
} else {
if (darkBackground) {
viewHolder.indicator.setAlpha(0.7f);
} else {
viewHolder.indicator.setAlpha(0.57f);
}
}
} else {
viewHolder.indicator.clearColorFilter();
if (type == SENT) {
viewHolder.indicator.setAlpha(0.57f);
} else {
if (darkBackground) {
viewHolder.indicator.setAlpha(0.7f);
} else {
viewHolder.indicator.setAlpha(0.57f);
}
}
}
@ -223,19 +226,19 @@ public class MessageAdapter extends ArrayAdapter<Message> {
}
}
private void displayInfoMessage(ViewHolder viewHolder, String text, int type) {
private void displayInfoMessage(ViewHolder viewHolder, String text, boolean darkBackground) {
if (viewHolder.download_button != null) {
viewHolder.download_button.setVisibility(View.GONE);
}
viewHolder.image.setVisibility(View.GONE);
viewHolder.messageBody.setVisibility(View.VISIBLE);
viewHolder.messageBody.setText(text);
viewHolder.messageBody.setTextColor(getMessageTextColor(type,false));
viewHolder.messageBody.setTextColor(getMessageTextColor(darkBackground, false));
viewHolder.messageBody.setTypeface(null, Typeface.ITALIC);
viewHolder.messageBody.setTextIsSelectable(false);
}
private void displayDecryptionFailed(ViewHolder viewHolder, int type) {
private void displayDecryptionFailed(ViewHolder viewHolder, boolean darkBackground) {
if (viewHolder.download_button != null) {
viewHolder.download_button.setVisibility(View.GONE);
}
@ -243,7 +246,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
viewHolder.messageBody.setVisibility(View.VISIBLE);
viewHolder.messageBody.setText(getContext().getString(
R.string.decryption_failed));
viewHolder.messageBody.setTextColor(getMessageTextColor(type,false));
viewHolder.messageBody.setTextColor(getMessageTextColor(darkBackground, false));
viewHolder.messageBody.setTypeface(null, Typeface.NORMAL);
viewHolder.messageBody.setTextIsSelectable(false);
}
@ -261,7 +264,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
viewHolder.messageBody.setText(span);
}
private void displayTextMessage(final ViewHolder viewHolder, final Message message, int type) {
private void displayTextMessage(final ViewHolder viewHolder, final Message message, boolean darkBackground) {
if (viewHolder.download_button != null) {
viewHolder.download_button.setVisibility(View.GONE);
}
@ -303,7 +306,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
}
final Spannable span = new SpannableString(privateMarker + " "
+ formattedBody);
span.setSpan(new ForegroundColorSpan(getMessageTextColor(type,false)), 0, privateMarker
span.setSpan(new ForegroundColorSpan(getMessageTextColor(darkBackground,false)), 0, privateMarker
.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
span.setSpan(new StyleSpan(Typeface.BOLD), 0,
privateMarker.length(),
@ -318,7 +321,8 @@ public class MessageAdapter extends ArrayAdapter<Message> {
} else {
viewHolder.messageBody.setText("");
}
viewHolder.messageBody.setTextColor(this.getMessageTextColor(type,true));
viewHolder.messageBody.setTextColor(this.getMessageTextColor(darkBackground, true));
viewHolder.messageBody.setLinkTextColor(this.getMessageTextColor(darkBackground,true));
viewHolder.messageBody.setTypeface(null, Typeface.NORMAL);
viewHolder.messageBody.setTextIsSelectable(true);
}
@ -388,7 +392,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
scalledH = (int) (params.height / ((double) params.width / target));
}
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(scalledW, scalledH);
layoutParams.setMargins(0, (int)(metrics.density * 4), 0, (int)(metrics.density * 4));
layoutParams.setMargins(0, (int) (metrics.density * 4), 0, (int) (metrics.density * 4));
viewHolder.image.setLayoutParams(layoutParams);
activity.loadBitmap(message, viewHolder.image);
viewHolder.image.setOnClickListener(new OnClickListener() {
@ -404,6 +408,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
@Override
public View getView(int position, View view, ViewGroup parent) {
final Message message = getItem(position);
final boolean isInValidSession = message.isValidInSession();
final Conversation conversation = message.getConversation();
final Account account = conversation.getAccount();
final int type = getItemViewType(position);
@ -468,6 +473,8 @@ public class MessageAdapter extends ArrayAdapter<Message> {
}
}
boolean darkBackground = (type == RECEIVED && (!isInValidSession || !mUseWhiteBackground));
if (type == STATUS) {
if (conversation.getMode() == Conversation.MODE_SINGLE) {
viewHolder.contact_picture.setImageBitmap(activity
@ -497,7 +504,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
public void onClick(View v) {
if (MessageAdapter.this.mOnContactPictureClickedListener != null) {
MessageAdapter.this.mOnContactPictureClickedListener
.onContactPictureClicked(message);
.onContactPictureClicked(message);
}
}
@ -509,7 +516,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
public boolean onLongClick(View v) {
if (MessageAdapter.this.mOnContactPictureLongClickedListener != null) {
MessageAdapter.this.mOnContactPictureLongClickedListener
.onContactPictureLongClicked(message);
.onContactPictureLongClicked(message);
return true;
} else {
return false;
@ -524,7 +531,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
} else if (transferable.getStatus() == Transferable.STATUS_OFFER_CHECK_FILESIZE) {
displayDownloadableMessage(viewHolder, message, activity.getString(R.string.check_x_filesize, UIHelper.getFileDescriptionString(activity, message)));
} else {
displayInfoMessage(viewHolder, UIHelper.getMessagePreview(activity, message).first,type);
displayInfoMessage(viewHolder, UIHelper.getMessagePreview(activity, message).first,darkBackground);
}
} else if (message.getType() == Message.TYPE_IMAGE && message.getEncryption() != Message.ENCRYPTION_PGP && message.getEncryption() != Message.ENCRYPTION_DECRYPTION_FAILED) {
displayImageMessage(viewHolder, message);
@ -536,9 +543,9 @@ public class MessageAdapter extends ArrayAdapter<Message> {
}
} else if (message.getEncryption() == Message.ENCRYPTION_PGP) {
if (activity.hasPgp()) {
displayInfoMessage(viewHolder,activity.getString(R.string.encrypted_message),type);
displayInfoMessage(viewHolder,activity.getString(R.string.encrypted_message),darkBackground);
} else {
displayInfoMessage(viewHolder,activity.getString(R.string.install_openkeychain),type);
displayInfoMessage(viewHolder,activity.getString(R.string.install_openkeychain),darkBackground);
if (viewHolder != null) {
viewHolder.message_box
.setOnClickListener(new OnClickListener() {
@ -551,7 +558,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
}
}
} else if (message.getEncryption() == Message.ENCRYPTION_DECRYPTION_FAILED) {
displayDecryptionFailed(viewHolder,type);
displayDecryptionFailed(viewHolder,darkBackground);
} else {
if (GeoHelper.isGeoUri(message.getBody())) {
displayLocationMessage(viewHolder,message);
@ -560,19 +567,23 @@ public class MessageAdapter extends ArrayAdapter<Message> {
} else if (message.treatAsDownloadable() == Message.Decision.MUST) {
displayDownloadableMessage(viewHolder, message, activity.getString(R.string.check_x_filesize, UIHelper.getFileDescriptionString(activity, message)));
} else {
displayTextMessage(viewHolder, message, type);
displayTextMessage(viewHolder, message, darkBackground);
}
}
if (type == RECEIVED) {
if(message.isValidInSession()) {
viewHolder.message_box.setBackgroundResource(R.drawable.message_bubble_received);
if(isInValidSession) {
if (mUseWhiteBackground) {
viewHolder.message_box.setBackgroundResource(R.drawable.message_bubble_received_white);
} else {
viewHolder.message_box.setBackgroundResource(R.drawable.message_bubble_received);
}
} else {
viewHolder.message_box.setBackgroundResource(R.drawable.message_bubble_received_warning);
}
}
displayStatus(viewHolder, message, type);
displayStatus(viewHolder, message, type, darkBackground);
return view;
}
@ -616,12 +627,17 @@ public class MessageAdapter extends ArrayAdapter<Message> {
Toast.makeText(activity,R.string.no_application_found_to_display_location,Toast.LENGTH_SHORT).show();
}
public void updatePreferences() {
this.mIndicateReceived = activity.indicateReceived();
this.mUseWhiteBackground = activity.useWhiteBackground();
}
public interface OnContactPictureClicked {
public void onContactPictureClicked(Message message);
void onContactPictureClicked(Message message);
}
public interface OnContactPictureLongClicked {
public void onContactPictureLongClicked(Message message);
void onContactPictureLongClicked(Message message);
}
private static class ViewHolder {

View file

@ -104,15 +104,17 @@ public class FileUtils {
};
try {
cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,
null);
cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,null);
if (cursor != null && cursor.moveToFirst()) {
final int column_index = cursor.getColumnIndexOrThrow(column);
return cursor.getString(column_index);
}
} catch(Exception e) {
return null;
} finally {
if (cursor != null)
if (cursor != null) {
cursor.close();
}
}
return null;
}

View file

@ -318,7 +318,6 @@ public class XmppConnection implements Runnable {
Log.d(Config.LOGTAG, account.getJid().toBareJid().toString()
+ ": stream management(" + smVersion + ") enabled");
}
this.lastSessionStarted = SystemClock.elapsedRealtime();
this.stanzasReceived = 0;
final RequestPacket r = new RequestPacket(smVersion);
tagWriter.writeStanzaAsync(r);
@ -473,29 +472,33 @@ public class XmppConnection implements Runnable {
this.jingleListener.onJinglePacketReceived(account,(JinglePacket) packet);
}
} else {
OnIqPacketReceived callback = null;
synchronized (this.packetCallbacks) {
if (packetCallbacks.containsKey(packet.getId())) {
final Pair<IqPacket, OnIqPacketReceived> packetCallbackDuple = packetCallbacks.get(packet.getId());
// Packets to the server should have responses from the server
if (packetCallbackDuple.first.toServer(account)) {
if (packet.fromServer(account)) {
packetCallbackDuple.second.onIqPacketReceived(account, packet);
callback = packetCallbackDuple.second;
packetCallbacks.remove(packet.getId());
} else {
Log.e(Config.LOGTAG, account.getJid().toBareJid().toString() + ": ignoring spoofed iq packet");
}
} else {
if (packet.getFrom().equals(packetCallbackDuple.first.getTo())) {
packetCallbackDuple.second.onIqPacketReceived(account, packet);
callback = packetCallbackDuple.second;
packetCallbacks.remove(packet.getId());
} else {
Log.e(Config.LOGTAG, account.getJid().toBareJid().toString() + ": ignoring spoofed iq packet");
}
}
} else if (packet.getType() == IqPacket.TYPE.GET || packet.getType() == IqPacket.TYPE.SET) {
this.unregisteredIqListener.onIqPacketReceived(account, packet);
callback = this.unregisteredIqListener;
}
}
if (callback != null) {
callback.onIqPacketReceived(account,packet);
}
}
}
@ -784,6 +787,7 @@ public class XmppConnection implements Runnable {
sendServiceDiscoveryInfo(account.getJid().toBareJid());
sendServiceDiscoveryItems(account.getServer());
Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": online with resource " + account.getResource());
this.lastSessionStarted = SystemClock.elapsedRealtime();
changeStatus(Account.State.ONLINE);
if (bindListener != null) {
bindListener.onBind(account);
@ -954,7 +958,7 @@ public class XmppConnection implements Runnable {
AbstractAcknowledgeableStanza stanza = (AbstractAcknowledgeableStanza) packet;
++stanzasSent;
this.mStanzaQueue.put(stanzasSent, stanza);
if (stanza instanceof MessagePacket && stanza.getId() != null && this.streamId != null) {
if (stanza instanceof MessagePacket && stanza.getId() != null && getFeatures().sm()) {
if (Config.EXTENDED_SM_LOGGING) {
Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": requesting ack for message stanza #" + stanzasSent);
}
@ -1100,12 +1104,7 @@ public class XmppConnection implements Runnable {
}
public long getLastSessionEstablished() {
final long diff;
if (this.lastSessionStarted == 0) {
diff = SystemClock.elapsedRealtime() - this.lastConnect;
} else {
diff = SystemClock.elapsedRealtime() - this.lastSessionStarted;
}
final long diff = SystemClock.elapsedRealtime() - this.lastSessionStarted;
return System.currentTimeMillis() - diff;
}

View file

@ -1,31 +1,5 @@
package eu.siacs.conversations.xmpp.jingle;
import android.util.Log;
import android.util.Pair;
import org.bouncycastle.crypto.engines.AESEngine;
import org.bouncycastle.crypto.modes.AEADBlockCipher;
import org.bouncycastle.crypto.modes.GCMBlockCipher;
import org.bouncycastle.crypto.params.AEADParameters;
import org.bouncycastle.crypto.params.KeyParameter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import javax.crypto.Cipher;
import javax.crypto.CipherInputStream;
import javax.crypto.CipherOutputStream;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import eu.siacs.conversations.Config;
import eu.siacs.conversations.entities.DownloadableFile;
public abstract class JingleTransport {

Binary file not shown.

Before

(image error) Size: 765 B

After

(image error) Size: 765 B

Binary file not shown.

Before

(image error) Size: 757 B

After

(image error) Size: 757 B

Binary file not shown.

After

(image error) Size: 779 B

Binary file not shown.

Before

(image error) Size: 687 B

After

(image error) Size: 687 B

Binary file not shown.

Before

(image error) Size: 594 B

After

(image error) Size: 594 B

Binary file not shown.

Before

(image error) Size: 598 B

After

(image error) Size: 598 B

Binary file not shown.

After

(image error) Size: 610 B

Binary file not shown.

Before

(image error) Size: 558 B

After

(image error) Size: 558 B

Binary file not shown.

Before

(image error) Size: 929 B

After

(image error) Size: 929 B

Binary file not shown.

Before

(image error) Size: 921 B

After

(image error) Size: 921 B

Binary file not shown.

After

(image error) Size: 935 B

Binary file not shown.

Before

(image error) Size: 857 B

After

(image error) Size: 857 B

Binary file not shown.

Before

(image error) Size: 1.3 KiB

After

(image error) Size: 1.3 KiB

Binary file not shown.

Before

(image error) Size: 1.3 KiB

After

(image error) Size: 1.3 KiB

Binary file not shown.

After

(image error) Size: 1.3 KiB

Binary file not shown.

Before

(image error) Size: 1.2 KiB

After

(image error) Size: 1.2 KiB

Binary file not shown.

Before

(image error) Size: 1.7 KiB

After

(image error) Size: 1.7 KiB

Binary file not shown.

Before

(image error) Size: 1.6 KiB

After

(image error) Size: 1.6 KiB

Binary file not shown.

After

(image error) Size: 1.7 KiB

Binary file not shown.

Before

(image error) Size: 1.5 KiB

After

(image error) Size: 1.5 KiB

View file

@ -4,7 +4,7 @@
<group android:checkableBehavior="single" >
<item
android:id="@+id/encryption_choice_none"
android:title="@string/encryption_choice_none"/>
android:title="@string/encryption_choice_unencrypted"/>
<item
android:id="@+id/encryption_choice_axolotl"
android:title="@string/encryption_choice_omemo"/>

View file

@ -76,7 +76,6 @@
<string name="delete_messages">حذف الرسائل</string>
<string name="also_end_conversation">انهاء هذه المحادثة بعد الكلمات</string>
<string name="choose_presence">اختيار ظهورك لجهات الإتصال</string>
<string name="send_plain_text_message">ارسال رسالة غير مشفّرة</string>
<string name="send_otr_message">OTRارساله رساله مشفره عبر</string>
<string name="send_pgp_message">OpenPGPارساله رساله مشفره عبر</string>
<string name="your_nick_has_been_changed">تم تغيير لقبك بنجاح</string>
@ -128,7 +127,6 @@
<string name="account_status_regis_conflict">اسم المستخدم مستخدم من قبل</string>
<string name="account_status_regis_success">تم تسجيل حسابك بنجاح</string>
<string name="account_status_regis_not_sup">تسجيل الحسابات غير متاح على هذا السرفر</string>
<string name="encryption_choice_none">رساله عادية</string>
<string name="encryption_choice_otr">OTRرسالة مشفرة عبر</string>
<string name="encryption_choice_pgp">OpenPGPرسالة مشفرة عبر</string>
<string name="mgmt_account_edit">تعديل الحساب</string>

View file

@ -76,7 +76,6 @@
<string name="delete_messages">Изтриване на съобщенията</string>
<string name="also_end_conversation">Този разговор да приключи след това</string>
<string name="choose_presence">Изберете присъствие за контакта</string>
<string name="send_plain_text_message">Изпр. на обикновено текстово съобщение</string>
<string name="send_otr_message">Изпр. на съобщение, шифр. чрез OTP</string>
<string name="send_omemo_message">Изпр. на съобщение, шифр. чрез OMEMO</string>
<string name="send_pgp_message">Изпр. на съобщение, шифр. чрез OpenPGP</string>
@ -150,7 +149,6 @@
<string name="account_status_regis_not_sup">Сървърът не поддържа регистриране</string>
<string name="account_status_security_error">Грешка в сигурността</string>
<string name="account_status_incompatible_server">Несъвместим сървър</string>
<string name="encryption_choice_none">Обикновен текст</string>
<string name="encryption_choice_otr">OTR</string>
<string name="encryption_choice_pgp">OpenPGP</string>
<string name="encryption_choice_omemo">OMEMO</string>

View file

@ -76,7 +76,6 @@
<string name="delete_messages">Esborrar missatges</string>
<string name="also_end_conversation">Finalitzar aquesta conversa més tard</string>
<string name="choose_presence">Selecciona recurs del contacte</string>
<string name="send_plain_text_message">Enviar missatge de text</string>
<string name="send_otr_message">Enviar missatge xifrat amb OTR</string>
<string name="send_pgp_message">Enviar missatge xifrat amb OpenPGP</string>
<string name="your_nick_has_been_changed">El teu sobrenom s\'ha modificat</string>
@ -147,7 +146,6 @@
<string name="account_status_regis_not_sup">El servidor no admet el registre</string>
<string name="account_status_security_error">Error de seguretat</string>
<string name="account_status_incompatible_server">Servidor incompatible</string>
<string name="encryption_choice_none">Text pla</string>
<string name="encryption_choice_otr">OTR</string>
<string name="encryption_choice_pgp">OpenPGP</string>
<string name="mgmt_account_edit">Edita compte</string>

View file

@ -76,7 +76,6 @@
<string name="delete_messages">Smazat zprávy</string>
<string name="also_end_conversation">Poté ukončit i tuto konverzaci</string>
<string name="choose_presence">Vybrat aktualizaci stavu pro kontakt</string>
<string name="send_plain_text_message">Poslat textovou zprávu</string>
<string name="send_otr_message">Poslat OTR šifrovanou zprávu</string>
<string name="send_omemo_message">Poslat OMEMO šifrovanou zprávu</string>
<string name="send_pgp_message">Poslat OpenPGP šifrovanou zprávu</string>
@ -150,7 +149,6 @@
<string name="account_status_regis_not_sup">Server nepodporuje registrace</string>
<string name="account_status_security_error">Bezpečnostní chyba</string>
<string name="account_status_incompatible_server">Nekompatibilní server</string>
<string name="encryption_choice_none">Čistý text</string>
<string name="encryption_choice_otr">OTR</string>
<string name="encryption_choice_pgp">OpenPGP</string>
<string name="encryption_choice_omemo">OMEMO</string>

View file

@ -76,7 +76,7 @@
<string name="delete_messages">Nachrichten löschen</string>
<string name="also_end_conversation">Diese Unterhaltung danach beenden</string>
<string name="choose_presence">Ressource des Kontakts auswählen</string>
<string name="send_plain_text_message">Normal schreiben…</string>
<string name="send_unencrypted_message">Sende unverschlüsselte Nachricht</string>
<string name="send_otr_message">OTR-verschlüsselt schreiben…</string>
<string name="send_omemo_message">OMEMO-verschlüsselt schreiben…</string>
<string name="send_pgp_message">OpenPGP-verschlüsselt schreiben…</string>
@ -150,7 +150,7 @@
<string name="account_status_regis_not_sup">Der Server unterstützt keine Registrierung</string>
<string name="account_status_security_error">Sicherheitsfehler</string>
<string name="account_status_incompatible_server">Inkompatibler Server</string>
<string name="encryption_choice_none">Klartext</string>
<string name="encryption_choice_unencrypted">Unverschlüsselt</string>
<string name="encryption_choice_otr">OTR</string>
<string name="encryption_choice_pgp">OpenPGP</string>
<string name="encryption_choice_omemo">OMEMO</string>
@ -189,6 +189,7 @@
<string name="server_info_roster_version">XEP-0237: Roster Versioning</string>
<string name="server_info_stream_management">XEP-0198: Stream Management</string>
<string name="server_info_pep">XEP-0163: PEP (Avatare)</string>
<string name="server_info_http_upload">XEP-xxxx: HTTP File Upload</string>
<string name="server_info_available">ja</string>
<string name="server_info_unavailable">nein</string>
<string name="missing_public_keys">Öffentlicher Schlüssel fehlt</string>
@ -368,6 +369,7 @@
<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_trustkeys_title">Fehler</string>
<string name="fetching_history_from_server">Lade Chatverlauf…</string>
<string name="no_more_history_on_server">Keine weiteren Nachrichten vorhanden</string>
<string name="updating">Aktualisiere…</string>

View file

@ -76,7 +76,6 @@
<string name="delete_messages">Διαγραφή μηνυμάτων</string>
<string name="also_end_conversation">Τερματισμός αυτής της συζήτησης αμέσως μετά</string>
<string name="choose_presence">Επιλέξτε παρουσία για επικοινωνία</string>
<string name="send_plain_text_message">Αποστολή απλού μηνύματος κειμένου</string>
<string name="send_otr_message">Αποστολή κρυπτογραφημένου μηνύματος OTR</string>
<string name="send_pgp_message">Αποστολή κρυπτογραφημένου μηνύματος OpenPGP</string>
<string name="your_nick_has_been_changed">Το ψευδώνυμό σας έχει αλλάξει</string>
@ -147,7 +146,6 @@
<string name="account_status_regis_not_sup">Ο διακομιστής δεν υποστηρίζει εγγραφή</string>
<string name="account_status_security_error">Σφάλμα ασφάλειας</string>
<string name="account_status_incompatible_server">Μη συμβατός διακομιστής</string>
<string name="encryption_choice_none">Απλό κείμενο</string>
<string name="encryption_choice_otr">OTR</string>
<string name="encryption_choice_pgp">OpenPGP</string>
<string name="mgmt_account_edit">Επεξεργασία λογαριασμού</string>

View file

@ -76,7 +76,6 @@
<string name="delete_messages">Borrar mensajes</string>
<string name="also_end_conversation">Además, terminar esta conversación</string>
<string name="choose_presence">Selecciona recurso del contacto</string>
<string name="send_plain_text_message">Enviar mensaje de texto</string>
<string name="send_otr_message">Enviar mensaje cifrado con OTR</string>
<string name="send_omemo_message">Enviar mensaje cifrado con OMEMO </string>
<string name="send_pgp_message">Enviar mensaje cifrado con OpenPGP</string>
@ -150,7 +149,6 @@
<string name="account_status_regis_not_sup">El servidor no soporta registros</string>
<string name="account_status_security_error">Error de seguridad</string>
<string name="account_status_incompatible_server">Servidor incompatible</string>
<string name="encryption_choice_none">Texto plano</string>
<string name="encryption_choice_otr">OTR</string>
<string name="encryption_choice_pgp">OpenPGP</string>
<string name="encryption_choice_omemo">OMEMO</string>

View file

@ -76,7 +76,6 @@
<string name="delete_messages">Mezuak ezabatu</string>
<string name="also_end_conversation">Elkarrizketa hau jarraian amaitu</string>
<string name="choose_presence">Hautatu agerpena kontaktuarentzat</string>
<string name="send_plain_text_message">Testu mezua bidali</string>
<string name="send_otr_message">OTRz enkriptatutako mezua bidali</string>
<string name="send_omemo_message">OMEMOz enkriptatutako mezua bidali</string>
<string name="send_pgp_message">OpenPGPz enkriptatutako mezua bidali</string>
@ -150,7 +149,6 @@
<string name="account_status_regis_not_sup">Zerbitzariak ez du erregistratzea onartzen</string>
<string name="account_status_security_error">Segurtasun akatsa</string>
<string name="account_status_incompatible_server">Zerbitzari ez bateragarria</string>
<string name="encryption_choice_none">Testu laua</string>
<string name="encryption_choice_otr">OTR</string>
<string name="encryption_choice_pgp">OpenPGP</string>
<string name="encryption_choice_omemo">OMEMO</string>

View file

@ -76,7 +76,6 @@
<string name="delete_messages">Supprimer les messages</string>
<string name="also_end_conversation">Terminer plus tard cette conversation</string>
<string name="choose_presence">Choisir le status de présence</string>
<string name="send_plain_text_message">Envoyer un message</string>
<string name="send_otr_message">Envoyer un message sécurisé par OTR</string>
<string name="send_pgp_message">Envoyer un message sécurisé par OpenPGP</string>
<string name="your_nick_has_been_changed">Votre identifiant a été changé</string>
@ -147,7 +146,6 @@
<string name="account_status_regis_not_sup">Le serveur ne permet pas l\'enregistrement</string>
<string name="account_status_security_error">Erreur de sécurité</string>
<string name="account_status_incompatible_server">Serveur incompatible</string>
<string name="encryption_choice_none">Texte clair</string>
<string name="encryption_choice_otr">OTR</string>
<string name="encryption_choice_pgp">OpenPGP</string>
<string name="mgmt_account_edit">Modifier le compte</string>

View file

@ -44,7 +44,6 @@
<string name="delete_messages">Borrar mensaxes</string>
<string name="also_end_conversation">Terminar esta conversa máis tarde</string>
<string name="choose_presence">Selecciona recurso del contacto</string>
<string name="send_plain_text_message">Enviar mensaxe de texto</string>
<string name="send_otr_message">Enviar mensaxe cifrado con OTR</string>
<string name="send_pgp_message">Enviar mensaxe cifrado con OpenPGP</string>
<string name="your_nick_has_been_changed">Modificouse o teu apodo</string>
@ -107,7 +106,6 @@
<string name="account_status_regis_conflict">O identificador xa está en uso</string>
<string name="account_status_regis_success">Rexistro completado</string>
<string name="account_status_regis_not_sup">O servidor non soporta rexistros</string>
<string name="encryption_choice_none">Texto plano</string>
<string name="encryption_choice_otr">OTR</string>
<string name="encryption_choice_pgp">OpenPGP</string>
<string name="mgmt_account_edit">Editar conta</string>

View file

@ -76,7 +76,6 @@
<string name="delete_messages">Hapus pesan</string>
<string name="also_end_conversation">Akhiri percakapan setelahnya</string>
<string name="choose_presence">Pilih kehadiran untuk kontak</string>
<string name="send_plain_text_message">Kirim pesan teks biasa</string>
<string name="send_otr_message">Kirim pesan terenskripsi OTR</string>
<string name="send_pgp_message">Kirim pesan terenskripsi OpenPGP</string>
<string name="your_nick_has_been_changed">Nick kamu telah dirubah</string>
@ -147,7 +146,6 @@
<string name="account_status_regis_not_sup">Server tidak mendukung pendaftaran akun.</string>
<string name="account_status_security_error">Kesalahan keamanan</string>
<string name="account_status_incompatible_server">Server tidak cocok</string>
<string name="encryption_choice_none">Teks biasa</string>
<string name="encryption_choice_otr">OTR</string>
<string name="encryption_choice_pgp">OpenPGP</string>
<string name="mgmt_account_edit">Ubah akun</string>
@ -202,6 +200,8 @@
<string name="reception_failed">Penerimaan gagal</string>
<string name="your_fingerprint">Fingerprint Anda</string>
<string name="otr_fingerprint">OTR fingerprint</string>
<string name="other_devices">Perangkat lainnya</string>
<string name="done">Selesai</string>
<string name="verify">Verifikasi</string>
<string name="decrypt">Deskripsi</string>
<string name="conferences">Conferences</string>
@ -287,10 +287,12 @@
<string name="conference_kicked">Anda telah ditendang dari conference ini</string>
<string name="using_account">menggunakan akun %s</string>
<string name="not_connected_try_again">Anda tidak terhubung. Coba lagi nanti</string>
<string name="check_x_filesize">Cek %s ukuran</string>
<string name="message_options">Opsi pesan</string>
<string name="copy_text">Salin teks</string>
<string name="copy_original_url">Salin URL asli</string>
<string name="send_again">Kirim lagi</string>
<string name="file_url">URL Berkas</string>
<string name="message_text">Pesan teks</string>
<string name="url_copied_to_clipboard">URL disalin ke clipboard</string>
<string name="message_copied_to_clipboard">Pesan disalin ke clipboard</string>
@ -345,6 +347,7 @@
<string name="reset">Ulang</string>
<string name="account_image_description">Avatar akun</string>
<string name="copy_otr_clipboard_description">Salin OTR fingerprint ke clipboard</string>
<string name="clear_other_devices">Bersihkan perangkat</string>
<string name="fetching_history_from_server">Mengambil data dari server</string>
<string name="no_more_history_on_server">Tidak ada data lagi di server</string>
<string name="updating">Merubah...</string>
@ -442,4 +445,13 @@
<string name="none">Tak satupun</string>
<string name="recently_used">Maling sering digunakan</string>
<string name="choose_quick_action">Pilih aksi cepat</string>
<string name="search_for_contacts_or_groups">Cari grup atau daftar kontak</string>
<string name="send_private_message">Kirim pesan pribadi</string>
<string name="user_has_left_conference">%s meninggalkan conference!</string>
<string name="username">Username</string>
<string name="username_hint">Username</string>
<string name="invalid_username">Username ini tidak valid</string>
<string name="download_failed_server_not_found">Unduhan gagal: Server tidak ditemukan</string>
<string name="download_failed_file_not_found">Unduh gagal: Berkas tidak ditemukan</string>
<string name="download_failed_could_not_connect">Unduhan gagal: Tidak dapat terhubung ke host</string>
</resources>

View file

@ -76,7 +76,6 @@
<string name="delete_messages">Elimina messaggi</string>
<string name="also_end_conversation">Termina questa conversazione in seguito</string>
<string name="choose_presence">Choose presence to contact</string>
<string name="send_plain_text_message">Messaggio non cifrato</string>
<string name="send_otr_message">Messaggio OTR</string>
<string name="send_pgp_message">Messaggio OpenPGP</string>
<string name="your_nick_has_been_changed">Il tuo nome utente è stato cambiato</string>
@ -147,7 +146,6 @@
<string name="account_status_regis_not_sup">Il Server non supporta la registrazione</string>
<string name="account_status_security_error">Errore di sicurezza</string>
<string name="account_status_incompatible_server">Server non compatibile</string>
<string name="encryption_choice_none">Testo semplice</string>
<string name="encryption_choice_otr">OTR</string>
<string name="encryption_choice_pgp">OpenPGP</string>
<string name="mgmt_account_edit">Modifica utente</string>

View file

@ -62,7 +62,6 @@
<string name="delete_messages">מחק הודעות</string>
<string name="also_end_conversation">סיים את דיון זה לאחר מכן</string>
<string name="choose_presence">בחר נוכחות לאיש קשר</string>
<string name="send_plain_text_message">שלח הודעת טקסט גלוי</string>
<string name="send_otr_message">שלח הודעה מוצפנת OTR</string>
<string name="send_pgp_message">שלח הודעה מוצפנת OpenPGP</string>
<string name="your_nick_has_been_changed">שם כינוי שלך השתנה</string>
@ -130,7 +129,6 @@
<string name="account_status_regis_conflict">שם משתמש כבר מצוי בשימוש</string>
<string name="account_status_regis_success">הרשמה הושלמה</string>
<string name="account_status_regis_not_sup">שרת לא תומך הרשמה</string>
<string name="encryption_choice_none">טקסט גלוי</string>
<string name="encryption_choice_otr">OTR</string>
<string name="encryption_choice_pgp">OpenPGP</string>
<string name="mgmt_account_edit">ערוך חשבון</string>

View file

@ -76,7 +76,6 @@
<string name="delete_messages">メッセージを削除</string>
<string name="also_end_conversation">その後、この会話を終了</string>
<string name="choose_presence">連絡する参加を選択</string>
<string name="send_plain_text_message">プレーンテキストを送信</string>
<string name="send_otr_message">OTR 暗号化メッセージを送信</string>
<string name="send_omemo_message">OMEMO 暗号化メッセージを送信</string>
<string name="send_pgp_message">OpenPGP 暗号化メッセージを送信</string>
@ -150,7 +149,6 @@
<string name="account_status_regis_not_sup">サーバーが登録をサポートしていません</string>
<string name="account_status_security_error">セキュリティ エラー</string>
<string name="account_status_incompatible_server">互換性のないサーバー</string>
<string name="encryption_choice_none">プレーンテキスト</string>
<string name="encryption_choice_otr">OTR</string>
<string name="encryption_choice_pgp">OpenPGP</string>
<string name="encryption_choice_omemo">OMEMO</string>

View file

@ -76,7 +76,6 @@
<string name="delete_messages">메세지 삭제 </string>
<string name="also_end_conversation">나중에 이 대화 끝내기 </string>
<string name="choose_presence">연락할 프레즌스 선택 </string>
<string name="send_plain_text_message">평문 메세지 전송 </string>
<string name="send_otr_message">OTR 암호화된 메세지 전송 </string>
<string name="send_pgp_message">OpenPGP 암호화된 메세지 전송 </string>
<string name="your_nick_has_been_changed">닉네임이 변경되었습니다 </string>
@ -147,7 +146,6 @@
<string name="account_status_regis_not_sup">서버가 등록을 지원하지 않습니다</string>
<string name="account_status_security_error">보안 오류 </string>
<string name="account_status_incompatible_server">호환되지 않는 서버 </string>
<string name="encryption_choice_none">평문 </string>
<string name="encryption_choice_otr">OTR</string>
<string name="encryption_choice_pgp">OpenPGP </string>
<string name="mgmt_account_edit">계정 편집 </string>

View file

@ -76,7 +76,6 @@
<string name="delete_messages">Berichten verwijderen</string>
<string name="also_end_conversation">Beëindig dit gesprek na afloop</string>
<string name="choose_presence">Kies aanwezigheid om te tonen aan contact</string>
<string name="send_plain_text_message">Verstuur onversleuteld bericht</string>
<string name="send_otr_message">Verstuur OTR-versleuteld bericht</string>
<string name="send_omemo_message">Verstuur OMEMO-versleuteld bericht</string>
<string name="send_pgp_message">Verstuur OpenPGP-versleuteld bericht</string>
@ -150,7 +149,6 @@
<string name="account_status_regis_not_sup">Server ondersteunt geen registratie</string>
<string name="account_status_security_error">Fout bij beveiliging</string>
<string name="account_status_incompatible_server">Incompatibele server</string>
<string name="encryption_choice_none">Onversleuteld</string>
<string name="encryption_choice_otr">OTR</string>
<string name="encryption_choice_pgp">OpenPGP</string>
<string name="encryption_choice_omemo">OMEMO</string>

View file

@ -76,7 +76,6 @@
<string name="delete_messages">Usuń wiadomości</string>
<string name="also_end_conversation">Zakończ konwersację po usunięciu historii</string>
<string name="choose_presence">Wybierz widoczność dla kontaktu</string>
<string name="send_plain_text_message">Wyślij wiadomość jawną</string>
<string name="send_otr_message">Wyślij zaszyfrowaną wiadomość (OTR)</string>
<string name="send_pgp_message">Wyślij zaszyfrowaną wiadomość (OpenPGP)</string>
<string name="your_nick_has_been_changed">Twoja nazwa została zmieniona</string>
@ -147,7 +146,6 @@
<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_incompatible_server">Serwer niekompatybilny</string>
<string name="encryption_choice_none">Tekst jawny</string>
<string name="encryption_choice_otr">OTR</string>
<string name="encryption_choice_pgp">OpenPGP</string>
<string name="mgmt_account_edit">Edytuj konto</string>

View file

@ -74,7 +74,6 @@
<string name="delete_messages">Remover mensagens</string>
<string name="also_end_conversation">Finalizar essa conversa ao final</string>
<string name="choose_presence">Escolha a presença do contato</string>
<string name="send_plain_text_message">Enviar mensagem de texto puro</string>
<string name="send_otr_message">Enviar mensagem criptografada com OTR</string>
<string name="send_pgp_message">Enviar mensagem criptografada com OpenPGP</string>
<string name="your_nick_has_been_changed">Seu apelido foi alterado</string>
@ -137,7 +136,6 @@
<string name="account_status_regis_not_sup">O servidor não aceita o registro</string>
<string name="account_status_security_error">Erro de segurança</string>
<string name="account_status_incompatible_server">Servidor incompatível</string>
<string name="encryption_choice_none">Texto puro</string>
<string name="encryption_choice_otr">OTR</string>
<string name="encryption_choice_pgp">OpenPGP</string>
<string name="mgmt_account_edit">Editar conta</string>

View file

@ -75,7 +75,6 @@
<string name="delete_messages">Sterge mesajele</string>
<string name="also_end_conversation">Termina conversatia aceasta dupa</string>
<string name="choose_presence">Alege prezenta pentru a contacta</string>
<string name="send_plain_text_message">Trimite text necriptat</string>
<string name="send_otr_message">Trimite mesaj criptat cu OTR</string>
<string name="send_pgp_message">Trimite mesaj criptat cu OpenPGP</string>
<string name="your_nick_has_been_changed">Numele tau a fost schimbat</string>

View file

@ -76,7 +76,6 @@
<string name="delete_messages">Удалить сообщения</string>
<string name="also_end_conversation">Завершить беседу</string>
<string name="choose_presence">Укажите статус для контакта</string>
<string name="send_plain_text_message">Отправить незашифрованное текстовое сообщение</string>
<string name="send_otr_message">Отправить OTR защифрованное сообщение</string>
<string name="send_pgp_message">Отправить OpenPGP защифрованное сообщение</string>
<string name="your_nick_has_been_changed">Ваш псевдоним был изменен</string>
@ -147,7 +146,6 @@
<string name="account_status_regis_not_sup">Сервер не поддерживает регистрацию</string>
<string name="account_status_security_error">Ошибка безопасности</string>
<string name="account_status_incompatible_server">Несовместимый сервер</string>
<string name="encryption_choice_none">Без шифрования</string>
<string name="encryption_choice_otr">OTR</string>
<string name="encryption_choice_pgp">OpenPGP</string>
<string name="mgmt_account_edit">Редактировать аккаунт</string>

View file

@ -76,7 +76,6 @@
<string name="delete_messages">Vymazať správy</string>
<string name="also_end_conversation">Následne ukončiť aj túto konverzáciu</string>
<string name="choose_presence">Vybrať aktualizáciu stavu pre kontakt</string>
<string name="send_plain_text_message">Poslať textovú správu</string>
<string name="send_otr_message">Poslať OTR šifrovanú správu</string>
<string name="send_pgp_message">Poslať OpenPGP šifrovanú správu</string>
<string name="your_nick_has_been_changed">Prezývka sa zmenila</string>
@ -147,7 +146,6 @@
<string name="account_status_regis_not_sup">Server nepodporuje registráciu</string>
<string name="account_status_security_error">Bezpečnostná chyba</string>
<string name="account_status_incompatible_server">Nekompatibilný server</string>
<string name="encryption_choice_none">Čistý text</string>
<string name="encryption_choice_otr">OTR</string>
<string name="encryption_choice_pgp">OpenPGP</string>
<string name="mgmt_account_edit">Upraviť účet</string>

View file

@ -76,7 +76,6 @@
<string name="delete_messages">Обриши поруке</string>
<string name="also_end_conversation">Окончај ову преписку након тога</string>
<string name="choose_presence">Избор присутности за контакта</string>
<string name="send_plain_text_message">Пошаљи обичну текстуалну поруку</string>
<string name="send_otr_message">Пошаљи ОТР шифровану поруку</string>
<string name="send_omemo_message">Пошаљи ОМЕМО шифровану поруку</string>
<string name="send_pgp_message">Пошаљи ОпенПГП шифровану поруку</string>
@ -150,7 +149,6 @@
<string name="account_status_regis_not_sup">Сервер не подржава регистрацију</string>
<string name="account_status_security_error">Безбедносна грешка</string>
<string name="account_status_incompatible_server">Некомпатибилан сервер</string>
<string name="encryption_choice_none">Обичан текст</string>
<string name="encryption_choice_otr">ОТР</string>
<string name="encryption_choice_pgp">ОпенПГП</string>
<string name="encryption_choice_omemo">ОМЕМО</string>

View file

@ -76,7 +76,6 @@
<string name="delete_messages">Ta bort meddelanden</string>
<string name="also_end_conversation">Avsluta sedan denna konversation</string>
<string name="choose_presence">Välj tillgänglighet till kontakt</string>
<string name="send_plain_text_message">Skicka meddelande i klartext</string>
<string name="send_otr_message">Skicka OTR-krypterat meddelande</string>
<string name="send_omemo_message">Skicka OMEMO-krypterat meddelande</string>
<string name="send_pgp_message">Skicka OpenPGP-krypterat meddelande</string>
@ -150,7 +149,6 @@
<string name="account_status_regis_not_sup">Servern stödjer inte registrering</string>
<string name="account_status_security_error">Säkerhetsfel</string>
<string name="account_status_incompatible_server">Inkompatibel server</string>
<string name="encryption_choice_none">Klartext</string>
<string name="encryption_choice_otr">OTR</string>
<string name="encryption_choice_pgp">OpenPGP</string>
<string name="encryption_choice_omemo">OMEMO</string>

View file

@ -76,7 +76,6 @@
<string name="delete_messages">删除消息</string>
<string name="also_end_conversation">之后结束该会话</string>
<string name="choose_presence">添加在线用户至联系人</string>
<string name="send_plain_text_message">发送纯文本信息</string>
<string name="send_otr_message">发送 OTR 加密信息</string>
<string name="send_pgp_message">发送 OpenPGP 加密信息</string>
<string name="your_nick_has_been_changed">昵称修改成功</string>
@ -147,7 +146,6 @@
<string name="account_status_regis_not_sup">服务器不支持注册</string>
<string name="account_status_security_error">安全错误</string>
<string name="account_status_incompatible_server">服务器不兼容</string>
<string name="encryption_choice_none">纯文本内容</string>
<string name="encryption_choice_otr">OTR</string>
<string name="encryption_choice_pgp">OpenPGP</string>
<string name="mgmt_account_edit">编辑账号</string>

View file

@ -60,7 +60,6 @@
<string name="delete_messages">刪除訊息</string>
<string name="also_end_conversation">之後結束這對話</string>
<string name="choose_presence">選擇狀態訊息</string>
<string name="send_plain_text_message">發送純文字訊息</string>
<string name="send_otr_message">發送 OTR 加密訊息</string>
<string name="send_pgp_message">發送 OpenPGP 加密訊息</string>
<string name="your_nick_has_been_changed">用戶名稱修改成功</string>
@ -129,7 +128,6 @@
<string name="account_status_regis_conflict">該用戶名稱已被使用</string>
<string name="account_status_regis_success">註冊完成</string>
<string name="account_status_regis_not_sup">伺服器不支持註冊</string>
<string name="encryption_choice_none">純文字內容</string>
<string name="encryption_choice_otr">OTR</string>
<string name="encryption_choice_pgp">OpenPGP</string>
<string name="mgmt_account_edit">編輯帳戶</string>

View file

@ -78,7 +78,7 @@
<string name="delete_messages">Delete messages</string>
<string name="also_end_conversation">End this conversations afterwards</string>
<string name="choose_presence">Choose presence to contact</string>
<string name="send_plain_text_message">Send plain text message</string>
<string name="send_unencrypted_message">Send unencrypted message</string>
<string name="send_otr_message">Send OTR encrypted message</string>
<string name="send_omemo_message">Send OMEMO encrypted message</string>
<string name="send_pgp_message">Send OpenPGP encrypted message</string>
@ -152,7 +152,7 @@
<string name="account_status_regis_not_sup">Server does not support registration</string>
<string name="account_status_security_error">Security error</string>
<string name="account_status_incompatible_server">Incompatible server</string>
<string name="encryption_choice_none">Plain text</string>
<string name="encryption_choice_unencrypted">Unencrypted</string>
<string name="encryption_choice_otr">OTR</string>
<string name="encryption_choice_pgp">OpenPGP</string>
<string name="encryption_choice_omemo">OMEMO</string>
@ -512,4 +512,6 @@
<string name="download_failed_file_not_found">Download failed: File not found</string>
<string name="download_failed_could_not_connect">Download failed: Could not connect to host</string>
<string name="elv_undo">undo</string>
<string name="pref_use_white_background">Use white background</string>
<string name="pref_use_white_background_summary">Show received messages as black text on a white background</string>
</resources>

View file

@ -95,6 +95,11 @@
android:key="use_subject"
android:summary="@string/pref_conference_name_summary"
android:title="@string/pref_conference_name"/>
<CheckBoxPreference
android:defaultValue="false"
android:key="use_white_background"
android:title="@string/pref_use_white_background"
android:summary="@string/pref_use_white_background_summary"/>
<CheckBoxPreference
android:defaultValue="false"
android:key="use_larger_font"