Version 1.6.5
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
165
art/message_bubble_received_white.svg
Normal 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 |
|
@ -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],
|
||||
}
|
||||
|
||||
|
|
21
build.gradle
|
@ -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"))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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 {
|
||||
|
|
Before ![]() (image error) Size: 765 B After ![]() (image error) Size: 765 B ![]() ![]() |
Before ![]() (image error) Size: 757 B After ![]() (image error) Size: 757 B ![]() ![]() |
BIN
src/main/res/drawable-hdpi/message_bubble_received_white.9.png
Normal file
After ![]() (image error) Size: 779 B |
Before ![]() (image error) Size: 687 B After ![]() (image error) Size: 687 B ![]() ![]() |
Before ![]() (image error) Size: 594 B After ![]() (image error) Size: 594 B ![]() ![]() |
Before ![]() (image error) Size: 598 B After ![]() (image error) Size: 598 B ![]() ![]() |
BIN
src/main/res/drawable-mdpi/message_bubble_received_white.9.png
Normal file
After ![]() (image error) Size: 610 B |
Before ![]() (image error) Size: 558 B After ![]() (image error) Size: 558 B ![]() ![]() |
Before ![]() (image error) Size: 929 B After ![]() (image error) Size: 929 B ![]() ![]() |
Before ![]() (image error) Size: 921 B After ![]() (image error) Size: 921 B ![]() ![]() |
BIN
src/main/res/drawable-xhdpi/message_bubble_received_white.9.png
Normal file
After ![]() (image error) Size: 935 B |
Before ![]() (image error) Size: 857 B After ![]() (image error) Size: 857 B ![]() ![]() |
Before ![]() (image error) Size: 1.3 KiB After ![]() (image error) Size: 1.3 KiB ![]() ![]() |
Before ![]() (image error) Size: 1.3 KiB After ![]() (image error) Size: 1.3 KiB ![]() ![]() |
BIN
src/main/res/drawable-xxhdpi/message_bubble_received_white.9.png
Normal file
After ![]() (image error) Size: 1.3 KiB |
Before ![]() (image error) Size: 1.2 KiB After ![]() (image error) Size: 1.2 KiB ![]() ![]() |
Before ![]() (image error) Size: 1.7 KiB After ![]() (image error) Size: 1.7 KiB ![]() ![]() |
Before ![]() (image error) Size: 1.6 KiB After ![]() (image error) Size: 1.6 KiB ![]() ![]() |
After ![]() (image error) Size: 1.7 KiB |
Before ![]() (image error) Size: 1.5 KiB After ![]() (image error) Size: 1.5 KiB ![]() ![]() |
|
@ -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"/>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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"
|
||||
|
|