diff --git a/assets/emoji/Activity.png b/assets/emoji/Activity.png
deleted file mode 100644
index 9a9afa372..000000000
Binary files a/assets/emoji/Activity.png and /dev/null differ
diff --git a/assets/emoji/Activity.webp b/assets/emoji/Activity.webp
new file mode 100644
index 000000000..a042c903a
Binary files /dev/null and b/assets/emoji/Activity.webp differ
diff --git a/assets/emoji/Flags.png b/assets/emoji/Flags.png
deleted file mode 100644
index 8916c9eb3..000000000
Binary files a/assets/emoji/Flags.png and /dev/null differ
diff --git a/assets/emoji/Flags_0.webp b/assets/emoji/Flags_0.webp
new file mode 100644
index 000000000..dda5daf5f
Binary files /dev/null and b/assets/emoji/Flags_0.webp differ
diff --git a/assets/emoji/Flags_1.webp b/assets/emoji/Flags_1.webp
new file mode 100644
index 000000000..09b130e36
Binary files /dev/null and b/assets/emoji/Flags_1.webp differ
diff --git a/assets/emoji/Foods.png b/assets/emoji/Foods.png
deleted file mode 100644
index 7d2edd011..000000000
Binary files a/assets/emoji/Foods.png and /dev/null differ
diff --git a/assets/emoji/Foods.webp b/assets/emoji/Foods.webp
new file mode 100644
index 000000000..86d488df7
Binary files /dev/null and b/assets/emoji/Foods.webp differ
diff --git a/assets/emoji/Nature.png b/assets/emoji/Nature.png
deleted file mode 100644
index 0a55d7798..000000000
Binary files a/assets/emoji/Nature.png and /dev/null differ
diff --git a/assets/emoji/Nature.webp b/assets/emoji/Nature.webp
new file mode 100644
index 000000000..71df32b3a
Binary files /dev/null and b/assets/emoji/Nature.webp differ
diff --git a/assets/emoji/Objects.png b/assets/emoji/Objects.png
deleted file mode 100644
index 8f6673765..000000000
Binary files a/assets/emoji/Objects.png and /dev/null differ
diff --git a/assets/emoji/Objects.webp b/assets/emoji/Objects.webp
new file mode 100644
index 000000000..1d45f0453
Binary files /dev/null and b/assets/emoji/Objects.webp differ
diff --git a/assets/emoji/People.png b/assets/emoji/People.png
deleted file mode 100644
index f7ddb895d..000000000
Binary files a/assets/emoji/People.png and /dev/null differ
diff --git a/assets/emoji/People_0.webp b/assets/emoji/People_0.webp
new file mode 100644
index 000000000..0987fede5
Binary files /dev/null and b/assets/emoji/People_0.webp differ
diff --git a/assets/emoji/People_1.webp b/assets/emoji/People_1.webp
new file mode 100644
index 000000000..2dba98860
Binary files /dev/null and b/assets/emoji/People_1.webp differ
diff --git a/assets/emoji/People_2.webp b/assets/emoji/People_2.webp
new file mode 100644
index 000000000..0bfcc9ef0
Binary files /dev/null and b/assets/emoji/People_2.webp differ
diff --git a/assets/emoji/People_3.webp b/assets/emoji/People_3.webp
new file mode 100644
index 000000000..f8fbad883
Binary files /dev/null and b/assets/emoji/People_3.webp differ
diff --git a/assets/emoji/People_4.webp b/assets/emoji/People_4.webp
new file mode 100644
index 000000000..2138e6b15
Binary files /dev/null and b/assets/emoji/People_4.webp differ
diff --git a/assets/emoji/People_5.webp b/assets/emoji/People_5.webp
new file mode 100644
index 000000000..d4dc8e037
Binary files /dev/null and b/assets/emoji/People_5.webp differ
diff --git a/assets/emoji/People_6.webp b/assets/emoji/People_6.webp
new file mode 100644
index 000000000..c9958b050
Binary files /dev/null and b/assets/emoji/People_6.webp differ
diff --git a/assets/emoji/Places.png b/assets/emoji/Places.png
deleted file mode 100644
index 6acfeace2..000000000
Binary files a/assets/emoji/Places.png and /dev/null differ
diff --git a/assets/emoji/Places.webp b/assets/emoji/Places.webp
new file mode 100644
index 000000000..3a67f1005
Binary files /dev/null and b/assets/emoji/Places.webp differ
diff --git a/assets/emoji/Symbols.png b/assets/emoji/Symbols.png
deleted file mode 100644
index fc1e55cfe..000000000
Binary files a/assets/emoji/Symbols.png and /dev/null differ
diff --git a/assets/emoji/Symbols.webp b/assets/emoji/Symbols.webp
new file mode 100644
index 000000000..23b72ef11
Binary files /dev/null and b/assets/emoji/Symbols.webp differ
diff --git a/delta-chat-2019-10-29-0.bak b/delta-chat-2019-10-29-0.bak
new file mode 100644
index 000000000..9d552344a
Binary files /dev/null and b/delta-chat-2019-10-29-0.bak differ
diff --git a/res/drawable/emoji_variation_selector_background_dark.xml b/res/drawable/emoji_variation_selector_background_dark.xml
new file mode 100644
index 000000000..4e74acb29
--- /dev/null
+++ b/res/drawable/emoji_variation_selector_background_dark.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/drawable/emoji_variation_selector_background_light.xml b/res/drawable/emoji_variation_selector_background_light.xml
new file mode 100644
index 000000000..415acd689
--- /dev/null
+++ b/res/drawable/emoji_variation_selector_background_light.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/drawable/ic_emoji_activity_dark_20.xml b/res/drawable/ic_emoji_activity_dark_20.xml
new file mode 100644
index 000000000..6ccda12c2
--- /dev/null
+++ b/res/drawable/ic_emoji_activity_dark_20.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/res/drawable/ic_emoji_activity_light_20.xml b/res/drawable/ic_emoji_activity_light_20.xml
new file mode 100644
index 000000000..3bd79a59e
--- /dev/null
+++ b/res/drawable/ic_emoji_activity_light_20.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/res/drawable/ic_emoji_animal_dark_20.xml b/res/drawable/ic_emoji_animal_dark_20.xml
new file mode 100644
index 000000000..2f6f4c0be
--- /dev/null
+++ b/res/drawable/ic_emoji_animal_dark_20.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/res/drawable/ic_emoji_animal_light_20.xml b/res/drawable/ic_emoji_animal_light_20.xml
new file mode 100644
index 000000000..d98064887
--- /dev/null
+++ b/res/drawable/ic_emoji_animal_light_20.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/res/drawable/ic_emoji_emoticon_dark_20.xml b/res/drawable/ic_emoji_emoticon_dark_20.xml
new file mode 100644
index 000000000..f6632dc8b
--- /dev/null
+++ b/res/drawable/ic_emoji_emoticon_dark_20.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/res/drawable/ic_emoji_emoticon_light_20.xml b/res/drawable/ic_emoji_emoticon_light_20.xml
new file mode 100644
index 000000000..5c7451c9f
--- /dev/null
+++ b/res/drawable/ic_emoji_emoticon_light_20.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/res/drawable/ic_emoji_filled.xml b/res/drawable/ic_emoji_filled.xml
new file mode 100644
index 000000000..ed160bb6d
--- /dev/null
+++ b/res/drawable/ic_emoji_filled.xml
@@ -0,0 +1,4 @@
+
+
+
diff --git a/res/drawable/ic_emoji_flag_dark_20.xml b/res/drawable/ic_emoji_flag_dark_20.xml
new file mode 100644
index 000000000..c0bb7374b
--- /dev/null
+++ b/res/drawable/ic_emoji_flag_dark_20.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/res/drawable/ic_emoji_flag_light_20.xml b/res/drawable/ic_emoji_flag_light_20.xml
new file mode 100644
index 000000000..3f7fcaade
--- /dev/null
+++ b/res/drawable/ic_emoji_flag_light_20.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/res/drawable/ic_emoji_food_dark_20.xml b/res/drawable/ic_emoji_food_dark_20.xml
new file mode 100644
index 000000000..fbe0cc0e8
--- /dev/null
+++ b/res/drawable/ic_emoji_food_dark_20.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/res/drawable/ic_emoji_food_light_20.xml b/res/drawable/ic_emoji_food_light_20.xml
new file mode 100644
index 000000000..e3f9fe24d
--- /dev/null
+++ b/res/drawable/ic_emoji_food_light_20.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/res/drawable/ic_emoji_object_dark_20.xml b/res/drawable/ic_emoji_object_dark_20.xml
new file mode 100644
index 000000000..5bd584032
--- /dev/null
+++ b/res/drawable/ic_emoji_object_dark_20.xml
@@ -0,0 +1,4 @@
+
+
+
diff --git a/res/drawable/ic_emoji_object_light_20.xml b/res/drawable/ic_emoji_object_light_20.xml
new file mode 100644
index 000000000..64b5c9c7d
--- /dev/null
+++ b/res/drawable/ic_emoji_object_light_20.xml
@@ -0,0 +1,4 @@
+
+
+
diff --git a/res/drawable/ic_emoji_outline.xml b/res/drawable/ic_emoji_outline.xml
new file mode 100644
index 000000000..943277e7a
--- /dev/null
+++ b/res/drawable/ic_emoji_outline.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/res/drawable/ic_emoji_people_dark_20.xml b/res/drawable/ic_emoji_people_dark_20.xml
new file mode 100644
index 000000000..81c9cc17d
--- /dev/null
+++ b/res/drawable/ic_emoji_people_dark_20.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/res/drawable/ic_emoji_people_light_20.xml b/res/drawable/ic_emoji_people_light_20.xml
new file mode 100644
index 000000000..46b89a8b0
--- /dev/null
+++ b/res/drawable/ic_emoji_people_light_20.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/res/drawable/ic_emoji_smiley_outline_24.xml b/res/drawable/ic_emoji_smiley_outline_24.xml
new file mode 100644
index 000000000..f91dbdb6e
--- /dev/null
+++ b/res/drawable/ic_emoji_smiley_outline_24.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/res/drawable/ic_emoji_smiley_solid_24.xml b/res/drawable/ic_emoji_smiley_solid_24.xml
new file mode 100644
index 000000000..cdd980226
--- /dev/null
+++ b/res/drawable/ic_emoji_smiley_solid_24.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/res/drawable/ic_emoji_symbol_dark_20.xml b/res/drawable/ic_emoji_symbol_dark_20.xml
new file mode 100644
index 000000000..fe6d2774f
--- /dev/null
+++ b/res/drawable/ic_emoji_symbol_dark_20.xml
@@ -0,0 +1,4 @@
+
+
+
diff --git a/res/drawable/ic_emoji_symbol_light_20.xml b/res/drawable/ic_emoji_symbol_light_20.xml
new file mode 100644
index 000000000..7e2065747
--- /dev/null
+++ b/res/drawable/ic_emoji_symbol_light_20.xml
@@ -0,0 +1,4 @@
+
+
+
diff --git a/res/drawable/ic_emoji_travel_dark_20.xml b/res/drawable/ic_emoji_travel_dark_20.xml
new file mode 100644
index 000000000..4f0430f19
--- /dev/null
+++ b/res/drawable/ic_emoji_travel_dark_20.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/res/drawable/ic_emoji_travel_light_20.xml b/res/drawable/ic_emoji_travel_light_20.xml
new file mode 100644
index 000000000..23874d599
--- /dev/null
+++ b/res/drawable/ic_emoji_travel_light_20.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/res/drawable/media_keyboard_selected_background_dark.xml b/res/drawable/media_keyboard_selected_background_dark.xml
new file mode 100644
index 000000000..e2ee498ad
--- /dev/null
+++ b/res/drawable/media_keyboard_selected_background_dark.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/drawable/media_keyboard_selected_background_light.xml b/res/drawable/media_keyboard_selected_background_light.xml
new file mode 100644
index 000000000..c28a36f78
--- /dev/null
+++ b/res/drawable/media_keyboard_selected_background_light.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/drawable/triangle_bottom_right_corner.xml b/res/drawable/triangle_bottom_right_corner.xml
new file mode 100644
index 000000000..eb3aa0799
--- /dev/null
+++ b/res/drawable/triangle_bottom_right_corner.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
diff --git a/res/layout/conversation_activity.xml b/res/layout/conversation_activity.xml
index fe7c14206..106b79d17 100644
--- a/res/layout/conversation_activity.xml
+++ b/res/layout/conversation_activity.xml
@@ -52,11 +52,11 @@
+ android:id="@+id/emoji_drawer_stub"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:inflatedId="@+id/emoji_drawer"
+ android:layout="@layout/conversation_activity_emojidrawer_stub" />
diff --git a/res/layout/conversation_activity_emojidrawer_stub.xml b/res/layout/conversation_activity_emojidrawer_stub.xml
index d29a342ea..c52ae1d33 100644
--- a/res/layout/conversation_activity_emojidrawer_stub.xml
+++ b/res/layout/conversation_activity_emojidrawer_stub.xml
@@ -1,5 +1,5 @@
-
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/layout/emoji_grid_layout.xml b/res/layout/emoji_grid_layout.xml
index 39a98af9f..ccbd5c85d 100644
--- a/res/layout/emoji_grid_layout.xml
+++ b/res/layout/emoji_grid_layout.xml
@@ -4,16 +4,11 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
-
+
\ No newline at end of file
diff --git a/res/layout/emoji_keyboard_icon_dark.xml b/res/layout/emoji_keyboard_icon_dark.xml
new file mode 100644
index 000000000..804b7cbbd
--- /dev/null
+++ b/res/layout/emoji_keyboard_icon_dark.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/layout/emoji_keyboard_icon_dark_selected.xml b/res/layout/emoji_keyboard_icon_dark_selected.xml
new file mode 100644
index 000000000..8705af1ff
--- /dev/null
+++ b/res/layout/emoji_keyboard_icon_dark_selected.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/layout/emoji_keyboard_icon_light.xml b/res/layout/emoji_keyboard_icon_light.xml
new file mode 100644
index 000000000..c7f71a189
--- /dev/null
+++ b/res/layout/emoji_keyboard_icon_light.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/layout/emoji_keyboard_icon_light_selected.xml b/res/layout/emoji_keyboard_icon_light_selected.xml
new file mode 100644
index 000000000..c10425659
--- /dev/null
+++ b/res/layout/emoji_keyboard_icon_light_selected.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/layout/emoji_variation_selector.xml b/res/layout/emoji_variation_selector.xml
new file mode 100644
index 000000000..9fcdf73b4
--- /dev/null
+++ b/res/layout/emoji_variation_selector.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/layout/emoji_variation_selector_item.xml b/res/layout/emoji_variation_selector_item.xml
new file mode 100644
index 000000000..5fb46b900
--- /dev/null
+++ b/res/layout/emoji_variation_selector_item.xml
@@ -0,0 +1,8 @@
+
+
+
+
\ No newline at end of file
diff --git a/res/layout/map_bubble_layout.xml b/res/layout/map_bubble_layout.xml
index 8b4b5a00d..bd3c6fc4f 100644
--- a/res/layout/map_bubble_layout.xml
+++ b/res/layout/map_bubble_layout.xml
@@ -48,7 +48,6 @@
android:paddingTop="@dimen/message_bubble_top_padding"
android:textColor="?conversation_item_outgoing_text_primary_color"
android:textColorLink="?conversation_item_outgoing_text_primary_color"
- app:createInBackground="true"
app:scaleEmojis="true"
tools:text="Mango pickle lorem ipsum"/>
diff --git a/res/layout/media_keyboard.xml b/res/layout/media_keyboard.xml
new file mode 100644
index 000000000..4d5980af7
--- /dev/null
+++ b/res/layout/media_keyboard.xml
@@ -0,0 +1,149 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/layout/media_keyboard_bottom_tab_item.xml b/res/layout/media_keyboard_bottom_tab_item.xml
new file mode 100644
index 000000000..5b9d41793
--- /dev/null
+++ b/res/layout/media_keyboard_bottom_tab_item.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/values/attrs.xml b/res/values/attrs.xml
index 5f8d43f96..d66f102f5 100644
--- a/res/values/attrs.xml
+++ b/res/values/attrs.xml
@@ -1,6 +1,8 @@
+
+
@@ -51,6 +53,7 @@
+
@@ -61,9 +64,11 @@
+
+
@@ -146,6 +151,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -187,11 +205,6 @@
-
-
-
-
-
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index f2a095597..9d9b2a889 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -6,6 +6,7 @@
110dp
170dp
5dp
+ 48dp
1.5dp
5dp
16sp
@@ -36,6 +37,10 @@
1dp
+ 5dp
+ 4dp
+
+ 40dp
12dp
12dp
52dp
diff --git a/res/values/themes.xml b/res/values/themes.xml
index 7a5b11484..cfe7bd807 100644
--- a/res/values/themes.xml
+++ b/res/values/themes.xml
@@ -137,6 +137,7 @@
- #44555555
- @color/gray20
- @color/black
+ - @color/grey_100
- @drawable/emoji_category_recent_light
- @drawable/emoji_category_people_light
@@ -148,7 +149,7 @@
- @drawable/emoji_category_symbol_light
- @drawable/emoji_category_flags_light
- @drawable/emoji_category_emoticons_light
-
+ - @drawable/emoji_variation_selector_background_light
- @color/white
@@ -202,6 +203,8 @@
- #ff1d85d7
- @color/delta_primary_dark
+ - @color/grey_700
+ - @color/grey_100
- @drawable/ic_group_grey600_24dp
- @style/PreferenceThemeOverlay.Fix
@@ -313,6 +316,7 @@
- @color/gray70
- @color/black
- @color/white
+ - @color/grey_700
- @drawable/emoji_category_recent_dark
- @drawable/emoji_category_people_dark
@@ -324,6 +328,7 @@
- @drawable/emoji_category_symbol_dark
- @drawable/emoji_category_flags_dark
- @drawable/emoji_category_emoticons_dark
+ - @drawable/emoji_variation_selector_background_dark
- @drawable/quick_camera_dark
- @drawable/ic_mic_white_24dp
@@ -346,6 +351,9 @@
- @color/delta_primary_dark
- @color/core_white
+ - @color/grey_100
+ - ?icon_tint
+
- @drawable/ic_group_white_24dp
- @style/PreferenceThemeOverlay.Fix
diff --git a/src/org/thoughtcrime/securesms/ConversationActivity.java b/src/org/thoughtcrime/securesms/ConversationActivity.java
index 7280f0723..f4c777288 100644
--- a/src/org/thoughtcrime/securesms/ConversationActivity.java
+++ b/src/org/thoughtcrime/securesms/ConversationActivity.java
@@ -80,7 +80,8 @@ import org.thoughtcrime.securesms.components.SendButton;
import org.thoughtcrime.securesms.components.camera.QuickAttachmentDrawer;
import org.thoughtcrime.securesms.components.camera.QuickAttachmentDrawer.AttachmentDrawerListener;
import org.thoughtcrime.securesms.components.camera.QuickAttachmentDrawer.DrawerState;
-import org.thoughtcrime.securesms.components.emoji.EmojiDrawer;
+import org.thoughtcrime.securesms.components.emoji.EmojiKeyboardProvider;
+import org.thoughtcrime.securesms.components.emoji.MediaKeyboard;
import org.thoughtcrime.securesms.components.reminder.ReminderView;
import org.thoughtcrime.securesms.connect.ApplicationDcContext;
import org.thoughtcrime.securesms.connect.DcHelper;
@@ -139,6 +140,17 @@ import static org.thoughtcrime.securesms.util.RelayUtil.isSharing;
*/
@SuppressLint("StaticFieldLeak")
public class ConversationActivity extends PassphraseRequiredActionBarActivity
+ /*implements xAttachmentManager.AttachmentListener,
+ xOnKeyboardShownListener,
+ xInputPanel.Listener,
+ xInputPanel.MediaListener,
+ xComposeText.CursorPositionChangedListener,
+ xConversationSearchBottomBar.EventListener,
+ StickerKeyboardProvider.StickerEventListener,
+ AttachmentKeyboard.Callback,
+ xConversationReactionOverlay.OnReactionSelectedListener,
+ xReactWithAnyEmojiBottomSheetDialogFragment.Callback*/
+
implements ConversationFragment.ConversationFragmentListener,
AttachmentManager.AttachmentListener,
SearchView.OnQueryTextListener,
@@ -180,7 +192,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
private AttachmentTypeSelector attachmentTypeSelector;
private AttachmentManager attachmentManager;
private AudioRecorder audioRecorder;
- private Stub emojiDrawerStub;
+ private Stub emojiDrawerStub;
protected HidingLinearLayout quickAttachmentToggle;
private QuickAttachmentDrawer quickAttachmentDrawer;
private InputPanel inputPanel;
@@ -258,6 +270,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
@Override
protected void onNewIntent(Intent intent) {
+ super.onNewIntent(intent);
Log.w(TAG, "onNewIntent()");
if (isFinishing()) {
@@ -1371,8 +1384,8 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
@Override
public void onEmojiToggle() {
if (!emojiDrawerStub.resolved()) {
- inputPanel.setEmojiDrawer(emojiDrawerStub.get());
- emojiDrawerStub.get().setEmojiEventListener(inputPanel);
+ initializeMediaKeyboardProviders(emojiDrawerStub.get(), false);
+ inputPanel.setMediaKeyboard(emojiDrawerStub.get());
}
if (container.getCurrentInput() == emojiDrawerStub.get()) {
@@ -1396,6 +1409,13 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
}
+ private void initializeMediaKeyboardProviders(@NonNull MediaKeyboard mediaKeyboard, boolean stickersAvailable) {
+ boolean isSystemEmojiPreferred = Prefs.isSystemEmojiPreferred(this);
+ if (!isSystemEmojiPreferred) {
+ mediaKeyboard.setProviders(0, new EmojiKeyboardProvider(this, inputPanel));
+ }
+ }
+
// Listeners
private class AttachmentTypeListener implements AttachmentTypeSelector.AttachmentClickedListener {
@@ -1521,6 +1541,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
@Override
public void handleReplyMessage(DcMsg messageRecord) {
+ inputPanel.clickOnComposeInput();
}
@Override
diff --git a/src/org/thoughtcrime/securesms/CreateProfileActivity.java b/src/org/thoughtcrime/securesms/CreateProfileActivity.java
index 9dd9faf3b..1d8470c77 100644
--- a/src/org/thoughtcrime/securesms/CreateProfileActivity.java
+++ b/src/org/thoughtcrime/securesms/CreateProfileActivity.java
@@ -33,7 +33,8 @@ import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.soundcloud.android.crop.Crop;
import org.thoughtcrime.securesms.components.InputAwareLayout;
-import org.thoughtcrime.securesms.components.emoji.EmojiDrawer;
+import org.thoughtcrime.securesms.components.emoji.EmojiKeyboardProvider;
+import org.thoughtcrime.securesms.components.emoji.MediaKeyboard;
import org.thoughtcrime.securesms.connect.DcHelper;
import org.thoughtcrime.securesms.contacts.avatars.ResourceContactPhoto;
import org.thoughtcrime.securesms.mms.GlideApp;
@@ -49,6 +50,7 @@ import org.thoughtcrime.securesms.util.IntentUtils;
import org.thoughtcrime.securesms.util.Prefs;
import org.thoughtcrime.securesms.util.Util;
import org.thoughtcrime.securesms.util.ViewUtil;
+import org.thoughtcrime.securesms.util.views.Stub;
import java.io.ByteArrayOutputStream;
import java.io.File;
@@ -61,7 +63,7 @@ import java.util.List;
import static android.provider.MediaStore.EXTRA_OUTPUT;
@SuppressLint("StaticFieldLeak")
-public class CreateProfileActivity extends BaseActionBarActivity {
+public class CreateProfileActivity extends BaseActionBarActivity implements EmojiKeyboardProvider.EmojiEventListener {
private static final String TAG = CreateProfileActivity.class.getSimpleName();
@@ -75,7 +77,7 @@ public class CreateProfileActivity extends BaseActionBarActivity {
private InputAwareLayout container;
private ImageView avatar;
private EditText name;
- private EmojiDrawer emojiDrawer;
+ private MediaKeyboard emojiDrawer;
private TextInputEditText statusView;
private View reveal;
@@ -300,24 +302,30 @@ public class CreateProfileActivity extends BaseActionBarActivity {
}
}
+
+ @Override
+ public void onEmojiSelected(String emoji) {
+ final int start = name.getSelectionStart();
+ final int end = name.getSelectionEnd();
+
+ name.getText().replace(Math.min(start, end), Math.max(start, end), emoji);
+ name.setSelection(start + emoji.length());
+ }
+
+ @Override
+ public void onKeyEvent(KeyEvent keyEvent) {
+ name.dispatchKeyEvent(keyEvent);
+ }
+
+ private void initializeMediaKeyboardProviders(@NonNull MediaKeyboard mediaKeyboard) {
+ boolean isSystemEmojiPreferred = Prefs.isSystemEmojiPreferred(this);
+ if (!isSystemEmojiPreferred) {
+ mediaKeyboard.setProviders(0, new EmojiKeyboardProvider(this, this));
+ }
+ }
+
private void initializeEmojiInput() {
-
- this.emojiDrawer.setEmojiEventListener(new EmojiDrawer.EmojiEventListener() {
- @Override
- public void onKeyEvent(KeyEvent keyEvent) {
- name.dispatchKeyEvent(keyEvent);
- }
-
- @Override
- public void onEmojiSelected(String emoji) {
- final int start = name.getSelectionStart();
- final int end = name.getSelectionEnd();
-
- name.getText().replace(Math.min(start, end), Math.max(start, end), emoji);
- name.setSelection(start + emoji.length());
- }
- });
-
+ initializeMediaKeyboardProviders(emojiDrawer);
this.name.setOnClickListener(v -> container.showSoftkey(name));
}
@@ -420,4 +428,5 @@ public class CreateProfileActivity extends BaseActionBarActivity {
String newStatus = statusView.getText().toString().trim();
DcHelper.set(this, DcHelper.CONFIG_SELF_STATUS, newStatus);
}
+
}
diff --git a/src/org/thoughtcrime/securesms/components/ControllableViewPager.java b/src/org/thoughtcrime/securesms/components/ControllableViewPager.java
new file mode 100644
index 000000000..9b917fa13
--- /dev/null
+++ b/src/org/thoughtcrime/securesms/components/ControllableViewPager.java
@@ -0,0 +1,34 @@
+package org.thoughtcrime.securesms.components;
+
+import android.content.Context;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.viewpager.widget.ViewPager;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+
+import org.thoughtcrime.securesms.components.viewpager.HackyViewPager;
+
+/**
+ * An implementation of {@link ViewPager} that disables swiping when the view is disabled.
+ */
+public class ControllableViewPager extends HackyViewPager {
+
+ public ControllableViewPager(@NonNull Context context) {
+ super(context);
+ }
+
+ public ControllableViewPager(@NonNull Context context, @Nullable AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent ev) {
+ return isEnabled() && super.onTouchEvent(ev);
+ }
+
+ @Override
+ public boolean onInterceptTouchEvent(MotionEvent ev) {
+ return isEnabled() && super.onInterceptTouchEvent(ev);
+ }
+}
diff --git a/src/org/thoughtcrime/securesms/components/InputPanel.java b/src/org/thoughtcrime/securesms/components/InputPanel.java
index 285bdfa9e..5133eb04a 100644
--- a/src/org/thoughtcrime/securesms/components/InputPanel.java
+++ b/src/org/thoughtcrime/securesms/components/InputPanel.java
@@ -4,9 +4,6 @@ import android.annotation.TargetApi;
import android.content.Context;
import android.net.Uri;
import android.os.Build;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.core.view.ViewCompat;
import android.text.format.DateUtils;
import android.util.AttributeSet;
import android.util.Log;
@@ -20,9 +17,14 @@ import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.core.view.ViewCompat;
+
import org.thoughtcrime.securesms.R;
-import org.thoughtcrime.securesms.components.emoji.EmojiDrawer;
+import org.thoughtcrime.securesms.components.emoji.EmojiKeyboardProvider;
import org.thoughtcrime.securesms.components.emoji.EmojiToggle;
+import org.thoughtcrime.securesms.components.emoji.MediaKeyboard;
import org.thoughtcrime.securesms.util.Prefs;
import org.thoughtcrime.securesms.util.Util;
import org.thoughtcrime.securesms.util.ViewUtil;
@@ -36,26 +38,26 @@ import java.util.concurrent.atomic.AtomicLong;
public class InputPanel extends LinearLayout
implements MicrophoneRecorderView.Listener,
KeyboardAwareLinearLayout.OnKeyboardShownListener,
- EmojiDrawer.EmojiEventListener
+ EmojiKeyboardProvider.EmojiEventListener
{
private static final String TAG = InputPanel.class.getSimpleName();
private static final int FADE_TIME = 150;
- private EmojiToggle emojiToggle;
- private ComposeText composeText;
- private View quickCameraToggle;
- private View quickAudioToggle;
- private View buttonToggle;
- private View recordingContainer;
+ private EmojiToggle mediaKeyboard;
+ private ComposeText composeText;
+ private View quickCameraToggle;
+ private View quickAudioToggle;
+ private View buttonToggle;
+ private View recordingContainer;
private MicrophoneRecorderView microphoneRecorderView;
private SlideToCancel slideToCancel;
private RecordTime recordTime;
private @Nullable Listener listener;
- private boolean emojiVisible;
+ private boolean emojiVisible;
public InputPanel(Context context) {
super(context);
@@ -74,13 +76,13 @@ public class InputPanel extends LinearLayout
public void onFinishInflate() {
super.onFinishInflate();
- this.emojiToggle = findViewById(R.id.emoji_toggle);
+
+ this.mediaKeyboard = findViewById(R.id.emoji_toggle);
this.composeText = findViewById(R.id.embedded_text_editor);
this.quickCameraToggle = findViewById(R.id.quick_camera_toggle);
this.quickAudioToggle = findViewById(R.id.quick_audio_toggle);
this.buttonToggle = findViewById(R.id.button_toggle);
this.recordingContainer = findViewById(R.id.recording_container);
- this.recordTime = new RecordTime(findViewById(R.id.record_time));
this.slideToCancel = new SlideToCancel(findViewById(R.id.slide_to_cancel));
this.microphoneRecorderView = findViewById(R.id.recorder_view);
this.microphoneRecorderView.setListener(this);
@@ -91,10 +93,10 @@ public class InputPanel extends LinearLayout
}
if (Prefs.isSystemEmojiPreferred(getContext())) {
- emojiToggle.setVisibility(View.GONE);
+ mediaKeyboard.setVisibility(View.GONE);
emojiVisible = false;
} else {
- emojiToggle.setVisibility(View.VISIBLE);
+ mediaKeyboard.setVisibility(View.VISIBLE);
emojiVisible = true;
}
}
@@ -102,15 +104,36 @@ public class InputPanel extends LinearLayout
public void setListener(final @NonNull Listener listener) {
this.listener = listener;
- emojiToggle.setOnClickListener(v -> listener.onEmojiToggle());
+ mediaKeyboard.setOnClickListener(v -> listener.onEmojiToggle());
}
public void setMediaListener(@NonNull MediaListener listener) {
composeText.setMediaListener(listener);
}
- public void setEmojiDrawer(@NonNull EmojiDrawer emojiDrawer) {
- emojiToggle.attach(emojiDrawer);
+ public void clickOnComposeInput() {
+ composeText.performClick();
+ }
+
+ public void setMediaKeyboard(@NonNull MediaKeyboard mediaKeyboard) {
+ this.mediaKeyboard.attach(mediaKeyboard);
+ }
+
+ public void showMediaKeyboardToggle(boolean show) {
+ emojiVisible = show;
+ mediaKeyboard.setVisibility(show ? View.VISIBLE : GONE);
+ }
+
+ public void setMediaKeyboardToggleMode(boolean isSticker) {
+ mediaKeyboard.setStickerMode(isSticker);
+ }
+
+ public boolean isStickerMode() {
+ return mediaKeyboard.isStickerMode();
+ }
+
+ public View getMediaKeyboardToggleAnchorView() {
+ return mediaKeyboard;
}
@Override
@@ -124,7 +147,7 @@ public class InputPanel extends LinearLayout
recordTime.display();
slideToCancel.display(startPositionX);
- if (emojiVisible) ViewUtil.fadeOut(emojiToggle, FADE_TIME, View.INVISIBLE);
+ if (emojiVisible) ViewUtil.fadeOut(mediaKeyboard, FADE_TIME, View.INVISIBLE);
ViewUtil.fadeOut(composeText, FADE_TIME, View.INVISIBLE);
ViewUtil.fadeOut(quickCameraToggle, FADE_TIME, View.INVISIBLE);
ViewUtil.fadeOut(quickAudioToggle, FADE_TIME, View.INVISIBLE);
@@ -154,7 +177,7 @@ public class InputPanel extends LinearLayout
float position = absoluteX / recordingContainer.getWidth();
if (direction == ViewCompat.LAYOUT_DIRECTION_LTR && position <= 0.5 ||
- direction == ViewCompat.LAYOUT_DIRECTION_RTL && position >= 0.6)
+ direction == ViewCompat.LAYOUT_DIRECTION_RTL && position >= 0.6)
{
this.microphoneRecorderView.cancelAction();
}
@@ -172,7 +195,7 @@ public class InputPanel extends LinearLayout
public void setEnabled(boolean enabled) {
composeText.setEnabled(enabled);
- emojiToggle.setEnabled(enabled);
+ mediaKeyboard.setEnabled(enabled);
quickAudioToggle.setEnabled(enabled);
quickCameraToggle.setEnabled(enabled);
}
@@ -184,7 +207,7 @@ public class InputPanel extends LinearLayout
future.addListener(new AssertedSuccessListener() {
@Override
public void onSuccess(Void result) {
- if (emojiVisible) ViewUtil.fadeIn(emojiToggle, FADE_TIME);
+ if (emojiVisible) ViewUtil.fadeIn(mediaKeyboard, FADE_TIME);
ViewUtil.fadeIn(composeText, FADE_TIME);
ViewUtil.fadeIn(quickCameraToggle, FADE_TIME);
ViewUtil.fadeIn(quickAudioToggle, FADE_TIME);
@@ -197,7 +220,7 @@ public class InputPanel extends LinearLayout
@Override
public void onKeyboardShown() {
- emojiToggle.setToEmoji();
+ mediaKeyboard.setToMedia();
}
@Override
@@ -210,7 +233,6 @@ public class InputPanel extends LinearLayout
composeText.insertEmoji(emoji);
}
-
public interface Listener {
void onRecorderStarted();
void onRecorderFinished();
@@ -274,7 +296,6 @@ public class InputPanel extends LinearLayout
return ViewCompat.getLayoutDirection(slideToCancelView) == ViewCompat.LAYOUT_DIRECTION_LTR ?
-Math.max(0, this.startPositionX - x) : Math.max(0, x - this.startPositionX);
}
-
}
private static class RecordTime implements Runnable {
@@ -283,7 +304,7 @@ public class InputPanel extends LinearLayout
private final AtomicLong startTime = new AtomicLong(0);
private final int UPDATE_EVERY_MS = 137;
- private RecordTime(TextView recordTimeView) {
+ private RecordTime(@NonNull TextView recordTimeView, @NonNull View microphone, long limitSeconds, @NonNull Runnable onLimitHit) {
this.recordTimeView = recordTimeView;
}
@@ -320,6 +341,6 @@ public class InputPanel extends LinearLayout
}
public interface MediaListener {
- public void onMediaSelected(@NonNull Uri uri, String contentType);
+ void onMediaSelected(@NonNull Uri uri, String contentType);
}
}
diff --git a/src/org/thoughtcrime/securesms/components/emoji/AsciiEmojiView.java b/src/org/thoughtcrime/securesms/components/emoji/AsciiEmojiView.java
new file mode 100644
index 000000000..1364017f4
--- /dev/null
+++ b/src/org/thoughtcrime/securesms/components/emoji/AsciiEmojiView.java
@@ -0,0 +1,60 @@
+package org.thoughtcrime.securesms.components.emoji;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import androidx.annotation.Nullable;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+import android.view.View;
+
+import org.thoughtcrime.securesms.R;
+import org.thoughtcrime.securesms.util.ResUtil;
+
+public class AsciiEmojiView extends View {
+
+ private final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG);
+
+ private String emoji;
+
+ public AsciiEmojiView(Context context) {
+ super(context);
+ }
+
+ public AsciiEmojiView(Context context, @Nullable AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public void setEmoji(String emoji) {
+ this.emoji = emoji;
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ if (TextUtils.isEmpty(emoji)) {
+ return;
+ }
+
+ float targetFontSize = 0.75f * getHeight() - getPaddingTop() - getPaddingBottom();
+
+ paint.setTextSize(targetFontSize);
+ paint.setColor(ResUtil.getColor(getContext(), R.attr.emoji_text_color));
+ paint.setTextAlign(Paint.Align.CENTER);
+
+ int xPos = (getWidth() / 2);
+ int yPos = (int) ((getHeight() / 2) - ((paint.descent() + paint.ascent()) / 2));
+
+ float overflow = paint.measureText(emoji) / (getWidth() - getPaddingLeft() - getPaddingRight());
+ if (overflow > 1f) {
+ paint.setTextSize(targetFontSize / overflow);
+ yPos = (int) ((getHeight() / 2) - ((paint.descent() + paint.ascent()) / 2));
+ }
+ canvas.drawText(emoji, xPos, yPos, paint);
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ //noinspection SuspiciousNameCombination
+ super.onMeasure(widthMeasureSpec, widthMeasureSpec);
+ }
+}
diff --git a/src/org/thoughtcrime/securesms/components/emoji/CompositeEmojiPageModel.java b/src/org/thoughtcrime/securesms/components/emoji/CompositeEmojiPageModel.java
new file mode 100644
index 000000000..28c4e9f38
--- /dev/null
+++ b/src/org/thoughtcrime/securesms/components/emoji/CompositeEmojiPageModel.java
@@ -0,0 +1,55 @@
+package org.thoughtcrime.securesms.components.emoji;
+
+import androidx.annotation.AttrRes;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import java.util.LinkedList;
+import java.util.List;
+
+public class CompositeEmojiPageModel implements EmojiPageModel {
+ @AttrRes private final int iconAttr;
+ @NonNull private final EmojiPageModel[] models;
+
+ public CompositeEmojiPageModel(@AttrRes int iconAttr, @NonNull EmojiPageModel... models) {
+ this.iconAttr = iconAttr;
+ this.models = models;
+ }
+
+ public int getIconAttr() {
+ return iconAttr;
+ }
+
+ @Override
+ public @NonNull List getEmoji() {
+ List emojis = new LinkedList<>();
+ for (EmojiPageModel model : models) {
+ emojis.addAll(model.getEmoji());
+ }
+ return emojis;
+ }
+
+ @Override
+ public @NonNull List getDisplayEmoji() {
+ List emojis = new LinkedList<>();
+ for (EmojiPageModel model : models) {
+ emojis.addAll(model.getDisplayEmoji());
+ }
+ return emojis;
+ }
+
+ @Override
+ public boolean hasSpriteMap() {
+ return false;
+ }
+
+ @Override
+ public @Nullable String getSprite() {
+ return null;
+ }
+
+ @Override
+ public boolean isDynamic() {
+ return false;
+ }
+}
diff --git a/src/org/thoughtcrime/securesms/components/emoji/Emoji.java b/src/org/thoughtcrime/securesms/components/emoji/Emoji.java
new file mode 100644
index 000000000..52d56cb48
--- /dev/null
+++ b/src/org/thoughtcrime/securesms/components/emoji/Emoji.java
@@ -0,0 +1,21 @@
+package org.thoughtcrime.securesms.components.emoji;
+
+import java.util.Arrays;
+import java.util.List;
+
+public class Emoji {
+
+ private final List variations;
+
+ public Emoji(String... variations) {
+ this.variations = Arrays.asList(variations);
+ }
+
+ public String getValue() {
+ return variations.get(0);
+ }
+
+ public List getVariations() {
+ return variations;
+ }
+}
diff --git a/src/org/thoughtcrime/securesms/components/emoji/EmojiDrawer.java b/src/org/thoughtcrime/securesms/components/emoji/EmojiDrawer.java
deleted file mode 100644
index 21c4afbd0..000000000
--- a/src/org/thoughtcrime/securesms/components/emoji/EmojiDrawer.java
+++ /dev/null
@@ -1,191 +0,0 @@
-package org.thoughtcrime.securesms.components.emoji;
-
-import android.content.Context;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.viewpager.widget.PagerAdapter;
-import androidx.viewpager.widget.ViewPager;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.KeyEvent;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ImageView;
-import android.widget.ImageView.ScaleType;
-import android.widget.LinearLayout;
-
-import com.astuetz.PagerSlidingTabStrip;
-
-import org.thoughtcrime.securesms.R;
-import org.thoughtcrime.securesms.components.InputAwareLayout.InputView;
-import org.thoughtcrime.securesms.components.RepeatableImageKey;
-import org.thoughtcrime.securesms.components.RepeatableImageKey.KeyEventListener;
-import org.thoughtcrime.securesms.components.emoji.EmojiPageView.EmojiSelectionListener;
-import org.thoughtcrime.securesms.util.ResUtil;
-
-import java.util.LinkedList;
-import java.util.List;
-
-public class EmojiDrawer extends LinearLayout implements InputView {
- private static final KeyEvent DELETE_KEY_EVENT = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL);
-
- private ViewPager pager;
- private List models;
- private PagerSlidingTabStrip strip;
- private RecentEmojiPageModel recentModel;
- private EmojiEventListener listener;
- private EmojiDrawerListener drawerListener;
-
- public EmojiDrawer(Context context) {
- this(context, null);
- }
-
- public EmojiDrawer(Context context, AttributeSet attrs) {
- super(context, attrs);
- setOrientation(VERTICAL);
- }
-
- private void initView() {
- final View v = LayoutInflater.from(getContext()).inflate(R.layout.emoji_drawer, this, true);
- initializeResources(v);
- initializePageModels();
- initializeEmojiGrid();
- }
-
- public void setEmojiEventListener(EmojiEventListener listener) {
- this.listener = listener;
- }
-
- public void setDrawerListener(EmojiDrawerListener listener) {
- this.drawerListener = listener;
- }
-
- private void initializeResources(View v) {
- Log.w("EmojiDrawer", "initializeResources()");
- this.pager = (ViewPager) v.findViewById(R.id.emoji_pager);
- this.strip = (PagerSlidingTabStrip) v.findViewById(R.id.tabs);
-
- RepeatableImageKey backspace = (RepeatableImageKey)v.findViewById(R.id.backspace);
- backspace.setOnKeyEventListener(new KeyEventListener() {
- @Override
- public void onKeyEvent() {
- if (listener != null) listener.onKeyEvent(DELETE_KEY_EVENT);
- }
- });
- }
-
- @Override
- public boolean isShowing() {
- return getVisibility() == VISIBLE;
- }
-
- @Override
- public void show(int height, boolean immediate) {
- if (this.pager == null) initView();
- ViewGroup.LayoutParams params = getLayoutParams();
- params.height = height;
- Log.w("EmojiDrawer", "showing emoji drawer with height " + params.height);
- setLayoutParams(params);
- setVisibility(VISIBLE);
- if (drawerListener != null) drawerListener.onShown();
- }
-
- @Override
- public void hide(boolean immediate) {
- setVisibility(GONE);
- if (drawerListener != null) drawerListener.onHidden();
- Log.w("EmojiDrawer", "hide()");
- }
-
- private void initializeEmojiGrid() {
- pager.setAdapter(new EmojiPagerAdapter(getContext(),
- models,
- new EmojiSelectionListener() {
- @Override
- public void onEmojiSelected(String emoji) {
- Log.w("EmojiDrawer", "onEmojiSelected()");
- recentModel.onCodePointSelected(emoji);
- if (listener != null) listener.onEmojiSelected(emoji);
- }
- }));
-
- if (recentModel.getEmoji().length == 0) {
- pager.setCurrentItem(1);
- }
- strip.setViewPager(pager);
- }
-
- private void initializePageModels() {
- this.models = new LinkedList<>();
- this.recentModel = new RecentEmojiPageModel(getContext());
- this.models.add(recentModel);
- this.models.addAll(EmojiPages.PAGES);
- }
-
- public static class EmojiPagerAdapter extends PagerAdapter
- implements PagerSlidingTabStrip.CustomTabProvider
- {
- private Context context;
- private List pages;
- private EmojiSelectionListener listener;
-
- public EmojiPagerAdapter(@NonNull Context context,
- @NonNull List pages,
- @Nullable EmojiSelectionListener listener)
- {
- super();
- this.context = context;
- this.pages = pages;
- this.listener = listener;
- }
-
- @Override
- public int getCount() {
- return pages.size();
- }
-
- @Override
- public Object instantiateItem(ViewGroup container, int position) {
- EmojiPageView page = new EmojiPageView(context);
- page.setModel(pages.get(position));
- page.setEmojiSelectedListener(listener);
- container.addView(page);
- return page;
- }
-
- @Override
- public void destroyItem(ViewGroup container, int position, Object object) {
- container.removeView((View)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) {
- return view == object;
- }
-
- @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;
- }
- }
-
- public interface EmojiEventListener extends EmojiSelectionListener {
- void onKeyEvent(KeyEvent keyEvent);
- }
-
- public interface EmojiDrawerListener {
- void onShown();
- void onHidden();
- }
-}
diff --git a/src/org/thoughtcrime/securesms/components/emoji/EmojiImageView.java b/src/org/thoughtcrime/securesms/components/emoji/EmojiImageView.java
new file mode 100644
index 000000000..c953b3d73
--- /dev/null
+++ b/src/org/thoughtcrime/securesms/components/emoji/EmojiImageView.java
@@ -0,0 +1,20 @@
+package org.thoughtcrime.securesms.components.emoji;
+
+import android.content.Context;
+import android.util.AttributeSet;
+
+import androidx.appcompat.widget.AppCompatImageView;
+
+public class EmojiImageView extends AppCompatImageView {
+ public EmojiImageView(Context context) {
+ super(context);
+ }
+
+ public EmojiImageView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public void setImageEmoji(CharSequence emoji) {
+ setImageDrawable(EmojiProvider.getInstance(getContext()).getEmojiDrawable(emoji));
+ }
+}
diff --git a/src/org/thoughtcrime/securesms/components/emoji/EmojiKeyboardProvider.java b/src/org/thoughtcrime/securesms/components/emoji/EmojiKeyboardProvider.java
new file mode 100644
index 000000000..3774e79ca
--- /dev/null
+++ b/src/org/thoughtcrime/securesms/components/emoji/EmojiKeyboardProvider.java
@@ -0,0 +1,166 @@
+package org.thoughtcrime.securesms.components.emoji;
+
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.viewpager.widget.PagerAdapter;
+import android.view.KeyEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+
+import org.thoughtcrime.securesms.R;
+import org.thoughtcrime.securesms.components.emoji.EmojiPageViewGridAdapter.VariationSelectorListener;
+import org.thoughtcrime.securesms.mms.GlideRequests;
+import org.thoughtcrime.securesms.util.ResUtil;
+import org.thoughtcrime.securesms.util.ThemeUtil;
+
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * A provider to select emoji in the {@link org.thoughtcrime.securesms.components.emoji.MediaKeyboard}.
+ */
+public class EmojiKeyboardProvider implements MediaKeyboardProvider,
+ MediaKeyboardProvider.TabIconProvider,
+ MediaKeyboardProvider.BackspaceObserver,
+ VariationSelectorListener
+{
+ private static final KeyEvent DELETE_KEY_EVENT = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL);
+
+ private static final String RECENT_STORAGE_KEY = "pref_recent_emoji2";
+
+ private final Context context;
+ private final List models;
+ private final RecentEmojiPageModel recentModel;
+ private final EmojiPagerAdapter emojiPagerAdapter;
+ private final EmojiEventListener emojiEventListener;
+
+ private Controller controller;
+
+ public EmojiKeyboardProvider(@NonNull Context context, @Nullable EmojiEventListener emojiEventListener) {
+ this.context = context;
+ this.emojiEventListener = emojiEventListener;
+ this.models = new LinkedList<>();
+ this.recentModel = new RecentEmojiPageModel(context, RECENT_STORAGE_KEY);
+ this.emojiPagerAdapter = new EmojiPagerAdapter(context, models, new EmojiEventListener() {
+ @Override
+ public void onEmojiSelected(String emoji) {
+ recentModel.onCodePointSelected(emoji);
+
+ if (emojiEventListener != null) {
+ emojiEventListener.onEmojiSelected(emoji);
+ }
+ }
+
+ @Override
+ public void onKeyEvent(KeyEvent keyEvent) {
+ if (emojiEventListener != null) {
+ emojiEventListener.onKeyEvent(keyEvent);
+ }
+ }
+ }, this);
+
+ models.add(recentModel);
+ models.addAll(EmojiPages.DISPLAY_PAGES);
+ }
+
+ @Override
+ public void requestPresentation(@NonNull Presenter presenter, boolean isSoloProvider) {
+ presenter.present(this, emojiPagerAdapter, this, this, null, null, recentModel.getEmoji().size() > 0 ? 0 : 1);
+ }
+
+ @Override
+ public void setController(@Nullable Controller controller) {
+ this.controller = controller;
+ }
+
+ @Override
+ public int getProviderIconView(boolean selected) {
+ if (selected) {
+ return ThemeUtil.isDarkTheme(context) ? R.layout.emoji_keyboard_icon_dark_selected : R.layout.emoji_keyboard_icon_light_selected;
+ } else {
+ return ThemeUtil.isDarkTheme(context) ? R.layout.emoji_keyboard_icon_dark : R.layout.emoji_keyboard_icon_light;
+ }
+ }
+
+ @Override
+ public void loadCategoryTabIcon(@NonNull GlideRequests glideRequests, @NonNull ImageView imageView, int index) {
+ Drawable drawable = ResUtil.getDrawable(context, models.get(index).getIconAttr());
+ imageView.setImageDrawable(drawable);
+ }
+
+ @Override
+ public void onBackspaceClicked() {
+ if (emojiEventListener != null) {
+ emojiEventListener.onKeyEvent(DELETE_KEY_EVENT);
+ }
+ }
+
+ @Override
+ public void onVariationSelectorStateChanged(boolean open) {
+ if (controller != null) {
+ controller.setViewPagerEnabled(!open);
+ }
+ }
+
+ @Override
+ public boolean equals(@Nullable Object obj) {
+ return obj instanceof EmojiKeyboardProvider;
+ }
+
+ private static class EmojiPagerAdapter extends PagerAdapter {
+ private Context context;
+ private List pages;
+ private EmojiEventListener emojiSelectionListener;
+ private VariationSelectorListener variationSelectorListener;
+
+ public EmojiPagerAdapter(@NonNull Context context,
+ @NonNull List pages,
+ @NonNull EmojiEventListener emojiSelectionListener,
+ @NonNull VariationSelectorListener variationSelectorListener)
+ {
+ super();
+ this.context = context;
+ this.pages = pages;
+ this.emojiSelectionListener = emojiSelectionListener;
+ this.variationSelectorListener = variationSelectorListener;
+ }
+
+ @Override
+ public int getCount() {
+ return pages.size();
+ }
+
+ @Override
+ public @NonNull Object instantiateItem(@NonNull ViewGroup container, int position) {
+ EmojiPageView page = new EmojiPageView(context, emojiSelectionListener, variationSelectorListener, true);
+ page.setModel(pages.get(position));
+ container.addView(page);
+ return page;
+ }
+
+ @Override
+ public void destroyItem(ViewGroup container, int position, Object object) {
+ container.removeView((View)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) {
+ return view == object;
+ }
+ }
+
+ public interface EmojiEventListener {
+ void onEmojiSelected(String emoji);
+ void onKeyEvent(KeyEvent keyEvent);
+ }
+}
diff --git a/src/org/thoughtcrime/securesms/components/emoji/EmojiPageModel.java b/src/org/thoughtcrime/securesms/components/emoji/EmojiPageModel.java
index acfd81458..4c4d57758 100644
--- a/src/org/thoughtcrime/securesms/components/emoji/EmojiPageModel.java
+++ b/src/org/thoughtcrime/securesms/components/emoji/EmojiPageModel.java
@@ -1,8 +1,11 @@
package org.thoughtcrime.securesms.components.emoji;
+import java.util.List;
+
public interface EmojiPageModel {
int getIconAttr();
- String[] getEmoji();
+ List getEmoji();
+ List getDisplayEmoji();
boolean hasSpriteMap();
String getSprite();
boolean isDynamic();
diff --git a/src/org/thoughtcrime/securesms/components/emoji/EmojiPageView.java b/src/org/thoughtcrime/securesms/components/emoji/EmojiPageView.java
index 72703c77d..3245394f3 100644
--- a/src/org/thoughtcrime/securesms/components/emoji/EmojiPageView.java
+++ b/src/org/thoughtcrime/securesms/components/emoji/EmojiPageView.java
@@ -1,106 +1,104 @@
package org.thoughtcrime.securesms.components.emoji;
import android.content.Context;
-import android.util.AttributeSet;
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.GridLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
import android.view.LayoutInflater;
+import android.view.MotionEvent;
import android.view.View;
-import android.view.ViewGroup;
-import android.widget.AbsListView;
-import android.widget.AdapterView;
-import android.widget.AdapterView.OnItemClickListener;
-import android.widget.BaseAdapter;
import android.widget.FrameLayout;
-import android.widget.GridView;
import org.thoughtcrime.securesms.R;
+import org.thoughtcrime.securesms.components.emoji.EmojiKeyboardProvider.EmojiEventListener;
+import org.thoughtcrime.securesms.components.emoji.EmojiPageViewGridAdapter.VariationSelectorListener;
-public class EmojiPageView extends FrameLayout {
+public class EmojiPageView extends FrameLayout implements VariationSelectorListener {
private static final String TAG = EmojiPageView.class.getSimpleName();
- private EmojiPageModel model;
- private EmojiSelectionListener listener;
- private GridView grid;
+ private EmojiPageModel model;
+ private EmojiPageViewGridAdapter adapter;
+ private RecyclerView recyclerView;
+ private GridLayoutManager layoutManager;
+ private RecyclerView.OnItemTouchListener scrollDisabler;
+ private VariationSelectorListener variationSelectorListener;
+ private EmojiVariationSelectorPopup popup;
- public EmojiPageView(Context context) {
- this(context, null);
- }
-
- public EmojiPageView(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public EmojiPageView(Context context, AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
+ public EmojiPageView(@NonNull Context context,
+ @NonNull EmojiEventListener emojiSelectionListener,
+ @NonNull VariationSelectorListener variationSelectorListener,
+ boolean allowVariations)
+ {
+ super(context);
final View view = LayoutInflater.from(getContext()).inflate(R.layout.emoji_grid_layout, this, true);
- grid = (GridView) view.findViewById(R.id.emoji);
- grid.setColumnWidth(getResources().getDimensionPixelSize(R.dimen.emoji_drawer_size) + 2 * getResources().getDimensionPixelSize(R.dimen.emoji_drawer_item_padding));
- grid.setOnItemClickListener(new OnItemClickListener() {
- @Override public void onItemClick(AdapterView> parent, View view, int position, long id) {
- if (listener != null) listener.onEmojiSelected(((EmojiView)view).getEmoji());
- }
- });
+
+ this.variationSelectorListener = variationSelectorListener;
+
+ recyclerView = view.findViewById(R.id.emoji);
+ layoutManager = new GridLayoutManager(context, 8);
+ scrollDisabler = new ScrollDisabler();
+ popup = new EmojiVariationSelectorPopup(context, emojiSelectionListener);
+ adapter = new EmojiPageViewGridAdapter(EmojiProvider.getInstance(context),
+ popup,
+ emojiSelectionListener,
+ this,
+ allowVariations);
+
+ recyclerView.setLayoutManager(layoutManager);
+ recyclerView.setAdapter(adapter);
}
public void onSelected() {
- if (model.isDynamic() && grid != null && grid.getAdapter() != null) {
- ((EmojiGridAdapter)grid.getAdapter()).notifyDataSetChanged();
+ if (model.isDynamic() && adapter != null) {
+ adapter.notifyDataSetChanged();
}
}
public void setModel(EmojiPageModel model) {
this.model = model;
- grid.setAdapter(new EmojiGridAdapter(getContext(), model));
+ adapter.setEmoji(model.getDisplayEmoji());
}
- public void setEmojiSelectedListener(EmojiSelectionListener listener) {
- this.listener = listener;
- }
-
- private static class EmojiGridAdapter extends BaseAdapter {
-
- protected final Context context;
- private final int emojiSize;
- private final EmojiPageModel model;
-
- public EmojiGridAdapter(Context context, EmojiPageModel model) {
- this.context = context;
- this.emojiSize = (int) context.getResources().getDimension(R.dimen.emoji_drawer_size);
- this.model = model;
- }
-
- @Override public int getCount() {
- return model.getEmoji().length;
- }
-
- @Override
- public Object getItem(int position) {
- return null;
- }
-
- @Override
- public long getItemId(int position) {
- return position;
- }
-
- @Override
- public View getView(final int position, final View convertView, final ViewGroup parent) {
- final EmojiView view;
- final int pad = context.getResources().getDimensionPixelSize(R.dimen.emoji_drawer_item_padding);
- if (convertView != null && convertView instanceof EmojiView) {
- view = (EmojiView)convertView;
- } else {
- final EmojiView emojiView = new EmojiView(context);
- emojiView.setPadding(pad, pad, pad, pad);
- emojiView.setLayoutParams(new AbsListView.LayoutParams(emojiSize + 2 * pad, emojiSize + 2 * pad));
- view = emojiView;
- }
-
- view.setEmoji(model.getEmoji()[position]);
- return view;
+ @Override
+ protected void onVisibilityChanged(@NonNull View changedView, int visibility) {
+ if (visibility != VISIBLE) {
+ popup.dismiss();
}
}
- public interface EmojiSelectionListener {
- void onEmojiSelected(String emoji);
+ @Override
+ protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+ int idealWidth = getContext().getResources().getDimensionPixelOffset(R.dimen.emoji_drawer_item_width);
+ layoutManager.setSpanCount(Math.max(w / idealWidth, 1));
+ }
+
+ @Override
+ public void onVariationSelectorStateChanged(boolean open) {
+ if (open) {
+ recyclerView.addOnItemTouchListener(scrollDisabler);
+ } else {
+ post(() -> recyclerView.removeOnItemTouchListener(scrollDisabler));
+ }
+
+ if (variationSelectorListener != null) {
+ variationSelectorListener.onVariationSelectorStateChanged(open);
+ }
+ }
+
+ public void setRecyclerNestedScrollingEnabled(boolean enabled) {
+ recyclerView.setNestedScrollingEnabled(enabled);
+ }
+
+ private static class ScrollDisabler implements RecyclerView.OnItemTouchListener {
+ @Override
+ public boolean onInterceptTouchEvent(@NonNull RecyclerView recyclerView, @NonNull MotionEvent motionEvent) {
+ return true;
+ }
+
+ @Override
+ public void onTouchEvent(@NonNull RecyclerView recyclerView, @NonNull MotionEvent motionEvent) { }
+
+ @Override
+ public void onRequestDisallowInterceptTouchEvent(boolean b) { }
}
}
diff --git a/src/org/thoughtcrime/securesms/components/emoji/EmojiPageViewGridAdapter.java b/src/org/thoughtcrime/securesms/components/emoji/EmojiPageViewGridAdapter.java
new file mode 100644
index 000000000..bfe83f1da
--- /dev/null
+++ b/src/org/thoughtcrime/securesms/components/emoji/EmojiPageViewGridAdapter.java
@@ -0,0 +1,119 @@
+package org.thoughtcrime.securesms.components.emoji;
+
+import android.graphics.drawable.Drawable;
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.PopupWindow;
+
+import org.thoughtcrime.securesms.R;
+import org.thoughtcrime.securesms.components.emoji.EmojiKeyboardProvider.EmojiEventListener;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class EmojiPageViewGridAdapter extends RecyclerView.Adapter implements PopupWindow.OnDismissListener {
+
+ private final List emojiList;
+ private final EmojiProvider emojiProvider;
+ private final EmojiVariationSelectorPopup popup;
+ private final VariationSelectorListener variationSelectorListener;
+ private final EmojiEventListener emojiEventListener;
+ private final boolean allowVariations;
+
+ public EmojiPageViewGridAdapter(@NonNull EmojiProvider emojiProvider,
+ @NonNull EmojiVariationSelectorPopup popup,
+ @NonNull EmojiEventListener emojiEventListener,
+ @NonNull VariationSelectorListener variationSelectorListener,
+ boolean allowVariations)
+ {
+ this.emojiList = new ArrayList<>();
+ this.emojiProvider = emojiProvider;
+ this.popup = popup;
+ this.emojiEventListener = emojiEventListener;
+ this.variationSelectorListener = variationSelectorListener;
+ this.allowVariations = allowVariations;
+
+ popup.setOnDismissListener(this);
+ }
+
+ @NonNull
+ @Override
+ public EmojiViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
+ return new EmojiViewHolder(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.emoji_display_item, viewGroup, false));
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull EmojiViewHolder viewHolder, int i) {
+ Emoji emoji = emojiList.get(i);
+
+ Drawable drawable = emojiProvider.getEmojiDrawable(emoji.getValue());
+
+ if (drawable != null) {
+ viewHolder.textView.setVisibility(View.GONE);
+ viewHolder.imageView.setVisibility(View.VISIBLE);
+
+ viewHolder.imageView.setImageDrawable(drawable);
+ } else {
+ viewHolder.textView.setVisibility(View.VISIBLE);
+ viewHolder.imageView.setVisibility(View.GONE);
+
+ viewHolder.textView.setEmoji(emoji.getValue());
+ }
+
+ viewHolder.itemView.setOnClickListener(v -> {
+ emojiEventListener.onEmojiSelected(emoji.getValue());
+ });
+
+ if (allowVariations && emoji.getVariations().size() > 1) {
+ viewHolder.itemView.setOnLongClickListener(v -> {
+ popup.dismiss();
+ popup.setVariations(emoji.getVariations());
+ popup.showAsDropDown(viewHolder.itemView, 0, -(2 * viewHolder.itemView.getHeight()));
+ variationSelectorListener.onVariationSelectorStateChanged(true);
+ return true;
+ });
+ viewHolder.hintCorner.setVisibility(View.VISIBLE);
+ } else {
+ viewHolder.itemView.setOnLongClickListener(null);
+ viewHolder.hintCorner.setVisibility(View.GONE);
+ }
+ }
+
+ @Override
+ public int getItemCount() {
+ return emojiList.size();
+ }
+
+ public void setEmoji(@NonNull List emojiList) {
+ this.emojiList.clear();
+ this.emojiList.addAll(emojiList);
+ notifyDataSetChanged();
+ }
+
+ @Override
+ public void onDismiss() {
+ variationSelectorListener.onVariationSelectorStateChanged(false);
+ }
+
+ static class EmojiViewHolder extends RecyclerView.ViewHolder {
+
+ private final ImageView imageView;
+ private final AsciiEmojiView textView;
+ private final ImageView hintCorner;
+
+ public EmojiViewHolder(@NonNull View itemView) {
+ super(itemView);
+ this.imageView = itemView.findViewById(R.id.emoji_image);
+ this.textView = itemView.findViewById(R.id.emoji_text);
+ this.hintCorner = itemView.findViewById(R.id.emoji_variation_hint);
+ }
+ }
+
+ public interface VariationSelectorListener {
+ void onVariationSelectorStateChanged(boolean open);
+ }
+}
diff --git a/src/org/thoughtcrime/securesms/components/emoji/EmojiPages.java b/src/org/thoughtcrime/securesms/components/emoji/EmojiPages.java
index 226c91a0d..8b03369ac 100644
--- a/src/org/thoughtcrime/securesms/components/emoji/EmojiPages.java
+++ b/src/org/thoughtcrime/securesms/components/emoji/EmojiPages.java
@@ -7,34 +7,75 @@ import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
+/**
+ * IMPORTANT: The code in this class is generated by a script! Do not edit by hand!
+ */
class EmojiPages {
+ private static final EmojiPageModel PAGE_PLACES = new StaticEmojiPageModel(R.attr.emoji_category_places, new Emoji[] {
+ new Emoji("\ud83c\udf0d"), new Emoji("\ud83c\udf0e"), new Emoji("\ud83c\udf0f"), new Emoji("\ud83c\udf10"), new Emoji("\ud83d\uddfa\ufe0f"), new Emoji("\ud83d\uddfe"), new Emoji("\ud83e\udded"), new Emoji("\ud83c\udfd4\ufe0f"), new Emoji("\u26f0\ufe0f"), new Emoji("\ud83c\udf0b"), new Emoji("\ud83d\uddfb"), new Emoji("\ud83c\udfd5\ufe0f"), new Emoji("\ud83c\udfd6\ufe0f"), new Emoji("\ud83c\udfdc\ufe0f"), new Emoji("\ud83c\udfdd\ufe0f"), new Emoji("\ud83c\udfde\ufe0f"), new Emoji("\ud83c\udfdf\ufe0f"), new Emoji("\ud83c\udfdb\ufe0f"), new Emoji("\ud83c\udfd7\ufe0f"), new Emoji("\ud83e\uddf1"), new Emoji("\ud83c\udfd8\ufe0f"), new Emoji("\ud83c\udfda\ufe0f"), new Emoji("\ud83c\udfe0"), new Emoji("\ud83c\udfe1"), new Emoji("\ud83c\udfe2"), new Emoji("\ud83c\udfe3"), new Emoji("\ud83c\udfe4"), new Emoji("\ud83c\udfe5"), new Emoji("\ud83c\udfe6"), new Emoji("\ud83c\udfe8"), new Emoji("\ud83c\udfe9"), new Emoji("\ud83c\udfea"), new Emoji("\ud83c\udfeb"), new Emoji("\ud83c\udfec"), new Emoji("\ud83c\udfed"), new Emoji("\ud83c\udfef"), new Emoji("\ud83c\udff0"), new Emoji("\ud83d\udc92"), new Emoji("\ud83d\uddfc"), new Emoji("\ud83d\uddfd"), new Emoji("\u26ea"), new Emoji("\ud83d\udd4c"), new Emoji("\ud83d\uded5"), new Emoji("\ud83d\udd4d"), new Emoji("\u26e9\ufe0f"), new Emoji("\ud83d\udd4b"), new Emoji("\u26f2"), new Emoji("\u26fa"), new Emoji("\ud83c\udf01"), new Emoji("\ud83c\udf03"), new Emoji("\ud83c\udfd9\ufe0f"), new Emoji("\ud83c\udf04"), new Emoji("\ud83c\udf05"), new Emoji("\ud83c\udf06"), new Emoji("\ud83c\udf07"), new Emoji("\ud83c\udf09"), new Emoji("\u2668\ufe0f"), new Emoji("\ud83c\udfa0"), new Emoji("\ud83c\udfa1"), new Emoji("\ud83c\udfa2"), new Emoji("\ud83d\udc88"), new Emoji("\ud83c\udfaa"), new Emoji("\ud83d\ude82"), new Emoji("\ud83d\ude83"), new Emoji("\ud83d\ude84"), new Emoji("\ud83d\ude85"), new Emoji("\ud83d\ude86"), new Emoji("\ud83d\ude87"), new Emoji("\ud83d\ude88"), new Emoji("\ud83d\ude89"), new Emoji("\ud83d\ude8a"), new Emoji("\ud83d\ude9d"), new Emoji("\ud83d\ude9e"), new Emoji("\ud83d\ude8b"), new Emoji("\ud83d\ude8c"), new Emoji("\ud83d\ude8d"), new Emoji("\ud83d\ude8e"), new Emoji("\ud83d\ude90"), new Emoji("\ud83d\ude91"), new Emoji("\ud83d\ude92"), new Emoji("\ud83d\ude93"), new Emoji("\ud83d\ude94"), new Emoji("\ud83d\ude95"), new Emoji("\ud83d\ude96"), new Emoji("\ud83d\ude97"), new Emoji("\ud83d\ude98"), new Emoji("\ud83d\ude99"), new Emoji("\ud83d\ude9a"), new Emoji("\ud83d\ude9b"), new Emoji("\ud83d\ude9c"), new Emoji("\ud83c\udfce\ufe0f"), new Emoji("\ud83c\udfcd\ufe0f"), new Emoji("\ud83d\udef5"), new Emoji("\ud83e\uddbd"), new Emoji("\ud83e\uddbc"), new Emoji("\ud83d\udefa"), new Emoji("\ud83d\udeb2"), new Emoji("\ud83d\udef4"), new Emoji("\ud83d\udef9"), new Emoji("\ud83d\ude8f"), new Emoji("\ud83d\udee3\ufe0f"), new Emoji("\ud83d\udee4\ufe0f"), new Emoji("\ud83d\udee2\ufe0f"), new Emoji("\u26fd"), new Emoji("\ud83d\udea8"), new Emoji("\ud83d\udea5"), new Emoji("\ud83d\udea6"), new Emoji("\ud83d\uded1"), new Emoji("\ud83d\udea7"), new Emoji("\u2693"), new Emoji("\u26f5"), new Emoji("\ud83d\udef6"), new Emoji("\ud83d\udea4"), new Emoji("\ud83d\udef3\ufe0f"), new Emoji("\u26f4\ufe0f"), new Emoji("\ud83d\udee5\ufe0f"), new Emoji("\ud83d\udea2"), new Emoji("\u2708\ufe0f"), new Emoji("\ud83d\udee9\ufe0f"), new Emoji("\ud83d\udeeb"), new Emoji("\ud83d\udeec"), new Emoji("\ud83e\ude82"), new Emoji("\ud83d\udcba"), new Emoji("\ud83d\ude81"), new Emoji("\ud83d\ude9f"), new Emoji("\ud83d\udea0"), new Emoji("\ud83d\udea1"), new Emoji("\ud83d\udef0\ufe0f"), new Emoji("\ud83d\ude80"), new Emoji("\ud83d\udef8"), new Emoji("\ud83d\udece\ufe0f"), new Emoji("\ud83e\uddf3"), new Emoji("\u231b"), new Emoji("\u23f3"), new Emoji("\u231a"), new Emoji("\u23f0"), new Emoji("\u23f1\ufe0f"), new Emoji("\u23f2\ufe0f"), new Emoji("\ud83d\udd70\ufe0f"), new Emoji("\ud83d\udd5b"), new Emoji("\ud83d\udd67"), new Emoji("\ud83d\udd50"), new Emoji("\ud83d\udd5c"), new Emoji("\ud83d\udd51"), new Emoji("\ud83d\udd5d"), new Emoji("\ud83d\udd52"), new Emoji("\ud83d\udd5e"), new Emoji("\ud83d\udd53"), new Emoji("\ud83d\udd5f"), new Emoji("\ud83d\udd54"), new Emoji("\ud83d\udd60"), new Emoji("\ud83d\udd55"), new Emoji("\ud83d\udd61"), new Emoji("\ud83d\udd56"), new Emoji("\ud83d\udd62"), new Emoji("\ud83d\udd57"), new Emoji("\ud83d\udd63"), new Emoji("\ud83d\udd58"), new Emoji("\ud83d\udd64"), new Emoji("\ud83d\udd59"), new Emoji("\ud83d\udd65"), new Emoji("\ud83d\udd5a"), new Emoji("\ud83d\udd66"), new Emoji("\ud83c\udf11"), new Emoji("\ud83c\udf12"), new Emoji("\ud83c\udf13"), new Emoji("\ud83c\udf14"), new Emoji("\ud83c\udf15"), new Emoji("\ud83c\udf16"), new Emoji("\ud83c\udf17"), new Emoji("\ud83c\udf18"), new Emoji("\ud83c\udf19"), new Emoji("\ud83c\udf1a"), new Emoji("\ud83c\udf1b"), new Emoji("\ud83c\udf1c"), new Emoji("\ud83c\udf21\ufe0f"), new Emoji("\u2600\ufe0f"), new Emoji("\ud83c\udf1d"), new Emoji("\ud83c\udf1e"), new Emoji("\ud83e\ude90"), new Emoji("\u2b50"), new Emoji("\ud83c\udf1f"), new Emoji("\ud83c\udf20"), new Emoji("\ud83c\udf0c"), new Emoji("\u2601\ufe0f"), new Emoji("\u26c5"), new Emoji("\u26c8\ufe0f"), new Emoji("\ud83c\udf24\ufe0f"), new Emoji("\ud83c\udf25\ufe0f"), new Emoji("\ud83c\udf26\ufe0f"), new Emoji("\ud83c\udf27\ufe0f"), new Emoji("\ud83c\udf28\ufe0f"), new Emoji("\ud83c\udf29\ufe0f"), new Emoji("\ud83c\udf2a\ufe0f"), new Emoji("\ud83c\udf2b\ufe0f"), new Emoji("\ud83c\udf2c\ufe0f"), new Emoji("\ud83c\udf00"), new Emoji("\ud83c\udf08"), new Emoji("\ud83c\udf02"), new Emoji("\u2602\ufe0f"), new Emoji("\u2614"), new Emoji("\u26f1\ufe0f"), new Emoji("\u26a1"), new Emoji("\u2744\ufe0f"), new Emoji("\u2603\ufe0f"), new Emoji("\u26c4"), new Emoji("\u2604\ufe0f"), new Emoji("\ud83d\udd25"), new Emoji("\ud83d\udca7"), new Emoji("\ud83c\udf0a"),
+ }, "emoji/Places.webp");
- static final List PAGES = Arrays.asList(
- new StaticEmojiPageModel(R.attr.emoji_category_people, new String[] {
- "\ud83d\ude00","\ud83d\ude01","\ud83d\ude02","\ud83e\udd23","\ud83d\ude03","\ud83d\ude04","\ud83d\ude05","\ud83d\ude06","\ud83d\ude09","\ud83d\ude0a","\ud83d\ude0b","\ud83d\ude0e","\ud83d\ude0d","\ud83d\ude18","\ud83d\ude17","\ud83d\ude19","\ud83d\ude1a","\u263a\ufe0f","\ud83d\ude42","\ud83e\udd17","\ud83e\udd29","\ud83e\udd14","\ud83e\udd28","\ud83d\ude10","\ud83d\ude11","\ud83d\ude36","\ud83d\ude44","\ud83d\ude0f","\ud83d\ude23","\ud83d\ude25","\ud83d\ude2e","\ud83e\udd10","\ud83d\ude2f","\ud83d\ude2a","\ud83d\ude2b","\ud83d\ude34","\ud83d\ude0c","\ud83d\ude1b","\ud83d\ude1c","\ud83d\ude1d","\ud83e\udd24","\ud83d\ude12","\ud83d\ude13","\ud83d\ude14","\ud83d\ude15","\ud83d\ude43","\ud83e\udd11","\ud83d\ude32","\u2639\ufe0f","\ud83d\ude41","\ud83d\ude16","\ud83d\ude1e","\ud83d\ude1f","\ud83d\ude24","\ud83d\ude22","\ud83d\ude2d","\ud83d\ude26","\ud83d\ude27","\ud83d\ude28","\ud83d\ude29","\ud83e\udd2f","\ud83d\ude2c","\ud83d\ude30","\ud83d\ude31","\ud83d\ude33","\ud83e\udd2a","\ud83d\ude35","\ud83d\ude21","\ud83d\ude20","\ud83e\udd2c","\ud83d\ude37","\ud83e\udd12","\ud83e\udd15","\ud83e\udd22","\ud83e\udd2e","\ud83e\udd27","\ud83d\ude07","\ud83e\udd20","\ud83e\udd21","\ud83e\udd25","\ud83e\udd2b","\ud83e\udd2d","\ud83e\uddd0","\ud83e\udd13","\ud83d\ude08","\ud83d\udc7f","\ud83d\udc79","\ud83d\udc7a","\ud83d\udc80","\u2620\ufe0f","\ud83d\udc7b","\ud83d\udc7d","\ud83d\udc7e","\ud83e\udd16","\ud83d\udca9","\ud83d\ude3a","\ud83d\ude38","\ud83d\ude39","\ud83d\ude3b","\ud83d\ude3c","\ud83d\ude3d","\ud83d\ude40","\ud83d\ude3f","\ud83d\ude3e","\ud83d\ude48","\ud83d\ude49","\ud83d\ude4a","\ud83d\udc76","\ud83e\uddd2","\ud83d\udc66","\ud83d\udc67","\ud83e\uddd1","\ud83d\udc68","\ud83d\udc69","\ud83e\uddd3","\ud83d\udc74","\ud83d\udc75","\ud83d\udc68\u200d\u2695\ufe0f","\ud83d\udc69\u200d\u2695\ufe0f","\ud83d\udc68\u200d\ud83c\udf93","\ud83d\udc69\u200d\ud83c\udf93","\ud83d\udc68\u200d\ud83c\udfeb","\ud83d\udc69\u200d\ud83c\udfeb","\ud83d\udc68\u200d\u2696\ufe0f","\ud83d\udc69\u200d\u2696\ufe0f","\ud83d\udc68\u200d\ud83c\udf3e","\ud83d\udc69\u200d\ud83c\udf3e","\ud83d\udc68\u200d\ud83c\udf73","\ud83d\udc69\u200d\ud83c\udf73","\ud83d\udc68\u200d\ud83d\udd27","\ud83d\udc69\u200d\ud83d\udd27","\ud83d\udc68\u200d\ud83c\udfed","\ud83d\udc69\u200d\ud83c\udfed","\ud83d\udc68\u200d\ud83d\udcbc","\ud83d\udc69\u200d\ud83d\udcbc","\ud83d\udc68\u200d\ud83d\udd2c","\ud83d\udc69\u200d\ud83d\udd2c","\ud83d\udc68\u200d\ud83d\udcbb","\ud83d\udc69\u200d\ud83d\udcbb","\ud83d\udc68\u200d\ud83c\udfa4","\ud83d\udc69\u200d\ud83c\udfa4","\ud83d\udc68\u200d\ud83c\udfa8","\ud83d\udc69\u200d\ud83c\udfa8","\ud83d\udc68\u200d\u2708\ufe0f","\ud83d\udc69\u200d\u2708\ufe0f","\ud83d\udc68\u200d\ud83d\ude80","\ud83d\udc69\u200d\ud83d\ude80","\ud83d\udc68\u200d\ud83d\ude92","\ud83d\udc69\u200d\ud83d\ude92","\ud83d\udc6e\u200d\u2642\ufe0f","\ud83d\udc6e\u200d\u2640\ufe0f","\ud83d\udd75\ufe0f\u200d\u2642\ufe0f","\ud83d\udd75\ufe0f\u200d\u2640\ufe0f","\ud83d\udc82\u200d\u2642\ufe0f","\ud83d\udc82\u200d\u2640\ufe0f","\ud83d\udc77\u200d\u2642\ufe0f","\ud83d\udc77\u200d\u2640\ufe0f","\ud83e\udd34","\ud83d\udc78","\ud83d\udc73\u200d\u2642\ufe0f","\ud83d\udc73\u200d\u2640\ufe0f","\ud83d\udc72","\ud83e\uddd5","\ud83e\uddd4","\ud83d\udc71\u200d\u2642\ufe0f","\ud83d\udc71\u200d\u2640\ufe0f","\ud83e\udd35","\ud83d\udc70","\ud83e\udd30","\ud83e\udd31","\ud83d\udc7c","\ud83c\udf85","\ud83e\udd36","\ud83e\uddd9\u200d\u2640\ufe0f","\ud83e\uddd9\u200d\u2642\ufe0f","\ud83e\uddda\u200d\u2640\ufe0f","\ud83e\uddda\u200d\u2642\ufe0f","\ud83e\udddb\u200d\u2640\ufe0f","\ud83e\udddb\u200d\u2642\ufe0f","\ud83e\udddc\u200d\u2640\ufe0f","\ud83e\udddc\u200d\u2642\ufe0f","\ud83e\udddd\u200d\u2640\ufe0f","\ud83e\udddd\u200d\u2642\ufe0f","\ud83e\uddde\u200d\u2640\ufe0f","\ud83e\uddde\u200d\u2642\ufe0f","\ud83e\udddf\u200d\u2640\ufe0f","\ud83e\udddf\u200d\u2642\ufe0f","\ud83d\ude4d\u200d\u2642\ufe0f","\ud83d\ude4d\u200d\u2640\ufe0f","\ud83d\ude4e\u200d\u2642\ufe0f","\ud83d\ude4e\u200d\u2640\ufe0f","\ud83d\ude45\u200d\u2642\ufe0f","\ud83d\ude45\u200d\u2640\ufe0f","\ud83d\ude46\u200d\u2642\ufe0f","\ud83d\ude46\u200d\u2640\ufe0f","\ud83d\udc81\u200d\u2642\ufe0f","\ud83d\udc81\u200d\u2640\ufe0f","\ud83d\ude4b\u200d\u2642\ufe0f","\ud83d\ude4b\u200d\u2640\ufe0f","\ud83d\ude47\u200d\u2642\ufe0f","\ud83d\ude47\u200d\u2640\ufe0f","\ud83e\udd26","\ud83e\udd26\u200d\u2642\ufe0f","\ud83e\udd26\u200d\u2640\ufe0f","\ud83e\udd37","\ud83e\udd37\u200d\u2642\ufe0f","\ud83e\udd37\u200d\u2640\ufe0f","\ud83d\udc86\u200d\u2642\ufe0f","\ud83d\udc86\u200d\u2640\ufe0f","\ud83d\udc87\u200d\u2642\ufe0f","\ud83d\udc87\u200d\u2640\ufe0f","\ud83d\udeb6\u200d\u2642\ufe0f","\ud83d\udeb6\u200d\u2640\ufe0f","\ud83c\udfc3\u200d\u2642\ufe0f","\ud83c\udfc3\u200d\u2640\ufe0f","\ud83d\udc83","\ud83d\udd7a","\ud83d\udc6f\u200d\u2642\ufe0f","\ud83d\udc6f\u200d\u2640\ufe0f","\ud83e\uddd6\u200d\u2640\ufe0f","\ud83e\uddd6\u200d\u2642\ufe0f","\ud83e\uddd7\u200d\u2640\ufe0f","\ud83e\uddd7\u200d\u2642\ufe0f","\ud83e\uddd8\u200d\u2640\ufe0f","\ud83e\uddd8\u200d\u2642\ufe0f","\ud83d\udec0","\ud83d\udecc","\ud83d\udd74\ufe0f","\ud83d\udde3\ufe0f","\ud83d\udc64","\ud83d\udc65","\ud83e\udd3a","\ud83c\udfc7","\u26f7\ufe0f","\ud83c\udfc2","\ud83c\udfcc\ufe0f\u200d\u2642\ufe0f","\ud83c\udfcc\ufe0f\u200d\u2640\ufe0f","\ud83c\udfc4\u200d\u2642\ufe0f","\ud83c\udfc4\u200d\u2640\ufe0f","\ud83d\udea3\u200d\u2642\ufe0f","\ud83d\udea3\u200d\u2640\ufe0f","\ud83c\udfca\u200d\u2642\ufe0f","\ud83c\udfca\u200d\u2640\ufe0f","\u26f9\ufe0f\u200d\u2642\ufe0f","\u26f9\ufe0f\u200d\u2640\ufe0f","\ud83c\udfcb\ufe0f\u200d\u2642\ufe0f","\ud83c\udfcb\ufe0f\u200d\u2640\ufe0f","\ud83d\udeb4\u200d\u2642\ufe0f","\ud83d\udeb4\u200d\u2640\ufe0f","\ud83d\udeb5\u200d\u2642\ufe0f","\ud83d\udeb5\u200d\u2640\ufe0f","\ud83c\udfce\ufe0f","\ud83c\udfcd\ufe0f","\ud83e\udd38","\ud83e\udd38\u200d\u2642\ufe0f","\ud83e\udd38\u200d\u2640\ufe0f","\ud83e\udd3c","\ud83e\udd3c\u200d\u2642\ufe0f","\ud83e\udd3c\u200d\u2640\ufe0f","\ud83e\udd3d","\ud83e\udd3d\u200d\u2642\ufe0f","\ud83e\udd3d\u200d\u2640\ufe0f","\ud83e\udd3e","\ud83e\udd3e\u200d\u2642\ufe0f","\ud83e\udd3e\u200d\u2640\ufe0f","\ud83e\udd39","\ud83e\udd39\u200d\u2642\ufe0f","\ud83e\udd39\u200d\u2640\ufe0f","\ud83d\udc6b","\ud83d\udc6c","\ud83d\udc6d","\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68","\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68","\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69","\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc68","\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc68","\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc69","\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc66","\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\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\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\udc66","\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66","\ud83d\udc68\u200d\ud83d\udc67","\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc66","\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc67","\ud83d\udc69\u200d\ud83d\udc66","\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66","\ud83d\udc69\u200d\ud83d\udc67","\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66","\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67","\ud83e\udd33","\ud83d\udcaa","\ud83d\udc48","\ud83d\udc49","\u261d\ufe0f","\ud83d\udc46","\ud83d\udd95","\ud83d\udc47","\u270c\ufe0f","\ud83e\udd1e","\ud83d\udd96","\ud83e\udd18","\ud83e\udd19","\ud83d\udd90\ufe0f","\u270b","\ud83d\udc4c","\ud83d\udc4d","\ud83d\udc4e","\u270a","\ud83d\udc4a","\ud83e\udd1b","\ud83e\udd1c","\ud83e\udd1a","\ud83d\udc4b","\ud83e\udd1f","\u270d\ufe0f","\ud83d\udc4f","\ud83d\udc50","\ud83d\ude4c","\ud83e\udd32","\ud83d\ude4f","\ud83e\udd1d","\ud83d\udc85","\ud83d\udc42","\ud83d\udc43","\ud83d\udc63","\ud83d\udc40","\ud83d\udc41\ufe0f","\ud83d\udc41\ufe0f\u200d\ud83d\udde8\ufe0f","\ud83e\udde0","\ud83d\udc45","\ud83d\udc44","\ud83d\udc8b","\ud83d\udc98","\u2764\ufe0f","\ud83d\udc93","\ud83d\udc94","\ud83d\udc95","\ud83d\udc96","\ud83d\udc97","\ud83d\udc99","\ud83d\udc9a","\ud83d\udc9b","\ud83e\udde1","\ud83d\udc9c","\ud83d\udda4","\ud83d\udc9d","\ud83d\udc9e","\ud83d\udc9f","\u2763\ufe0f","\ud83d\udc8c","\ud83d\udca4","\ud83d\udca2","\ud83d\udca3","\ud83d\udca5","\ud83d\udca6","\ud83d\udca8","\ud83d\udcab","\ud83d\udcac","\ud83d\udde8\ufe0f","\ud83d\uddef\ufe0f","\ud83d\udcad","\ud83d\udd73\ufe0f","\ud83d\udc53","\ud83d\udd76\ufe0f","\ud83d\udc54","\ud83d\udc55","\ud83d\udc56","\ud83e\udde3","\ud83e\udde4","\ud83e\udde5","\ud83e\udde6","\ud83d\udc57","\ud83d\udc58","\ud83d\udc59","\ud83d\udc5a","\ud83d\udc5b","\ud83d\udc5c","\ud83d\udc5d","\ud83d\udecd\ufe0f","\ud83c\udf92","\ud83d\udc5e","\ud83d\udc5f","\ud83d\udc60","\ud83d\udc61","\ud83d\udc62","\ud83d\udc51","\ud83d\udc52","\ud83c\udfa9","\ud83c\udf93","\ud83e\udde2","\u26d1\ufe0f","\ud83d\udcff","\ud83d\udc84","\ud83d\udc8d","\ud83d\udc8e",
- }, "emoji/People.png"),
- new StaticEmojiPageModel(R.attr.emoji_category_nature, new String[] {
- "\ud83d\udc35","\ud83d\udc12","\ud83e\udd8d","\ud83d\udc36","\ud83d\udc15","\ud83d\udc29","\ud83d\udc3a","\ud83e\udd8a","\ud83d\udc31","\ud83d\udc08","\ud83e\udd81","\ud83d\udc2f","\ud83d\udc05","\ud83d\udc06","\ud83d\udc34","\ud83d\udc0e","\ud83e\udd84","\ud83e\udd93","\ud83e\udd8c","\ud83d\udc2e","\ud83d\udc02","\ud83d\udc03","\ud83d\udc04","\ud83d\udc37","\ud83d\udc16","\ud83d\udc17","\ud83d\udc3d","\ud83d\udc0f","\ud83d\udc11","\ud83d\udc10","\ud83d\udc2a","\ud83d\udc2b","\ud83e\udd92","\ud83d\udc18","\ud83e\udd8f","\ud83d\udc2d","\ud83d\udc01","\ud83d\udc00","\ud83d\udc39","\ud83d\udc30","\ud83d\udc07","\ud83d\udc3f\ufe0f","\ud83e\udd94","\ud83e\udd87","\ud83d\udc3b","\ud83d\udc28","\ud83d\udc3c","\ud83d\udc3e","\ud83e\udd83","\ud83d\udc14","\ud83d\udc13","\ud83d\udc23","\ud83d\udc24","\ud83d\udc25","\ud83d\udc26","\ud83d\udc27","\ud83d\udd4a\ufe0f","\ud83e\udd85","\ud83e\udd86","\ud83e\udd89","\ud83d\udc38","\ud83d\udc0a","\ud83d\udc22","\ud83e\udd8e","\ud83d\udc0d","\ud83d\udc32","\ud83d\udc09","\ud83e\udd95","\ud83e\udd96","\ud83d\udc33","\ud83d\udc0b","\ud83d\udc2c","\ud83d\udc1f","\ud83d\udc20","\ud83d\udc21","\ud83e\udd88","\ud83d\udc19","\ud83d\udc1a","\ud83e\udd80","\ud83e\udd90","\ud83e\udd91","\ud83d\udc0c","\ud83e\udd8b","\ud83d\udc1b","\ud83d\udc1c","\ud83d\udc1d","\ud83d\udc1e","\ud83e\udd97","\ud83d\udd77\ufe0f","\ud83d\udd78\ufe0f","\ud83e\udd82","\ud83d\udc90","\ud83c\udf38","\ud83d\udcae","\ud83c\udff5\ufe0f","\ud83c\udf39","\ud83e\udd40","\ud83c\udf3a","\ud83c\udf3b","\ud83c\udf3c","\ud83c\udf37","\ud83c\udf31","\ud83c\udf32","\ud83c\udf33","\ud83c\udf34","\ud83c\udf35","\ud83c\udf3e","\ud83c\udf3f","\u2618\ufe0f","\ud83c\udf40","\ud83c\udf41","\ud83c\udf42","\ud83c\udf43",
- }, "emoji/Nature.png"),
- new StaticEmojiPageModel(R.attr.emoji_category_foods, new String[] {
- "\ud83c\udf47","\ud83c\udf48","\ud83c\udf49","\ud83c\udf4a","\ud83c\udf4b","\ud83c\udf4c","\ud83c\udf4d","\ud83c\udf4e","\ud83c\udf4f","\ud83c\udf50","\ud83c\udf51","\ud83c\udf52","\ud83c\udf53","\ud83e\udd5d","\ud83c\udf45","\ud83e\udd65","\ud83e\udd51","\ud83c\udf46","\ud83e\udd54","\ud83e\udd55","\ud83c\udf3d","\ud83c\udf36\ufe0f","\ud83e\udd52","\ud83e\udd66","\ud83c\udf44","\ud83e\udd5c","\ud83c\udf30","\ud83c\udf5e","\ud83e\udd50","\ud83e\udd56","\ud83e\udd68","\ud83e\udd5e","\ud83e\uddc0","\ud83c\udf56","\ud83c\udf57","\ud83e\udd69","\ud83e\udd53","\ud83c\udf54","\ud83c\udf5f","\ud83c\udf55","\ud83c\udf2d","\ud83e\udd6a","\ud83c\udf2e","\ud83c\udf2f","\ud83e\udd59","\ud83e\udd5a","\ud83c\udf73","\ud83e\udd58","\ud83c\udf72","\ud83e\udd63","\ud83e\udd57","\ud83c\udf7f","\ud83e\udd6b","\ud83c\udf71","\ud83c\udf58","\ud83c\udf59","\ud83c\udf5a","\ud83c\udf5b","\ud83c\udf5c","\ud83c\udf5d","\ud83c\udf60","\ud83c\udf62","\ud83c\udf63","\ud83c\udf64","\ud83c\udf65","\ud83c\udf61","\ud83e\udd5f","\ud83e\udd60","\ud83e\udd61","\ud83c\udf66","\ud83c\udf67","\ud83c\udf68","\ud83c\udf69","\ud83c\udf6a","\ud83c\udf82","\ud83c\udf70","\ud83e\udd67","\ud83c\udf6b","\ud83c\udf6c","\ud83c\udf6d","\ud83c\udf6e","\ud83c\udf6f","\ud83c\udf7c","\ud83e\udd5b","\u2615","\ud83c\udf75","\ud83c\udf76","\ud83c\udf7e","\ud83c\udf77","\ud83c\udf78","\ud83c\udf79","\ud83c\udf7a","\ud83c\udf7b","\ud83e\udd42","\ud83e\udd43","\ud83e\udd64","\ud83e\udd62","\ud83c\udf7d\ufe0f","\ud83c\udf74","\ud83e\udd44","\ud83d\udd2a","\ud83c\udffa",
- }, "emoji/Foods.png"),
- new StaticEmojiPageModel(R.attr.emoji_category_activity, new String[] {
- "\ud83c\udf83","\ud83c\udf84","\ud83c\udf86","\ud83c\udf87","\u2728","\ud83c\udf88","\ud83c\udf89","\ud83c\udf8a","\ud83c\udf8b","\ud83c\udf8d","\ud83c\udf8e","\ud83c\udf8f","\ud83c\udf90","\ud83c\udf91","\ud83c\udf80","\ud83c\udf81","\ud83c\udf97\ufe0f","\ud83c\udf9f\ufe0f","\ud83c\udfab","\ud83c\udf96\ufe0f","\ud83c\udfc6","\ud83c\udfc5","\ud83e\udd47","\ud83e\udd48","\ud83e\udd49","\u26bd","\u26be","\ud83c\udfc0","\ud83c\udfd0","\ud83c\udfc8","\ud83c\udfc9","\ud83c\udfbe","\ud83c\udfb1","\ud83c\udfb3","\ud83c\udfcf","\ud83c\udfd1","\ud83c\udfd2","\ud83c\udfd3","\ud83c\udff8","\ud83e\udd4a","\ud83e\udd4b","\ud83e\udd45","\ud83c\udfaf","\u26f3","\u26f8\ufe0f","\ud83c\udfa3","\ud83c\udfbd","\ud83c\udfbf","\ud83d\udef7","\ud83e\udd4c","\ud83c\udfae","\ud83d\udd79\ufe0f","\ud83c\udfb2","\u2660\ufe0f","\u2665\ufe0f","\u2666\ufe0f","\u2663\ufe0f","\ud83c\udccf","\ud83c\udc04","\ud83c\udfb4",
- }, "emoji/Activity.png"),
- new StaticEmojiPageModel(R.attr.emoji_category_places, new String[] {
- "\ud83c\udf0d","\ud83c\udf0e","\ud83c\udf0f","\ud83c\udf10","\ud83d\uddfa\ufe0f","\ud83d\uddfe","\ud83c\udfd4\ufe0f","\u26f0\ufe0f","\ud83c\udf0b","\ud83d\uddfb","\ud83c\udfd5\ufe0f","\ud83c\udfd6\ufe0f","\ud83c\udfdc\ufe0f","\ud83c\udfdd\ufe0f","\ud83c\udfde\ufe0f","\ud83c\udfdf\ufe0f","\ud83c\udfdb\ufe0f","\ud83c\udfd7\ufe0f","\ud83c\udfd8\ufe0f","\ud83c\udfd9\ufe0f","\ud83c\udfda\ufe0f","\ud83c\udfe0","\ud83c\udfe1","\ud83c\udfe2","\ud83c\udfe3","\ud83c\udfe4","\ud83c\udfe5","\ud83c\udfe6","\ud83c\udfe8","\ud83c\udfe9","\ud83c\udfea","\ud83c\udfeb","\ud83c\udfec","\ud83c\udfed","\ud83c\udfef","\ud83c\udff0","\ud83d\udc92","\ud83d\uddfc","\ud83d\uddfd","\u26ea","\ud83d\udd4c","\ud83d\udd4d","\u26e9\ufe0f","\ud83d\udd4b","\u26f2","\u26fa","\ud83c\udf01","\ud83c\udf03","\ud83c\udf04","\ud83c\udf05","\ud83c\udf06","\ud83c\udf07","\ud83c\udf09","\u2668\ufe0f","\ud83c\udf0c","\ud83c\udfa0","\ud83c\udfa1","\ud83c\udfa2","\ud83d\udc88","\ud83c\udfaa","\ud83c\udfad","\ud83d\uddbc\ufe0f","\ud83c\udfa8","\ud83c\udfb0","\ud83d\ude82","\ud83d\ude83","\ud83d\ude84","\ud83d\ude85","\ud83d\ude86","\ud83d\ude87","\ud83d\ude88","\ud83d\ude89","\ud83d\ude8a","\ud83d\ude9d","\ud83d\ude9e","\ud83d\ude8b","\ud83d\ude8c","\ud83d\ude8d","\ud83d\ude8e","\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\udeb2","\ud83d\udef4","\ud83d\udef5","\ud83d\ude8f","\ud83d\udee3\ufe0f","\ud83d\udee4\ufe0f","\u26fd","\ud83d\udea8","\ud83d\udea5","\ud83d\udea6","\ud83d\udea7","\ud83d\uded1","\u2693","\u26f5","\ud83d\udef6","\ud83d\udea4","\ud83d\udef3\ufe0f","\u26f4\ufe0f","\ud83d\udee5\ufe0f","\ud83d\udea2","\u2708\ufe0f","\ud83d\udee9\ufe0f","\ud83d\udeeb","\ud83d\udeec","\ud83d\udcba","\ud83d\ude81","\ud83d\ude9f","\ud83d\udea0","\ud83d\udea1","\ud83d\udef0\ufe0f","\ud83d\ude80","\ud83d\udef8","\ud83d\udece\ufe0f","\ud83d\udeaa","\ud83d\udecf\ufe0f","\ud83d\udecb\ufe0f","\ud83d\udebd","\ud83d\udebf","\ud83d\udec1","\u231b","\u23f3","\u231a","\u23f0","\u23f1\ufe0f","\u23f2\ufe0f","\ud83d\udd70\ufe0f","\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","\ud83c\udf11","\ud83c\udf12","\ud83c\udf13","\ud83c\udf14","\ud83c\udf15","\ud83c\udf16","\ud83c\udf17","\ud83c\udf18","\ud83c\udf19","\ud83c\udf1a","\ud83c\udf1b","\ud83c\udf1c","\ud83c\udf21\ufe0f","\u2600\ufe0f","\ud83c\udf1d","\ud83c\udf1e","\u2b50","\ud83c\udf1f","\ud83c\udf20","\u2601\ufe0f","\u26c5","\u26c8\ufe0f","\ud83c\udf24\ufe0f","\ud83c\udf25\ufe0f","\ud83c\udf26\ufe0f","\ud83c\udf27\ufe0f","\ud83c\udf28\ufe0f","\ud83c\udf29\ufe0f","\ud83c\udf2a\ufe0f","\ud83c\udf2b\ufe0f","\ud83c\udf2c\ufe0f","\ud83c\udf00","\ud83c\udf08","\ud83c\udf02","\u2602\ufe0f","\u2614","\u26f1\ufe0f","\u26a1","\u2744\ufe0f","\u2603\ufe0f","\u26c4","\u2604\ufe0f","\ud83d\udd25","\ud83d\udca7","\ud83c\udf0a",
- }, "emoji/Places.png"),
- new StaticEmojiPageModel(R.attr.emoji_category_objects, new String[] {
- "\ud83d\udd07","\ud83d\udd08","\ud83d\udd09","\ud83d\udd0a","\ud83d\udce2","\ud83d\udce3","\ud83d\udcef","\ud83d\udd14","\ud83d\udd15","\ud83c\udfbc","\ud83c\udfb5","\ud83c\udfb6","\ud83c\udf99\ufe0f","\ud83c\udf9a\ufe0f","\ud83c\udf9b\ufe0f","\ud83c\udfa4","\ud83c\udfa7","\ud83d\udcfb","\ud83c\udfb7","\ud83c\udfb8","\ud83c\udfb9","\ud83c\udfba","\ud83c\udfbb","\ud83e\udd41","\ud83d\udcf1","\ud83d\udcf2","\u260e\ufe0f","\ud83d\udcde","\ud83d\udcdf","\ud83d\udce0","\ud83d\udd0b","\ud83d\udd0c","\ud83d\udcbb","\ud83d\udda5\ufe0f","\ud83d\udda8\ufe0f","\u2328\ufe0f","\ud83d\uddb1\ufe0f","\ud83d\uddb2\ufe0f","\ud83d\udcbd","\ud83d\udcbe","\ud83d\udcbf","\ud83d\udcc0","\ud83c\udfa5","\ud83c\udf9e\ufe0f","\ud83d\udcfd\ufe0f","\ud83c\udfac","\ud83d\udcfa","\ud83d\udcf7","\ud83d\udcf8","\ud83d\udcf9","\ud83d\udcfc","\ud83d\udd0d","\ud83d\udd0e","\ud83d\udd2c","\ud83d\udd2d","\ud83d\udce1","\ud83d\udd6f\ufe0f","\ud83d\udca1","\ud83d\udd26","\ud83c\udfee","\ud83d\udcd4","\ud83d\udcd5","\ud83d\udcd6","\ud83d\udcd7","\ud83d\udcd8","\ud83d\udcd9","\ud83d\udcda","\ud83d\udcd3","\ud83d\udcd2","\ud83d\udcc3","\ud83d\udcdc","\ud83d\udcc4","\ud83d\udcf0","\ud83d\uddde\ufe0f","\ud83d\udcd1","\ud83d\udd16","\ud83c\udff7\ufe0f","\ud83d\udcb0","\ud83d\udcb4","\ud83d\udcb5","\ud83d\udcb6","\ud83d\udcb7","\ud83d\udcb8","\ud83d\udcb3","\ud83d\udcb9","\ud83d\udcb1","\ud83d\udcb2","\u2709\ufe0f","\ud83d\udce7","\ud83d\udce8","\ud83d\udce9","\ud83d\udce4","\ud83d\udce5","\ud83d\udce6","\ud83d\udceb","\ud83d\udcea","\ud83d\udcec","\ud83d\udced","\ud83d\udcee","\ud83d\uddf3\ufe0f","\u270f\ufe0f","\u2712\ufe0f","\ud83d\udd8b\ufe0f","\ud83d\udd8a\ufe0f","\ud83d\udd8c\ufe0f","\ud83d\udd8d\ufe0f","\ud83d\udcdd","\ud83d\udcbc","\ud83d\udcc1","\ud83d\udcc2","\ud83d\uddc2\ufe0f","\ud83d\udcc5","\ud83d\udcc6","\ud83d\uddd2\ufe0f","\ud83d\uddd3\ufe0f","\ud83d\udcc7","\ud83d\udcc8","\ud83d\udcc9","\ud83d\udcca","\ud83d\udccb","\ud83d\udccc","\ud83d\udccd","\ud83d\udcce","\ud83d\udd87\ufe0f","\ud83d\udccf","\ud83d\udcd0","\u2702\ufe0f","\ud83d\uddc3\ufe0f","\ud83d\uddc4\ufe0f","\ud83d\uddd1\ufe0f","\ud83d\udd12","\ud83d\udd13","\ud83d\udd0f","\ud83d\udd10","\ud83d\udd11","\ud83d\udddd\ufe0f","\ud83d\udd28","\u26cf\ufe0f","\u2692\ufe0f","\ud83d\udee0\ufe0f","\ud83d\udde1\ufe0f","\u2694\ufe0f","\ud83d\udd2b","\ud83c\udff9","\ud83d\udee1\ufe0f","\ud83d\udd27","\ud83d\udd29","\u2699\ufe0f","\ud83d\udddc\ufe0f","\u2697\ufe0f","\u2696\ufe0f","\ud83d\udd17","\u26d3\ufe0f","\ud83d\udc89","\ud83d\udc8a","\ud83d\udeac","\u26b0\ufe0f","\u26b1\ufe0f","\ud83d\uddff","\ud83d\udee2\ufe0f","\ud83d\udd2e","\ud83d\uded2",
- }, "emoji/Objects.png"),
- new StaticEmojiPageModel(R.attr.emoji_category_symbol, new String[] {
- "\ud83c\udfe7","\ud83d\udeae","\ud83d\udeb0","\u267f","\ud83d\udeb9","\ud83d\udeba","\ud83d\udebb","\ud83d\udebc","\ud83d\udebe","\ud83d\udec2","\ud83d\udec3","\ud83d\udec4","\ud83d\udec5","\u26a0\ufe0f","\ud83d\udeb8","\u26d4","\ud83d\udeab","\ud83d\udeb3","\ud83d\udead","\ud83d\udeaf","\ud83d\udeb1","\ud83d\udeb7","\ud83d\udcf5","\ud83d\udd1e","\u2622\ufe0f","\u2623\ufe0f","\u2b06\ufe0f","\u2197\ufe0f","\u27a1\ufe0f","\u2198\ufe0f","\u2b07\ufe0f","\u2199\ufe0f","\u2b05\ufe0f","\u2196\ufe0f","\u2195\ufe0f","\u2194\ufe0f","\u21a9\ufe0f","\u21aa\ufe0f","\u2934\ufe0f","\u2935\ufe0f","\ud83d\udd03","\ud83d\udd04","\ud83d\udd19","\ud83d\udd1a","\ud83d\udd1b","\ud83d\udd1c","\ud83d\udd1d","\ud83d\uded0","\u269b\ufe0f","\ud83d\udd49\ufe0f","\u2721\ufe0f","\u2638\ufe0f","\u262f\ufe0f","\u271d\ufe0f","\u2626\ufe0f","\u262a\ufe0f","\u262e\ufe0f","\ud83d\udd4e","\ud83d\udd2f","\u2648","\u2649","\u264a","\u264b","\u264c","\u264d","\u264e","\u264f","\u2650","\u2651","\u2652","\u2653","\u26ce","\ud83d\udd00","\ud83d\udd01","\ud83d\udd02","\u25b6\ufe0f","\u23e9","\u23ed\ufe0f","\u23ef\ufe0f","\u25c0\ufe0f","\u23ea","\u23ee\ufe0f","\ud83d\udd3c","\u23eb","\ud83d\udd3d","\u23ec","\u23f8\ufe0f","\u23f9\ufe0f","\u23fa\ufe0f","\u23cf\ufe0f","\ud83c\udfa6","\ud83d\udd05","\ud83d\udd06","\ud83d\udcf6","\ud83d\udcf3","\ud83d\udcf4","\u267b\ufe0f","\u269c\ufe0f","\ud83d\udd31","\ud83d\udcdb","\ud83d\udd30","\u2b55","\u2705","\u2611\ufe0f","\u2714\ufe0f","\u2716\ufe0f","\u274c","\u274e","\u2795","\u2796","\u2797","\u27b0","\u27bf","\u303d\ufe0f","\u2733\ufe0f","\u2734\ufe0f","\u2747\ufe0f","\u203c\ufe0f","\u2049\ufe0f","\u2753","\u2754","\u2755","\u2757","\u3030\ufe0f","\u00a9\ufe0f","\u00ae\ufe0f","\u2122\ufe0f","\u0023\ufe0f\u20e3","\u002a\ufe0f\u20e3","\u0030\ufe0f\u20e3","\u0031\ufe0f\u20e3","\u0032\ufe0f\u20e3","\u0033\ufe0f\u20e3","\u0034\ufe0f\u20e3","\u0035\ufe0f\u20e3","\u0036\ufe0f\u20e3","\u0037\ufe0f\u20e3","\u0038\ufe0f\u20e3","\u0039\ufe0f\u20e3","\ud83d\udd1f","\ud83d\udcaf","\ud83d\udd20","\ud83d\udd21","\ud83d\udd22","\ud83d\udd23","\ud83d\udd24","\ud83c\udd70\ufe0f","\ud83c\udd8e","\ud83c\udd71\ufe0f","\ud83c\udd91","\ud83c\udd92","\ud83c\udd93","\u2139\ufe0f","\ud83c\udd94","\u24c2\ufe0f","\ud83c\udd95","\ud83c\udd96","\ud83c\udd7e\ufe0f","\ud83c\udd97","\ud83c\udd7f\ufe0f","\ud83c\udd98","\ud83c\udd99","\ud83c\udd9a","\ud83c\ude01","\ud83c\ude02\ufe0f","\ud83c\ude37\ufe0f","\ud83c\ude36","\ud83c\ude2f","\ud83c\ude50","\ud83c\ude39","\ud83c\ude1a","\ud83c\ude32","\ud83c\ude51","\ud83c\ude38","\ud83c\ude34","\ud83c\ude33","\u3297\ufe0f","\u3299\ufe0f","\ud83c\ude3a","\ud83c\ude35","\u25aa\ufe0f","\u25ab\ufe0f","\u25fb\ufe0f","\u25fc\ufe0f","\u25fd","\u25fe","\u2b1b","\u2b1c","\ud83d\udd36","\ud83d\udd37","\ud83d\udd38","\ud83d\udd39","\ud83d\udd3a","\ud83d\udd3b","\ud83d\udca0","\ud83d\udd18","\ud83d\udd32","\ud83d\udd33","\u26aa","\u26ab","\ud83d\udd34","\ud83d\udd35",
- }, "emoji/Symbols.png"),
- new StaticEmojiPageModel(R.attr.emoji_category_flags, new String[] {
- "\ud83c\udfc1","\ud83d\udea9","\ud83c\udf8c","\ud83c\udff4","\ud83c\udff3\ufe0f","\ud83c\udff3\ufe0f\u200d\ud83c\udf08","\ud83c\udde6\ud83c\udde8","\ud83c\udde6\ud83c\udde9","\ud83c\udde6\ud83c\uddea","\ud83c\udde6\ud83c\uddeb","\ud83c\udde6\ud83c\uddec","\ud83c\udde6\ud83c\uddee","\ud83c\udde6\ud83c\uddf1","\ud83c\udde6\ud83c\uddf2","\ud83c\udde6\ud83c\uddf4","\ud83c\udde6\ud83c\uddf6","\ud83c\udde6\ud83c\uddf7","\ud83c\udde6\ud83c\uddf8","\ud83c\udde6\ud83c\uddf9","\ud83c\udde6\ud83c\uddfa","\ud83c\udde6\ud83c\uddfc","\ud83c\udde6\ud83c\uddfd","\ud83c\udde6\ud83c\uddff","\ud83c\udde7\ud83c\udde6","\ud83c\udde7\ud83c\udde7","\ud83c\udde7\ud83c\udde9","\ud83c\udde7\ud83c\uddea","\ud83c\udde7\ud83c\uddeb","\ud83c\udde7\ud83c\uddec","\ud83c\udde7\ud83c\udded","\ud83c\udde7\ud83c\uddee","\ud83c\udde7\ud83c\uddef","\ud83c\udde7\ud83c\uddf1","\ud83c\udde7\ud83c\uddf2","\ud83c\udde7\ud83c\uddf3","\ud83c\udde7\ud83c\uddf4","\ud83c\udde7\ud83c\uddf6","\ud83c\udde7\ud83c\uddf7","\ud83c\udde7\ud83c\uddf8","\ud83c\udde7\ud83c\uddf9","\ud83c\udde7\ud83c\uddfb","\ud83c\udde7\ud83c\uddfc","\ud83c\udde7\ud83c\uddfe","\ud83c\udde7\ud83c\uddff","\ud83c\udde8\ud83c\udde6","\ud83c\udde8\ud83c\udde8","\ud83c\udde8\ud83c\udde9","\ud83c\udde8\ud83c\uddeb","\ud83c\udde8\ud83c\uddec","\ud83c\udde8\ud83c\udded","\ud83c\udde8\ud83c\uddee","\ud83c\udde8\ud83c\uddf0","\ud83c\udde8\ud83c\uddf1","\ud83c\udde8\ud83c\uddf2","\ud83c\udde8\ud83c\uddf3","\ud83c\udde8\ud83c\uddf4","\ud83c\udde8\ud83c\uddf5","\ud83c\udde8\ud83c\uddf7","\ud83c\udde8\ud83c\uddfa","\ud83c\udde8\ud83c\uddfb","\ud83c\udde8\ud83c\uddfc","\ud83c\udde8\ud83c\uddfd","\ud83c\udde8\ud83c\uddfe","\ud83c\udde8\ud83c\uddff","\ud83c\udde9\ud83c\uddea","\ud83c\udde9\ud83c\uddec","\ud83c\udde9\ud83c\uddef","\ud83c\udde9\ud83c\uddf0","\ud83c\udde9\ud83c\uddf2","\ud83c\udde9\ud83c\uddf4","\ud83c\udde9\ud83c\uddff","\ud83c\uddea\ud83c\udde6","\ud83c\uddea\ud83c\udde8","\ud83c\uddea\ud83c\uddea","\ud83c\uddea\ud83c\uddec","\ud83c\uddea\ud83c\udded","\ud83c\uddea\ud83c\uddf7","\ud83c\uddea\ud83c\uddf8","\ud83c\uddea\ud83c\uddf9","\ud83c\uddea\ud83c\uddfa","\ud83c\uddeb\ud83c\uddee","\ud83c\uddeb\ud83c\uddef","\ud83c\uddeb\ud83c\uddf0","\ud83c\uddeb\ud83c\uddf2","\ud83c\uddeb\ud83c\uddf4","\ud83c\uddeb\ud83c\uddf7","\ud83c\uddec\ud83c\udde6","\ud83c\uddec\ud83c\udde7","\ud83c\uddec\ud83c\udde9","\ud83c\uddec\ud83c\uddea","\ud83c\uddec\ud83c\uddeb","\ud83c\uddec\ud83c\uddec","\ud83c\uddec\ud83c\udded","\ud83c\uddec\ud83c\uddee","\ud83c\uddec\ud83c\uddf1","\ud83c\uddec\ud83c\uddf2","\ud83c\uddec\ud83c\uddf3","\ud83c\uddec\ud83c\uddf5","\ud83c\uddec\ud83c\uddf6","\ud83c\uddec\ud83c\uddf7","\ud83c\uddec\ud83c\uddf8","\ud83c\uddec\ud83c\uddf9","\ud83c\uddec\ud83c\uddfa","\ud83c\uddec\ud83c\uddfc","\ud83c\uddec\ud83c\uddfe","\ud83c\udded\ud83c\uddf0","\ud83c\udded\ud83c\uddf2","\ud83c\udded\ud83c\uddf3","\ud83c\udded\ud83c\uddf7","\ud83c\udded\ud83c\uddf9","\ud83c\udded\ud83c\uddfa","\ud83c\uddee\ud83c\udde8","\ud83c\uddee\ud83c\udde9","\ud83c\uddee\ud83c\uddea","\ud83c\uddee\ud83c\uddf1","\ud83c\uddee\ud83c\uddf2","\ud83c\uddee\ud83c\uddf3","\ud83c\uddee\ud83c\uddf4","\ud83c\uddee\ud83c\uddf6","\ud83c\uddee\ud83c\uddf7","\ud83c\uddee\ud83c\uddf8","\ud83c\uddee\ud83c\uddf9","\ud83c\uddef\ud83c\uddea","\ud83c\uddef\ud83c\uddf2","\ud83c\uddef\ud83c\uddf4","\ud83c\uddef\ud83c\uddf5","\ud83c\uddf0\ud83c\uddea","\ud83c\uddf0\ud83c\uddec","\ud83c\uddf0\ud83c\udded","\ud83c\uddf0\ud83c\uddee","\ud83c\uddf0\ud83c\uddf2","\ud83c\uddf0\ud83c\uddf3","\ud83c\uddf0\ud83c\uddf5","\ud83c\uddf0\ud83c\uddf7","\ud83c\uddf0\ud83c\uddfc","\ud83c\uddf0\ud83c\uddfe","\ud83c\uddf0\ud83c\uddff","\ud83c\uddf1\ud83c\udde6","\ud83c\uddf1\ud83c\udde7","\ud83c\uddf1\ud83c\udde8","\ud83c\uddf1\ud83c\uddee","\ud83c\uddf1\ud83c\uddf0","\ud83c\uddf1\ud83c\uddf7","\ud83c\uddf1\ud83c\uddf8","\ud83c\uddf1\ud83c\uddf9","\ud83c\uddf1\ud83c\uddfa","\ud83c\uddf1\ud83c\uddfb","\ud83c\uddf1\ud83c\uddfe","\ud83c\uddf2\ud83c\udde6","\ud83c\uddf2\ud83c\udde8","\ud83c\uddf2\ud83c\udde9","\ud83c\uddf2\ud83c\uddea","\ud83c\uddf2\ud83c\uddeb","\ud83c\uddf2\ud83c\uddec","\ud83c\uddf2\ud83c\udded","\ud83c\uddf2\ud83c\uddf0","\ud83c\uddf2\ud83c\uddf1","\ud83c\uddf2\ud83c\uddf2","\ud83c\uddf2\ud83c\uddf3","\ud83c\uddf2\ud83c\uddf4","\ud83c\uddf2\ud83c\uddf5","\ud83c\uddf2\ud83c\uddf6","\ud83c\uddf2\ud83c\uddf7","\ud83c\uddf2\ud83c\uddf8","\ud83c\uddf2\ud83c\uddf9","\ud83c\uddf2\ud83c\uddfa","\ud83c\uddf2\ud83c\uddfb","\ud83c\uddf2\ud83c\uddfc","\ud83c\uddf2\ud83c\uddfd","\ud83c\uddf2\ud83c\uddfe","\ud83c\uddf2\ud83c\uddff","\ud83c\uddf3\ud83c\udde6","\ud83c\uddf3\ud83c\udde8","\ud83c\uddf3\ud83c\uddea","\ud83c\uddf3\ud83c\uddeb","\ud83c\uddf3\ud83c\uddec","\ud83c\uddf3\ud83c\uddee","\ud83c\uddf3\ud83c\uddf1","\ud83c\uddf3\ud83c\uddf4","\ud83c\uddf3\ud83c\uddf5","\ud83c\uddf3\ud83c\uddf7","\ud83c\uddf3\ud83c\uddfa","\ud83c\uddf3\ud83c\uddff","\ud83c\uddf4\ud83c\uddf2","\ud83c\uddf5\ud83c\udde6","\ud83c\uddf5\ud83c\uddea","\ud83c\uddf5\ud83c\uddeb","\ud83c\uddf5\ud83c\uddec","\ud83c\uddf5\ud83c\udded","\ud83c\uddf5\ud83c\uddf0","\ud83c\uddf5\ud83c\uddf1","\ud83c\uddf5\ud83c\uddf2","\ud83c\uddf5\ud83c\uddf3","\ud83c\uddf5\ud83c\uddf7","\ud83c\uddf5\ud83c\uddf8","\ud83c\uddf5\ud83c\uddf9","\ud83c\uddf5\ud83c\uddfc","\ud83c\uddf5\ud83c\uddfe","\ud83c\uddf6\ud83c\udde6","\ud83c\uddf7\ud83c\uddea","\ud83c\uddf7\ud83c\uddf4","\ud83c\uddf7\ud83c\uddf8","\ud83c\uddf7\ud83c\uddfa","\ud83c\uddf7\ud83c\uddfc","\ud83c\uddf8\ud83c\udde6","\ud83c\uddf8\ud83c\udde7","\ud83c\uddf8\ud83c\udde8","\ud83c\uddf8\ud83c\udde9","\ud83c\uddf8\ud83c\uddea","\ud83c\uddf8\ud83c\uddec","\ud83c\uddf8\ud83c\udded","\ud83c\uddf8\ud83c\uddee","\ud83c\uddf8\ud83c\uddef","\ud83c\uddf8\ud83c\uddf0","\ud83c\uddf8\ud83c\uddf1","\ud83c\uddf8\ud83c\uddf2","\ud83c\uddf8\ud83c\uddf3","\ud83c\uddf8\ud83c\uddf4","\ud83c\uddf8\ud83c\uddf7","\ud83c\uddf8\ud83c\uddf8","\ud83c\uddf8\ud83c\uddf9","\ud83c\uddf8\ud83c\uddfb","\ud83c\uddf8\ud83c\uddfd","\ud83c\uddf8\ud83c\uddfe","\ud83c\uddf8\ud83c\uddff","\ud83c\uddf9\ud83c\udde6","\ud83c\uddf9\ud83c\udde8","\ud83c\uddf9\ud83c\udde9","\ud83c\uddf9\ud83c\uddeb","\ud83c\uddf9\ud83c\uddec","\ud83c\uddf9\ud83c\udded","\ud83c\uddf9\ud83c\uddef","\ud83c\uddf9\ud83c\uddf0","\ud83c\uddf9\ud83c\uddf1","\ud83c\uddf9\ud83c\uddf2","\ud83c\uddf9\ud83c\uddf3","\ud83c\uddf9\ud83c\uddf4","\ud83c\uddf9\ud83c\uddf7","\ud83c\uddf9\ud83c\uddf9","\ud83c\uddf9\ud83c\uddfb","\ud83c\uddf9\ud83c\uddfc","\ud83c\uddf9\ud83c\uddff","\ud83c\uddfa\ud83c\udde6","\ud83c\uddfa\ud83c\uddec","\ud83c\uddfa\ud83c\uddf2","\ud83c\uddfa\ud83c\uddf8","\ud83c\uddfa\ud83c\uddfe","\ud83c\uddfa\ud83c\uddff","\ud83c\uddfb\ud83c\udde6","\ud83c\uddfb\ud83c\udde8","\ud83c\uddfb\ud83c\uddea","\ud83c\uddfb\ud83c\uddec","\ud83c\uddfb\ud83c\uddee","\ud83c\uddfb\ud83c\uddf3","\ud83c\uddfb\ud83c\uddfa","\ud83c\uddfc\ud83c\uddeb","\ud83c\uddfc\ud83c\uddf8","\ud83c\uddfd\ud83c\uddf0","\ud83c\uddfe\ud83c\uddea","\ud83c\uddfe\ud83c\uddf9","\ud83c\uddff\ud83c\udde6","\ud83c\uddff\ud83c\uddf2","\ud83c\uddff\ud83c\uddfc","\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f","\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc73\udb40\udc63\udb40\udc74\udb40\udc7f","\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc77\udb40\udc6c\udb40\udc73\udb40\udc7f",
- }, "emoji/Flags.png"),
- new StaticEmojiPageModel(R.attr.emoji_category_emoticons, new String[] {
+ private static final EmojiPageModel PAGE_FOODS = new StaticEmojiPageModel(R.attr.emoji_category_foods, new Emoji[] {
+ new Emoji("\ud83c\udf47"), new Emoji("\ud83c\udf48"), new Emoji("\ud83c\udf49"), new Emoji("\ud83c\udf4a"), new Emoji("\ud83c\udf4b"), new Emoji("\ud83c\udf4c"), new Emoji("\ud83c\udf4d"), new Emoji("\ud83e\udd6d"), new Emoji("\ud83c\udf4e"), new Emoji("\ud83c\udf4f"), new Emoji("\ud83c\udf50"), new Emoji("\ud83c\udf51"), new Emoji("\ud83c\udf52"), new Emoji("\ud83c\udf53"), new Emoji("\ud83e\udd5d"), new Emoji("\ud83c\udf45"), new Emoji("\ud83e\udd65"), new Emoji("\ud83e\udd51"), new Emoji("\ud83c\udf46"), new Emoji("\ud83e\udd54"), new Emoji("\ud83e\udd55"), new Emoji("\ud83c\udf3d"), new Emoji("\ud83c\udf36\ufe0f"), new Emoji("\ud83e\udd52"), new Emoji("\ud83e\udd6c"), new Emoji("\ud83e\udd66"), new Emoji("\ud83e\uddc4"), new Emoji("\ud83e\uddc5"), new Emoji("\ud83c\udf44"), new Emoji("\ud83e\udd5c"), new Emoji("\ud83c\udf30"), new Emoji("\ud83c\udf5e"), new Emoji("\ud83e\udd50"), new Emoji("\ud83e\udd56"), new Emoji("\ud83e\udd68"), new Emoji("\ud83e\udd6f"), new Emoji("\ud83e\udd5e"), new Emoji("\ud83e\uddc7"), new Emoji("\ud83e\uddc0"), new Emoji("\ud83c\udf56"), new Emoji("\ud83c\udf57"), new Emoji("\ud83e\udd69"), new Emoji("\ud83e\udd53"), new Emoji("\ud83c\udf54"), new Emoji("\ud83c\udf5f"), new Emoji("\ud83c\udf55"), new Emoji("\ud83c\udf2d"), new Emoji("\ud83e\udd6a"), new Emoji("\ud83c\udf2e"), new Emoji("\ud83c\udf2f"), new Emoji("\ud83e\udd59"), new Emoji("\ud83e\uddc6"), new Emoji("\ud83e\udd5a"), new Emoji("\ud83c\udf73"), new Emoji("\ud83e\udd58"), new Emoji("\ud83c\udf72"), new Emoji("\ud83e\udd63"), new Emoji("\ud83e\udd57"), new Emoji("\ud83c\udf7f"), new Emoji("\ud83e\uddc8"), new Emoji("\ud83e\uddc2"), new Emoji("\ud83e\udd6b"), new Emoji("\ud83c\udf71"), new Emoji("\ud83c\udf58"), new Emoji("\ud83c\udf59"), new Emoji("\ud83c\udf5a"), new Emoji("\ud83c\udf5b"), new Emoji("\ud83c\udf5c"), new Emoji("\ud83c\udf5d"), new Emoji("\ud83c\udf60"), new Emoji("\ud83c\udf62"), new Emoji("\ud83c\udf63"), new Emoji("\ud83c\udf64"), new Emoji("\ud83c\udf65"), new Emoji("\ud83e\udd6e"), new Emoji("\ud83c\udf61"), new Emoji("\ud83e\udd5f"), new Emoji("\ud83e\udd60"), new Emoji("\ud83e\udd61"), new Emoji("\ud83e\udd80"), new Emoji("\ud83e\udd9e"), new Emoji("\ud83e\udd90"), new Emoji("\ud83e\udd91"), new Emoji("\ud83e\uddaa"), new Emoji("\ud83c\udf66"), new Emoji("\ud83c\udf67"), new Emoji("\ud83c\udf68"), new Emoji("\ud83c\udf69"), new Emoji("\ud83c\udf6a"), new Emoji("\ud83c\udf82"), new Emoji("\ud83c\udf70"), new Emoji("\ud83e\uddc1"), new Emoji("\ud83e\udd67"), new Emoji("\ud83c\udf6b"), new Emoji("\ud83c\udf6c"), new Emoji("\ud83c\udf6d"), new Emoji("\ud83c\udf6e"), new Emoji("\ud83c\udf6f"), new Emoji("\ud83c\udf7c"), new Emoji("\ud83e\udd5b"), new Emoji("\u2615"), new Emoji("\ud83c\udf75"), new Emoji("\ud83c\udf76"), new Emoji("\ud83c\udf7e"), new Emoji("\ud83c\udf77"), new Emoji("\ud83c\udf78"), new Emoji("\ud83c\udf79"), new Emoji("\ud83c\udf7a"), new Emoji("\ud83c\udf7b"), new Emoji("\ud83e\udd42"), new Emoji("\ud83e\udd43"), new Emoji("\ud83e\udd64"), new Emoji("\ud83e\uddc3"), new Emoji("\ud83e\uddc9"), new Emoji("\ud83e\uddca"), new Emoji("\ud83e\udd62"), new Emoji("\ud83c\udf7d\ufe0f"), new Emoji("\ud83c\udf74"), new Emoji("\ud83e\udd44"), new Emoji("\ud83d\udd2a"), new Emoji("\ud83c\udffa"),
+ }, "emoji/Foods.webp");
+
+ private static final EmojiPageModel PAGE_ACTIVITY = new StaticEmojiPageModel(R.attr.emoji_category_activity, new Emoji[] {
+ new Emoji("\ud83c\udf83"), new Emoji("\ud83c\udf84"), new Emoji("\ud83c\udf86"), new Emoji("\ud83c\udf87"), new Emoji("\ud83e\udde8"), new Emoji("\u2728"), new Emoji("\ud83c\udf88"), new Emoji("\ud83c\udf89"), new Emoji("\ud83c\udf8a"), new Emoji("\ud83c\udf8b"), new Emoji("\ud83c\udf8d"), new Emoji("\ud83c\udf8e"), new Emoji("\ud83c\udf8f"), new Emoji("\ud83c\udf90"), new Emoji("\ud83c\udf91"), new Emoji("\ud83e\udde7"), new Emoji("\ud83c\udf80"), new Emoji("\ud83c\udf81"), new Emoji("\ud83c\udf97\ufe0f"), new Emoji("\ud83c\udf9f\ufe0f"), new Emoji("\ud83c\udfab"), new Emoji("\ud83c\udf96\ufe0f"), new Emoji("\ud83c\udfc6"), new Emoji("\ud83c\udfc5"), new Emoji("\ud83e\udd47"), new Emoji("\ud83e\udd48"), new Emoji("\ud83e\udd49"), new Emoji("\u26bd"), new Emoji("\u26be"), new Emoji("\ud83e\udd4e"), new Emoji("\ud83c\udfc0"), new Emoji("\ud83c\udfd0"), new Emoji("\ud83c\udfc8"), new Emoji("\ud83c\udfc9"), new Emoji("\ud83c\udfbe"), new Emoji("\ud83e\udd4f"), new Emoji("\ud83c\udfb3"), new Emoji("\ud83c\udfcf"), new Emoji("\ud83c\udfd1"), new Emoji("\ud83c\udfd2"), new Emoji("\ud83e\udd4d"), new Emoji("\ud83c\udfd3"), new Emoji("\ud83c\udff8"), new Emoji("\ud83e\udd4a"), new Emoji("\ud83e\udd4b"), new Emoji("\ud83e\udd45"), new Emoji("\u26f3"), new Emoji("\u26f8\ufe0f"), new Emoji("\ud83c\udfa3"), new Emoji("\ud83e\udd3f"), new Emoji("\ud83c\udfbd"), new Emoji("\ud83c\udfbf"), new Emoji("\ud83d\udef7"), new Emoji("\ud83e\udd4c"), new Emoji("\ud83c\udfaf"), new Emoji("\ud83e\ude80"), new Emoji("\ud83e\ude81"), new Emoji("\ud83c\udfb1"), new Emoji("\ud83d\udd2e"), new Emoji("\ud83e\uddff"), new Emoji("\ud83c\udfae"), new Emoji("\ud83d\udd79\ufe0f"), new Emoji("\ud83c\udfb0"), new Emoji("\ud83c\udfb2"), new Emoji("\ud83e\udde9"), new Emoji("\ud83e\uddf8"), new Emoji("\u2660\ufe0f"), new Emoji("\u2665\ufe0f"), new Emoji("\u2666\ufe0f"), new Emoji("\u2663\ufe0f"), new Emoji("\u265f\ufe0f"), new Emoji("\ud83c\udccf"), new Emoji("\ud83c\udc04"), new Emoji("\ud83c\udfb4"), new Emoji("\ud83c\udfad"), new Emoji("\ud83d\uddbc\ufe0f"), new Emoji("\ud83c\udfa8"), new Emoji("\ud83e\uddf5"), new Emoji("\ud83e\uddf6"),
+ }, "emoji/Activity.webp");
+
+ private static final EmojiPageModel PAGE_FLAGS_0 = new StaticEmojiPageModel(R.attr.emoji_category_flags, new Emoji[] {
+ new Emoji("\ud83c\udfc1"), new Emoji("\ud83d\udea9"), new Emoji("\ud83c\udf8c"), new Emoji("\ud83c\udff4"), new Emoji("\ud83c\udff3\ufe0f"), new Emoji("\ud83c\udff3\ufe0f\u200d\ud83c\udf08"), new Emoji("\ud83c\udff4\u200d\u2620\ufe0f"), new Emoji("\ud83c\udde6\ud83c\udde8"), new Emoji("\ud83c\udde6\ud83c\udde9"), new Emoji("\ud83c\udde6\ud83c\uddea"), new Emoji("\ud83c\udde6\ud83c\uddeb"), new Emoji("\ud83c\udde6\ud83c\uddec"), new Emoji("\ud83c\udde6\ud83c\uddee"), new Emoji("\ud83c\udde6\ud83c\uddf1"), new Emoji("\ud83c\udde6\ud83c\uddf2"), new Emoji("\ud83c\udde6\ud83c\uddf4"), new Emoji("\ud83c\udde6\ud83c\uddf6"), new Emoji("\ud83c\udde6\ud83c\uddf7"), new Emoji("\ud83c\udde6\ud83c\uddf8"), new Emoji("\ud83c\udde6\ud83c\uddf9"), new Emoji("\ud83c\udde6\ud83c\uddfa"), new Emoji("\ud83c\udde6\ud83c\uddfc"), new Emoji("\ud83c\udde6\ud83c\uddfd"), new Emoji("\ud83c\udde6\ud83c\uddff"), new Emoji("\ud83c\udde7\ud83c\udde6"), new Emoji("\ud83c\udde7\ud83c\udde7"), new Emoji("\ud83c\udde7\ud83c\udde9"), new Emoji("\ud83c\udde7\ud83c\uddea"), new Emoji("\ud83c\udde7\ud83c\uddeb"), new Emoji("\ud83c\udde7\ud83c\uddec"), new Emoji("\ud83c\udde7\ud83c\udded"), new Emoji("\ud83c\udde7\ud83c\uddee"), new Emoji("\ud83c\udde7\ud83c\uddef"), new Emoji("\ud83c\udde7\ud83c\uddf1"), new Emoji("\ud83c\udde7\ud83c\uddf2"), new Emoji("\ud83c\udde7\ud83c\uddf3"), new Emoji("\ud83c\udde7\ud83c\uddf4"), new Emoji("\ud83c\udde7\ud83c\uddf6"), new Emoji("\ud83c\udde7\ud83c\uddf7"), new Emoji("\ud83c\udde7\ud83c\uddf8"), new Emoji("\ud83c\udde7\ud83c\uddf9"), new Emoji("\ud83c\udde7\ud83c\uddfb"), new Emoji("\ud83c\udde7\ud83c\uddfc"), new Emoji("\ud83c\udde7\ud83c\uddfe"), new Emoji("\ud83c\udde7\ud83c\uddff"), new Emoji("\ud83c\udde8\ud83c\udde6"), new Emoji("\ud83c\udde8\ud83c\udde8"), new Emoji("\ud83c\udde8\ud83c\udde9"), new Emoji("\ud83c\udde8\ud83c\uddeb"), new Emoji("\ud83c\udde8\ud83c\uddec"), new Emoji("\ud83c\udde8\ud83c\udded"), new Emoji("\ud83c\udde8\ud83c\uddee"), new Emoji("\ud83c\udde8\ud83c\uddf0"), new Emoji("\ud83c\udde8\ud83c\uddf1"), new Emoji("\ud83c\udde8\ud83c\uddf2"), new Emoji("\ud83c\udde8\ud83c\uddf3"), new Emoji("\ud83c\udde8\ud83c\uddf4"), new Emoji("\ud83c\udde8\ud83c\uddf5"), new Emoji("\ud83c\udde8\ud83c\uddf7"), new Emoji("\ud83c\udde8\ud83c\uddfa"), new Emoji("\ud83c\udde8\ud83c\uddfb"), new Emoji("\ud83c\udde8\ud83c\uddfc"), new Emoji("\ud83c\udde8\ud83c\uddfd"), new Emoji("\ud83c\udde8\ud83c\uddfe"), new Emoji("\ud83c\udde8\ud83c\uddff"), new Emoji("\ud83c\udde9\ud83c\uddea"), new Emoji("\ud83c\udde9\ud83c\uddec"), new Emoji("\ud83c\udde9\ud83c\uddef"), new Emoji("\ud83c\udde9\ud83c\uddf0"), new Emoji("\ud83c\udde9\ud83c\uddf2"), new Emoji("\ud83c\udde9\ud83c\uddf4"), new Emoji("\ud83c\udde9\ud83c\uddff"), new Emoji("\ud83c\uddea\ud83c\udde6"), new Emoji("\ud83c\uddea\ud83c\udde8"), new Emoji("\ud83c\uddea\ud83c\uddea"), new Emoji("\ud83c\uddea\ud83c\uddec"), new Emoji("\ud83c\uddea\ud83c\udded"), new Emoji("\ud83c\uddea\ud83c\uddf7"), new Emoji("\ud83c\uddea\ud83c\uddf8"), new Emoji("\ud83c\uddea\ud83c\uddf9"), new Emoji("\ud83c\uddea\ud83c\uddfa"), new Emoji("\ud83c\uddeb\ud83c\uddee"), new Emoji("\ud83c\uddeb\ud83c\uddef"), new Emoji("\ud83c\uddeb\ud83c\uddf0"), new Emoji("\ud83c\uddeb\ud83c\uddf2"), new Emoji("\ud83c\uddeb\ud83c\uddf4"), new Emoji("\ud83c\uddeb\ud83c\uddf7"), new Emoji("\ud83c\uddec\ud83c\udde6"), new Emoji("\ud83c\uddec\ud83c\udde7"), new Emoji("\ud83c\uddec\ud83c\udde9"), new Emoji("\ud83c\uddec\ud83c\uddea"), new Emoji("\ud83c\uddec\ud83c\uddeb"), new Emoji("\ud83c\uddec\ud83c\uddec"), new Emoji("\ud83c\uddec\ud83c\udded"), new Emoji("\ud83c\uddec\ud83c\uddee"), new Emoji("\ud83c\uddec\ud83c\uddf1"), new Emoji("\ud83c\uddec\ud83c\uddf2"), new Emoji("\ud83c\uddec\ud83c\uddf3"), new Emoji("\ud83c\uddec\ud83c\uddf5"), new Emoji("\ud83c\uddec\ud83c\uddf6"), new Emoji("\ud83c\uddec\ud83c\uddf7"), new Emoji("\ud83c\uddec\ud83c\uddf8"), new Emoji("\ud83c\uddec\ud83c\uddf9"), new Emoji("\ud83c\uddec\ud83c\uddfa"), new Emoji("\ud83c\uddec\ud83c\uddfc"), new Emoji("\ud83c\uddec\ud83c\uddfe"), new Emoji("\ud83c\udded\ud83c\uddf0"), new Emoji("\ud83c\udded\ud83c\uddf2"), new Emoji("\ud83c\udded\ud83c\uddf3"), new Emoji("\ud83c\udded\ud83c\uddf7"), new Emoji("\ud83c\udded\ud83c\uddf9"), new Emoji("\ud83c\udded\ud83c\uddfa"), new Emoji("\ud83c\uddee\ud83c\udde8"), new Emoji("\ud83c\uddee\ud83c\udde9"), new Emoji("\ud83c\uddee\ud83c\uddea"), new Emoji("\ud83c\uddee\ud83c\uddf1"), new Emoji("\ud83c\uddee\ud83c\uddf2"), new Emoji("\ud83c\uddee\ud83c\uddf3"), new Emoji("\ud83c\uddee\ud83c\uddf4"), new Emoji("\ud83c\uddee\ud83c\uddf6"), new Emoji("\ud83c\uddee\ud83c\uddf7"), new Emoji("\ud83c\uddee\ud83c\uddf8"), new Emoji("\ud83c\uddee\ud83c\uddf9"), new Emoji("\ud83c\uddef\ud83c\uddea"), new Emoji("\ud83c\uddef\ud83c\uddf2"), new Emoji("\ud83c\uddef\ud83c\uddf4"), new Emoji("\ud83c\uddef\ud83c\uddf5"), new Emoji("\ud83c\uddf0\ud83c\uddea"), new Emoji("\ud83c\uddf0\ud83c\uddec"), new Emoji("\ud83c\uddf0\ud83c\udded"), new Emoji("\ud83c\uddf0\ud83c\uddee"), new Emoji("\ud83c\uddf0\ud83c\uddf2"), new Emoji("\ud83c\uddf0\ud83c\uddf3"), new Emoji("\ud83c\uddf0\ud83c\uddf5"), new Emoji("\ud83c\uddf0\ud83c\uddf7"), new Emoji("\ud83c\uddf0\ud83c\uddfc"), new Emoji("\ud83c\uddf0\ud83c\uddfe"), new Emoji("\ud83c\uddf0\ud83c\uddff"), new Emoji("\ud83c\uddf1\ud83c\udde6"), new Emoji("\ud83c\uddf1\ud83c\udde7"), new Emoji("\ud83c\uddf1\ud83c\udde8"), new Emoji("\ud83c\uddf1\ud83c\uddee"), new Emoji("\ud83c\uddf1\ud83c\uddf0"), new Emoji("\ud83c\uddf1\ud83c\uddf7"), new Emoji("\ud83c\uddf1\ud83c\uddf8"), new Emoji("\ud83c\uddf1\ud83c\uddf9"), new Emoji("\ud83c\uddf1\ud83c\uddfa"), new Emoji("\ud83c\uddf1\ud83c\uddfb"), new Emoji("\ud83c\uddf1\ud83c\uddfe"), new Emoji("\ud83c\uddf2\ud83c\udde6"), new Emoji("\ud83c\uddf2\ud83c\udde8"), new Emoji("\ud83c\uddf2\ud83c\udde9"), new Emoji("\ud83c\uddf2\ud83c\uddea"), new Emoji("\ud83c\uddf2\ud83c\uddeb"), new Emoji("\ud83c\uddf2\ud83c\uddec"), new Emoji("\ud83c\uddf2\ud83c\udded"), new Emoji("\ud83c\uddf2\ud83c\uddf0"), new Emoji("\ud83c\uddf2\ud83c\uddf1"), new Emoji("\ud83c\uddf2\ud83c\uddf2"), new Emoji("\ud83c\uddf2\ud83c\uddf3"), new Emoji("\ud83c\uddf2\ud83c\uddf4"), new Emoji("\ud83c\uddf2\ud83c\uddf5"), new Emoji("\ud83c\uddf2\ud83c\uddf6"), new Emoji("\ud83c\uddf2\ud83c\uddf7"), new Emoji("\ud83c\uddf2\ud83c\uddf8"), new Emoji("\ud83c\uddf2\ud83c\uddf9"), new Emoji("\ud83c\uddf2\ud83c\uddfa"), new Emoji("\ud83c\uddf2\ud83c\uddfb"), new Emoji("\ud83c\uddf2\ud83c\uddfc"), new Emoji("\ud83c\uddf2\ud83c\uddfd"), new Emoji("\ud83c\uddf2\ud83c\uddfe"), new Emoji("\ud83c\uddf2\ud83c\uddff"), new Emoji("\ud83c\uddf3\ud83c\udde6"), new Emoji("\ud83c\uddf3\ud83c\udde8"), new Emoji("\ud83c\uddf3\ud83c\uddea"), new Emoji("\ud83c\uddf3\ud83c\uddeb"), new Emoji("\ud83c\uddf3\ud83c\uddec"), new Emoji("\ud83c\uddf3\ud83c\uddee"), new Emoji("\ud83c\uddf3\ud83c\uddf1"), new Emoji("\ud83c\uddf3\ud83c\uddf4"), new Emoji("\ud83c\uddf3\ud83c\uddf5"), new Emoji("\ud83c\uddf3\ud83c\uddf7"), new Emoji("\ud83c\uddf3\ud83c\uddfa"), new Emoji("\ud83c\uddf3\ud83c\uddff"), new Emoji("\ud83c\uddf4\ud83c\uddf2"), new Emoji("\ud83c\uddf5\ud83c\udde6"), new Emoji("\ud83c\uddf5\ud83c\uddea"), new Emoji("\ud83c\uddf5\ud83c\uddeb"), new Emoji("\ud83c\uddf5\ud83c\uddec"), new Emoji("\ud83c\uddf5\ud83c\udded"), new Emoji("\ud83c\uddf5\ud83c\uddf0"), new Emoji("\ud83c\uddf5\ud83c\uddf1"), new Emoji("\ud83c\uddf5\ud83c\uddf2"), new Emoji("\ud83c\uddf5\ud83c\uddf3"), new Emoji("\ud83c\uddf5\ud83c\uddf7"), new Emoji("\ud83c\uddf5\ud83c\uddf8"), new Emoji("\ud83c\uddf5\ud83c\uddf9"), new Emoji("\ud83c\uddf5\ud83c\uddfc"), new Emoji("\ud83c\uddf5\ud83c\uddfe"), new Emoji("\ud83c\uddf6\ud83c\udde6"), new Emoji("\ud83c\uddf7\ud83c\uddea"), new Emoji("\ud83c\uddf7\ud83c\uddf4"), new Emoji("\ud83c\uddf7\ud83c\uddf8"), new Emoji("\ud83c\uddf7\ud83c\uddfa"), new Emoji("\ud83c\uddf7\ud83c\uddfc"), new Emoji("\ud83c\uddf8\ud83c\udde6"), new Emoji("\ud83c\uddf8\ud83c\udde7"), new Emoji("\ud83c\uddf8\ud83c\udde8"), new Emoji("\ud83c\uddf8\ud83c\udde9"), new Emoji("\ud83c\uddf8\ud83c\uddea"), new Emoji("\ud83c\uddf8\ud83c\uddec"), new Emoji("\ud83c\uddf8\ud83c\udded"), new Emoji("\ud83c\uddf8\ud83c\uddee"), new Emoji("\ud83c\uddf8\ud83c\uddef"), new Emoji("\ud83c\uddf8\ud83c\uddf0"), new Emoji("\ud83c\uddf8\ud83c\uddf1"), new Emoji("\ud83c\uddf8\ud83c\uddf2"), new Emoji("\ud83c\uddf8\ud83c\uddf3"), new Emoji("\ud83c\uddf8\ud83c\uddf4"), new Emoji("\ud83c\uddf8\ud83c\uddf7"), new Emoji("\ud83c\uddf8\ud83c\uddf8"), new Emoji("\ud83c\uddf8\ud83c\uddf9"), new Emoji("\ud83c\uddf8\ud83c\uddfb"), new Emoji("\ud83c\uddf8\ud83c\uddfd"), new Emoji("\ud83c\uddf8\ud83c\uddfe"), new Emoji("\ud83c\uddf8\ud83c\uddff"), new Emoji("\ud83c\uddf9\ud83c\udde6"), new Emoji("\ud83c\uddf9\ud83c\udde8"), new Emoji("\ud83c\uddf9\ud83c\udde9"), new Emoji("\ud83c\uddf9\ud83c\uddeb"), new Emoji("\ud83c\uddf9\ud83c\uddec"), new Emoji("\ud83c\uddf9\ud83c\udded"), new Emoji("\ud83c\uddf9\ud83c\uddef"), new Emoji("\ud83c\uddf9\ud83c\uddf0"), new Emoji("\ud83c\uddf9\ud83c\uddf1"), new Emoji("\ud83c\uddf9\ud83c\uddf2"), new Emoji("\ud83c\uddf9\ud83c\uddf3"), new Emoji("\ud83c\uddf9\ud83c\uddf4"), new Emoji("\ud83c\uddf9\ud83c\uddf7"), new Emoji("\ud83c\uddf9\ud83c\uddf9"), new Emoji("\ud83c\uddf9\ud83c\uddfb"), new Emoji("\ud83c\uddf9\ud83c\uddfc"), new Emoji("\ud83c\uddf9\ud83c\uddff"), new Emoji("\ud83c\uddfa\ud83c\udde6"), new Emoji("\ud83c\uddfa\ud83c\uddec"), new Emoji("\ud83c\uddfa\ud83c\uddf2"), new Emoji("\ud83c\uddfa\ud83c\uddf3"), new Emoji("\ud83c\uddfa\ud83c\uddf8"), new Emoji("\ud83c\uddfa\ud83c\uddfe"), new Emoji("\ud83c\uddfa\ud83c\uddff"), new Emoji("\ud83c\uddfb\ud83c\udde6"), new Emoji("\ud83c\uddfb\ud83c\udde8"), new Emoji("\ud83c\uddfb\ud83c\uddea"), new Emoji("\ud83c\uddfb\ud83c\uddec"), new Emoji("\ud83c\uddfb\ud83c\uddee"), new Emoji("\ud83c\uddfb\ud83c\uddf3"),
+ }, "emoji/Flags_0.webp");
+
+ private static final EmojiPageModel PAGE_FLAGS_1 = new StaticEmojiPageModel(R.attr.emoji_category_flags, new Emoji[] {
+ new Emoji("\ud83c\uddfb\ud83c\uddfa"), new Emoji("\ud83c\uddfc\ud83c\uddeb"), new Emoji("\ud83c\uddfc\ud83c\uddf8"), new Emoji("\ud83c\uddfd\ud83c\uddf0"), new Emoji("\ud83c\uddfe\ud83c\uddea"), new Emoji("\ud83c\uddfe\ud83c\uddf9"), new Emoji("\ud83c\uddff\ud83c\udde6"), new Emoji("\ud83c\uddff\ud83c\uddf2"), new Emoji("\ud83c\uddff\ud83c\uddfc"), new Emoji("\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f"), new Emoji("\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc73\udb40\udc63\udb40\udc74\udb40\udc7f"), new Emoji("\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc77\udb40\udc6c\udb40\udc73\udb40\udc7f"),
+ }, "emoji/Flags_1.webp");
+
+ private static final EmojiPageModel PAGE_SYMBOLS = new StaticEmojiPageModel(R.attr.emoji_category_symbols, new Emoji[] {
+ new Emoji("\ud83c\udfe7"), new Emoji("\ud83d\udeae"), new Emoji("\ud83d\udeb0"), new Emoji("\u267f"), new Emoji("\ud83d\udeb9"), new Emoji("\ud83d\udeba"), new Emoji("\ud83d\udebb"), new Emoji("\ud83d\udebc"), new Emoji("\ud83d\udebe"), new Emoji("\ud83d\udec2"), new Emoji("\ud83d\udec3"), new Emoji("\ud83d\udec4"), new Emoji("\ud83d\udec5"), new Emoji("\u26a0\ufe0f"), new Emoji("\ud83d\udeb8"), new Emoji("\u26d4"), new Emoji("\ud83d\udeab"), new Emoji("\ud83d\udeb3"), new Emoji("\ud83d\udead"), new Emoji("\ud83d\udeaf"), new Emoji("\ud83d\udeb1"), new Emoji("\ud83d\udeb7"), new Emoji("\ud83d\udcf5"), new Emoji("\ud83d\udd1e"), new Emoji("\u2622\ufe0f"), new Emoji("\u2623\ufe0f"), new Emoji("\u2b06\ufe0f"), new Emoji("\u2197\ufe0f"), new Emoji("\u27a1\ufe0f"), new Emoji("\u2198\ufe0f"), new Emoji("\u2b07\ufe0f"), new Emoji("\u2199\ufe0f"), new Emoji("\u2b05\ufe0f"), new Emoji("\u2196\ufe0f"), new Emoji("\u2195\ufe0f"), new Emoji("\u2194\ufe0f"), new Emoji("\u21a9\ufe0f"), new Emoji("\u21aa\ufe0f"), new Emoji("\u2934\ufe0f"), new Emoji("\u2935\ufe0f"), new Emoji("\ud83d\udd03"), new Emoji("\ud83d\udd04"), new Emoji("\ud83d\udd19"), new Emoji("\ud83d\udd1a"), new Emoji("\ud83d\udd1b"), new Emoji("\ud83d\udd1c"), new Emoji("\ud83d\udd1d"), new Emoji("\ud83d\uded0"), new Emoji("\u269b\ufe0f"), new Emoji("\ud83d\udd49\ufe0f"), new Emoji("\u2721\ufe0f"), new Emoji("\u2638\ufe0f"), new Emoji("\u262f\ufe0f"), new Emoji("\u271d\ufe0f"), new Emoji("\u2626\ufe0f"), new Emoji("\u262a\ufe0f"), new Emoji("\u262e\ufe0f"), new Emoji("\ud83d\udd4e"), new Emoji("\ud83d\udd2f"), new Emoji("\u2648"), new Emoji("\u2649"), new Emoji("\u264a"), new Emoji("\u264b"), new Emoji("\u264c"), new Emoji("\u264d"), new Emoji("\u264e"), new Emoji("\u264f"), new Emoji("\u2650"), new Emoji("\u2651"), new Emoji("\u2652"), new Emoji("\u2653"), new Emoji("\u26ce"), new Emoji("\ud83d\udd00"), new Emoji("\ud83d\udd01"), new Emoji("\ud83d\udd02"), new Emoji("\u25b6\ufe0f"), new Emoji("\u23e9"), new Emoji("\u23ed\ufe0f"), new Emoji("\u23ef\ufe0f"), new Emoji("\u25c0\ufe0f"), new Emoji("\u23ea"), new Emoji("\u23ee\ufe0f"), new Emoji("\ud83d\udd3c"), new Emoji("\u23eb"), new Emoji("\ud83d\udd3d"), new Emoji("\u23ec"), new Emoji("\u23f8\ufe0f"), new Emoji("\u23f9\ufe0f"), new Emoji("\u23fa\ufe0f"), new Emoji("\u23cf\ufe0f"), new Emoji("\ud83c\udfa6"), new Emoji("\ud83d\udd05"), new Emoji("\ud83d\udd06"), new Emoji("\ud83d\udcf6"), new Emoji("\ud83d\udcf3"), new Emoji("\ud83d\udcf4"), new Emoji("\u267e\ufe0f"), new Emoji("\u267b\ufe0f"), new Emoji("\u269c\ufe0f"), new Emoji("\ud83d\udd31"), new Emoji("\ud83d\udcdb"), new Emoji("\ud83d\udd30"), new Emoji("\u2b55"), new Emoji("\u2705"), new Emoji("\u2611\ufe0f"), new Emoji("\u2714\ufe0f"), new Emoji("\u2716\ufe0f"), new Emoji("\u274c"), new Emoji("\u274e"), new Emoji("\u2795"), new Emoji("\u2796"), new Emoji("\u2797"), new Emoji("\u27b0"), new Emoji("\u27bf"), new Emoji("\u303d\ufe0f"), new Emoji("\u2733\ufe0f"), new Emoji("\u2734\ufe0f"), new Emoji("\u2747\ufe0f"), new Emoji("\u203c\ufe0f"), new Emoji("\u2049\ufe0f"), new Emoji("\u2753"), new Emoji("\u2754"), new Emoji("\u2755"), new Emoji("\u2757"), new Emoji("\u3030\ufe0f"), new Emoji("\u00a9\ufe0f"), new Emoji("\u00ae\ufe0f"), new Emoji("\u2122\ufe0f"), new Emoji("\u0023\ufe0f\u20e3"), new Emoji("\u002a\ufe0f\u20e3"), new Emoji("\u0030\ufe0f\u20e3"), new Emoji("\u0031\ufe0f\u20e3"), new Emoji("\u0032\ufe0f\u20e3"), new Emoji("\u0033\ufe0f\u20e3"), new Emoji("\u0034\ufe0f\u20e3"), new Emoji("\u0035\ufe0f\u20e3"), new Emoji("\u0036\ufe0f\u20e3"), new Emoji("\u0037\ufe0f\u20e3"), new Emoji("\u0038\ufe0f\u20e3"), new Emoji("\u0039\ufe0f\u20e3"), new Emoji("\ud83d\udd1f"), new Emoji("\ud83d\udd20"), new Emoji("\ud83d\udd21"), new Emoji("\ud83d\udd22"), new Emoji("\ud83d\udd23"), new Emoji("\ud83d\udd24"), new Emoji("\ud83c\udd70\ufe0f"), new Emoji("\ud83c\udd8e"), new Emoji("\ud83c\udd71\ufe0f"), new Emoji("\ud83c\udd91"), new Emoji("\ud83c\udd92"), new Emoji("\ud83c\udd93"), new Emoji("\u2139\ufe0f"), new Emoji("\ud83c\udd94"), new Emoji("\u24c2\ufe0f"), new Emoji("\ud83c\udd95"), new Emoji("\ud83c\udd96"), new Emoji("\ud83c\udd7e\ufe0f"), new Emoji("\ud83c\udd97"), new Emoji("\ud83c\udd7f\ufe0f"), new Emoji("\ud83c\udd98"), new Emoji("\ud83c\udd99"), new Emoji("\ud83c\udd9a"), new Emoji("\ud83c\ude01"), new Emoji("\ud83c\ude02\ufe0f"), new Emoji("\ud83c\ude37\ufe0f"), new Emoji("\ud83c\ude36"), new Emoji("\ud83c\ude2f"), new Emoji("\ud83c\ude50"), new Emoji("\ud83c\ude39"), new Emoji("\ud83c\ude1a"), new Emoji("\ud83c\ude32"), new Emoji("\ud83c\ude51"), new Emoji("\ud83c\ude38"), new Emoji("\ud83c\ude34"), new Emoji("\ud83c\ude33"), new Emoji("\u3297\ufe0f"), new Emoji("\u3299\ufe0f"), new Emoji("\ud83c\ude3a"), new Emoji("\ud83c\ude35"), new Emoji("\ud83d\udd34"), new Emoji("\ud83d\udfe0"), new Emoji("\ud83d\udfe1"), new Emoji("\ud83d\udfe2"), new Emoji("\ud83d\udd35"), new Emoji("\ud83d\udfe3"), new Emoji("\ud83d\udfe4"), new Emoji("\u26ab"), new Emoji("\u26aa"), new Emoji("\ud83d\udfe5"), new Emoji("\ud83d\udfe7"), new Emoji("\ud83d\udfe8"), new Emoji("\ud83d\udfe9"), new Emoji("\ud83d\udfe6"), new Emoji("\ud83d\udfea"), new Emoji("\ud83d\udfeb"), new Emoji("\u2b1b"), new Emoji("\u2b1c"), new Emoji("\u25fc\ufe0f"), new Emoji("\u25fb\ufe0f"), new Emoji("\u25fe"), new Emoji("\u25fd"), new Emoji("\u25aa\ufe0f"), new Emoji("\u25ab\ufe0f"), new Emoji("\ud83d\udd36"), new Emoji("\ud83d\udd37"), new Emoji("\ud83d\udd38"), new Emoji("\ud83d\udd39"), new Emoji("\ud83d\udd3a"), new Emoji("\ud83d\udd3b"), new Emoji("\ud83d\udca0"), new Emoji("\ud83d\udd18"), new Emoji("\ud83d\udd33"), new Emoji("\ud83d\udd32"),
+ }, "emoji/Symbols.webp");
+
+ private static final EmojiPageModel PAGE_NATURE = new StaticEmojiPageModel(R.attr.emoji_category_nature, new Emoji[] {
+ new Emoji("\ud83d\udc35"), new Emoji("\ud83d\udc12"), new Emoji("\ud83e\udd8d"), new Emoji("\ud83e\udda7"), new Emoji("\ud83d\udc36"), new Emoji("\ud83d\udc15"), new Emoji("\ud83e\uddae"), new Emoji("\ud83d\udc15\u200d\ud83e\uddba"), new Emoji("\ud83d\udc29"), new Emoji("\ud83d\udc3a"), new Emoji("\ud83e\udd8a"), new Emoji("\ud83e\udd9d"), new Emoji("\ud83d\udc31"), new Emoji("\ud83d\udc08"), new Emoji("\ud83e\udd81"), new Emoji("\ud83d\udc2f"), new Emoji("\ud83d\udc05"), new Emoji("\ud83d\udc06"), new Emoji("\ud83d\udc34"), new Emoji("\ud83d\udc0e"), new Emoji("\ud83e\udd84"), new Emoji("\ud83e\udd93"), new Emoji("\ud83e\udd8c"), new Emoji("\ud83d\udc2e"), new Emoji("\ud83d\udc02"), new Emoji("\ud83d\udc03"), new Emoji("\ud83d\udc04"), new Emoji("\ud83d\udc37"), new Emoji("\ud83d\udc16"), new Emoji("\ud83d\udc17"), new Emoji("\ud83d\udc3d"), new Emoji("\ud83d\udc0f"), new Emoji("\ud83d\udc11"), new Emoji("\ud83d\udc10"), new Emoji("\ud83d\udc2a"), new Emoji("\ud83d\udc2b"), new Emoji("\ud83e\udd99"), new Emoji("\ud83e\udd92"), new Emoji("\ud83d\udc18"), new Emoji("\ud83e\udd8f"), new Emoji("\ud83e\udd9b"), new Emoji("\ud83d\udc2d"), new Emoji("\ud83d\udc01"), new Emoji("\ud83d\udc00"), new Emoji("\ud83d\udc39"), new Emoji("\ud83d\udc30"), new Emoji("\ud83d\udc07"), new Emoji("\ud83d\udc3f\ufe0f"), new Emoji("\ud83e\udd94"), new Emoji("\ud83e\udd87"), new Emoji("\ud83d\udc3b"), new Emoji("\ud83d\udc28"), new Emoji("\ud83d\udc3c"), new Emoji("\ud83e\udda5"), new Emoji("\ud83e\udda6"), new Emoji("\ud83e\udda8"), new Emoji("\ud83e\udd98"), new Emoji("\ud83e\udda1"), new Emoji("\ud83d\udc3e"), new Emoji("\ud83e\udd83"), new Emoji("\ud83d\udc14"), new Emoji("\ud83d\udc13"), new Emoji("\ud83d\udc23"), new Emoji("\ud83d\udc24"), new Emoji("\ud83d\udc25"), new Emoji("\ud83d\udc26"), new Emoji("\ud83d\udc27"), new Emoji("\ud83d\udd4a\ufe0f"), new Emoji("\ud83e\udd85"), new Emoji("\ud83e\udd86"), new Emoji("\ud83e\udda2"), new Emoji("\ud83e\udd89"), new Emoji("\ud83e\udda9"), new Emoji("\ud83e\udd9a"), new Emoji("\ud83e\udd9c"), new Emoji("\ud83d\udc38"), new Emoji("\ud83d\udc0a"), new Emoji("\ud83d\udc22"), new Emoji("\ud83e\udd8e"), new Emoji("\ud83d\udc0d"), new Emoji("\ud83d\udc32"), new Emoji("\ud83d\udc09"), new Emoji("\ud83e\udd95"), new Emoji("\ud83e\udd96"), new Emoji("\ud83d\udc33"), new Emoji("\ud83d\udc0b"), new Emoji("\ud83d\udc2c"), new Emoji("\ud83d\udc1f"), new Emoji("\ud83d\udc20"), new Emoji("\ud83d\udc21"), new Emoji("\ud83e\udd88"), new Emoji("\ud83d\udc19"), new Emoji("\ud83d\udc1a"), new Emoji("\ud83d\udc0c"), new Emoji("\ud83e\udd8b"), new Emoji("\ud83d\udc1b"), new Emoji("\ud83d\udc1c"), new Emoji("\ud83d\udc1d"), new Emoji("\ud83d\udc1e"), new Emoji("\ud83e\udd97"), new Emoji("\ud83d\udd77\ufe0f"), new Emoji("\ud83d\udd78\ufe0f"), new Emoji("\ud83e\udd82"), new Emoji("\ud83e\udd9f"), new Emoji("\ud83e\udda0"), new Emoji("\ud83d\udc90"), new Emoji("\ud83c\udf38"), new Emoji("\ud83d\udcae"), new Emoji("\ud83c\udff5\ufe0f"), new Emoji("\ud83c\udf39"), new Emoji("\ud83e\udd40"), new Emoji("\ud83c\udf3a"), new Emoji("\ud83c\udf3b"), new Emoji("\ud83c\udf3c"), new Emoji("\ud83c\udf37"), new Emoji("\ud83c\udf31"), new Emoji("\ud83c\udf32"), new Emoji("\ud83c\udf33"), new Emoji("\ud83c\udf34"), new Emoji("\ud83c\udf35"), new Emoji("\ud83c\udf3e"), new Emoji("\ud83c\udf3f"), new Emoji("\u2618\ufe0f"), new Emoji("\ud83c\udf40"), new Emoji("\ud83c\udf41"), new Emoji("\ud83c\udf42"), new Emoji("\ud83c\udf43"),
+ }, "emoji/Nature.webp");
+
+ private static final EmojiPageModel PAGE_PEOPLE_0 = new StaticEmojiPageModel(R.attr.emoji_category_people, new Emoji[] {
+ new Emoji("\ud83d\ude00"), new Emoji("\ud83d\ude03"), new Emoji("\ud83d\ude04"), new Emoji("\ud83d\ude01"), new Emoji("\ud83d\ude06"), new Emoji("\ud83d\ude05"), new Emoji("\ud83e\udd23"), new Emoji("\ud83d\ude02"), new Emoji("\ud83d\ude42"), new Emoji("\ud83d\ude43"), new Emoji("\ud83d\ude09"), new Emoji("\ud83d\ude0a"), new Emoji("\ud83d\ude07"), new Emoji("\ud83e\udd70"), new Emoji("\ud83d\ude0d"), new Emoji("\ud83e\udd29"), new Emoji("\ud83d\ude18"), new Emoji("\ud83d\ude17"), new Emoji("\u263a\ufe0f"), new Emoji("\ud83d\ude1a"), new Emoji("\ud83d\ude19"), new Emoji("\ud83d\ude0b"), new Emoji("\ud83d\ude1b"), new Emoji("\ud83d\ude1c"), new Emoji("\ud83e\udd2a"), new Emoji("\ud83d\ude1d"), new Emoji("\ud83e\udd11"), new Emoji("\ud83e\udd17"), new Emoji("\ud83e\udd2d"), new Emoji("\ud83e\udd2b"), new Emoji("\ud83e\udd14"), new Emoji("\ud83e\udd10"), new Emoji("\ud83e\udd28"), new Emoji("\ud83d\ude10"), new Emoji("\ud83d\ude11"), new Emoji("\ud83d\ude36"), new Emoji("\ud83d\ude0f"), new Emoji("\ud83d\ude12"), new Emoji("\ud83d\ude44"), new Emoji("\ud83d\ude2c"), new Emoji("\ud83e\udd25"), new Emoji("\ud83d\ude0c"), new Emoji("\ud83d\ude14"), new Emoji("\ud83d\ude2a"), new Emoji("\ud83e\udd24"), new Emoji("\ud83d\ude34"), new Emoji("\ud83d\ude37"), new Emoji("\ud83e\udd12"), new Emoji("\ud83e\udd15"), new Emoji("\ud83e\udd22"), new Emoji("\ud83e\udd2e"), new Emoji("\ud83e\udd27"), new Emoji("\ud83e\udd75"), new Emoji("\ud83e\udd76"), new Emoji("\ud83e\udd74"), new Emoji("\ud83d\ude35"), new Emoji("\ud83e\udd2f"), new Emoji("\ud83e\udd20"), new Emoji("\ud83e\udd73"), new Emoji("\ud83d\ude0e"), new Emoji("\ud83e\udd13"), new Emoji("\ud83e\uddd0"), new Emoji("\ud83d\ude15"), new Emoji("\ud83d\ude1f"), new Emoji("\ud83d\ude41"), new Emoji("\u2639\ufe0f"), new Emoji("\ud83d\ude2e"), new Emoji("\ud83d\ude2f"), new Emoji("\ud83d\ude32"), new Emoji("\ud83d\ude33"), new Emoji("\ud83e\udd7a"), new Emoji("\ud83d\ude26"), new Emoji("\ud83d\ude27"), new Emoji("\ud83d\ude28"), new Emoji("\ud83d\ude30"), new Emoji("\ud83d\ude25"), new Emoji("\ud83d\ude22"), new Emoji("\ud83d\ude2d"), new Emoji("\ud83d\ude31"), new Emoji("\ud83d\ude16"), new Emoji("\ud83d\ude23"), new Emoji("\ud83d\ude1e"), new Emoji("\ud83d\ude13"), new Emoji("\ud83d\ude29"), new Emoji("\ud83d\ude2b"), new Emoji("\ud83e\udd71"), new Emoji("\ud83d\ude24"), new Emoji("\ud83d\ude21"), new Emoji("\ud83d\ude20"), new Emoji("\ud83e\udd2c"), new Emoji("\ud83d\ude08"), new Emoji("\ud83d\udc7f"), new Emoji("\ud83d\udc80"), new Emoji("\u2620\ufe0f"), new Emoji("\ud83d\udca9"), new Emoji("\ud83e\udd21"), new Emoji("\ud83d\udc79"), new Emoji("\ud83d\udc7a"), new Emoji("\ud83d\udc7b"), new Emoji("\ud83d\udc7d"), new Emoji("\ud83d\udc7e"), new Emoji("\ud83e\udd16"), new Emoji("\ud83d\ude3a"), new Emoji("\ud83d\ude38"), new Emoji("\ud83d\ude39"), new Emoji("\ud83d\ude3b"), new Emoji("\ud83d\ude3c"), new Emoji("\ud83d\ude3d"), new Emoji("\ud83d\ude40"), new Emoji("\ud83d\ude3f"), new Emoji("\ud83d\ude3e"), new Emoji("\ud83d\ude48"), new Emoji("\ud83d\ude49"), new Emoji("\ud83d\ude4a"), new Emoji("\ud83d\udc8b"), new Emoji("\ud83d\udc8c"), new Emoji("\ud83d\udc98"), new Emoji("\ud83d\udc9d"), new Emoji("\ud83d\udc96"), new Emoji("\ud83d\udc97"), new Emoji("\ud83d\udc93"), new Emoji("\ud83d\udc9e"), new Emoji("\ud83d\udc95"), new Emoji("\ud83d\udc9f"), new Emoji("\u2763\ufe0f"), new Emoji("\ud83d\udc94"), new Emoji("\u2764\ufe0f"), new Emoji("\ud83e\udde1"), new Emoji("\ud83d\udc9b"), new Emoji("\ud83d\udc9a"), new Emoji("\ud83d\udc99"), new Emoji("\ud83d\udc9c"), new Emoji("\ud83e\udd0e"), new Emoji("\ud83d\udda4"), new Emoji("\ud83e\udd0d"), new Emoji("\ud83d\udcaf"), new Emoji("\ud83d\udca2"), new Emoji("\ud83d\udca5"), new Emoji("\ud83d\udcab"), new Emoji("\ud83d\udca6"), new Emoji("\ud83d\udca8"), new Emoji("\ud83d\udd73\ufe0f"), new Emoji("\ud83d\udca3"), new Emoji("\ud83d\udcac"), new Emoji("\ud83d\udc41\ufe0f\u200d\ud83d\udde8\ufe0f"), new Emoji("\ud83d\udde8\ufe0f"), new Emoji("\ud83d\uddef\ufe0f"), new Emoji("\ud83d\udcad"), new Emoji("\ud83d\udca4"), new Emoji("\ud83d\udc4b", "\ud83d\udc4b\ud83c\udffb", "\ud83d\udc4b\ud83c\udffc", "\ud83d\udc4b\ud83c\udffd", "\ud83d\udc4b\ud83c\udffe", "\ud83d\udc4b\ud83c\udfff"), new Emoji("\ud83e\udd1a", "\ud83e\udd1a\ud83c\udffb", "\ud83e\udd1a\ud83c\udffc", "\ud83e\udd1a\ud83c\udffd", "\ud83e\udd1a\ud83c\udffe", "\ud83e\udd1a\ud83c\udfff"), new Emoji("\ud83d\udd90\ufe0f", "\ud83d\udd90\ud83c\udffb", "\ud83d\udd90\ud83c\udffc", "\ud83d\udd90\ud83c\udffd", "\ud83d\udd90\ud83c\udffe", "\ud83d\udd90\ud83c\udfff"), new Emoji("\u270b", "\u270b\ud83c\udffb", "\u270b\ud83c\udffc", "\u270b\ud83c\udffd", "\u270b\ud83c\udffe", "\u270b\ud83c\udfff"), new Emoji("\ud83d\udd96", "\ud83d\udd96\ud83c\udffb", "\ud83d\udd96\ud83c\udffc", "\ud83d\udd96\ud83c\udffd", "\ud83d\udd96\ud83c\udffe", "\ud83d\udd96\ud83c\udfff"), new Emoji("\ud83d\udc4c", "\ud83d\udc4c\ud83c\udffb", "\ud83d\udc4c\ud83c\udffc", "\ud83d\udc4c\ud83c\udffd", "\ud83d\udc4c\ud83c\udffe", "\ud83d\udc4c\ud83c\udfff"), new Emoji("\ud83e\udd0f", "\ud83e\udd0f\ud83c\udffb", "\ud83e\udd0f\ud83c\udffc", "\ud83e\udd0f\ud83c\udffd", "\ud83e\udd0f\ud83c\udffe", "\ud83e\udd0f\ud83c\udfff"), new Emoji("\u270c\ufe0f", "\u270c\ud83c\udffb", "\u270c\ud83c\udffc", "\u270c\ud83c\udffd", "\u270c\ud83c\udffe", "\u270c\ud83c\udfff"), new Emoji("\ud83e\udd1e", "\ud83e\udd1e\ud83c\udffb", "\ud83e\udd1e\ud83c\udffc", "\ud83e\udd1e\ud83c\udffd", "\ud83e\udd1e\ud83c\udffe", "\ud83e\udd1e\ud83c\udfff"), new Emoji("\ud83e\udd1f", "\ud83e\udd1f\ud83c\udffb", "\ud83e\udd1f\ud83c\udffc", "\ud83e\udd1f\ud83c\udffd", "\ud83e\udd1f\ud83c\udffe", "\ud83e\udd1f\ud83c\udfff"), new Emoji("\ud83e\udd18", "\ud83e\udd18\ud83c\udffb", "\ud83e\udd18\ud83c\udffc", "\ud83e\udd18\ud83c\udffd", "\ud83e\udd18\ud83c\udffe", "\ud83e\udd18\ud83c\udfff"), new Emoji("\ud83e\udd19", "\ud83e\udd19\ud83c\udffb", "\ud83e\udd19\ud83c\udffc", "\ud83e\udd19\ud83c\udffd", "\ud83e\udd19\ud83c\udffe", "\ud83e\udd19\ud83c\udfff"), new Emoji("\ud83d\udc48", "\ud83d\udc48\ud83c\udffb", "\ud83d\udc48\ud83c\udffc", "\ud83d\udc48\ud83c\udffd", "\ud83d\udc48\ud83c\udffe", "\ud83d\udc48\ud83c\udfff"), new Emoji("\ud83d\udc49", "\ud83d\udc49\ud83c\udffb", "\ud83d\udc49\ud83c\udffc", "\ud83d\udc49\ud83c\udffd", "\ud83d\udc49\ud83c\udffe", "\ud83d\udc49\ud83c\udfff"), new Emoji("\ud83d\udc46", "\ud83d\udc46\ud83c\udffb", "\ud83d\udc46\ud83c\udffc", "\ud83d\udc46\ud83c\udffd", "\ud83d\udc46\ud83c\udffe", "\ud83d\udc46\ud83c\udfff"), new Emoji("\ud83d\udd95", "\ud83d\udd95\ud83c\udffb", "\ud83d\udd95\ud83c\udffc", "\ud83d\udd95\ud83c\udffd", "\ud83d\udd95\ud83c\udffe", "\ud83d\udd95\ud83c\udfff"), new Emoji("\ud83d\udc47", "\ud83d\udc47\ud83c\udffb", "\ud83d\udc47\ud83c\udffc", "\ud83d\udc47\ud83c\udffd", "\ud83d\udc47\ud83c\udffe", "\ud83d\udc47\ud83c\udfff"),
+ }, "emoji/People_0.webp");
+
+ private static final EmojiPageModel PAGE_PEOPLE_1 = new StaticEmojiPageModel(R.attr.emoji_category_people, new Emoji[] {
+ new Emoji("\u261d\ufe0f", "\u261d\ud83c\udffb", "\u261d\ud83c\udffc", "\u261d\ud83c\udffd", "\u261d\ud83c\udffe", "\u261d\ud83c\udfff"), new Emoji("\ud83d\udc4d", "\ud83d\udc4d\ud83c\udffb", "\ud83d\udc4d\ud83c\udffc", "\ud83d\udc4d\ud83c\udffd", "\ud83d\udc4d\ud83c\udffe", "\ud83d\udc4d\ud83c\udfff"), new Emoji("\ud83d\udc4e", "\ud83d\udc4e\ud83c\udffb", "\ud83d\udc4e\ud83c\udffc", "\ud83d\udc4e\ud83c\udffd", "\ud83d\udc4e\ud83c\udffe", "\ud83d\udc4e\ud83c\udfff"), new Emoji("\u270a", "\u270a\ud83c\udffb", "\u270a\ud83c\udffc", "\u270a\ud83c\udffd", "\u270a\ud83c\udffe", "\u270a\ud83c\udfff"), new Emoji("\ud83d\udc4a", "\ud83d\udc4a\ud83c\udffb", "\ud83d\udc4a\ud83c\udffc", "\ud83d\udc4a\ud83c\udffd", "\ud83d\udc4a\ud83c\udffe", "\ud83d\udc4a\ud83c\udfff"), new Emoji("\ud83e\udd1b", "\ud83e\udd1b\ud83c\udffb", "\ud83e\udd1b\ud83c\udffc", "\ud83e\udd1b\ud83c\udffd", "\ud83e\udd1b\ud83c\udffe", "\ud83e\udd1b\ud83c\udfff"), new Emoji("\ud83e\udd1c", "\ud83e\udd1c\ud83c\udffb", "\ud83e\udd1c\ud83c\udffc", "\ud83e\udd1c\ud83c\udffd", "\ud83e\udd1c\ud83c\udffe", "\ud83e\udd1c\ud83c\udfff"), new Emoji("\ud83d\udc4f", "\ud83d\udc4f\ud83c\udffb", "\ud83d\udc4f\ud83c\udffc", "\ud83d\udc4f\ud83c\udffd", "\ud83d\udc4f\ud83c\udffe", "\ud83d\udc4f\ud83c\udfff"), new Emoji("\ud83d\ude4c", "\ud83d\ude4c\ud83c\udffb", "\ud83d\ude4c\ud83c\udffc", "\ud83d\ude4c\ud83c\udffd", "\ud83d\ude4c\ud83c\udffe", "\ud83d\ude4c\ud83c\udfff"), new Emoji("\ud83d\udc50", "\ud83d\udc50\ud83c\udffb", "\ud83d\udc50\ud83c\udffc", "\ud83d\udc50\ud83c\udffd", "\ud83d\udc50\ud83c\udffe", "\ud83d\udc50\ud83c\udfff"), new Emoji("\ud83e\udd32", "\ud83e\udd32\ud83c\udffb", "\ud83e\udd32\ud83c\udffc", "\ud83e\udd32\ud83c\udffd", "\ud83e\udd32\ud83c\udffe", "\ud83e\udd32\ud83c\udfff"), new Emoji("\ud83e\udd1d"), new Emoji("\ud83d\ude4f", "\ud83d\ude4f\ud83c\udffb", "\ud83d\ude4f\ud83c\udffc", "\ud83d\ude4f\ud83c\udffd", "\ud83d\ude4f\ud83c\udffe", "\ud83d\ude4f\ud83c\udfff"), new Emoji("\u270d\ufe0f", "\u270d\ud83c\udffb", "\u270d\ud83c\udffc", "\u270d\ud83c\udffd", "\u270d\ud83c\udffe", "\u270d\ud83c\udfff"), new Emoji("\ud83d\udc85", "\ud83d\udc85\ud83c\udffb", "\ud83d\udc85\ud83c\udffc", "\ud83d\udc85\ud83c\udffd", "\ud83d\udc85\ud83c\udffe", "\ud83d\udc85\ud83c\udfff"), new Emoji("\ud83e\udd33", "\ud83e\udd33\ud83c\udffb", "\ud83e\udd33\ud83c\udffc", "\ud83e\udd33\ud83c\udffd", "\ud83e\udd33\ud83c\udffe", "\ud83e\udd33\ud83c\udfff"), new Emoji("\ud83d\udcaa", "\ud83d\udcaa\ud83c\udffb", "\ud83d\udcaa\ud83c\udffc", "\ud83d\udcaa\ud83c\udffd", "\ud83d\udcaa\ud83c\udffe", "\ud83d\udcaa\ud83c\udfff"), new Emoji("\ud83e\uddbe"), new Emoji("\ud83e\uddbf"), new Emoji("\ud83e\uddb5", "\ud83e\uddb5\ud83c\udffb", "\ud83e\uddb5\ud83c\udffc", "\ud83e\uddb5\ud83c\udffd", "\ud83e\uddb5\ud83c\udffe", "\ud83e\uddb5\ud83c\udfff"), new Emoji("\ud83e\uddb6", "\ud83e\uddb6\ud83c\udffb", "\ud83e\uddb6\ud83c\udffc", "\ud83e\uddb6\ud83c\udffd", "\ud83e\uddb6\ud83c\udffe", "\ud83e\uddb6\ud83c\udfff"), new Emoji("\ud83d\udc42", "\ud83d\udc42\ud83c\udffb", "\ud83d\udc42\ud83c\udffc", "\ud83d\udc42\ud83c\udffd", "\ud83d\udc42\ud83c\udffe", "\ud83d\udc42\ud83c\udfff"), new Emoji("\ud83e\uddbb", "\ud83e\uddbb\ud83c\udffb", "\ud83e\uddbb\ud83c\udffc", "\ud83e\uddbb\ud83c\udffd", "\ud83e\uddbb\ud83c\udffe", "\ud83e\uddbb\ud83c\udfff"), new Emoji("\ud83d\udc43", "\ud83d\udc43\ud83c\udffb", "\ud83d\udc43\ud83c\udffc", "\ud83d\udc43\ud83c\udffd", "\ud83d\udc43\ud83c\udffe", "\ud83d\udc43\ud83c\udfff"), new Emoji("\ud83e\udde0"), new Emoji("\ud83e\uddb7"), new Emoji("\ud83e\uddb4"), new Emoji("\ud83d\udc40"), new Emoji("\ud83d\udc41\ufe0f"), new Emoji("\ud83d\udc45"), new Emoji("\ud83d\udc44"), new Emoji("\ud83d\udc76", "\ud83d\udc76\ud83c\udffb", "\ud83d\udc76\ud83c\udffc", "\ud83d\udc76\ud83c\udffd", "\ud83d\udc76\ud83c\udffe", "\ud83d\udc76\ud83c\udfff"), new Emoji("\ud83e\uddd2", "\ud83e\uddd2\ud83c\udffb", "\ud83e\uddd2\ud83c\udffc", "\ud83e\uddd2\ud83c\udffd", "\ud83e\uddd2\ud83c\udffe", "\ud83e\uddd2\ud83c\udfff"), new Emoji("\ud83d\udc66", "\ud83d\udc66\ud83c\udffb", "\ud83d\udc66\ud83c\udffc", "\ud83d\udc66\ud83c\udffd", "\ud83d\udc66\ud83c\udffe", "\ud83d\udc66\ud83c\udfff"), new Emoji("\ud83d\udc67", "\ud83d\udc67\ud83c\udffb", "\ud83d\udc67\ud83c\udffc", "\ud83d\udc67\ud83c\udffd", "\ud83d\udc67\ud83c\udffe", "\ud83d\udc67\ud83c\udfff"), new Emoji("\ud83e\uddd1", "\ud83e\uddd1\ud83c\udffb", "\ud83e\uddd1\ud83c\udffc", "\ud83e\uddd1\ud83c\udffd", "\ud83e\uddd1\ud83c\udffe", "\ud83e\uddd1\ud83c\udfff"), new Emoji("\ud83d\udc68", "\ud83d\udc68\ud83c\udffb", "\ud83d\udc68\ud83c\udffc", "\ud83d\udc68\ud83c\udffd", "\ud83d\udc68\ud83c\udffe", "\ud83d\udc68\ud83c\udfff"), new Emoji("\ud83e\uddd4", "\ud83e\uddd4\ud83c\udffb", "\ud83e\uddd4\ud83c\udffc", "\ud83e\uddd4\ud83c\udffd", "\ud83e\uddd4\ud83c\udffe", "\ud83e\uddd4\ud83c\udfff"), new Emoji("\ud83d\udc68\u200d\ud83e\uddb0", "\ud83d\udc68\ud83c\udffb\u200d\ud83e\uddb0", "\ud83d\udc68\ud83c\udffc\u200d\ud83e\uddb0", "\ud83d\udc68\ud83c\udffd\u200d\ud83e\uddb0", "\ud83d\udc68\ud83c\udffe\u200d\ud83e\uddb0", "\ud83d\udc68\ud83c\udfff\u200d\ud83e\uddb0"), new Emoji("\ud83d\udc68\u200d\ud83e\uddb1", "\ud83d\udc68\ud83c\udffb\u200d\ud83e\uddb1", "\ud83d\udc68\ud83c\udffc\u200d\ud83e\uddb1", "\ud83d\udc68\ud83c\udffd\u200d\ud83e\uddb1", "\ud83d\udc68\ud83c\udffe\u200d\ud83e\uddb1", "\ud83d\udc68\ud83c\udfff\u200d\ud83e\uddb1"), new Emoji("\ud83d\udc68\u200d\ud83e\uddb3", "\ud83d\udc68\ud83c\udffb\u200d\ud83e\uddb3", "\ud83d\udc68\ud83c\udffc\u200d\ud83e\uddb3", "\ud83d\udc68\ud83c\udffd\u200d\ud83e\uddb3", "\ud83d\udc68\ud83c\udffe\u200d\ud83e\uddb3", "\ud83d\udc68\ud83c\udfff\u200d\ud83e\uddb3"), new Emoji("\ud83d\udc68\u200d\ud83e\uddb2", "\ud83d\udc68\ud83c\udffb\u200d\ud83e\uddb2", "\ud83d\udc68\ud83c\udffc\u200d\ud83e\uddb2", "\ud83d\udc68\ud83c\udffd\u200d\ud83e\uddb2", "\ud83d\udc68\ud83c\udffe\u200d\ud83e\uddb2", "\ud83d\udc68\ud83c\udfff\u200d\ud83e\uddb2"), new Emoji("\ud83d\udc69", "\ud83d\udc69\ud83c\udffb", "\ud83d\udc69\ud83c\udffc", "\ud83d\udc69\ud83c\udffd", "\ud83d\udc69\ud83c\udffe", "\ud83d\udc69\ud83c\udfff"), new Emoji("\ud83d\udc69\u200d\ud83e\uddb0", "\ud83d\udc69\ud83c\udffb\u200d\ud83e\uddb0", "\ud83d\udc69\ud83c\udffc\u200d\ud83e\uddb0", "\ud83d\udc69\ud83c\udffd\u200d\ud83e\uddb0", "\ud83d\udc69\ud83c\udffe\u200d\ud83e\uddb0", "\ud83d\udc69\ud83c\udfff\u200d\ud83e\uddb0"), new Emoji("\ud83e\uddd1\u200d\ud83e\uddb0", "\ud83e\uddd1\ud83c\udffb\u200d\ud83e\uddb0", "\ud83e\uddd1\ud83c\udffc\u200d\ud83e\uddb0", "\ud83e\uddd1\ud83c\udffd\u200d\ud83e\uddb0", "\ud83e\uddd1\ud83c\udffe\u200d\ud83e\uddb0", "\ud83e\uddd1\ud83c\udfff\u200d\ud83e\uddb0"), new Emoji("\ud83d\udc69\u200d\ud83e\uddb1", "\ud83d\udc69\ud83c\udffb\u200d\ud83e\uddb1", "\ud83d\udc69\ud83c\udffc\u200d\ud83e\uddb1", "\ud83d\udc69\ud83c\udffd\u200d\ud83e\uddb1", "\ud83d\udc69\ud83c\udffe\u200d\ud83e\uddb1", "\ud83d\udc69\ud83c\udfff\u200d\ud83e\uddb1"), new Emoji("\ud83e\uddd1\u200d\ud83e\uddb1", "\ud83e\uddd1\ud83c\udffb\u200d\ud83e\uddb1", "\ud83e\uddd1\ud83c\udffc\u200d\ud83e\uddb1", "\ud83e\uddd1\ud83c\udffd\u200d\ud83e\uddb1", "\ud83e\uddd1\ud83c\udffe\u200d\ud83e\uddb1", "\ud83e\uddd1\ud83c\udfff\u200d\ud83e\uddb1"), new Emoji("\ud83d\udc69\u200d\ud83e\uddb3", "\ud83d\udc69\ud83c\udffb\u200d\ud83e\uddb3", "\ud83d\udc69\ud83c\udffc\u200d\ud83e\uddb3", "\ud83d\udc69\ud83c\udffd\u200d\ud83e\uddb3", "\ud83d\udc69\ud83c\udffe\u200d\ud83e\uddb3", "\ud83d\udc69\ud83c\udfff\u200d\ud83e\uddb3"), new Emoji("\ud83e\uddd1\u200d\ud83e\uddb3", "\ud83e\uddd1\ud83c\udffb\u200d\ud83e\uddb3", "\ud83e\uddd1\ud83c\udffc\u200d\ud83e\uddb3", "\ud83e\uddd1\ud83c\udffd\u200d\ud83e\uddb3", "\ud83e\uddd1\ud83c\udffe\u200d\ud83e\uddb3", "\ud83e\uddd1\ud83c\udfff\u200d\ud83e\uddb3"), new Emoji("\ud83d\udc69\u200d\ud83e\uddb2", "\ud83d\udc69\ud83c\udffb\u200d\ud83e\uddb2", "\ud83d\udc69\ud83c\udffc\u200d\ud83e\uddb2", "\ud83d\udc69\ud83c\udffd\u200d\ud83e\uddb2", "\ud83d\udc69\ud83c\udffe\u200d\ud83e\uddb2", "\ud83d\udc69\ud83c\udfff\u200d\ud83e\uddb2"), new Emoji("\ud83e\uddd1\u200d\ud83e\uddb2", "\ud83e\uddd1\ud83c\udffb\u200d\ud83e\uddb2", "\ud83e\uddd1\ud83c\udffc\u200d\ud83e\uddb2", "\ud83e\uddd1\ud83c\udffd\u200d\ud83e\uddb2", "\ud83e\uddd1\ud83c\udffe\u200d\ud83e\uddb2", "\ud83e\uddd1\ud83c\udfff\u200d\ud83e\uddb2"),
+ }, "emoji/People_1.webp");
+
+ private static final EmojiPageModel PAGE_PEOPLE_2 = new StaticEmojiPageModel(R.attr.emoji_category_people, new Emoji[] {
+ new Emoji("\ud83d\udc71\u200d\u2640\ufe0f", "\ud83d\udc71\ud83c\udffb\u200d\u2640\ufe0f", "\ud83d\udc71\ud83c\udffc\u200d\u2640\ufe0f", "\ud83d\udc71\ud83c\udffd\u200d\u2640\ufe0f", "\ud83d\udc71\ud83c\udffe\u200d\u2640\ufe0f", "\ud83d\udc71\ud83c\udfff\u200d\u2640\ufe0f"), new Emoji("\ud83d\udc71\u200d\u2642\ufe0f", "\ud83d\udc71\ud83c\udffb\u200d\u2642\ufe0f", "\ud83d\udc71\ud83c\udffc\u200d\u2642\ufe0f", "\ud83d\udc71\ud83c\udffd\u200d\u2642\ufe0f", "\ud83d\udc71\ud83c\udffe\u200d\u2642\ufe0f", "\ud83d\udc71\ud83c\udfff\u200d\u2642\ufe0f"), new Emoji("\ud83e\uddd3", "\ud83e\uddd3\ud83c\udffb", "\ud83e\uddd3\ud83c\udffc", "\ud83e\uddd3\ud83c\udffd", "\ud83e\uddd3\ud83c\udffe", "\ud83e\uddd3\ud83c\udfff"), new Emoji("\ud83d\udc74", "\ud83d\udc74\ud83c\udffb", "\ud83d\udc74\ud83c\udffc", "\ud83d\udc74\ud83c\udffd", "\ud83d\udc74\ud83c\udffe", "\ud83d\udc74\ud83c\udfff"), new Emoji("\ud83d\udc75", "\ud83d\udc75\ud83c\udffb", "\ud83d\udc75\ud83c\udffc", "\ud83d\udc75\ud83c\udffd", "\ud83d\udc75\ud83c\udffe", "\ud83d\udc75\ud83c\udfff"), new Emoji("\ud83d\ude4d\u200d\u2642\ufe0f", "\ud83d\ude4d\ud83c\udffb\u200d\u2642\ufe0f", "\ud83d\ude4d\ud83c\udffc\u200d\u2642\ufe0f", "\ud83d\ude4d\ud83c\udffd\u200d\u2642\ufe0f", "\ud83d\ude4d\ud83c\udffe\u200d\u2642\ufe0f", "\ud83d\ude4d\ud83c\udfff\u200d\u2642\ufe0f"), new Emoji("\ud83d\ude4d\u200d\u2640\ufe0f", "\ud83d\ude4d\ud83c\udffb\u200d\u2640\ufe0f", "\ud83d\ude4d\ud83c\udffc\u200d\u2640\ufe0f", "\ud83d\ude4d\ud83c\udffd\u200d\u2640\ufe0f", "\ud83d\ude4d\ud83c\udffe\u200d\u2640\ufe0f", "\ud83d\ude4d\ud83c\udfff\u200d\u2640\ufe0f"), new Emoji("\ud83d\ude4e\u200d\u2642\ufe0f", "\ud83d\ude4e\ud83c\udffb\u200d\u2642\ufe0f", "\ud83d\ude4e\ud83c\udffc\u200d\u2642\ufe0f", "\ud83d\ude4e\ud83c\udffd\u200d\u2642\ufe0f", "\ud83d\ude4e\ud83c\udffe\u200d\u2642\ufe0f", "\ud83d\ude4e\ud83c\udfff\u200d\u2642\ufe0f"), new Emoji("\ud83d\ude4e\u200d\u2640\ufe0f", "\ud83d\ude4e\ud83c\udffb\u200d\u2640\ufe0f", "\ud83d\ude4e\ud83c\udffc\u200d\u2640\ufe0f", "\ud83d\ude4e\ud83c\udffd\u200d\u2640\ufe0f", "\ud83d\ude4e\ud83c\udffe\u200d\u2640\ufe0f", "\ud83d\ude4e\ud83c\udfff\u200d\u2640\ufe0f"), new Emoji("\ud83d\ude45\u200d\u2642\ufe0f", "\ud83d\ude45\ud83c\udffb\u200d\u2642\ufe0f", "\ud83d\ude45\ud83c\udffc\u200d\u2642\ufe0f", "\ud83d\ude45\ud83c\udffd\u200d\u2642\ufe0f", "\ud83d\ude45\ud83c\udffe\u200d\u2642\ufe0f", "\ud83d\ude45\ud83c\udfff\u200d\u2642\ufe0f"), new Emoji("\ud83d\ude45\u200d\u2640\ufe0f", "\ud83d\ude45\ud83c\udffb\u200d\u2640\ufe0f", "\ud83d\ude45\ud83c\udffc\u200d\u2640\ufe0f", "\ud83d\ude45\ud83c\udffd\u200d\u2640\ufe0f", "\ud83d\ude45\ud83c\udffe\u200d\u2640\ufe0f", "\ud83d\ude45\ud83c\udfff\u200d\u2640\ufe0f"), new Emoji("\ud83d\ude46\u200d\u2642\ufe0f", "\ud83d\ude46\ud83c\udffb\u200d\u2642\ufe0f", "\ud83d\ude46\ud83c\udffc\u200d\u2642\ufe0f", "\ud83d\ude46\ud83c\udffd\u200d\u2642\ufe0f", "\ud83d\ude46\ud83c\udffe\u200d\u2642\ufe0f", "\ud83d\ude46\ud83c\udfff\u200d\u2642\ufe0f"), new Emoji("\ud83d\ude46\u200d\u2640\ufe0f", "\ud83d\ude46\ud83c\udffb\u200d\u2640\ufe0f", "\ud83d\ude46\ud83c\udffc\u200d\u2640\ufe0f", "\ud83d\ude46\ud83c\udffd\u200d\u2640\ufe0f", "\ud83d\ude46\ud83c\udffe\u200d\u2640\ufe0f", "\ud83d\ude46\ud83c\udfff\u200d\u2640\ufe0f"), new Emoji("\ud83d\udc81\u200d\u2642\ufe0f", "\ud83d\udc81\ud83c\udffb\u200d\u2642\ufe0f", "\ud83d\udc81\ud83c\udffc\u200d\u2642\ufe0f", "\ud83d\udc81\ud83c\udffd\u200d\u2642\ufe0f", "\ud83d\udc81\ud83c\udffe\u200d\u2642\ufe0f", "\ud83d\udc81\ud83c\udfff\u200d\u2642\ufe0f"), new Emoji("\ud83d\udc81\u200d\u2640\ufe0f", "\ud83d\udc81\ud83c\udffb\u200d\u2640\ufe0f", "\ud83d\udc81\ud83c\udffc\u200d\u2640\ufe0f", "\ud83d\udc81\ud83c\udffd\u200d\u2640\ufe0f", "\ud83d\udc81\ud83c\udffe\u200d\u2640\ufe0f", "\ud83d\udc81\ud83c\udfff\u200d\u2640\ufe0f"), new Emoji("\ud83d\ude4b\u200d\u2642\ufe0f", "\ud83d\ude4b\ud83c\udffb\u200d\u2642\ufe0f", "\ud83d\ude4b\ud83c\udffc\u200d\u2642\ufe0f", "\ud83d\ude4b\ud83c\udffd\u200d\u2642\ufe0f", "\ud83d\ude4b\ud83c\udffe\u200d\u2642\ufe0f", "\ud83d\ude4b\ud83c\udfff\u200d\u2642\ufe0f"), new Emoji("\ud83d\ude4b\u200d\u2640\ufe0f", "\ud83d\ude4b\ud83c\udffb\u200d\u2640\ufe0f", "\ud83d\ude4b\ud83c\udffc\u200d\u2640\ufe0f", "\ud83d\ude4b\ud83c\udffd\u200d\u2640\ufe0f", "\ud83d\ude4b\ud83c\udffe\u200d\u2640\ufe0f", "\ud83d\ude4b\ud83c\udfff\u200d\u2640\ufe0f"), new Emoji("\ud83e\uddcf", "\ud83e\uddcf\ud83c\udffb", "\ud83e\uddcf\ud83c\udffc", "\ud83e\uddcf\ud83c\udffd", "\ud83e\uddcf\ud83c\udffe", "\ud83e\uddcf\ud83c\udfff"), new Emoji("\ud83e\uddcf\u200d\u2642\ufe0f", "\ud83e\uddcf\ud83c\udffb\u200d\u2642\ufe0f", "\ud83e\uddcf\ud83c\udffc\u200d\u2642\ufe0f", "\ud83e\uddcf\ud83c\udffd\u200d\u2642\ufe0f", "\ud83e\uddcf\ud83c\udffe\u200d\u2642\ufe0f", "\ud83e\uddcf\ud83c\udfff\u200d\u2642\ufe0f"), new Emoji("\ud83e\uddcf\u200d\u2640\ufe0f", "\ud83e\uddcf\ud83c\udffb\u200d\u2640\ufe0f", "\ud83e\uddcf\ud83c\udffc\u200d\u2640\ufe0f", "\ud83e\uddcf\ud83c\udffd\u200d\u2640\ufe0f", "\ud83e\uddcf\ud83c\udffe\u200d\u2640\ufe0f", "\ud83e\uddcf\ud83c\udfff\u200d\u2640\ufe0f"), new Emoji("\ud83d\ude47\u200d\u2642\ufe0f", "\ud83d\ude47\ud83c\udffb\u200d\u2642\ufe0f", "\ud83d\ude47\ud83c\udffc\u200d\u2642\ufe0f", "\ud83d\ude47\ud83c\udffd\u200d\u2642\ufe0f", "\ud83d\ude47\ud83c\udffe\u200d\u2642\ufe0f", "\ud83d\ude47\ud83c\udfff\u200d\u2642\ufe0f"), new Emoji("\ud83d\ude47\u200d\u2640\ufe0f", "\ud83d\ude47\ud83c\udffb\u200d\u2640\ufe0f", "\ud83d\ude47\ud83c\udffc\u200d\u2640\ufe0f", "\ud83d\ude47\ud83c\udffd\u200d\u2640\ufe0f", "\ud83d\ude47\ud83c\udffe\u200d\u2640\ufe0f", "\ud83d\ude47\ud83c\udfff\u200d\u2640\ufe0f"), new Emoji("\ud83e\udd26", "\ud83e\udd26\ud83c\udffb", "\ud83e\udd26\ud83c\udffc", "\ud83e\udd26\ud83c\udffd", "\ud83e\udd26\ud83c\udffe", "\ud83e\udd26\ud83c\udfff"), new Emoji("\ud83e\udd26\u200d\u2642\ufe0f", "\ud83e\udd26\ud83c\udffb\u200d\u2642\ufe0f", "\ud83e\udd26\ud83c\udffc\u200d\u2642\ufe0f", "\ud83e\udd26\ud83c\udffd\u200d\u2642\ufe0f", "\ud83e\udd26\ud83c\udffe\u200d\u2642\ufe0f", "\ud83e\udd26\ud83c\udfff\u200d\u2642\ufe0f"), new Emoji("\ud83e\udd26\u200d\u2640\ufe0f", "\ud83e\udd26\ud83c\udffb\u200d\u2640\ufe0f", "\ud83e\udd26\ud83c\udffc\u200d\u2640\ufe0f", "\ud83e\udd26\ud83c\udffd\u200d\u2640\ufe0f", "\ud83e\udd26\ud83c\udffe\u200d\u2640\ufe0f", "\ud83e\udd26\ud83c\udfff\u200d\u2640\ufe0f"), new Emoji("\ud83e\udd37", "\ud83e\udd37\ud83c\udffb", "\ud83e\udd37\ud83c\udffc", "\ud83e\udd37\ud83c\udffd", "\ud83e\udd37\ud83c\udffe", "\ud83e\udd37\ud83c\udfff"), new Emoji("\ud83e\udd37\u200d\u2642\ufe0f", "\ud83e\udd37\ud83c\udffb\u200d\u2642\ufe0f", "\ud83e\udd37\ud83c\udffc\u200d\u2642\ufe0f", "\ud83e\udd37\ud83c\udffd\u200d\u2642\ufe0f", "\ud83e\udd37\ud83c\udffe\u200d\u2642\ufe0f", "\ud83e\udd37\ud83c\udfff\u200d\u2642\ufe0f"), new Emoji("\ud83e\udd37\u200d\u2640\ufe0f", "\ud83e\udd37\ud83c\udffb\u200d\u2640\ufe0f", "\ud83e\udd37\ud83c\udffc\u200d\u2640\ufe0f", "\ud83e\udd37\ud83c\udffd\u200d\u2640\ufe0f", "\ud83e\udd37\ud83c\udffe\u200d\u2640\ufe0f", "\ud83e\udd37\ud83c\udfff\u200d\u2640\ufe0f"), new Emoji("\ud83e\uddd1\u200d\u2695\ufe0f", "\ud83e\uddd1\ud83c\udffb\u200d\u2695\ufe0f", "\ud83e\uddd1\ud83c\udffc\u200d\u2695\ufe0f", "\ud83e\uddd1\ud83c\udffd\u200d\u2695\ufe0f", "\ud83e\uddd1\ud83c\udffe\u200d\u2695\ufe0f", "\ud83e\uddd1\ud83c\udfff\u200d\u2695\ufe0f"), new Emoji("\ud83d\udc68\u200d\u2695\ufe0f", "\ud83d\udc68\ud83c\udffb\u200d\u2695\ufe0f", "\ud83d\udc68\ud83c\udffc\u200d\u2695\ufe0f", "\ud83d\udc68\ud83c\udffd\u200d\u2695\ufe0f", "\ud83d\udc68\ud83c\udffe\u200d\u2695\ufe0f", "\ud83d\udc68\ud83c\udfff\u200d\u2695\ufe0f"), new Emoji("\ud83d\udc69\u200d\u2695\ufe0f", "\ud83d\udc69\ud83c\udffb\u200d\u2695\ufe0f", "\ud83d\udc69\ud83c\udffc\u200d\u2695\ufe0f", "\ud83d\udc69\ud83c\udffd\u200d\u2695\ufe0f", "\ud83d\udc69\ud83c\udffe\u200d\u2695\ufe0f", "\ud83d\udc69\ud83c\udfff\u200d\u2695\ufe0f"), new Emoji("\ud83e\uddd1\u200d\ud83c\udf93", "\ud83e\uddd1\ud83c\udffb\u200d\ud83c\udf93", "\ud83e\uddd1\ud83c\udffc\u200d\ud83c\udf93", "\ud83e\uddd1\ud83c\udffd\u200d\ud83c\udf93", "\ud83e\uddd1\ud83c\udffe\u200d\ud83c\udf93", "\ud83e\uddd1\ud83c\udfff\u200d\ud83c\udf93"), new Emoji("\ud83d\udc68\u200d\ud83c\udf93", "\ud83d\udc68\ud83c\udffb\u200d\ud83c\udf93", "\ud83d\udc68\ud83c\udffc\u200d\ud83c\udf93", "\ud83d\udc68\ud83c\udffd\u200d\ud83c\udf93", "\ud83d\udc68\ud83c\udffe\u200d\ud83c\udf93", "\ud83d\udc68\ud83c\udfff\u200d\ud83c\udf93"), new Emoji("\ud83d\udc69\u200d\ud83c\udf93", "\ud83d\udc69\ud83c\udffb\u200d\ud83c\udf93", "\ud83d\udc69\ud83c\udffc\u200d\ud83c\udf93", "\ud83d\udc69\ud83c\udffd\u200d\ud83c\udf93", "\ud83d\udc69\ud83c\udffe\u200d\ud83c\udf93", "\ud83d\udc69\ud83c\udfff\u200d\ud83c\udf93"), new Emoji("\ud83e\uddd1\u200d\ud83c\udfeb", "\ud83e\uddd1\ud83c\udffb\u200d\ud83c\udfeb", "\ud83e\uddd1\ud83c\udffc\u200d\ud83c\udfeb", "\ud83e\uddd1\ud83c\udffd\u200d\ud83c\udfeb", "\ud83e\uddd1\ud83c\udffe\u200d\ud83c\udfeb", "\ud83e\uddd1\ud83c\udfff\u200d\ud83c\udfeb"), new Emoji("\ud83d\udc68\u200d\ud83c\udfeb", "\ud83d\udc68\ud83c\udffb\u200d\ud83c\udfeb", "\ud83d\udc68\ud83c\udffc\u200d\ud83c\udfeb", "\ud83d\udc68\ud83c\udffd\u200d\ud83c\udfeb", "\ud83d\udc68\ud83c\udffe\u200d\ud83c\udfeb", "\ud83d\udc68\ud83c\udfff\u200d\ud83c\udfeb"), new Emoji("\ud83d\udc69\u200d\ud83c\udfeb", "\ud83d\udc69\ud83c\udffb\u200d\ud83c\udfeb", "\ud83d\udc69\ud83c\udffc\u200d\ud83c\udfeb", "\ud83d\udc69\ud83c\udffd\u200d\ud83c\udfeb", "\ud83d\udc69\ud83c\udffe\u200d\ud83c\udfeb", "\ud83d\udc69\ud83c\udfff\u200d\ud83c\udfeb"), new Emoji("\ud83e\uddd1\u200d\u2696\ufe0f", "\ud83e\uddd1\ud83c\udffb\u200d\u2696\ufe0f", "\ud83e\uddd1\ud83c\udffc\u200d\u2696\ufe0f", "\ud83e\uddd1\ud83c\udffd\u200d\u2696\ufe0f", "\ud83e\uddd1\ud83c\udffe\u200d\u2696\ufe0f", "\ud83e\uddd1\ud83c\udfff\u200d\u2696\ufe0f"), new Emoji("\ud83d\udc68\u200d\u2696\ufe0f", "\ud83d\udc68\ud83c\udffb\u200d\u2696\ufe0f", "\ud83d\udc68\ud83c\udffc\u200d\u2696\ufe0f", "\ud83d\udc68\ud83c\udffd\u200d\u2696\ufe0f", "\ud83d\udc68\ud83c\udffe\u200d\u2696\ufe0f", "\ud83d\udc68\ud83c\udfff\u200d\u2696\ufe0f"), new Emoji("\ud83d\udc69\u200d\u2696\ufe0f", "\ud83d\udc69\ud83c\udffb\u200d\u2696\ufe0f", "\ud83d\udc69\ud83c\udffc\u200d\u2696\ufe0f", "\ud83d\udc69\ud83c\udffd\u200d\u2696\ufe0f", "\ud83d\udc69\ud83c\udffe\u200d\u2696\ufe0f", "\ud83d\udc69\ud83c\udfff\u200d\u2696\ufe0f"), new Emoji("\ud83e\uddd1\u200d\ud83c\udf3e", "\ud83e\uddd1\ud83c\udffb\u200d\ud83c\udf3e", "\ud83e\uddd1\ud83c\udffc\u200d\ud83c\udf3e", "\ud83e\uddd1\ud83c\udffd\u200d\ud83c\udf3e", "\ud83e\uddd1\ud83c\udffe\u200d\ud83c\udf3e", "\ud83e\uddd1\ud83c\udfff\u200d\ud83c\udf3e"), new Emoji("\ud83d\udc68\u200d\ud83c\udf3e", "\ud83d\udc68\ud83c\udffb\u200d\ud83c\udf3e", "\ud83d\udc68\ud83c\udffc\u200d\ud83c\udf3e", "\ud83d\udc68\ud83c\udffd\u200d\ud83c\udf3e", "\ud83d\udc68\ud83c\udffe\u200d\ud83c\udf3e", "\ud83d\udc68\ud83c\udfff\u200d\ud83c\udf3e"),
+ }, "emoji/People_2.webp");
+
+ private static final EmojiPageModel PAGE_PEOPLE_3 = new StaticEmojiPageModel(R.attr.emoji_category_people, new Emoji[] {
+ new Emoji("\ud83d\udc69\u200d\ud83c\udf3e", "\ud83d\udc69\ud83c\udffb\u200d\ud83c\udf3e", "\ud83d\udc69\ud83c\udffc\u200d\ud83c\udf3e", "\ud83d\udc69\ud83c\udffd\u200d\ud83c\udf3e", "\ud83d\udc69\ud83c\udffe\u200d\ud83c\udf3e", "\ud83d\udc69\ud83c\udfff\u200d\ud83c\udf3e"), new Emoji("\ud83e\uddd1\u200d\ud83c\udf73", "\ud83e\uddd1\ud83c\udffb\u200d\ud83c\udf73", "\ud83e\uddd1\ud83c\udffc\u200d\ud83c\udf73", "\ud83e\uddd1\ud83c\udffd\u200d\ud83c\udf73", "\ud83e\uddd1\ud83c\udffe\u200d\ud83c\udf73", "\ud83e\uddd1\ud83c\udfff\u200d\ud83c\udf73"), new Emoji("\ud83d\udc68\u200d\ud83c\udf73", "\ud83d\udc68\ud83c\udffb\u200d\ud83c\udf73", "\ud83d\udc68\ud83c\udffc\u200d\ud83c\udf73", "\ud83d\udc68\ud83c\udffd\u200d\ud83c\udf73", "\ud83d\udc68\ud83c\udffe\u200d\ud83c\udf73", "\ud83d\udc68\ud83c\udfff\u200d\ud83c\udf73"), new Emoji("\ud83d\udc69\u200d\ud83c\udf73", "\ud83d\udc69\ud83c\udffb\u200d\ud83c\udf73", "\ud83d\udc69\ud83c\udffc\u200d\ud83c\udf73", "\ud83d\udc69\ud83c\udffd\u200d\ud83c\udf73", "\ud83d\udc69\ud83c\udffe\u200d\ud83c\udf73", "\ud83d\udc69\ud83c\udfff\u200d\ud83c\udf73"), new Emoji("\ud83e\uddd1\u200d\ud83d\udd27", "\ud83e\uddd1\ud83c\udffb\u200d\ud83d\udd27", "\ud83e\uddd1\ud83c\udffc\u200d\ud83d\udd27", "\ud83e\uddd1\ud83c\udffd\u200d\ud83d\udd27", "\ud83e\uddd1\ud83c\udffe\u200d\ud83d\udd27", "\ud83e\uddd1\ud83c\udfff\u200d\ud83d\udd27"), new Emoji("\ud83d\udc68\u200d\ud83d\udd27", "\ud83d\udc68\ud83c\udffb\u200d\ud83d\udd27", "\ud83d\udc68\ud83c\udffc\u200d\ud83d\udd27", "\ud83d\udc68\ud83c\udffd\u200d\ud83d\udd27", "\ud83d\udc68\ud83c\udffe\u200d\ud83d\udd27", "\ud83d\udc68\ud83c\udfff\u200d\ud83d\udd27"), new Emoji("\ud83d\udc69\u200d\ud83d\udd27", "\ud83d\udc69\ud83c\udffb\u200d\ud83d\udd27", "\ud83d\udc69\ud83c\udffc\u200d\ud83d\udd27", "\ud83d\udc69\ud83c\udffd\u200d\ud83d\udd27", "\ud83d\udc69\ud83c\udffe\u200d\ud83d\udd27", "\ud83d\udc69\ud83c\udfff\u200d\ud83d\udd27"), new Emoji("\ud83e\uddd1\u200d\ud83c\udfed", "\ud83e\uddd1\ud83c\udffb\u200d\ud83c\udfed", "\ud83e\uddd1\ud83c\udffc\u200d\ud83c\udfed", "\ud83e\uddd1\ud83c\udffd\u200d\ud83c\udfed", "\ud83e\uddd1\ud83c\udffe\u200d\ud83c\udfed", "\ud83e\uddd1\ud83c\udfff\u200d\ud83c\udfed"), new Emoji("\ud83d\udc68\u200d\ud83c\udfed", "\ud83d\udc68\ud83c\udffb\u200d\ud83c\udfed", "\ud83d\udc68\ud83c\udffc\u200d\ud83c\udfed", "\ud83d\udc68\ud83c\udffd\u200d\ud83c\udfed", "\ud83d\udc68\ud83c\udffe\u200d\ud83c\udfed", "\ud83d\udc68\ud83c\udfff\u200d\ud83c\udfed"), new Emoji("\ud83d\udc69\u200d\ud83c\udfed", "\ud83d\udc69\ud83c\udffb\u200d\ud83c\udfed", "\ud83d\udc69\ud83c\udffc\u200d\ud83c\udfed", "\ud83d\udc69\ud83c\udffd\u200d\ud83c\udfed", "\ud83d\udc69\ud83c\udffe\u200d\ud83c\udfed", "\ud83d\udc69\ud83c\udfff\u200d\ud83c\udfed"), new Emoji("\ud83e\uddd1\u200d\ud83d\udcbc", "\ud83e\uddd1\ud83c\udffb\u200d\ud83d\udcbc", "\ud83e\uddd1\ud83c\udffc\u200d\ud83d\udcbc", "\ud83e\uddd1\ud83c\udffd\u200d\ud83d\udcbc", "\ud83e\uddd1\ud83c\udffe\u200d\ud83d\udcbc", "\ud83e\uddd1\ud83c\udfff\u200d\ud83d\udcbc"), new Emoji("\ud83d\udc68\u200d\ud83d\udcbc", "\ud83d\udc68\ud83c\udffb\u200d\ud83d\udcbc", "\ud83d\udc68\ud83c\udffc\u200d\ud83d\udcbc", "\ud83d\udc68\ud83c\udffd\u200d\ud83d\udcbc", "\ud83d\udc68\ud83c\udffe\u200d\ud83d\udcbc", "\ud83d\udc68\ud83c\udfff\u200d\ud83d\udcbc"), new Emoji("\ud83d\udc69\u200d\ud83d\udcbc", "\ud83d\udc69\ud83c\udffb\u200d\ud83d\udcbc", "\ud83d\udc69\ud83c\udffc\u200d\ud83d\udcbc", "\ud83d\udc69\ud83c\udffd\u200d\ud83d\udcbc", "\ud83d\udc69\ud83c\udffe\u200d\ud83d\udcbc", "\ud83d\udc69\ud83c\udfff\u200d\ud83d\udcbc"), new Emoji("\ud83e\uddd1\u200d\ud83d\udd2c", "\ud83e\uddd1\ud83c\udffb\u200d\ud83d\udd2c", "\ud83e\uddd1\ud83c\udffc\u200d\ud83d\udd2c", "\ud83e\uddd1\ud83c\udffd\u200d\ud83d\udd2c", "\ud83e\uddd1\ud83c\udffe\u200d\ud83d\udd2c", "\ud83e\uddd1\ud83c\udfff\u200d\ud83d\udd2c"), new Emoji("\ud83d\udc68\u200d\ud83d\udd2c", "\ud83d\udc68\ud83c\udffb\u200d\ud83d\udd2c", "\ud83d\udc68\ud83c\udffc\u200d\ud83d\udd2c", "\ud83d\udc68\ud83c\udffd\u200d\ud83d\udd2c", "\ud83d\udc68\ud83c\udffe\u200d\ud83d\udd2c", "\ud83d\udc68\ud83c\udfff\u200d\ud83d\udd2c"), new Emoji("\ud83d\udc69\u200d\ud83d\udd2c", "\ud83d\udc69\ud83c\udffb\u200d\ud83d\udd2c", "\ud83d\udc69\ud83c\udffc\u200d\ud83d\udd2c", "\ud83d\udc69\ud83c\udffd\u200d\ud83d\udd2c", "\ud83d\udc69\ud83c\udffe\u200d\ud83d\udd2c", "\ud83d\udc69\ud83c\udfff\u200d\ud83d\udd2c"), new Emoji("\ud83e\uddd1\u200d\ud83d\udcbb", "\ud83e\uddd1\ud83c\udffb\u200d\ud83d\udcbb", "\ud83e\uddd1\ud83c\udffc\u200d\ud83d\udcbb", "\ud83e\uddd1\ud83c\udffd\u200d\ud83d\udcbb", "\ud83e\uddd1\ud83c\udffe\u200d\ud83d\udcbb", "\ud83e\uddd1\ud83c\udfff\u200d\ud83d\udcbb"), new Emoji("\ud83d\udc68\u200d\ud83d\udcbb", "\ud83d\udc68\ud83c\udffb\u200d\ud83d\udcbb", "\ud83d\udc68\ud83c\udffc\u200d\ud83d\udcbb", "\ud83d\udc68\ud83c\udffd\u200d\ud83d\udcbb", "\ud83d\udc68\ud83c\udffe\u200d\ud83d\udcbb", "\ud83d\udc68\ud83c\udfff\u200d\ud83d\udcbb"), new Emoji("\ud83d\udc69\u200d\ud83d\udcbb", "\ud83d\udc69\ud83c\udffb\u200d\ud83d\udcbb", "\ud83d\udc69\ud83c\udffc\u200d\ud83d\udcbb", "\ud83d\udc69\ud83c\udffd\u200d\ud83d\udcbb", "\ud83d\udc69\ud83c\udffe\u200d\ud83d\udcbb", "\ud83d\udc69\ud83c\udfff\u200d\ud83d\udcbb"), new Emoji("\ud83e\uddd1\u200d\ud83c\udfa4", "\ud83e\uddd1\ud83c\udffb\u200d\ud83c\udfa4", "\ud83e\uddd1\ud83c\udffc\u200d\ud83c\udfa4", "\ud83e\uddd1\ud83c\udffd\u200d\ud83c\udfa4", "\ud83e\uddd1\ud83c\udffe\u200d\ud83c\udfa4", "\ud83e\uddd1\ud83c\udfff\u200d\ud83c\udfa4"), new Emoji("\ud83d\udc68\u200d\ud83c\udfa4", "\ud83d\udc68\ud83c\udffb\u200d\ud83c\udfa4", "\ud83d\udc68\ud83c\udffc\u200d\ud83c\udfa4", "\ud83d\udc68\ud83c\udffd\u200d\ud83c\udfa4", "\ud83d\udc68\ud83c\udffe\u200d\ud83c\udfa4", "\ud83d\udc68\ud83c\udfff\u200d\ud83c\udfa4"), new Emoji("\ud83d\udc69\u200d\ud83c\udfa4", "\ud83d\udc69\ud83c\udffb\u200d\ud83c\udfa4", "\ud83d\udc69\ud83c\udffc\u200d\ud83c\udfa4", "\ud83d\udc69\ud83c\udffd\u200d\ud83c\udfa4", "\ud83d\udc69\ud83c\udffe\u200d\ud83c\udfa4", "\ud83d\udc69\ud83c\udfff\u200d\ud83c\udfa4"), new Emoji("\ud83e\uddd1\u200d\ud83c\udfa8", "\ud83e\uddd1\ud83c\udffb\u200d\ud83c\udfa8", "\ud83e\uddd1\ud83c\udffc\u200d\ud83c\udfa8", "\ud83e\uddd1\ud83c\udffd\u200d\ud83c\udfa8", "\ud83e\uddd1\ud83c\udffe\u200d\ud83c\udfa8", "\ud83e\uddd1\ud83c\udfff\u200d\ud83c\udfa8"), new Emoji("\ud83d\udc68\u200d\ud83c\udfa8", "\ud83d\udc68\ud83c\udffb\u200d\ud83c\udfa8", "\ud83d\udc68\ud83c\udffc\u200d\ud83c\udfa8", "\ud83d\udc68\ud83c\udffd\u200d\ud83c\udfa8", "\ud83d\udc68\ud83c\udffe\u200d\ud83c\udfa8", "\ud83d\udc68\ud83c\udfff\u200d\ud83c\udfa8"), new Emoji("\ud83d\udc69\u200d\ud83c\udfa8", "\ud83d\udc69\ud83c\udffb\u200d\ud83c\udfa8", "\ud83d\udc69\ud83c\udffc\u200d\ud83c\udfa8", "\ud83d\udc69\ud83c\udffd\u200d\ud83c\udfa8", "\ud83d\udc69\ud83c\udffe\u200d\ud83c\udfa8", "\ud83d\udc69\ud83c\udfff\u200d\ud83c\udfa8"), new Emoji("\ud83e\uddd1\u200d\u2708\ufe0f", "\ud83e\uddd1\ud83c\udffb\u200d\u2708\ufe0f", "\ud83e\uddd1\ud83c\udffc\u200d\u2708\ufe0f", "\ud83e\uddd1\ud83c\udffd\u200d\u2708\ufe0f", "\ud83e\uddd1\ud83c\udffe\u200d\u2708\ufe0f", "\ud83e\uddd1\ud83c\udfff\u200d\u2708\ufe0f"), new Emoji("\ud83d\udc68\u200d\u2708\ufe0f", "\ud83d\udc68\ud83c\udffb\u200d\u2708\ufe0f", "\ud83d\udc68\ud83c\udffc\u200d\u2708\ufe0f", "\ud83d\udc68\ud83c\udffd\u200d\u2708\ufe0f", "\ud83d\udc68\ud83c\udffe\u200d\u2708\ufe0f", "\ud83d\udc68\ud83c\udfff\u200d\u2708\ufe0f"), new Emoji("\ud83d\udc69\u200d\u2708\ufe0f", "\ud83d\udc69\ud83c\udffb\u200d\u2708\ufe0f", "\ud83d\udc69\ud83c\udffc\u200d\u2708\ufe0f", "\ud83d\udc69\ud83c\udffd\u200d\u2708\ufe0f", "\ud83d\udc69\ud83c\udffe\u200d\u2708\ufe0f", "\ud83d\udc69\ud83c\udfff\u200d\u2708\ufe0f"), new Emoji("\ud83e\uddd1\u200d\ud83d\ude80", "\ud83e\uddd1\ud83c\udffb\u200d\ud83d\ude80", "\ud83e\uddd1\ud83c\udffc\u200d\ud83d\ude80", "\ud83e\uddd1\ud83c\udffd\u200d\ud83d\ude80", "\ud83e\uddd1\ud83c\udffe\u200d\ud83d\ude80", "\ud83e\uddd1\ud83c\udfff\u200d\ud83d\ude80"), new Emoji("\ud83d\udc68\u200d\ud83d\ude80", "\ud83d\udc68\ud83c\udffb\u200d\ud83d\ude80", "\ud83d\udc68\ud83c\udffc\u200d\ud83d\ude80", "\ud83d\udc68\ud83c\udffd\u200d\ud83d\ude80", "\ud83d\udc68\ud83c\udffe\u200d\ud83d\ude80", "\ud83d\udc68\ud83c\udfff\u200d\ud83d\ude80"), new Emoji("\ud83d\udc69\u200d\ud83d\ude80", "\ud83d\udc69\ud83c\udffb\u200d\ud83d\ude80", "\ud83d\udc69\ud83c\udffc\u200d\ud83d\ude80", "\ud83d\udc69\ud83c\udffd\u200d\ud83d\ude80", "\ud83d\udc69\ud83c\udffe\u200d\ud83d\ude80", "\ud83d\udc69\ud83c\udfff\u200d\ud83d\ude80"), new Emoji("\ud83e\uddd1\u200d\ud83d\ude92", "\ud83e\uddd1\ud83c\udffb\u200d\ud83d\ude92", "\ud83e\uddd1\ud83c\udffc\u200d\ud83d\ude92", "\ud83e\uddd1\ud83c\udffd\u200d\ud83d\ude92", "\ud83e\uddd1\ud83c\udffe\u200d\ud83d\ude92", "\ud83e\uddd1\ud83c\udfff\u200d\ud83d\ude92"), new Emoji("\ud83d\udc68\u200d\ud83d\ude92", "\ud83d\udc68\ud83c\udffb\u200d\ud83d\ude92", "\ud83d\udc68\ud83c\udffc\u200d\ud83d\ude92", "\ud83d\udc68\ud83c\udffd\u200d\ud83d\ude92", "\ud83d\udc68\ud83c\udffe\u200d\ud83d\ude92", "\ud83d\udc68\ud83c\udfff\u200d\ud83d\ude92"), new Emoji("\ud83d\udc69\u200d\ud83d\ude92", "\ud83d\udc69\ud83c\udffb\u200d\ud83d\ude92", "\ud83d\udc69\ud83c\udffc\u200d\ud83d\ude92", "\ud83d\udc69\ud83c\udffd\u200d\ud83d\ude92", "\ud83d\udc69\ud83c\udffe\u200d\ud83d\ude92", "\ud83d\udc69\ud83c\udfff\u200d\ud83d\ude92"), new Emoji("\ud83d\udc6e\u200d\u2642\ufe0f", "\ud83d\udc6e\ud83c\udffb\u200d\u2642\ufe0f", "\ud83d\udc6e\ud83c\udffc\u200d\u2642\ufe0f", "\ud83d\udc6e\ud83c\udffd\u200d\u2642\ufe0f", "\ud83d\udc6e\ud83c\udffe\u200d\u2642\ufe0f", "\ud83d\udc6e\ud83c\udfff\u200d\u2642\ufe0f"), new Emoji("\ud83d\udc6e\u200d\u2640\ufe0f", "\ud83d\udc6e\ud83c\udffb\u200d\u2640\ufe0f", "\ud83d\udc6e\ud83c\udffc\u200d\u2640\ufe0f", "\ud83d\udc6e\ud83c\udffd\u200d\u2640\ufe0f", "\ud83d\udc6e\ud83c\udffe\u200d\u2640\ufe0f", "\ud83d\udc6e\ud83c\udfff\u200d\u2640\ufe0f"), new Emoji("\ud83d\udd75\ufe0f\u200d\u2642\ufe0f", "\ud83d\udd75\ud83c\udffb\u200d\u2642\ufe0f", "\ud83d\udd75\ud83c\udffc\u200d\u2642\ufe0f", "\ud83d\udd75\ud83c\udffd\u200d\u2642\ufe0f", "\ud83d\udd75\ud83c\udffe\u200d\u2642\ufe0f", "\ud83d\udd75\ud83c\udfff\u200d\u2642\ufe0f"), new Emoji("\ud83d\udd75\ufe0f\u200d\u2640\ufe0f", "\ud83d\udd75\ud83c\udffb\u200d\u2640\ufe0f", "\ud83d\udd75\ud83c\udffc\u200d\u2640\ufe0f", "\ud83d\udd75\ud83c\udffd\u200d\u2640\ufe0f", "\ud83d\udd75\ud83c\udffe\u200d\u2640\ufe0f", "\ud83d\udd75\ud83c\udfff\u200d\u2640\ufe0f"), new Emoji("\ud83d\udc82\u200d\u2642\ufe0f", "\ud83d\udc82\ud83c\udffb\u200d\u2642\ufe0f", "\ud83d\udc82\ud83c\udffc\u200d\u2642\ufe0f", "\ud83d\udc82\ud83c\udffd\u200d\u2642\ufe0f", "\ud83d\udc82\ud83c\udffe\u200d\u2642\ufe0f", "\ud83d\udc82\ud83c\udfff\u200d\u2642\ufe0f"), new Emoji("\ud83d\udc82\u200d\u2640\ufe0f", "\ud83d\udc82\ud83c\udffb\u200d\u2640\ufe0f", "\ud83d\udc82\ud83c\udffc\u200d\u2640\ufe0f", "\ud83d\udc82\ud83c\udffd\u200d\u2640\ufe0f", "\ud83d\udc82\ud83c\udffe\u200d\u2640\ufe0f", "\ud83d\udc82\ud83c\udfff\u200d\u2640\ufe0f"), new Emoji("\ud83d\udc77\u200d\u2642\ufe0f", "\ud83d\udc77\ud83c\udffb\u200d\u2642\ufe0f", "\ud83d\udc77\ud83c\udffc\u200d\u2642\ufe0f", "\ud83d\udc77\ud83c\udffd\u200d\u2642\ufe0f", "\ud83d\udc77\ud83c\udffe\u200d\u2642\ufe0f", "\ud83d\udc77\ud83c\udfff\u200d\u2642\ufe0f"), new Emoji("\ud83d\udc77\u200d\u2640\ufe0f", "\ud83d\udc77\ud83c\udffb\u200d\u2640\ufe0f", "\ud83d\udc77\ud83c\udffc\u200d\u2640\ufe0f", "\ud83d\udc77\ud83c\udffd\u200d\u2640\ufe0f", "\ud83d\udc77\ud83c\udffe\u200d\u2640\ufe0f", "\ud83d\udc77\ud83c\udfff\u200d\u2640\ufe0f"),
+ }, "emoji/People_3.webp");
+
+ private static final EmojiPageModel PAGE_PEOPLE_4 = new StaticEmojiPageModel(R.attr.emoji_category_people, new Emoji[] {
+ new Emoji("\ud83e\udd34", "\ud83e\udd34\ud83c\udffb", "\ud83e\udd34\ud83c\udffc", "\ud83e\udd34\ud83c\udffd", "\ud83e\udd34\ud83c\udffe", "\ud83e\udd34\ud83c\udfff"), new Emoji("\ud83d\udc78", "\ud83d\udc78\ud83c\udffb", "\ud83d\udc78\ud83c\udffc", "\ud83d\udc78\ud83c\udffd", "\ud83d\udc78\ud83c\udffe", "\ud83d\udc78\ud83c\udfff"), new Emoji("\ud83d\udc73\u200d\u2642\ufe0f", "\ud83d\udc73\ud83c\udffb\u200d\u2642\ufe0f", "\ud83d\udc73\ud83c\udffc\u200d\u2642\ufe0f", "\ud83d\udc73\ud83c\udffd\u200d\u2642\ufe0f", "\ud83d\udc73\ud83c\udffe\u200d\u2642\ufe0f", "\ud83d\udc73\ud83c\udfff\u200d\u2642\ufe0f"), new Emoji("\ud83d\udc73\u200d\u2640\ufe0f", "\ud83d\udc73\ud83c\udffb\u200d\u2640\ufe0f", "\ud83d\udc73\ud83c\udffc\u200d\u2640\ufe0f", "\ud83d\udc73\ud83c\udffd\u200d\u2640\ufe0f", "\ud83d\udc73\ud83c\udffe\u200d\u2640\ufe0f", "\ud83d\udc73\ud83c\udfff\u200d\u2640\ufe0f"), new Emoji("\ud83d\udc72", "\ud83d\udc72\ud83c\udffb", "\ud83d\udc72\ud83c\udffc", "\ud83d\udc72\ud83c\udffd", "\ud83d\udc72\ud83c\udffe", "\ud83d\udc72\ud83c\udfff"), new Emoji("\ud83e\uddd5", "\ud83e\uddd5\ud83c\udffb", "\ud83e\uddd5\ud83c\udffc", "\ud83e\uddd5\ud83c\udffd", "\ud83e\uddd5\ud83c\udffe", "\ud83e\uddd5\ud83c\udfff"), new Emoji("\ud83e\udd35", "\ud83e\udd35\ud83c\udffb", "\ud83e\udd35\ud83c\udffc", "\ud83e\udd35\ud83c\udffd", "\ud83e\udd35\ud83c\udffe", "\ud83e\udd35\ud83c\udfff"), new Emoji("\ud83d\udc70", "\ud83d\udc70\ud83c\udffb", "\ud83d\udc70\ud83c\udffc", "\ud83d\udc70\ud83c\udffd", "\ud83d\udc70\ud83c\udffe", "\ud83d\udc70\ud83c\udfff"), new Emoji("\ud83e\udd30", "\ud83e\udd30\ud83c\udffb", "\ud83e\udd30\ud83c\udffc", "\ud83e\udd30\ud83c\udffd", "\ud83e\udd30\ud83c\udffe", "\ud83e\udd30\ud83c\udfff"), new Emoji("\ud83e\udd31", "\ud83e\udd31\ud83c\udffb", "\ud83e\udd31\ud83c\udffc", "\ud83e\udd31\ud83c\udffd", "\ud83e\udd31\ud83c\udffe", "\ud83e\udd31\ud83c\udfff"), new Emoji("\ud83d\udc7c", "\ud83d\udc7c\ud83c\udffb", "\ud83d\udc7c\ud83c\udffc", "\ud83d\udc7c\ud83c\udffd", "\ud83d\udc7c\ud83c\udffe", "\ud83d\udc7c\ud83c\udfff"), new Emoji("\ud83c\udf85", "\ud83c\udf85\ud83c\udffb", "\ud83c\udf85\ud83c\udffc", "\ud83c\udf85\ud83c\udffd", "\ud83c\udf85\ud83c\udffe", "\ud83c\udf85\ud83c\udfff"), new Emoji("\ud83e\udd36", "\ud83e\udd36\ud83c\udffb", "\ud83e\udd36\ud83c\udffc", "\ud83e\udd36\ud83c\udffd", "\ud83e\udd36\ud83c\udffe", "\ud83e\udd36\ud83c\udfff"), new Emoji("\ud83e\uddb8", "\ud83e\uddb8\ud83c\udffb", "\ud83e\uddb8\ud83c\udffc", "\ud83e\uddb8\ud83c\udffd", "\ud83e\uddb8\ud83c\udffe", "\ud83e\uddb8\ud83c\udfff"), new Emoji("\ud83e\uddb8\u200d\u2642\ufe0f", "\ud83e\uddb8\ud83c\udffb\u200d\u2642\ufe0f", "\ud83e\uddb8\ud83c\udffc\u200d\u2642\ufe0f", "\ud83e\uddb8\ud83c\udffd\u200d\u2642\ufe0f", "\ud83e\uddb8\ud83c\udffe\u200d\u2642\ufe0f", "\ud83e\uddb8\ud83c\udfff\u200d\u2642\ufe0f"), new Emoji("\ud83e\uddb8\u200d\u2640\ufe0f", "\ud83e\uddb8\ud83c\udffb\u200d\u2640\ufe0f", "\ud83e\uddb8\ud83c\udffc\u200d\u2640\ufe0f", "\ud83e\uddb8\ud83c\udffd\u200d\u2640\ufe0f", "\ud83e\uddb8\ud83c\udffe\u200d\u2640\ufe0f", "\ud83e\uddb8\ud83c\udfff\u200d\u2640\ufe0f"), new Emoji("\ud83e\uddb9", "\ud83e\uddb9\ud83c\udffb", "\ud83e\uddb9\ud83c\udffc", "\ud83e\uddb9\ud83c\udffd", "\ud83e\uddb9\ud83c\udffe", "\ud83e\uddb9\ud83c\udfff"), new Emoji("\ud83e\uddb9\u200d\u2642\ufe0f", "\ud83e\uddb9\ud83c\udffb\u200d\u2642\ufe0f", "\ud83e\uddb9\ud83c\udffc\u200d\u2642\ufe0f", "\ud83e\uddb9\ud83c\udffd\u200d\u2642\ufe0f", "\ud83e\uddb9\ud83c\udffe\u200d\u2642\ufe0f", "\ud83e\uddb9\ud83c\udfff\u200d\u2642\ufe0f"), new Emoji("\ud83e\uddb9\u200d\u2640\ufe0f", "\ud83e\uddb9\ud83c\udffb\u200d\u2640\ufe0f", "\ud83e\uddb9\ud83c\udffc\u200d\u2640\ufe0f", "\ud83e\uddb9\ud83c\udffd\u200d\u2640\ufe0f", "\ud83e\uddb9\ud83c\udffe\u200d\u2640\ufe0f", "\ud83e\uddb9\ud83c\udfff\u200d\u2640\ufe0f"), new Emoji("\ud83e\uddd9\u200d\u2642\ufe0f", "\ud83e\uddd9\ud83c\udffb\u200d\u2642\ufe0f", "\ud83e\uddd9\ud83c\udffc\u200d\u2642\ufe0f", "\ud83e\uddd9\ud83c\udffd\u200d\u2642\ufe0f", "\ud83e\uddd9\ud83c\udffe\u200d\u2642\ufe0f", "\ud83e\uddd9\ud83c\udfff\u200d\u2642\ufe0f"), new Emoji("\ud83e\uddd9\u200d\u2640\ufe0f", "\ud83e\uddd9\ud83c\udffb\u200d\u2640\ufe0f", "\ud83e\uddd9\ud83c\udffc\u200d\u2640\ufe0f", "\ud83e\uddd9\ud83c\udffd\u200d\u2640\ufe0f", "\ud83e\uddd9\ud83c\udffe\u200d\u2640\ufe0f", "\ud83e\uddd9\ud83c\udfff\u200d\u2640\ufe0f"), new Emoji("\ud83e\uddda\u200d\u2642\ufe0f", "\ud83e\uddda\ud83c\udffb\u200d\u2642\ufe0f", "\ud83e\uddda\ud83c\udffc\u200d\u2642\ufe0f", "\ud83e\uddda\ud83c\udffd\u200d\u2642\ufe0f", "\ud83e\uddda\ud83c\udffe\u200d\u2642\ufe0f", "\ud83e\uddda\ud83c\udfff\u200d\u2642\ufe0f"), new Emoji("\ud83e\uddda\u200d\u2640\ufe0f", "\ud83e\uddda\ud83c\udffb\u200d\u2640\ufe0f", "\ud83e\uddda\ud83c\udffc\u200d\u2640\ufe0f", "\ud83e\uddda\ud83c\udffd\u200d\u2640\ufe0f", "\ud83e\uddda\ud83c\udffe\u200d\u2640\ufe0f", "\ud83e\uddda\ud83c\udfff\u200d\u2640\ufe0f"), new Emoji("\ud83e\udddb\u200d\u2642\ufe0f", "\ud83e\udddb\ud83c\udffb\u200d\u2642\ufe0f", "\ud83e\udddb\ud83c\udffc\u200d\u2642\ufe0f", "\ud83e\udddb\ud83c\udffd\u200d\u2642\ufe0f", "\ud83e\udddb\ud83c\udffe\u200d\u2642\ufe0f", "\ud83e\udddb\ud83c\udfff\u200d\u2642\ufe0f"), new Emoji("\ud83e\udddb\u200d\u2640\ufe0f", "\ud83e\udddb\ud83c\udffb\u200d\u2640\ufe0f", "\ud83e\udddb\ud83c\udffc\u200d\u2640\ufe0f", "\ud83e\udddb\ud83c\udffd\u200d\u2640\ufe0f", "\ud83e\udddb\ud83c\udffe\u200d\u2640\ufe0f", "\ud83e\udddb\ud83c\udfff\u200d\u2640\ufe0f"), new Emoji("\ud83e\udddc\u200d\u2642\ufe0f", "\ud83e\udddc\ud83c\udffb\u200d\u2642\ufe0f", "\ud83e\udddc\ud83c\udffc\u200d\u2642\ufe0f", "\ud83e\udddc\ud83c\udffd\u200d\u2642\ufe0f", "\ud83e\udddc\ud83c\udffe\u200d\u2642\ufe0f", "\ud83e\udddc\ud83c\udfff\u200d\u2642\ufe0f"), new Emoji("\ud83e\udddc\u200d\u2640\ufe0f", "\ud83e\udddc\ud83c\udffb\u200d\u2640\ufe0f", "\ud83e\udddc\ud83c\udffc\u200d\u2640\ufe0f", "\ud83e\udddc\ud83c\udffd\u200d\u2640\ufe0f", "\ud83e\udddc\ud83c\udffe\u200d\u2640\ufe0f", "\ud83e\udddc\ud83c\udfff\u200d\u2640\ufe0f"), new Emoji("\ud83e\udddd\u200d\u2642\ufe0f", "\ud83e\udddd\ud83c\udffb\u200d\u2642\ufe0f", "\ud83e\udddd\ud83c\udffc\u200d\u2642\ufe0f", "\ud83e\udddd\ud83c\udffd\u200d\u2642\ufe0f", "\ud83e\udddd\ud83c\udffe\u200d\u2642\ufe0f", "\ud83e\udddd\ud83c\udfff\u200d\u2642\ufe0f"), new Emoji("\ud83e\udddd\u200d\u2640\ufe0f", "\ud83e\udddd\ud83c\udffb\u200d\u2640\ufe0f", "\ud83e\udddd\ud83c\udffc\u200d\u2640\ufe0f", "\ud83e\udddd\ud83c\udffd\u200d\u2640\ufe0f", "\ud83e\udddd\ud83c\udffe\u200d\u2640\ufe0f", "\ud83e\udddd\ud83c\udfff\u200d\u2640\ufe0f"), new Emoji("\ud83e\uddde\u200d\u2642\ufe0f"), new Emoji("\ud83e\uddde\u200d\u2640\ufe0f"), new Emoji("\ud83e\udddf\u200d\u2642\ufe0f"), new Emoji("\ud83e\udddf\u200d\u2640\ufe0f"), new Emoji("\ud83d\udc86\u200d\u2642\ufe0f", "\ud83d\udc86\ud83c\udffb\u200d\u2642\ufe0f", "\ud83d\udc86\ud83c\udffc\u200d\u2642\ufe0f", "\ud83d\udc86\ud83c\udffd\u200d\u2642\ufe0f", "\ud83d\udc86\ud83c\udffe\u200d\u2642\ufe0f", "\ud83d\udc86\ud83c\udfff\u200d\u2642\ufe0f"), new Emoji("\ud83d\udc86\u200d\u2640\ufe0f", "\ud83d\udc86\ud83c\udffb\u200d\u2640\ufe0f", "\ud83d\udc86\ud83c\udffc\u200d\u2640\ufe0f", "\ud83d\udc86\ud83c\udffd\u200d\u2640\ufe0f", "\ud83d\udc86\ud83c\udffe\u200d\u2640\ufe0f", "\ud83d\udc86\ud83c\udfff\u200d\u2640\ufe0f"), new Emoji("\ud83d\udc87\u200d\u2642\ufe0f", "\ud83d\udc87\ud83c\udffb\u200d\u2642\ufe0f", "\ud83d\udc87\ud83c\udffc\u200d\u2642\ufe0f", "\ud83d\udc87\ud83c\udffd\u200d\u2642\ufe0f", "\ud83d\udc87\ud83c\udffe\u200d\u2642\ufe0f", "\ud83d\udc87\ud83c\udfff\u200d\u2642\ufe0f"), new Emoji("\ud83d\udc87\u200d\u2640\ufe0f", "\ud83d\udc87\ud83c\udffb\u200d\u2640\ufe0f", "\ud83d\udc87\ud83c\udffc\u200d\u2640\ufe0f", "\ud83d\udc87\ud83c\udffd\u200d\u2640\ufe0f", "\ud83d\udc87\ud83c\udffe\u200d\u2640\ufe0f", "\ud83d\udc87\ud83c\udfff\u200d\u2640\ufe0f"), new Emoji("\ud83d\udeb6\u200d\u2642\ufe0f", "\ud83d\udeb6\ud83c\udffb\u200d\u2642\ufe0f", "\ud83d\udeb6\ud83c\udffc\u200d\u2642\ufe0f", "\ud83d\udeb6\ud83c\udffd\u200d\u2642\ufe0f", "\ud83d\udeb6\ud83c\udffe\u200d\u2642\ufe0f", "\ud83d\udeb6\ud83c\udfff\u200d\u2642\ufe0f"), new Emoji("\ud83d\udeb6\u200d\u2640\ufe0f", "\ud83d\udeb6\ud83c\udffb\u200d\u2640\ufe0f", "\ud83d\udeb6\ud83c\udffc\u200d\u2640\ufe0f", "\ud83d\udeb6\ud83c\udffd\u200d\u2640\ufe0f", "\ud83d\udeb6\ud83c\udffe\u200d\u2640\ufe0f", "\ud83d\udeb6\ud83c\udfff\u200d\u2640\ufe0f"), new Emoji("\ud83e\uddcd", "\ud83e\uddcd\ud83c\udffb", "\ud83e\uddcd\ud83c\udffc", "\ud83e\uddcd\ud83c\udffd", "\ud83e\uddcd\ud83c\udffe", "\ud83e\uddcd\ud83c\udfff"), new Emoji("\ud83e\uddcd\u200d\u2642\ufe0f", "\ud83e\uddcd\ud83c\udffb\u200d\u2642\ufe0f", "\ud83e\uddcd\ud83c\udffc\u200d\u2642\ufe0f", "\ud83e\uddcd\ud83c\udffd\u200d\u2642\ufe0f", "\ud83e\uddcd\ud83c\udffe\u200d\u2642\ufe0f", "\ud83e\uddcd\ud83c\udfff\u200d\u2642\ufe0f"), new Emoji("\ud83e\uddcd\u200d\u2640\ufe0f", "\ud83e\uddcd\ud83c\udffb\u200d\u2640\ufe0f", "\ud83e\uddcd\ud83c\udffc\u200d\u2640\ufe0f", "\ud83e\uddcd\ud83c\udffd\u200d\u2640\ufe0f", "\ud83e\uddcd\ud83c\udffe\u200d\u2640\ufe0f", "\ud83e\uddcd\ud83c\udfff\u200d\u2640\ufe0f"), new Emoji("\ud83e\uddce", "\ud83e\uddce\ud83c\udffb", "\ud83e\uddce\ud83c\udffc", "\ud83e\uddce\ud83c\udffd", "\ud83e\uddce\ud83c\udffe", "\ud83e\uddce\ud83c\udfff"), new Emoji("\ud83e\uddce\u200d\u2642\ufe0f", "\ud83e\uddce\ud83c\udffb\u200d\u2642\ufe0f", "\ud83e\uddce\ud83c\udffc\u200d\u2642\ufe0f", "\ud83e\uddce\ud83c\udffd\u200d\u2642\ufe0f", "\ud83e\uddce\ud83c\udffe\u200d\u2642\ufe0f", "\ud83e\uddce\ud83c\udfff\u200d\u2642\ufe0f"), new Emoji("\ud83e\uddce\u200d\u2640\ufe0f", "\ud83e\uddce\ud83c\udffb\u200d\u2640\ufe0f", "\ud83e\uddce\ud83c\udffc\u200d\u2640\ufe0f", "\ud83e\uddce\ud83c\udffd\u200d\u2640\ufe0f", "\ud83e\uddce\ud83c\udffe\u200d\u2640\ufe0f", "\ud83e\uddce\ud83c\udfff\u200d\u2640\ufe0f"), new Emoji("\ud83e\uddd1\u200d\ud83e\uddaf", "\ud83e\uddd1\ud83c\udffb\u200d\ud83e\uddaf", "\ud83e\uddd1\ud83c\udffc\u200d\ud83e\uddaf", "\ud83e\uddd1\ud83c\udffd\u200d\ud83e\uddaf", "\ud83e\uddd1\ud83c\udffe\u200d\ud83e\uddaf", "\ud83e\uddd1\ud83c\udfff\u200d\ud83e\uddaf"),
+ }, "emoji/People_4.webp");
+
+ private static final EmojiPageModel PAGE_PEOPLE_5 = new StaticEmojiPageModel(R.attr.emoji_category_people, new Emoji[] {
+ new Emoji("\ud83d\udc68\u200d\ud83e\uddaf", "\ud83d\udc68\ud83c\udffb\u200d\ud83e\uddaf", "\ud83d\udc68\ud83c\udffc\u200d\ud83e\uddaf", "\ud83d\udc68\ud83c\udffd\u200d\ud83e\uddaf", "\ud83d\udc68\ud83c\udffe\u200d\ud83e\uddaf", "\ud83d\udc68\ud83c\udfff\u200d\ud83e\uddaf"), new Emoji("\ud83d\udc69\u200d\ud83e\uddaf", "\ud83d\udc69\ud83c\udffb\u200d\ud83e\uddaf", "\ud83d\udc69\ud83c\udffc\u200d\ud83e\uddaf", "\ud83d\udc69\ud83c\udffd\u200d\ud83e\uddaf", "\ud83d\udc69\ud83c\udffe\u200d\ud83e\uddaf", "\ud83d\udc69\ud83c\udfff\u200d\ud83e\uddaf"), new Emoji("\ud83e\uddd1\u200d\ud83e\uddbc", "\ud83e\uddd1\ud83c\udffb\u200d\ud83e\uddbc", "\ud83e\uddd1\ud83c\udffc\u200d\ud83e\uddbc", "\ud83e\uddd1\ud83c\udffd\u200d\ud83e\uddbc", "\ud83e\uddd1\ud83c\udffe\u200d\ud83e\uddbc", "\ud83e\uddd1\ud83c\udfff\u200d\ud83e\uddbc"), new Emoji("\ud83d\udc68\u200d\ud83e\uddbc", "\ud83d\udc68\ud83c\udffb\u200d\ud83e\uddbc", "\ud83d\udc68\ud83c\udffc\u200d\ud83e\uddbc", "\ud83d\udc68\ud83c\udffd\u200d\ud83e\uddbc", "\ud83d\udc68\ud83c\udffe\u200d\ud83e\uddbc", "\ud83d\udc68\ud83c\udfff\u200d\ud83e\uddbc"), new Emoji("\ud83d\udc69\u200d\ud83e\uddbc", "\ud83d\udc69\ud83c\udffb\u200d\ud83e\uddbc", "\ud83d\udc69\ud83c\udffc\u200d\ud83e\uddbc", "\ud83d\udc69\ud83c\udffd\u200d\ud83e\uddbc", "\ud83d\udc69\ud83c\udffe\u200d\ud83e\uddbc", "\ud83d\udc69\ud83c\udfff\u200d\ud83e\uddbc"), new Emoji("\ud83e\uddd1\u200d\ud83e\uddbd", "\ud83e\uddd1\ud83c\udffb\u200d\ud83e\uddbd", "\ud83e\uddd1\ud83c\udffc\u200d\ud83e\uddbd", "\ud83e\uddd1\ud83c\udffd\u200d\ud83e\uddbd", "\ud83e\uddd1\ud83c\udffe\u200d\ud83e\uddbd", "\ud83e\uddd1\ud83c\udfff\u200d\ud83e\uddbd"), new Emoji("\ud83d\udc68\u200d\ud83e\uddbd", "\ud83d\udc68\ud83c\udffb\u200d\ud83e\uddbd", "\ud83d\udc68\ud83c\udffc\u200d\ud83e\uddbd", "\ud83d\udc68\ud83c\udffd\u200d\ud83e\uddbd", "\ud83d\udc68\ud83c\udffe\u200d\ud83e\uddbd", "\ud83d\udc68\ud83c\udfff\u200d\ud83e\uddbd"), new Emoji("\ud83d\udc69\u200d\ud83e\uddbd", "\ud83d\udc69\ud83c\udffb\u200d\ud83e\uddbd", "\ud83d\udc69\ud83c\udffc\u200d\ud83e\uddbd", "\ud83d\udc69\ud83c\udffd\u200d\ud83e\uddbd", "\ud83d\udc69\ud83c\udffe\u200d\ud83e\uddbd", "\ud83d\udc69\ud83c\udfff\u200d\ud83e\uddbd"), new Emoji("\ud83c\udfc3\u200d\u2642\ufe0f", "\ud83c\udfc3\ud83c\udffb\u200d\u2642\ufe0f", "\ud83c\udfc3\ud83c\udffc\u200d\u2642\ufe0f", "\ud83c\udfc3\ud83c\udffd\u200d\u2642\ufe0f", "\ud83c\udfc3\ud83c\udffe\u200d\u2642\ufe0f", "\ud83c\udfc3\ud83c\udfff\u200d\u2642\ufe0f"), new Emoji("\ud83c\udfc3\u200d\u2640\ufe0f", "\ud83c\udfc3\ud83c\udffb\u200d\u2640\ufe0f", "\ud83c\udfc3\ud83c\udffc\u200d\u2640\ufe0f", "\ud83c\udfc3\ud83c\udffd\u200d\u2640\ufe0f", "\ud83c\udfc3\ud83c\udffe\u200d\u2640\ufe0f", "\ud83c\udfc3\ud83c\udfff\u200d\u2640\ufe0f"), new Emoji("\ud83d\udc83", "\ud83d\udc83\ud83c\udffb", "\ud83d\udc83\ud83c\udffc", "\ud83d\udc83\ud83c\udffd", "\ud83d\udc83\ud83c\udffe", "\ud83d\udc83\ud83c\udfff"), new Emoji("\ud83d\udd7a", "\ud83d\udd7a\ud83c\udffb", "\ud83d\udd7a\ud83c\udffc", "\ud83d\udd7a\ud83c\udffd", "\ud83d\udd7a\ud83c\udffe", "\ud83d\udd7a\ud83c\udfff"), new Emoji("\ud83d\udd74\ufe0f", "\ud83d\udd74\ud83c\udffb", "\ud83d\udd74\ud83c\udffc", "\ud83d\udd74\ud83c\udffd", "\ud83d\udd74\ud83c\udffe", "\ud83d\udd74\ud83c\udfff"), new Emoji("\ud83d\udc6f\u200d\u2642\ufe0f"), new Emoji("\ud83d\udc6f\u200d\u2640\ufe0f"), new Emoji("\ud83e\uddd6\u200d\u2642\ufe0f", "\ud83e\uddd6\ud83c\udffb\u200d\u2642\ufe0f", "\ud83e\uddd6\ud83c\udffc\u200d\u2642\ufe0f", "\ud83e\uddd6\ud83c\udffd\u200d\u2642\ufe0f", "\ud83e\uddd6\ud83c\udffe\u200d\u2642\ufe0f", "\ud83e\uddd6\ud83c\udfff\u200d\u2642\ufe0f"), new Emoji("\ud83e\uddd6\u200d\u2640\ufe0f", "\ud83e\uddd6\ud83c\udffb\u200d\u2640\ufe0f", "\ud83e\uddd6\ud83c\udffc\u200d\u2640\ufe0f", "\ud83e\uddd6\ud83c\udffd\u200d\u2640\ufe0f", "\ud83e\uddd6\ud83c\udffe\u200d\u2640\ufe0f", "\ud83e\uddd6\ud83c\udfff\u200d\u2640\ufe0f"), new Emoji("\ud83e\uddd7\u200d\u2642\ufe0f", "\ud83e\uddd7\ud83c\udffb\u200d\u2642\ufe0f", "\ud83e\uddd7\ud83c\udffc\u200d\u2642\ufe0f", "\ud83e\uddd7\ud83c\udffd\u200d\u2642\ufe0f", "\ud83e\uddd7\ud83c\udffe\u200d\u2642\ufe0f", "\ud83e\uddd7\ud83c\udfff\u200d\u2642\ufe0f"), new Emoji("\ud83e\uddd7\u200d\u2640\ufe0f", "\ud83e\uddd7\ud83c\udffb\u200d\u2640\ufe0f", "\ud83e\uddd7\ud83c\udffc\u200d\u2640\ufe0f", "\ud83e\uddd7\ud83c\udffd\u200d\u2640\ufe0f", "\ud83e\uddd7\ud83c\udffe\u200d\u2640\ufe0f", "\ud83e\uddd7\ud83c\udfff\u200d\u2640\ufe0f"), new Emoji("\ud83e\udd3a"), new Emoji("\ud83c\udfc7", "\ud83c\udfc7\ud83c\udffb", "\ud83c\udfc7\ud83c\udffc", "\ud83c\udfc7\ud83c\udffd", "\ud83c\udfc7\ud83c\udffe", "\ud83c\udfc7\ud83c\udfff"), new Emoji("\u26f7\ufe0f"), new Emoji("\ud83c\udfc2", "\ud83c\udfc2\ud83c\udffb", "\ud83c\udfc2\ud83c\udffc", "\ud83c\udfc2\ud83c\udffd", "\ud83c\udfc2\ud83c\udffe", "\ud83c\udfc2\ud83c\udfff"), new Emoji("\ud83c\udfcc\ufe0f\u200d\u2642\ufe0f", "\ud83c\udfcc\ud83c\udffb\u200d\u2642\ufe0f", "\ud83c\udfcc\ud83c\udffc\u200d\u2642\ufe0f", "\ud83c\udfcc\ud83c\udffd\u200d\u2642\ufe0f", "\ud83c\udfcc\ud83c\udffe\u200d\u2642\ufe0f", "\ud83c\udfcc\ud83c\udfff\u200d\u2642\ufe0f"), new Emoji("\ud83c\udfcc\ufe0f\u200d\u2640\ufe0f", "\ud83c\udfcc\ud83c\udffb\u200d\u2640\ufe0f", "\ud83c\udfcc\ud83c\udffc\u200d\u2640\ufe0f", "\ud83c\udfcc\ud83c\udffd\u200d\u2640\ufe0f", "\ud83c\udfcc\ud83c\udffe\u200d\u2640\ufe0f", "\ud83c\udfcc\ud83c\udfff\u200d\u2640\ufe0f"), new Emoji("\ud83c\udfc4\u200d\u2642\ufe0f", "\ud83c\udfc4\ud83c\udffb\u200d\u2642\ufe0f", "\ud83c\udfc4\ud83c\udffc\u200d\u2642\ufe0f", "\ud83c\udfc4\ud83c\udffd\u200d\u2642\ufe0f", "\ud83c\udfc4\ud83c\udffe\u200d\u2642\ufe0f", "\ud83c\udfc4\ud83c\udfff\u200d\u2642\ufe0f"), new Emoji("\ud83c\udfc4\u200d\u2640\ufe0f", "\ud83c\udfc4\ud83c\udffb\u200d\u2640\ufe0f", "\ud83c\udfc4\ud83c\udffc\u200d\u2640\ufe0f", "\ud83c\udfc4\ud83c\udffd\u200d\u2640\ufe0f", "\ud83c\udfc4\ud83c\udffe\u200d\u2640\ufe0f", "\ud83c\udfc4\ud83c\udfff\u200d\u2640\ufe0f"), new Emoji("\ud83d\udea3\u200d\u2642\ufe0f", "\ud83d\udea3\ud83c\udffb\u200d\u2642\ufe0f", "\ud83d\udea3\ud83c\udffc\u200d\u2642\ufe0f", "\ud83d\udea3\ud83c\udffd\u200d\u2642\ufe0f", "\ud83d\udea3\ud83c\udffe\u200d\u2642\ufe0f", "\ud83d\udea3\ud83c\udfff\u200d\u2642\ufe0f"), new Emoji("\ud83d\udea3\u200d\u2640\ufe0f", "\ud83d\udea3\ud83c\udffb\u200d\u2640\ufe0f", "\ud83d\udea3\ud83c\udffc\u200d\u2640\ufe0f", "\ud83d\udea3\ud83c\udffd\u200d\u2640\ufe0f", "\ud83d\udea3\ud83c\udffe\u200d\u2640\ufe0f", "\ud83d\udea3\ud83c\udfff\u200d\u2640\ufe0f"), new Emoji("\ud83c\udfca\u200d\u2642\ufe0f", "\ud83c\udfca\ud83c\udffb\u200d\u2642\ufe0f", "\ud83c\udfca\ud83c\udffc\u200d\u2642\ufe0f", "\ud83c\udfca\ud83c\udffd\u200d\u2642\ufe0f", "\ud83c\udfca\ud83c\udffe\u200d\u2642\ufe0f", "\ud83c\udfca\ud83c\udfff\u200d\u2642\ufe0f"), new Emoji("\ud83c\udfca\u200d\u2640\ufe0f", "\ud83c\udfca\ud83c\udffb\u200d\u2640\ufe0f", "\ud83c\udfca\ud83c\udffc\u200d\u2640\ufe0f", "\ud83c\udfca\ud83c\udffd\u200d\u2640\ufe0f", "\ud83c\udfca\ud83c\udffe\u200d\u2640\ufe0f", "\ud83c\udfca\ud83c\udfff\u200d\u2640\ufe0f"), new Emoji("\u26f9\ufe0f\u200d\u2642\ufe0f", "\u26f9\ud83c\udffb\u200d\u2642\ufe0f", "\u26f9\ud83c\udffc\u200d\u2642\ufe0f", "\u26f9\ud83c\udffd\u200d\u2642\ufe0f", "\u26f9\ud83c\udffe\u200d\u2642\ufe0f", "\u26f9\ud83c\udfff\u200d\u2642\ufe0f"), new Emoji("\u26f9\ufe0f\u200d\u2640\ufe0f", "\u26f9\ud83c\udffb\u200d\u2640\ufe0f", "\u26f9\ud83c\udffc\u200d\u2640\ufe0f", "\u26f9\ud83c\udffd\u200d\u2640\ufe0f", "\u26f9\ud83c\udffe\u200d\u2640\ufe0f", "\u26f9\ud83c\udfff\u200d\u2640\ufe0f"), new Emoji("\ud83c\udfcb\ufe0f\u200d\u2642\ufe0f", "\ud83c\udfcb\ud83c\udffb\u200d\u2642\ufe0f", "\ud83c\udfcb\ud83c\udffc\u200d\u2642\ufe0f", "\ud83c\udfcb\ud83c\udffd\u200d\u2642\ufe0f", "\ud83c\udfcb\ud83c\udffe\u200d\u2642\ufe0f", "\ud83c\udfcb\ud83c\udfff\u200d\u2642\ufe0f"), new Emoji("\ud83c\udfcb\ufe0f\u200d\u2640\ufe0f", "\ud83c\udfcb\ud83c\udffb\u200d\u2640\ufe0f", "\ud83c\udfcb\ud83c\udffc\u200d\u2640\ufe0f", "\ud83c\udfcb\ud83c\udffd\u200d\u2640\ufe0f", "\ud83c\udfcb\ud83c\udffe\u200d\u2640\ufe0f", "\ud83c\udfcb\ud83c\udfff\u200d\u2640\ufe0f"), new Emoji("\ud83d\udeb4\u200d\u2642\ufe0f", "\ud83d\udeb4\ud83c\udffb\u200d\u2642\ufe0f", "\ud83d\udeb4\ud83c\udffc\u200d\u2642\ufe0f", "\ud83d\udeb4\ud83c\udffd\u200d\u2642\ufe0f", "\ud83d\udeb4\ud83c\udffe\u200d\u2642\ufe0f", "\ud83d\udeb4\ud83c\udfff\u200d\u2642\ufe0f"), new Emoji("\ud83d\udeb4\u200d\u2640\ufe0f", "\ud83d\udeb4\ud83c\udffb\u200d\u2640\ufe0f", "\ud83d\udeb4\ud83c\udffc\u200d\u2640\ufe0f", "\ud83d\udeb4\ud83c\udffd\u200d\u2640\ufe0f", "\ud83d\udeb4\ud83c\udffe\u200d\u2640\ufe0f", "\ud83d\udeb4\ud83c\udfff\u200d\u2640\ufe0f"), new Emoji("\ud83d\udeb5\u200d\u2642\ufe0f", "\ud83d\udeb5\ud83c\udffb\u200d\u2642\ufe0f", "\ud83d\udeb5\ud83c\udffc\u200d\u2642\ufe0f", "\ud83d\udeb5\ud83c\udffd\u200d\u2642\ufe0f", "\ud83d\udeb5\ud83c\udffe\u200d\u2642\ufe0f", "\ud83d\udeb5\ud83c\udfff\u200d\u2642\ufe0f"), new Emoji("\ud83d\udeb5\u200d\u2640\ufe0f", "\ud83d\udeb5\ud83c\udffb\u200d\u2640\ufe0f", "\ud83d\udeb5\ud83c\udffc\u200d\u2640\ufe0f", "\ud83d\udeb5\ud83c\udffd\u200d\u2640\ufe0f", "\ud83d\udeb5\ud83c\udffe\u200d\u2640\ufe0f", "\ud83d\udeb5\ud83c\udfff\u200d\u2640\ufe0f"), new Emoji("\ud83e\udd38", "\ud83e\udd38\ud83c\udffb", "\ud83e\udd38\ud83c\udffc", "\ud83e\udd38\ud83c\udffd", "\ud83e\udd38\ud83c\udffe", "\ud83e\udd38\ud83c\udfff"), new Emoji("\ud83e\udd38\u200d\u2642\ufe0f", "\ud83e\udd38\ud83c\udffb\u200d\u2642\ufe0f", "\ud83e\udd38\ud83c\udffc\u200d\u2642\ufe0f", "\ud83e\udd38\ud83c\udffd\u200d\u2642\ufe0f", "\ud83e\udd38\ud83c\udffe\u200d\u2642\ufe0f", "\ud83e\udd38\ud83c\udfff\u200d\u2642\ufe0f"), new Emoji("\ud83e\udd38\u200d\u2640\ufe0f", "\ud83e\udd38\ud83c\udffb\u200d\u2640\ufe0f", "\ud83e\udd38\ud83c\udffc\u200d\u2640\ufe0f", "\ud83e\udd38\ud83c\udffd\u200d\u2640\ufe0f", "\ud83e\udd38\ud83c\udffe\u200d\u2640\ufe0f", "\ud83e\udd38\ud83c\udfff\u200d\u2640\ufe0f"), new Emoji("\ud83e\udd3c"), new Emoji("\ud83e\udd3c\u200d\u2642\ufe0f"), new Emoji("\ud83e\udd3c\u200d\u2640\ufe0f"), new Emoji("\ud83e\udd3d", "\ud83e\udd3d\ud83c\udffb", "\ud83e\udd3d\ud83c\udffc", "\ud83e\udd3d\ud83c\udffd", "\ud83e\udd3d\ud83c\udffe", "\ud83e\udd3d\ud83c\udfff"), new Emoji("\ud83e\udd3d\u200d\u2642\ufe0f", "\ud83e\udd3d\ud83c\udffb\u200d\u2642\ufe0f", "\ud83e\udd3d\ud83c\udffc\u200d\u2642\ufe0f", "\ud83e\udd3d\ud83c\udffd\u200d\u2642\ufe0f", "\ud83e\udd3d\ud83c\udffe\u200d\u2642\ufe0f", "\ud83e\udd3d\ud83c\udfff\u200d\u2642\ufe0f"), new Emoji("\ud83e\udd3d\u200d\u2640\ufe0f", "\ud83e\udd3d\ud83c\udffb\u200d\u2640\ufe0f", "\ud83e\udd3d\ud83c\udffc\u200d\u2640\ufe0f", "\ud83e\udd3d\ud83c\udffd\u200d\u2640\ufe0f", "\ud83e\udd3d\ud83c\udffe\u200d\u2640\ufe0f", "\ud83e\udd3d\ud83c\udfff\u200d\u2640\ufe0f"),
+ }, "emoji/People_5.webp");
+
+ private static final EmojiPageModel PAGE_PEOPLE_6 = new StaticEmojiPageModel(R.attr.emoji_category_people, new Emoji[] {
+ new Emoji("\ud83e\udd3e", "\ud83e\udd3e\ud83c\udffb", "\ud83e\udd3e\ud83c\udffc", "\ud83e\udd3e\ud83c\udffd", "\ud83e\udd3e\ud83c\udffe", "\ud83e\udd3e\ud83c\udfff"), new Emoji("\ud83e\udd3e\u200d\u2642\ufe0f", "\ud83e\udd3e\ud83c\udffb\u200d\u2642\ufe0f", "\ud83e\udd3e\ud83c\udffc\u200d\u2642\ufe0f", "\ud83e\udd3e\ud83c\udffd\u200d\u2642\ufe0f", "\ud83e\udd3e\ud83c\udffe\u200d\u2642\ufe0f", "\ud83e\udd3e\ud83c\udfff\u200d\u2642\ufe0f"), new Emoji("\ud83e\udd3e\u200d\u2640\ufe0f", "\ud83e\udd3e\ud83c\udffb\u200d\u2640\ufe0f", "\ud83e\udd3e\ud83c\udffc\u200d\u2640\ufe0f", "\ud83e\udd3e\ud83c\udffd\u200d\u2640\ufe0f", "\ud83e\udd3e\ud83c\udffe\u200d\u2640\ufe0f", "\ud83e\udd3e\ud83c\udfff\u200d\u2640\ufe0f"), new Emoji("\ud83e\udd39", "\ud83e\udd39\ud83c\udffb", "\ud83e\udd39\ud83c\udffc", "\ud83e\udd39\ud83c\udffd", "\ud83e\udd39\ud83c\udffe", "\ud83e\udd39\ud83c\udfff"), new Emoji("\ud83e\udd39\u200d\u2642\ufe0f", "\ud83e\udd39\ud83c\udffb\u200d\u2642\ufe0f", "\ud83e\udd39\ud83c\udffc\u200d\u2642\ufe0f", "\ud83e\udd39\ud83c\udffd\u200d\u2642\ufe0f", "\ud83e\udd39\ud83c\udffe\u200d\u2642\ufe0f", "\ud83e\udd39\ud83c\udfff\u200d\u2642\ufe0f"), new Emoji("\ud83e\udd39\u200d\u2640\ufe0f", "\ud83e\udd39\ud83c\udffb\u200d\u2640\ufe0f", "\ud83e\udd39\ud83c\udffc\u200d\u2640\ufe0f", "\ud83e\udd39\ud83c\udffd\u200d\u2640\ufe0f", "\ud83e\udd39\ud83c\udffe\u200d\u2640\ufe0f", "\ud83e\udd39\ud83c\udfff\u200d\u2640\ufe0f"), new Emoji("\ud83e\uddd8\u200d\u2642\ufe0f", "\ud83e\uddd8\ud83c\udffb\u200d\u2642\ufe0f", "\ud83e\uddd8\ud83c\udffc\u200d\u2642\ufe0f", "\ud83e\uddd8\ud83c\udffd\u200d\u2642\ufe0f", "\ud83e\uddd8\ud83c\udffe\u200d\u2642\ufe0f", "\ud83e\uddd8\ud83c\udfff\u200d\u2642\ufe0f"), new Emoji("\ud83e\uddd8\u200d\u2640\ufe0f", "\ud83e\uddd8\ud83c\udffb\u200d\u2640\ufe0f", "\ud83e\uddd8\ud83c\udffc\u200d\u2640\ufe0f", "\ud83e\uddd8\ud83c\udffd\u200d\u2640\ufe0f", "\ud83e\uddd8\ud83c\udffe\u200d\u2640\ufe0f", "\ud83e\uddd8\ud83c\udfff\u200d\u2640\ufe0f"), new Emoji("\ud83d\udec0", "\ud83d\udec0\ud83c\udffb", "\ud83d\udec0\ud83c\udffc", "\ud83d\udec0\ud83c\udffd", "\ud83d\udec0\ud83c\udffe", "\ud83d\udec0\ud83c\udfff"), new Emoji("\ud83d\udecc", "\ud83d\udecc\ud83c\udffb", "\ud83d\udecc\ud83c\udffc", "\ud83d\udecc\ud83c\udffd", "\ud83d\udecc\ud83c\udffe", "\ud83d\udecc\ud83c\udfff"), new Emoji("\ud83e\uddd1\u200d\ud83e\udd1d\u200d\ud83e\uddd1", "\ud83e\uddd1\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c\udffb", "\ud83e\uddd1\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c\udffc", "\ud83e\uddd1\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c\udffd", "\ud83e\uddd1\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c\udffe", "\ud83e\uddd1\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c\udfff", "\ud83e\uddd1\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c\udffb", "\ud83e\uddd1\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c\udffc", "\ud83e\uddd1\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c\udffd", "\ud83e\uddd1\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c\udffe", "\ud83e\uddd1\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c\udfff", "\ud83e\uddd1\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c\udffb", "\ud83e\uddd1\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c\udffc", "\ud83e\uddd1\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c\udffd", "\ud83e\uddd1\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c\udffe", "\ud83e\uddd1\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c\udfff", "\ud83e\uddd1\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c\udffb", "\ud83e\uddd1\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c\udffc", "\ud83e\uddd1\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c\udffd", "\ud83e\uddd1\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c\udffe", "\ud83e\uddd1\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c\udfff", "\ud83e\uddd1\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c\udffb", "\ud83e\uddd1\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c\udffc", "\ud83e\uddd1\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c\udffd", "\ud83e\uddd1\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c\udffe", "\ud83e\uddd1\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c\udfff"), new Emoji("\ud83d\udc6d", "\ud83d\udc6d\ud83c\udffb", "\ud83d\udc6d\ud83c\udffc", "\ud83d\udc6d\ud83c\udffd", "\ud83d\udc6d\ud83c\udffe", "\ud83d\udc6d\ud83c\udfff", "\ud83d\udc69\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c\udffc", "\ud83d\udc69\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c\udffd", "\ud83d\udc69\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c\udffe", "\ud83d\udc69\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c\udfff", "\ud83d\udc69\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c\udffb", "\ud83d\udc69\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c\udffd", "\ud83d\udc69\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c\udffe", "\ud83d\udc69\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c\udfff", "\ud83d\udc69\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c\udffb", "\ud83d\udc69\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c\udffc", "\ud83d\udc69\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c\udffe", "\ud83d\udc69\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c\udfff", "\ud83d\udc69\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c\udffb", "\ud83d\udc69\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c\udffc", "\ud83d\udc69\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c\udffd", "\ud83d\udc69\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c\udfff", "\ud83d\udc69\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c\udffb", "\ud83d\udc69\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c\udffc", "\ud83d\udc69\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c\udffd", "\ud83d\udc69\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c\udffe"), new Emoji("\ud83d\udc6b", "\ud83d\udc6b\ud83c\udffb", "\ud83d\udc6b\ud83c\udffc", "\ud83d\udc6b\ud83c\udffd", "\ud83d\udc6b\ud83c\udffe", "\ud83d\udc6b\ud83c\udfff", "\ud83d\udc69\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c\udffc", "\ud83d\udc69\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c\udffd", "\ud83d\udc69\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c\udffe", "\ud83d\udc69\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c\udfff", "\ud83d\udc69\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c\udffb", "\ud83d\udc69\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c\udffd", "\ud83d\udc69\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c\udffe", "\ud83d\udc69\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c\udfff", "\ud83d\udc69\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c\udffb", "\ud83d\udc69\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c\udffc", "\ud83d\udc69\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c\udffe", "\ud83d\udc69\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c\udfff", "\ud83d\udc69\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c\udffb", "\ud83d\udc69\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c\udffc", "\ud83d\udc69\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c\udffd", "\ud83d\udc69\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c\udfff", "\ud83d\udc69\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c\udffb", "\ud83d\udc69\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c\udffc", "\ud83d\udc69\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c\udffd", "\ud83d\udc69\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c\udffe"), new Emoji("\ud83d\udc6c", "\ud83d\udc6c\ud83c\udffb", "\ud83d\udc6c\ud83c\udffc", "\ud83d\udc6c\ud83c\udffd", "\ud83d\udc6c\ud83c\udffe", "\ud83d\udc6c\ud83c\udfff", "\ud83d\udc68\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c\udffc", "\ud83d\udc68\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c\udffd", "\ud83d\udc68\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c\udffe", "\ud83d\udc68\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c\udfff", "\ud83d\udc68\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c\udffb", "\ud83d\udc68\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c\udffd", "\ud83d\udc68\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c\udffe", "\ud83d\udc68\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c\udfff", "\ud83d\udc68\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c\udffb", "\ud83d\udc68\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c\udffc", "\ud83d\udc68\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c\udffe", "\ud83d\udc68\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c\udfff", "\ud83d\udc68\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c\udffb", "\ud83d\udc68\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c\udffc", "\ud83d\udc68\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c\udffd", "\ud83d\udc68\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c\udfff", "\ud83d\udc68\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c\udffb", "\ud83d\udc68\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c\udffc", "\ud83d\udc68\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c\udffd", "\ud83d\udc68\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c\udffe"), new Emoji("\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68"), new Emoji("\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68"), new Emoji("\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69"), new Emoji("\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc68"), new Emoji("\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc68"), new Emoji("\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc69"), new Emoji("\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc66"), new Emoji("\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67"), new Emoji("\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66"), new Emoji("\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66"), new Emoji("\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67"), new Emoji("\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66"), new Emoji("\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67"), new Emoji("\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc66"), new Emoji("\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66"), new Emoji("\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc67"), new Emoji("\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66"), new Emoji("\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67"), new Emoji("\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66"), new Emoji("\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66"), new Emoji("\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67"), new Emoji("\ud83d\udc68\u200d\ud83d\udc66"), new Emoji("\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66"), new Emoji("\ud83d\udc68\u200d\ud83d\udc67"), new Emoji("\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc66"), new Emoji("\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc67"), new Emoji("\ud83d\udc69\u200d\ud83d\udc66"), new Emoji("\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66"), new Emoji("\ud83d\udc69\u200d\ud83d\udc67"), new Emoji("\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66"), new Emoji("\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67"), new Emoji("\ud83d\udde3\ufe0f"), new Emoji("\ud83d\udc64"), new Emoji("\ud83d\udc65"), new Emoji("\ud83d\udc63"),
+ }, "emoji/People_6.webp");
+
+ private static final EmojiPageModel PAGE_OBJECTS = new StaticEmojiPageModel(R.attr.emoji_category_objects, new Emoji[] {
+ new Emoji("\ud83d\udc53"), new Emoji("\ud83d\udd76\ufe0f"), new Emoji("\ud83e\udd7d"), new Emoji("\ud83e\udd7c"), new Emoji("\ud83e\uddba"), new Emoji("\ud83d\udc54"), new Emoji("\ud83d\udc55"), new Emoji("\ud83d\udc56"), new Emoji("\ud83e\udde3"), new Emoji("\ud83e\udde4"), new Emoji("\ud83e\udde5"), new Emoji("\ud83e\udde6"), new Emoji("\ud83d\udc57"), new Emoji("\ud83d\udc58"), new Emoji("\ud83e\udd7b"), new Emoji("\ud83e\ude71"), new Emoji("\ud83e\ude72"), new Emoji("\ud83e\ude73"), new Emoji("\ud83d\udc59"), new Emoji("\ud83d\udc5a"), new Emoji("\ud83d\udc5b"), new Emoji("\ud83d\udc5c"), new Emoji("\ud83d\udc5d"), new Emoji("\ud83d\udecd\ufe0f"), new Emoji("\ud83c\udf92"), new Emoji("\ud83d\udc5e"), new Emoji("\ud83d\udc5f"), new Emoji("\ud83e\udd7e"), new Emoji("\ud83e\udd7f"), new Emoji("\ud83d\udc60"), new Emoji("\ud83d\udc61"), new Emoji("\ud83e\ude70"), new Emoji("\ud83d\udc62"), new Emoji("\ud83d\udc51"), new Emoji("\ud83d\udc52"), new Emoji("\ud83c\udfa9"), new Emoji("\ud83c\udf93"), new Emoji("\ud83e\udde2"), new Emoji("\u26d1\ufe0f"), new Emoji("\ud83d\udcff"), new Emoji("\ud83d\udc84"), new Emoji("\ud83d\udc8d"), new Emoji("\ud83d\udc8e"), new Emoji("\ud83d\udd07"), new Emoji("\ud83d\udd08"), new Emoji("\ud83d\udd09"), new Emoji("\ud83d\udd0a"), new Emoji("\ud83d\udce2"), new Emoji("\ud83d\udce3"), new Emoji("\ud83d\udcef"), new Emoji("\ud83d\udd14"), new Emoji("\ud83d\udd15"), new Emoji("\ud83c\udfbc"), new Emoji("\ud83c\udfb5"), new Emoji("\ud83c\udfb6"), new Emoji("\ud83c\udf99\ufe0f"), new Emoji("\ud83c\udf9a\ufe0f"), new Emoji("\ud83c\udf9b\ufe0f"), new Emoji("\ud83c\udfa4"), new Emoji("\ud83c\udfa7"), new Emoji("\ud83d\udcfb"), new Emoji("\ud83c\udfb7"), new Emoji("\ud83c\udfb8"), new Emoji("\ud83c\udfb9"), new Emoji("\ud83c\udfba"), new Emoji("\ud83c\udfbb"), new Emoji("\ud83e\ude95"), new Emoji("\ud83e\udd41"), new Emoji("\ud83d\udcf1"), new Emoji("\ud83d\udcf2"), new Emoji("\u260e\ufe0f"), new Emoji("\ud83d\udcde"), new Emoji("\ud83d\udcdf"), new Emoji("\ud83d\udce0"), new Emoji("\ud83d\udd0b"), new Emoji("\ud83d\udd0c"), new Emoji("\ud83d\udcbb"), new Emoji("\ud83d\udda5\ufe0f"), new Emoji("\ud83d\udda8\ufe0f"), new Emoji("\u2328\ufe0f"), new Emoji("\ud83d\uddb1\ufe0f"), new Emoji("\ud83d\uddb2\ufe0f"), new Emoji("\ud83d\udcbd"), new Emoji("\ud83d\udcbe"), new Emoji("\ud83d\udcbf"), new Emoji("\ud83d\udcc0"), new Emoji("\ud83e\uddee"), new Emoji("\ud83c\udfa5"), new Emoji("\ud83c\udf9e\ufe0f"), new Emoji("\ud83d\udcfd\ufe0f"), new Emoji("\ud83c\udfac"), new Emoji("\ud83d\udcfa"), new Emoji("\ud83d\udcf7"), new Emoji("\ud83d\udcf8"), new Emoji("\ud83d\udcf9"), new Emoji("\ud83d\udcfc"), new Emoji("\ud83d\udd0d"), new Emoji("\ud83d\udd0e"), new Emoji("\ud83d\udd6f\ufe0f"), new Emoji("\ud83d\udca1"), new Emoji("\ud83d\udd26"), new Emoji("\ud83c\udfee"), new Emoji("\ud83e\ude94"), new Emoji("\ud83d\udcd4"), new Emoji("\ud83d\udcd5"), new Emoji("\ud83d\udcd6"), new Emoji("\ud83d\udcd7"), new Emoji("\ud83d\udcd8"), new Emoji("\ud83d\udcd9"), new Emoji("\ud83d\udcda"), new Emoji("\ud83d\udcd3"), new Emoji("\ud83d\udcd2"), new Emoji("\ud83d\udcc3"), new Emoji("\ud83d\udcdc"), new Emoji("\ud83d\udcc4"), new Emoji("\ud83d\udcf0"), new Emoji("\ud83d\uddde\ufe0f"), new Emoji("\ud83d\udcd1"), new Emoji("\ud83d\udd16"), new Emoji("\ud83c\udff7\ufe0f"), new Emoji("\ud83d\udcb0"), new Emoji("\ud83d\udcb4"), new Emoji("\ud83d\udcb5"), new Emoji("\ud83d\udcb6"), new Emoji("\ud83d\udcb7"), new Emoji("\ud83d\udcb8"), new Emoji("\ud83d\udcb3"), new Emoji("\ud83e\uddfe"), new Emoji("\ud83d\udcb9"), new Emoji("\ud83d\udcb1"), new Emoji("\ud83d\udcb2"), new Emoji("\u2709\ufe0f"), new Emoji("\ud83d\udce7"), new Emoji("\ud83d\udce8"), new Emoji("\ud83d\udce9"), new Emoji("\ud83d\udce4"), new Emoji("\ud83d\udce5"), new Emoji("\ud83d\udce6"), new Emoji("\ud83d\udceb"), new Emoji("\ud83d\udcea"), new Emoji("\ud83d\udcec"), new Emoji("\ud83d\udced"), new Emoji("\ud83d\udcee"), new Emoji("\ud83d\uddf3\ufe0f"), new Emoji("\u270f\ufe0f"), new Emoji("\u2712\ufe0f"), new Emoji("\ud83d\udd8b\ufe0f"), new Emoji("\ud83d\udd8a\ufe0f"), new Emoji("\ud83d\udd8c\ufe0f"), new Emoji("\ud83d\udd8d\ufe0f"), new Emoji("\ud83d\udcdd"), new Emoji("\ud83d\udcbc"), new Emoji("\ud83d\udcc1"), new Emoji("\ud83d\udcc2"), new Emoji("\ud83d\uddc2\ufe0f"), new Emoji("\ud83d\udcc5"), new Emoji("\ud83d\udcc6"), new Emoji("\ud83d\uddd2\ufe0f"), new Emoji("\ud83d\uddd3\ufe0f"), new Emoji("\ud83d\udcc7"), new Emoji("\ud83d\udcc8"), new Emoji("\ud83d\udcc9"), new Emoji("\ud83d\udcca"), new Emoji("\ud83d\udccb"), new Emoji("\ud83d\udccc"), new Emoji("\ud83d\udccd"), new Emoji("\ud83d\udcce"), new Emoji("\ud83d\udd87\ufe0f"), new Emoji("\ud83d\udccf"), new Emoji("\ud83d\udcd0"), new Emoji("\u2702\ufe0f"), new Emoji("\ud83d\uddc3\ufe0f"), new Emoji("\ud83d\uddc4\ufe0f"), new Emoji("\ud83d\uddd1\ufe0f"), new Emoji("\ud83d\udd12"), new Emoji("\ud83d\udd13"), new Emoji("\ud83d\udd0f"), new Emoji("\ud83d\udd10"), new Emoji("\ud83d\udd11"), new Emoji("\ud83d\udddd\ufe0f"), new Emoji("\ud83d\udd28"), new Emoji("\ud83e\ude93"), new Emoji("\u26cf\ufe0f"), new Emoji("\u2692\ufe0f"), new Emoji("\ud83d\udee0\ufe0f"), new Emoji("\ud83d\udde1\ufe0f"), new Emoji("\u2694\ufe0f"), new Emoji("\ud83d\udd2b"), new Emoji("\ud83c\udff9"), new Emoji("\ud83d\udee1\ufe0f"), new Emoji("\ud83d\udd27"), new Emoji("\ud83d\udd29"), new Emoji("\u2699\ufe0f"), new Emoji("\ud83d\udddc\ufe0f"), new Emoji("\u2696\ufe0f"), new Emoji("\ud83e\uddaf"), new Emoji("\ud83d\udd17"), new Emoji("\u26d3\ufe0f"), new Emoji("\ud83e\uddf0"), new Emoji("\ud83e\uddf2"), new Emoji("\u2697\ufe0f"), new Emoji("\ud83e\uddea"), new Emoji("\ud83e\uddeb"), new Emoji("\ud83e\uddec"), new Emoji("\ud83d\udd2c"), new Emoji("\ud83d\udd2d"), new Emoji("\ud83d\udce1"), new Emoji("\ud83d\udc89"), new Emoji("\ud83e\ude78"), new Emoji("\ud83d\udc8a"), new Emoji("\ud83e\ude79"), new Emoji("\ud83e\ude7a"), new Emoji("\ud83d\udeaa"), new Emoji("\ud83d\udecf\ufe0f"), new Emoji("\ud83d\udecb\ufe0f"), new Emoji("\ud83e\ude91"), new Emoji("\ud83d\udebd"), new Emoji("\ud83d\udebf"), new Emoji("\ud83d\udec1"), new Emoji("\ud83e\ude92"), new Emoji("\ud83e\uddf4"), new Emoji("\ud83e\uddf7"), new Emoji("\ud83e\uddf9"), new Emoji("\ud83e\uddfa"), new Emoji("\ud83e\uddfb"), new Emoji("\ud83e\uddfc"), new Emoji("\ud83e\uddfd"), new Emoji("\ud83e\uddef"), new Emoji("\ud83d\uded2"), new Emoji("\ud83d\udeac"), new Emoji("\u26b0\ufe0f"), new Emoji("\u26b1\ufe0f"), new Emoji("\ud83d\uddff"),
+ }, "emoji/Objects.webp");
+
+ private static final EmojiPageModel PAGE_PEOPLE = new CompositeEmojiPageModel(R.attr.emoji_category_people, PAGE_PEOPLE_0, PAGE_PEOPLE_1, PAGE_PEOPLE_2, PAGE_PEOPLE_3, PAGE_PEOPLE_4, PAGE_PEOPLE_5, PAGE_PEOPLE_6);
+
+ private static final EmojiPageModel PAGE_FLAGS = new CompositeEmojiPageModel(R.attr.emoji_category_flags, PAGE_FLAGS_0, PAGE_FLAGS_1);
+
+ private static final EmojiPageModel PAGE_EMOTICONS = new StaticEmojiPageModel(R.attr.emoji_category_emoticons, new String[] {
":-)", ";-)", "(-:", ":->", ":-D", "\\o/",
":-P", "B-)", ":-$", ":-*", "O:-)", "=-O",
"O_O", "O_o", "o_O", ":O", ":-!", ":-x",
@@ -47,49 +88,219 @@ class EmojiPages {
"(\u256f\u00b0\u25a1\u00b0)\u256f\ufe35", "\u253b\u2501\u253b",
"\u252c\u2500\u252c", "\u30ce(\u00b0\u2013\u00b0\u30ce)",
"(^._.^)\uff89", "\u0e05^\u2022\ufecc\u2022^\u0e05",
- "(\u2022_\u2022)", " \u25a0-\u25a0\u00ac <(\u2022_\u2022) ",
- "(\u25a0_\u25a0\u00ac)"
- }, null));
+ "\u0295\u2022\u1d25\u2022\u0294", "(\u2022_\u2022)",
+ " \u25a0-\u25a0\u00ac <(\u2022_\u2022) ", "(\u25a0_\u25a0\u00ac)",
+ "\u01aa(\u0693\u05f2)\u200e\u01aa\u200b\u200b"
+ }, null);
+
+ static final List DISPLAY_PAGES = Arrays.asList(PAGE_PEOPLE, PAGE_NATURE, PAGE_FOODS, PAGE_ACTIVITY, PAGE_PLACES, PAGE_OBJECTS, PAGE_SYMBOLS, PAGE_FLAGS, PAGE_EMOTICONS);
+
+ static final List DATA_PAGES = Arrays.asList(PAGE_PEOPLE_0, PAGE_PEOPLE_1, PAGE_PEOPLE_2, PAGE_PEOPLE_3, PAGE_PEOPLE_4, PAGE_PEOPLE_5, PAGE_PEOPLE_6, PAGE_NATURE, PAGE_FOODS, PAGE_ACTIVITY, PAGE_PLACES, PAGE_OBJECTS, PAGE_SYMBOLS, PAGE_FLAGS_0, PAGE_FLAGS_1, PAGE_EMOTICONS);
static final List> OBSOLETE = new LinkedList>() {{
- add(new Pair<>("\ud83c\udfc3", "\ud83c\udfc3\u200d\u2642\ufe0f"));
- add(new Pair<>("\ud83c\udfc4", "\ud83c\udfc4\u200d\u2642\ufe0f"));
- add(new Pair<>("\ud83c\udfca", "\ud83c\udfca\u200d\u2642\ufe0f"));
- add(new Pair<>("\ud83c\udfcb\ufe0f", "\ud83c\udfcb\ufe0f\u200d\u2642\ufe0f"));
- add(new Pair<>("\ud83c\udfcc\ufe0f", "\ud83c\udfcc\ufe0f\u200d\u2642\ufe0f"));
- add(new Pair<>("\ud83d\udc6a", "\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc66"));
- add(new Pair<>("\ud83d\udc6e", "\ud83d\udc6e\u200d\u2642\ufe0f"));
- add(new Pair<>("\ud83d\udc6f", "\ud83d\udc6f\u200d\u2640\ufe0f"));
add(new Pair<>("\ud83d\udc71", "\ud83d\udc71\u200d\u2642\ufe0f"));
- add(new Pair<>("\ud83d\udc73", "\ud83d\udc73\u200d\u2642\ufe0f"));
- add(new Pair<>("\ud83d\udc77", "\ud83d\udc77\u200d\u2642\ufe0f"));
- add(new Pair<>("\ud83d\udc81", "\ud83d\udc81\u200d\u2640\ufe0f"));
- add(new Pair<>("\ud83d\udc82", "\ud83d\udc82\u200d\u2642\ufe0f"));
- add(new Pair<>("\ud83d\udc86", "\ud83d\udc86\u200d\u2640\ufe0f"));
- add(new Pair<>("\ud83d\udc87", "\ud83d\udc87\u200d\u2640\ufe0f"));
- add(new Pair<>("\ud83d\udc8f", "\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68"));
- add(new Pair<>("\ud83d\udc91", "\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc68"));
- add(new Pair<>("\ud83d\udd75\ufe0f", "\ud83d\udd75\ufe0f\u200d\u2642\ufe0f"));
- add(new Pair<>("\ud83d\ude45", "\ud83d\ude45\u200d\u2640\ufe0f"));
- add(new Pair<>("\ud83d\ude46", "\ud83d\ude46\u200d\u2640\ufe0f"));
- add(new Pair<>("\ud83d\ude47", "\ud83d\ude47\u200d\u2642\ufe0f"));
- add(new Pair<>("\ud83d\ude4b", "\ud83d\ude4b\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83d\udc71\ud83c\udffb", "\ud83d\udc71\ud83c\udffb\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\udc71\ud83c\udffc", "\ud83d\udc71\ud83c\udffc\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\udc71\ud83c\udffd", "\ud83d\udc71\ud83c\udffd\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\udc71\ud83c\udffe", "\ud83d\udc71\ud83c\udffe\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\udc71\ud83c\udfff", "\ud83d\udc71\ud83c\udfff\u200d\u2642\ufe0f"));
add(new Pair<>("\ud83d\ude4d", "\ud83d\ude4d\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83d\ude4d\ud83c\udffb", "\ud83d\ude4d\ud83c\udffb\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83d\ude4d\ud83c\udffc", "\ud83d\ude4d\ud83c\udffc\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83d\ude4d\ud83c\udffd", "\ud83d\ude4d\ud83c\udffd\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83d\ude4d\ud83c\udffe", "\ud83d\ude4d\ud83c\udffe\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83d\ude4d\ud83c\udfff", "\ud83d\ude4d\ud83c\udfff\u200d\u2640\ufe0f"));
add(new Pair<>("\ud83d\ude4e", "\ud83d\ude4e\u200d\u2640\ufe0f"));
- add(new Pair<>("\ud83d\udea3", "\ud83d\udea3\u200d\u2642\ufe0f"));
- add(new Pair<>("\ud83d\udeb4", "\ud83d\udeb4\u200d\u2642\ufe0f"));
- add(new Pair<>("\ud83d\udeb5", "\ud83d\udeb5\u200d\u2642\ufe0f"));
- add(new Pair<>("\ud83d\udeb6", "\ud83d\udeb6\u200d\u2642\ufe0f"));
- add(new Pair<>("\ud83e\uddd6", "\ud83e\uddd6\u200d\u2642\ufe0f"));
- add(new Pair<>("\ud83e\uddd7", "\ud83e\uddd7\u200d\u2640\ufe0f"));
- add(new Pair<>("\ud83e\uddd8", "\ud83e\uddd8\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83d\ude4e\ud83c\udffb", "\ud83d\ude4e\ud83c\udffb\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83d\ude4e\ud83c\udffc", "\ud83d\ude4e\ud83c\udffc\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83d\ude4e\ud83c\udffd", "\ud83d\ude4e\ud83c\udffd\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83d\ude4e\ud83c\udffe", "\ud83d\ude4e\ud83c\udffe\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83d\ude4e\ud83c\udfff", "\ud83d\ude4e\ud83c\udfff\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83d\ude45", "\ud83d\ude45\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83d\ude45\ud83c\udffb", "\ud83d\ude45\ud83c\udffb\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83d\ude45\ud83c\udffc", "\ud83d\ude45\ud83c\udffc\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83d\ude45\ud83c\udffd", "\ud83d\ude45\ud83c\udffd\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83d\ude45\ud83c\udffe", "\ud83d\ude45\ud83c\udffe\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83d\ude45\ud83c\udfff", "\ud83d\ude45\ud83c\udfff\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83d\ude46", "\ud83d\ude46\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83d\ude46\ud83c\udffb", "\ud83d\ude46\ud83c\udffb\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83d\ude46\ud83c\udffc", "\ud83d\ude46\ud83c\udffc\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83d\ude46\ud83c\udffd", "\ud83d\ude46\ud83c\udffd\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83d\ude46\ud83c\udffe", "\ud83d\ude46\ud83c\udffe\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83d\ude46\ud83c\udfff", "\ud83d\ude46\ud83c\udfff\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83d\udc81", "\ud83d\udc81\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83d\udc81\ud83c\udffb", "\ud83d\udc81\ud83c\udffb\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83d\udc81\ud83c\udffc", "\ud83d\udc81\ud83c\udffc\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83d\udc81\ud83c\udffd", "\ud83d\udc81\ud83c\udffd\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83d\udc81\ud83c\udffe", "\ud83d\udc81\ud83c\udffe\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83d\udc81\ud83c\udfff", "\ud83d\udc81\ud83c\udfff\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83d\ude4b", "\ud83d\ude4b\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83d\ude4b\ud83c\udffb", "\ud83d\ude4b\ud83c\udffb\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83d\ude4b\ud83c\udffc", "\ud83d\ude4b\ud83c\udffc\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83d\ude4b\ud83c\udffd", "\ud83d\ude4b\ud83c\udffd\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83d\ude4b\ud83c\udffe", "\ud83d\ude4b\ud83c\udffe\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83d\ude4b\ud83c\udfff", "\ud83d\ude4b\ud83c\udfff\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83d\ude47", "\ud83d\ude47\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\ude47\ud83c\udffb", "\ud83d\ude47\ud83c\udffb\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\ude47\ud83c\udffc", "\ud83d\ude47\ud83c\udffc\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\ude47\ud83c\udffd", "\ud83d\ude47\ud83c\udffd\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\ude47\ud83c\udffe", "\ud83d\ude47\ud83c\udffe\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\ude47\ud83c\udfff", "\ud83d\ude47\ud83c\udfff\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\udc6e", "\ud83d\udc6e\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\udc6e\ud83c\udffb", "\ud83d\udc6e\ud83c\udffb\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\udc6e\ud83c\udffc", "\ud83d\udc6e\ud83c\udffc\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\udc6e\ud83c\udffd", "\ud83d\udc6e\ud83c\udffd\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\udc6e\ud83c\udffe", "\ud83d\udc6e\ud83c\udffe\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\udc6e\ud83c\udfff", "\ud83d\udc6e\ud83c\udfff\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\udd75\ufe0f", "\ud83d\udd75\ufe0f\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\udd75\ud83c\udffb", "\ud83d\udd75\ud83c\udffb\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\udd75\ud83c\udffc", "\ud83d\udd75\ud83c\udffc\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\udd75\ud83c\udffd", "\ud83d\udd75\ud83c\udffd\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\udd75\ud83c\udffe", "\ud83d\udd75\ud83c\udffe\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\udd75\ud83c\udfff", "\ud83d\udd75\ud83c\udfff\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\udc82", "\ud83d\udc82\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\udc82\ud83c\udffb", "\ud83d\udc82\ud83c\udffb\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\udc82\ud83c\udffc", "\ud83d\udc82\ud83c\udffc\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\udc82\ud83c\udffd", "\ud83d\udc82\ud83c\udffd\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\udc82\ud83c\udffe", "\ud83d\udc82\ud83c\udffe\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\udc82\ud83c\udfff", "\ud83d\udc82\ud83c\udfff\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\udc77", "\ud83d\udc77\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\udc77\ud83c\udffb", "\ud83d\udc77\ud83c\udffb\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\udc77\ud83c\udffc", "\ud83d\udc77\ud83c\udffc\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\udc77\ud83c\udffd", "\ud83d\udc77\ud83c\udffd\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\udc77\ud83c\udffe", "\ud83d\udc77\ud83c\udffe\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\udc77\ud83c\udfff", "\ud83d\udc77\ud83c\udfff\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\udc73", "\ud83d\udc73\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\udc73\ud83c\udffb", "\ud83d\udc73\ud83c\udffb\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\udc73\ud83c\udffc", "\ud83d\udc73\ud83c\udffc\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\udc73\ud83c\udffd", "\ud83d\udc73\ud83c\udffd\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\udc73\ud83c\udffe", "\ud83d\udc73\ud83c\udffe\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\udc73\ud83c\udfff", "\ud83d\udc73\ud83c\udfff\u200d\u2642\ufe0f"));
add(new Pair<>("\ud83e\uddd9", "\ud83e\uddd9\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83e\uddd9\ud83c\udffb", "\ud83e\uddd9\ud83c\udffb\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83e\uddd9\ud83c\udffc", "\ud83e\uddd9\ud83c\udffc\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83e\uddd9\ud83c\udffd", "\ud83e\uddd9\ud83c\udffd\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83e\uddd9\ud83c\udffe", "\ud83e\uddd9\ud83c\udffe\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83e\uddd9\ud83c\udfff", "\ud83e\uddd9\ud83c\udfff\u200d\u2640\ufe0f"));
add(new Pair<>("\ud83e\uddda", "\ud83e\uddda\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83e\uddda\ud83c\udffb", "\ud83e\uddda\ud83c\udffb\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83e\uddda\ud83c\udffc", "\ud83e\uddda\ud83c\udffc\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83e\uddda\ud83c\udffd", "\ud83e\uddda\ud83c\udffd\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83e\uddda\ud83c\udffe", "\ud83e\uddda\ud83c\udffe\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83e\uddda\ud83c\udfff", "\ud83e\uddda\ud83c\udfff\u200d\u2640\ufe0f"));
add(new Pair<>("\ud83e\udddb", "\ud83e\udddb\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83e\udddb\ud83c\udffb", "\ud83e\udddb\ud83c\udffb\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83e\udddb\ud83c\udffc", "\ud83e\udddb\ud83c\udffc\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83e\udddb\ud83c\udffd", "\ud83e\udddb\ud83c\udffd\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83e\udddb\ud83c\udffe", "\ud83e\udddb\ud83c\udffe\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83e\udddb\ud83c\udfff", "\ud83e\udddb\ud83c\udfff\u200d\u2640\ufe0f"));
add(new Pair<>("\ud83e\udddc", "\ud83e\udddc\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83e\udddc\ud83c\udffb", "\ud83e\udddc\ud83c\udffb\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83e\udddc\ud83c\udffc", "\ud83e\udddc\ud83c\udffc\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83e\udddc\ud83c\udffd", "\ud83e\udddc\ud83c\udffd\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83e\udddc\ud83c\udffe", "\ud83e\udddc\ud83c\udffe\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83e\udddc\ud83c\udfff", "\ud83e\udddc\ud83c\udfff\u200d\u2642\ufe0f"));
add(new Pair<>("\ud83e\udddd", "\ud83e\udddd\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83e\udddd\ud83c\udffb", "\ud83e\udddd\ud83c\udffb\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83e\udddd\ud83c\udffc", "\ud83e\udddd\ud83c\udffc\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83e\udddd\ud83c\udffd", "\ud83e\udddd\ud83c\udffd\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83e\udddd\ud83c\udffe", "\ud83e\udddd\ud83c\udffe\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83e\udddd\ud83c\udfff", "\ud83e\udddd\ud83c\udfff\u200d\u2642\ufe0f"));
add(new Pair<>("\ud83e\uddde", "\ud83e\uddde\u200d\u2642\ufe0f"));
add(new Pair<>("\ud83e\udddf", "\ud83e\udddf\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\udc86", "\ud83d\udc86\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83d\udc86\ud83c\udffb", "\ud83d\udc86\ud83c\udffb\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83d\udc86\ud83c\udffc", "\ud83d\udc86\ud83c\udffc\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83d\udc86\ud83c\udffd", "\ud83d\udc86\ud83c\udffd\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83d\udc86\ud83c\udffe", "\ud83d\udc86\ud83c\udffe\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83d\udc86\ud83c\udfff", "\ud83d\udc86\ud83c\udfff\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83d\udc87", "\ud83d\udc87\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83d\udc87\ud83c\udffb", "\ud83d\udc87\ud83c\udffb\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83d\udc87\ud83c\udffc", "\ud83d\udc87\ud83c\udffc\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83d\udc87\ud83c\udffd", "\ud83d\udc87\ud83c\udffd\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83d\udc87\ud83c\udffe", "\ud83d\udc87\ud83c\udffe\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83d\udc87\ud83c\udfff", "\ud83d\udc87\ud83c\udfff\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83d\udeb6", "\ud83d\udeb6\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\udeb6\ud83c\udffb", "\ud83d\udeb6\ud83c\udffb\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\udeb6\ud83c\udffc", "\ud83d\udeb6\ud83c\udffc\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\udeb6\ud83c\udffd", "\ud83d\udeb6\ud83c\udffd\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\udeb6\ud83c\udffe", "\ud83d\udeb6\ud83c\udffe\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\udeb6\ud83c\udfff", "\ud83d\udeb6\ud83c\udfff\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83c\udfc3", "\ud83c\udfc3\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83c\udfc3\ud83c\udffb", "\ud83c\udfc3\ud83c\udffb\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83c\udfc3\ud83c\udffc", "\ud83c\udfc3\ud83c\udffc\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83c\udfc3\ud83c\udffd", "\ud83c\udfc3\ud83c\udffd\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83c\udfc3\ud83c\udffe", "\ud83c\udfc3\ud83c\udffe\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83c\udfc3\ud83c\udfff", "\ud83c\udfc3\ud83c\udfff\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\udc6f", "\ud83d\udc6f\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83e\uddd6", "\ud83e\uddd6\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83e\uddd6\ud83c\udffb", "\ud83e\uddd6\ud83c\udffb\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83e\uddd6\ud83c\udffc", "\ud83e\uddd6\ud83c\udffc\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83e\uddd6\ud83c\udffd", "\ud83e\uddd6\ud83c\udffd\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83e\uddd6\ud83c\udffe", "\ud83e\uddd6\ud83c\udffe\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83e\uddd6\ud83c\udfff", "\ud83e\uddd6\ud83c\udfff\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83e\uddd7", "\ud83e\uddd7\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83e\uddd7\ud83c\udffb", "\ud83e\uddd7\ud83c\udffb\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83e\uddd7\ud83c\udffc", "\ud83e\uddd7\ud83c\udffc\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83e\uddd7\ud83c\udffd", "\ud83e\uddd7\ud83c\udffd\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83e\uddd7\ud83c\udffe", "\ud83e\uddd7\ud83c\udffe\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83e\uddd7\ud83c\udfff", "\ud83e\uddd7\ud83c\udfff\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83c\udfcc\ufe0f", "\ud83c\udfcc\ufe0f\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83c\udfcc\ud83c\udffb", "\ud83c\udfcc\ud83c\udffb\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83c\udfcc\ud83c\udffc", "\ud83c\udfcc\ud83c\udffc\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83c\udfcc\ud83c\udffd", "\ud83c\udfcc\ud83c\udffd\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83c\udfcc\ud83c\udffe", "\ud83c\udfcc\ud83c\udffe\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83c\udfcc\ud83c\udfff", "\ud83c\udfcc\ud83c\udfff\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83c\udfc4", "\ud83c\udfc4\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83c\udfc4\ud83c\udffb", "\ud83c\udfc4\ud83c\udffb\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83c\udfc4\ud83c\udffc", "\ud83c\udfc4\ud83c\udffc\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83c\udfc4\ud83c\udffd", "\ud83c\udfc4\ud83c\udffd\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83c\udfc4\ud83c\udffe", "\ud83c\udfc4\ud83c\udffe\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83c\udfc4\ud83c\udfff", "\ud83c\udfc4\ud83c\udfff\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\udea3", "\ud83d\udea3\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\udea3\ud83c\udffb", "\ud83d\udea3\ud83c\udffb\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\udea3\ud83c\udffc", "\ud83d\udea3\ud83c\udffc\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\udea3\ud83c\udffd", "\ud83d\udea3\ud83c\udffd\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\udea3\ud83c\udffe", "\ud83d\udea3\ud83c\udffe\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\udea3\ud83c\udfff", "\ud83d\udea3\ud83c\udfff\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83c\udfca", "\ud83c\udfca\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83c\udfca\ud83c\udffb", "\ud83c\udfca\ud83c\udffb\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83c\udfca\ud83c\udffc", "\ud83c\udfca\ud83c\udffc\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83c\udfca\ud83c\udffd", "\ud83c\udfca\ud83c\udffd\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83c\udfca\ud83c\udffe", "\ud83c\udfca\ud83c\udffe\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83c\udfca\ud83c\udfff", "\ud83c\udfca\ud83c\udfff\u200d\u2642\ufe0f"));
add(new Pair<>("\u26f9\ufe0f", "\u26f9\ufe0f\u200d\u2642\ufe0f"));
+ add(new Pair<>("\u26f9\ud83c\udffb", "\u26f9\ud83c\udffb\u200d\u2642\ufe0f"));
+ add(new Pair<>("\u26f9\ud83c\udffc", "\u26f9\ud83c\udffc\u200d\u2642\ufe0f"));
+ add(new Pair<>("\u26f9\ud83c\udffd", "\u26f9\ud83c\udffd\u200d\u2642\ufe0f"));
+ add(new Pair<>("\u26f9\ud83c\udffe", "\u26f9\ud83c\udffe\u200d\u2642\ufe0f"));
+ add(new Pair<>("\u26f9\ud83c\udfff", "\u26f9\ud83c\udfff\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83c\udfcb\ufe0f", "\ud83c\udfcb\ufe0f\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83c\udfcb\ud83c\udffb", "\ud83c\udfcb\ud83c\udffb\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83c\udfcb\ud83c\udffc", "\ud83c\udfcb\ud83c\udffc\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83c\udfcb\ud83c\udffd", "\ud83c\udfcb\ud83c\udffd\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83c\udfcb\ud83c\udffe", "\ud83c\udfcb\ud83c\udffe\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83c\udfcb\ud83c\udfff", "\ud83c\udfcb\ud83c\udfff\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\udeb4", "\ud83d\udeb4\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\udeb4\ud83c\udffb", "\ud83d\udeb4\ud83c\udffb\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\udeb4\ud83c\udffc", "\ud83d\udeb4\ud83c\udffc\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\udeb4\ud83c\udffd", "\ud83d\udeb4\ud83c\udffd\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\udeb4\ud83c\udffe", "\ud83d\udeb4\ud83c\udffe\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\udeb4\ud83c\udfff", "\ud83d\udeb4\ud83c\udfff\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\udeb5", "\ud83d\udeb5\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\udeb5\ud83c\udffb", "\ud83d\udeb5\ud83c\udffb\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\udeb5\ud83c\udffc", "\ud83d\udeb5\ud83c\udffc\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\udeb5\ud83c\udffd", "\ud83d\udeb5\ud83c\udffd\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\udeb5\ud83c\udffe", "\ud83d\udeb5\ud83c\udffe\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83d\udeb5\ud83c\udfff", "\ud83d\udeb5\ud83c\udfff\u200d\u2642\ufe0f"));
+ add(new Pair<>("\ud83e\uddd8", "\ud83e\uddd8\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83e\uddd8\ud83c\udffb", "\ud83e\uddd8\ud83c\udffb\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83e\uddd8\ud83c\udffc", "\ud83e\uddd8\ud83c\udffc\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83e\uddd8\ud83c\udffd", "\ud83e\uddd8\ud83c\udffd\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83e\uddd8\ud83c\udffe", "\ud83e\uddd8\ud83c\udffe\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83e\uddd8\ud83c\udfff", "\ud83e\uddd8\ud83c\udfff\u200d\u2640\ufe0f"));
+ add(new Pair<>("\ud83d\udc8f", "\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68"));
+ add(new Pair<>("\ud83d\udc91", "\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc68"));
+ add(new Pair<>("\ud83d\udc6a", "\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc66"));
}};
}
diff --git a/src/org/thoughtcrime/securesms/components/emoji/EmojiProvider.java b/src/org/thoughtcrime/securesms/components/emoji/EmojiProvider.java
index cbdf2d14d..acebbe5d0 100644
--- a/src/org/thoughtcrime/securesms/components/emoji/EmojiProvider.java
+++ b/src/org/thoughtcrime/securesms/components/emoji/EmojiProvider.java
@@ -27,13 +27,13 @@ import org.thoughtcrime.securesms.util.FutureTaskListener;
import org.thoughtcrime.securesms.util.Pair;
import org.thoughtcrime.securesms.util.Util;
-import java.io.IOException;
+import java.util.List;
import java.util.concurrent.ExecutionException;
class EmojiProvider {
private static final String TAG = EmojiProvider.class.getSimpleName();
- protected static volatile EmojiProvider instance = null;
+ private static volatile EmojiProvider instance = null;
private static final Paint paint = new Paint(Paint.FILTER_BITMAP_FLAG | Paint.ANTI_ALIAS_FLAG);
private final EmojiTree emojiTree = new EmojiTree();
@@ -41,7 +41,7 @@ class EmojiProvider {
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;
+ private static final int EMOJI_PER_ROW = 16;
private final float decodeScale;
private final float verticalPad;
@@ -57,16 +57,17 @@ class EmojiProvider {
return instance;
}
- protected EmojiProvider(Context context) {
+ private EmojiProvider(Context context) {
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) {
+ for (EmojiPageModel page : EmojiPages.DATA_PAGES) {
if (page.hasSpriteMap()) {
EmojiPageBitmap pageBitmap = new EmojiPageBitmap(context, page, decodeScale);
- for (int i=0;i emojis = page.getEmoji();
+ for (int i = 0; i < emojis.size(); i++) {
+ emojiTree.add(emojis.get(i), new EmojiDrawInfo(pageBitmap, i));
}
}
}
@@ -82,18 +83,17 @@ class EmojiProvider {
}
@Nullable Spannable emojify(@Nullable CharSequence text, @NonNull TextView tv) {
- return emojify(getCandidates(text), text, tv, false);
+ return emojify(getCandidates(text), text, tv);
}
@Nullable Spannable emojify(@Nullable EmojiParser.CandidateList matches,
@Nullable CharSequence text,
- @NonNull TextView tv,
- boolean background) {
+ @NonNull TextView tv) {
if (matches == null || text == null) return null;
SpannableStringBuilder builder = new SpannableStringBuilder(text);
for (EmojiParser.Candidate candidate : matches) {
- Drawable drawable = getEmojiDrawable(candidate.getDrawInfo(), background);
+ Drawable drawable = getEmojiDrawable(candidate.getDrawInfo());
if (drawable != null) {
builder.setSpan(new EmojiSpan(drawable, tv), candidate.getStartIndex(), candidate.getEndIndex(),
@@ -106,32 +106,24 @@ class EmojiProvider {
@Nullable Drawable getEmojiDrawable(CharSequence emoji) {
EmojiDrawInfo drawInfo = emojiTree.getEmoji(emoji, 0, emoji.length());
- return getEmojiDrawable(drawInfo, false);
+ return getEmojiDrawable(drawInfo);
}
- protected @Nullable Drawable getEmojiDrawable(@Nullable EmojiDrawInfo drawInfo, boolean background) {
+ private @Nullable Drawable getEmojiDrawable(@Nullable EmojiDrawInfo drawInfo) {
if (drawInfo == null) {
return null;
}
final EmojiDrawable drawable = new EmojiDrawable(drawInfo, decodeScale);
- if (background) {
- try {
- drawable.setBitmap(drawInfo.getPage().loadPage(), background);
- } catch (IOException e) {
- e.printStackTrace();
+ drawInfo.getPage().get().addListener(new FutureTaskListener() {
+ @Override public void onSuccess(final Bitmap result) {
+ Util.runOnMain(() -> drawable.setBitmap(result));
}
- } else {
- drawInfo.getPage().get().addListener(new FutureTaskListener() {
- @Override public void onSuccess(final Bitmap result) {
- Util.runOnMain(() -> drawable.setBitmap(result));
- }
- @Override public void onFailure(ExecutionException error) {
- Log.w(TAG, error);
- }
- });
- }
+ @Override public void onFailure(ExecutionException error) {
+ Log.w(TAG, error);
+ }
+ });
return drawable;
}
@@ -177,14 +169,7 @@ class EmojiProvider {
@TargetApi(VERSION_CODES.HONEYCOMB_MR1)
public void setBitmap(Bitmap bitmap) {
- setBitmap(bitmap, false);
- }
-
- @TargetApi(VERSION_CODES.HONEYCOMB_MR1)
- public void setBitmap(Bitmap bitmap, boolean background) {
- if (!background) {
- Util.assertMainThread();
- }
+ Util.assertMainThread();
if (VERSION.SDK_INT < VERSION_CODES.HONEYCOMB_MR1 || bmp == null || !bmp.sameAs(bitmap)) {
bmp = bitmap;
invalidateSelf();
diff --git a/src/org/thoughtcrime/securesms/components/emoji/EmojiSpan.java b/src/org/thoughtcrime/securesms/components/emoji/EmojiSpan.java
index a6ebd3433..781691ec1 100644
--- a/src/org/thoughtcrime/securesms/components/emoji/EmojiSpan.java
+++ b/src/org/thoughtcrime/securesms/components/emoji/EmojiSpan.java
@@ -25,7 +25,7 @@ public class EmojiSpan extends AnimatingImageSpan {
}
@Override
- public int getSize(Paint paint, CharSequence text, int start, int end, FontMetricsInt fm) {
+ public int getSize(@NonNull Paint paint, CharSequence text, int start, int end, FontMetricsInt fm) {
if (fm != null && this.fm != null) {
fm.ascent = this.fm.ascent;
fm.descent = this.fm.descent;
@@ -39,7 +39,7 @@ public class EmojiSpan extends AnimatingImageSpan {
}
@Override
- public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint) {
+ public void draw(@NonNull Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, @NonNull Paint paint) {
int height = bottom - top;
int centeringMargin = (height - size) / 2;
int adjustedMargin = (int) (centeringMargin * SHIFT_FACTOR);
diff --git a/src/org/thoughtcrime/securesms/components/emoji/EmojiTextView.java b/src/org/thoughtcrime/securesms/components/emoji/EmojiTextView.java
index aafe7b85d..ecdc9e977 100644
--- a/src/org/thoughtcrime/securesms/components/emoji/EmojiTextView.java
+++ b/src/org/thoughtcrime/securesms/components/emoji/EmojiTextView.java
@@ -3,32 +3,39 @@ package org.thoughtcrime.securesms.components.emoji;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.core.widget.TextViewCompat;
-import androidx.appcompat.widget.AppCompatTextView;
import android.text.SpannableStringBuilder;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.TypedValue;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.appcompat.widget.AppCompatTextView;
+import androidx.core.widget.TextViewCompat;
+
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.components.emoji.EmojiProvider.EmojiDrawable;
import org.thoughtcrime.securesms.components.emoji.parsing.EmojiParser;
import org.thoughtcrime.securesms.util.Prefs;
import org.thoughtcrime.securesms.util.Util;
+import org.thoughtcrime.securesms.util.guava.Optional;
public class EmojiTextView extends AppCompatTextView {
private final boolean scaleEmojis;
- private final boolean createInBackground;
+ private final boolean forceCustom;
+
+ private static final char ELLIPSIS = '…';
private CharSequence previousText;
private BufferType previousBufferType;
private float originalFontSize;
private boolean useSystemEmoji;
private boolean sizeChangeInProgress;
+ private int maxLength;
+ private CharSequence overflowText;
+ private CharSequence previousOverflowText;
public EmojiTextView(Context context) {
this(context, null);
@@ -43,7 +50,8 @@ public class EmojiTextView extends AppCompatTextView {
TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.EmojiTextView, 0, 0);
scaleEmojis = a.getBoolean(R.styleable.EmojiTextView_scaleEmojis, false);
- createInBackground = a.getBoolean(R.styleable.EmojiTextView_createInBackground, false);
+ maxLength = a.getInteger(R.styleable.EmojiTextView_emoji_maxLength, -1);
+ forceCustom = a.getBoolean(R.styleable.EmojiTextView_emoji_forceCustom, false);
a.recycle();
a = context.obtainStyledAttributes(attrs, new int[]{android.R.attr.textSize});
@@ -69,41 +77,70 @@ public class EmojiTextView extends AppCompatTextView {
super.setTextSize(TypedValue.COMPLEX_UNIT_PX, originalFontSize);
}
- if (unchanged(text, type)) {
+ if (unchanged(text, overflowText, type)) {
return;
}
- previousText = text;
- previousBufferType = type;
- useSystemEmoji = useSystemEmoji();
+ previousText = text;
+ previousOverflowText = overflowText;
+ previousBufferType = type;
+ useSystemEmoji = useSystemEmoji();
if (useSystemEmoji || candidates == null || candidates.size() == 0) {
- super.setText(text, BufferType.NORMAL);
- return;
- }
+ super.setText(new SpannableStringBuilder(Optional.fromNullable(text).or("")).append(Optional.fromNullable(overflowText).or("")), BufferType.NORMAL);
- CharSequence emojified = provider.emojify(candidates, text, this, createInBackground);
- super.setText(emojified, BufferType.SPANNABLE);
+ if (getEllipsize() == TextUtils.TruncateAt.END && maxLength > 0) {
+ ellipsizeAnyTextForMaxLength();
+ }
+ } else {
+ CharSequence emojified = provider.emojify(candidates, text, this);
+ super.setText(new SpannableStringBuilder(emojified).append(Optional.fromNullable(overflowText).or("")), BufferType.SPANNABLE);
- // Android fails to ellipsize spannable strings. (https://issuetracker.google.com/issues/36991688)
- // We ellipsize them ourselves by manually truncating the appropriate section.
- if (getEllipsize() == TextUtils.TruncateAt.END) {
- ellipsize();
+ // Android fails to ellipsize spannable strings. (https://issuetracker.google.com/issues/36991688)
+ // We ellipsize them ourselves by manually truncating the appropriate section.
+ if (getEllipsize() == TextUtils.TruncateAt.END) {
+ if (maxLength > 0) {
+ ellipsizeAnyTextForMaxLength();
+ } else {
+ ellipsizeEmojiTextForMaxLines();
+ }
+ }
}
}
- private void ellipsize() {
+ public void setOverflowText(@Nullable CharSequence overflowText) {
+ this.overflowText = overflowText;
+ setText(previousText, BufferType.SPANNABLE);
+ }
+
+ private void ellipsizeAnyTextForMaxLength() {
+ if (maxLength > 0 && getText().length() > maxLength + 1) {
+ SpannableStringBuilder newContent = new SpannableStringBuilder();
+ newContent.append(getText().subSequence(0, maxLength)).append(ELLIPSIS).append(Optional.fromNullable(overflowText).or(""));
+
+ EmojiParser.CandidateList newCandidates = EmojiProvider.getInstance(getContext()).getCandidates(newContent);
+
+ if (useSystemEmoji || newCandidates == null || newCandidates.size() == 0) {
+ super.setText(newContent, BufferType.NORMAL);
+ } else {
+ CharSequence emojified = EmojiProvider.getInstance(getContext()).emojify(newCandidates, newContent, this);
+ super.setText(emojified, BufferType.SPANNABLE);
+ }
+ }
+ }
+
+ private void ellipsizeEmojiTextForMaxLines() {
post(() -> {
if (getLayout() == null) {
- ellipsize();
+ ellipsizeEmojiTextForMaxLines();
return;
}
int maxLines = TextViewCompat.getMaxLines(EmojiTextView.this);
- if (maxLines <= 0) {
+ if (maxLines <= 0 && maxLength < 0) {
return;
}
-
+
int lineCount = getLineCount();
if (lineCount > maxLines) {
int overflowStart = getLayout().getLineStart(maxLines - 1);
@@ -112,25 +149,27 @@ public class EmojiTextView extends AppCompatTextView {
SpannableStringBuilder newContent = new SpannableStringBuilder();
newContent.append(getText().subSequence(0, overflowStart))
- .append(ellipsized.subSequence(0, ellipsized.length()));
+ .append(ellipsized.subSequence(0, ellipsized.length()))
+ .append(Optional.fromNullable(overflowText).or(""));
EmojiParser.CandidateList newCandidates = EmojiProvider.getInstance(getContext()).getCandidates(newContent);
- CharSequence emojified = EmojiProvider.getInstance(getContext()).emojify(newCandidates, newContent, this, createInBackground);
+ CharSequence emojified = EmojiProvider.getInstance(getContext()).emojify(newCandidates, newContent, this);
super.setText(emojified, BufferType.SPANNABLE);
}
});
}
- private boolean unchanged(CharSequence text, BufferType bufferType) {
- return Util.equals(previousText, text) &&
- Util.equals(previousBufferType, bufferType) &&
- useSystemEmoji == useSystemEmoji() &&
+ private boolean unchanged(CharSequence text, CharSequence overflowText, BufferType bufferType) {
+ return Util.equals(previousText, text) &&
+ Util.equals(previousOverflowText, overflowText) &&
+ Util.equals(previousBufferType, bufferType) &&
+ useSystemEmoji == useSystemEmoji() &&
!sizeChangeInProgress;
}
private boolean useSystemEmoji() {
- return Prefs.isSystemEmojiPreferred(getContext());
+ return !forceCustom && Prefs.isSystemEmojiPreferred(getContext());
}
@Override
diff --git a/src/org/thoughtcrime/securesms/components/emoji/EmojiToggle.java b/src/org/thoughtcrime/securesms/components/emoji/EmojiToggle.java
index 5ffeb9b8a..7a1f22c89 100644
--- a/src/org/thoughtcrime/securesms/components/emoji/EmojiToggle.java
+++ b/src/org/thoughtcrime/securesms/components/emoji/EmojiToggle.java
@@ -1,20 +1,24 @@
package org.thoughtcrime.securesms.components.emoji;
-
import android.content.Context;
-import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
+import androidx.annotation.NonNull;
+import androidx.appcompat.widget.AppCompatImageButton;
import android.util.AttributeSet;
-import android.widget.ImageButton;
import org.thoughtcrime.securesms.R;
-import org.thoughtcrime.securesms.components.emoji.EmojiDrawer.EmojiDrawerListener;
+import org.thoughtcrime.securesms.util.Prefs;
+import org.thoughtcrime.securesms.util.ResUtil;
-public class EmojiToggle extends ImageButton implements EmojiDrawerListener {
+public class EmojiToggle extends AppCompatImageButton implements MediaKeyboard.MediaKeyboardListener {
private Drawable emojiToggle;
+// private Drawable stickerToggle;
+
+ private Drawable mediaToggle;
private Drawable imeToggle;
+
public EmojiToggle(Context context) {
super(context);
initialize();
@@ -30,8 +34,8 @@ public class EmojiToggle extends ImageButton implements EmojiDrawerListener {
initialize();
}
- public void setToEmoji() {
- setImageDrawable(emojiToggle);
+ public void setToMedia() {
+ setImageDrawable(mediaToggle);
}
public void setToIme() {
@@ -39,19 +43,29 @@ public class EmojiToggle extends ImageButton implements EmojiDrawerListener {
}
private void initialize() {
- int attributes[] = new int[] {R.attr.conversation_emoji_toggle,
- R.attr.conversation_keyboard_toggle};
+ this.emojiToggle = ResUtil.getDrawable(getContext(), R.attr.conversation_emoji_toggle);
+// this.stickerToggle = ResUtil.getDrawable(getContext(), R.attr.conversation_sticker_toggle);
+ this.imeToggle = ResUtil.getDrawable(getContext(), R.attr.conversation_keyboard_toggle);
+ this.mediaToggle = emojiToggle;
- TypedArray drawables = getContext().obtainStyledAttributes(attributes);
- this.emojiToggle = drawables.getDrawable(0);
- this.imeToggle = drawables.getDrawable(1);
-
- drawables.recycle();
- setToEmoji();
+ setToMedia();
}
- public void attach(EmojiDrawer drawer) {
- drawer.setDrawerListener(this);
+ public void attach(MediaKeyboard drawer) {
+ drawer.setKeyboardListener(this);
+ }
+
+ public void setStickerMode(boolean stickerMode) {
+ this.mediaToggle = /*stickerMode ? stickerToggle :*/ emojiToggle;
+
+ if (getDrawable() != imeToggle) {
+ setToMedia();
+ }
+ }
+
+ public boolean isStickerMode() {
+ //return this.mediaToggle == stickerToggle;
+ return false;
}
@Override public void onShown() {
@@ -59,6 +73,14 @@ public class EmojiToggle extends ImageButton implements EmojiDrawerListener {
}
@Override public void onHidden() {
- setToEmoji();
+ setToMedia();
+ }
+
+ @Override
+ public void onKeyboardProviderChanged(@NonNull MediaKeyboardProvider provider) {
+ setStickerMode(false);
+ //setStickerMode(provider instanceof StickerKeyboardProvider);
+ /*TextSecurePreferences.setMediaKeyboardMode(getContext(), (provider instanceof StickerKeyboardProvider) ? TextSecurePreferences.MediaKeyboardMode.STICKER
+ : TextSecurePreferences.MediaKeyboardMode.EMOJI);*/
}
}
diff --git a/src/org/thoughtcrime/securesms/components/emoji/EmojiUtil.java b/src/org/thoughtcrime/securesms/components/emoji/EmojiUtil.java
new file mode 100644
index 000000000..459615223
--- /dev/null
+++ b/src/org/thoughtcrime/securesms/components/emoji/EmojiUtil.java
@@ -0,0 +1,75 @@
+package org.thoughtcrime.securesms.components.emoji;
+
+import androidx.annotation.NonNull;
+
+import org.thoughtcrime.securesms.util.Pair;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+public final class EmojiUtil {
+
+ private static final Map VARIATION_MAP = new HashMap<>();
+
+ static {
+ for (EmojiPageModel page : EmojiPages.DATA_PAGES) {
+ for (Emoji emoji : page.getDisplayEmoji()) {
+ for (String variation : emoji.getVariations()) {
+ VARIATION_MAP.put(variation, emoji.getValue());
+ }
+ }
+ }
+ }
+
+ public static final int MAX_EMOJI_LENGTH;
+ static {
+ int max = 0;
+ for (EmojiPageModel page : EmojiPages.DATA_PAGES) {
+ for (String emoji : page.getEmoji()) {
+ max = Math.max(max, emoji.length());
+ }
+ }
+ MAX_EMOJI_LENGTH = max;
+ }
+
+ private EmojiUtil() {}
+
+ public static List getDisplayPages() {
+ return EmojiPages.DISPLAY_PAGES;
+ }
+
+ /**
+ * This will return all ways we know of expressing a singular emoji. This is to aid in search,
+ * where some platforms may send an emoji we've locally marked as 'obsolete'.
+ */
+ public static @NonNull Set getAllRepresentations(@NonNull String emoji) {
+ Set out = new HashSet<>();
+
+ out.add(emoji);
+
+ for (Pair pair : EmojiPages.OBSOLETE) {
+ if (pair.first().equals(emoji)) {
+ out.add(pair.second());
+ } else if (pair.second().equals(emoji)) {
+ out.add(pair.first());
+ }
+ }
+
+ return out;
+ }
+
+ /**
+ * When provided an emoji that is a skin variation of another, this will return the default yellow
+ * version. This is to aid in search, so using a variation will still find all emojis tagged with
+ * the default version.
+ *
+ * If the emoji has no skin variations, this function will return the original emoji.
+ */
+ public static @NonNull String getCanonicalRepresentation(@NonNull String emoji) {
+ String canonical = VARIATION_MAP.get(emoji);
+ return canonical != null ? canonical : emoji;
+ }
+}
diff --git a/src/org/thoughtcrime/securesms/components/emoji/EmojiVariationSelectorPopup.java b/src/org/thoughtcrime/securesms/components/emoji/EmojiVariationSelectorPopup.java
new file mode 100644
index 000000000..1820569b2
--- /dev/null
+++ b/src/org/thoughtcrime/securesms/components/emoji/EmojiVariationSelectorPopup.java
@@ -0,0 +1,51 @@
+package org.thoughtcrime.securesms.components.emoji;
+
+import android.content.Context;
+import android.os.Build;
+import androidx.annotation.NonNull;
+import android.view.LayoutInflater;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.PopupWindow;
+
+import org.thoughtcrime.securesms.R;
+import org.thoughtcrime.securesms.components.emoji.EmojiKeyboardProvider.EmojiEventListener;
+
+import java.util.List;
+
+public class EmojiVariationSelectorPopup extends PopupWindow {
+
+ private final Context context;
+ private final ViewGroup list;
+ private final EmojiEventListener listener;
+
+ public EmojiVariationSelectorPopup(@NonNull Context context, @NonNull EmojiEventListener listener) {
+ super(LayoutInflater.from(context).inflate(R.layout.emoji_variation_selector, null),
+ ViewGroup.LayoutParams.WRAP_CONTENT,
+ ViewGroup.LayoutParams.WRAP_CONTENT);
+ this.context = context;
+ this.listener = listener;
+ this.list = (ViewGroup) getContentView().findViewById(R.id.emoji_variation_container);
+
+ setBackgroundDrawable(null);
+ setOutsideTouchable(true);
+
+ if (Build.VERSION.SDK_INT >= 21) {
+ setElevation(20);
+ }
+ }
+
+ public void setVariations(List variations) {
+ list.removeAllViews();
+
+ for (String variation : variations) {
+ ImageView imageView = (ImageView) LayoutInflater.from(context).inflate(R.layout.emoji_variation_selector_item, list, false);
+ imageView.setImageDrawable(EmojiProvider.getInstance(context).getEmojiDrawable(variation));
+ imageView.setOnClickListener(v -> {
+ listener.onEmojiSelected(variation);
+ dismiss();
+ });
+ list.addView(imageView);
+ }
+ }
+}
diff --git a/src/org/thoughtcrime/securesms/components/emoji/EmojiView.java b/src/org/thoughtcrime/securesms/components/emoji/EmojiView.java
deleted file mode 100644
index 2a7544a8f..000000000
--- a/src/org/thoughtcrime/securesms/components/emoji/EmojiView.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package org.thoughtcrime.securesms.components.emoji;
-
-import android.content.Context;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.graphics.drawable.Drawable;
-import androidx.annotation.NonNull;
-import android.util.AttributeSet;
-import android.view.View;
-
-import org.thoughtcrime.securesms.R;
-import org.thoughtcrime.securesms.util.ResUtil;
-
-public class EmojiView extends View implements Drawable.Callback {
- private String emoji;
- private Drawable drawable;
-
- private final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG);
-
- public EmojiView(Context context) {
- this(context, null);
- }
-
- public EmojiView(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public EmojiView(Context context, AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
- }
-
- public void setEmoji(String emoji) {
- this.emoji = emoji;
- this.drawable = EmojiProvider.getInstance(getContext())
- .getEmojiDrawable(emoji);
- postInvalidate();
- }
-
- public String getEmoji() {
- return emoji;
- }
-
- @Override protected void onDraw(Canvas canvas) {
- if (drawable != null) {
- drawable.setBounds(getPaddingLeft(),
- getPaddingTop(),
- getWidth() - getPaddingRight(),
- getHeight() - getPaddingBottom());
- drawable.setCallback(this);
- drawable.draw(canvas);
- } else {
- float targetFontSize = 0.75f * getHeight() - getPaddingTop() - getPaddingBottom();
- paint.setTextSize(targetFontSize);
- paint.setColor(ResUtil.getColor(getContext(), R.attr.emoji_text_color));
- paint.setTextAlign(Paint.Align.CENTER);
- int xPos = (canvas.getWidth() / 2);
- int yPos = (int) ((canvas.getHeight() / 2) - ((paint.descent() + paint.ascent()) / 2));
-
- float overflow = paint.measureText(emoji) /
- (getWidth() - getPaddingLeft() - getPaddingRight());
- if (overflow > 1f) {
- paint.setTextSize(targetFontSize / overflow);
- yPos = (int) ((canvas.getHeight() / 2) - ((paint.descent() + paint.ascent()) / 2));
- }
- canvas.drawText(emoji, xPos, yPos, paint);
- }
- }
-
- @Override public void invalidateDrawable(@NonNull Drawable drawable) {
- super.invalidateDrawable(drawable);
- postInvalidate();
- }
-
- @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- super.onMeasure(widthMeasureSpec, heightMeasureSpec);
- }
-}
diff --git a/src/org/thoughtcrime/securesms/components/emoji/MediaKeyboard.java b/src/org/thoughtcrime/securesms/components/emoji/MediaKeyboard.java
new file mode 100644
index 000000000..3e9b1a072
--- /dev/null
+++ b/src/org/thoughtcrime/securesms/components/emoji/MediaKeyboard.java
@@ -0,0 +1,296 @@
+package org.thoughtcrime.securesms.components.emoji;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.FrameLayout;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+import androidx.viewpager.widget.PagerAdapter;
+import androidx.viewpager.widget.ViewPager;
+
+import org.thoughtcrime.securesms.R;
+import org.thoughtcrime.securesms.components.InputAwareLayout.InputView;
+import org.thoughtcrime.securesms.components.RepeatableImageKey;
+import org.thoughtcrime.securesms.mms.GlideApp;
+
+import java.util.Arrays;
+
+public class MediaKeyboard extends FrameLayout implements InputView,
+ MediaKeyboardProvider.Presenter,
+ MediaKeyboardProvider.Controller,
+ MediaKeyboardBottomTabAdapter.EventListener
+{
+
+ private static final String TAG = MediaKeyboard.class.getSimpleName();
+
+ private RecyclerView categoryTabs;
+ private ViewPager categoryPager;
+ private ViewGroup providerTabs;
+ private RepeatableImageKey backspaceButton;
+ private RepeatableImageKey backspaceButtonBackup;
+ private View searchButton;
+ private View addButton;
+ @Nullable private MediaKeyboardListener keyboardListener;
+ private MediaKeyboardProvider[] providers;
+ private int providerIndex;
+
+ private final boolean tabsAtBottom;
+
+ private MediaKeyboardBottomTabAdapter categoryTabAdapter;
+
+ public MediaKeyboard(Context context) {
+ this(context, null);
+ }
+
+ public MediaKeyboard(Context context, AttributeSet attrs) {
+ super(context, attrs);
+
+ TypedArray typedArray = context.getTheme().obtainStyledAttributes(attrs, R.styleable.MediaKeyboard, 0, 0);
+
+ try {
+ tabsAtBottom = typedArray.getInt(R.styleable.MediaKeyboard_tabs_gravity, 0) == 0;
+ } finally {
+ typedArray.recycle();
+ }
+ }
+
+ public void setProviders(int startIndex, MediaKeyboardProvider... providers) {
+ if (!Arrays.equals(this.providers, providers)) {
+ this.providers = providers;
+ this.providerIndex = startIndex;
+
+ requestPresent(providers, providerIndex);
+ }
+ }
+
+ public void setKeyboardListener(@Nullable MediaKeyboardListener listener) {
+ this.keyboardListener = listener;
+ }
+
+ @Override
+ public boolean isShowing() {
+ return getVisibility() == VISIBLE;
+ }
+
+ @Override
+ public void show(int height, boolean immediate) {
+ if (this.categoryPager == null) initView();
+
+ ViewGroup.LayoutParams params = getLayoutParams();
+ params.height = height;
+ Log.i(TAG, "showing emoji drawer with height " + params.height);
+ setLayoutParams(params);
+
+ show();
+ }
+
+ public void show() {
+ if (this.categoryPager == null) initView();
+
+ setVisibility(VISIBLE);
+ if (keyboardListener != null) keyboardListener.onShown();
+
+ requestPresent(providers, providerIndex);
+ }
+
+ @Override
+ public void hide(boolean immediate) {
+ setVisibility(GONE);
+ if (keyboardListener != null) keyboardListener.onHidden();
+ Log.i(TAG, "hide()");
+ }
+
+ @Override
+ public void present(@NonNull MediaKeyboardProvider provider,
+ @NonNull PagerAdapter pagerAdapter,
+ @NonNull MediaKeyboardProvider.TabIconProvider tabIconProvider,
+ @Nullable MediaKeyboardProvider.BackspaceObserver backspaceObserver,
+ @Nullable MediaKeyboardProvider.AddObserver addObserver,
+ @Nullable MediaKeyboardProvider.SearchObserver searchObserver,
+ int startingIndex)
+ {
+ if (categoryPager == null) return;
+ if (!provider.equals(providers[providerIndex])) return;
+ if (keyboardListener != null) keyboardListener.onKeyboardProviderChanged(provider);
+
+ boolean isSolo = providers.length == 1;
+
+ presentProviderStrip(isSolo);
+ presentCategoryPager(pagerAdapter, tabIconProvider, startingIndex);
+ presentProviderTabs(providers, providerIndex);
+ presentSearchButton(searchObserver);
+ presentBackspaceButton(backspaceObserver, isSolo);
+ presentAddButton(addObserver);
+ }
+
+ @Override
+ public int getCurrentPosition() {
+ return categoryPager != null ? categoryPager.getCurrentItem() : 0;
+ }
+
+ @Override
+ public void requestDismissal() {
+ hide(true);
+ providerIndex = 0;
+ if (keyboardListener != null) keyboardListener.onKeyboardProviderChanged(providers[providerIndex]);
+ }
+
+ @Override
+ public boolean isVisible() {
+ return getVisibility() == View.VISIBLE;
+ }
+
+ @Override
+ public void onTabSelected(int index) {
+ if (categoryPager != null) {
+ categoryPager.setCurrentItem(index);
+ categoryTabs.smoothScrollToPosition(index);
+ }
+ }
+
+ @Override
+ public void setViewPagerEnabled(boolean enabled) {
+ if (categoryPager != null) {
+ categoryPager.setEnabled(enabled);
+ }
+ }
+
+ private void initView() {
+ final View view = LayoutInflater.from(getContext()).inflate(R.layout.media_keyboard, this, true);
+
+ RecyclerView categoryTabsTop = view.findViewById(R.id.media_keyboard_tabs_top);
+ RecyclerView categoryTabsBottom = view.findViewById(R.id.media_keyboard_tabs);
+
+ this.categoryTabs = tabsAtBottom ? categoryTabsBottom : categoryTabsTop;
+ this.categoryPager = view.findViewById(R.id.media_keyboard_pager);
+ this.providerTabs = view.findViewById(R.id.media_keyboard_provider_tabs);
+ this.backspaceButton = view.findViewById(R.id.media_keyboard_backspace);
+ this.backspaceButtonBackup = view.findViewById(R.id.media_keyboard_backspace_backup);
+ this.searchButton = view.findViewById(R.id.media_keyboard_search);
+ this.addButton = view.findViewById(R.id.media_keyboard_add);
+
+ this.categoryTabAdapter = new MediaKeyboardBottomTabAdapter(GlideApp.with(this), this, tabsAtBottom);
+
+ categoryTabs.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, false));
+ categoryTabs.setAdapter(categoryTabAdapter);
+ categoryTabs.setVisibility(VISIBLE);
+ }
+
+ private void requestPresent(@NonNull MediaKeyboardProvider[] providers, int newIndex) {
+ providers[providerIndex].setController(null);
+ providerIndex = newIndex;
+
+ providers[providerIndex].setController(this);
+ providers[providerIndex].requestPresentation(this, providers.length == 1);
+ }
+
+
+ private void presentCategoryPager(@NonNull PagerAdapter pagerAdapter,
+ @NonNull MediaKeyboardProvider.TabIconProvider iconProvider,
+ int startingIndex) {
+ if (categoryPager.getAdapter() != pagerAdapter) {
+ categoryPager.setAdapter(pagerAdapter);
+ }
+
+ categoryPager.setCurrentItem(startingIndex);
+
+ categoryPager.clearOnPageChangeListeners();
+ categoryPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
+ @Override
+ public void onPageScrolled(int i, float v, int i1) {
+ }
+
+ @Override
+ public void onPageSelected(int i) {
+ categoryTabAdapter.setActivePosition(i);
+ categoryTabs.smoothScrollToPosition(i);
+ }
+
+ @Override
+ public void onPageScrollStateChanged(int i) {
+ }
+ });
+
+ categoryTabAdapter.setTabIconProvider(iconProvider, pagerAdapter.getCount());
+ categoryTabAdapter.setActivePosition(startingIndex);
+ }
+
+ private void presentProviderTabs(@NonNull MediaKeyboardProvider[] providers, int selected) {
+ providerTabs.removeAllViews();
+
+ LayoutInflater inflater = LayoutInflater.from(getContext());
+
+ for (int i = 0; i < providers.length; i++) {
+ MediaKeyboardProvider provider = providers[i];
+ View view = inflater.inflate(provider.getProviderIconView(i == selected), providerTabs, false);
+
+ view.setTag(provider);
+
+ final int index = i;
+ view.setOnClickListener(v -> {
+ requestPresent(providers, index);
+ });
+
+ providerTabs.addView(view);
+ }
+ }
+
+ private void presentBackspaceButton(@Nullable MediaKeyboardProvider.BackspaceObserver backspaceObserver,
+ boolean useBackupPosition)
+ {
+ if (backspaceObserver != null) {
+ if (useBackupPosition) {
+ backspaceButton.setVisibility(INVISIBLE);
+ backspaceButton.setOnKeyEventListener(null);
+ backspaceButtonBackup.setVisibility(VISIBLE);
+ backspaceButtonBackup.setOnKeyEventListener(backspaceObserver::onBackspaceClicked);
+ } else {
+ backspaceButton.setVisibility(VISIBLE);
+ backspaceButton.setOnKeyEventListener(backspaceObserver::onBackspaceClicked);
+ backspaceButtonBackup.setVisibility(GONE);
+ backspaceButtonBackup.setOnKeyEventListener(null);
+ }
+ } else {
+ backspaceButton.setVisibility(INVISIBLE);
+ backspaceButton.setOnKeyEventListener(null);
+ backspaceButtonBackup.setVisibility(GONE);
+ backspaceButton.setOnKeyEventListener(null);
+ }
+ }
+
+ private void presentAddButton(@Nullable MediaKeyboardProvider.AddObserver addObserver) {
+ if (addObserver != null) {
+ addButton.setVisibility(VISIBLE);
+ addButton.setOnClickListener(v -> addObserver.onAddClicked());
+ } else {
+ addButton.setVisibility(GONE);
+ addButton.setOnClickListener(null);
+ }
+ }
+
+ private void presentSearchButton(@Nullable MediaKeyboardProvider.SearchObserver searchObserver) {
+ searchButton.setVisibility(searchObserver != null ? VISIBLE : INVISIBLE);
+ }
+
+ private void presentProviderStrip(boolean isSolo) {
+ int visibility = isSolo ? View.GONE : View.VISIBLE;
+
+ searchButton.setVisibility(visibility);
+ backspaceButton.setVisibility(visibility);
+ providerTabs.setVisibility(visibility);
+ }
+
+ public interface MediaKeyboardListener {
+ void onShown();
+ void onHidden();
+ void onKeyboardProviderChanged(@NonNull MediaKeyboardProvider provider);
+ }
+}
diff --git a/src/org/thoughtcrime/securesms/components/emoji/MediaKeyboardBottomTabAdapter.java b/src/org/thoughtcrime/securesms/components/emoji/MediaKeyboardBottomTabAdapter.java
new file mode 100644
index 000000000..80fd33681
--- /dev/null
+++ b/src/org/thoughtcrime/securesms/components/emoji/MediaKeyboardBottomTabAdapter.java
@@ -0,0 +1,103 @@
+package org.thoughtcrime.securesms.components.emoji;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+
+import org.thoughtcrime.securesms.R;
+import org.thoughtcrime.securesms.components.emoji.MediaKeyboardProvider.TabIconProvider;
+import org.thoughtcrime.securesms.mms.GlideRequests;
+
+public class MediaKeyboardBottomTabAdapter extends RecyclerView.Adapter {
+
+ private final GlideRequests glideRequests;
+ private final EventListener eventListener;
+ private final boolean highlightTop;
+
+ private TabIconProvider tabIconProvider;
+ private int activePosition;
+ private int count;
+
+ public MediaKeyboardBottomTabAdapter(@NonNull GlideRequests glideRequests, @NonNull EventListener eventListener, boolean highlightTop) {
+ this.glideRequests = glideRequests;
+ this.eventListener = eventListener;
+ this.highlightTop = highlightTop;
+ }
+
+ @Override
+ public @NonNull MediaKeyboardBottomTabViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
+ return new MediaKeyboardBottomTabViewHolder(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.media_keyboard_bottom_tab_item, viewGroup, false),
+ highlightTop);
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull MediaKeyboardBottomTabViewHolder viewHolder, int i) {
+ viewHolder.bind(glideRequests, eventListener, tabIconProvider, i, i == activePosition);
+ }
+
+ @Override
+ public void onViewRecycled(@NonNull MediaKeyboardBottomTabViewHolder holder) {
+ holder.recycle();
+ }
+
+ @Override
+ public int getItemCount() {
+ return count;
+ }
+
+ public void setTabIconProvider(@NonNull TabIconProvider iconProvider, int count) {
+ this.tabIconProvider = iconProvider;
+ this.count = count;
+
+ notifyDataSetChanged();
+ }
+
+ public void setActivePosition(int position) {
+ this.activePosition = position;
+ notifyDataSetChanged();
+ }
+
+ static class MediaKeyboardBottomTabViewHolder extends RecyclerView.ViewHolder {
+
+ private final ImageView image;
+ private final View indicator;
+
+ public MediaKeyboardBottomTabViewHolder(@NonNull View itemView, boolean highlightTop) {
+ super(itemView);
+
+ View indicatorTop = itemView.findViewById(R.id.media_keyboard_top_tab_indicator);
+ View indicatorBottom = itemView.findViewById(R.id.media_keyboard_bottom_tab_indicator);
+
+ this.image = itemView.findViewById(R.id.media_keyboard_bottom_tab_image);
+ this.indicator = highlightTop ? indicatorTop : indicatorBottom;
+
+ this.indicator.setVisibility(View.VISIBLE);
+ }
+
+ void bind(@NonNull GlideRequests glideRequests,
+ @NonNull EventListener eventListener,
+ @NonNull TabIconProvider tabIconProvider,
+ int index,
+ boolean selected)
+ {
+ tabIconProvider.loadCategoryTabIcon(glideRequests, image, index);
+ image.setAlpha(selected ? 1 : 0.5f);
+ image.setSelected(selected);
+
+ indicator.setVisibility(selected ? View.VISIBLE : View.INVISIBLE);
+
+ itemView.setOnClickListener(v -> eventListener.onTabSelected(index));
+ }
+
+ void recycle() {
+ itemView.setOnClickListener(null);
+ }
+ }
+
+ interface EventListener {
+ void onTabSelected(int index);
+ }
+}
diff --git a/src/org/thoughtcrime/securesms/components/emoji/MediaKeyboardProvider.java b/src/org/thoughtcrime/securesms/components/emoji/MediaKeyboardProvider.java
new file mode 100644
index 000000000..f1537cd20
--- /dev/null
+++ b/src/org/thoughtcrime/securesms/components/emoji/MediaKeyboardProvider.java
@@ -0,0 +1,51 @@
+package org.thoughtcrime.securesms.components.emoji;
+
+import androidx.annotation.LayoutRes;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.viewpager.widget.PagerAdapter;
+import android.widget.ImageView;
+
+import org.thoughtcrime.securesms.mms.GlideRequests;
+
+public interface MediaKeyboardProvider {
+ @LayoutRes int getProviderIconView(boolean selected);
+ /** @return True if the click was handled with provider-specific logic, otherwise false */
+ void requestPresentation(@NonNull Presenter presenter, boolean isSoloProvider);
+ void setController(@Nullable Controller controller);
+
+ interface BackspaceObserver {
+ void onBackspaceClicked();
+ }
+
+ interface AddObserver {
+ void onAddClicked();
+ }
+
+ interface SearchObserver {
+ void onSearchOpened();
+ void onSearchClosed();
+ void onSearchChanged(@NonNull String query);
+ }
+
+ interface Controller {
+ void setViewPagerEnabled(boolean enabled);
+ }
+
+ interface Presenter {
+ void present(@NonNull MediaKeyboardProvider provider,
+ @NonNull PagerAdapter pagerAdapter,
+ @NonNull TabIconProvider iconProvider,
+ @Nullable BackspaceObserver backspaceObserver,
+ @Nullable AddObserver addObserver,
+ @Nullable SearchObserver searchObserver,
+ int startingIndex);
+ int getCurrentPosition();
+ void requestDismissal();
+ boolean isVisible();
+ }
+
+ interface TabIconProvider {
+ void loadCategoryTabIcon(@NonNull GlideRequests glideRequests, @NonNull ImageView imageView, int index);
+ }
+}
diff --git a/src/org/thoughtcrime/securesms/components/emoji/RecentEmojiPageModel.java b/src/org/thoughtcrime/securesms/components/emoji/RecentEmojiPageModel.java
index d2a8a698e..99be44d96 100644
--- a/src/org/thoughtcrime/securesms/components/emoji/RecentEmojiPageModel.java
+++ b/src/org/thoughtcrime/securesms/components/emoji/RecentEmojiPageModel.java
@@ -4,9 +4,11 @@ import android.content.Context;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.preference.PreferenceManager;
-import androidx.annotation.NonNull;
import android.util.Log;
+import androidx.annotation.NonNull;
+
+import com.annimon.stream.Stream;
import com.fasterxml.jackson.databind.type.CollectionType;
import com.fasterxml.jackson.databind.type.TypeFactory;
@@ -14,24 +16,28 @@ import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.util.JsonUtils;
import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedHashSet;
+import java.util.List;
public class RecentEmojiPageModel implements EmojiPageModel {
- private static final String TAG = RecentEmojiPageModel.class.getSimpleName();
- private static final String EMOJI_LRU_PREFERENCE = "pref_recent_emoji2";
- private static final int EMOJI_LRU_SIZE = 50;
+ private static final String TAG = RecentEmojiPageModel.class.getSimpleName();
+ private static final int EMOJI_LRU_SIZE = 50;
private final SharedPreferences prefs;
+ private final String preferenceName;
private final LinkedHashSet recentlyUsed;
- public RecentEmojiPageModel(Context context) {
- this.prefs = PreferenceManager.getDefaultSharedPreferences(context);
- this.recentlyUsed = getPersistedCache();
+ public RecentEmojiPageModel(Context context, @NonNull String preferenceName) {
+ this.prefs = PreferenceManager.getDefaultSharedPreferences(context);
+ this.preferenceName = preferenceName;
+ this.recentlyUsed = getPersistedCache();
}
private LinkedHashSet getPersistedCache() {
- String serialized = prefs.getString(EMOJI_LRU_PREFERENCE, "[]");
+ String serialized = prefs.getString(preferenceName, "[]");
try {
CollectionType collectionType = TypeFactory.defaultInstance()
.constructCollectionType(LinkedHashSet.class, String.class);
@@ -46,8 +52,14 @@ public class RecentEmojiPageModel implements EmojiPageModel {
return R.attr.emoji_category_recent;
}
- @Override public String[] getEmoji() {
- return toReversePrimitiveArray(recentlyUsed);
+ @Override public List getEmoji() {
+ List emoji = new ArrayList<>(recentlyUsed);
+ Collections.reverse(emoji);
+ return emoji;
+ }
+
+ @Override public List getDisplayEmoji() {
+ return Stream.of(getEmoji()).map(Emoji::new).toList();
}
@Override public boolean hasSpriteMap() {
@@ -63,7 +75,6 @@ public class RecentEmojiPageModel implements EmojiPageModel {
}
public void onCodePointSelected(String emoji) {
- Log.w(TAG, "onCodePointSelected(" + emoji + ")");
recentlyUsed.remove(emoji);
recentlyUsed.add(emoji);
@@ -81,7 +92,7 @@ public class RecentEmojiPageModel implements EmojiPageModel {
try {
String serialized = JsonUtils.toJson(latestRecentlyUsed);
prefs.edit()
- .putString(EMOJI_LRU_PREFERENCE, serialized)
+ .putString(preferenceName, serialized)
.apply();
} catch (IOException e) {
Log.w(TAG, e);
diff --git a/src/org/thoughtcrime/securesms/components/emoji/StaticEmojiPageModel.java b/src/org/thoughtcrime/securesms/components/emoji/StaticEmojiPageModel.java
index edff49bc8..e1b248b5c 100644
--- a/src/org/thoughtcrime/securesms/components/emoji/StaticEmojiPageModel.java
+++ b/src/org/thoughtcrime/securesms/components/emoji/StaticEmojiPageModel.java
@@ -4,34 +4,63 @@ import androidx.annotation.AttrRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
-public class StaticEmojiPageModel implements EmojiPageModel {
- @AttrRes private final int iconAttr;
- @NonNull private final String[] emoji;
- @Nullable private final String sprite;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.LinkedList;
+import java.util.List;
- public StaticEmojiPageModel(@AttrRes int iconAttr, @NonNull String[] emoji, @Nullable String sprite) {
- this.iconAttr = iconAttr;
- this.emoji = emoji;
- this.sprite = sprite;
+public class StaticEmojiPageModel implements EmojiPageModel {
+ @AttrRes private final int iconAttr;
+ @NonNull private final List emoji;
+ @Nullable private final String sprite;
+
+ public StaticEmojiPageModel(@AttrRes int iconAttr, @NonNull String[] strings, @Nullable String sprite) {
+ List emoji = new ArrayList<>(strings.length);
+ for (String s : strings) {
+ emoji.add(new Emoji(s));
+ }
+
+ this.iconAttr = iconAttr;
+ this.emoji = emoji;
+ this.sprite = sprite;
+ }
+
+ public StaticEmojiPageModel(@AttrRes int iconAttr, @NonNull Emoji[] emoji, @Nullable String sprite) {
+ this.iconAttr = iconAttr;
+ this.emoji = Arrays.asList(emoji);
+ this.sprite = sprite;
}
public int getIconAttr() {
return iconAttr;
}
- @NonNull public String[] getEmoji() {
+ @Override
+ public @NonNull List getEmoji() {
+ List emojis = new LinkedList<>();
+ for (Emoji e : emoji) {
+ emojis.addAll(e.getVariations());
+ }
+ return emojis;
+ }
+
+ @Override
+ public @NonNull List getDisplayEmoji() {
return emoji;
}
- @Override public boolean hasSpriteMap() {
+ @Override
+ public boolean hasSpriteMap() {
return sprite != null;
}
- @Override @Nullable public String getSprite() {
+ @Override
+ public @Nullable String getSprite() {
return sprite;
}
- @Override public boolean isDynamic() {
+ @Override
+ public boolean isDynamic() {
return false;
}
}
diff --git a/src/org/thoughtcrime/securesms/components/emoji/parsing/EmojiDrawInfo.java b/src/org/thoughtcrime/securesms/components/emoji/parsing/EmojiDrawInfo.java
index aafeeeaaf..387af40a0 100644
--- a/src/org/thoughtcrime/securesms/components/emoji/parsing/EmojiDrawInfo.java
+++ b/src/org/thoughtcrime/securesms/components/emoji/parsing/EmojiDrawInfo.java
@@ -22,7 +22,7 @@ public class EmojiDrawInfo {
}
@Override
- public String toString() {
+ public @NonNull String toString() {
return "DrawInfo{" +
"page=" + page +
", index=" + index +
diff --git a/src/org/thoughtcrime/securesms/components/emoji/parsing/EmojiPageBitmap.java b/src/org/thoughtcrime/securesms/components/emoji/parsing/EmojiPageBitmap.java
index ec4d652f1..a88f5f768 100644
--- a/src/org/thoughtcrime/securesms/components/emoji/parsing/EmojiPageBitmap.java
+++ b/src/org/thoughtcrime/securesms/components/emoji/parsing/EmojiPageBitmap.java
@@ -1,26 +1,28 @@
package org.thoughtcrime.securesms.components.emoji.parsing;
+import android.annotation.SuppressLint;
import android.content.Context;
+import android.content.res.AssetManager;
import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
import android.os.AsyncTask;
-import androidx.annotation.NonNull;
import android.util.Log;
-import com.bumptech.glide.load.engine.DiskCacheStrategy;
+import androidx.annotation.NonNull;
import org.thoughtcrime.securesms.components.emoji.EmojiPageModel;
-import org.thoughtcrime.securesms.mms.GlideApp;
import org.thoughtcrime.securesms.util.ListenableFutureTask;
+import org.thoughtcrime.securesms.util.Stopwatch;
import org.thoughtcrime.securesms.util.Util;
import java.io.IOException;
+import java.io.InputStream;
import java.lang.ref.SoftReference;
import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutionException;
public class EmojiPageBitmap {
- private static final String TAG = EmojiPageBitmap.class.getName();
+ private static final String TAG = EmojiPageBitmap.class.getSimpleName();
private final Context context;
private final EmojiPageModel model;
@@ -35,6 +37,7 @@ public class EmojiPageBitmap {
this.decodeScale = decodeScale;
}
+ @SuppressLint("StaticFieldLeak")
public ListenableFutureTask get() {
Util.assertMainThread();
@@ -45,7 +48,7 @@ public class EmojiPageBitmap {
} else {
Callable callable = () -> {
try {
- Log.w(TAG, "loading page " + model.getSprite());
+ Log.i(TAG, "loading page " + model.getSprite());
return loadPage();
} catch (IOException ioe) {
Log.w(TAG, ioe);
@@ -67,34 +70,38 @@ public class EmojiPageBitmap {
return task;
}
- public Bitmap loadPage() throws IOException {
+ private Bitmap loadPage() throws IOException {
if (bitmapReference != null && bitmapReference.get() != null) return bitmapReference.get();
- try {
- Bitmap originalBitmap = GlideApp.with(context.getApplicationContext())
- .asBitmap()
- .load("file:///android_asset/" + model.getSprite())
- .skipMemoryCache(true)
- .diskCacheStrategy(DiskCacheStrategy.NONE)
- .submit()
- .get();
- Bitmap scaledBitmap = Bitmap.createScaledBitmap(originalBitmap, (int)(originalBitmap.getWidth() * decodeScale), (int)(originalBitmap.getHeight() * decodeScale), false);
+ float scale = decodeScale;
+ AssetManager assetManager = context.getAssets();
+ InputStream assetStream = assetManager.open(model.getSprite());
+ BitmapFactory.Options options = new BitmapFactory.Options();
- bitmapReference = new SoftReference<>(scaledBitmap);
- Log.w(TAG, "onPageLoaded(" + model.getSprite() + ")");
- return scaledBitmap;
- } catch (InterruptedException e) {
- Log.w(TAG, e);
- throw new IOException(e);
- } catch (ExecutionException e) {
- Log.w(TAG, e);
- throw new IOException(e);
+ if (Util.isLowMemory(context)) {
+ Log.i(TAG, "Low memory detected. Changing sample size.");
+ options.inSampleSize = 2;
+ scale = decodeScale * 2;
}
+
+ Stopwatch stopwatch = new Stopwatch(model.getSprite());
+ Bitmap bitmap = BitmapFactory.decodeStream(assetStream, null, options);
+ stopwatch.split("decode");
+
+ Bitmap scaledBitmap = Bitmap.createScaledBitmap(bitmap, (int)(bitmap.getWidth() * scale), (int)(bitmap.getHeight() * scale), true);
+ stopwatch.split("scale");
+ stopwatch.stop(TAG);
+
+ bitmapReference = new SoftReference<>(scaledBitmap);
+ Log.i(TAG, "onPageLoaded(" + model.getSprite() + ") originalByteCount: " + bitmap.getByteCount()
+ + " scaledByteCount: " + scaledBitmap.getByteCount()
+ + " scaledSize: " + scaledBitmap.getWidth() + "x" + scaledBitmap.getHeight());
+ return scaledBitmap;
}
@Override
- public String toString() {
+ public @NonNull 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
index d846a053b..91450e102 100644
--- a/src/org/thoughtcrime/securesms/components/emoji/parsing/EmojiParser.java
+++ b/src/org/thoughtcrime/securesms/components/emoji/parsing/EmojiParser.java
@@ -42,7 +42,9 @@ public class EmojiParser {
public @NonNull CandidateList findCandidates(@Nullable CharSequence text) {
List results = new LinkedList<>();
- if (text == null) return new CandidateList(results, false);
+ if (text == null) {
+ return new CandidateList(results, false);
+ }
boolean allEmojis = text.length() > 0;
@@ -61,11 +63,13 @@ public class EmojiParser {
results.add(new Candidate(i, emojiEnd, drawInfo));
i = emojiEnd - 1;
- } else {
+ } else if (text.charAt(i) != ' '){
allEmojis = false;
}
}
+ allEmojis &= !results.isEmpty();
+
return new CandidateList(results, allEmojis);
}
@@ -124,7 +128,7 @@ public class EmojiParser {
}
@Override
- public Iterator iterator() {
+ public @NonNull Iterator iterator() {
return list.iterator();
}
}
diff --git a/src/org/thoughtcrime/securesms/util/ResUtil.java b/src/org/thoughtcrime/securesms/util/ResUtil.java
index 40914fab6..b71822c4a 100644
--- a/src/org/thoughtcrime/securesms/util/ResUtil.java
+++ b/src/org/thoughtcrime/securesms/util/ResUtil.java
@@ -48,7 +48,12 @@ public class ResUtil {
}
public static Drawable getDrawable(Context c, @AttrRes int attr) {
- return ContextCompat.getDrawable(c, getDrawableRes(c, attr));
+ try {
+ return ContextCompat.getDrawable(c, getDrawableRes(c, attr));
+ } catch (Exception e) {
+ e.printStackTrace();
+ return null;
+ }
}
public static int[] getResourceIds(Context c, @ArrayRes int array) {
diff --git a/src/org/thoughtcrime/securesms/util/Stopwatch.java b/src/org/thoughtcrime/securesms/util/Stopwatch.java
new file mode 100644
index 000000000..a64a9c3f4
--- /dev/null
+++ b/src/org/thoughtcrime/securesms/util/Stopwatch.java
@@ -0,0 +1,59 @@
+package org.thoughtcrime.securesms.util;
+
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+
+
+import java.util.LinkedList;
+import java.util.List;
+
+public class Stopwatch {
+
+ private final long startTime;
+ private final String title;
+ private final List splits;
+
+ public Stopwatch(@NonNull String title) {
+ this.startTime = System.currentTimeMillis();
+ this.title = title;
+ this.splits = new LinkedList<>();
+ }
+
+ public void split(@NonNull String label) {
+ splits.add(new Split(System.currentTimeMillis(), label));
+ }
+
+ public void stop(@NonNull String tag) {
+ StringBuilder out = new StringBuilder();
+ out.append("[").append(title).append("] ");
+
+ if (splits.size() > 0) {
+ out.append(splits.get(0).label).append(": ");
+ out.append(splits.get(0).time - startTime);
+ out.append(" ");
+ }
+
+ if (splits.size() > 1) {
+ for (int i = 1; i < splits.size(); i++) {
+ out.append(splits.get(i).label).append(": ");
+ out.append(splits.get(i).time - splits.get(i - 1).time);
+ out.append(" ");
+ }
+
+ out.append("total: ").append(splits.get(splits.size() - 1).time - startTime);
+ }
+
+ Log.d(tag, out.toString());
+ }
+
+ private static class Split {
+ final long time;
+ final String label;
+
+ Split(long time, String label) {
+ this.time = time;
+ this.label = label;
+ }
+ }
+}