aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorChristian Schneppe <christian@pix-art.de>2017-08-13 22:40:00 +0200
committerChristian Schneppe <christian@pix-art.de>2017-08-13 22:43:49 +0200
commit04db5052ccee3cba54c52d64e3ec199d78b675ad (patch)
tree8d6674745798918e2e5e02ac10ea9e19b6dcf607 /src
parent1fd688b9d84efc46c747cc7c941c3323b2732e06 (diff)
cache some information generated from body like isEmojiOnly, fileParams, isGeoUri and isXmppUri
Diffstat (limited to 'src')
-rw-r--r--src/main/java/de/pixart/messenger/entities/Message.java209
-rw-r--r--src/main/java/de/pixart/messenger/services/NotificationService.java2
-rw-r--r--src/main/java/de/pixart/messenger/ui/ConversationFragment.java23
-rw-r--r--src/main/java/de/pixart/messenger/ui/adapter/MessageAdapter.java4
-rw-r--r--src/main/java/de/pixart/messenger/utils/GeoHelper.java4
-rw-r--r--src/main/java/de/pixart/messenger/utils/UIHelper.java4
6 files changed, 110 insertions, 136 deletions
diff --git a/src/main/java/de/pixart/messenger/entities/Message.java b/src/main/java/de/pixart/messenger/entities/Message.java
index e0b7029a5..6f516f45e 100644
--- a/src/main/java/de/pixart/messenger/entities/Message.java
+++ b/src/main/java/de/pixart/messenger/entities/Message.java
@@ -91,6 +91,12 @@ public class Message extends AbstractEntity {
private String axolotlFingerprint = null;
private String errorMessage = null;
+ private Boolean isGeoUri = null;
+ private Boolean isXmppUri = null;
+ private Boolean isEmojisOnly = null;
+ private Boolean treatAsDownloadable = null;
+ private FileParams fileParams = null;
+
private Message(Conversation conversation) {
this.conversation = conversation;
}
@@ -196,21 +202,21 @@ public class Message extends AbstractEntity {
public static Message createStatusMessage(Conversation conversation, String body) {
final Message message = new Message(conversation);
message.setType(Message.TYPE_STATUS);
- message.setBody(body);
+ message.body = body;
return message;
}
public static Message createLoadMoreMessage(Conversation conversation) {
final Message message = new Message(conversation);
message.setType(Message.TYPE_STATUS);
- message.setBody("LOAD_MORE");
+ message.body = "LOAD_MORE";
return message;
}
public static Message createDateSeparator(Message message) {
final Message separator = new Message(message.getConversation());
separator.setType(Message.TYPE_STATUS);
- separator.setBody(MessageAdapter.DATE_SEPARATOR_BODY);
+ separator.body = MessageAdapter.DATE_SEPARATOR_BODY;
separator.setTime(message.getTimeSent());
return separator;
}
@@ -280,11 +286,16 @@ public class Message extends AbstractEntity {
return body;
}
- public void setBody(String body) {
+ public synchronized void setBody(String body) {
if (body == null) {
throw new Error("You should not set the message body to null");
}
this.body = body;
+ this.isGeoUri = null;
+ this.isXmppUri = null;
+ this.isEmojisOnly = null;
+ this.treatAsDownloadable = null;
+ this.fileParams = null;
}
public String getErrorMessage() {
@@ -402,7 +413,8 @@ public class Message extends AbstractEntity {
return this.transferable;
}
- public void setTransferable(Transferable transferable) {
+ public synchronized void setTransferable(Transferable transferable) {
+ this.fileParams = null;
this.transferable = transferable;
}
@@ -497,16 +509,16 @@ public class Message extends AbstractEntity {
this.edited() == message.edited() &&
(message.getTimeSent() - this.getTimeSent()) <= (Config.MESSAGE_MERGE_WINDOW * 1000) &&
this.getBody().length() + message.getBody().length() <= Config.MAX_DISPLAY_MESSAGE_CHARS &&
- !GeoHelper.isGeoUri(message.getBody()) &&
- !GeoHelper.isGeoUri(this.body) &&
+ !message.isGeoUri()&&
+ !this.isGeoUri() &&
!message.treatAsDownloadable() &&
!this.treatAsDownloadable() &&
!message.getBody().startsWith(ME_COMMAND) &&
!this.getBody().startsWith(ME_COMMAND) &&
!this.bodyIsOnlyEmojis() &&
!message.bodyIsOnlyEmojis() &&
- !this.bodyIsXmpp() &&
- !message.bodyIsXmpp() &&
+ !this.isXmppUri() &&
+ !message.isXmppUri() &&
((this.axolotlFingerprint == null && message.axolotlFingerprint == null) || this.axolotlFingerprint.equals(message.getFingerprint())) &&
UIHelper.sameDay(message.getTimeSent(), this.getTimeSent())
);
@@ -654,124 +666,97 @@ public class Message extends AbstractEntity {
}
}
- public boolean treatAsDownloadable() {
- if (body.trim().contains(" ")) {
- return false;
+ public synchronized boolean treatAsDownloadable() {
+ if (treatAsDownloadable == null) {
+ if (body.trim().contains(" ")) {
+ treatAsDownloadable = false;
+ }
+ try {
+ final URL url = new URL(body);
+ final String ref = url.getRef();
+ final String protocol = url.getProtocol();
+ final boolean encrypted = ref != null && ref.matches("([A-Fa-f0-9]{2}){48}");
+ treatAsDownloadable = (AesGcmURLStreamHandler.PROTOCOL_NAME.equalsIgnoreCase(protocol) && encrypted)
+ || (("http".equalsIgnoreCase(protocol) || "https".equalsIgnoreCase(protocol)) && (oob || encrypted));
+ } catch (MalformedURLException e) {
+ treatAsDownloadable = false;
+ }
}
- try {
- final URL url = new URL(body);
- final String ref = url.getRef();
- final String protocol = url.getProtocol();
- final boolean encrypted = ref != null && ref.matches("([A-Fa-f0-9]{2}){48}");
- return (AesGcmURLStreamHandler.PROTOCOL_NAME.equalsIgnoreCase(protocol) && encrypted)
- || (("http".equalsIgnoreCase(protocol) || "https".equalsIgnoreCase(protocol)) && (oob || encrypted));
+ return treatAsDownloadable;
+ }
- } catch (MalformedURLException e) {
- return false;
+ public synchronized boolean bodyIsOnlyEmojis() {
+ if (isEmojisOnly == null) {
+ isEmojisOnly = EmojiManager.isOnlyEmojis(body.replaceAll("\\s", ""));
}
+ return isEmojisOnly;
}
- public boolean bodyIsOnlyEmojis() {
- return EmojiManager.isOnlyEmojis(body.replaceAll("\\s", ""));
+ public synchronized boolean isXmppUri() {
+ if (isXmppUri == null) {
+ isXmppUri = XmppUri.isXmppUri(body.trim());
+ }
+ return isXmppUri;
}
- public boolean bodyIsXmpp() {
- return body != null && XmppUri.isXmppUri(body.trim());
+ public synchronized boolean isGeoUri() {
+ if (isGeoUri == null) {
+ isGeoUri = GeoHelper.GEO_URI.matcher(body).matches();
+ }
+ return isGeoUri;
}
- public FileParams getFileParams() {
- FileParams params = getLegacyFileParams();
- if (params != null) {
- return params;
- }
- params = new FileParams();
- if (this.transferable != null) {
- params.size = this.transferable.getFileSize();
- }
- if (body == null) {
- return params;
- }
- String parts[] = body.split("\\|");
- switch (parts.length) {
- case 1:
- try {
- params.size = Long.parseLong(parts[0]);
- } catch (NumberFormatException e) {
+ public synchronized FileParams getFileParams() {
+ if (fileParams == null) {
+ fileParams = new FileParams();
+ if (this.transferable != null) {
+ fileParams.size = this.transferable.getFileSize();
+ }
+ String parts[] = body == null ? new String[0] : body.split("\\|");
+ switch (parts.length) {
+ case 1:
try {
- params.url = new URL(parts[0]);
- } catch (MalformedURLException e1) {
- params.url = null;
+ fileParams.size = Long.parseLong(parts[0]);
+ } catch (NumberFormatException e) {
+ fileParams.url = parseUrl(parts[0]);
}
- }
- break;
- case 2:
- case 4:
- try {
- params.url = new URL(parts[0]);
- } catch (MalformedURLException e1) {
- params.url = null;
- }
- try {
- params.size = Long.parseLong(parts[1]);
- } catch (NumberFormatException e) {
- params.size = 0;
- }
- try {
- params.width = Integer.parseInt(parts[2]);
- } catch (NumberFormatException | ArrayIndexOutOfBoundsException e) {
- params.width = 0;
- }
- try {
- params.height = Integer.parseInt(parts[3]);
- } catch (NumberFormatException | ArrayIndexOutOfBoundsException e) {
- params.height = 0;
- }
- break;
- case 3:
- try {
- params.size = Long.parseLong(parts[0]);
- } catch (NumberFormatException e) {
- params.size = 0;
- }
- try {
- params.width = Integer.parseInt(parts[1]);
- } catch (NumberFormatException e) {
- params.width = 0;
- }
- try {
- params.height = Integer.parseInt(parts[2]);
- } catch (NumberFormatException e) {
- params.height = 0;
- }
- break;
+ case 4:
+ fileParams.width = parseInt(parts[2]);
+ fileParams.height = parseInt(parts[3]);
+ case 2:
+ fileParams.url = parseUrl(parts[0]);
+ fileParams.size = parseLong(parts[1]);
+ break;
+ case 3:
+ fileParams.size = parseLong(parts[0]);
+ fileParams.width = parseInt(parts[1]);
+ fileParams.height = parseInt(parts[2]);
+ break;
+ }
}
- return params;
+ return fileParams;
}
- public FileParams getLegacyFileParams() {
- FileParams params = new FileParams();
- if (body == null) {
- return params;
+ private static long parseLong(String value) {
+ try {
+ return Long.parseLong(value);
+ } catch (NumberFormatException e) {
+ return 0;
}
- String parts[] = body.split(",");
- if (parts.length == 3) {
- try {
- params.size = Long.parseLong(parts[0]);
- } catch (NumberFormatException e) {
- return null;
- }
- try {
- params.width = Integer.parseInt(parts[1]);
- } catch (NumberFormatException e) {
- return null;
- }
- try {
- params.height = Integer.parseInt(parts[2]);
- } catch (NumberFormatException e) {
- return null;
- }
- return params;
- } else {
+ }
+
+ private static int parseInt(String value) {
+ try {
+ return Integer.parseInt(value);
+ } catch (NumberFormatException e) {
+ return 0;
+ }
+ }
+
+ private static URL parseUrl(String value) {
+ try {
+ return new URL(value);
+ } catch (MalformedURLException e) {
return null;
}
}
diff --git a/src/main/java/de/pixart/messenger/services/NotificationService.java b/src/main/java/de/pixart/messenger/services/NotificationService.java
index 7c8cef886..e3bc8a181 100644
--- a/src/main/java/de/pixart/messenger/services/NotificationService.java
+++ b/src/main/java/de/pixart/messenger/services/NotificationService.java
@@ -541,7 +541,7 @@ public class NotificationService {
private Message getFirstLocationMessage(final Iterable<Message> messages) {
for (final Message message : messages) {
- if (GeoHelper.isGeoUri(message.getBody())) {
+ if (message.isGeoUri()) {
return message;
}
}
diff --git a/src/main/java/de/pixart/messenger/ui/ConversationFragment.java b/src/main/java/de/pixart/messenger/ui/ConversationFragment.java
index 30d0f19ff..7dab99278 100644
--- a/src/main/java/de/pixart/messenger/ui/ConversationFragment.java
+++ b/src/main/java/de/pixart/messenger/ui/ConversationFragment.java
@@ -73,10 +73,8 @@ import de.pixart.messenger.ui.adapter.MessageAdapter;
import de.pixart.messenger.ui.adapter.MessageAdapter.OnContactPictureClicked;
import de.pixart.messenger.ui.adapter.MessageAdapter.OnContactPictureLongClicked;
import de.pixart.messenger.ui.widget.ListSelectionManager;
-import de.pixart.messenger.utils.GeoHelper;
import de.pixart.messenger.utils.NickValidityChecker;
import de.pixart.messenger.utils.UIHelper;
-import de.pixart.messenger.utils.XmppUri;
import de.pixart.messenger.xmpp.XmppConnection;
import de.pixart.messenger.xmpp.chatstate.ChatState;
import de.pixart.messenger.xmpp.jid.Jid;
@@ -636,20 +634,15 @@ public class ConversationFragment extends Fragment implements EditMessage.Keyboa
MenuItem downloadFile = menu.findItem(R.id.download_file);
MenuItem deleteFile = menu.findItem(R.id.delete_file);
MenuItem showErrorMessage = menu.findItem(R.id.show_error_message);
- if (!treatAsFile && !GeoHelper.isGeoUri(m.getBody()) && !m.treatAsDownloadable()) {
+ if (!treatAsFile && !m.isGeoUri() && !m.isXmppUri() && !m.treatAsDownloadable()) {
selectText.setVisible(ListSelectionManager.isSupported());
}
if (m.getEncryption() == Message.ENCRYPTION_DECRYPTION_FAILED) {
retryDecryption.setVisible(true);
}
- if (((relevantForCorrection.getType() == Message.TYPE_TEXT
+ if (relevantForCorrection.getType() == Message.TYPE_TEXT
&& relevantForCorrection.isLastCorrectableMessage()
- && conversation.getMode() == Conversation.MODE_SINGLE)
- || (relevantForCorrection.getType() == Message.TYPE_TEXT
- && relevantForCorrection.isLastCorrectableMessage()
- && conversation.getMode() == Conversation.MODE_MULTI
- && m.getConversation().getMucOptions().nonanonymous()))
- && !(GeoHelper.isGeoUri(m.getBody()) || XmppUri.isXmppUri(m.getBody()))) {
+ && (m.getConversation().getMucOptions().nonanonymous() || m.getConversation().getMode() == Conversation.MODE_SINGLE)) {
correctMessage.setVisible(true);
}
if (treatAsFile || (m.getType() == Message.TYPE_TEXT && !m.treatAsDownloadable())) {
@@ -660,8 +653,8 @@ public class ConversationFragment extends Fragment implements EditMessage.Keyboa
sendAgain.setVisible(true);
}
if (m.hasFileOnRemoteHost()
- || GeoHelper.isGeoUri(m.getBody())
- || XmppUri.isXmppUri(m.getBody())
+ || m.isGeoUri()
+ || m.isXmppUri()
|| m.treatAsDownloadable()
|| (t != null && t instanceof HttpDownloadConnection)) {
copyUrl.setVisible(true);
@@ -739,7 +732,7 @@ public class ConversationFragment extends Fragment implements EditMessage.Keyboa
private void shareWith(Message message) {
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
- if (GeoHelper.isGeoUri(message.getBody())) {
+ if (message.isGeoUri() || message.isXmppUri()) {
shareIntent.putExtra(Intent.EXTRA_TEXT, message.getBody());
shareIntent.setType("text/plain");
} else if (!message.isFileOrImage()) {
@@ -811,10 +804,10 @@ public class ConversationFragment extends Fragment implements EditMessage.Keyboa
private void copyUrl(Message message) {
final String url;
final int resId;
- if (GeoHelper.isGeoUri(message.getBody())) {
+ if (message.isGeoUri()) {
resId = R.string.location;
url = message.getBody();
- } else if (XmppUri.isXmppUri(message.getBody())) {
+ } else if (message.isXmppUri()) {
resId = R.string.contact;
url = message.getBody();
} else if (message.hasFileOnRemoteHost()) {
diff --git a/src/main/java/de/pixart/messenger/ui/adapter/MessageAdapter.java b/src/main/java/de/pixart/messenger/ui/adapter/MessageAdapter.java
index b9969e27c..d923172b5 100644
--- a/src/main/java/de/pixart/messenger/ui/adapter/MessageAdapter.java
+++ b/src/main/java/de/pixart/messenger/ui/adapter/MessageAdapter.java
@@ -961,11 +961,11 @@ public class MessageAdapter extends ArrayAdapter<Message> implements CopyTextVie
} else if (message.getEncryption() == Message.ENCRYPTION_DECRYPTION_FAILED) {
displayDecryptionFailed(viewHolder, darkBackground);
} else {
- if (GeoHelper.isGeoUri(message.getBody())) {
+ if (message.isGeoUri()) {
displayLocationMessage(viewHolder, message);
} else if (message.bodyIsOnlyEmojis()) {
displayEmojiMessage(viewHolder, message.getBody().replaceAll("\\s", ""));
- } else if (message.bodyIsXmpp()) {
+ } else if (message.isXmppUri()) {
displayXmppMessage(viewHolder, message.getBody().trim());
} else if (message.treatAsDownloadable()) {
try {
diff --git a/src/main/java/de/pixart/messenger/utils/GeoHelper.java b/src/main/java/de/pixart/messenger/utils/GeoHelper.java
index f4fd8e22a..909912966 100644
--- a/src/main/java/de/pixart/messenger/utils/GeoHelper.java
+++ b/src/main/java/de/pixart/messenger/utils/GeoHelper.java
@@ -17,10 +17,6 @@ import de.pixart.messenger.entities.Message;
public class GeoHelper {
public static Pattern GEO_URI = Pattern.compile("geo:([\\-0-9.]+),([\\-0-9.]+)(?:,([\\-0-9.]+))?(?:\\?(.*))?", Pattern.CASE_INSENSITIVE);
- public static boolean isGeoUri(String body) {
- return body != null && GEO_URI.matcher(body).matches();
- }
-
public static String MapPreviewUri(Message message) {
Matcher matcher = GEO_URI.matcher(message.getBody());
if (!matcher.matches()) {
diff --git a/src/main/java/de/pixart/messenger/utils/UIHelper.java b/src/main/java/de/pixart/messenger/utils/UIHelper.java
index 955b7db10..0049a2aa8 100644
--- a/src/main/java/de/pixart/messenger/utils/UIHelper.java
+++ b/src/main/java/de/pixart/messenger/utils/UIHelper.java
@@ -205,13 +205,13 @@ public class UIHelper {
if (body.startsWith(Message.ME_COMMAND)) {
return new Pair<>(body.replaceAll("^" + Message.ME_COMMAND,
UIHelper.getMessageDisplayName(message) + " "), false);
- } else if (GeoHelper.isGeoUri(message.getBody())) {
+ } else if (message.isGeoUri()) {
if (message.getStatus() == Message.STATUS_RECEIVED) {
return new Pair<>(context.getString(R.string.received_location), true);
} else {
return new Pair<>(context.getString(R.string.location), true);
}
- } else if (message.bodyIsXmpp()) {
+ } else if (message.isXmppUri()) {
if (message.getStatus() == Message.STATUS_RECEIVED) {
return new Pair<>(context.getString(R.string.received_contact), true);
} else {