From 04db5052ccee3cba54c52d64e3ec199d78b675ad Mon Sep 17 00:00:00 2001 From: Christian Schneppe Date: Sun, 13 Aug 2017 22:40:00 +0200 Subject: cache some information generated from body like isEmojiOnly, fileParams, isGeoUri and isXmppUri --- .../java/de/pixart/messenger/entities/Message.java | 209 ++++++++++----------- .../messenger/services/NotificationService.java | 2 +- .../pixart/messenger/ui/ConversationFragment.java | 23 +-- .../messenger/ui/adapter/MessageAdapter.java | 4 +- .../java/de/pixart/messenger/utils/GeoHelper.java | 4 - .../java/de/pixart/messenger/utils/UIHelper.java | 4 +- 6 files changed, 110 insertions(+), 136 deletions(-) (limited to 'src/main/java') 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 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 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 { -- cgit v1.2.3