aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/.project33
-rw-r--r--src/main/java/de/tzur/conversations/Settings.java94
-rw-r--r--src/main/java/eu/siacs/conversations/Config.java2
-rw-r--r--src/main/java/eu/siacs/conversations/crypto/PgpEngine.java9
-rw-r--r--src/main/java/eu/siacs/conversations/entities/Account.java5
-rw-r--r--src/main/java/eu/siacs/conversations/entities/Bookmark.java7
-rw-r--r--src/main/java/eu/siacs/conversations/entities/Contact.java8
-rw-r--r--src/main/java/eu/siacs/conversations/entities/Conversation.java10
-rw-r--r--src/main/java/eu/siacs/conversations/entities/ListItem.java2
-rw-r--r--src/main/java/eu/siacs/conversations/entities/Message.java62
-rw-r--r--src/main/java/eu/siacs/conversations/generator/AbstractGenerator.java5
-rw-r--r--src/main/java/eu/siacs/conversations/http/HttpDownloadConnection.java31
-rw-r--r--src/main/java/eu/siacs/conversations/parser/AbstractParser.java39
-rw-r--r--src/main/java/eu/siacs/conversations/parser/MessageParser.java3
-rw-r--r--src/main/java/eu/siacs/conversations/services/NotificationService.java5
-rw-r--r--src/main/java/eu/siacs/conversations/services/XmppConnectionService.java39
-rw-r--r--src/main/java/eu/siacs/conversations/ui/ChangePasswordActivity.java9
-rw-r--r--src/main/java/eu/siacs/conversations/ui/ConversationActivity.java4
-rw-r--r--src/main/java/eu/siacs/conversations/ui/ConversationFragment.java156
-rw-r--r--src/main/java/eu/siacs/conversations/ui/EditMessage.java3
-rw-r--r--src/main/java/eu/siacs/conversations/ui/SettingsActivity.java87
-rw-r--r--src/main/java/eu/siacs/conversations/ui/XmppActivity.java4
-rw-r--r--src/main/java/eu/siacs/conversations/ui/adapter/AccountAdapter.java1
-rw-r--r--src/main/java/eu/siacs/conversations/ui/adapter/ConversationAdapter.java42
-rw-r--r--src/main/java/eu/siacs/conversations/ui/adapter/ListItemAdapter.java27
-rw-r--r--src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java15
-rw-r--r--src/main/java/eu/siacs/conversations/ui/listeners/ConversationMoreMessagesLoadedListener.java118
-rw-r--r--src/main/java/eu/siacs/conversations/ui/listeners/ConversationSwipeRefreshListener.java48
-rw-r--r--src/main/java/eu/siacs/conversations/utils/UIHelper.java26
-rw-r--r--src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnection.java6
-rw-r--r--src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnectionManager.java1
-rw-r--r--src/main/project.properties14
-rw-r--r--src/main/res/drawable-hdpi/ic_action_keyboard.pngbin0 -> 359 bytes
-rw-r--r--src/main/res/drawable-hdpi/smiley.pngbin0 -> 1679 bytes
-rw-r--r--src/main/res/drawable-mdpi/ic_action_keyboard.pngbin0 -> 433 bytes
-rw-r--r--src/main/res/drawable-mdpi/smiley.pngbin0 -> 987 bytes
-rw-r--r--src/main/res/drawable-xhdpi/ic_action_keyboard.pngbin0 -> 492 bytes
-rw-r--r--src/main/res/drawable-xhdpi/smiley.pngbin0 -> 1898 bytes
-rw-r--r--src/main/res/drawable-xxhdpi/ic_action_keyboard.pngbin0 -> 472 bytes
-rw-r--r--src/main/res/drawable-xxhdpi/smiley.pngbin0 -> 3140 bytes
-rw-r--r--src/main/res/layout/account_row.xml23
-rw-r--r--src/main/res/layout/activity_edit_account.xml12
-rw-r--r--src/main/res/layout/activity_muc_details.xml12
-rw-r--r--src/main/res/layout/contact.xml5
-rw-r--r--src/main/res/layout/contact_key.xml2
-rw-r--r--src/main/res/layout/conversation_list_row.xml12
-rw-r--r--src/main/res/layout/fragment_conversation.xml19
-rw-r--r--src/main/res/layout/message_received.xml11
-rw-r--r--src/main/res/layout/message_sent.xml11
-rw-r--r--src/main/res/values-ar-rEG/strings.xml2
-rw-r--r--src/main/res/values-bg/strings.xml2
-rw-r--r--src/main/res/values-de/strings.xml367
-rw-r--r--src/main/res/values-fr/strings.xml2
-rw-r--r--src/main/res/values-gl/strings.xml2
-rw-r--r--src/main/res/values-iw/strings.xml2
-rw-r--r--src/main/res/values-ja/strings.xml1
-rw-r--r--src/main/res/values-zh-rTW/strings.xml2
-rw-r--r--src/main/res/values/arrays.xml13
-rw-r--r--src/main/res/values/attrs.xml5
-rw-r--r--src/main/res/values/dimens.xml4
-rw-r--r--src/main/res/values/strings.xml18
-rw-r--r--src/main/res/xml/preferences.xml64
62 files changed, 1118 insertions, 388 deletions
diff --git a/src/main/.project b/src/main/.project
new file mode 100644
index 00000000..d2f05ef9
--- /dev/null
+++ b/src/main/.project
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>ConversationActivity</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>com.android.ide.eclipse.adt.ApkBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>com.android.ide.eclipse.adt.AndroidNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/src/main/java/de/tzur/conversations/Settings.java b/src/main/java/de/tzur/conversations/Settings.java
new file mode 100644
index 00000000..c919d60c
--- /dev/null
+++ b/src/main/java/de/tzur/conversations/Settings.java
@@ -0,0 +1,94 @@
+package de.tzur.conversations;
+
+import android.content.SharedPreferences;
+import android.util.Log;
+
+/**
+ * This class is used to provide access to settings which have to be accessed frequently.
+ * Every setting in this class has to be updated using @see SettingsActivity#onSharedPreferenceChanged.
+ */
+public final class Settings {
+
+ /**
+ * Initializes the settings provided via this static class.
+ * @param preferences the shared preferences of the app.
+ */
+ public static void initSettingsClassWithPreferences(SharedPreferences preferences) {
+ Log.d("SETTING", "Initializing settings");
+ String[] preferenceNames = { "parse_emoticons", "send_button_status", "led_notification_color", "auto_download_file_wlan", "auto_download_file_link", "confirm_messages_list" };
+ for (String name : preferenceNames) {
+ Settings.synchronizeSettingsClassWithPreferences(preferences, name);
+ }
+ }
+
+ /**
+ * Synchronizes the setting value in this class on settings update in SettingsActivity.
+ * @param preferences the shared preferences of the app.
+ * @param name the name of the setting to synchronize.
+ */
+ public static void synchronizeSettingsClassWithPreferences(SharedPreferences preferences, String name) {
+ Log.d("SETTING", "Synchronizing settings");
+ switch (name) {
+ case "parse_emoticons":
+ Settings.PARSE_EMOTICONS = preferences.getBoolean(name, Settings.PARSE_EMOTICONS);
+ break;
+ case "send_button_status":
+ Settings.SHOW_ONLINE_STATUS = preferences.getBoolean(name, Settings.SHOW_ONLINE_STATUS);
+ break;
+ case "led_notify_color":
+ Settings.LED_COLOR = preferences.getInt(name, Settings.LED_COLOR);
+ break;
+ case "auto_download_file_wlan":
+ Settings.DOWNLOAD_ONLY_WLAN = preferences.getBoolean(name, Settings.DOWNLOAD_ONLY_WLAN);
+ break;
+ case "auto_download_file_link":
+ Settings.DOWNLOAD_IMAGE_LINKS = preferences.getBoolean(name, Settings.DOWNLOAD_IMAGE_LINKS);
+ break;
+ case "confirm_messages_list":
+ int iPref = Settings.CONFIRM_MESSAGE_RECEIVED && Settings.CONFIRM_MESSAGE_READ ? 2 : Settings.CONFIRM_MESSAGE_RECEIVED ? 1 : 0;
+ try {
+ iPref = Integer.valueOf(preferences.getString(name, new Integer(iPref).toString()));
+ } catch (NumberFormatException e) {
+ // ignored, fallback-value set above
+ }
+ Settings.CONFIRM_MESSAGE_RECEIVED = iPref >= 1;
+ Settings.CONFIRM_MESSAGE_READ = iPref >= 2;
+ break;
+ }
+ }
+ /**
+ * Boolean if emoticons should be parsed to emoticons or not.
+ */
+ public static boolean PARSE_EMOTICONS = true;
+ /**
+ * Boolean if online status should be shown or not.
+ */
+ public static boolean SHOW_ONLINE_STATUS = true;
+ /**
+ * LED Color
+ */
+ public static int LED_COLOR = 0xffffffff;
+ /**
+ * Boolean if image-links should be downloaded or not.
+ */
+ public static boolean DOWNLOAD_IMAGE_LINKS = true;
+ /**
+ * Boolean if automatic downloads should be done only jif connected to WLAN.
+ */
+ public static boolean DOWNLOAD_ONLY_WLAN = true;
+ /**
+ * Boolean if confirm received messages
+ */
+ public static boolean CONFIRM_MESSAGE_RECEIVED = true;
+ /**
+ * Boolean if confirm read message
+ */
+ public static boolean CONFIRM_MESSAGE_READ = true;
+
+ /**
+ * This is a utility class - private constructor avoids any instantiation.
+ */
+ private Settings() {
+ // Private constructor to avoid instantiation
+ }
+}
diff --git a/src/main/java/eu/siacs/conversations/Config.java b/src/main/java/eu/siacs/conversations/Config.java
index f3cbffe6..f2303626 100644
--- a/src/main/java/eu/siacs/conversations/Config.java
+++ b/src/main/java/eu/siacs/conversations/Config.java
@@ -30,6 +30,8 @@ public final class Config {
public static final int MESSAGE_MERGE_WINDOW = 20;
+ public static final boolean UTF8_EMOTICONS = false;
+
public static final int PAGE_SIZE = 50;
public static final int MAX_NUM_PAGES = 3;
diff --git a/src/main/java/eu/siacs/conversations/crypto/PgpEngine.java b/src/main/java/eu/siacs/conversations/crypto/PgpEngine.java
index 8f8122f0..33089a8c 100644
--- a/src/main/java/eu/siacs/conversations/crypto/PgpEngine.java
+++ b/src/main/java/eu/siacs/conversations/crypto/PgpEngine.java
@@ -17,6 +17,7 @@ import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
+import de.tzur.conversations.Settings;
import eu.siacs.conversations.R;
import eu.siacs.conversations.entities.Account;
import eu.siacs.conversations.entities.Contact;
@@ -61,6 +62,8 @@ public class PgpEngine {
final HttpConnectionManager manager = mXmppConnectionService.getHttpConnectionManager();
if (message.trusted()
&& message.treatAsDownloadable() != Message.Decision.NEVER
+ && Settings.DOWNLOAD_IMAGE_LINKS
+ && mXmppConnectionService.isDownloadAllowedInConnection()
&& manager.getAutoAcceptFileSize() > 0) {
manager.createNewDownloadConnection(message);
}
@@ -167,7 +170,7 @@ public class PgpEngine {
String[] lines = os.toString().split("\n");
for (int i = 2; i < lines.length - 1; ++i) {
if (!lines[i].contains("Version")) {
- encryptedMessageBody.append(lines[i].trim());
+ encryptedMessageBody.append(lines[i]);
}
}
message.setEncryptedBody(encryptedMessageBody
@@ -242,7 +245,7 @@ public class PgpEngine {
pgpSig.append("-----BEGIN PGP SIGNATURE-----");
pgpSig.append('\n');
pgpSig.append('\n');
- pgpSig.append(signature.replace("\n", "").trim());
+ pgpSig.append(signature.replace("\n", ""));
pgpSig.append('\n');
pgpSig.append("-----END PGP SIGNATURE-----");
Intent params = new Intent();
@@ -295,7 +298,7 @@ public class PgpEngine {
sig = false;
} else {
if (!line.contains("Version")) {
- signatureBuilder.append(line.trim());
+ signatureBuilder.append(line);
}
}
}
diff --git a/src/main/java/eu/siacs/conversations/entities/Account.java b/src/main/java/eu/siacs/conversations/entities/Account.java
index 7a2dc3f7..a8b9252f 100644
--- a/src/main/java/eu/siacs/conversations/entities/Account.java
+++ b/src/main/java/eu/siacs/conversations/entities/Account.java
@@ -130,6 +130,7 @@ public class Account extends AbstractEntity {
private final Roster roster = new Roster(this);
private List<Bookmark> bookmarks = new CopyOnWriteArrayList<>();
private final Collection<Jid> blocklist = new CopyOnWriteArraySet<>();
+ private XmppConnectionService mXmppConnectionService;
public Account() {
this.uuid = "0";
@@ -429,4 +430,8 @@ public class Account extends AbstractEntity {
public boolean isOnlineAndConnected() {
return this.getStatus() == State.ONLINE && this.getXmppConnection() != null;
}
+
+ public XmppConnectionService getXmppConnectionService() {
+ return mXmppConnectionService;
+ }
}
diff --git a/src/main/java/eu/siacs/conversations/entities/Bookmark.java b/src/main/java/eu/siacs/conversations/entities/Bookmark.java
index cc6f146b..06c46c1c 100644
--- a/src/main/java/eu/siacs/conversations/entities/Bookmark.java
+++ b/src/main/java/eu/siacs/conversations/entities/Bookmark.java
@@ -1,5 +1,7 @@
package eu.siacs.conversations.entities;
+import android.graphics.Color;
+
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
@@ -74,6 +76,11 @@ public class Bookmark extends Element implements ListItem {
return tags;
}
+ @Override
+ public int getStatusColor() {
+ return Color.parseColor("#259B23");
+ }
+
public String getNick() {
return this.findChildContent("nick");
}
diff --git a/src/main/java/eu/siacs/conversations/entities/Contact.java b/src/main/java/eu/siacs/conversations/entities/Contact.java
index f924c05a..2d103faf 100644
--- a/src/main/java/eu/siacs/conversations/entities/Contact.java
+++ b/src/main/java/eu/siacs/conversations/entities/Contact.java
@@ -2,6 +2,7 @@ package eu.siacs.conversations.entities;
import android.content.ContentValues;
import android.database.Cursor;
+import android.graphics.Color;
import org.json.JSONArray;
import org.json.JSONException;
@@ -152,11 +153,16 @@ public class Contact implements ListItem, Blockable {
return tags;
}
+ @Override
+ public int getStatusColor() {
+ return Color.parseColor(UIHelper.getStatusColor(getMostAvailableStatus()));
+ }
+
public boolean match(String needle) {
if (needle == null || needle.isEmpty()) {
return true;
}
- needle = needle.toLowerCase(Locale.US).trim();
+ needle = needle.toLowerCase(Locale.US);
String[] parts = needle.split("\\s+");
if (parts.length > 1) {
for(int i = 0; i < parts.length; ++i) {
diff --git a/src/main/java/eu/siacs/conversations/entities/Conversation.java b/src/main/java/eu/siacs/conversations/entities/Conversation.java
index 36d6b43b..1c985e2f 100644
--- a/src/main/java/eu/siacs/conversations/entities/Conversation.java
+++ b/src/main/java/eu/siacs/conversations/entities/Conversation.java
@@ -775,10 +775,16 @@ public class Conversation extends AbstractEntity implements Blockable {
synchronized (this.messages) {
int count = 0;
for(int i = this.messages.size() - 1; i >= 0; --i) {
- if (this.messages.get(i).isRead()) {
+ Message message = this.messages.get(i);
+ if (message.isRead()) {
return count;
}
- ++count;
+ if (getMode() == Conversation.MODE_SINGLE
+ || account.getXmppConnectionService().getNotificationService().conferenceNotificationsEnabled()
+ || account.getXmppConnectionService().getNotificationService().wasHighlightedOrPrivate(message)
+ ) {
+ ++count;
+ }
}
return count;
}
diff --git a/src/main/java/eu/siacs/conversations/entities/ListItem.java b/src/main/java/eu/siacs/conversations/entities/ListItem.java
index efc1c2b9..aba2aef2 100644
--- a/src/main/java/eu/siacs/conversations/entities/ListItem.java
+++ b/src/main/java/eu/siacs/conversations/entities/ListItem.java
@@ -11,6 +11,8 @@ public interface ListItem extends Comparable<ListItem> {
public List<Tag> getTags();
+ public int getStatusColor();
+
public final class Tag {
private final String name;
private final int color;
diff --git a/src/main/java/eu/siacs/conversations/entities/Message.java b/src/main/java/eu/siacs/conversations/entities/Message.java
index 0eff99cf..6a878e90 100644
--- a/src/main/java/eu/siacs/conversations/entities/Message.java
+++ b/src/main/java/eu/siacs/conversations/entities/Message.java
@@ -63,7 +63,7 @@ public class Message extends AbstractEntity {
protected String conversationUuid;
protected Jid counterpart;
protected Jid trueCounterpart;
- protected String body;
+ private String body;
protected String encryptedBody;
protected long timeSent;
protected int encryption;
@@ -345,16 +345,16 @@ public class Message extends AbstractEntity {
public boolean equals(Message message) {
if (this.serverMsgId != null && message.getServerMsgId() != null) {
return this.serverMsgId.equals(message.getServerMsgId());
- } else if (this.body == null || this.counterpart == null) {
+ } else if (this.getBody() == null || this.counterpart == null) {
return false;
} else {
String body, otherBody;
if (this.hasFileOnRemoteHost()) {
body = getFileParams().url.toString();
- otherBody = message.body == null ? null : message.body.trim();
+ otherBody = message.getBody() == null ? null : message.getBody();
} else {
- body = this.body;
- otherBody = message.body;
+ body = this.getBody();
+ otherBody = message.getBody();
}
if (message.getRemoteMsgId() != null) {
return (message.getRemoteMsgId().equals(this.remoteMsgId) || message.getRemoteMsgId().equals(this.uuid))
@@ -411,13 +411,11 @@ public class Message extends AbstractEntity {
this.getCounterpart().equals(message.getCounterpart()) &&
(message.getTimeSent() - this.getTimeSent()) <= (Config.MESSAGE_MERGE_WINDOW * 1000) &&
!GeoHelper.isGeoUri(message.getBody()) &&
- !GeoHelper.isGeoUri(this.body) &&
+ !GeoHelper.isGeoUri(this.getBody()) &&
message.treatAsDownloadable() == Decision.NEVER &&
this.treatAsDownloadable() == Decision.NEVER &&
!message.getBody().startsWith(ME_COMMAND) &&
!this.getBody().startsWith(ME_COMMAND) &&
- !this.bodyIsHeart() &&
- !message.bodyIsHeart() &&
this.isTrusted() == message.isTrusted()
);
}
@@ -439,7 +437,7 @@ public class Message extends AbstractEntity {
while(current.mergeable(current.next())) {
current = current.next();
body.append(MERGE_SEPARATOR);
- body.append(current.getBody().trim());
+ body.append(current.getBody());
}
return body.toString();
}
@@ -506,17 +504,28 @@ public class Message extends AbstractEntity {
private static String extractRelevantExtension(URL url) {
String path = url.getPath();
+ return extractRelevantExtension(path);
+ }
+
+ private static String extractRelevantExtension(String path) {
if (path == null || path.isEmpty()) {
return null;
}
+
String filename = path.substring(path.lastIndexOf('/') + 1).toLowerCase();
- String[] extensionParts = filename.split("\\.");
- if (extensionParts.length == 2) {
- return extensionParts[extensionParts.length - 1];
- } else if (extensionParts.length == 3 && Arrays
- .asList(Transferable.VALID_CRYPTO_EXTENSIONS)
- .contains(extensionParts[extensionParts.length - 1])) {
- return extensionParts[extensionParts.length -2];
+
+ int dotPosition = filename.lastIndexOf(".");
+
+ if (dotPosition != -1)
+ {
+ String extension = filename.substring(dotPosition + 1);
+
+ // we want the real file extension, not the crypto one
+ if (Arrays.asList(Transferable.VALID_CRYPTO_EXTENSIONS).contains(extension)) {
+ return extractRelevantExtension(path.substring(0,dotPosition));
+ } else {
+ return extension;
+ }
}
return null;
}
@@ -531,7 +540,7 @@ public class Message extends AbstractEntity {
}
} else {
try {
- return MimeUtils.guessMimeTypeFromExtension(extractRelevantExtension(new URL(body.trim())));
+ return MimeUtils.guessMimeTypeFromExtension(extractRelevantExtension(new URL(this.getBody())));
} catch (MalformedURLException e) {
return null;
}
@@ -539,7 +548,12 @@ public class Message extends AbstractEntity {
}
public Decision treatAsDownloadable() {
- if (body.trim().contains(" ")) {
+ /**
+ * there are a few cases where spaces result in an unwanted behavior, e.g.
+ * "http://example.com/image.jpg" text that will not be shown /abc.png"
+ * or more than one image link in one message.
+ */
+ if (getBody().contains(" ")) {
return Decision.NEVER;
}
try {
@@ -572,10 +586,6 @@ public class Message extends AbstractEntity {
}
}
- public boolean bodyIsHeart() {
- return body != null && UIHelper.HEARTS.contains(body.trim());
- }
-
public FileParams getFileParams() {
FileParams params = getLegacyFileParams();
if (params != null) {
@@ -585,10 +595,10 @@ public class Message extends AbstractEntity {
if (this.transferable != null) {
params.size = this.transferable.getFileSize();
}
- if (body == null) {
+ if (this.getBody() == null) {
return params;
}
- String parts[] = body.split("\\|");
+ String parts[] = this.getBody().split("\\|");
switch (parts.length) {
case 1:
try {
@@ -647,10 +657,10 @@ public class Message extends AbstractEntity {
public FileParams getLegacyFileParams() {
FileParams params = new FileParams();
- if (body == null) {
+ if (this.getBody() == null) {
return params;
}
- String parts[] = body.split(",");
+ String parts[] = this.getBody().split(",");
if (parts.length == 3) {
try {
params.size = Long.parseLong(parts[0]);
diff --git a/src/main/java/eu/siacs/conversations/generator/AbstractGenerator.java b/src/main/java/eu/siacs/conversations/generator/AbstractGenerator.java
index 69bb1803..3a256219 100644
--- a/src/main/java/eu/siacs/conversations/generator/AbstractGenerator.java
+++ b/src/main/java/eu/siacs/conversations/generator/AbstractGenerator.java
@@ -12,6 +12,7 @@ import java.util.List;
import java.util.Locale;
import java.util.TimeZone;
+import de.tzur.conversations.Settings;
import eu.siacs.conversations.crypto.axolotl.AxolotlService;
import eu.siacs.conversations.services.XmppConnectionService;
import eu.siacs.conversations.utils.PhoneHelper;
@@ -72,7 +73,7 @@ public abstract class AbstractGenerator {
s.append(feature + "<");
}
byte[] sha1 = md.digest(s.toString().getBytes());
- return new String(Base64.encode(sha1, Base64.DEFAULT)).trim();
+ return new String(Base64.encode(sha1, Base64.DEFAULT));
}
public static String getTimestamp(long time) {
@@ -83,7 +84,7 @@ public abstract class AbstractGenerator {
public List<String> getFeatures() {
ArrayList<String> features = new ArrayList<>();
features.addAll(Arrays.asList(FEATURES));
- if (mXmppConnectionService.confirmMessages()) {
+ if (Settings.CONFIRM_MESSAGE_RECEIVED) {
features.addAll(Arrays.asList(MESSAGE_CONFIRMATION_FEATURES));
}
Collections.sort(features);
diff --git a/src/main/java/eu/siacs/conversations/http/HttpDownloadConnection.java b/src/main/java/eu/siacs/conversations/http/HttpDownloadConnection.java
index 0d202bb9..356f9417 100644
--- a/src/main/java/eu/siacs/conversations/http/HttpDownloadConnection.java
+++ b/src/main/java/eu/siacs/conversations/http/HttpDownloadConnection.java
@@ -165,7 +165,7 @@ public class HttpDownloadConnection implements Transferable {
return;
}
file.setExpectedSize(size);
- if (size <= mHttpConnectionManager.getAutoAcceptFileSize()) {
+ if (size != -1 && size <= mHttpConnectionManager.getAutoAcceptFileSize()) {
HttpDownloadConnection.this.acceptedAutomatically = true;
new Thread(new FileDownloader(interactive)).start();
} else {
@@ -176,25 +176,22 @@ public class HttpDownloadConnection implements Transferable {
}
private long retrieveFileSize() throws IOException {
+ Log.d(Config.LOGTAG,"retrieve file size. interactive:"+String.valueOf(interactive));
+ changeStatus(STATUS_CHECKING);
+ HttpURLConnection connection = (HttpURLConnection) mUrl.openConnection();
+ connection.setRequestMethod("HEAD");
+ if (connection instanceof HttpsURLConnection) {
+ mHttpConnectionManager.setupTrustManager((HttpsURLConnection) connection, interactive);
+ }
+ connection.connect();
+ String contentLength = connection.getHeaderField("Content-Length");
+ if (contentLength == null) {
+ return -1;
+ }
try {
- Log.d(Config.LOGTAG, "retrieve file size. interactive:" + String.valueOf(interactive));
- changeStatus(STATUS_CHECKING);
- HttpURLConnection connection = (HttpURLConnection) mUrl.openConnection();
- connection.setRequestMethod("HEAD");
- if (connection instanceof HttpsURLConnection) {
- mHttpConnectionManager.setupTrustManager((HttpsURLConnection) connection, interactive);
- }
- connection.connect();
- String contentLength = connection.getHeaderField("Content-Length");
- connection.disconnect();
- if (contentLength == null) {
- throw new IOException();
- }
return Long.parseLong(contentLength, 10);
- } catch (IOException e) {
- throw e;
} catch (NumberFormatException e) {
- throw new IOException();
+ return -1;
}
}
diff --git a/src/main/java/eu/siacs/conversations/parser/AbstractParser.java b/src/main/java/eu/siacs/conversations/parser/AbstractParser.java
index 18331796..3f11f756 100644
--- a/src/main/java/eu/siacs/conversations/parser/AbstractParser.java
+++ b/src/main/java/eu/siacs/conversations/parser/AbstractParser.java
@@ -1,16 +1,21 @@
package eu.siacs.conversations.parser;
+import android.util.Log;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
+import javax.xml.datatype.DatatypeConfigurationException;
+import javax.xml.datatype.DatatypeFactory;
+
import eu.siacs.conversations.entities.Account;
import eu.siacs.conversations.entities.Contact;
import eu.siacs.conversations.services.XmppConnectionService;
import eu.siacs.conversations.xml.Element;
import eu.siacs.conversations.xmpp.jid.Jid;
+import eu.siacs.conversations.xmpp.stanzas.MessagePacket;
public abstract class AbstractParser {
@@ -20,6 +25,15 @@ public abstract class AbstractParser {
this.mXmppConnectionService = service;
}
+ /**
+ * Gets the timestamp from the 'delay' element.
+ * Refer to XEP-0203: Delayed Delivery for details. @link{http://xmpp.org/extensions/xep-0203.html}
+ * @param packet the element to find the child element 'delay' in.
+ * @return the time in milli seconds of the attribute 'stamp' of the
+ * element 'delay'. In case there is no 'delay' element or no 'stamp'
+ * attribute or the current time is less than the value of the 'stamp'
+ * attribute the current time is returned.
+ */
public static Long getTimestamp(Element element, Long defaultValue) {
Element delay = element.findChild("delay","urn:xmpp:delay");
if (delay != null) {
@@ -39,12 +53,27 @@ public abstract class AbstractParser {
return getTimestamp(packet,System.currentTimeMillis());
}
+ /**
+ * Parses the timestamp according to XEP-0082: XMPP Date and Time Profiles.
+ * @link{http://xmpp.org/extensions/xep-0082.html}
+ *
+ * @param timestamp the timestamp to parse
+ * @return Date
+ * @throws ParseException
+ */
public static Date parseTimestamp(String timestamp) throws ParseException {
- timestamp = timestamp.replace("Z", "+0000");
- SimpleDateFormat dateFormat;
- timestamp = timestamp.substring(0,19)+timestamp.substring(timestamp.length() -5,timestamp.length());
- dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ",Locale.US);
- return dateFormat.parse(timestamp);
+ /*try {
+ Log.d("TIMESTAMP", timestamp);
+ return DatatypeFactory.newInstance().newXMLGregorianCalendar(timestamp).toGregorianCalendar().getTime();
+ } catch (DatatypeConfigurationException e) {
+ Log.d("TIMESTAMP", e.getMessage());
+ return new Date();
+ }*/
+ timestamp = timestamp.replace("Z", "+0000");
+ SimpleDateFormat dateFormat;
+ timestamp = timestamp.substring(0,19)+timestamp.substring(timestamp.length() -5,timestamp.length());
+ dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ",Locale.US);
+ return dateFormat.parse(timestamp);
}
protected void updateLastseen(final Element packet, final Account account, final boolean presenceOverwrite) {
diff --git a/src/main/java/eu/siacs/conversations/parser/MessageParser.java b/src/main/java/eu/siacs/conversations/parser/MessageParser.java
index 025ed1e7..e2f13bd3 100644
--- a/src/main/java/eu/siacs/conversations/parser/MessageParser.java
+++ b/src/main/java/eu/siacs/conversations/parser/MessageParser.java
@@ -8,6 +8,7 @@ import net.java.otr4j.session.SessionStatus;
import java.util.Set;
+import de.tzur.conversations.Settings;
import eu.siacs.conversations.Config;
import eu.siacs.conversations.crypto.axolotl.AxolotlService;
import eu.siacs.conversations.crypto.axolotl.XmppAxolotlMessage;
@@ -117,6 +118,8 @@ public class MessageParser extends AbstractParser implements
this.jid = jid;
this.password = password;
}
+ return false;
+ }
public boolean execute(Account account) {
if (jid != null) {
diff --git a/src/main/java/eu/siacs/conversations/services/NotificationService.java b/src/main/java/eu/siacs/conversations/services/NotificationService.java
index 90e4d216..d03dcb84 100644
--- a/src/main/java/eu/siacs/conversations/services/NotificationService.java
+++ b/src/main/java/eu/siacs/conversations/services/NotificationService.java
@@ -31,6 +31,7 @@ import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+import de.tzur.conversations.Settings;
import eu.siacs.conversations.Config;
import eu.siacs.conversations.R;
import eu.siacs.conversations.entities.Account;
@@ -218,7 +219,7 @@ public class NotificationService {
mBuilder.setDefaults(0);
mBuilder.setSmallIcon(R.drawable.ic_notification);
mBuilder.setDeleteIntent(createDeleteIntent());
- mBuilder.setLights(0xff00FF00, 2000, 3000);
+ mBuilder.setLights(Settings.LED_COLOR, 2000, 4000);
final Notification notification = mBuilder.build();
notificationManager.notify(NOTIFICATION_ID, notification);
}
@@ -442,7 +443,7 @@ public class NotificationService {
return PendingIntent.getService(mXmppConnectionService,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);
}
- private boolean wasHighlightedOrPrivate(final Message message) {
+ public boolean wasHighlightedOrPrivate(final Message message) {
final String nick = message.getConversation().getMucOptions().getActualNick();
final Pattern highlight = generateNickHighlightPattern(nick);
if (message.getBody() == null || nick == null) {
diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java
index 36d6cd49..b165ede4 100644
--- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java
+++ b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java
@@ -49,6 +49,7 @@ import java.util.Map;
import java.util.concurrent.CopyOnWriteArrayList;
import de.duenndns.ssl.MemorizingTrustManager;
+import de.tzur.conversations.Settings;
import eu.siacs.conversations.Config;
import eu.siacs.conversations.R;
import eu.siacs.conversations.crypto.PgpEngine;
@@ -579,6 +580,25 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
return activeNetwork != null && activeNetwork.isConnected();
}
+ /**
+ * check whether we are allowed to download at the moment
+ */
+ public boolean isDownloadAllowedInConnection() {
+ if (Settings.DOWNLOAD_ONLY_WLAN) {
+ return isWifiConnected();
+ }
+ return true;
+ }
+
+ /**
+ * check whether wifi is connected
+ */
+ public boolean isWifiConnected() {
+ ConnectivityManager cm = (ConnectivityManager) getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
+ NetworkInfo niWifi = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
+ return niWifi.isConnected();
+ }
+
@SuppressLint("TrulyRandom")
@Override
public void onCreate() {
@@ -1069,6 +1089,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
public void loadMoreMessages(final Conversation conversation, final long timestamp, final OnMoreMessagesLoaded callback) {
Log.d(Config.LOGTAG, "load more messages for " + conversation.getName() + " prior to " + MessageGenerator.getTimestamp(timestamp));
if (XmppConnectionService.this.getMessageArchiveService().queryInProgress(conversation,callback)) {
+ Log.d("mam", "Query in progress");
return;
}
Runnable runnable = new Runnable() {
@@ -1076,19 +1097,26 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
public void run() {
final Account account = conversation.getAccount();
List<Message> messages = databaseBackend.getMessages(conversation, 50,timestamp);
+ Log.d("mam", "runnable load more messages");
if (messages.size() > 0) {
+ Log.d("mam", "At least one message");
conversation.addAll(0, messages);
checkDeletedFiles(conversation);
callback.onMoreMessagesLoaded(messages.size(), conversation);
} else if (conversation.hasMessagesLeftOnServer()
&& account.isOnlineAndConnected()
&& account.getXmppConnection().getFeatures().mam()) {
+ Log.d("mam", "mam activate, account online and connected and messages left on server");
MessageArchiveService.Query query = getMessageArchiveService().query(conversation,0,timestamp - 1);
if (query != null) {
query.setCallback(callback);
}
callback.informUser(R.string.fetching_history_from_server);
- }
+ } else {
+ Log.d("mam", ((!conversation.hasMessagesLeftOnServer()) ? "no" : "") + " more messages left on server, mam " + ((account.getXmppConnection().getFeatures().mam()) ? "" : "not") + " activated, account is " + ((account.isOnlineAndConnected()) ? "" : "not") + " online or connected)");
+ callback.onMoreMessagesLoaded(0, conversation);
+ callback.informUser(R.string.no_more_history_on_server);
+ }
}
};
mDatabaseExecutor.execute(runnable);
@@ -2371,7 +2399,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
public void sendReadMarker(final Conversation conversation) {
final Message markable = conversation.getLatestMarkableMessage();
this.markRead(conversation);
- if (confirmMessages() && markable != null && markable.getRemoteMsgId() != null) {
+ if (Settings.CONFIRM_MESSAGE_READ && markable != null && markable.getRemoteMsgId() != null) {
Log.d(Config.LOGTAG, conversation.getAccount().getJid().toBareJid() + ": sending read marker to " + markable.getCounterpart().toString());
Account account = conversation.getAccount();
final Jid to = markable.getCounterpart();
@@ -2549,7 +2577,12 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
public void clearConversationHistory(final Conversation conversation) {
conversation.clearMessages();
- conversation.setHasMessagesLeftOnServer(false); //avoid messages getting loaded through mam
+ /*
+ * In case the history was loaded completely before.
+ * The flag "hasMessagesLeftOnServer" is set to false and no messages will be loaded anymore
+ * Therefore set this flag to true and try to get messages from server
+ */
+ conversation.setHasMessagesLeftOnServer(true);
new Thread(new Runnable() {
@Override
public void run() {
diff --git a/src/main/java/eu/siacs/conversations/ui/ChangePasswordActivity.java b/src/main/java/eu/siacs/conversations/ui/ChangePasswordActivity.java
index aa986bd1..09988b7c 100644
--- a/src/main/java/eu/siacs/conversations/ui/ChangePasswordActivity.java
+++ b/src/main/java/eu/siacs/conversations/ui/ChangePasswordActivity.java
@@ -26,11 +26,14 @@ public class ChangePasswordActivity extends XmppActivity implements XmppConnecti
mCurrentPassword.requestFocus();
mCurrentPassword.setError(getString(R.string.account_status_unauthorized));
} else if (!newPassword.equals(newPasswordConfirm)) {
- mNewPasswordConfirm.requestFocus();
- mNewPasswordConfirm.setError(getString(R.string.passwords_do_not_match));
+ mNewPasswordConfirm.requestFocus();
+ mNewPasswordConfirm.setError(getString(R.string.passwords_do_not_match));
+ } else if (newPassword.isEmpty()) {
+ mNewPassword.requestFocus();
+ mNewPassword.setError(getString(R.string.password_should_not_be_empty));
} else if (newPassword.trim().isEmpty()) {
mNewPassword.requestFocus();
- mNewPassword.setError(getString(R.string.password_should_not_be_empty));
+ mNewPassword.setError(getString(R.string.password_should_not_contain_only_spaces));
} else {
mCurrentPassword.setError(null);
mNewPassword.setError(null);
diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java b/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java
index 219a4fca..7fec827b 100644
--- a/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java
+++ b/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java
@@ -53,6 +53,7 @@ import eu.siacs.conversations.utils.ExceptionHelper;
import eu.siacs.conversations.xmpp.OnUpdateBlocklist;
import eu.siacs.conversations.xmpp.jid.InvalidJidException;
import eu.siacs.conversations.xmpp.jid.Jid;
+import github.ankushsachdeva.emojicon.EmojiconEditText;
public class ConversationActivity extends XmppActivity
implements OnAccountUpdate, OnConversationUpdate, OnRosterUpdate, OnUpdateBlocklist, XmppConnectionService.OnShowErrorToast {
@@ -257,6 +258,7 @@ public class ConversationActivity extends XmppActivity
}
});
listView.enableSwipeToDismiss();
+ listView.setSwipeDirection(EnhancedListView.SwipeDirection.START);
listView.setSwipingLayout(R.id.swipeable_item);
listView.setUndoStyle(EnhancedListView.UndoStyle.SINGLE_POPUP);
listView.setUndoHideDelay(5000);
@@ -1144,7 +1146,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();
diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java
index de758efc..f645b241 100644
--- a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java
+++ b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java
@@ -11,7 +11,9 @@ import android.content.Intent;
import android.content.IntentSender;
import android.content.IntentSender.SendIntentException;
import android.os.Bundle;
+import android.support.v4.widget.SwipeRefreshLayout;
import android.text.InputType;
+import android.util.Log;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Gravity;
@@ -23,12 +25,12 @@ import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodManager;
-import android.widget.AbsListView;
-import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.ImageButton;
+import android.widget.ImageView;
import android.widget.ListView;
+import android.widget.PopupWindow;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.TextView.OnEditorActionListener;
@@ -47,7 +49,13 @@ import eu.siacs.conversations.crypto.PgpEngine;
import eu.siacs.conversations.entities.Account;
import eu.siacs.conversations.entities.Contact;
import eu.siacs.conversations.entities.Conversation;
+<<<<<<< HEAD
+import eu.siacs.conversations.entities.Transferable;
+import eu.siacs.conversations.entities.DownloadableFile;
+import eu.siacs.conversations.entities.TransferablePlaceholder;
+=======
import eu.siacs.conversations.entities.DownloadableFile;
+>>>>>>> 1.6.3
import eu.siacs.conversations.entities.Message;
import eu.siacs.conversations.entities.MucOptions;
import eu.siacs.conversations.entities.Presences;
@@ -59,10 +67,14 @@ import eu.siacs.conversations.ui.XmppActivity.OnValueEdited;
import eu.siacs.conversations.ui.adapter.MessageAdapter;
import eu.siacs.conversations.ui.adapter.MessageAdapter.OnContactPictureClicked;
import eu.siacs.conversations.ui.adapter.MessageAdapter.OnContactPictureLongClicked;
+import eu.siacs.conversations.ui.listeners.ConversationSwipeRefreshListener;
import eu.siacs.conversations.utils.GeoHelper;
import eu.siacs.conversations.utils.UIHelper;
import eu.siacs.conversations.xmpp.chatstate.ChatState;
import eu.siacs.conversations.xmpp.jid.Jid;
+import github.ankushsachdeva.emojicon.EmojiconGridView;
+import github.ankushsachdeva.emojicon.EmojiconsPopup;
+import github.ankushsachdeva.emojicon.emoji.Emojicon;
public class ConversationFragment extends Fragment implements EditMessage.KeyboardListener {
@@ -101,10 +113,14 @@ public class ConversationFragment extends Fragment implements EditMessage.Keyboa
}
};
protected ListView messagesView;
- final protected List<Message> messageList = new ArrayList<>();
+ protected SwipeRefreshLayout swipeLayout;
+ final protected List<Message> messageList = new ArrayList<>();
protected MessageAdapter messageListAdapter;
private EditMessage mEditMessage;
private ImageButton mSendButton;
+ private ImageView mEmojButton;
+ private View mRootView;
+ private EmojiconsPopup mEmojPopup;
private RelativeLayout snackbar;
private TextView snackbarMessage;
private TextView snackbarAction;
@@ -371,6 +387,107 @@ public class ConversationFragment extends Fragment implements EditMessage.Keyboa
});
mEditMessage.setOnEditorActionListener(mEditorActionListener);
+ // Start of emojicon
+ mEmojButton = (ImageView) view.findViewById(R.id.emoji_btn);
+ mRootView = view.findViewById(R.id.textsend);
+
+ // Give the topmost view of your activity layout hierarchy. This will be used to measure soft keyboard height
+ mEmojPopup = new EmojiconsPopup(mRootView, this.getActivity());
+
+ //Will automatically set size according to the soft keyboard size
+ mEmojPopup.setSizeForSoftKeyboard();
+
+ //If the emoji popup is dismissed, change emojiButton to smiley icon
+ mEmojPopup.setOnDismissListener(new PopupWindow.OnDismissListener() {
+
+ @Override
+ public void onDismiss() {
+ changeEmojiKeyboardIcon(mEmojButton, R.drawable.smiley);
+ }
+ });
+
+ //If the text keyboard closes, also dismiss the emoji popup
+ mEmojPopup.setOnSoftKeyboardOpenCloseListener(new EmojiconsPopup.OnSoftKeyboardOpenCloseListener() {
+
+ @Override
+ public void onKeyboardOpen(int keyBoardHeight) {
+
+ }
+
+ @Override
+ public void onKeyboardClose() {
+ if (mEmojPopup.isShowing())
+ mEmojPopup.dismiss();
+ }
+ });
+
+ //On emoji clicked, add it to edittext
+ mEmojPopup.setOnEmojiconClickedListener(new EmojiconGridView.OnEmojiconClickedListener() {
+
+ @Override
+ public void onEmojiconClicked(Emojicon emojicon) {
+ if (mEditMessage == null || emojicon == null) {
+ return;
+ }
+
+ int start = mEditMessage.getSelectionStart();
+ int end = mEditMessage.getSelectionEnd();
+ if (start < 0) {
+ mEditMessage.append(emojicon.getEmoji());
+ } else {
+ mEditMessage.getText().replace(Math.min(start, end),
+ Math.max(start, end), emojicon.getEmoji(), 0,
+ emojicon.getEmoji().length());
+ }
+ }
+ });
+
+ //On backspace clicked, emulate the KEYCODE_DEL key event
+ mEmojPopup.setOnEmojiconBackspaceClickedListener(new EmojiconsPopup.OnEmojiconBackspaceClickedListener() {
+
+ @Override
+ public void onEmojiconBackspaceClicked(View v) {
+ KeyEvent event = new KeyEvent(
+ 0, 0, 0, KeyEvent.KEYCODE_DEL, 0, 0, 0, 0, KeyEvent.KEYCODE_ENDCALL);
+ mEditMessage.dispatchKeyEvent(event);
+ }
+ });
+
+ // To toggle between text keyboard and emoji keyboard keyboard(Popup)
+ mEmojButton.setOnClickListener(new OnClickListener() {
+
+ @Override
+ public void onClick(View v) {
+
+ //If popup is not showing => emoji keyboard is not visible, we need to show it
+ if(!mEmojPopup.isShowing()){
+
+ //If keyboard is visible, simply show the emoji popup
+ if(mEmojPopup.isKeyBoardOpen()){
+ mEmojPopup.showAtBottom();
+ changeEmojiKeyboardIcon(mEmojButton, R.drawable.ic_action_keyboard);
+ }
+
+ //else, open the text keyboard first and immediately after that show the emoji popup
+ else{
+ mEditMessage.setFocusableInTouchMode(true);
+ mEditMessage.requestFocus();
+ mEmojPopup.showAtBottomPending();
+ final InputMethodManager inputMethodManager = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
+ inputMethodManager.showSoftInput(mEditMessage, InputMethodManager.SHOW_IMPLICIT);
+ changeEmojiKeyboardIcon(mEmojButton, R.drawable.ic_action_keyboard);
+ }
+ }
+
+ //If popup is showing, simply dismiss it to show the undelying text keyboard
+ else{
+ mEmojPopup.dismiss();
+ }
+ }
+ });
+
+ // End of emojicon
+
mSendButton = (ImageButton) view.findViewById(R.id.textSendButton);
mSendButton.setOnClickListener(this.mSendButtonListener);
@@ -434,6 +551,12 @@ public class ConversationFragment extends Fragment implements EditMessage.Keyboa
registerForContextMenu(messagesView);
+ // Start of swipe refresh
+ // New Swipe refresh
+ swipeLayout = (SwipeRefreshLayout) view.findViewById(R.id.swipe_refresh_container);
+ swipeLayout.setOnRefreshListener(new ConversationSwipeRefreshListener(messageList, swipeLayout, this, messagesView, messageListAdapter));
+ // End of swipe refresh
+
return view;
}
@@ -572,7 +695,7 @@ public class ConversationFragment extends Fragment implements EditMessage.Keyboa
resId = R.string.file_url;
url = message.getFileParams().url.toString();
} else {
- url = message.getBody().trim();
+ url = message.getBody();
resId = R.string.file_url;
}
if (activity.copyTextToClipboard(url, resId)) {
@@ -603,7 +726,7 @@ public class ConversationFragment extends Fragment implements EditMessage.Keyboa
}
protected void highlightInConference(String nick) {
- String oldString = mEditMessage.getText().toString().trim();
+ String oldString = mEditMessage.getText().toString();
if (oldString.isEmpty() || mEditMessage.getSelectionStart() == 0) {
mEditMessage.getText().insert(0, nick + ": ");
} else {
@@ -669,6 +792,7 @@ public class ConversationFragment extends Fragment implements EditMessage.Keyboa
if (size > 0) {
messagesView.setSelection(size - 1);
}
+ swipeLayout.setRefreshing(false);
}
private OnClickListener mUnblockClickListener = new OnClickListener() {
@@ -1151,15 +1275,15 @@ public class ConversationFragment extends Fragment implements EditMessage.Keyboa
final ConversationActivity activity = (ConversationActivity) getActivity();
final XmppConnectionService xmppService = activity.xmppConnectionService;
activity.selectPresence(message.getConversation(),
- new OnPresenceSelected() {
-
- @Override
- public void onPresenceSelected() {
- message.setCounterpart(conversation.getNextCounterpart());
- xmppService.sendMessage(message);
- messageSent();
- }
- });
+ new OnPresenceSelected() {
+
+ @Override
+ public void onPresenceSelected() {
+ message.setCounterpart(conversation.getNextCounterpart());
+ xmppService.sendMessage(message);
+ messageSent();
+ }
+ });
}
public void appendText(String text) {
@@ -1224,4 +1348,8 @@ public class ConversationFragment extends Fragment implements EditMessage.Keyboa
}
}
+ private void changeEmojiKeyboardIcon(ImageView iconToBeChanged, int drawableResourceId){
+ iconToBeChanged.setImageResource(drawableResourceId);
+ }
+
}
diff --git a/src/main/java/eu/siacs/conversations/ui/EditMessage.java b/src/main/java/eu/siacs/conversations/ui/EditMessage.java
index a58cf2b8..a7aa2024 100644
--- a/src/main/java/eu/siacs/conversations/ui/EditMessage.java
+++ b/src/main/java/eu/siacs/conversations/ui/EditMessage.java
@@ -7,8 +7,9 @@ import android.view.KeyEvent;
import android.widget.EditText;
import eu.siacs.conversations.Config;
+import github.ankushsachdeva.emojicon.EmojiconEditText;
-public class EditMessage extends EditText {
+public class EditMessage extends EmojiconEditText {
public EditMessage(Context context, AttributeSet attrs) {
super(context, attrs);
diff --git a/src/main/java/eu/siacs/conversations/ui/SettingsActivity.java b/src/main/java/eu/siacs/conversations/ui/SettingsActivity.java
index 6e5fe610..f9238f13 100644
--- a/src/main/java/eu/siacs/conversations/ui/SettingsActivity.java
+++ b/src/main/java/eu/siacs/conversations/ui/SettingsActivity.java
@@ -1,6 +1,21 @@
package eu.siacs.conversations.ui;
+import java.security.KeyStoreException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Locale;
+
+import de.tzur.conversations.Settings;
+import de.duenndns.ssl.MemorizingTrustManager;
+
+import eu.siacs.conversations.R;
+import eu.siacs.conversations.entities.Account;
+import eu.siacs.conversations.xmpp.XmppConnection;
+import github.ankushsachdeva.emojicon.EmojiconHandler;
+
import android.app.AlertDialog;
+import android.app.Fragment;
import android.app.FragmentManager;
import android.content.DialogInterface;
import android.content.SharedPreferences;
@@ -12,17 +27,6 @@ import android.preference.Preference;
import android.preference.PreferenceManager;
import android.widget.Toast;
-import java.security.KeyStoreException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Locale;
-
-import de.duenndns.ssl.MemorizingTrustManager;
-import eu.siacs.conversations.R;
-import eu.siacs.conversations.entities.Account;
-import eu.siacs.conversations.xmpp.XmppConnection;
-
public class SettingsActivity extends XmppActivity implements
OnSharedPreferenceChangeListener {
private SettingsFragment mSettingsFragment;
@@ -130,37 +134,46 @@ public class SettingsActivity extends XmppActivity implements
@Override
public void onSharedPreferenceChanged(SharedPreferences preferences,
String name) {
- if (name.equals("resource")) {
- String resource = preferences.getString("resource", "mobile")
- .toLowerCase(Locale.US);
- if (xmppConnectionServiceBound) {
- for (Account account : xmppConnectionService.getAccounts()) {
- if (account.setResource(resource)) {
+ // need to synchronize the settings class first
+ Settings.synchronizeSettingsClassWithPreferences(getPreferences(), name);
+ switch (name) {
+ case "resource":
+ String resource = preferences.getString("resource", "mobile")
+ .toLowerCase(Locale.US);
+ if (xmppConnectionServiceBound) {
+ for (Account account : xmppConnectionService.getAccounts()) {
+ if (account.setResource(resource)) {
+ if (!account.isOptionSet(Account.OPTION_DISABLED)) {
+ XmppConnection connection = account.getXmppConnection();
+ if (connection != null) {
+ connection.resetStreamId();
+ }
+ xmppConnectionService.reconnectAccountInBackground(account);
+ }
+ }
+ }
+ }
+ break;
+ case "keep_foreground_service":
+ xmppConnectionService.toggleForegroundService();
+ break;
+ case "confirm_messages":
+ if (xmppConnectionServiceBound) {
+ for (Account account : xmppConnectionService.getAccounts()) {
if (!account.isOptionSet(Account.OPTION_DISABLED)) {
- XmppConnection connection = account.getXmppConnection();
- if (connection != null) {
- connection.resetStreamId();
- }
- xmppConnectionService.reconnectAccountInBackground(account);
+ xmppConnectionService.sendPresence(account);
}
}
}
- }
- } else if (name.equals("keep_foreground_service")) {
- xmppConnectionService.toggleForegroundService();
- } else if (name.equals("confirm_messages")) {
- if (xmppConnectionServiceBound) {
- for (Account account : xmppConnectionService.getAccounts()) {
- if (!account.isOptionSet(Account.OPTION_DISABLED)) {
- xmppConnectionService.sendPresence(account);
- }
- }
- }
- } else if (name.equals("dont_trust_system_cas")) {
- xmppConnectionService.updateMemorizingTrustmanager();
- reconnectAccounts();
+ break;
+ case "dont_trust_system_cas":
+ xmppConnectionService.updateMemorizingTrustmanager();
+ reconnectAccounts();
+ break;
+ case "parse_emoticons":
+ EmojiconHandler.setParseEmoticons(Settings.PARSE_EMOTICONS);
+ break;
}
-
}
private void displayToast(final String msg) {
diff --git a/src/main/java/eu/siacs/conversations/ui/XmppActivity.java b/src/main/java/eu/siacs/conversations/ui/XmppActivity.java
index 7734dc11..2d780eda 100644
--- a/src/main/java/eu/siacs/conversations/ui/XmppActivity.java
+++ b/src/main/java/eu/siacs/conversations/ui/XmppActivity.java
@@ -68,6 +68,7 @@ import java.util.Hashtable;
import java.util.List;
import java.util.concurrent.RejectedExecutionException;
+import de.tzur.conversations.Settings;
import eu.siacs.conversations.Config;
import eu.siacs.conversations.R;
import eu.siacs.conversations.crypto.axolotl.XmppAxolotlSession;
@@ -361,6 +362,9 @@ public abstract class XmppActivity extends Activity {
setTheme(this.mTheme);
this.mUsingEnterKey = usingEnterKey();
mUseSubject = getPreferences().getBoolean("use_subject", true);
+
+ Settings.initSettingsClassWithPreferences(getPreferences());
+
final ActionBar ab = getActionBar();
if (ab!=null) {
ab.setDisplayHomeAsUpEnabled(true);
diff --git a/src/main/java/eu/siacs/conversations/ui/adapter/AccountAdapter.java b/src/main/java/eu/siacs/conversations/ui/adapter/AccountAdapter.java
index 98250af9..141dbc3a 100644
--- a/src/main/java/eu/siacs/conversations/ui/adapter/AccountAdapter.java
+++ b/src/main/java/eu/siacs/conversations/ui/adapter/AccountAdapter.java
@@ -8,6 +8,7 @@ import android.widget.ArrayAdapter;
import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.TextView;
+import android.widget.Switch;
import java.util.List;
diff --git a/src/main/java/eu/siacs/conversations/ui/adapter/ConversationAdapter.java b/src/main/java/eu/siacs/conversations/ui/adapter/ConversationAdapter.java
index 6918713e..b89dd01a 100644
--- a/src/main/java/eu/siacs/conversations/ui/adapter/ConversationAdapter.java
+++ b/src/main/java/eu/siacs/conversations/ui/adapter/ConversationAdapter.java
@@ -19,13 +19,29 @@ import java.lang.ref.WeakReference;
import java.util.List;
import java.util.concurrent.RejectedExecutionException;
+import de.tzur.conversations.Settings;
+import eu.siacs.conversations.Config;
import eu.siacs.conversations.R;
+import eu.siacs.conversations.entities.Account;
import eu.siacs.conversations.entities.Conversation;
import eu.siacs.conversations.entities.Message;
import eu.siacs.conversations.entities.Transferable;
import eu.siacs.conversations.ui.ConversationActivity;
import eu.siacs.conversations.ui.XmppActivity;
import eu.siacs.conversations.utils.UIHelper;
+import github.ankushsachdeva.emojicon.EmojiconTextView;
+
+import android.content.Context;
+import android.graphics.Color;
+import android.graphics.Typeface;
+import android.preference.PreferenceManager;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ArrayAdapter;
+import android.widget.ImageView;
+import android.widget.TextView;
public class ConversationAdapter extends ArrayAdapter<Conversation> {
@@ -56,10 +72,34 @@ public class ConversationAdapter extends ArrayAdapter<Conversation> {
} else {
convName.setText(conversation.getJid().toBareJid().toString());
}
- TextView mLastMessage = (TextView) view.findViewById(R.id.conversation_lastmsg);
+ EmojiconTextView mLastMessage = (EmojiconTextView) view.findViewById(R.id.conversation_lastmsg);
TextView mTimestamp = (TextView) view.findViewById(R.id.conversation_lastupdate);
ImageView imagePreview = (ImageView) view.findViewById(R.id.conversation_lastimage);
+ if (Settings.SHOW_ONLINE_STATUS && conversation != null && conversation.getAccount().getStatus() == Account.State.ONLINE) {
+ TextView status = (TextView) view.findViewById(R.id.status);
+
+ String color = "#000000";
+ if (conversation.getMode() == Conversation.MODE_SINGLE) {
+ switch (conversation.getContact().getMostAvailableStatus()) {
+ case Presences.ONLINE:
+ case Presences.CHAT:
+ color = "#259B23";
+ break;
+ case Presences.AWAY:
+ case Presences.XA:
+ color = "#FF9800";
+ break;
+ case Presences.DND:
+ color = "#E51C23";
+ break;
+ }
+ } else if (conversation.getMode() == Conversation.MODE_MULTI && conversation.getMucOptions().online()) {
+ color = "#259B23";
+ }
+ status.setBackgroundColor(Color.parseColor(color));
+ }
+
Message message = conversation.getLatestMessage();
if (!conversation.isRead()) {
diff --git a/src/main/java/eu/siacs/conversations/ui/adapter/ListItemAdapter.java b/src/main/java/eu/siacs/conversations/ui/adapter/ListItemAdapter.java
index ad7d7622..4187ec60 100644
--- a/src/main/java/eu/siacs/conversations/ui/adapter/ListItemAdapter.java
+++ b/src/main/java/eu/siacs/conversations/ui/adapter/ListItemAdapter.java
@@ -1,5 +1,16 @@
package eu.siacs.conversations.ui.adapter;
+import java.lang.ref.WeakReference;
+import java.util.List;
+import java.util.concurrent.RejectedExecutionException;
+
+import de.tzur.conversations.Settings;
+import eu.siacs.conversations.R;
+import eu.siacs.conversations.entities.ListItem;
+import eu.siacs.conversations.ui.XmppActivity;
+import eu.siacs.conversations.utils.UIHelper;
+import eu.siacs.conversations.xmpp.jid.Jid;
+
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.Resources;
@@ -16,16 +27,6 @@ import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
-import java.lang.ref.WeakReference;
-import java.util.List;
-import java.util.concurrent.RejectedExecutionException;
-
-import eu.siacs.conversations.R;
-import eu.siacs.conversations.entities.ListItem;
-import eu.siacs.conversations.ui.XmppActivity;
-import eu.siacs.conversations.utils.UIHelper;
-import eu.siacs.conversations.xmpp.jid.Jid;
-
public class ListItemAdapter extends ArrayAdapter<ListItem> {
protected XmppActivity activity;
@@ -57,6 +58,12 @@ public class ListItemAdapter extends ArrayAdapter<ListItem> {
if (view == null) {
view = inflater.inflate(R.layout.contact, parent, false);
}
+
+ if (Settings.SHOW_ONLINE_STATUS) {
+ TextView tvStatus = (TextView) view.findViewById(R.id.contact_status);
+ tvStatus.setBackgroundColor(item.getStatusColor());
+ }
+
TextView tvName = (TextView) view.findViewById(R.id.contact_display_name);
TextView tvJid = (TextView) view.findViewById(R.id.contact_jid);
ImageView picture = (ImageView) view.findViewById(R.id.contact_photo);
diff --git a/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java b/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java
index 1ddd6c44..a5b25967 100644
--- a/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java
+++ b/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java
@@ -6,6 +6,7 @@ import android.content.pm.ResolveInfo;
import android.graphics.Color;
import android.graphics.Typeface;
import android.net.Uri;
+import android.preference.PreferenceManager;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.Spanned;
@@ -26,6 +27,8 @@ import android.widget.Toast;
import java.util.List;
+import de.tzur.conversations.Settings;
+import eu.siacs.conversations.Config;
import eu.siacs.conversations.R;
import eu.siacs.conversations.crypto.axolotl.XmppAxolotlSession;
import eu.siacs.conversations.entities.Account;
@@ -38,6 +41,7 @@ import eu.siacs.conversations.entities.Transferable;
import eu.siacs.conversations.ui.ConversationActivity;
import eu.siacs.conversations.utils.GeoHelper;
import eu.siacs.conversations.utils.UIHelper;
+import github.ankushsachdeva.emojicon.EmojiconTextView;
public class MessageAdapter extends ArrayAdapter<Message> {
@@ -279,13 +283,14 @@ public class MessageAdapter extends ArrayAdapter<Message> {
i = body.indexOf(Message.MERGE_SEPARATOR,end);
}
if (message.getType() != Message.TYPE_PRIVATE) {
+
if (message.hasMeCommand()) {
final Spannable span = new SpannableString(formattedBody);
span.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), 0, nick.length(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
viewHolder.messageBody.setText(span);
} else {
- viewHolder.messageBody.setText(formattedBody);
+ viewHolder.messageBody.setText(formattedBody);
}
} else {
String privateMarker;
@@ -424,7 +429,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
.findViewById(R.id.security_indicator);
viewHolder.image = (ImageView) view
.findViewById(R.id.message_image);
- viewHolder.messageBody = (TextView) view
+ viewHolder.messageBody = (EmojiconTextView) view
.findViewById(R.id.message_body);
viewHolder.time = (TextView) view
.findViewById(R.id.message_time);
@@ -444,7 +449,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
.findViewById(R.id.security_indicator);
viewHolder.image = (ImageView) view
.findViewById(R.id.message_image);
- viewHolder.messageBody = (TextView) view
+ viewHolder.messageBody = (EmojiconTextView) view
.findViewById(R.id.message_body);
viewHolder.time = (TextView) view
.findViewById(R.id.message_time);
@@ -555,8 +560,6 @@ public class MessageAdapter extends ArrayAdapter<Message> {
} else {
if (GeoHelper.isGeoUri(message.getBody())) {
displayLocationMessage(viewHolder,message);
- } else if (message.bodyIsHeart()) {
- displayHeartMessage(viewHolder, message.getBody().trim());
} else if (message.treatAsDownloadable() == Message.Decision.MUST) {
displayDownloadableMessage(viewHolder, message, activity.getString(R.string.check_x_filesize, UIHelper.getFileDescriptionString(activity, message)));
} else {
@@ -632,7 +635,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
protected ImageView indicator;
protected ImageView indicatorReceived;
protected TextView time;
- protected TextView messageBody;
+ protected EmojiconTextView messageBody;
protected ImageView contact_picture;
protected TextView status_message;
}
diff --git a/src/main/java/eu/siacs/conversations/ui/listeners/ConversationMoreMessagesLoadedListener.java b/src/main/java/eu/siacs/conversations/ui/listeners/ConversationMoreMessagesLoadedListener.java
new file mode 100644
index 00000000..2154f8d8
--- /dev/null
+++ b/src/main/java/eu/siacs/conversations/ui/listeners/ConversationMoreMessagesLoadedListener.java
@@ -0,0 +1,118 @@
+package eu.siacs.conversations.ui.listeners;
+
+import android.support.v4.widget.SwipeRefreshLayout;
+import android.view.View;
+import android.widget.ListView;
+import android.widget.Toast;
+
+import java.util.List;
+
+import eu.siacs.conversations.entities.Conversation;
+import eu.siacs.conversations.entities.Message;
+import eu.siacs.conversations.services.XmppConnectionService;
+import eu.siacs.conversations.ui.ConversationActivity;
+import eu.siacs.conversations.ui.ConversationFragment;
+import eu.siacs.conversations.ui.adapter.MessageAdapter;
+
+/**
+ * This listener updates the UI when messages are loaded from the server.
+ */
+public class ConversationMoreMessagesLoadedListener implements XmppConnectionService.OnMoreMessagesLoaded {
+ private SwipeRefreshLayout swipeLayout;
+ private List<Message> messageList;
+ private ConversationFragment fragment;
+ private ListView messagesView;
+ private MessageAdapter messageListAdapter;
+ private Toast messageLoaderToast;
+
+ public ConversationMoreMessagesLoadedListener(SwipeRefreshLayout swipeLayout, List<Message> messageList, ConversationFragment fragment, ListView messagesView, MessageAdapter messageListAdapter) {
+ this.swipeLayout = swipeLayout;
+ this.messageList = messageList;
+ this.fragment = fragment;
+ this.messagesView = messagesView;
+ this.messageListAdapter = messageListAdapter;
+ }
+
+ @Override
+ public void onMoreMessagesLoaded(final int c, final Conversation conversation) {
+ ConversationActivity activity = (ConversationActivity) fragment.getActivity();
+ if (activity.getSelectedConversation() != conversation) {
+ activity.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ swipeLayout.setRefreshing(false);
+ }
+ });
+ return;
+ }
+ if (0 == c) {
+ activity.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ swipeLayout.setRefreshing(false);
+ }
+ });
+ }
+ activity.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ final int oldPosition = messagesView.getFirstVisiblePosition();
+ int pos = 0;
+ View v = messagesView.getChildAt(0);
+ final int pxOffset = (v == null) ? 0 : v.getTop();
+ if (-1 < oldPosition && messageList.size() > oldPosition) {
+ Message message = messageList.get(oldPosition);
+ String uuid = message != null ? message.getUuid() : null;
+ pos = getIndexOf(uuid, messageList);
+ }
+ conversation.populateWithMessages(messageList);
+ fragment.updateStatusMessages();
+ messageListAdapter.notifyDataSetChanged();
+ messagesView.setSelectionFromTop(pos, pxOffset);
+
+ if (messageLoaderToast != null) {
+ messageLoaderToast.cancel();
+ }
+ swipeLayout.setRefreshing(false);
+ }
+ });
+ }
+
+ @Override
+ public void informUser(final int resId) {
+ final ConversationActivity activity = (ConversationActivity) fragment.getActivity();
+
+ activity.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ if (messageLoaderToast != null) {
+ messageLoaderToast.cancel();
+ }
+ messageLoaderToast = Toast.makeText(activity, resId, Toast.LENGTH_LONG);
+ messageLoaderToast.show();
+ }
+ });
+
+ }
+
+ private int getIndexOf(String uuid, List<Message> messages) {
+ if (uuid == null) {
+ return 0;
+ }
+ for(int i = 0; i < messages.size(); ++i) {
+ if (uuid.equals(messages.get(i).getUuid())) {
+ return i;
+ } else {
+ Message next = messages.get(i);
+ while(next != null && next.wasMergedIntoPrevious()) {
+ if (uuid.equals(next.getUuid())) {
+ return i;
+ }
+ next = next.next();
+ }
+
+ }
+ }
+ return 0;
+ }
+}
diff --git a/src/main/java/eu/siacs/conversations/ui/listeners/ConversationSwipeRefreshListener.java b/src/main/java/eu/siacs/conversations/ui/listeners/ConversationSwipeRefreshListener.java
new file mode 100644
index 00000000..09a8d730
--- /dev/null
+++ b/src/main/java/eu/siacs/conversations/ui/listeners/ConversationSwipeRefreshListener.java
@@ -0,0 +1,48 @@
+package eu.siacs.conversations.ui.listeners;
+
+import android.support.v4.widget.SwipeRefreshLayout;
+import android.util.Log;
+import android.view.View;
+import android.widget.ListView;
+import android.widget.Toast;
+
+import java.util.List;
+
+import eu.siacs.conversations.Config;
+import eu.siacs.conversations.entities.Conversation;
+import eu.siacs.conversations.entities.Message;
+import eu.siacs.conversations.services.XmppConnectionService;
+import eu.siacs.conversations.ui.ConversationActivity;
+import eu.siacs.conversations.ui.ConversationFragment;
+import eu.siacs.conversations.ui.adapter.MessageAdapter;
+
+/**
+ * This listener starts loading messages from the server.
+ */
+public class ConversationSwipeRefreshListener implements SwipeRefreshLayout.OnRefreshListener {
+ private List<Message> messageList;
+ private ConversationFragment fragment;
+ private ConversationMoreMessagesLoadedListener listener;
+
+ public ConversationSwipeRefreshListener(List<Message> messageList, SwipeRefreshLayout swipeLayout, ConversationFragment fragment, ListView messagesView, MessageAdapter messageListAdapter) {
+ this.messageList = messageList;
+ this.fragment = fragment;
+ this.listener = new ConversationMoreMessagesLoadedListener(swipeLayout, messageList, fragment, messagesView, messageListAdapter);
+ }
+
+ @Override
+ public void onRefresh() {
+ Log.d(Config.LOGTAG, "Refresh swipe container");
+ synchronized (this.messageList) {
+ long timestamp;
+ if (messageList.isEmpty()) {
+ timestamp = System.currentTimeMillis();
+ } else {
+ timestamp = this.messageList.get(0).getTimeSent();
+ }
+ ConversationActivity activity = (ConversationActivity) fragment.getActivity();
+ activity.xmppConnectionService.loadMoreMessages(activity.getSelectedConversation(), timestamp, this.listener);
+ }
+ Log.d(Config.LOGTAG, "End Refresh swipe container");
+ }
+}
diff --git a/src/main/java/eu/siacs/conversations/utils/UIHelper.java b/src/main/java/eu/siacs/conversations/utils/UIHelper.java
index cac23f07..44a38728 100644
--- a/src/main/java/eu/siacs/conversations/utils/UIHelper.java
+++ b/src/main/java/eu/siacs/conversations/utils/UIHelper.java
@@ -11,11 +11,13 @@ import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
+import eu.siacs.conversations.Config;
import eu.siacs.conversations.R;
import eu.siacs.conversations.entities.Contact;
import eu.siacs.conversations.entities.Conversation;
-import eu.siacs.conversations.entities.Message;
+import eu.siacs.conversations.entities.Presences;
import eu.siacs.conversations.entities.Transferable;
+import eu.siacs.conversations.entities.Message;
import eu.siacs.conversations.xmpp.jid.Jid;
public class UIHelper {
@@ -190,7 +192,7 @@ public class UIHelper {
return new Pair<>(context.getString(R.string.location), true);
}
} else{
- return new Pair<>(message.getBody().trim(), false);
+ return new Pair<>(message.getBody(), false);
}
}
}
@@ -241,13 +243,27 @@ public class UIHelper {
}
}
+ public static String getStatusColor(int status) {
+ switch (status) {
+ case Presences.ONLINE:
+ case Presences.CHAT:
+ return "#259B23";
+ case Presences.AWAY:
+ case Presences.XA:
+ return "#FF9800";
+ case Presences.DND:
+ return "#E51C23";
+ }
+ return "#CCCCCC";
+ }
+
private static String getDisplayedMucCounterpart(final Jid counterpart) {
if (counterpart==null) {
return "";
} else if (!counterpart.isBareJid()) {
- return counterpart.getResourcepart().trim();
+ return counterpart.getResourcepart();
} else {
- return counterpart.toString().trim();
+ return counterpart.toString();
}
}
@@ -257,7 +273,7 @@ public class UIHelper {
|| message.getType() != Message.TYPE_TEXT) {
return false;
}
- String body = message.getBody() == null ? null : message.getBody().trim().toLowerCase(Locale.getDefault());
+ String body = message.getBody() == null ? null : message.getBody().toLowerCase(Locale.getDefault());
body = body.replace("?","").replace("¿","");
return LOCATION_QUESTIONS.contains(body);
}
diff --git a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnection.java b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnection.java
index 4f733b10..42b14330 100644
--- a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnection.java
+++ b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnection.java
@@ -355,8 +355,10 @@ public class JingleConnection implements Transferable {
message.setBody(Long.toString(size));
conversation.add(message);
mXmppConnectionService.updateConversationUi();
- if (size < this.mJingleConnectionManager.getAutoAcceptFileSize()) {
- Log.d(Config.LOGTAG, "auto accepting file from "+ packet.getFrom());
+ if (size <= this.mJingleConnectionManager.getAutoAcceptFileSize()
+ && mXmppConnectionService.isDownloadAllowedInConnection()) {
+ Log.d(Config.LOGTAG, "auto accepting file from "
+ + packet.getFrom());
this.acceptedAutomatically = true;
this.sendAccept();
} else {
diff --git a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnectionManager.java b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnectionManager.java
index ab564480..2c888d0f 100644
--- a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnectionManager.java
+++ b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnectionManager.java
@@ -11,6 +11,7 @@ import java.util.concurrent.CopyOnWriteArrayList;
import eu.siacs.conversations.Config;
import eu.siacs.conversations.entities.Account;
+import eu.siacs.conversations.entities.Transferable;
import eu.siacs.conversations.entities.Message;
import eu.siacs.conversations.entities.Transferable;
import eu.siacs.conversations.services.AbstractConnectionManager;
diff --git a/src/main/project.properties b/src/main/project.properties
new file mode 100644
index 00000000..4ab12569
--- /dev/null
+++ b/src/main/project.properties
@@ -0,0 +1,14 @@
+# This file is automatically generated by Android Tools.
+# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
+#
+# This file must be checked in Version Control Systems.
+#
+# To customize properties used by the Ant build system edit
+# "ant.properties", and override values to adapt the script to your
+# project structure.
+#
+# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
+#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
+
+# Project target.
+target=android-19
diff --git a/src/main/res/drawable-hdpi/ic_action_keyboard.png b/src/main/res/drawable-hdpi/ic_action_keyboard.png
new file mode 100644
index 00000000..37c04af2
--- /dev/null
+++ b/src/main/res/drawable-hdpi/ic_action_keyboard.png
Binary files differ
diff --git a/src/main/res/drawable-hdpi/smiley.png b/src/main/res/drawable-hdpi/smiley.png
new file mode 100644
index 00000000..c841c4c0
--- /dev/null
+++ b/src/main/res/drawable-hdpi/smiley.png
Binary files differ
diff --git a/src/main/res/drawable-mdpi/ic_action_keyboard.png b/src/main/res/drawable-mdpi/ic_action_keyboard.png
new file mode 100644
index 00000000..481e4222
--- /dev/null
+++ b/src/main/res/drawable-mdpi/ic_action_keyboard.png
Binary files differ
diff --git a/src/main/res/drawable-mdpi/smiley.png b/src/main/res/drawable-mdpi/smiley.png
new file mode 100644
index 00000000..9f6d6511
--- /dev/null
+++ b/src/main/res/drawable-mdpi/smiley.png
Binary files differ
diff --git a/src/main/res/drawable-xhdpi/ic_action_keyboard.png b/src/main/res/drawable-xhdpi/ic_action_keyboard.png
new file mode 100644
index 00000000..c1af1a2f
--- /dev/null
+++ b/src/main/res/drawable-xhdpi/ic_action_keyboard.png
Binary files differ
diff --git a/src/main/res/drawable-xhdpi/smiley.png b/src/main/res/drawable-xhdpi/smiley.png
new file mode 100644
index 00000000..b06e0073
--- /dev/null
+++ b/src/main/res/drawable-xhdpi/smiley.png
Binary files differ
diff --git a/src/main/res/drawable-xxhdpi/ic_action_keyboard.png b/src/main/res/drawable-xxhdpi/ic_action_keyboard.png
new file mode 100644
index 00000000..a4668c41
--- /dev/null
+++ b/src/main/res/drawable-xxhdpi/ic_action_keyboard.png
Binary files differ
diff --git a/src/main/res/drawable-xxhdpi/smiley.png b/src/main/res/drawable-xxhdpi/smiley.png
new file mode 100644
index 00000000..2f11d408
--- /dev/null
+++ b/src/main/res/drawable-xxhdpi/smiley.png
Binary files differ
diff --git a/src/main/res/layout/account_row.xml b/src/main/res/layout/account_row.xml
index cac9a9fa..1837475c 100644
--- a/src/main/res/layout/account_row.xml
+++ b/src/main/res/layout/account_row.xml
@@ -1,21 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:background="?android:attr/activatedBackgroundIndicator"
- android:paddingLeft="8dp"
- android:paddingBottom="8dp"
- android:paddingTop="8dp">
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:background="?android:attr/activatedBackgroundIndicator"
+ android:paddingLeft="8dp"
+ android:paddingBottom="8dp"
+ android:paddingTop="8dp">
- <com.makeramen.roundedimageview.RoundedImageView
+ <ImageView
android:id="@+id/account_image"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_alignParentLeft="true"
android:src="@drawable/ic_profile"
- android:contentDescription="@string/account_image_description"
- app:riv_corner_radius="2dp" />
+ android:contentDescription="@string/account_image_description">
+ </ImageView>
<LinearLayout
android:layout_width="fill_parent"
@@ -46,14 +46,13 @@
android:textStyle="bold" />
</LinearLayout>
- <eu.siacs.conversations.ui.widget.Switch
- style="@style/MD"
+ <Switch
android:id="@+id/tgl_account_status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
- android:padding="16dp"
+ android:padding="8dp"
android:focusable="false"/>
</RelativeLayout> \ No newline at end of file
diff --git a/src/main/res/layout/activity_edit_account.xml b/src/main/res/layout/activity_edit_account.xml
index 0be934a8..9d7a670b 100644
--- a/src/main/res/layout/activity_edit_account.xml
+++ b/src/main/res/layout/activity_edit_account.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
+ xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
android:background="@color/grey200">
<ScrollView
@@ -28,14 +28,12 @@
android:background="@drawable/infocard_border"
android:orientation="vertical"
android:padding="@dimen/infocard_padding">
- <com.makeramen.roundedimageview.RoundedImageView
- android:id="@+id/avater"
+ <ImageView android:id="@+id/avater"
android:layout_width="72dp"
android:layout_height="72dp"
android:layout_alignParentTop="true"
android:layout_marginRight="16dp"
- android:contentDescription="@string/account_image_description"
- app:riv_corner_radius="2dp"/>
+ android:contentDescription="@string/account_image_description"/>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
diff --git a/src/main/res/layout/activity_muc_details.xml b/src/main/res/layout/activity_muc_details.xml
index 6edbb706..8c75760a 100644
--- a/src/main/res/layout/activity_muc_details.xml
+++ b/src/main/res/layout/activity_muc_details.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:background="@color/grey200">
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:background="@color/grey200">
<LinearLayout
android:layout_width="fill_parent"
@@ -36,13 +36,13 @@
android:layout_height="wrap_content"
android:layout_marginBottom="32dp">
- <com.makeramen.roundedimageview.RoundedImageView
+ <ImageView
android:id="@+id/your_photo"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_alignParentLeft="true"
- android:src="@drawable/ic_profile"
- app:riv_corner_radius="2dp" />
+ android:src="@drawable/ic_profile">
+ </ImageView>
<LinearLayout
android:layout_width="fill_parent"
diff --git a/src/main/res/layout/contact.xml b/src/main/res/layout/contact.xml
index 56443c34..29cd9886 100644
--- a/src/main/res/layout/contact.xml
+++ b/src/main/res/layout/contact.xml
@@ -6,14 +6,13 @@
android:background="?android:attr/activatedBackgroundIndicator"
android:padding="8dp">
- <com.makeramen.roundedimageview.RoundedImageView
+ <ImageView
android:id="@+id/contact_photo"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_alignParentLeft="true"
android:scaleType="centerCrop"
- android:src="@drawable/ic_profile"
- app:riv_corner_radius="2dp" />
+ android:src="@drawable/ic_profile" />
<LinearLayout
android:layout_width="wrap_content"
diff --git a/src/main/res/layout/contact_key.xml b/src/main/res/layout/contact_key.xml
index a4fd29e9..f0bd2fc1 100644
--- a/src/main/res/layout/contact_key.xml
+++ b/src/main/res/layout/contact_key.xml
@@ -56,7 +56,7 @@
android:visibility="gone" />
- <eu.siacs.conversations.ui.widget.Switch
+ <Switch
android:id="@+id/tgl_trust"
android:visibility="invisible"
android:layout_width="wrap_content"
diff --git a/src/main/res/layout/conversation_list_row.xml b/src/main/res/layout/conversation_list_row.xml
index 15fa60af..21b0f389 100644
--- a/src/main/res/layout/conversation_list_row.xml
+++ b/src/main/res/layout/conversation_list_row.xml
@@ -7,7 +7,7 @@
<View
android:layout_width="fill_parent"
android:layout_height="fill_parent"
- android:background="@color/green500"/>
+ android:background="@color/red500"/>
<FrameLayout
android:id="@+id/swipeable_item"
@@ -22,13 +22,12 @@
android:orientation="horizontal"
android:padding="8dp" >
- <com.makeramen.roundedimageview.RoundedImageView
+ <ImageView
android:id="@+id/conversation_image"
android:layout_width="56dp"
android:layout_height="56dp"
android:layout_alignParentLeft="true"
- android:scaleType="centerCrop"
- app:riv_corner_radius="2dp" />
+ android:scaleType="centerCrop" />
<RelativeLayout
android:layout_width="fill_parent"
@@ -56,14 +55,15 @@
android:orientation="vertical"
android:paddingTop="3dp" >
- <TextView
+ <github.ankushsachdeva.emojicon.EmojiconTextView
android:id="@+id/conversation_lastmsg"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:scrollHorizontally="false"
android:singleLine="true"
android:textColor="@color/black87"
- android:textSize="?attr/TextSizeBody" />
+ android:textSize="?attr/TextSizeBody"
+ emojicon:emojiconSize="20sp" />
<ImageView
android:id="@+id/conversation_lastimage"
diff --git a/src/main/res/layout/fragment_conversation.xml b/src/main/res/layout/fragment_conversation.xml
index db92c05f..927e7239 100644
--- a/src/main/res/layout/fragment_conversation.xml
+++ b/src/main/res/layout/fragment_conversation.xml
@@ -5,6 +5,13 @@
android:layout_height="match_parent"
android:background="@color/grey200" >
+ <android.support.v4.widget.SwipeRefreshLayout
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_above="@+id/snackbar"
+ android:layout_alignParentLeft="true"
+ android:layout_alignParentTop="true"
+ android:id="@+id/swipe_refresh_container">
<ListView
android:id="@+id/messages_view"
android:layout_width="fill_parent"
@@ -20,6 +27,7 @@
android:transcriptMode="normal"
tools:listitem="@layout/message_sent">
</ListView>
+ </android.support.v4.widget.SwipeRefreshLayout>
<RelativeLayout
android:id="@+id/textsend"
@@ -33,8 +41,8 @@
android:id="@+id/textinput"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_alignParentLeft="true"
android:layout_toLeftOf="@+id/textSendButton"
+ android:layout_toRightOf="@+id/emoji_btn"
android:background="@color/grey50"
android:ems="10"
android:imeOptions="flagNoExtractUi|actionSend"
@@ -58,6 +66,15 @@
android:layout_centerVertical="true"
android:background="?android:selectableItemBackground"
android:src="@drawable/ic_send_text_offline" />
+
+ <ImageView
+ android:layout_width="48dp"
+ android:layout_height="48dp"
+ android:id="@+id/emoji_btn"
+ android:layout_centerVertical="true"
+ android:layout_alignParentLeft="true"
+ android:padding="4dp"
+ android:src="@drawable/smiley" />
</RelativeLayout>
<RelativeLayout
diff --git a/src/main/res/layout/message_received.xml b/src/main/res/layout/message_received.xml
index 76df710b..fefe6af1 100644
--- a/src/main/res/layout/message_received.xml
+++ b/src/main/res/layout/message_received.xml
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:emojicon="http://schemas.android.com/apk/res-auto"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
@@ -9,15 +10,14 @@
android:paddingRight="8dp"
android:paddingTop="3dp">
- <com.makeramen.roundedimageview.RoundedImageView
+ <ImageView
android:id="@+id/message_photo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:scaleType="fitXY"
- android:src="@drawable/ic_profile"
- app:riv_corner_radius="2dp" />
+ android:src="@drawable/ic_profile" />
<LinearLayout
android:id="@+id/message_box"
@@ -48,7 +48,7 @@
android:background="@color/black87"
android:scaleType="centerCrop" />
- <TextView
+ <github.ankushsachdeva.emojicon.EmojiconTextView
android:id="@+id/message_body"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@@ -56,7 +56,8 @@
android:textColorLink="@color/white"
android:textColor="@color/white"
android:textColorHighlight="@color/grey800"
- android:textSize="?attr/TextSizeBody" />
+ android:textSize="?attr/TextSizeBody"
+ emojicon:emojiconSize="28sp" />
<Button
android:id="@+id/download_button"
diff --git a/src/main/res/layout/message_sent.xml b/src/main/res/layout/message_sent.xml
index e3b38cd9..cf7322ee 100644
--- a/src/main/res/layout/message_sent.xml
+++ b/src/main/res/layout/message_sent.xml
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:emojicon="http://schemas.android.com/apk/res-auto"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
@@ -9,7 +10,7 @@
android:paddingRight="8dp"
android:paddingTop="3dp">
- <com.makeramen.roundedimageview.RoundedImageView
+ <ImageView
android:id="@+id/message_photo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@@ -18,8 +19,7 @@
android:src="@drawable/ic_profile"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
- android:layout_alignParentEnd="true"
- app:riv_corner_radius="2dp" />
+ android:layout_alignParentEnd="true"" />
<LinearLayout
android:id="@+id/message_box"
@@ -49,7 +49,7 @@
android:background="@color/black87"
android:scaleType="centerCrop" />
- <TextView
+ <github.ankushsachdeva.emojicon.EmojiconTextView
android:id="@+id/message_body"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@@ -57,7 +57,8 @@
android:textColorLink="@color/black87"
android:textColor="@color/black87"
android:textColorHighlight="@color/grey500"
- android:textSize="?attr/TextSizeBody" />
+ android:textSize="?attr/TextSizeBody"
+ emojicon:emojiconSize="28sp" />
<Button
android:id="@+id/download_button"
diff --git a/src/main/res/values-ar-rEG/strings.xml b/src/main/res/values-ar-rEG/strings.xml
index 0d85e55c..5c94b966 100644
--- a/src/main/res/values-ar-rEG/strings.xml
+++ b/src/main/res/values-ar-rEG/strings.xml
@@ -96,7 +96,7 @@
<string name="pref_general">عام</string>
<string name="pref_xmpp_resource">الريسورس</string>
<string name="pref_accept_files">ضبط استقبال الملفات</string>
- <string name="pref_accept_files_summary">اقبل تلقائيا الملفات أقل من</string>
+ <string name="pref_accept_files_size_summary">اقبل تلقائيا الملفات أقل من</string>
<string name="pref_notification_settings">اعدادات الإشعارات</string>
<string name="pref_notifications">الإشعارات</string>
<string name="pref_notifications_summary">أخبرني عندما تصل رساله جديده</string>
diff --git a/src/main/res/values-bg/strings.xml b/src/main/res/values-bg/strings.xml
index e21a6cee..1ee8a7d6 100644
--- a/src/main/res/values-bg/strings.xml
+++ b/src/main/res/values-bg/strings.xml
@@ -98,7 +98,7 @@
<string name="pref_xmpp_resource">XMPP ресурс</string>
<string name="pref_xmpp_resource_summary">Името, с което се определя този клиент</string>
<string name="pref_accept_files">Приемане на файлове</string>
- <string name="pref_accept_files_summary">Автоматично приемане на файлове с размер, по-малък от...</string>
+ <string name="pref_accept_files_size_summary">Автоматично приемане на файлове с размер, по-малък от...</string>
<string name="pref_notification_settings">Настройки за известията</string>
<string name="pref_notifications">Известия</string>
<string name="pref_notifications_summary">Известяване при получаване на ново съобщение</string>
diff --git a/src/main/res/values-de/strings.xml b/src/main/res/values-de/strings.xml
index 178738ea..f1cf580d 100644
--- a/src/main/res/values-de/strings.xml
+++ b/src/main/res/values-de/strings.xml
@@ -1,104 +1,111 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
- <string name="action_settings">Einstellungen</string>
- <string name="action_add">Neue Unterhaltung</string>
- <string name="action_accounts">Konten verwalten</string>
- <string name="action_end_conversation">Unterhaltung beenden</string>
+ <string name="action_settings">Einstellungen</string>
+ <string name="action_add">Neue Unterhaltung</string>
+ <string name="action_accounts">Konten verwalten</string>
+ <string name="action_end_conversation">Unterhaltung beenden</string>
<string name="action_contact_details">Kontakt-Details</string>
<string name="action_muc_details">Konferenz-Details</string>
- <string name="action_secure">Verschlüsselte Unterhaltung</string>
- <string name="action_add_account">Konto hinzufügen</string>
+ <string name="action_secure">Verschlüsselte Unterhaltung</string>
+ <string name="action_add_account">Konto hinzufügen</string>
<string name="action_edit_contact">Namen bearbeiten</string>
- <string name="action_add_phone_book">Zum Telefonbuch hinzufügen</string>
- <string name="action_delete_contact">Aus Kontaktliste entfernen</string>
- <string name="action_block_contact">Kontakt sperren</string>
- <string name="action_unblock_contact">Kontakt entsperren</string>
- <string name="action_block_domain">Domain sperren</string>
- <string name="action_unblock_domain">Domain entsperren</string>
- <string name="title_activity_manage_accounts">Konten verwalten</string>
- <string name="title_activity_settings">Einstellungen</string>
+ <string name="action_add_phone_book">Zum Telefonbuch hinzufügen</string>
+ <string name="action_delete_contact">Aus Kontaktliste entfernen</string>
+ <string name="action_block_contact">Kontakt sperren</string>
+ <string name="action_unblock_contact">Kontakt entsperren</string>
+ <string name="action_block_domain">Domain sperren</string>
+ <string name="action_unblock_domain">Domain entsperren</string>
+ <string name="title_activity_manage_accounts">Konten verwalten</string>
+ <string name="title_activity_settings">Einstellungen</string>
<string name="title_activity_conference_details">Konferenz-Details</string>
<string name="title_activity_contact_details">Kontakt-Details</string>
- <string name="title_activity_sharewith">Mit Unterhaltung teilen</string>
- <string name="title_activity_start_conversation">Beginne Unterhaltung</string>
- <string name="title_activity_choose_contact">Kontakt auswählen</string>
- <string name="title_activity_block_list">Sperrliste</string>
- <string name="just_now">gerade</string>
- <string name="minute_ago">vor einer Minute</string>
- <string name="minutes_ago">vor %d Minuten</string>
- <string name="unread_conversations">ungelesene Unterhaltungen</string>
+ <string name="title_activity_sharewith">Mit Unterhaltung teilen</string>
+ <string name="title_activity_start_conversation">Beginne Unterhaltung</string>
+ <string name="title_activity_choose_contact">Kontakt auswählen</string>
+ <string name="title_activity_block_list">Sperrliste</string>
+ <string name="just_now">gerade</string>
+ <string name="minute_ago">vor einer Minute</string>
+ <string name="minutes_ago">vor %d Minuten</string>
+ <string name="unread_conversations">ungelesene Unterhaltungen</string>
<string name="sending">senden…</string>
<string name="encrypted_message">Entschlüssele Nachricht. Bitte warten…</string>
- <string name="nick_in_use">Nickname wird bereits verwendet</string>
- <string name="admin">Administrator</string>
- <string name="owner">Eigentümer</string>
- <string name="moderator">Moderator</string>
- <string name="participant">Teilnehmer</string>
- <string name="visitor">Besucher</string>
- <string name="remove_contact_text">Möchtest du %s von deiner Kontaktliste entfernen? Die Unterhaltung mit diesem Kontakt wird dabei nicht entfernt.</string>
- <string name="block_contact_text">Möchtest du %s sperren und keine Nachrichten mehr erhalten?</string>
- <string name="unblock_contact_text">Möchtest du %s entsperren und wieder Nachrichten empfangen?</string>
- <string name="block_domain_text">Sperre alle Kontakte von %s?</string>
- <string name="unblock_domain_text">Entsperre alle Kontakte %s?</string>
- <string name="contact_blocked">Kontakt gesperrt</string>
+ <string name="nick_in_use">Nickname wird bereits verwendet</string>
+ <string name="admin">Administrator</string>
+ <string name="owner">Eigentümer</string>
+ <string name="moderator">Moderator</string>
+ <string name="participant">Teilnehmer</string>
+ <string name="visitor">Besucher</string>
+ <string name="remove_contact_text">Möchtest du %s von deiner Kontaktliste entfernen? Die Unterhaltung mit diesem Kontakt wird dabei nicht entfernt.</string>
+ <string name="block_contact_text">Möchtest du %s sperren und keine Nachrichten mehr erhalten?</string>
+ <string name="unblock_contact_text">Möchtest du %s entsperren und wieder Nachrichten empfangen?</string>
+ <string name="block_domain_text">Sperre alle Kontakte von %s?</string>
+ <string name="unblock_domain_text">Entsperre alle Kontakte %s?</string>
+ <string name="contact_blocked">Kontakt gesperrt</string>
<string name="remove_bookmark_text">Möchtest du %s von deiner Kontaktliste entfernen? Die Unterhaltung mit dieser Konferenz wird dabei nicht entfernt.</string>
- <string name="register_account">Neues Konto auf dem Server erstellen</string>
- <string name="change_password_on_server">Passwort ändern</string>
+ <string name="register_account">Neues Konto auf dem Server erstellen</string>
+ <string name="change_password_on_server">Passwort ändern</string>
<string name="share_with">Teile mit…</string>
- <string name="start_conversation">Beginne Unterhaltung</string>
- <string name="invite_contact">Kontakt einladen</string>
- <string name="contacts">Kontakte</string>
- <string name="cancel">Abbrechen</string>
- <string name="set">Einstellen</string>
- <string name="add">Hinzufügen</string>
- <string name="edit">Bearbeiten</string>
- <string name="delete">Entfernen</string>
- <string name="block">Sperren</string>
- <string name="unblock">Entsperren</string>
- <string name="save">Speichern</string>
- <string name="ok">OK</string>
- <string name="crash_report_title">Conversations ist abgestürzt</string>
- <string name="crash_report_message">Durch das Einsenden von Fehlerberichten hilfst du bei der stetigen Verbesserung von Conversations.\n<b>Achtung:</b> Dies wird eines deiner XMPP-Konten benutzen, um den Entwickler zu kontaktieren.</string>
- <string name="send_now">Jetzt abschicken</string>
- <string name="send_never">Nie mehr nachfragen</string>
- <string name="problem_connecting_to_account">Es gibt Probleme beim Verbindungsaufbau mit einem Konto</string>
- <string name="problem_connecting_to_accounts">Es gibt Probleme beim Verbindungsaufbau mit mehreren Konten</string>
- <string name="touch_to_fix">Drücke hier, um das Konto zu verwalten</string>
- <string name="attach_file">Datei anfügen</string>
- <string name="not_in_roster">Der Kontakt ist nicht in deiner Kontaktliste. Möchtest du ihn hinzufügen?</string>
+ <string name="start_conversation">Beginne Unterhaltung</string>
+ <string name="invite_contact">Kontakt einladen</string>
+ <string name="contacts">Kontakte</string>
+ <string name="cancel">Abbrechen</string>
+ <string name="set">Einstellen</string>
+ <string name="add">Hinzufügen</string>
+ <string name="edit">Bearbeiten</string>
+ <string name="delete">Entfernen</string>
+ <string name="block">Sperren</string>
+ <string name="unblock">Entsperren</string>
+ <string name="save">Speichern</string>
+ <string name="ok">OK</string>
+ <string name="crash_report_title">Conversations ist abgestürzt</string>
+ <string name="crash_report_message">Durch das Einsenden von Fehlerberichten hilfst du bei der stetigen Verbesserung von Conversations.\n<b>Achtung:</b> Dies wird eines deiner XMPP-Konten benutzen, um den Entwickler zu kontaktieren.</string>
+ <string name="send_now">Jetzt abschicken</string>
+ <string name="send_never">Nie mehr nachfragen</string>
+ <string name="problem_connecting_to_account">Es gibt Probleme beim Verbindungsaufbau mit einem Konto</string>
+ <string name="problem_connecting_to_accounts">Es gibt Probleme beim Verbindungsaufbau mit mehreren Konten</string>
+ <string name="touch_to_fix">Drücke hier, um das Konto zu verwalten</string>
+ <string name="attach_file">Datei anfügen</string>
+ <string name="not_in_roster">Der Kontakt ist nicht in deiner Kontaktliste. Möchtest du ihn hinzufügen?</string>
<string name="add_contact">Zur Kontaktliste hinzufügen</string>
- <string name="send_failed">Zustellung nicht erfolgreich</string>
- <string name="send_rejected">abgelehnt</string>
- <string name="preparing_image">Bereite Bild für die Übertragung vor</string>
- <string name="action_clear_history">Verlauf löschen</string>
+ <string name="send_failed">Zustellung nicht erfolgreich</string>
+ <string name="send_rejected">abgelehnt</string>
+ <string name="preparing_image">Bereite Bild für die Übertragung vor</string>
+ <string name="action_clear_history">Verlauf löschen</string>
<string name="clear_conversation_history">Verlauf löschen</string>
- <string name="clear_histor_msg">Möchtest du alle Nachrichten in dieser Unterhaltung löschen?\n\n<b>Achtung:</b> Dies beeinflusst nicht Nachrichten, die auf anderen Geräten oder Servern gespeichert sind.</string>
- <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="clear_histor_msg">Möchtest du alle Nachrichten in dieser Unterhaltung löschen?\n\n<b>Achtung:</b> Dies beeinflusst nicht Nachrichten, die auf anderen Geräten oder Servern gespeichert sind.</string>
+ <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_otr_message">OTR-verschlüsselt schreiben…</string>
<string name="send_omemo_message">OMEMO-verschlüsselt schreiben…</string>
<string name="send_pgp_message">OpenPGP-verschlüsselt schreiben…</string>
- <string name="your_nick_has_been_changed">Dein Nickname wurde geändert</string>
+ <string name="your_nick_has_been_changed">Dein Nickname wurde geändert</string>
+ <string name="download_image">Bild herunterladen</string>
<string name="send_unencrypted">Normal verschicken</string>
- <string name="decryption_failed">Entschlüsselung fehlgeschlagen. Vielleicht hast du nicht den richtigen privaten Schlüssel.</string>
- <string name="openkeychain_required">OpenKeychain</string>
- <string name="openkeychain_required_long">Conversations benutzt eine Drittanwendung namens <b>OpenKeychain</b>, um Nachrichten zu ver- und entschlüsseln und um deine Schlüssel zu verwalten.\n\nOpenKeychain ist GPLv3-lizenziert und kann über F-Droid oder Google Play bezogen werden.\n\n<small>(Bitte starte Conversations danach neu.)</small></string>
+ <string name="decryption_failed">Entschlüsselung fehlgeschlagen. Vielleicht hast du nicht den richtigen privaten Schlüssel.</string>
+ <string name="openkeychain_required">OpenKeychain</string>
+ <string name="openkeychain_required_long">Conversations benutzt eine Drittanwendung namens <b>OpenKeychain</b>, um Nachrichten zu ver- und entschlüsseln und um deine Schlüssel zu verwalten.\n\nOpenKeychain ist GPLv3-lizenziert und kann über F-Droid oder Google Play bezogen werden.\n\n<small>(Bitte starte Conversations danach neu.)</small></string>
<string name="restart">Neu starten</string>
- <string name="install">Installieren</string>
+ <string name="install">Installieren</string>
<string name="offering">angeboten…</string>
<string name="waiting">warten…</string>
- <string name="no_pgp_key">Kein OpenPGP-Schlüssel gefunden</string>
- <string name="contact_has_no_pgp_key">Conversations ist nicht in der Lage, deine Nachrichten zu verschlüsseln, weil dein Kontakt seinen oder ihren Schlüssel nicht preisgibt.\n\n<small>Bitte sag deinem Kontakt, er oder sie möge OpenPGP einrichten.</small></string>
- <string name="no_pgp_keys">Keine OpenPGP-Schlüssel gefunden</string>
+ <string name="no_pgp_key">Kein OpenPGP-Schlüssel gefunden</string>
+ <string name="contact_has_no_pgp_key">Conversations ist nicht in der Lage, deine Nachrichten zu verschlüsseln, weil dein Kontakt seinen oder ihren Schlüssel nicht preisgibt.\n\n<small>Bitte sag deinem Kontakt, er oder sie möge OpenPGP einrichten.</small></string>
+ <string name="no_pgp_keys">Keine OpenPGP-Schlüssel gefunden</string>
<string name="contacts_have_no_pgp_keys">Conversations ist nicht in der Lage, deine Nachrichten zu verschlüsseln, weil deine Kontakte ihre Schlüssel nicht preisgeben.\n\n<small>Bitte sage deinen Kontakten, sie mögen OpenPGP einrichten.</small></string>
<string name="encrypted_message_received"><i>Verschlüsselte Nachricht erhalten. Drücke hier, um sie zu entschlüsseln und anzuzeigen.</i></string>
<string name="pref_general">Allgemeines</string>
<string name="pref_xmpp_resource">XMPP-Ressource</string>
<string name="pref_xmpp_resource_summary">Der Name, mit dem sich der Client selbst identifiziert</string>
<string name="pref_accept_files">Dateiannahme</string>
- <string name="pref_accept_files_summary">Dateien, die kleiner sind als …, automatisch annehmen</string>
+ <string name="pref_accept_files_summary">Einstellungen für Dateiannahme und automatischen Download</string>
+ <string name="pref_accept_files_size">Größe</string>
+ <string name="pref_accept_files_size_summary">Dateien, die kleiner sind als …, automatisch annehmen</string>
+ <string name="pref_accept_files_download">nur WLAN</string>
+ <string name="pref_accept_files_download_summary">Automatisches Herunterladen und Akzpetieren von Dateien nur im WLAN</string>
+ <string name="pref_accept_files_download_link">Bilder-Links</string>
+ <string name="pref_accept_files_download_link_summary">Bilder-Links automatisch herunterladen</string>
<string name="pref_notification_settings">Benachrichtigungen</string>
<string name="pref_notifications">Benachrichtigungen</string>
<string name="pref_notifications_summary">Benachrichtige mich, wenn eine neue Nachricht ankommt</string>
@@ -114,8 +121,13 @@
<string name="pref_never_send_crash">Sende niemals Absturzberichte</string>
<string name="pref_never_send_crash_summary">Wenn du Absturzberichte einschickst, hilfst du Conversations stetig zu verbessern</string>
<string name="pref_confirm_messages">Lese- und Empfangsbestätigung senden</string>
- <string name="pref_confirm_messages_summary">Informiere deine Kontakte, wenn du eine Nachricht empfangen und gelesen hast</string>
+ <string name="pref_confirm_messages_summary">Informiere deine Kontakte, wenn du eine Nachricht empfangen oder gelesen hast</string>
+ <string name="pref_confirm_messages_none">Keine Bestätigungen</string>
+ <string name="pref_confirm_messages_received">Nur Empfangsbestätigung</string>
+ <string name="pref_confirm_messages_read_and_received">Lese- und Empfangsbestätigung</string>
<string name="pref_ui_options">Benutzeroberfläche</string>
+ <string name="pref_parse_emoticons">Smilies ersetzen</string>
+ <string name="pref_parse_emoticons_summary">Zeige Smilie-Bilder anstelle von Emoticons.</string>
<string name="openpgp_error">Fehler mit OpenKeychain</string>
<string name="error_decrypting_file">Fehler beim Entschlüsseln der Datei</string>
<string name="accept">Annehmen</string>
@@ -130,15 +142,15 @@
<string name="ask_for_presence_updates">Online-Status anfragen</string>
<string name="attach_choose_picture">Bild auswählen</string>
<string name="attach_take_picture">Bild aufnehmen</string>
- <string name="preemptively_grant">Erlaube Statusanfrage vorab</string>
- <string name="error_not_an_image_file">Die ausgewählte Datei ist kein Bild</string>
- <string name="error_compressing_image">Fehler beim Umwandeln des Bildes</string>
- <string name="error_file_not_found">Datei nicht gefunden</string>
- <string name="error_io_exception">Allgemeiner Fehler. Vielleicht hast du keinen Speicherplatz mehr?</string>
- <string name="error_security_exception_during_image_copy">Die App, mit der du das Bild ausgesucht hast, hat uns keine Rechte eingeräumt, das Bild zu betrachten.\n\n<small>Benutze einen anderen Dateimanager</small></string>
- <string name="account_status_unknown">Unbekannt</string>
- <string name="account_status_disabled">Vorübergehend abgeschaltet</string>
- <string name="account_status_online">Online</string>
+ <string name="preemptively_grant">Erlaube Statusanfrage vorab</string>
+ <string name="error_not_an_image_file">Die ausgewählte Datei ist kein Bild</string>
+ <string name="error_compressing_image">Fehler beim Umwandeln des Bildes</string>
+ <string name="error_file_not_found">Datei nicht gefunden</string>
+ <string name="error_io_exception">Allgemeiner Fehler. Vielleicht hast du keinen Speicherplatz mehr?</string>
+ <string name="error_security_exception_during_image_copy">Die App, mit der du das Bild ausgesucht hast, hat uns keine Rechte eingeräumt, das Bild zu betrachten.\n\n<small>Benutze einen anderen Dateimanager</small></string>
+ <string name="account_status_unknown">Unbekannt</string>
+ <string name="account_status_disabled">Vorübergehend abgeschaltet</string>
+ <string name="account_status_online">Online</string>
<string name="account_status_connecting">Verbinde…</string>
<string name="account_status_offline">Offline</string>
<string name="account_status_unauthorized">Ungültige Zugangsdaten</string>
@@ -162,33 +174,33 @@
<string name="mgmt_account_enable">Anschalten</string>
<string name="mgmt_account_are_you_sure">Bist du dir sicher?</string>
<string name="mgmt_account_delete_confirm_text">Wenn du dein Konto löschst, gehen alle Gesprächsverläufe verloren</string>
- <string name="attach_record_voice">Sprache aufzeichnen</string>
+ <string name="attach_record_voice">Sprache aufzeichnen</string>
<string name="account_settings_jabber_id">Jabber-ID</string>
<string name="account_settings_password">Passwort</string>
- <string name="account_settings_example_jabber_id">benutzer@domain.de</string>
- <string name="account_settings_confirm_password">Passwort bestätigen</string>
- <string name="password">Passwort</string>
- <string name="confirm_password">Passwort bestätigen</string>
- <string name="passwords_do_not_match">Passwörter stimmen nicht überein</string>
- <string name="invalid_jid">Ungültige Jabber-ID</string>
- <string name="error_out_of_memory">Zu wenig Speicher vorhanden. Das Bild ist zu groß</string>
- <string name="add_phone_book_text">Möchtest du %s zum Telefonbuch hinzufügen?</string>
+ <string name="account_settings_example_jabber_id">benutzer@domain.de</string>
+ <string name="account_settings_confirm_password">Passwort bestätigen</string>
+ <string name="password">Passwort</string>
+ <string name="confirm_password">Passwort bestätigen</string>
+ <string name="passwords_do_not_match">Passwörter stimmen nicht überein</string>
+ <string name="invalid_jid">Ungültige Jabber-ID</string>
+ <string name="error_out_of_memory">Zu wenig Speicher vorhanden. Das Bild ist zu groß</string>
+ <string name="add_phone_book_text">Möchtest du %s zum Telefonbuch hinzufügen?</string>
<string name="contact_status_online">online</string>
- <string name="contact_status_free_to_chat">Bereit</string>
- <string name="contact_status_away">Abwesend</string>
- <string name="contact_status_extended_away">Abwesend (erweitert)</string>
- <string name="contact_status_do_not_disturb">Nicht stören</string>
- <string name="contact_status_offline">Offline</string>
- <string name="muc_details_conference">Konferenz</string>
- <string name="muc_details_other_members">Andere Mitglieder</string>
- <string name="server_info_show_more">Server Info</string>
- <string name="server_info_mam">XEP-0313: MAM</string>
- <string name="server_info_carbon_messages">XEP-0280: Message Carbons</string>
+ <string name="contact_status_free_to_chat">Bereit</string>
+ <string name="contact_status_away">Abwesend</string>
+ <string name="contact_status_extended_away">Abwesend (erweitert)</string>
+ <string name="contact_status_do_not_disturb">Nicht stören</string>
+ <string name="contact_status_offline">Offline</string>
+ <string name="muc_details_conference">Konferenz</string>
+ <string name="muc_details_other_members">Andere Mitglieder</string>
+ <string name="server_info_show_more">Server Info</string>
+ <string name="server_info_mam">XEP-0313: MAM</string>
+ <string name="server_info_carbon_messages">XEP-0280: Message Carbons</string>
<string name="server_info_csi">XEP-0352: CSI</string>
- <string name="server_info_blocking">XEP-0191: Blocking Command</string>
- <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_blocking">XEP-0191: Blocking Command</string>
+ <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_available">ja</string>
<string name="server_info_unavailable">nein</string>
<string name="missing_public_keys">Öffentlicher Schlüssel fehlt</string>
@@ -219,40 +231,40 @@
<string name="search">Suche</string>
<string name="create_contact">Kontakt erstellen</string>
<string name="join_conference">Konferenz betreten</string>
- <string name="delete_contact">Kontakt löschen</string>
+ <string name="delete_contact">Kontakt löschen</string>
<string name="view_contact_details">Kontakt-Details anzeigen</string>
- <string name="block_contact">Kontakt sperren</string>
+ <string name="block_contact">Kontakt sperren</string>
<string name="unblock_contact">Kontakt entsperren</string>
- <string name="create">Erstellen</string>
- <string name="contact_already_exists">Der Kontakt existiert bereits</string>
- <string name="join">Beitreten</string>
+ <string name="create">Erstellen</string>
+ <string name="contact_already_exists">Der Kontakt existiert bereits</string>
+ <string name="join">Beitreten</string>
<string name="conference_address">Konferenz-Adresse</string>
<string name="conference_address_example">raum@conference.domain.de</string>
<string name="save_as_bookmark">Zur Kontaktliste hinzufügen</string>
<string name="delete_bookmark">Von Kontaktliste entfernen</string>
<string name="bookmark_already_exists">Die Konferenz befindet sich bereits auf deiner Kontaktliste</string>
- <string name="you">Du</string>
+ <string name="you">Du</string>
<string name="action_edit_subject">Konferenz-Thema anpassen</string>
- <string name="conference_not_found">Konferenz nicht gefunden</string>
- <string name="leave">Verlassen</string>
- <string name="contact_added_you">Der Kontakt hat dich zur Kontaktliste hinzugefügt</string>
- <string name="add_back">Auch hinzufügen</string>
- <string name="contact_has_read_up_to_this_point">%s hat bis zu diesem Punkt gelesen</string>
- <string name="publish">Veröffentlichen</string>
+ <string name="conference_not_found">Konferenz nicht gefunden</string>
+ <string name="leave">Verlassen</string>
+ <string name="contact_added_you">Der Kontakt hat dich zur Kontaktliste hinzugefügt</string>
+ <string name="add_back">Auch hinzufügen</string>
+ <string name="contact_has_read_up_to_this_point">%s hat bis zu diesem Punkt gelesen</string>
+ <string name="publish">Veröffentlichen</string>
<string name="touch_to_choose_picture">Hier klicken, um einen Avatar auszuwählen</string>
- <string name="publish_avatar_explanation">Achtung: Jeder, der deinen Status sehen darf, sieht auch deinen Avatar.</string>
+ <string name="publish_avatar_explanation">Achtung: Jeder, der deinen Status sehen darf, sieht auch deinen Avatar.</string>
<string name="publishing">Veröffentliche…</string>
- <string name="error_publish_avatar_server_reject">Der Server hat die Veröffentlichung des Avatars abgelehnt.</string>
- <string name="error_publish_avatar_converting">Bei der Konvertierung des Avatars lief etwas schief.</string>
- <string name="error_saving_avatar">Kann Avatar nicht speichern.</string>
- <string name="or_long_press_for_default">(Oder klicke lange, um Standard wiederherzustellen)</string>
- <string name="error_publish_avatar_no_server_support">Dein Server unterstützt die Veröffentlichung von Avataren nicht.</string>
+ <string name="error_publish_avatar_server_reject">Der Server hat die Veröffentlichung des Avatars abgelehnt.</string>
+ <string name="error_publish_avatar_converting">Bei der Konvertierung des Avatars lief etwas schief.</string>
+ <string name="error_saving_avatar">Kann Avatar nicht speichern.</string>
+ <string name="or_long_press_for_default">(Oder klicke lange, um Standard wiederherzustellen)</string>
+ <string name="error_publish_avatar_no_server_support">Dein Server unterstützt die Veröffentlichung von Avataren nicht.</string>
<string name="private_message">private Nachricht:</string>
<string name="private_message_to">privat an %s:</string>
<string name="send_private_message_to">Sende private Nachricht an %s…</string>
- <string name="connect">Verbinden</string>
- <string name="account_already_exists">Das Konto existiert bereits</string>
- <string name="next">Weiter</string>
+ <string name="connect">Verbinden</string>
+ <string name="account_already_exists">Das Konto existiert bereits</string>
+ <string name="next">Weiter</string>
<string name="server_info_session_established">Sitzung wiederhergestellt</string>
<string name="additional_information">Zusätzliche Informationen</string>
<string name="skip">Überspringen</string>
@@ -287,7 +299,7 @@
<string name="pref_use_larger_font_summary">Größere Schrift verwenden</string>
<string name="pref_use_send_button_to_indicate_status">Absende-Knopf zeigt Online-Status an</string>
<string name="pref_use_indicate_received">Anfrage für Nachrichtenempfang</string>
- <string name="pref_use_indicate_received_summary">Empfangene Nachrichten werden mit einem grünen Häkchen markiert. Bitte beachte, dass dies nicht in allen Fällen funktioniert.</string>
+ <string name="pref_use_indicate_received_summary">Empfangene Nachrichten werden mit einem grünen Häkchen markiert. Bitte beachte, dass dies nicht in allen Fällen funktioniert.</string>
<string name="pref_use_send_button_to_indicate_status_summary">Absende-Knopf einfärben, um den Online-Status des Kontakts zu signalisieren</string>
<string name="pref_expert_options_other">Sonstiges</string>
<string name="pref_conference_name">Konferenz-Name</string>
@@ -314,46 +326,46 @@
<string name="show_qr_code">Zeige QR-Code</string>
<string name="show_block_list">Zeige Sperrliste</string>
<string name="account_details">Konto-Details</string>
- <string name="verify_otr">Prüfe OTR</string>
- <string name="remote_fingerprint">Fingerabdruck der Gegenseite</string>
- <string name="scan">Scanne</string>
- <string name="or_touch_phones">(oder Touch-Handys)</string>
- <string name="smp">Socialist Millionaire Protocol</string>
- <string name="shared_secret_hint">Hinweis oder Frage</string>
- <string name="shared_secret_secret">Gemeinsamer Schlüssel</string>
- <string name="confirm">Bestätige</string>
- <string name="in_progress">In Bearbeitung</string>
- <string name="respond">Antworten</string>
- <string name="failed">Fehlgeschlagen</string>
- <string name="secrets_do_not_match">Schlüssel stimmen nicht überein</string>
- <string name="try_again">Erneut versuchen</string>
- <string name="finish">Fertig</string>
- <string name="verified">Überprüft!</string>
+ <string name="verify_otr">Prüfe OTR</string>
+ <string name="remote_fingerprint">Fingerabdruck der Gegenseite</string>
+ <string name="scan">Scanne</string>
+ <string name="or_touch_phones">(oder Touch-Handys)</string>
+ <string name="smp">Socialist Millionaire Protocol</string>
+ <string name="shared_secret_hint">Hinweis oder Frage</string>
+ <string name="shared_secret_secret">Gemeinsamer Schlüssel</string>
+ <string name="confirm">Bestätige</string>
+ <string name="in_progress">In Bearbeitung</string>
+ <string name="respond">Antworten</string>
+ <string name="failed">Fehlgeschlagen</string>
+ <string name="secrets_do_not_match">Schlüssel stimmen nicht überein</string>
+ <string name="try_again">Erneut versuchen</string>
+ <string name="finish">Fertig</string>
+ <string name="verified">Überprüft!</string>
<string name="smp_requested">Kontakt fordert eine Überprüfung an</string>
- <string name="no_otr_session_found">Keine gültige OTR Sitzung gefunden!</string>
- <string name="conversations_foreground_service">Conversations</string>
- <string name="pref_keep_foreground_service">Den Dienst im Vordergrund ausführen.</string>
+ <string name="no_otr_session_found">Keine gültige OTR Sitzung gefunden!</string>
+ <string name="conversations_foreground_service">Conversations</string>
+ <string name="pref_keep_foreground_service">Den Dienst im Vordergrund ausführen.</string>
<string name="pref_keep_foreground_service_summary">Verhindert, dass Android Conversations beendet und die Verbindung unterbricht</string>
- <string name="choose_file">Datei auswählen</string>
+ <string name="choose_file">Datei auswählen</string>
<string name="receiving_x_file">Empfange %1$s (%2$d%% abgeschlossen)</string>
<string name="download_x_file">Lade %s herunter</string>
<string name="file">Datei</string>
<string name="open_x_file">Öffne %s</string>
<string name="sending_file">Sende (%1$d%% gesendet)</string>
- <string name="preparing_file">Bereite Datei für die Übertragung vor</string>
+ <string name="preparing_file">Bereite Datei für die Übertragung vor</string>
<string name="x_file_offered_for_download">%s zum Herunterladen angeboten</string>
- <string name="cancel_transmission">Datei-Übertragung abbrechen</string>
- <string name="file_transmission_failed">Datei-Übertragung fehlgeschlagen</string>
- <string name="file_deleted">Datei wurde gelöscht</string>
- <string name="no_application_found_to_open_file">Keine Anwendung zum Öffnen der Datei gefunden</string>
- <string name="could_not_verify_fingerprint">Kann Fingerabdruck nicht überprüfen</string>
- <string name="manually_verify">Manuell überprüfen</string>
- <string name="are_you_sure_verify_fingerprint">Bist du sicher, dass du den OTR-Fingerabdruck des Kontakts überprüfen willst?</string>
- <string name="pref_show_dynamic_tags">Dynamische Tags anzeigen</string>
- <string name="pref_show_dynamic_tags_summary">Zeige schreibgeschützte Tags unterhalb der Kontakte</string>
- <string name="enable_notifications">Aktiviere Benachrichtigungen</string>
+ <string name="cancel_transmission">Datei-Übertragung abbrechen</string>
+ <string name="file_transmission_failed">Datei-Übertragung fehlgeschlagen</string>
+ <string name="file_deleted">Datei wurde gelöscht</string>
+ <string name="no_application_found_to_open_file">Keine Anwendung zum Öffnen der Datei gefunden</string>
+ <string name="could_not_verify_fingerprint">Kann Fingerabdruck nicht überprüfen</string>
+ <string name="manually_verify">Manuell überprüfen</string>
+ <string name="are_you_sure_verify_fingerprint">Bist du sicher, dass du den OTR-Fingerabdruck des Kontakts überprüfen willst?</string>
+ <string name="pref_show_dynamic_tags">Dynamische Tags anzeigen</string>
+ <string name="pref_show_dynamic_tags_summary">Zeige schreibgeschützte Tags unterhalb der Kontakte</string>
+ <string name="enable_notifications">Aktiviere Benachrichtigungen</string>
<string name="conference_with">Beginne Konferenz mit…</string>
- <string name="no_conference_server_found">Konferenz-Server kann nicht gefunden werden</string>
+ <string name="no_conference_server_found">Konferenz-Server kann nicht gefunden werden</string>
<string name="conference_creation_failed">Beginnen der Konferenz fehlgeschlagen!</string>
<string name="conference_created">Konferenz erstellt!</string>
<string name="secret_accepted">Schlüssel akzeptiert!</string>
@@ -371,22 +383,23 @@
<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>
- <string name="password_changed">Passwort geändert.</string>
- <string name="could_not_change_password">Passwort kann nicht geändert werden.</string>
- <string name="otr_session_not_started">Sende eine Nachricht, um eine verschlüsselte Unterhaltung zu beginnen</string>
- <string name="ask_question">Frage stellen</string>
- <string name="smp_explain_question">Falls du mit deinem Kontakt ein gemeinsames Geheimnis hast (z.B. ein Insider-Witz oder was ihr zuletzt gemeinsam zum Mittag gegessen habt), kann dies zur gegenseitigen Überprüfung des Fingerabdrucks genutzt werden.\n\nDu stellst eine Frage oder gibst einen Hinweis und dein Kontakt gibt eine eindeutige Antwort.</string>
- <string name="smp_explain_answer">Dein Kontakt möchte deinen Fingerabdruck mit Hilfe eines gemeinsamen Schlüssels überprüfen. Dein Kontakt hat dazu folgende Frage gestellt.</string>
- <string name="shared_secret_hint_should_not_be_empty">Deine Frage darf nicht leer sein.</string>
- <string name="shared_secret_can_not_be_empty">Dein gemeinsamer Schlüssel darf nicht leer sein</string>
- <string name="manual_verification_explanation">Vergleiche den angezeigten Fingerabdruck sorgfältig mit dem deines Kontakts.\nDu kannst dazu einen sicheren Kommunikationsweg (z.B. verschlüsselte E-Mail oder Telefonanruf) zum Austausch nutzen.</string>
- <string name="change_password">Passwort ändern</string>
- <string name="current_password">Aktuelles Passwort</string>
- <string name="new_password">Neues Passwort</string>
- <string name="password_should_not_be_empty">Das Passwort darf nicht leer sein</string>
- <string name="enable_all_accounts">Alle Konten anschalten</string>
- <string name="disable_all_accounts">Alle Konten abschalten</string>
- <string name="perform_action_with">Aktion durchführen mit</string>
+ <string name="password_changed">Passwort geändert.</string>
+ <string name="could_not_change_password">Passwort kann nicht geändert werden.</string>
+ <string name="otr_session_not_started">Sende eine Nachricht, um eine verschlüsselte Unterhaltung zu beginnen</string>
+ <string name="ask_question">Frage stellen</string>
+ <string name="smp_explain_question">Falls du mit deinem Kontakt ein gemeinsames Geheimnis hast (z.B. ein Insider-Witz oder was ihr zuletzt gemeinsam zum Mittag gegessen habt), kann dies zur gegenseitigen Überprüfung des Fingerabdrucks genutzt werden.\n\nDu stellst eine Frage oder gibst einen Hinweis und dein Kontakt gibt eine eindeutige Antwort.</string>
+ <string name="smp_explain_answer">Dein Kontakt möchte deinen Fingerabdruck mit Hilfe eines gemeinsamen Schlüssels überprüfen. Dein Kontakt hat dazu folgende Frage gestellt.</string>
+ <string name="shared_secret_hint_should_not_be_empty">Deine Frage darf nicht leer sein.</string>
+ <string name="shared_secret_can_not_be_empty">Dein gemeinsamer Schlüssel darf nicht leer sein</string>
+ <string name="manual_verification_explanation">Vergleiche den angezeigten Fingerabdruck sorgfältig mit dem deines Kontakts.\nDu kannst dazu einen sicheren Kommunikationsweg (z.B. verschlüsselte E-Mail oder Telefonanruf) zum Austausch nutzen.</string>
+ <string name="change_password">Passwort ändern</string>
+ <string name="current_password">Aktuelles Passwort</string>
+ <string name="new_password">Neues Passwort</string>
+ <string name="password_should_not_be_empty">Das Passwort darf nicht leer sein</string>
+ <string name="password_should_not_contain_only_spaces">Das Passwort darf nicht nur aus Leerzeichen bestehen</string>
+ <string name="enable_all_accounts">Alle Konten anschalten</string>
+ <string name="disable_all_accounts">Alle Konten abschalten</string>
+ <string name="perform_action_with">Aktion durchführen mit</string>
<string name="no_affiliation">Keine Zugehörigkeit</string>
<string name="no_role">Keine Rolle</string>
<string name="outcast">Ausgeschlossen</string>
@@ -475,4 +488,6 @@
<string name="download_failed_server_not_found">Download fehlgeschlagen: Server nicht gefunden</string>
<string name="download_failed_file_not_found">Download fehlgeschlagen: Datei nicht gefunden</string>
<string name="download_failed_could_not_connect">Download fehlgeschlagen: keine Verbindung zum Host</string>
+ <string name="pref_led_notification_color">LED-Benachrichtigung Farbe</string>
+ <string name="pref_led_notification_color_summary">Setze die Farbe der LED-Benachrichtigung</string>
</resources>
diff --git a/src/main/res/values-fr/strings.xml b/src/main/res/values-fr/strings.xml
index 646f5414..cfd79136 100644
--- a/src/main/res/values-fr/strings.xml
+++ b/src/main/res/values-fr/strings.xml
@@ -97,7 +97,7 @@
<string name="pref_xmpp_resource">Ressource XMPP</string>
<string name="pref_xmpp_resource_summary">Nom permettant d\'identifier ce client XMPP</string>
<string name="pref_accept_files">Accepter les fichiers</string>
- <string name="pref_accept_files_summary">Accepter automatiquement les fichiers plus petits que…</string>
+ <string name="pref_accept_files_size_summary">Accepter automatiquement les fichiers plus petits que…</string>
<string name="pref_notification_settings">Paramètres de notification</string>
<string name="pref_notifications">Notifications</string>
<string name="pref_notifications_summary">Notifier l\'arrivée d\'un message</string>
diff --git a/src/main/res/values-gl/strings.xml b/src/main/res/values-gl/strings.xml
index 6a6b23c1..aad7906b 100644
--- a/src/main/res/values-gl/strings.xml
+++ b/src/main/res/values-gl/strings.xml
@@ -61,7 +61,7 @@
<string name="pref_xmpp_resource">Recurso</string>
<string name="pref_xmpp_resource_summary">O nome que identifica o cliente que estás a empregar</string>
<string name="pref_accept_files">Aceptar arquivos</string>
- <string name="pref_accept_files_summary">De forma automática aceptar arquivos menores de…</string>
+ <string name="pref_accept_files_size_summary">De forma automática aceptar arquivos menores de…</string>
<string name="pref_notification_settings">Axustes de notificación</string>
<string name="pref_notifications">Notificacións</string>
<string name="pref_notifications_summary">Notifica cuando chega unha nova mensaxe</string>
diff --git a/src/main/res/values-iw/strings.xml b/src/main/res/values-iw/strings.xml
index 8eeaab6b..3b62cd5e 100644
--- a/src/main/res/values-iw/strings.xml
+++ b/src/main/res/values-iw/strings.xml
@@ -82,7 +82,7 @@
<string name="pref_xmpp_resource">משאב XMPP</string>
<string name="pref_xmpp_resource_summary">השם שלקוח זה מזהה את עצמו עם</string>
<string name="pref_accept_files">קבל קבצים</string>
- <string name="pref_accept_files_summary">קבל אוטומטית קבצים קטנים יותר מאשר…</string>
+ <string name="pref_accept_files_size_summary">קבל אוטומטית קבצים קטנים יותר מאשר…</string>
<string name="pref_notification_settings">הגדרות התראה</string>
<string name="pref_notifications">התראות</string>
<string name="pref_notifications_summary">תודיע כאשר הודעה חדשה מגיעה</string>
diff --git a/src/main/res/values-ja/strings.xml b/src/main/res/values-ja/strings.xml
index bd65c7c7..aae2e48d 100644
--- a/src/main/res/values-ja/strings.xml
+++ b/src/main/res/values-ja/strings.xml
@@ -78,7 +78,6 @@
<string name="choose_presence">連絡する参加を選択</string>
<string name="send_plain_text_message">プレーンテキストを送信</string>
<string name="send_otr_message">OTR 暗号化メッセージを送信</string>
- <string name="send_omemo_message">OMEMO 暗号化メッセージを送信</string>
<string name="send_pgp_message">OpenPGP 暗号化メッセージを送信</string>
<string name="your_nick_has_been_changed">あなたのニックネームが変更されました</string>
<string name="send_unencrypted">暗号化されていない送信</string>
diff --git a/src/main/res/values-zh-rTW/strings.xml b/src/main/res/values-zh-rTW/strings.xml
index 8a4d3539..a0f21acc 100644
--- a/src/main/res/values-zh-rTW/strings.xml
+++ b/src/main/res/values-zh-rTW/strings.xml
@@ -81,7 +81,7 @@
<string name="pref_xmpp_resource">XMPP 資源</string>
<string name="pref_xmpp_resource_summary">客戶端標示名稱</string>
<string name="pref_accept_files">接收文件</string>
- <string name="pref_accept_files_summary">自動接收小於 … 的文件</string>
+ <string name="pref_accept_files_size_summary">自動接收小於 … 的文件</string>
<string name="pref_notification_settings">通知設定</string>
<string name="pref_notifications">通知</string>
<string name="pref_notifications_summary">收到新訊息時通知</string>
diff --git a/src/main/res/values/arrays.xml b/src/main/res/values/arrays.xml
index 5be352d1..c555d4ba 100644
--- a/src/main/res/values/arrays.xml
+++ b/src/main/res/values/arrays.xml
@@ -57,4 +57,17 @@
<item>voice</item>
<item>location</item>
</string-array>
+
+ <string-array name="confirm_strings">
+ <item>@string/pref_confirm_messages_none</item>
+ <item>@string/pref_confirm_messages_received</item>
+ <item>@string/pref_confirm_messages_read_and_received</item>
+ </string-array>
+
+ <string-array name="confirm_values">
+ <item>0</item>
+ <item>1</item>
+ <item>2</item>
+ </string-array>
+
</resources>
diff --git a/src/main/res/values/attrs.xml b/src/main/res/values/attrs.xml
index d471e54a..0d6d19b1 100644
--- a/src/main/res/values/attrs.xml
+++ b/src/main/res/values/attrs.xml
@@ -25,5 +25,8 @@
<attr name="icon_secure" format="reference"/>
<attr name="icon_settings" format="reference"/>
<attr name="icon_import_export" format="reference"/>
-
+ <declare-styleable name="AmbilWarnaPreference">
+ <attr name="supportsAlpha"
+ format="boolean"/>
+ </declare-styleable>
</resources> \ No newline at end of file
diff --git a/src/main/res/values/dimens.xml b/src/main/res/values/dimens.xml
index 95e80055..3ea590fa 100644
--- a/src/main/res/values/dimens.xml
+++ b/src/main/res/values/dimens.xml
@@ -5,4 +5,8 @@
<dimen name="infocard_padding">16dp</dimen>
<dimen name="conversations_overview_width">288dp</dimen>
<dimen name="image_button_padding">8dp</dimen>
+ <dimen name="ambilwarna_hsvHeight">240dp</dimen>
+ <dimen name="ambilwarna_hsvWidth">240dp</dimen>
+ <dimen name="ambilwarna_hueWidth">30dp</dimen>
+ <dimen name="ambilwarna_spacer">8dp</dimen>
</resources>
diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
index 2a03847d..9b5ccc80 100644
--- a/src/main/res/values/strings.xml
+++ b/src/main/res/values/strings.xml
@@ -100,7 +100,13 @@
<string name="pref_xmpp_resource">XMPP resource</string>
<string name="pref_xmpp_resource_summary">The name this client identifies itself with</string>
<string name="pref_accept_files">Accept files</string>
- <string name="pref_accept_files_summary">Automatically accept files smaller than…</string>
+ <string name="pref_accept_files_summary">Settings for accepting and automatically downloading files</string>
+ <string name="pref_accept_files_size">Size</string>
+ <string name="pref_accept_files_size_summary">Automatically accept files smaller than…</string>
+ <string name="pref_accept_files_download">WLAN only</string>
+ <string name="pref_accept_files_download_summary">Download and accept files automatically only when using WLAN</string>
+ <string name="pref_accept_files_download_link">Image links</string>
+ <string name="pref_accept_files_download_link_summary">Automatically download image links</string>
<string name="pref_notification_settings">Notification Settings</string>
<string name="pref_notifications">Notifications</string>
<string name="pref_notifications_summary">Notify when a new message arrives</string>
@@ -116,8 +122,13 @@
<string name="pref_never_send_crash">Never send crash reports</string>
<string name="pref_never_send_crash_summary">By sending in stack traces you are helping the ongoing development of Conversations</string>
<string name="pref_confirm_messages">Confirm Messages</string>
- <string name="pref_confirm_messages_summary">Let your contact know when you have received and read a message</string>
+ <string name="pref_confirm_messages_summary">Let your contact know when you have received or read a message</string>
+ <string name="pref_confirm_messages_none">No confirmation</string>
+ <string name="pref_confirm_messages_received">Confirmation for received message</string>
+ <string name="pref_confirm_messages_read_and_received">Confirmation for received and read message</string>
<string name="pref_ui_options">UI Options</string>
+ <string name="pref_parse_emoticons">Parse Emoticons</string>
+ <string name="pref_parse_emoticons_summary">Replace emoticons with smilies.</string>
<string name="openpgp_error">OpenKeychain reported an error</string>
<string name="error_decrypting_file">I/O Error decrypting file</string>
<string name="accept">Accept</string>
@@ -419,6 +430,7 @@
<string name="current_password">Current password</string>
<string name="new_password">New password</string>
<string name="password_should_not_be_empty">Password should not be empty</string>
+ <string name="password_should_not_contain_only_spaces">Password should not contain only spaces</string>
<string name="enable_all_accounts">Enable all accounts</string>
<string name="disable_all_accounts">Disable all accounts</string>
<string name="perform_action_with">Perform action with</string>
@@ -510,4 +522,6 @@
<string name="download_failed_server_not_found">Download failed: Server not found</string>
<string name="download_failed_file_not_found">Download failed: File not found</string>
<string name="download_failed_could_not_connect">Download failed: Could not connect to host</string>
+ <string name="pref_led_notification_color">LED notification color</string>
+ <string name="pref_led_notification_color_summary">Change the color of the LED notification</string>
</resources>
diff --git a/src/main/res/xml/preferences.xml b/src/main/res/xml/preferences.xml
index 8ab35c09..c858b9e6 100644
--- a/src/main/res/xml/preferences.xml
+++ b/src/main/res/xml/preferences.xml
@@ -15,17 +15,38 @@
android:key="resource"
android:summary="@string/pref_xmpp_resource_summary"
android:title="@string/pref_xmpp_resource"/>
- <ListPreference
- android:defaultValue="524288"
- android:entries="@array/filesizes"
- android:entryValues="@array/filesizes_values"
- android:key="auto_accept_file_size"
+
+ <PreferenceScreen
android:summary="@string/pref_accept_files_summary"
- android:title="@string/pref_accept_files"/>
+ android:title="@string/pref_accept_files">
- <CheckBoxPreference
- android:defaultValue="true"
- android:key="confirm_messages"
+ <CheckBoxPreference
+ android:defaultValue="true"
+ android:key="auto_download_file_link"
+ android:summary="@string/pref_accept_files_download_link_summary"
+ android:title="@string/pref_accept_files_download_link" />
+
+ <ListPreference
+ android:defaultValue="524288"
+ android:entries="@array/filesizes"
+ android:entryValues="@array/filesizes_values"
+ android:key="auto_accept_file_size"
+ android:summary="@string/pref_accept_files_size_summary"
+ android:title="@string/pref_accept_files_size" />
+
+ <CheckBoxPreference
+ android:defaultValue="true"
+ android:key="auto_download_file_wlan"
+ android:summary="@string/pref_accept_files_download_summary"
+ android:title="@string/pref_accept_files_download" />
+
+ </PreferenceScreen>
+
+ <ListPreference
+ android:defaultValue="2"
+ android:entries="@array/confirm_strings"
+ android:entryValues="@array/confirm_values"
+ android:key="confirm_messages_list"
android:summary="@string/pref_confirm_messages_summary"
android:title="@string/pref_confirm_messages"/>
@@ -34,11 +55,16 @@
android:key="chat_states"
android:summary="@string/pref_chat_states_summary"
android:title="@string/pref_chat_states"/>
-
+ <CheckBoxPreference
+ android:defaultValue="true"
+ android:key="parse_emoticons"
+ android:summary="@string/pref_parse_emoticons_summary"
+ android:title="@string/pref_parse_emoticons"/>
</PreferenceCategory>
- <PreferenceCategory
- android:key="notifications"
- android:title="@string/pref_notification_settings">
+ <PreferenceCategory android:title="@string/pref_notification_settings" >
+ <PreferenceScreen
+ android:summary="@string/pref_notification_settings"
+ android:title="@string/pref_notifications" >
<CheckBoxPreference
android:defaultValue="true"
android:key="show_notification"
@@ -80,14 +106,22 @@
android:key="notification_ringtone"
android:ringtoneType="notification"
android:summary="@string/pref_sound_summary"
- android:title="@string/pref_sound"/>
+ android:title="@string/pref_sound"/>
+
+ <yuku.ambilwarna.widget.AmbilWarnaPreference
+ android:defaultValue="0xffffffff"
+ android:key="led_notify_color"
+ android:title="@string/pref_led_notification_color"
+ app:supportsAlpha="true"
+ android:summary="@string/pref_led_notification_color_summary"/>
<CheckBoxPreference
android:defaultValue="false"
android:dependency="show_notification"
android:key="always_notify_in_conference"
android:summary="@string/pref_conference_notifications_summary"
- android:title="@string/pref_conference_notifications"/>
+ android:title="@string/pref_conference_notifications"/>
+ </PreferenceScreen>
</PreferenceCategory>
<PreferenceCategory android:title="@string/pref_ui_options">
<CheckBoxPreference