diff --git a/assets/emoji-nature.png b/assets/emoji-nature.png deleted file mode 100644 index 695e8e9971..0000000000 Binary files a/assets/emoji-nature.png and /dev/null differ diff --git a/assets/emoji-objects.png b/assets/emoji-objects.png deleted file mode 100644 index b3b1fe5e20..0000000000 Binary files a/assets/emoji-objects.png and /dev/null differ diff --git a/assets/emoji-people.png b/assets/emoji-people.png deleted file mode 100644 index 7239a83347..0000000000 Binary files a/assets/emoji-people.png and /dev/null differ diff --git a/assets/emoji-places.png b/assets/emoji-places.png deleted file mode 100644 index b1dd5365c4..0000000000 Binary files a/assets/emoji-places.png and /dev/null differ diff --git a/assets/emoji-symbol.png b/assets/emoji-symbol.png deleted file mode 100644 index 4d9b917afc..0000000000 Binary files a/assets/emoji-symbol.png and /dev/null differ diff --git a/assets/emoji/Activity.png b/assets/emoji/Activity.png new file mode 100644 index 0000000000..2558066d25 Binary files /dev/null and b/assets/emoji/Activity.png differ diff --git a/assets/emoji/Flags.png b/assets/emoji/Flags.png new file mode 100644 index 0000000000..a8814899b7 Binary files /dev/null and b/assets/emoji/Flags.png differ diff --git a/assets/emoji/Foods.png b/assets/emoji/Foods.png new file mode 100644 index 0000000000..18961ecbd4 Binary files /dev/null and b/assets/emoji/Foods.png differ diff --git a/assets/emoji/Nature.png b/assets/emoji/Nature.png new file mode 100644 index 0000000000..6e42b04277 Binary files /dev/null and b/assets/emoji/Nature.png differ diff --git a/assets/emoji/Objects.png b/assets/emoji/Objects.png new file mode 100644 index 0000000000..c6fac145f9 Binary files /dev/null and b/assets/emoji/Objects.png differ diff --git a/assets/emoji/People.png b/assets/emoji/People.png new file mode 100644 index 0000000000..e8587df305 Binary files /dev/null and b/assets/emoji/People.png differ diff --git a/assets/emoji/Places.png b/assets/emoji/Places.png new file mode 100644 index 0000000000..ae0a72ee46 Binary files /dev/null and b/assets/emoji/Places.png differ diff --git a/assets/emoji/Symbols.png b/assets/emoji/Symbols.png new file mode 100644 index 0000000000..786d2d5520 Binary files /dev/null and b/assets/emoji/Symbols.png differ diff --git a/res/drawable-hdpi/ic_directions_bike_white_24dp.png b/res/drawable-hdpi/ic_directions_bike_white_24dp.png new file mode 100644 index 0000000000..b45c38bad3 Binary files /dev/null and b/res/drawable-hdpi/ic_directions_bike_white_24dp.png differ diff --git a/res/drawable-hdpi/ic_flag_white_24dp.png b/res/drawable-hdpi/ic_flag_white_24dp.png new file mode 100644 index 0000000000..f0f86ad04e Binary files /dev/null and b/res/drawable-hdpi/ic_flag_white_24dp.png differ diff --git a/res/drawable-hdpi/ic_lightbulb_outline_white_24dp.png b/res/drawable-hdpi/ic_lightbulb_outline_white_24dp.png new file mode 100644 index 0000000000..c9dd4c1ec0 Binary files /dev/null and b/res/drawable-hdpi/ic_lightbulb_outline_white_24dp.png differ diff --git a/res/drawable-hdpi/ic_restaurant_white_24dp.png b/res/drawable-hdpi/ic_restaurant_white_24dp.png new file mode 100644 index 0000000000..c24e8b16f8 Binary files /dev/null and b/res/drawable-hdpi/ic_restaurant_white_24dp.png differ diff --git a/res/drawable-mdpi/ic_directions_bike_white_24dp.png b/res/drawable-mdpi/ic_directions_bike_white_24dp.png new file mode 100644 index 0000000000..214e77c13c Binary files /dev/null and b/res/drawable-mdpi/ic_directions_bike_white_24dp.png differ diff --git a/res/drawable-mdpi/ic_flag_white_24dp.png b/res/drawable-mdpi/ic_flag_white_24dp.png new file mode 100644 index 0000000000..0d2c5f65c1 Binary files /dev/null and b/res/drawable-mdpi/ic_flag_white_24dp.png differ diff --git a/res/drawable-mdpi/ic_lightbulb_outline_white_24dp.png b/res/drawable-mdpi/ic_lightbulb_outline_white_24dp.png new file mode 100644 index 0000000000..91702b1d6b Binary files /dev/null and b/res/drawable-mdpi/ic_lightbulb_outline_white_24dp.png differ diff --git a/res/drawable-mdpi/ic_restaurant_white_24dp.png b/res/drawable-mdpi/ic_restaurant_white_24dp.png new file mode 100644 index 0000000000..6cf757fcf6 Binary files /dev/null and b/res/drawable-mdpi/ic_restaurant_white_24dp.png differ diff --git a/res/drawable-xhdpi/ic_directions_bike_white_24dp.png b/res/drawable-xhdpi/ic_directions_bike_white_24dp.png new file mode 100644 index 0000000000..bafabbeaa0 Binary files /dev/null and b/res/drawable-xhdpi/ic_directions_bike_white_24dp.png differ diff --git a/res/drawable-xhdpi/ic_flag_white_24dp.png b/res/drawable-xhdpi/ic_flag_white_24dp.png new file mode 100644 index 0000000000..23c4bb7f0a Binary files /dev/null and b/res/drawable-xhdpi/ic_flag_white_24dp.png differ diff --git a/res/drawable-xhdpi/ic_lightbulb_outline_white_24dp.png b/res/drawable-xhdpi/ic_lightbulb_outline_white_24dp.png new file mode 100644 index 0000000000..afc7e537a6 Binary files /dev/null and b/res/drawable-xhdpi/ic_lightbulb_outline_white_24dp.png differ diff --git a/res/drawable-xhdpi/ic_restaurant_white_24dp.png b/res/drawable-xhdpi/ic_restaurant_white_24dp.png new file mode 100644 index 0000000000..1f1d09dcc9 Binary files /dev/null and b/res/drawable-xhdpi/ic_restaurant_white_24dp.png differ diff --git a/res/drawable-xxhdpi/ic_directions_bike_white_24dp.png b/res/drawable-xxhdpi/ic_directions_bike_white_24dp.png new file mode 100644 index 0000000000..2289d9303c Binary files /dev/null and b/res/drawable-xxhdpi/ic_directions_bike_white_24dp.png differ diff --git a/res/drawable-xxhdpi/ic_flag_white_24dp.png b/res/drawable-xxhdpi/ic_flag_white_24dp.png new file mode 100644 index 0000000000..fb2bc30ceb Binary files /dev/null and b/res/drawable-xxhdpi/ic_flag_white_24dp.png differ diff --git a/res/drawable-xxhdpi/ic_lightbulb_outline_white_24dp.png b/res/drawable-xxhdpi/ic_lightbulb_outline_white_24dp.png new file mode 100644 index 0000000000..1c1676105c Binary files /dev/null and b/res/drawable-xxhdpi/ic_lightbulb_outline_white_24dp.png differ diff --git a/res/drawable-xxhdpi/ic_restaurant_white_24dp.png b/res/drawable-xxhdpi/ic_restaurant_white_24dp.png new file mode 100644 index 0000000000..ff87ca5de5 Binary files /dev/null and b/res/drawable-xxhdpi/ic_restaurant_white_24dp.png differ diff --git a/res/drawable-xxxhdpi/ic_directions_bike_white_24dp.png b/res/drawable-xxxhdpi/ic_directions_bike_white_24dp.png new file mode 100644 index 0000000000..3b99dba33a Binary files /dev/null and b/res/drawable-xxxhdpi/ic_directions_bike_white_24dp.png differ diff --git a/res/drawable-xxxhdpi/ic_flag_white_24dp.png b/res/drawable-xxxhdpi/ic_flag_white_24dp.png new file mode 100644 index 0000000000..41089527ca Binary files /dev/null and b/res/drawable-xxxhdpi/ic_flag_white_24dp.png differ diff --git a/res/drawable-xxxhdpi/ic_lightbulb_outline_white_24dp.png b/res/drawable-xxxhdpi/ic_lightbulb_outline_white_24dp.png new file mode 100644 index 0000000000..983a25340c Binary files /dev/null and b/res/drawable-xxxhdpi/ic_lightbulb_outline_white_24dp.png differ diff --git a/res/drawable-xxxhdpi/ic_restaurant_white_24dp.png b/res/drawable-xxxhdpi/ic_restaurant_white_24dp.png new file mode 100644 index 0000000000..11420fb4b9 Binary files /dev/null and b/res/drawable-xxxhdpi/ic_restaurant_white_24dp.png differ diff --git a/res/drawable/emoji_category_activity_dark.xml b/res/drawable/emoji_category_activity_dark.xml new file mode 100644 index 0000000000..045afe0e66 --- /dev/null +++ b/res/drawable/emoji_category_activity_dark.xml @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/res/drawable/emoji_category_activity_light.xml b/res/drawable/emoji_category_activity_light.xml new file mode 100644 index 0000000000..25209a2d78 --- /dev/null +++ b/res/drawable/emoji_category_activity_light.xml @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/res/drawable/emoji_category_flags_dark.xml b/res/drawable/emoji_category_flags_dark.xml new file mode 100644 index 0000000000..2e48c313e6 --- /dev/null +++ b/res/drawable/emoji_category_flags_dark.xml @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/res/drawable/emoji_category_flags_light.xml b/res/drawable/emoji_category_flags_light.xml new file mode 100644 index 0000000000..68eeae7e64 --- /dev/null +++ b/res/drawable/emoji_category_flags_light.xml @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/res/drawable/emoji_category_foods_dark.xml b/res/drawable/emoji_category_foods_dark.xml new file mode 100644 index 0000000000..e276212e79 --- /dev/null +++ b/res/drawable/emoji_category_foods_dark.xml @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/res/drawable/emoji_category_foods_light.xml b/res/drawable/emoji_category_foods_light.xml new file mode 100644 index 0000000000..10a772f865 --- /dev/null +++ b/res/drawable/emoji_category_foods_light.xml @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/res/drawable/emoji_category_objects_dark.xml b/res/drawable/emoji_category_objects_dark.xml index 4ca7bc6355..9c43230d7a 100644 --- a/res/drawable/emoji_category_objects_dark.xml +++ b/res/drawable/emoji_category_objects_dark.xml @@ -1,7 +1,14 @@ - - + android:enterFadeDuration="200" + android:exitFadeDuration="300"> + + + + + + + diff --git a/res/drawable/emoji_category_objects_light.xml b/res/drawable/emoji_category_objects_light.xml index 2db2e1438f..08d4e0e4ec 100644 --- a/res/drawable/emoji_category_objects_light.xml +++ b/res/drawable/emoji_category_objects_light.xml @@ -1,7 +1,14 @@ - - + android:enterFadeDuration="200" + android:exitFadeDuration="300"> + + + + + + + diff --git a/res/values/attrs.xml b/res/values/attrs.xml index ebbce1eaae..be6834af3d 100644 --- a/res/values/attrs.xml +++ b/res/values/attrs.xml @@ -52,10 +52,13 @@ - + + + + diff --git a/res/values/themes.xml b/res/values/themes.xml index 6f02a51683..10978b394a 100644 --- a/res/values/themes.xml +++ b/res/values/themes.xml @@ -137,10 +137,13 @@ @drawable/emoji_category_recent_light @drawable/emoji_category_people_light - @drawable/emoji_category_objects_light @drawable/emoji_category_nature_light + @drawable/emoji_category_foods_light + @drawable/emoji_category_activity_light @drawable/emoji_category_places_light + @drawable/emoji_category_objects_light @drawable/emoji_category_symbol_light + @drawable/emoji_category_flags_light @drawable/emoji_category_emoticons_light @@ -280,10 +283,13 @@ @drawable/emoji_category_recent_dark @drawable/emoji_category_people_dark - @drawable/emoji_category_objects_dark @drawable/emoji_category_nature_dark + @drawable/emoji_category_foods_dark + @drawable/emoji_category_activity_dark @drawable/emoji_category_places_dark + @drawable/emoji_category_objects_dark @drawable/emoji_category_symbol_dark + @drawable/emoji_category_flags_dark @drawable/emoji_category_emoticons_dark @drawable/quick_camera_dark diff --git a/src/org/thoughtcrime/securesms/components/emoji/EmojiDrawer.java b/src/org/thoughtcrime/securesms/components/emoji/EmojiDrawer.java index 66bc7b3cfc..3bf0f5a40b 100644 --- a/src/org/thoughtcrime/securesms/components/emoji/EmojiDrawer.java +++ b/src/org/thoughtcrime/securesms/components/emoji/EmojiDrawer.java @@ -68,7 +68,8 @@ public class EmojiDrawer extends LinearLayout implements InputView { RepeatableImageKey backspace = (RepeatableImageKey)v.findViewById(R.id.backspace); backspace.setOnKeyEventListener(new KeyEventListener() { - @Override public void onKeyEvent() { + @Override + public void onKeyEvent() { if (listener != null) listener.onKeyEvent(DELETE_KEY_EVENT); } }); @@ -101,7 +102,8 @@ public class EmojiDrawer extends LinearLayout implements InputView { pager.setAdapter(new EmojiPagerAdapter(getContext(), models, new EmojiSelectionListener() { - @Override public void onEmojiSelected(String emoji) { + @Override + public void onEmojiSelected(String emoji) { Log.w("EmojiDrawer", "onEmojiSelected()"); recentModel.onCodePointSelected(emoji); if (listener != null) listener.onEmojiSelected(emoji); @@ -143,7 +145,8 @@ public class EmojiDrawer extends LinearLayout implements InputView { return pages.size(); } - @Override public Object instantiateItem(ViewGroup container, int position) { + @Override + public Object instantiateItem(ViewGroup container, int position) { EmojiPageView page = new EmojiPageView(context); page.setModel(pages.get(position)); page.setEmojiSelectedListener(listener); @@ -151,22 +154,26 @@ public class EmojiDrawer extends LinearLayout implements InputView { return page; } - @Override public void destroyItem(ViewGroup container, int position, Object object) { + @Override + public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View)object); } - @Override public void setPrimaryItem(ViewGroup container, int position, Object object) { + @Override + public void setPrimaryItem(ViewGroup container, int position, Object object) { EmojiPageView current = (EmojiPageView) object; current.onSelected(); super.setPrimaryItem(container, position, object); } - @Override public boolean isViewFromObject(View view, Object object) { + @Override + public boolean isViewFromObject(View view, Object object) { return view == object; } - @Override public View getCustomTabView(ViewGroup viewGroup, int i) { - ImageView image = new ImageView(context); + @Override + public View getCustomTabView(ViewGroup viewGroup, int i) { + ImageView image = new ImageView(context); image.setScaleType(ScaleType.CENTER_INSIDE); image.setImageResource(ResUtil.getDrawableRes(context, pages.get(i).getIconAttr())); return image; diff --git a/src/org/thoughtcrime/securesms/components/emoji/EmojiFilter.java b/src/org/thoughtcrime/securesms/components/emoji/EmojiFilter.java index fbb9c267cd..2b32d5e4d9 100644 --- a/src/org/thoughtcrime/securesms/components/emoji/EmojiFilter.java +++ b/src/org/thoughtcrime/securesms/components/emoji/EmojiFilter.java @@ -13,15 +13,18 @@ public class EmojiFilter implements InputFilter { this.view = view; } - @Override public CharSequence filter(CharSequence source, int start, int end, - Spanned dest, int dstart, int dend) + @Override + public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { char[] v = new char[end - start]; TextUtils.getChars(source, start, end, v, 0); + Spannable emojified = EmojiProvider.getInstance(view.getContext()).emojify(new String(v), view); + if (source instanceof Spanned && emojified != null) { TextUtils.copySpansFrom((Spanned) source, start, end, null, emojified, 0); } + return emojified; } } diff --git a/src/org/thoughtcrime/securesms/components/emoji/EmojiPages.java b/src/org/thoughtcrime/securesms/components/emoji/EmojiPages.java index 49ad7d91b0..487d1b53a0 100644 --- a/src/org/thoughtcrime/securesms/components/emoji/EmojiPages.java +++ b/src/org/thoughtcrime/securesms/components/emoji/EmojiPages.java @@ -8,154 +8,29 @@ import java.util.List; public class EmojiPages { public static final List PAGES = Arrays.asList( new StaticEmojiPageModel(R.attr.emoji_category_people, new String[] { - "\u263a", "\ud83d\ude0a", "\ud83d\ude00", "\ud83d\ude01", "\ud83d\ude02", "\ud83d\ude03", - "\ud83d\ude04", "\ud83d\ude05", "\ud83d\ude06", "\ud83d\ude07", "\ud83d\ude08", "\ud83d\ude09", - "\ud83d\ude2f", "\ud83d\ude10", "\ud83d\ude11", "\ud83d\ude15", "\ud83d\ude20", "\ud83d\ude2c", - "\ud83d\ude21", "\ud83d\ude22", "\ud83d\ude34", "\ud83d\ude2e", "\ud83d\ude23", "\ud83d\ude24", - "\ud83d\ude25", "\ud83d\ude26", "\ud83d\ude27", "\ud83d\ude28", "\ud83d\ude29", "\ud83d\ude30", - "\ud83d\ude1f", "\ud83d\ude31", "\ud83d\ude32", "\ud83d\ude33", "\ud83d\ude35", "\ud83d\ude36", - "\ud83d\ude37", "\ud83d\ude1e", "\ud83d\ude12", "\ud83d\ude0d", "\ud83d\ude1b", "\ud83d\ude1c", - "\ud83d\ude1d", "\ud83d\ude0b", "\ud83d\ude17", "\ud83d\ude19", "\ud83d\ude18", "\ud83d\ude1a", - "\ud83d\ude0e", "\ud83d\ude2d", "\ud83d\ude0c", "\ud83d\ude16", "\ud83d\ude14", "\ud83d\ude2a", - "\ud83d\ude0f", "\ud83d\ude13", "\ud83d\ude2b", "\ud83d\ude4b", "\ud83d\ude4c", "\ud83d\ude4d", - "\ud83d\ude45", "\ud83d\ude46", "\ud83d\ude47", "\ud83d\ude4e", "\ud83d\ude4f", "\ud83d\ude3a", - "\ud83d\ude3c", "\ud83d\ude38", "\ud83d\ude39", "\ud83d\ude3b", "\ud83d\ude3d", "\ud83d\ude3f", - "\ud83d\ude3e", "\ud83d\ude40", "\ud83d\ude48", "\ud83d\ude49", "\ud83d\ude4a", "\ud83d\udca9", - "\ud83d\udc76", "\ud83d\udc66", "\ud83d\udc67", "\ud83d\udc68", "\ud83d\udc69", "\ud83d\udc74", - "\ud83d\udc75", "\ud83d\udc8f", "\ud83d\udc91", "\ud83d\udc6a", "\ud83d\udc6b", "\ud83d\udc6c", - "\ud83d\udc6d", "\ud83d\udc64", "\ud83d\udc65", "\ud83d\udc6e", "\ud83d\udc77", "\ud83d\udc81", - "\ud83d\udc82", "\ud83d\udc6f", "\ud83d\udc70", "\ud83d\udc78", "\ud83c\udf85", "\ud83d\udc7c", - "\ud83d\udc71", "\ud83d\udc72", "\ud83d\udc73", "\ud83d\udc83", "\ud83d\udc86", "\ud83d\udc87", - "\ud83d\udc85", "\ud83d\udc7b", "\ud83d\udc79", "\ud83d\udc7a", "\ud83d\udc7d", "\ud83d\udc7e", - "\ud83d\udc7f", "\ud83d\udc80", "\ud83d\udcaa", "\ud83d\udc40", "\ud83d\udc42", "\ud83d\udc43", - "\ud83d\udc63", "\ud83d\udc44", "\ud83d\udc45", "\ud83d\udc8b", "\u2764", "\ud83d\udc99", - "\ud83d\udc9a", "\ud83d\udc9b", "\ud83d\udc9c", "\ud83d\udc93", "\ud83d\udc94", "\ud83d\udc95", - "\ud83d\udc96", "\ud83d\udc97", "\ud83d\udc98", "\ud83d\udc9d", "\ud83d\udc9e", "\ud83d\udc9f", - "\ud83d\udc4d", "\ud83d\udc4e", "\ud83d\udc4c", "\u270a", "\u270c", "\u270b", - "\ud83d\udc4a", "\u261d", "\ud83d\udc46", "\ud83d\udc47", "\ud83d\udc48", "\ud83d\udc49", - "\ud83d\udc4b", "\ud83d\udc4f", "\ud83d\udc50", - }, "emoji-people.png"), - new StaticEmojiPageModel(R.attr.emoji_category_objects, new String[] { - "\ud83d\udd30", "\ud83d\udc84", "\ud83d\udc5e", "\ud83d\udc5f", "\ud83d\udc51", "\ud83d\udc52", - "\ud83c\udfa9", "\ud83c\udf93", "\ud83d\udc53", "\u231a", "\ud83d\udc54", "\ud83d\udc55", - "\ud83d\udc56", "\ud83d\udc57", "\ud83d\udc58", "\ud83d\udc59", "\ud83d\udc60", "\ud83d\udc61", - "\ud83d\udc62", "\ud83d\udc5a", "\ud83d\udc5c", "\ud83d\udcbc", "\ud83c\udf92", "\ud83d\udc5d", - "\ud83d\udc5b", "\ud83d\udcb0", "\ud83d\udcb3", "\ud83d\udcb2", "\ud83d\udcb5", "\ud83d\udcb4", - "\ud83d\udcb6", "\ud83d\udcb7", "\ud83d\udcb8", "\ud83d\udcb1", "\ud83d\udcb9", "\ud83d\udd2b", - "\ud83d\udd2a", "\ud83d\udca3", "\ud83d\udc89", "\ud83d\udc8a", "\ud83d\udeac", "\ud83d\udd14", - "\ud83d\udd15", "\ud83d\udeaa", "\ud83d\udd2c", "\ud83d\udd2d", "\ud83d\udd2e", "\ud83d\udd26", - "\ud83d\udd0b", "\ud83d\udd0c", "\ud83d\udcdc", "\ud83d\udcd7", "\ud83d\udcd8", "\ud83d\udcd9", - "\ud83d\udcda", "\ud83d\udcd4", "\ud83d\udcd2", "\ud83d\udcd1", "\ud83d\udcd3", "\ud83d\udcd5", - "\ud83d\udcd6", "\ud83d\udcf0", "\ud83d\udcdb", "\ud83c\udf83", "\ud83c\udf84", "\ud83c\udf80", - "\ud83c\udf81", "\ud83c\udf82", "\ud83c\udf88", "\ud83c\udf86", "\ud83c\udf87", "\ud83c\udf89", - "\ud83c\udf8a", "\ud83c\udf8d", "\ud83c\udf8f", "\ud83c\udf8c", "\ud83c\udf90", "\ud83c\udf8b", - "\ud83c\udf8e", "\ud83d\udcf1", "\ud83d\udcf2", "\ud83d\udcdf", "\u260e", "\ud83d\udcde", - "\ud83d\udce0", "\ud83d\udce6", "\u2709", "\ud83d\udce8", "\ud83d\udce9", "\ud83d\udcea", - "\ud83d\udceb", "\ud83d\udced", "\ud83d\udcec", "\ud83d\udcee", "\ud83d\udce4", "\ud83d\udce5", - "\ud83d\udcef", "\ud83d\udce2", "\ud83d\udce3", "\ud83d\udce1", "\ud83d\udcac", "\ud83d\udcad", - "\u2712", "\u270f", "\ud83d\udcdd", "\ud83d\udccf", "\ud83d\udcd0", "\ud83d\udccd", - "\ud83d\udccc", "\ud83d\udcce", "\u2702", "\ud83d\udcba", "\ud83d\udcbb", "\ud83d\udcbd", - "\ud83d\udcbe", "\ud83d\udcbf", "\ud83d\udcc6", "\ud83d\udcc5", "\ud83d\udcc7", "\ud83d\udccb", - "\ud83d\udcc1", "\ud83d\udcc2", "\ud83d\udcc3", "\ud83d\udcc4", "\ud83d\udcca", "\ud83d\udcc8", - "\ud83d\udcc9", "\u26fa", "\ud83c\udfa1", "\ud83c\udfa2", "\ud83c\udfa0", "\ud83c\udfaa", - "\ud83c\udfa8", "\ud83c\udfac", "\ud83c\udfa5", "\ud83d\udcf7", "\ud83d\udcf9", "\ud83c\udfa6", - "\ud83c\udfad", "\ud83c\udfab", "\ud83c\udfae", "\ud83c\udfb2", "\ud83c\udfb0", "\ud83c\udccf", - "\ud83c\udfb4", "\ud83c\udc04", "\ud83c\udfaf", "\ud83d\udcfa", "\ud83d\udcfb", "\ud83d\udcc0", - "\ud83d\udcfc", "\ud83c\udfa7", "\ud83c\udfa4", "\ud83c\udfb5", "\ud83c\udfb6", "\ud83c\udfbc", - "\ud83c\udfbb", "\ud83c\udfb9", "\ud83c\udfb7", "\ud83c\udfba", "\ud83c\udfb8", "\u303d", - }, "emoji-objects.png"), + "\ud83d\ude00", "\ud83d\ude2c", "\ud83d\ude01","\ud83d\ude02","\ud83d\ude03","\ud83d\ude04","\ud83d\ude05","\ud83d\ude06","\ud83d\ude07","\ud83d\ude09","\ud83d\ude0a","\ud83d\ude42","\ud83d\ude43","\u263a","\ud83d\ude0b","\ud83d\ude0c","\ud83d\ude0d","\ud83d\ude18","\ud83d\ude17","\ud83d\ude19","\ud83d\ude1a","\ud83d\ude1c","\ud83d\ude1d","\ud83d\ude1b","\ud83e\udd11","\ud83e\udd13","\ud83d\ude0e","\ud83e\udd17","\ud83d\ude0f","\ud83d\ude36","\ud83d\ude10","\ud83d\ude11","\ud83d\ude12","\ud83d\ude44","\ud83e\udd14","\ud83d\ude33","\ud83d\ude1e","\ud83d\ude1f","\ud83d\ude20","\ud83d\ude21","\ud83d\ude14","\ud83d\ude15","\ud83d\ude41","\u2639","\ud83d\ude23","\ud83d\ude16","\ud83d\ude2b","\ud83d\ude29","\ud83d\ude24","\ud83d\ude2e","\ud83d\ude31","\ud83d\ude28","\ud83d\ude30","\ud83d\ude2f","\ud83d\ude26","\ud83d\ude27","\ud83d\ude22","\ud83d\ude25","\ud83d\ude2a","\ud83d\ude13","\ud83d\ude2d","\ud83d\ude35","\ud83d\ude32","\ud83e\udd10","\ud83d\ude37","\ud83e\udd12","\ud83e\udd15","\ud83d\ude34","\ud83d\udca4","\ud83d\udca9","\ud83d\ude08","\ud83d\udc7f","\ud83d\udc79","\ud83d\udc7a","\ud83d\udc80","\ud83d\udc7b","\ud83d\udc7d","\ud83e\udd16","\ud83d\ude3a","\ud83d\ude38","\ud83d\ude39","\ud83d\ude3b","\ud83d\ude3c","\ud83d\ude3d","\ud83d\ude40","\ud83d\ude3f","\ud83d\ude3e","\ud83d\ude4c","\ud83d\udc4f","\ud83d\udc4b","\ud83d\udc4d","\ud83d\udc4e","\ud83d\udc4a","\u270a","\u270c","\ud83d\udc4c","\u270b","\ud83d\udc50","\ud83d\udcaa","\ud83d\ude4f","\u261d","\ud83d\udc46","\ud83d\udc47","\ud83d\udc48","\ud83d\udc49","\ud83d\udd95","\ud83d\udd90","\ud83e\udd18","\ud83d\udd96","\u270d","\ud83d\udc85","\ud83d\udc44","\ud83d\udc45","\ud83d\udc42","\ud83d\udc43","\ud83d\udc41","\ud83d\udc40","\ud83d\udc64","\ud83d\udc65","\ud83d\udde3","\ud83d\udc76","\ud83d\udc66","\ud83d\udc67","\ud83d\udc68","\ud83d\udc69","\ud83d\udc71","\ud83d\udc74","\ud83d\udc75","\ud83d\udc72","\ud83d\udc73","\ud83d\udc6e","\ud83d\udc77","\ud83d\udc82","\ud83d\udd75","\ud83c\udf85","\ud83d\udc7c","\ud83d\udc78","\ud83d\udc70","\ud83d\udeb6","\ud83c\udfc3","\ud83d\udc83","\ud83d\udc6f","\ud83d\udc6b","\ud83d\udc6c","\ud83d\udc6d","\ud83d\ude47","\ud83d\udc81","\ud83d\ude45","\ud83d\ude46","\ud83d\ude4b","\ud83d\ude4e","\ud83d\ude4d","\ud83d\udc87","\ud83d\udc86","\ud83d\udc91","\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc69","\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc68","\ud83d\udc8f","\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69","\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68","\ud83d\udc6a","\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67","\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66","\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66","\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67","\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66","\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67","\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66","\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66","\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67","\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66","\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67","\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc66","\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66","\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc67","\ud83d\udc5a","\ud83d\udc55","\ud83d\udc56","\ud83d\udc54","\ud83d\udc57","\ud83d\udc59","\ud83d\udc58","\ud83d\udc84","\ud83d\udc8b","\ud83d\udc63","\ud83d\udc60","\ud83d\udc61","\ud83d\udc62","\ud83d\udc5e","\ud83d\udc5f","\ud83d\udc52","\ud83c\udfa9","\u26d1","\ud83c\udf93","\ud83d\udc51","\ud83c\udf92","\ud83d\udc5d","\ud83d\udc5b","\ud83d\udc5c","\ud83d\udcbc","\ud83d\udc53","\ud83d\udd76","\ud83d\udc8d","\ud83c\udf02" + }, "emoji/People.png"), new StaticEmojiPageModel(R.attr.emoji_category_nature, new String[] { - "\ud83d\udc15", "\ud83d\udc36", "\ud83d\udc29", "\ud83d\udc08", "\ud83d\udc31", "\ud83d\udc00", - "\ud83d\udc01", "\ud83d\udc2d", "\ud83d\udc39", "\ud83d\udc22", "\ud83d\udc07", "\ud83d\udc30", - "\ud83d\udc13", "\ud83d\udc14", "\ud83d\udc23", "\ud83d\udc24", "\ud83d\udc25", "\ud83d\udc26", - "\ud83d\udc0f", "\ud83d\udc11", "\ud83d\udc10", "\ud83d\udc3a", "\ud83d\udc03", "\ud83d\udc02", - "\ud83d\udc04", "\ud83d\udc2e", "\ud83d\udc34", "\ud83d\udc17", "\ud83d\udc16", "\ud83d\udc37", - "\ud83d\udc3d", "\ud83d\udc38", "\ud83d\udc0d", "\ud83d\udc3c", "\ud83d\udc27", "\ud83d\udc18", - "\ud83d\udc28", "\ud83d\udc12", "\ud83d\udc35", "\ud83d\udc06", "\ud83d\udc2f", "\ud83d\udc3b", - "\ud83d\udc2b", "\ud83d\udc2a", "\ud83d\udc0a", "\ud83d\udc33", "\ud83d\udc0b", "\ud83d\udc1f", - "\ud83d\udc20", "\ud83d\udc21", "\ud83d\udc19", "\ud83d\udc1a", "\ud83d\udc2c", "\ud83d\udc0c", - "\ud83d\udc1b", "\ud83d\udc1c", "\ud83d\udc1d", "\ud83d\udc1e", "\ud83d\udc32", "\ud83d\udc09", - "\ud83d\udc3e", "\ud83c\udf78", "\ud83c\udf7a", "\ud83c\udf7b", "\ud83c\udf77", "\ud83c\udf79", - "\ud83c\udf76", "\u2615", "\ud83c\udf75", "\ud83c\udf7c", "\ud83c\udf74", "\ud83c\udf68", - "\ud83c\udf67", "\ud83c\udf66", "\ud83c\udf69", "\ud83c\udf70", "\ud83c\udf6a", "\ud83c\udf6b", - "\ud83c\udf6c", "\ud83c\udf6d", "\ud83c\udf6e", "\ud83c\udf6f", "\ud83c\udf73", "\ud83c\udf54", - "\ud83c\udf5f", "\ud83c\udf5d", "\ud83c\udf55", "\ud83c\udf56", "\ud83c\udf57", "\ud83c\udf64", - "\ud83c\udf63", "\ud83c\udf71", "\ud83c\udf5e", "\ud83c\udf5c", "\ud83c\udf59", "\ud83c\udf5a", - "\ud83c\udf5b", "\ud83c\udf72", "\ud83c\udf65", "\ud83c\udf62", "\ud83c\udf61", "\ud83c\udf58", - "\ud83c\udf60", "\ud83c\udf4c", "\ud83c\udf4e", "\ud83c\udf4f", "\ud83c\udf4a", "\ud83c\udf4b", - "\ud83c\udf44", "\ud83c\udf45", "\ud83c\udf46", "\ud83c\udf47", "\ud83c\udf48", "\ud83c\udf49", - "\ud83c\udf50", "\ud83c\udf51", "\ud83c\udf52", "\ud83c\udf53", "\ud83c\udf4d", "\ud83c\udf30", - "\ud83c\udf31", "\ud83c\udf32", "\ud83c\udf33", "\ud83c\udf34", "\ud83c\udf35", "\ud83c\udf37", - "\ud83c\udf38", "\ud83c\udf39", "\ud83c\udf40", "\ud83c\udf41", "\ud83c\udf42", "\ud83c\udf43", - "\ud83c\udf3a", "\ud83c\udf3b", "\ud83c\udf3c", "\ud83c\udf3d", "\ud83c\udf3e", "\ud83c\udf3f", - "\u2600", "\ud83c\udf08", "\u26c5", "\u2601", "\ud83c\udf01", "\ud83c\udf02", - "\u2614", "\ud83d\udca7", "\u26a1", "\ud83c\udf00", "\u2744", "\u26c4", - "\ud83c\udf19", "\ud83c\udf1e", "\ud83c\udf1d", "\ud83c\udf1a", "\ud83c\udf1b", "\ud83c\udf1c", - "\ud83c\udf11", "\ud83c\udf12", "\ud83c\udf13", "\ud83c\udf14", "\ud83c\udf15", "\ud83c\udf16", - "\ud83c\udf17", "\ud83c\udf18", "\ud83c\udf91", "\ud83c\udf04", "\ud83c\udf05", "\ud83c\udf07", - "\ud83c\udf06", "\ud83c\udf03", "\ud83c\udf0c", "\ud83c\udf09", "\ud83c\udf0a", "\ud83c\udf0b", - "\ud83c\udf0e", "\ud83c\udf0f", "\ud83c\udf0d", "\ud83c\udf10", - }, "emoji-nature.png"), + "\ud83d\udc36","\ud83d\udc31","\ud83d\udc2d","\ud83d\udc39","\ud83d\udc30","\ud83d\udc3b","\ud83d\udc3c","\ud83d\udc28","\ud83d\udc2f","\ud83e\udd81","\ud83d\udc2e","\ud83d\udc37","\ud83d\udc3d","\ud83d\udc38","\ud83d\udc19","\ud83d\udc35","\ud83d\ude48","\ud83d\ude49","\ud83d\ude4a","\ud83d\udc12","\ud83d\udc14","\ud83d\udc27","\ud83d\udc26","\ud83d\udc24","\ud83d\udc23","\ud83d\udc25","\ud83d\udc3a","\ud83d\udc17","\ud83d\udc34","\ud83e\udd84","\ud83d\udc1d","\ud83d\udc1b","\ud83d\udc0c","\ud83d\udc1e","\ud83d\udc1c","\ud83d\udd77","\ud83e\udd82","\ud83e\udd80","\ud83d\udc0d","\ud83d\udc22","\ud83d\udc20","\ud83d\udc1f","\ud83d\udc21","\ud83d\udc2c","\ud83d\udc33","\ud83d\udc0b","\ud83d\udc0a","\ud83d\udc06","\ud83d\udc05","\ud83d\udc03","\ud83d\udc02","\ud83d\udc04","\ud83d\udc2a","\ud83d\udc2b","\ud83d\udc18","\ud83d\udc10","\ud83d\udc0f","\ud83d\udc11","\ud83d\udc0e","\ud83d\udc16","\ud83d\udc00","\ud83d\udc01","\ud83d\udc13","\ud83e\udd83","\ud83d\udd4a","\ud83d\udc15","\ud83d\udc29","\ud83d\udc08","\ud83d\udc07","\ud83d\udc3f","\ud83d\udc3e","\ud83d\udc09","\ud83d\udc32","\ud83c\udf35","\ud83c\udf84","\ud83c\udf32","\ud83c\udf33","\ud83c\udf34","\ud83c\udf31","\ud83c\udf3f","\u2618","\ud83c\udf40","\ud83c\udf8d","\ud83c\udf8b","\ud83c\udf43","\ud83c\udf42","\ud83c\udf41","\ud83c\udf3e","\ud83c\udf3a","\ud83c\udf3b","\ud83c\udf39","\ud83c\udf37","\ud83c\udf3c","\ud83c\udf38","\ud83d\udc90","\ud83c\udf44","\ud83c\udf30","\ud83c\udf83","\ud83d\udc1a","\ud83d\udd78","\ud83c\udf0e","\ud83c\udf0d","\ud83c\udf0f","\ud83c\udf15","\ud83c\udf16","\ud83c\udf17","\ud83c\udf18","\ud83c\udf11","\ud83c\udf12","\ud83c\udf13","\ud83c\udf14","\ud83c\udf1a","\ud83c\udf1d","\ud83c\udf1b","\ud83c\udf1c","\ud83c\udf1e","\ud83c\udf19","\u2b50","\ud83c\udf1f","\ud83d\udcab","\u2728","\u2604","\u2600","\ud83c\udf24","\u26c5","\ud83c\udf25","\ud83c\udf26","\u2601","\ud83c\udf27","\u26c8","\ud83c\udf29","\u26a1","\ud83d\udd25","\ud83d\udca5","\u2744","\ud83c\udf28","\u2603","\u26c4","\ud83c\udf2c","\ud83d\udca8","\ud83c\udf2a","\ud83c\udf2b","\u2602","\u2614","\ud83d\udca7","\ud83d\udca6","\ud83c\udf0a" + }, "emoji/Nature.png"), + new StaticEmojiPageModel(R.attr.emoji_category_foods, new String[] { + "\ud83c\udf4f","\ud83c\udf4e","\ud83c\udf50","\ud83c\udf4a","\ud83c\udf4b","\ud83c\udf4c","\ud83c\udf49","\ud83c\udf47","\ud83c\udf53","\ud83c\udf48","\ud83c\udf52","\ud83c\udf51","\ud83c\udf4d","\ud83c\udf45","\ud83c\udf46","\ud83c\udf36","\ud83c\udf3d","\ud83c\udf60","\ud83c\udf6f","\ud83c\udf5e","\ud83e\uddc0","\ud83c\udf57","\ud83c\udf56","\ud83c\udf64","\ud83c\udf73","\ud83c\udf54","\ud83c\udf5f","\ud83c\udf2d","\ud83c\udf55","\ud83c\udf5d","\ud83c\udf2e","\ud83c\udf2f","\ud83c\udf5c","\ud83c\udf72","\ud83c\udf65","\ud83c\udf63","\ud83c\udf71","\ud83c\udf5b","\ud83c\udf59","\ud83c\udf5a","\ud83c\udf58","\ud83c\udf62","\ud83c\udf61","\ud83c\udf67","\ud83c\udf68","\ud83c\udf66","\ud83c\udf70","\ud83c\udf82","\ud83c\udf6e","\ud83c\udf6c","\ud83c\udf6d","\ud83c\udf6b","\ud83c\udf7f","\ud83c\udf69","\ud83c\udf6a","\ud83c\udf7a","\ud83c\udf7b","\ud83c\udf77","\ud83c\udf78","\ud83c\udf79","\ud83c\udf7e","\ud83c\udf76","\ud83c\udf75","\u2615","\ud83c\udf7c","\ud83c\udf74","\ud83c\udf7d" + }, "emoji/Foods.png"), + new StaticEmojiPageModel(R.attr.emoji_category_activity, new String[] { + "\u26bd","\ud83c\udfc0","\ud83c\udfc8","\u26be","\ud83c\udfbe","\ud83c\udfd0","\ud83c\udfc9","\ud83c\udfb1","\u26f3","\ud83c\udfcc","\ud83c\udfd3","\ud83c\udff8","\ud83c\udfd2","\ud83c\udfd1","\ud83c\udfcf","\ud83c\udfbf","\u26f7","\ud83c\udfc2","\u26f8","\ud83c\udff9","\ud83c\udfa3","\ud83d\udea3","\ud83c\udfca","\ud83c\udfc4","\ud83d\udec0","\u26f9","\ud83c\udfcb","\ud83d\udeb4","\ud83d\udeb5","\ud83c\udfc7","\ud83d\udd74","\ud83c\udfc6","\ud83c\udfbd","\ud83c\udfc5","\ud83c\udf96","\ud83c\udf97","\ud83c\udff5","\ud83c\udfab","\ud83c\udf9f","\ud83c\udfad","\ud83c\udfa8","\ud83c\udfaa","\ud83c\udfa4","\ud83c\udfa7","\ud83c\udfbc","\ud83c\udfb9","\ud83c\udfb7","\ud83c\udfba","\ud83c\udfb8","\ud83c\udfbb","\ud83c\udfac","\ud83c\udfae","\ud83d\udc7e","\ud83c\udfaf","\ud83c\udfb2","\ud83c\udfb0","\ud83c\udfb3" + }, "emoji/Activity.png"), new StaticEmojiPageModel(R.attr.emoji_category_places, new String[] { - "\ud83c\udfe0", "\ud83c\udfe1", "\ud83c\udfe2", "\ud83c\udfe3", "\ud83c\udfe4", "\ud83c\udfe5", - "\ud83c\udfe6", "\ud83c\udfe7", "\ud83c\udfe8", "\ud83c\udfe9", "\ud83c\udfea", "\ud83c\udfeb", - "\u26ea", "\u26f2", "\ud83c\udfec", "\ud83c\udfef", "\ud83c\udff0", "\ud83c\udfed", - "\ud83d\uddfb", "\ud83d\uddfc", "\ud83d\uddfd", "\ud83d\uddfe", "\ud83d\uddff", "\u2693", - "\ud83c\udfee", "\ud83d\udc88", "\ud83d\udd27", "\ud83d\udd28", "\ud83d\udd29", "\ud83d\udebf", - "\ud83d\udec1", "\ud83d\udec0", "\ud83d\udebd", "\ud83d\udebe", "\ud83c\udfbd", "\ud83c\udfa3", - "\ud83c\udfb1", "\ud83c\udfb3", "\u26be", "\u26f3", "\ud83c\udfbe", "\u26bd", - "\ud83c\udfbf", "\ud83c\udfc0", "\ud83c\udfc1", "\ud83c\udfc2", "\ud83c\udfc3", "\ud83c\udfc4", - "\ud83c\udfc6", "\ud83c\udfc7", "\ud83d\udc0e", "\ud83c\udfc8", "\ud83c\udfc9", "\ud83c\udfca", - "\ud83d\ude82", "\ud83d\ude83", "\ud83d\ude84", "\ud83d\ude85", "\ud83d\ude86", "\ud83d\ude87", - "\u24c2", "\ud83d\ude88", "\ud83d\ude8a", "\ud83d\ude8b", "\ud83d\ude8c", "\ud83d\ude8d", - "\ud83d\ude8e", "\ud83d\ude8f", "\ud83d\ude90", "\ud83d\ude91", "\ud83d\ude92", "\ud83d\ude93", - "\ud83d\ude94", "\ud83d\ude95", "\ud83d\ude96", "\ud83d\ude97", "\ud83d\ude98", "\ud83d\ude99", - "\ud83d\ude9a", "\ud83d\ude9b", "\ud83d\ude9c", "\ud83d\ude9d", "\ud83d\ude9e", "\ud83d\ude9f", - "\ud83d\udea0", "\ud83d\udea1", "\ud83d\udea2", "\ud83d\udea3", "\ud83d\ude81", "\u2708", - "\ud83d\udec2", "\ud83d\udec3", "\ud83d\udec4", "\ud83d\udec5", "\u26f5", "\ud83d\udeb2", - "\ud83d\udeb3", "\ud83d\udeb4", "\ud83d\udeb5", "\ud83d\udeb7", "\ud83d\udeb8", "\ud83d\ude89", - "\ud83d\ude80", "\ud83d\udea4", "\ud83d\udeb6", "\u26fd", "\ud83c\udd7f", "\ud83d\udea5", - "\ud83d\udea6", "\ud83d\udea7", "\ud83d\udea8", "\u2668", "\ud83d\udc8c", "\ud83d\udc8d", - "\ud83d\udc8e", "\ud83d\udc90", "\ud83d\udc92", - }, "emoji-places.png"), + "\ud83d\ude97","\ud83d\ude95","\ud83d\ude99","\ud83d\ude8c","\ud83d\ude8e","\ud83c\udfce","\ud83d\ude93","\ud83d\ude91","\ud83d\ude92","\ud83d\ude90","\ud83d\ude9a","\ud83d\ude9b","\ud83d\ude9c","\ud83c\udfcd","\ud83d\udeb2","\ud83d\udea8","\ud83d\ude94","\ud83d\ude8d","\ud83d\ude98","\ud83d\ude96","\ud83d\udea1","\ud83d\udea0","\ud83d\ude9f","\ud83d\ude83","\ud83d\ude8b","\ud83d\ude9d","\ud83d\ude84","\ud83d\ude85","\ud83d\ude88","\ud83d\ude9e","\ud83d\ude82","\ud83d\ude86","\ud83d\ude87","\ud83d\ude8a","\ud83d\ude89","\ud83d\ude81","\ud83d\udee9","\u2708","\ud83d\udeeb","\ud83d\udeec","\u26f5","\ud83d\udee5","\ud83d\udea4","\u26f4","\ud83d\udef3","\ud83d\ude80","\ud83d\udef0","\ud83d\udcba","\u2693","\ud83d\udea7","\u26fd","\ud83d\ude8f","\ud83d\udea6","\ud83d\udea5","\ud83c\udfc1","\ud83d\udea2","\ud83c\udfa1","\ud83c\udfa2","\ud83c\udfa0","\ud83c\udfd7","\ud83c\udf01","\ud83d\uddfc","\ud83c\udfed","\u26f2","\ud83c\udf91","\u26f0","\ud83c\udfd4","\ud83d\uddfb","\ud83c\udf0b","\ud83d\uddfe","\ud83c\udfd5","\u26fa","\ud83c\udfde","\ud83d\udee3","\ud83d\udee4","\ud83c\udf05","\ud83c\udf04","\ud83c\udfdc","\ud83c\udfd6","\ud83c\udfdd","\ud83c\udf07","\ud83c\udf06","\ud83c\udfd9","\ud83c\udf03","\ud83c\udf09","\ud83c\udf0c","\ud83c\udf20","\ud83c\udf87","\ud83c\udf86","\ud83c\udf08","\ud83c\udfd8","\ud83c\udff0","\ud83c\udfef","\ud83c\udfdf","\ud83d\uddfd","\ud83c\udfe0","\ud83c\udfe1","\ud83c\udfda","\ud83c\udfe2","\ud83c\udfec","\ud83c\udfe3","\ud83c\udfe4","\ud83c\udfe5","\ud83c\udfe6","\ud83c\udfe8","\ud83c\udfea","\ud83c\udfeb","\ud83c\udfe9","\ud83d\udc92","\ud83c\udfdb","\u26ea","\ud83d\udd4c","\ud83d\udd4d","\ud83d\udd4b","\u26e9" + }, "emoji/Places.png"), + new StaticEmojiPageModel(R.attr.emoji_category_objects, new String[] { + "\u231a","\ud83d\udcf1","\ud83d\udcf2","\ud83d\udcbb","\u2328","\ud83d\udda5","\ud83d\udda8","\ud83d\uddb1","\ud83d\uddb2","\ud83d\udd79","\ud83d\udddc","\ud83d\udcbd","\ud83d\udcbe","\ud83d\udcbf","\ud83d\udcc0","\ud83d\udcfc","\ud83d\udcf7","\ud83d\udcf8","\ud83d\udcf9","\ud83c\udfa5","\ud83d\udcfd","\ud83c\udf9e","\ud83d\udcde","\u260e","\ud83d\udcdf","\ud83d\udce0","\ud83d\udcfa","\ud83d\udcfb","\ud83c\udf99","\ud83c\udf9a","\ud83c\udf9b","\u23f1","\u23f2","\u23f0","\ud83d\udd70","\u23f3","\u231b","\ud83d\udce1","\ud83d\udd0b","\ud83d\udd0c","\ud83d\udca1","\ud83d\udd26","\ud83d\udd6f","\ud83d\uddd1","\ud83d\udee2","\ud83d\udcb8","\ud83d\udcb5","\ud83d\udcb4","\ud83d\udcb6","\ud83d\udcb7","\ud83d\udcb0","\ud83d\udcb3","\ud83d\udc8e","\u2696","\ud83d\udd27","\ud83d\udd28","\u2692","\ud83d\udee0","\u26cf","\ud83d\udd29","\u2699","\u26d3","\ud83d\udd2b","\ud83d\udca3","\ud83d\udd2a","\ud83d\udde1","\u2694","\ud83d\udee1","\ud83d\udeac","\u2620","\u26b0","\u26b1","\ud83c\udffa","\ud83d\udd2e","\ud83d\udcff","\ud83d\udc88","\u2697","\ud83d\udd2d","\ud83d\udd2c","\ud83d\udd73","\ud83d\udc8a","\ud83d\udc89","\ud83c\udf21","\ud83c\udff7","\ud83d\udd16","\ud83d\udebd","\ud83d\udebf","\ud83d\udec1","\ud83d\udd11","\ud83d\udddd","\ud83d\udecb","\ud83d\udecc","\ud83d\udecf","\ud83d\udeaa","\ud83d\udece","\ud83d\uddbc","\ud83d\uddfa","\u26f1","\ud83d\uddff","\ud83d\udecd","\ud83c\udf88","\ud83c\udf8f","\ud83c\udf80","\ud83c\udf81","\ud83c\udf8a","\ud83c\udf89","\ud83c\udf8e","\ud83c\udf90","\ud83c\udf8c","\ud83c\udfee","\u2709","\ud83d\udce9","\ud83d\udce8","\ud83d\udce7","\ud83d\udc8c","\ud83d\udcee","\ud83d\udcea","\ud83d\udceb","\ud83d\udcec","\ud83d\udced","\ud83d\udce6","\ud83d\udcef","\ud83d\udce5","\ud83d\udce4","\ud83d\udcdc","\ud83d\udcc3","\ud83d\udcd1","\ud83d\udcca","\ud83d\udcc8","\ud83d\udcc9","\ud83d\udcc4","\ud83d\udcc5","\ud83d\udcc6","\ud83d\uddd3","\ud83d\udcc7","\ud83d\uddc3","\ud83d\uddf3","\ud83d\uddc4","\ud83d\udccb","\ud83d\uddd2","\ud83d\udcc1","\ud83d\udcc2","\ud83d\uddc2","\ud83d\uddde","\ud83d\udcf0","\ud83d\udcd3","\ud83d\udcd5","\ud83d\udcd7","\ud83d\udcd8","\ud83d\udcd9","\ud83d\udcd4","\ud83d\udcd2","\ud83d\udcda","\ud83d\udcd6","\ud83d\udd17","\ud83d\udcce","\ud83d\udd87","\u2702","\ud83d\udcd0","\ud83d\udccf","\ud83d\udccc","\ud83d\udccd","\ud83d\udea9","\ud83c\udff3","\ud83c\udff4","\ud83d\udd10","\ud83d\udd12","\ud83d\udd13","\ud83d\udd0f","\ud83d\udd8a","\ud83d\udd8b","\u2712","\ud83d\udcdd","\u270f","\ud83d\udd8d","\ud83d\udd8c","\ud83d\udd0d","\ud83d\udd0e" + }, "emoji/Objects.png"), new StaticEmojiPageModel(R.attr.emoji_category_symbol, new String[] { - "\ud83d\udd1d", "\ud83d\udd19", "\ud83d\udd1b", "\ud83d\udd1c", "\ud83d\udd1a", "\u23f3", - "\u231b", "\u23f0", "\u2648", "\u2649", "\u264a", "\u264b", - "\u264c", "\u264d", "\u264e", "\u264f", "\u2650", "\u2651", - "\u2652", "\u2653", "\u26ce", "\ud83d\udd31", "\ud83d\udd2f", "\ud83d\udebb", - "\ud83d\udeae", "\ud83d\udeaf", "\ud83d\udeb0", "\ud83d\udeb1", "\ud83c\udd70", "\ud83c\udd71", - "\ud83c\udd8e", "\ud83c\udd7e", "\ud83d\udcae", "\ud83d\udcaf", "\ud83d\udd20", "\ud83d\udd21", - "\ud83d\udd22", "\ud83d\udd23", "\ud83d\udd24", "\u27bf", "\ud83d\udcf6", "\ud83d\udcf3", - "\ud83d\udcf4", "\ud83d\udcf5", "\ud83d\udeb9", "\ud83d\udeba", "\ud83d\udebc", "\u267f", - "\u267b", "\ud83d\udead", "\ud83d\udea9", "\u26a0", "\ud83c\ude01", "\ud83d\udd1e", - "\u26d4", "\ud83c\udd92", "\ud83c\udd97", "\ud83c\udd95", "\ud83c\udd98", "\ud83c\udd99", - "\ud83c\udd93", "\ud83c\udd96", "\ud83c\udd9a", "\ud83c\ude32", "\ud83c\ude33", "\ud83c\ude34", - "\ud83c\ude35", "\ud83c\ude36", "\ud83c\ude37", "\ud83c\ude38", "\ud83c\ude39", "\ud83c\ude02", - "\ud83c\ude3a", "\ud83c\ude50", "\ud83c\ude51", "\u3299", "\u00ae", "\u00a9", - "\u2122", "\ud83c\ude1a", "\ud83c\ude2f", "\u3297", "\u2b55", "\u274c", - "\u274e", "\u2139", "\ud83d\udeab", "\u2705", "\u2714", "\ud83d\udd17", - "\u2734", "\u2733", "\u2795", "\u2796", "\u2716", "\u2797", - "\ud83d\udca0", "\ud83d\udca1", "\ud83d\udca4", "\ud83d\udca2", "\ud83d\udd25", "\ud83d\udca5", - "\ud83d\udca8", "\ud83d\udca6", "\ud83d\udcab", "\ud83d\udd5b", "\ud83d\udd67", "\ud83d\udd50", - "\ud83d\udd5c", "\ud83d\udd51", "\ud83d\udd5d", "\ud83d\udd52", "\ud83d\udd5e", "\ud83d\udd53", - "\ud83d\udd5f", "\ud83d\udd54", "\ud83d\udd60", "\ud83d\udd55", "\ud83d\udd61", "\ud83d\udd56", - "\ud83d\udd62", "\ud83d\udd57", "\ud83d\udd63", "\ud83d\udd58", "\ud83d\udd64", "\ud83d\udd59", - "\ud83d\udd65", "\ud83d\udd5a", "\ud83d\udd66", "\u2195", "\u2b06", "\u2197", - "\u27a1", "\u2198", "\u2b07", "\u2199", "\u2b05", "\u2196", - "\u2194", "\u2934", "\u2935", "\u23ea", "\u23eb", "\u23ec", - "\u23e9", "\u25c0", "\u25b6", "\ud83d\udd3d", "\ud83d\udd3c", "\u2747", - "\u2728", "\ud83d\udd34", "\ud83d\udd35", "\u26aa", "\u26ab", "\ud83d\udd33", - "\ud83d\udd32", "\u2b50", "\ud83c\udf1f", "\ud83c\udf20", "\u25ab", "\u25aa", - "\u25fd", "\u25fe", "\u25fb", "\u25fc", "\u2b1c", "\u2b1b", - "\ud83d\udd38", "\ud83d\udd39", "\ud83d\udd36", "\ud83d\udd37", "\ud83d\udd3a", "\ud83d\udd3b", - "\u2754", "\u2753", "\u2755", "\u2757", "\u203c", "\u2049", - "\u3030", "\u27b0", "\u2660", "\u2665", "\u2663", "\u2666", - "\ud83c\udd94", "\ud83d\udd11", "\u21a9", "\ud83c\udd91", "\ud83d\udd0d", "\ud83d\udd12", - "\ud83d\udd13", "\u21aa", "\ud83d\udd10", "\u2611", "\ud83d\udd18", "\ud83d\udd0e", - "\ud83d\udd16", "\ud83d\udd0f", "\ud83d\udd03", "\ud83d\udd00", "\ud83d\udd01", "\ud83d\udd02", - "\ud83d\udd04", "\ud83d\udce7", "\ud83d\udd05", "\ud83d\udd06", "\ud83d\udd07", "\ud83d\udd08", - "\ud83d\udd09", "\ud83d\udd0a", - }, "emoji-symbol.png"), + "\u2764","\ud83d\udc9b","\ud83d\udc9a","\ud83d\udc99","\ud83d\udc9c","\ud83d\udc94","\u2763","\ud83d\udc95","\ud83d\udc9e","\ud83d\udc93","\ud83d\udc97","\ud83d\udc96","\ud83d\udc98","\ud83d\udc9d","\ud83d\udc9f","\u262e","\u271d","\u262a","\ud83d\udd49","\u2638","\u2721","\ud83d\udd2f","\ud83d\udd4e","\u262f","\u2626","\ud83d\uded0","\u26ce","\u2648","\u2649","\u264a","\u264b","\u264c","\u264d","\u264e","\u264f","\u2650","\u2651","\u2652","\u2653","\ud83c\udd94","\u269b","\ud83c\ude33","\ud83c\ude39","\u2622","\u2623","\ud83d\udcf4","\ud83d\udcf3","\ud83c\ude36","\ud83c\ude1a","\ud83c\ude38","\ud83c\ude3a","\ud83c\ude37","\u2734","\ud83c\udd9a","\ud83c\ude51","\ud83d\udcae","\ud83c\ude50","\u3299","\u3297","\ud83c\ude34","\ud83c\ude35","\ud83c\ude32","\ud83c\udd70","\ud83c\udd71","\ud83c\udd8e","\ud83c\udd91","\ud83c\udd7e","\ud83c\udd98","\u26d4","\ud83d\udcdb","\ud83d\udeab","\u274c","\u2b55","\ud83d\udca2","\u2668","\ud83d\udeb7","\ud83d\udeaf","\ud83d\udeb3","\ud83d\udeb1","\ud83d\udd1e","\ud83d\udcf5","\u2757","\u2755","\u2753","\u2754","\u203c","\u2049","\ud83d\udcaf","\ud83d\udd05","\ud83d\udd06","\ud83d\udd31","\u269c","\u303d","\u26a0","\ud83d\udeb8","\ud83d\udd30","\u267b","\ud83c\ude2f","\ud83d\udcb9","\u2747","\u2733","\u274e","\u2705","\ud83d\udca0","\ud83c\udf00","\u27bf","\ud83c\udf10","\u24c2","\ud83c\udfe7","\ud83c\ude02","\ud83d\udec2","\ud83d\udec3","\ud83d\udec4","\ud83d\udec5","\u267f","\ud83d\udead","\ud83d\udebe","\ud83c\udd7f","\ud83d\udeb0","\ud83d\udeb9","\ud83d\udeba","\ud83d\udebc","\ud83d\udebb","\ud83d\udeae","\ud83c\udfa6","\ud83d\udcf6","\ud83c\ude01","\ud83c\udd96","\ud83c\udd97","\ud83c\udd99","\ud83c\udd92","\ud83c\udd95","\ud83c\udd93","\u0030\u20e3","\u0031\u20e3","\u0032\u20e3","\u0033\u20e3","\u0034\u20e3","\u0035\u20e3","\u0036\u20e3","\u0037\u20e3","\u0038\u20e3","\u0039\u20e3","\ud83d\udd1f","\u002a\u20e3","\ud83d\udd22","\u25b6","\u23f8","\u23ef","\u23f9","\u23fa","\u23ed","\u23ee","\u23e9","\u23ea","\ud83d\udd00","\ud83d\udd01","\ud83d\udd02","\u25c0","\ud83d\udd3c","\ud83d\udd3d","\u23eb","\u23ec","\u27a1","\u2b05","\u2b06","\u2b07","\u2197","\u2198","\u2199","\u2196","\u2195","\u2194","\ud83d\udd04","\u21aa","\u21a9","\u2934","\u2935","\u0023\u20e3","\u2139","\ud83d\udd24","\ud83d\udd21","\ud83d\udd20","\ud83d\udd23","\ud83c\udfb5","\ud83c\udfb6","\u3030","\u27b0","\u2714","\ud83d\udd03","\u2795","\u2796","\u2797","\u2716","\ud83d\udcb2","\ud83d\udcb1","\u00a9","\u00ae","\u2122","\ud83d\udd1a","\ud83d\udd19","\ud83d\udd1b","\ud83d\udd1d","\ud83d\udd1c","\u2611","\ud83d\udd18","\u26aa","\u26ab","\ud83d\udd34","\ud83d\udd35","\ud83d\udd38","\ud83d\udd39","\ud83d\udd36","\ud83d\udd37","\ud83d\udd3a","\u25aa","\u25ab","\u2b1b","\u2b1c","\ud83d\udd3b","\u25fc","\u25fb","\u25fe","\u25fd","\ud83d\udd32","\ud83d\udd33","\ud83d\udd08","\ud83d\udd09","\ud83d\udd0a","\ud83d\udd07","\ud83d\udce3","\ud83d\udce2","\ud83d\udd14","\ud83d\udd15","\ud83c\udccf","\ud83c\udc04","\u2660","\u2663","\u2665","\u2666","\ud83c\udfb4","\ud83d\udcad","\ud83d\uddef","\ud83d\udcac","\ud83d\udde8","\ud83d\udd50","\ud83d\udd51","\ud83d\udd52","\ud83d\udd53","\ud83d\udd54","\ud83d\udd55","\ud83d\udd56","\ud83d\udd57","\ud83d\udd58","\ud83d\udd59","\ud83d\udd5a","\ud83d\udd5b","\ud83d\udd5c","\ud83d\udd5d","\ud83d\udd5e","\ud83d\udd5f","\ud83d\udd60","\ud83d\udd61","\ud83d\udd62","\ud83d\udd63","\ud83d\udd64","\ud83d\udd65","\ud83d\udd66","\ud83d\udd67" + }, "emoji/Symbols.png"), + new StaticEmojiPageModel(R.attr.emoji_category_flags, new String[] { + "\ud83c\udde6\ud83c\uddeb","\ud83c\udde6\ud83c\uddfd","\ud83c\udde6\ud83c\uddf1","\ud83c\udde9\ud83c\uddff","\ud83c\udde6\ud83c\uddf8","\ud83c\udde6\ud83c\udde9","\ud83c\udde6\ud83c\uddf4","\ud83c\udde6\ud83c\uddee","\ud83c\udde6\ud83c\uddf6","\ud83c\udde6\ud83c\uddec","\ud83c\udde6\ud83c\uddf7","\ud83c\udde6\ud83c\uddf2","\ud83c\udde6\ud83c\uddfc","\ud83c\udde6\ud83c\uddfa","\ud83c\udde6\ud83c\uddf9","\ud83c\udde6\ud83c\uddff","\ud83c\udde7\ud83c\uddf8","\ud83c\udde7\ud83c\udded","\ud83c\udde7\ud83c\udde9","\ud83c\udde7\ud83c\udde7","\ud83c\udde7\ud83c\uddfe","\ud83c\udde7\ud83c\uddea","\ud83c\udde7\ud83c\uddff","\ud83c\udde7\ud83c\uddef","\ud83c\udde7\ud83c\uddf2","\ud83c\udde7\ud83c\uddf9","\ud83c\udde7\ud83c\uddf4","\ud83c\udde7\ud83c\uddf6","\ud83c\udde7\ud83c\udde6","\ud83c\udde7\ud83c\uddfc","\ud83c\udde7\ud83c\uddf7","\ud83c\uddee\ud83c\uddf4","\ud83c\uddfb\ud83c\uddec","\ud83c\udde7\ud83c\uddf3","\ud83c\udde7\ud83c\uddec","\ud83c\udde7\ud83c\uddeb","\ud83c\udde7\ud83c\uddee","\ud83c\udde8\ud83c\uddfb","\ud83c\uddf0\ud83c\udded","\ud83c\udde8\ud83c\uddf2","\ud83c\udde8\ud83c\udde6","\ud83c\uddee\ud83c\udde8","\ud83c\uddf0\ud83c\uddfe","\ud83c\udde8\ud83c\uddeb","\ud83c\uddf9\ud83c\udde9","\ud83c\udde8\ud83c\uddf1","\ud83c\udde8\ud83c\uddf3","\ud83c\udde8\ud83c\uddfd","\ud83c\udde8\ud83c\udde8","\ud83c\udde8\ud83c\uddf4","\ud83c\uddf0\ud83c\uddf2","\ud83c\udde8\ud83c\uddec","\ud83c\udde8\ud83c\udde9","\ud83c\udde8\ud83c\uddf0","\ud83c\udde8\ud83c\uddf7","\ud83c\udded\ud83c\uddf7","\ud83c\udde8\ud83c\uddfa","\ud83c\udde8\ud83c\uddfc","\ud83c\udde8\ud83c\uddfe","\ud83c\udde8\ud83c\uddff","\ud83c\udde9\ud83c\uddf0","\ud83c\udde9\ud83c\uddef","\ud83c\udde9\ud83c\uddf2","\ud83c\udde9\ud83c\uddf4","\ud83c\uddea\ud83c\udde8","\ud83c\uddea\ud83c\uddec","\ud83c\uddf8\ud83c\uddfb","\ud83c\uddec\ud83c\uddf6","\ud83c\uddea\ud83c\uddf7","\ud83c\uddea\ud83c\uddea","\ud83c\uddea\ud83c\uddf9","\ud83c\uddea\ud83c\uddfa","\ud83c\uddeb\ud83c\uddf0","\ud83c\uddeb\ud83c\uddf4","\ud83c\uddeb\ud83c\uddef","\ud83c\uddeb\ud83c\uddee","\ud83c\uddeb\ud83c\uddf7","\ud83c\uddec\ud83c\uddeb","\ud83c\uddf5\ud83c\uddeb","\ud83c\uddf9\ud83c\uddeb","\ud83c\uddec\ud83c\udde6","\ud83c\uddec\ud83c\uddf2","\ud83c\uddec\ud83c\uddea","\ud83c\udde9\ud83c\uddea","\ud83c\uddec\ud83c\udded","\ud83c\uddec\ud83c\uddee","\ud83c\uddec\ud83c\uddf7","\ud83c\uddec\ud83c\uddf1","\ud83c\uddec\ud83c\udde9","\ud83c\uddec\ud83c\uddf5","\ud83c\uddec\ud83c\uddfa","\ud83c\uddec\ud83c\uddf9","\ud83c\uddec\ud83c\uddec","\ud83c\uddec\ud83c\uddf3","\ud83c\uddec\ud83c\uddfc","\ud83c\uddec\ud83c\uddfe","\ud83c\udded\ud83c\uddf9","\ud83c\udded\ud83c\uddf3","\ud83c\udded\ud83c\uddf0","\ud83c\udded\ud83c\uddfa","\ud83c\uddee\ud83c\uddf8","\ud83c\uddee\ud83c\uddf3","\ud83c\uddee\ud83c\udde9","\ud83c\uddee\ud83c\uddf7","\ud83c\uddee\ud83c\uddf6","\ud83c\uddee\ud83c\uddea","\ud83c\uddee\ud83c\uddf2","\ud83c\uddee\ud83c\uddf1","\ud83c\uddee\ud83c\uddf9","\ud83c\udde8\ud83c\uddee","\ud83c\uddef\ud83c\uddf2","\ud83c\uddef\ud83c\uddf5","\ud83c\uddef\ud83c\uddea","\ud83c\uddef\ud83c\uddf4","\ud83c\uddf0\ud83c\uddff","\ud83c\uddf0\ud83c\uddea","\ud83c\uddf0\ud83c\uddee","\ud83c\uddfd\ud83c\uddf0","\ud83c\uddf0\ud83c\uddfc","\ud83c\uddf0\ud83c\uddec","\ud83c\uddf1\ud83c\udde6","\ud83c\uddf1\ud83c\uddfb","\ud83c\uddf1\ud83c\udde7","\ud83c\uddf1\ud83c\uddf8","\ud83c\uddf1\ud83c\uddf7","\ud83c\uddf1\ud83c\uddfe","\ud83c\uddf1\ud83c\uddee","\ud83c\uddf1\ud83c\uddf9","\ud83c\uddf1\ud83c\uddfa","\ud83c\uddf2\ud83c\uddf4","\ud83c\uddf2\ud83c\uddf0","\ud83c\uddf2\ud83c\uddec","\ud83c\uddf2\ud83c\uddfc","\ud83c\uddf2\ud83c\uddfe","\ud83c\uddf2\ud83c\uddfb","\ud83c\uddf2\ud83c\uddf1","\ud83c\uddf2\ud83c\uddf9","\ud83c\uddf2\ud83c\udded","\ud83c\uddf2\ud83c\uddf6","\ud83c\uddf2\ud83c\uddf7","\ud83c\uddf2\ud83c\uddfa","\ud83c\uddfe\ud83c\uddf9","\ud83c\uddf2\ud83c\uddfd","\ud83c\uddeb\ud83c\uddf2","\ud83c\uddf2\ud83c\udde9","\ud83c\uddf2\ud83c\udde8","\ud83c\uddf2\ud83c\uddf3","\ud83c\uddf2\ud83c\uddea","\ud83c\uddf2\ud83c\uddf8","\ud83c\uddf2\ud83c\udde6","\ud83c\uddf2\ud83c\uddff","\ud83c\uddf2\ud83c\uddf2","\ud83c\uddf3\ud83c\udde6","\ud83c\uddf3\ud83c\uddf7","\ud83c\uddf3\ud83c\uddf5","\ud83c\uddf3\ud83c\uddf1","\ud83c\uddf3\ud83c\udde8","\ud83c\uddf3\ud83c\uddff","\ud83c\uddf3\ud83c\uddee","\ud83c\uddf3\ud83c\uddea","\ud83c\uddf3\ud83c\uddec","\ud83c\uddf3\ud83c\uddfa","\ud83c\uddf3\ud83c\uddeb","\ud83c\uddf2\ud83c\uddf5","\ud83c\uddf0\ud83c\uddf5","\ud83c\uddf3\ud83c\uddf4","\ud83c\uddf4\ud83c\uddf2","\ud83c\uddf5\ud83c\uddf0","\ud83c\uddf5\ud83c\uddfc","\ud83c\uddf5\ud83c\uddf8","\ud83c\uddf5\ud83c\udde6","\ud83c\uddf5\ud83c\uddec","\ud83c\uddf5\ud83c\uddfe","\ud83c\uddf5\ud83c\uddea","\ud83c\uddf5\ud83c\udded","\ud83c\uddf5\ud83c\uddf3","\ud83c\uddf5\ud83c\uddf1","\ud83c\uddf5\ud83c\uddf9","\ud83c\uddf5\ud83c\uddf7","\ud83c\uddf6\ud83c\udde6","\ud83c\uddf7\ud83c\uddea","\ud83c\uddf7\ud83c\uddf4","\ud83c\uddf7\ud83c\uddfa","\ud83c\uddf7\ud83c\uddfc","\ud83c\udde7\ud83c\uddf1","\ud83c\uddf8\ud83c\udded","\ud83c\uddf0\ud83c\uddf3","\ud83c\uddf1\ud83c\udde8","\ud83c\uddf5\ud83c\uddf2","\ud83c\uddfb\ud83c\udde8","\ud83c\uddfc\ud83c\uddf8","\ud83c\uddf8\ud83c\uddf2","\ud83c\uddf8\ud83c\uddf9","\ud83c\uddf8\ud83c\udde6","\ud83c\uddf8\ud83c\uddf3","\ud83c\uddf7\ud83c\uddf8","\ud83c\uddf8\ud83c\udde8","\ud83c\uddf8\ud83c\uddf1","\ud83c\uddf8\ud83c\uddec","\ud83c\uddf8\ud83c\uddfd","\ud83c\uddf8\ud83c\uddf0","\ud83c\uddf8\ud83c\uddee","\ud83c\uddf8\ud83c\udde7","\ud83c\uddf8\ud83c\uddf4","\ud83c\uddff\ud83c\udde6","\ud83c\uddec\ud83c\uddf8","\ud83c\uddf0\ud83c\uddf7","\ud83c\uddf8\ud83c\uddf8","\ud83c\uddea\ud83c\uddf8","\ud83c\uddf1\ud83c\uddf0","\ud83c\uddf8\ud83c\udde9","\ud83c\uddf8\ud83c\uddf7","\ud83c\uddf8\ud83c\uddff","\ud83c\uddf8\ud83c\uddea","\ud83c\udde8\ud83c\udded","\ud83c\uddf8\ud83c\uddfe","\ud83c\uddf9\ud83c\uddfc","\ud83c\uddf9\ud83c\uddef","\ud83c\uddf9\ud83c\uddff","\ud83c\uddf9\ud83c\udded","\ud83c\uddf9\ud83c\uddf1","\ud83c\uddf9\ud83c\uddec","\ud83c\uddf9\ud83c\uddf0","\ud83c\uddf9\ud83c\uddf4","\ud83c\uddf9\ud83c\uddf9","\ud83c\uddf9\ud83c\uddf3","\ud83c\uddf9\ud83c\uddf7","\ud83c\uddf9\ud83c\uddf2","\ud83c\uddf9\ud83c\udde8","\ud83c\uddf9\ud83c\uddfb","\ud83c\uddfa\ud83c\uddec","\ud83c\uddfa\ud83c\udde6","\ud83c\udde6\ud83c\uddea","\ud83c\uddec\ud83c\udde7","\ud83c\uddfa\ud83c\uddf8","\ud83c\uddfb\ud83c\uddee","\ud83c\uddfa\ud83c\uddfe","\ud83c\uddfa\ud83c\uddff","\ud83c\uddfb\ud83c\uddfa","\ud83c\uddfb\ud83c\udde6","\ud83c\uddfb\ud83c\uddea","\ud83c\uddfb\ud83c\uddf3","\ud83c\uddfc\ud83c\uddeb","\ud83c\uddea\ud83c\udded","\ud83c\uddfe\ud83c\uddea","\ud83c\uddff\ud83c\uddf2","\ud83c\uddff\ud83c\uddfc","\ud83c\udde6\ud83c\udde8","\ud83c\udde7\ud83c\uddfb","\ud83c\udde8\ud83c\uddf5","\ud83c\udde9\ud83c\uddec","\ud83c\uddea\ud83c\udde6","\ud83c\udded\ud83c\uddf2","\ud83c\uddf2\ud83c\uddeb","\ud83c\uddf8\ud83c\uddef","\ud83c\uddf9\ud83c\udde6","\ud83c\uddfa\ud83c\uddf2" + }, "emoji/Flags.png"), new StaticEmojiPageModel(R.attr.emoji_category_emoticons, new String[] { ":-)", ";-)", "(-:", ":->", ":-D", "\\o/", ":-P", "B-)", ":-$", ":-*", "O:-)", "=-O", diff --git a/src/org/thoughtcrime/securesms/components/emoji/EmojiProvider.java b/src/org/thoughtcrime/securesms/components/emoji/EmojiProvider.java index 295d988aea..eab1a0597d 100644 --- a/src/org/thoughtcrime/securesms/components/emoji/EmojiProvider.java +++ b/src/org/thoughtcrime/securesms/components/emoji/EmojiProvider.java @@ -9,7 +9,6 @@ import android.graphics.Paint; import android.graphics.PixelFormat; import android.graphics.Rect; import android.graphics.drawable.Drawable; -import android.os.AsyncTask; import android.os.Build.VERSION; import android.os.Build.VERSION_CODES; import android.support.annotation.NonNull; @@ -17,42 +16,33 @@ import android.support.annotation.Nullable; import android.text.Spannable; import android.text.SpannableStringBuilder; import android.util.Log; -import android.util.SparseArray; import android.widget.TextView; import org.thoughtcrime.securesms.R; -import org.thoughtcrime.securesms.util.BitmapDecodingException; -import org.thoughtcrime.securesms.util.BitmapUtil; +import org.thoughtcrime.securesms.components.emoji.parsing.EmojiDrawInfo; +import org.thoughtcrime.securesms.components.emoji.parsing.EmojiPageBitmap; +import org.thoughtcrime.securesms.components.emoji.parsing.EmojiParser; +import org.thoughtcrime.securesms.components.emoji.parsing.EmojiTree; import org.thoughtcrime.securesms.util.FutureTaskListener; -import org.thoughtcrime.securesms.util.ListenableFutureTask; import org.thoughtcrime.securesms.util.Util; -import java.io.IOException; -import java.lang.ref.SoftReference; -import java.util.concurrent.Callable; -import java.util.regex.Matcher; -import java.util.regex.Pattern; +import java.util.List; + +class EmojiProvider { -public class EmojiProvider { private static final String TAG = EmojiProvider.class.getSimpleName(); private static volatile EmojiProvider instance = null; private static final Paint paint = new Paint(Paint.FILTER_BITMAP_FLAG | Paint.ANTI_ALIAS_FLAG); - private final SparseArray offsets = new SparseArray<>(); + private final EmojiTree emojiTree = new EmojiTree(); - @SuppressWarnings("MalformedRegex") - // 0x203c,0x2049 0x20a0-0x32ff 0x1f00-0x1fff 0xfe4e5-0xfe4ee - // |== !!, ?! ==||==== misc ====||======== emoticons ========||========= flags ==========| - private static final Pattern EMOJI_RANGE = Pattern.compile("[\\u203c\\u2049\\u20a0-\\u32ff\\ud83c\\udc00-\\ud83d\\udeff\\udbb9\\udce5-\\udbb9\\udcee]"); + private static final int EMOJI_RAW_HEIGHT = 64; + private static final int EMOJI_RAW_WIDTH = 64; + private static final int EMOJI_VERT_PAD = 0; + private static final int EMOJI_PER_ROW = 32; - public static final int EMOJI_RAW_HEIGHT = 64; - public static final int EMOJI_RAW_WIDTH = 64; - public static final int EMOJI_VERT_PAD = 0; - public static final int EMOJI_PER_ROW = 32; - - private final Context context; - private final float decodeScale; - private final float verticalPad; + private final float decodeScale; + private final float verticalPad; public static EmojiProvider getInstance(Context context) { if (instance == null) { @@ -66,29 +56,31 @@ public class EmojiProvider { } private EmojiProvider(Context context) { - this.context = context.getApplicationContext(); this.decodeScale = Math.min(1f, context.getResources().getDimension(R.dimen.emoji_drawer_size) / EMOJI_RAW_HEIGHT); this.verticalPad = EMOJI_VERT_PAD * this.decodeScale; + for (EmojiPageModel page : EmojiPages.PAGES) { if (page.hasSpriteMap()) { - final EmojiPageBitmap pageBitmap = new EmojiPageBitmap(page); - for (int i=0; i < page.getEmoji().length; i++) { - offsets.put(Character.codePointAt(page.getEmoji()[i], 0), new DrawInfo(pageBitmap, i)); + EmojiPageBitmap pageBitmap = new EmojiPageBitmap(context, page, decodeScale); + + for (int i=0;i matches = new EmojiParser(emojiTree).findCandidates(text); + SpannableStringBuilder builder = new SpannableStringBuilder(text); + + for (EmojiParser.Candidate candidate : matches) { + Drawable drawable = getEmojiDrawable(candidate.getDrawInfo()); + if (drawable != null) { - builder.setSpan(new EmojiSpan(drawable, tv), matches.start(), matches.end(), + builder.setSpan(new EmojiSpan(drawable, tv), candidate.getStartIndex(), candidate.getEndIndex(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } } @@ -96,17 +88,18 @@ public class EmojiProvider { return builder; } - public Drawable getEmojiDrawable(int emojiCode) { - return getEmojiDrawable(offsets.get(emojiCode)); + @Nullable Drawable getEmojiDrawable(CharSequence emoji) { + EmojiDrawInfo drawInfo = emojiTree.getEmoji(emoji, 0, emoji.length()); + return getEmojiDrawable(drawInfo); } - private Drawable getEmojiDrawable(DrawInfo drawInfo) { + private @Nullable Drawable getEmojiDrawable(@Nullable EmojiDrawInfo drawInfo) { if (drawInfo == null) { return null; } final EmojiDrawable drawable = new EmojiDrawable(drawInfo, decodeScale); - drawInfo.page.get().addListener(new FutureTaskListener() { + drawInfo.getPage().get().addListener(new FutureTaskListener() { @Override public void onSuccess(final Bitmap result) { Util.runOnMain(new Runnable() { @Override public void run() { @@ -122,34 +115,36 @@ public class EmojiProvider { return drawable; } - public class EmojiDrawable extends Drawable { - private final DrawInfo info; - private Bitmap bmp; - private float intrinsicWidth; - private float intrinsicHeight; + class EmojiDrawable extends Drawable { + private final EmojiDrawInfo info; + private Bitmap bmp; + private float intrinsicWidth; + private float intrinsicHeight; - @Override public int getIntrinsicWidth() { + @Override + public int getIntrinsicWidth() { return (int)intrinsicWidth; } - @Override public int getIntrinsicHeight() { + @Override + public int getIntrinsicHeight() { return (int)intrinsicHeight; } - public EmojiDrawable(DrawInfo info, float decodeScale) { + EmojiDrawable(EmojiDrawInfo info, float decodeScale) { this.info = info; this.intrinsicWidth = EMOJI_RAW_WIDTH * decodeScale; this.intrinsicHeight = EMOJI_RAW_HEIGHT * decodeScale; } @Override - public void draw(Canvas canvas) { + public void draw(@NonNull Canvas canvas) { if (bmp == null) { return; } - final int row = info.index / EMOJI_PER_ROW; - final int row_index = info.index % EMOJI_PER_ROW; + final int row = info.getIndex() / EMOJI_PER_ROW; + final int row_index = info.getIndex() % EMOJI_PER_ROW; canvas.drawBitmap(bmp, new Rect((int)(row_index * intrinsicWidth), @@ -181,85 +176,4 @@ public class EmojiProvider { public void setColorFilter(ColorFilter cf) { } } - private static class DrawInfo { - EmojiPageBitmap page; - int index; - - public DrawInfo(final EmojiPageBitmap page, final int index) { - this.page = page; - this.index = index; - } - - @Override - public String toString() { - return "DrawInfo{" + - "page=" + page + - ", index=" + index + - '}'; - } - } - - private class EmojiPageBitmap { - private EmojiPageModel model; - private SoftReference bitmapReference; - private ListenableFutureTask task; - - public EmojiPageBitmap(EmojiPageModel model) { - this.model = model; - } - - private ListenableFutureTask get() { - Util.assertMainThread(); - - if (bitmapReference != null && bitmapReference.get() != null) { - return new ListenableFutureTask<>(bitmapReference.get()); - } else if (task != null) { - return task; - } else { - Callable callable = new Callable() { - @Override public Bitmap call() throws Exception { - try { - Log.w(TAG, "loading page " + model.getSprite()); - return loadPage(); - } catch (IOException ioe) { - Log.w(TAG, ioe); - } - return null; - } - }; - task = new ListenableFutureTask<>(callable); - new AsyncTask() { - @Override protected Void doInBackground(Void... params) { - task.run(); - return null; - } - - @Override protected void onPostExecute(Void aVoid) { - task = null; - } - }.execute(); - } - return task; - } - - private Bitmap loadPage() throws IOException { - if (bitmapReference != null && bitmapReference.get() != null) return bitmapReference.get(); - - try { - final Bitmap bitmap = BitmapUtil.createScaledBitmap(context, - "file:///android_asset/" + model.getSprite(), - decodeScale); - bitmapReference = new SoftReference<>(bitmap); - Log.w(TAG, "onPageLoaded(" + model.getSprite() + ")"); - return bitmap; - } catch (BitmapDecodingException e) { - Log.w(TAG, e); - throw new IOException(e); - } - } - - @Override public String toString() { - return model.getSprite(); - } - } } diff --git a/src/org/thoughtcrime/securesms/components/emoji/EmojiView.java b/src/org/thoughtcrime/securesms/components/emoji/EmojiView.java index 63b52213d6..720f0c53dd 100644 --- a/src/org/thoughtcrime/securesms/components/emoji/EmojiView.java +++ b/src/org/thoughtcrime/securesms/components/emoji/EmojiView.java @@ -32,7 +32,7 @@ public class EmojiView extends View implements Drawable.Callback { public void setEmoji(String emoji) { this.emoji = emoji; this.drawable = EmojiProvider.getInstance(getContext()) - .getEmojiDrawable(Character.codePointAt(emoji, 0)); + .getEmojiDrawable(emoji); postInvalidate(); } diff --git a/src/org/thoughtcrime/securesms/components/emoji/parsing/EmojiDrawInfo.java b/src/org/thoughtcrime/securesms/components/emoji/parsing/EmojiDrawInfo.java new file mode 100644 index 0000000000..142b2b2549 --- /dev/null +++ b/src/org/thoughtcrime/securesms/components/emoji/parsing/EmojiDrawInfo.java @@ -0,0 +1,31 @@ +package org.thoughtcrime.securesms.components.emoji.parsing; + + +import android.support.annotation.NonNull; + +public class EmojiDrawInfo { + + private final EmojiPageBitmap page; + private final int index; + + public EmojiDrawInfo(final @NonNull EmojiPageBitmap page, final int index) { + this.page = page; + this.index = index; + } + + public @NonNull EmojiPageBitmap getPage() { + return page; + } + + public int getIndex() { + return index; + } + + @Override + public String toString() { + return "DrawInfo{" + + "page=" + page + + ", index=" + index + + '}'; + } +} \ No newline at end of file diff --git a/src/org/thoughtcrime/securesms/components/emoji/parsing/EmojiPageBitmap.java b/src/org/thoughtcrime/securesms/components/emoji/parsing/EmojiPageBitmap.java new file mode 100644 index 0000000000..da90721eab --- /dev/null +++ b/src/org/thoughtcrime/securesms/components/emoji/parsing/EmojiPageBitmap.java @@ -0,0 +1,90 @@ +package org.thoughtcrime.securesms.components.emoji.parsing; + +import android.content.Context; +import android.graphics.Bitmap; +import android.os.AsyncTask; +import android.support.annotation.NonNull; +import android.util.Log; + +import org.thoughtcrime.securesms.components.emoji.EmojiPageModel; +import org.thoughtcrime.securesms.util.BitmapDecodingException; +import org.thoughtcrime.securesms.util.BitmapUtil; +import org.thoughtcrime.securesms.util.ListenableFutureTask; +import org.thoughtcrime.securesms.util.Util; + +import java.io.IOException; +import java.lang.ref.SoftReference; +import java.util.concurrent.Callable; + +public class EmojiPageBitmap { + + private static final String TAG = EmojiPageBitmap.class.getName(); + + private final Context context; + private final EmojiPageModel model; + private final float decodeScale; + + private SoftReference bitmapReference; + private ListenableFutureTask task; + + public EmojiPageBitmap(@NonNull Context context, @NonNull EmojiPageModel model, float decodeScale) { + this.context = context.getApplicationContext(); + this.model = model; + this.decodeScale = decodeScale; + } + + public ListenableFutureTask get() { + Util.assertMainThread(); + + if (bitmapReference != null && bitmapReference.get() != null) { + return new ListenableFutureTask<>(bitmapReference.get()); + } else if (task != null) { + return task; + } else { + Callable callable = new Callable() { + @Override public Bitmap call() throws Exception { + try { + Log.w(TAG, "loading page " + model.getSprite()); + return loadPage(); + } catch (IOException ioe) { + Log.w(TAG, ioe); + } + return null; + } + }; + task = new ListenableFutureTask<>(callable); + new AsyncTask() { + @Override protected Void doInBackground(Void... params) { + task.run(); + return null; + } + + @Override protected void onPostExecute(Void aVoid) { + task = null; + } + }.execute(); + } + return task; + } + + private Bitmap loadPage() throws IOException { + if (bitmapReference != null && bitmapReference.get() != null) return bitmapReference.get(); + + try { + final Bitmap bitmap = BitmapUtil.createScaledBitmap(context, + "file:///android_asset/" + model.getSprite(), + decodeScale); + bitmapReference = new SoftReference<>(bitmap); + Log.w(TAG, "onPageLoaded(" + model.getSprite() + ")"); + return bitmap; + } catch (BitmapDecodingException e) { + Log.w(TAG, e); + throw new IOException(e); + } + } + + @Override + public String toString() { + return model.getSprite(); + } +} diff --git a/src/org/thoughtcrime/securesms/components/emoji/parsing/EmojiParser.java b/src/org/thoughtcrime/securesms/components/emoji/parsing/EmojiParser.java new file mode 100644 index 0000000000..95a92b0b2d --- /dev/null +++ b/src/org/thoughtcrime/securesms/components/emoji/parsing/EmojiParser.java @@ -0,0 +1,108 @@ +/** + * Copyright (c) 2014-present Vincent DURMONT vdurmont@gmail.com + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +package org.thoughtcrime.securesms.components.emoji.parsing; + + +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; + +import java.util.LinkedList; +import java.util.List; + +/** + * Based in part on code from emoji-java + */ +public class EmojiParser { + + private final EmojiTree emojiTree; + + public EmojiParser(EmojiTree emojiTree) { + this.emojiTree = emojiTree; + } + + public @NonNull List findCandidates(@Nullable CharSequence text) { + List results = new LinkedList<>(); + + if (text == null) return results; + + for (int i = 0; i < text.length(); i++) { + int emojiEnd = getEmojiEndPos(text, i); + + if (emojiEnd != -1) { + EmojiDrawInfo drawInfo = emojiTree.getEmoji(text, i, emojiEnd); + + if (emojiEnd + 2 <= text.length()) { + if (Fitzpatrick.fitzpatrickFromUnicode(text, emojiEnd) != null) { + emojiEnd += 2; + } + } + + results.add(new Candidate(i, emojiEnd, drawInfo)); + + i = emojiEnd - 1; + } + } + + return results; + } + + private int getEmojiEndPos(CharSequence text, int startPos) { + int best = -1; + + for (int j = startPos + 1; j <= text.length(); j++) { + EmojiTree.Matches status = emojiTree.isEmoji(text, startPos, j); + + if (status.exactMatch()) { + best = j; + } else if (status.impossibleMatch()) { + return best; + } + } + + return best; + } + + public class Candidate { + + private final int startIndex; + private final int endIndex; + private final EmojiDrawInfo drawInfo; + + Candidate(int startIndex, int endIndex, EmojiDrawInfo drawInfo) { + this.startIndex = startIndex; + this.endIndex = endIndex; + this.drawInfo = drawInfo; + } + + public EmojiDrawInfo getDrawInfo() { + return drawInfo; + } + + public int getEndIndex() { + return endIndex; + } + + public int getStartIndex() { + return startIndex; + } + } + +} diff --git a/src/org/thoughtcrime/securesms/components/emoji/parsing/EmojiTree.java b/src/org/thoughtcrime/securesms/components/emoji/parsing/EmojiTree.java new file mode 100644 index 0000000000..dc8ea7c5d8 --- /dev/null +++ b/src/org/thoughtcrime/securesms/components/emoji/parsing/EmojiTree.java @@ -0,0 +1,128 @@ +/** + * Copyright (c) 2014-present Vincent DURMONT vdurmont@gmail.com + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +package org.thoughtcrime.securesms.components.emoji.parsing; + +import android.support.annotation.Nullable; + +import java.util.HashMap; +import java.util.Map; + +/** + * Based in part on code from emoji-java + */ +public class EmojiTree { + + private final EmojiTreeNode root = new EmojiTreeNode(); + + public void add(String emojiEncoding, EmojiDrawInfo emoji) { + EmojiTreeNode tree = root; + + for (char c: emojiEncoding.toCharArray()) { + if (!tree.hasChild(c)) { + tree.addChild(c); + } + + tree = tree.getChild(c); + } + + tree.setEmoji(emoji); + } + + public Matches isEmoji(CharSequence sequence, int startPosition, int endPosition) { + if (sequence == null) { + return Matches.POSSIBLY; + } + + EmojiTreeNode tree = root; + + for (int i=startPosition; i children = new HashMap<>(); + private EmojiDrawInfo emoji; + + public void setEmoji(EmojiDrawInfo emoji) { + this.emoji = emoji; + } + + public @Nullable EmojiDrawInfo getEmoji() { + return emoji; + } + + boolean hasChild(char child) { + return children.containsKey(child); + } + + void addChild(char child) { + children.put(child, new EmojiTreeNode()); + } + + EmojiTreeNode getChild(char child) { + return children.get(child); + } + + boolean isEndOfEmoji() { + return emoji != null; + } + } + + public enum Matches { + EXACTLY, POSSIBLY, IMPOSSIBLE; + + public boolean exactMatch() { + return this == EXACTLY; + } + + public boolean impossibleMatch() { + return this == IMPOSSIBLE; + } + } + +} diff --git a/src/org/thoughtcrime/securesms/components/emoji/parsing/Fitzpatrick.java b/src/org/thoughtcrime/securesms/components/emoji/parsing/Fitzpatrick.java new file mode 100644 index 0000000000..68315a6eb6 --- /dev/null +++ b/src/org/thoughtcrime/securesms/components/emoji/parsing/Fitzpatrick.java @@ -0,0 +1,64 @@ +package org.thoughtcrime.securesms.components.emoji.parsing; + + +public enum Fitzpatrick { + /** + * Fitzpatrick modifier of type 1/2 (pale white/white) + */ + TYPE_1_2("\uD83C\uDFFB"), + + /** + * Fitzpatrick modifier of type 3 (cream white) + */ + TYPE_3("\uD83C\uDFFC"), + + /** + * Fitzpatrick modifier of type 4 (moderate brown) + */ + TYPE_4("\uD83C\uDFFD"), + + /** + * Fitzpatrick modifier of type 5 (dark brown) + */ + TYPE_5("\uD83C\uDFFE"), + + /** + * Fitzpatrick modifier of type 6 (black) + */ + TYPE_6("\uD83C\uDFFF"); + + /** + * The unicode representation of the Fitzpatrick modifier + */ + public final String unicode; + + Fitzpatrick(String unicode) { + this.unicode = unicode; + } + + + public static Fitzpatrick fitzpatrickFromUnicode(CharSequence unicode, int index) { + for (Fitzpatrick v : values()) { + boolean match = true; + + for (int i=0;i