package de.thedevstack.conversationsplus.utils; import android.graphics.BitmapFactory; import java.net.URL; import java.util.regex.Matcher; import java.util.regex.Pattern; import de.thedevstack.conversationsplus.ConversationsPlusApplication; import de.thedevstack.conversationsplus.entities.DownloadableFile; import de.thedevstack.conversationsplus.entities.Message; import de.thedevstack.conversationsplus.persistance.DatabaseBackend; import de.thedevstack.conversationsplus.persistance.FileBackend; /** * Utility class to work with messages. */ public final class MessageUtil { public static void markMessage(Message message, int status) { if (status == Message.STATUS_SEND_FAILED && (message.getStatus() == Message.STATUS_SEND_RECEIVED || message .getStatus() == Message.STATUS_SEND_DISPLAYED)) { return; } message.setStatus(status); DatabaseBackend.getInstance(ConversationsPlusApplication.getAppContext()).updateMessage(message); UiUpdateHelper.updateConversationUi(); } public static boolean wasHighlightedOrPrivate(final Message message) { final String nick = message.getConversation().getMucOptions().getActualNick(); final Pattern highlight = generateNickHighlightPattern(nick); if (message.getBody() == null || nick == null) { return false; } final Matcher m = highlight.matcher(message.getBody()); return (m.find() || message.getType() == Message.TYPE_PRIVATE); } private static Pattern generateNickHighlightPattern(final String nick) { // We expect a word boundary, i.e. space or start of string, followed by // the // nick (matched in case-insensitive manner), followed by optional // punctuation (for example "bob: i disagree" or "how are you alice?"), // followed by another word boundary. return Pattern.compile("\\b" + Pattern.quote(nick) + "\\p{Punct}?\\b", Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE); } public static void updateMessageWithImageDetails(Message message, String filePath, long size, int imageWidth, int imageHeight) { message.setRelativeFilePath(filePath); MessageUtil.updateMessageBodyWithImageParams(message, size, imageWidth, imageHeight); } public static void updateFileParams(Message message) { updateFileParams(message, null); } public static void updateFileParams(Message message, URL url) { DownloadableFile file = FileBackend.getFile(message); int imageWidth = -1; int imageHeight = -1; if (message.getType() == Message.TYPE_IMAGE || file.getMimeType().startsWith("image/")) { BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeFile(file.getAbsolutePath(), options); imageHeight = options.outHeight; imageWidth = options.outWidth; } MessageUtil.updateMessageBodyWithFileParams(message, url, file.getSize(), imageWidth, imageHeight); } private static void updateMessageBodyWithFileParams(Message message, URL url, long fileSize, int imageWidth, int imageHeight) { message.setBody(MessageUtil.getMessageBodyWithImageParams(url, fileSize, imageWidth, imageHeight)); } private static void updateMessageBodyWithImageParams(Message message, long size, int imageWidth, int imageHeight) { MessageUtil.updateMessageBodyWithImageParams(message, null, size, imageWidth, imageHeight); } private static void updateMessageBodyWithImageParams(Message message, URL url, long size, int imageWidth, int imageHeight) { message.setBody(MessageUtil.getMessageBodyWithImageParams(url, size, imageWidth, imageHeight)); } private static String getMessageBodyWithImageParams(URL url, long size, int imageWidth, int imageHeight) { StringBuilder sb = new StringBuilder(); if (null != url) { sb.append(url.toString()); sb.append('|'); } sb.append(size); if (-1 < imageWidth) { sb.append('|'); sb.append(imageWidth); } if (-1 < imageHeight) { sb.append('|'); sb.append(imageHeight); } return sb.toString(); } private MessageUtil() { // Static helper class } }