Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1cb695c6 authored by William Escande's avatar William Escande
Browse files

MapbMessage: Apply pattern matching

str.split(regex, n) is the same as Pattern.compile(regex).split(str, n).
Except that the second can be compiled once why the first need to be
recompile everytime it is invoked

Bug: 371471052
Flag: Exempt refactor
Test: atest BluetoothInstrumentationTests
Change-Id: Iccfad5430d292ff5082b3701ac48383aab7ed5e2
parent 9ada0f5e
Loading
Loading
Loading
Loading
+25 −21
Original line number Diff line number Diff line
@@ -32,11 +32,15 @@ import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;

// Next tag value for ContentProfileErrorReportUtils.report(): 10
public abstract class BluetoothMapbMessage {

    protected static final String TAG = "BluetoothMapbMessage";
    protected static final String TAG = BluetoothMapbMessage.class.getSimpleName();

    private static final Pattern UNESCAPE_COLON = Pattern.compile("[^\\\\]:");
    protected static final Pattern COLON = Pattern.compile(":");

    private String mVersionString = "VERSION:1.0";

@@ -263,34 +267,34 @@ public abstract class BluetoothMapbMessage {
            while (!line.contains("END:VCARD")) {
                line = line.trim();
                if (line.startsWith("N:")) {
                    parts = line.split("[^\\\\]:"); // Split on "un-escaped" ':'
                    parts = UNESCAPE_COLON.split(line);
                    if (parts.length == 2) {
                        name = parts[1];
                    } else {
                        name = "";
                    }
                } else if (line.startsWith("FN:")) {
                    parts = line.split("[^\\\\]:"); // Split on "un-escaped" ':'
                    parts = UNESCAPE_COLON.split(line);
                    if (parts.length == 2) {
                        formattedName = parts[1];
                    } else {
                        formattedName = "";
                    }
                } else if (line.startsWith("TEL:")) {
                    parts = line.split("[^\\\\]:"); // Split on "un-escaped" ':'
                    parts = UNESCAPE_COLON.split(line);
                    if (parts.length == 2) {
                        String[] subParts = parts[1].split("[^\\\\];");
                        String[] subParts = UNESCAPE_COLON.split(parts[1]);
                        if (phoneNumbers == null) {
                            phoneNumbers = new ArrayList<String>(1);
                            phoneNumbers = new ArrayList<>(1);
                        }
                        // only keep actual phone number
                        phoneNumbers.add(subParts[subParts.length - 1]);
                    }
                    // Empty phone number - ignore
                } else if (line.startsWith("EMAIL:")) {
                    parts = line.split("[^\\\\]:"); // Split on "un-escaped" :
                    parts = UNESCAPE_COLON.split(line);
                    if (parts.length == 2) {
                        String[] subParts = parts[1].split("[^\\\\];");
                        String[] subParts = UNESCAPE_COLON.split(parts[1]);
                        if (emailAddresses == null) {
                            emailAddresses = new ArrayList<String>(1);
                        }
@@ -299,9 +303,9 @@ public abstract class BluetoothMapbMessage {
                    }
                    // Empty email address entry - ignore
                } else if (line.startsWith("X-BT-UCI:")) {
                    parts = line.split("[^\\\\]:"); // Split on "un-escaped" :
                    parts = UNESCAPE_COLON.split(line);
                    if (parts.length == 2) {
                        String[] subParts = parts[1].split("[^\\\\];");
                        String[] subParts = UNESCAPE_COLON.split(parts[1]);
                        if (btUcis == null) {
                            btUcis = new ArrayList<String>(1);
                        }
@@ -309,9 +313,9 @@ public abstract class BluetoothMapbMessage {
                    }
                    // Empty UCIentry - ignore
                } else if (line.startsWith("X-BT-UID:")) {
                    parts = line.split("[^\\\\]:"); // Split on "un-escaped" :
                    parts = UNESCAPE_COLON.split(line);
                    if (parts.length == 2) {
                        String[] subParts = parts[1].split("[^\\\\];");
                        String[] subParts = UNESCAPE_COLON.split(parts[1]);
                        if (btUids == null) {
                            btUids = new ArrayList<String>(1);
                        }
@@ -514,7 +518,7 @@ public abstract class BluetoothMapbMessage {
        // Parse the properties - which end with either a VCARD or a BENV
        while (!line.contains("BEGIN:VCARD") && !line.contains("BEGIN:BENV")) {
            if (line.contains("STATUS")) {
                String[] arg = line.split(":");
                String[] arg = COLON.split(line);
                if (arg != null && arg.length == 2) {
                    if (arg[1].trim().equals("READ")) {
                        status = true;
@@ -528,7 +532,7 @@ public abstract class BluetoothMapbMessage {
                }
            }
            if (line.contains("EXTENDEDDATA")) {
                String[] arg = line.split(":");
                String[] arg = COLON.split(line);
                if (arg != null && arg.length == 2) {
                    String value = arg[1].trim();
                    // FIXME what should we do with this
@@ -536,7 +540,7 @@ public abstract class BluetoothMapbMessage {
                }
            }
            if (line.contains("TYPE")) {
                String[] arg = line.split(":");
                String[] arg = COLON.split(line);
                if (arg != null && arg.length == 2) {
                    String value = arg[1].trim();
                    /* Will throw IllegalArgumentException if value is wrong */
@@ -569,7 +573,7 @@ public abstract class BluetoothMapbMessage {
                }
            }
            if (line.contains("FOLDER")) {
                String[] arg = line.split(":");
                String[] arg = COLON.split(line);
                if (arg != null && arg.length == 2) {
                    folder = arg[1].trim();
                }
@@ -652,7 +656,7 @@ public abstract class BluetoothMapbMessage {
        parseMsgInit();
        while (!line.contains("END:")) {
            if (line.contains("PARTID:")) {
                String[] arg = line.split(":");
                String[] arg = COLON.split(line);
                if (arg != null && arg.length == 2) {
                    try {
                        Long unusedId = Long.parseLong(arg[1].trim());
@@ -669,7 +673,7 @@ public abstract class BluetoothMapbMessage {
                    throw new IllegalArgumentException("Missing value for 'PARTID': " + line);
                }
            } else if (line.contains("ENCODING:")) {
                String[] arg = line.split(":");
                String[] arg = COLON.split(line);
                if (arg != null && arg.length == 2) {
                    mEncoding = arg[1].trim();
                    // If needed validation will be done when the value is used
@@ -677,7 +681,7 @@ public abstract class BluetoothMapbMessage {
                    throw new IllegalArgumentException("Missing value for 'ENCODING': " + line);
                }
            } else if (line.contains("CHARSET:")) {
                String[] arg = line.split(":");
                String[] arg = COLON.split(line);
                if (arg != null && arg.length == 2) {
                    mCharset = arg[1].trim();
                    // If needed validation will be done when the value is used
@@ -685,7 +689,7 @@ public abstract class BluetoothMapbMessage {
                    throw new IllegalArgumentException("Missing value for 'CHARSET': " + line);
                }
            } else if (line.contains("LANGUAGE:")) {
                String[] arg = line.split(":");
                String[] arg = COLON.split(line);
                if (arg != null && arg.length == 2) {
                    String unusedLanguage = arg[1].trim();
                    // If needed validation will be done when the value is used
@@ -693,7 +697,7 @@ public abstract class BluetoothMapbMessage {
                    throw new IllegalArgumentException("Missing value for 'LANGUAGE': " + line);
                }
            } else if (line.contains("LENGTH:")) {
                String[] arg = line.split(":");
                String[] arg = COLON.split(line);
                if (arg != null && arg.length == 2) {
                    try {
                        mBMsgLength = Integer.parseInt(arg[1].trim());
+17 −11
Original line number Diff line number Diff line
@@ -37,9 +37,15 @@ import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.UUID;
import java.util.regex.Pattern;

// Next tag value for ContentProfileErrorReportUtils.report(): 8
public class BluetoothMapbMessageMime extends BluetoothMapbMessage {
    private static final Pattern NEW_LINE = Pattern.compile("\r\n");
    private static final Pattern TWO_NEW_LINE = Pattern.compile("\r\n\r\n");
    private static final Pattern SEMI_COLON = Pattern.compile(";");
    private static final Pattern BOUNDARY_PATTERN = Pattern.compile("boundary[\\s]*=");
    private static final Pattern CHARSET_PATTERN = Pattern.compile("charset[\\s]*=");

    public static class MimePart {
        public long mId = INVALID_VALUE; /* The _id from the content provider, can be used to
@@ -559,7 +565,7 @@ public class BluetoothMapbMessageMime extends BluetoothMapbMessage {
     *     headers were found.
     */
    private String parseMimeHeaders(String hdrPart) {
        String[] headers = hdrPart.split("\r\n");
        String[] headers = NEW_LINE.split(hdrPart);
        Log.d(TAG, "Header count=" + headers.length);
        String header;

@@ -574,7 +580,7 @@ public class BluetoothMapbMessageMime extends BluetoothMapbMessage {
            if (header.trim().isEmpty()) {
                continue;
            }
            String[] headerParts = header.split(":", 2);
            String[] headerParts = COLON.split(header, 2);
            if (headerParts.length != 2) {
                // We treat the remaining content as plain text.
                StringBuilder remaining = new StringBuilder();
@@ -622,12 +628,12 @@ public class BluetoothMapbMessageMime extends BluetoothMapbMessage {
            } else if (headerType.contains("MIME-VERSION")) {
                /* The mime version is not needed */
            } else if (headerType.contains("CONTENT-TYPE")) {
                String[] contentTypeParts = headerValue.split(";");
                String[] contentTypeParts = SEMI_COLON.split(headerValue);
                mContentType = contentTypeParts[0];
                // Extract the boundary if it exists
                for (int j = 1, n = contentTypeParts.length; j < n; j++) {
                    if (contentTypeParts[j].contains("boundary")) {
                        mBoundary = contentTypeParts[j].split("boundary[\\s]*=", 2)[1].trim();
                        mBoundary = BOUNDARY_PATTERN.split(contentTypeParts[j], 2)[1].trim();
                        // removing quotes from boundary string
                        if ((mBoundary.charAt(0) == '\"')
                                && (mBoundary.charAt(mBoundary.length() - 1) == '\"')) {
@@ -635,7 +641,7 @@ public class BluetoothMapbMessageMime extends BluetoothMapbMessage {
                        }
                        Log.d(TAG, "Boundary tag=" + mBoundary);
                    } else if (contentTypeParts[j].contains("charset")) {
                        mCharset = contentTypeParts[j].split("charset[\\s]*=", 2)[1].trim();
                        mCharset = CHARSET_PATTERN.split(contentTypeParts[j], 2)[1].trim();
                    }
                }
            } else if (headerType.contains("CONTENT-TRANSFER-ENCODING")) {
@@ -653,12 +659,12 @@ public class BluetoothMapbMessageMime extends BluetoothMapbMessage {
    }

    private void parseMimePart(String partStr) {
        String[] parts = partStr.split("\r\n\r\n", 2); // Split the header from the body
        String[] parts = TWO_NEW_LINE.split(partStr, 2); // Split the header from the body
        MimePart newPart = addMimePart();
        String partEncoding = mMyEncoding; /* Use the overall encoding as default */
        String body;

        String[] headers = parts[0].split("\r\n");
        String[] headers = NEW_LINE.split(parts[0]);
        Log.d(TAG, "parseMimePart: headers count=" + headers.length);

        if (parts.length != 2) {
@@ -672,7 +678,7 @@ public class BluetoothMapbMessageMime extends BluetoothMapbMessage {
                    continue;
                }

                String[] headerParts = header.split(":", 2);
                String[] headerParts = COLON.split(header, 2);
                if (headerParts.length != 2) {
                    Log.w(TAG, "part-Header not formatted correctly: ");
                    ContentProfileErrorReportUtils.report(
@@ -687,13 +693,13 @@ public class BluetoothMapbMessageMime extends BluetoothMapbMessage {
                String headerType = Ascii.toUpperCase(headerParts[0]);
                String headerValue = headerParts[1].trim();
                if (headerType.contains("CONTENT-TYPE")) {
                    String[] contentTypeParts = headerValue.split(";");
                    String[] contentTypeParts = SEMI_COLON.split(headerValue);
                    newPart.mContentType = contentTypeParts[0];
                    // Extract the boundary if it exists
                    for (int j = 1, n = contentTypeParts.length; j < n; j++) {
                        String value = Ascii.toLowerCase(contentTypeParts[j]);
                        if (value.contains("charset")) {
                            newPart.mCharsetName = value.split("charset[\\s]*=", 2)[1].trim();
                            newPart.mCharsetName = CHARSET_PATTERN.split(value, 2)[1].trim();
                        }
                    }
                } else if (headerType.contains("CONTENT-LOCATION")) {
@@ -772,7 +778,7 @@ public class BluetoothMapbMessageMime extends BluetoothMapbMessage {
        String messageBody = null;

        message = message.replaceAll("\\r\\n[ \\\t]+", ""); // Unfold
        messageParts = message.split("\r\n\r\n", 2); // Split the header from the body
        messageParts = TWO_NEW_LINE.split(message, 2); // Split the header from the body
        if (messageParts.length != 2) {
            // Handle entire message as plain text
            messageBody = message;