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