Loading packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java +40 −37 Original line number Diff line number Diff line Loading @@ -96,6 +96,44 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; /** Variables and functions that is related to Emoji. */ class EmojiHelper { static final CharSequence EMOJI_CAKE = "\ud83c\udf82"; // This regex can be used to match Unicode emoji characters and character sequences. It's from // the official Unicode site (https://unicode.org/reports/tr51/#EBNF_and_Regex) with minor // changes to fit our needs. It should be updated once new emoji categories are added. // // Emoji categories that can be matched by this regex: // - Country flags. "\p{RI}\p{RI}" matches country flags since they always consist of 2 Unicode // scalars. // - Single-Character Emoji. "\p{Emoji}" matches Single-Character Emojis. // - Emoji with modifiers. E.g. Emojis with different skin tones. "\p{Emoji}\p{EMod}" matches // them. // - Emoji Presentation. Those are characters which can normally be drawn as either text or as // Emoji. "\p{Emoji}\x{FE0F}" matches them. // - Emoji Keycap. E.g. Emojis for number 0 to 9. "\p{Emoji}\x{FE0F}\x{20E3}" matches them. // - Emoji tag sequence. "\p{Emoji}[\x{E0020}-\x{E007E}]+\x{E007F}" matches them. // - Emoji Zero-Width Joiner (ZWJ) Sequence. A ZWJ emoji is actually multiple emojis joined by // the jointer "0x200D". // // Note: since "\p{Emoji}" also matches some ASCII characters like digits 0-9, we use // "\p{Emoji}&&\p{So}" to exclude them. This is the change we made from the official emoji // regex. private static final String UNICODE_EMOJI_REGEX = "\\p{RI}\\p{RI}|" + "(" + "\\p{Emoji}(\\p{EMod}|\\x{FE0F}\\x{20E3}?|[\\x{E0020}-\\x{E007E}]+\\x{E007F})" + "|[\\p{Emoji}&&\\p{So}]" + ")" + "(" + "\\x{200D}" + "\\p{Emoji}(\\p{EMod}|\\x{FE0F}\\x{20E3}?|[\\x{E0020}-\\x{E007E}]+\\x{E007F})" + "?)*"; static final Pattern EMOJI_PATTERN = Pattern.compile(UNICODE_EMOJI_REGEX); } /** Functions that help creating the People tile layouts. */ public class PeopleTileViewHelper { /** Turns on debugging information about People Space. */ Loading Loading @@ -125,8 +163,6 @@ public class PeopleTileViewHelper { private static final int MESSAGES_COUNT_OVERFLOW = 6; private static final CharSequence EMOJI_CAKE = "\ud83c\udf82"; private static final Pattern DOUBLE_EXCLAMATION_PATTERN = Pattern.compile("[!][!]+"); private static final Pattern DOUBLE_QUESTION_PATTERN = Pattern.compile("[?][?]+"); private static final Pattern ANY_DOUBLE_MARK_PATTERN = Pattern.compile("[!?][!?]+"); Loading @@ -134,39 +170,6 @@ public class PeopleTileViewHelper { static final String BRIEF_PAUSE_ON_TALKBACK = "\n\n"; // This regex can be used to match Unicode emoji characters and character sequences. It's from // the official Unicode site (https://unicode.org/reports/tr51/#EBNF_and_Regex) with minor // changes to fit our needs. It should be updated once new emoji categories are added. // // Emoji categories that can be matched by this regex: // - Country flags. "\p{RI}\p{RI}" matches country flags since they always consist of 2 Unicode // scalars. // - Single-Character Emoji. "\p{Emoji}" matches Single-Character Emojis. // - Emoji with modifiers. E.g. Emojis with different skin tones. "\p{Emoji}\p{EMod}" matches // them. // - Emoji Presentation. Those are characters which can normally be drawn as either text or as // Emoji. "\p{Emoji}\x{FE0F}" matches them. // - Emoji Keycap. E.g. Emojis for number 0 to 9. "\p{Emoji}\x{FE0F}\x{20E3}" matches them. // - Emoji tag sequence. "\p{Emoji}[\x{E0020}-\x{E007E}]+\x{E007F}" matches them. // - Emoji Zero-Width Joiner (ZWJ) Sequence. A ZWJ emoji is actually multiple emojis joined by // the jointer "0x200D". // // Note: since "\p{Emoji}" also matches some ASCII characters like digits 0-9, we use // "\p{Emoji}&&\p{So}" to exclude them. This is the change we made from the official emoji // regex. private static final String UNICODE_EMOJI_REGEX = "\\p{RI}\\p{RI}|" + "(" + "\\p{Emoji}(\\p{EMod}|\\x{FE0F}\\x{20E3}?|[\\x{E0020}-\\x{E007E}]+\\x{E007F})" + "|[\\p{Emoji}&&\\p{So}]" + ")" + "(" + "\\x{200D}" + "\\p{Emoji}(\\p{EMod}|\\x{FE0F}\\x{20E3}?|[\\x{E0020}-\\x{E007E}]+\\x{E007F})" + "?)*"; private static final Pattern EMOJI_PATTERN = Pattern.compile(UNICODE_EMOJI_REGEX); public static final String EMPTY_STRING = ""; private int mMediumVerticalPadding; Loading Loading @@ -831,7 +834,7 @@ public class PeopleTileViewHelper { if (status.getActivity() == ACTIVITY_BIRTHDAY || status.getActivity() == ACTIVITY_UPCOMING_BIRTHDAY) { setEmojiBackground(views, EMOJI_CAKE); setEmojiBackground(views, EmojiHelper.EMOJI_CAKE); } Icon statusIcon = status.getIcon(); Loading Loading @@ -1072,7 +1075,7 @@ public class PeopleTileViewHelper { /** Returns emoji if {@code message} has two of the same emoji in sequence. */ @VisibleForTesting CharSequence getDoubleEmoji(CharSequence message) { Matcher unicodeEmojiMatcher = EMOJI_PATTERN.matcher(message); Matcher unicodeEmojiMatcher = EmojiHelper.EMOJI_PATTERN.matcher(message); // Stores the start and end indices of each matched emoji. List<Pair<Integer, Integer>> emojiIndices = new ArrayList<>(); // Stores each emoji text. Loading Loading
packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java +40 −37 Original line number Diff line number Diff line Loading @@ -96,6 +96,44 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; /** Variables and functions that is related to Emoji. */ class EmojiHelper { static final CharSequence EMOJI_CAKE = "\ud83c\udf82"; // This regex can be used to match Unicode emoji characters and character sequences. It's from // the official Unicode site (https://unicode.org/reports/tr51/#EBNF_and_Regex) with minor // changes to fit our needs. It should be updated once new emoji categories are added. // // Emoji categories that can be matched by this regex: // - Country flags. "\p{RI}\p{RI}" matches country flags since they always consist of 2 Unicode // scalars. // - Single-Character Emoji. "\p{Emoji}" matches Single-Character Emojis. // - Emoji with modifiers. E.g. Emojis with different skin tones. "\p{Emoji}\p{EMod}" matches // them. // - Emoji Presentation. Those are characters which can normally be drawn as either text or as // Emoji. "\p{Emoji}\x{FE0F}" matches them. // - Emoji Keycap. E.g. Emojis for number 0 to 9. "\p{Emoji}\x{FE0F}\x{20E3}" matches them. // - Emoji tag sequence. "\p{Emoji}[\x{E0020}-\x{E007E}]+\x{E007F}" matches them. // - Emoji Zero-Width Joiner (ZWJ) Sequence. A ZWJ emoji is actually multiple emojis joined by // the jointer "0x200D". // // Note: since "\p{Emoji}" also matches some ASCII characters like digits 0-9, we use // "\p{Emoji}&&\p{So}" to exclude them. This is the change we made from the official emoji // regex. private static final String UNICODE_EMOJI_REGEX = "\\p{RI}\\p{RI}|" + "(" + "\\p{Emoji}(\\p{EMod}|\\x{FE0F}\\x{20E3}?|[\\x{E0020}-\\x{E007E}]+\\x{E007F})" + "|[\\p{Emoji}&&\\p{So}]" + ")" + "(" + "\\x{200D}" + "\\p{Emoji}(\\p{EMod}|\\x{FE0F}\\x{20E3}?|[\\x{E0020}-\\x{E007E}]+\\x{E007F})" + "?)*"; static final Pattern EMOJI_PATTERN = Pattern.compile(UNICODE_EMOJI_REGEX); } /** Functions that help creating the People tile layouts. */ public class PeopleTileViewHelper { /** Turns on debugging information about People Space. */ Loading Loading @@ -125,8 +163,6 @@ public class PeopleTileViewHelper { private static final int MESSAGES_COUNT_OVERFLOW = 6; private static final CharSequence EMOJI_CAKE = "\ud83c\udf82"; private static final Pattern DOUBLE_EXCLAMATION_PATTERN = Pattern.compile("[!][!]+"); private static final Pattern DOUBLE_QUESTION_PATTERN = Pattern.compile("[?][?]+"); private static final Pattern ANY_DOUBLE_MARK_PATTERN = Pattern.compile("[!?][!?]+"); Loading @@ -134,39 +170,6 @@ public class PeopleTileViewHelper { static final String BRIEF_PAUSE_ON_TALKBACK = "\n\n"; // This regex can be used to match Unicode emoji characters and character sequences. It's from // the official Unicode site (https://unicode.org/reports/tr51/#EBNF_and_Regex) with minor // changes to fit our needs. It should be updated once new emoji categories are added. // // Emoji categories that can be matched by this regex: // - Country flags. "\p{RI}\p{RI}" matches country flags since they always consist of 2 Unicode // scalars. // - Single-Character Emoji. "\p{Emoji}" matches Single-Character Emojis. // - Emoji with modifiers. E.g. Emojis with different skin tones. "\p{Emoji}\p{EMod}" matches // them. // - Emoji Presentation. Those are characters which can normally be drawn as either text or as // Emoji. "\p{Emoji}\x{FE0F}" matches them. // - Emoji Keycap. E.g. Emojis for number 0 to 9. "\p{Emoji}\x{FE0F}\x{20E3}" matches them. // - Emoji tag sequence. "\p{Emoji}[\x{E0020}-\x{E007E}]+\x{E007F}" matches them. // - Emoji Zero-Width Joiner (ZWJ) Sequence. A ZWJ emoji is actually multiple emojis joined by // the jointer "0x200D". // // Note: since "\p{Emoji}" also matches some ASCII characters like digits 0-9, we use // "\p{Emoji}&&\p{So}" to exclude them. This is the change we made from the official emoji // regex. private static final String UNICODE_EMOJI_REGEX = "\\p{RI}\\p{RI}|" + "(" + "\\p{Emoji}(\\p{EMod}|\\x{FE0F}\\x{20E3}?|[\\x{E0020}-\\x{E007E}]+\\x{E007F})" + "|[\\p{Emoji}&&\\p{So}]" + ")" + "(" + "\\x{200D}" + "\\p{Emoji}(\\p{EMod}|\\x{FE0F}\\x{20E3}?|[\\x{E0020}-\\x{E007E}]+\\x{E007F})" + "?)*"; private static final Pattern EMOJI_PATTERN = Pattern.compile(UNICODE_EMOJI_REGEX); public static final String EMPTY_STRING = ""; private int mMediumVerticalPadding; Loading Loading @@ -831,7 +834,7 @@ public class PeopleTileViewHelper { if (status.getActivity() == ACTIVITY_BIRTHDAY || status.getActivity() == ACTIVITY_UPCOMING_BIRTHDAY) { setEmojiBackground(views, EMOJI_CAKE); setEmojiBackground(views, EmojiHelper.EMOJI_CAKE); } Icon statusIcon = status.getIcon(); Loading Loading @@ -1072,7 +1075,7 @@ public class PeopleTileViewHelper { /** Returns emoji if {@code message} has two of the same emoji in sequence. */ @VisibleForTesting CharSequence getDoubleEmoji(CharSequence message) { Matcher unicodeEmojiMatcher = EMOJI_PATTERN.matcher(message); Matcher unicodeEmojiMatcher = EmojiHelper.EMOJI_PATTERN.matcher(message); // Stores the start and end indices of each matched emoji. List<Pair<Integer, Integer>> emojiIndices = new ArrayList<>(); // Stores each emoji text. Loading