diff --git a/.github/workflows/preview-apk.yml b/.github/workflows/preview-apk.yml
index 7147450155..316624ae7b 100644
--- a/.github/workflows/preview-apk.yml
+++ b/.github/workflows/preview-apk.yml
@@ -35,7 +35,7 @@ jobs:
- uses: nttld/setup-ndk@v1
id: setup-ndk
with:
- ndk-version: r23c
+ ndk-version: r27
- name: Compile core
env:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index e3b7335734..f61a41427f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,6 @@
# ArcaneChat Android Changelog
-## v1.48.1
+## v1.48.3
2024-10
* new Proxy settings screen available at "Advanced / Proxy"
@@ -10,6 +10,8 @@
* scan Proxies' QR code and use them
* make Proxy URLs inside Delta Chat tappable
* open Delta Chat when tapping Proxy URLs in other apps
+* support for realtime webxdc apps moved out of experimental and enabled by default
+* realtime webxdc apps can be disabled at "Settings / Advanced"
* "New Contact / Link" button to view, share or copy the invite line
* "New Contact / Scan" button to easier access the scanner functionality
* open "New Contact" scan/show activities directly, do not try to be too smart and open the last active tab
@@ -44,8 +46,10 @@
* assign messages to ad-hoc group with matching name and members
* use stricter TLS checks for HTTPS downloads (images in HTML mails, Autoconfig)
* improve logging for failed QR code scans, AEAP, Autocrypt, notification permissions and sending errors
+* improve logging of multi account setup (log account ID)
* show more context for the "Cannot establish guaranteed..." info message
-* show original file name in "Message Info"
+* show file name in "Message Info"
+* show root SMTP connection failure in connectivity view
* fix: Sort received outgoing message down if it's fresher than all non fresh messages
* fix: avoid app being killed when processing a PUSH notification
* fix crash when refreshing avatar
@@ -65,8 +69,12 @@
* fix: normalize proxy URLs
* fix connections getting stuck in "Updating..." sometimes
* fix scanning "add second device" QR code from scanner above chatlist
+* fix warning about wrong password
+* fix app getting stale when receiving a PUSH notifications takes longer
+* fix app getting stale on network changes
+* fix: skip IDLE if we got unsolicited FETCH
* update translations and local help
-* update to core 1.148.4
+* update to core 1.148.6
## v1.46.14
diff --git a/Dockerfile b/Dockerfile
index 4255d6ddbc..568542bba9 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -34,10 +34,10 @@ ENV PATH ${PATH}:${ANDROID_SDK_ROOT}/cmdline-tools/bin
# Install NDK manually. Other SDK parts are installed automatically by gradle.
#
# If you change the NDK version here, also change it in `flake.nix`.
-# NDK version r23c LTS aka 23.2.8568313
-RUN sdkmanager --sdk_root=${ANDROID_SDK_ROOT} 'ndk;23.2.8568313'
+# NDK version r27 LTS aka 27.0.11902837
+RUN sdkmanager --sdk_root=${ANDROID_SDK_ROOT} 'ndk;27.0.11902837'
-ENV ANDROID_NDK_ROOT ${ANDROID_SDK_ROOT}/ndk/23.2.8568313
+ENV ANDROID_NDK_ROOT ${ANDROID_SDK_ROOT}/ndk/27.0.11902837
ENV PATH ${PATH}:${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/linux-x86_64/bin/
RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain none
diff --git a/RELEASE.md b/RELEASE.md
index 84f8350e8e..86ddb29af7 100644
--- a/RELEASE.md
+++ b/RELEASE.md
@@ -48,7 +48,8 @@ the following steps are done in a PR called `prep-VERSION` (no leading "v"):
6. build APKs:
a) generate debug APK at "Build / Build Bundle(s)/APK / Build APK(s)"
b) generate release APK at "Build / Generate Signed Bundle or APK",
- select "APK", add keys, flavor `gplayRelease`
+ select "APK", add keys, flavor `gplayRelease`.
+ this APK will go to the stores and is located at `gplay/release`
## Push Test Releases
@@ -79,16 +80,21 @@ only afterwards, push the APK to stores. **consider a blog post.**
on :
-9. a) open "Delta Chat/Release/Production"
- then "Create new release" and upload APK from above
+9. a) open "Delta Chat / Test and release / Production"
+ then "Create new release" and upload APK from above
b) fill out "Release details/Release notes" (500 chars), add the line
"These features will roll out over the coming days. Thanks for using Delta Chat!";
release name should be default ("123 (1.2.3)")
- c) click "Next", set "Rollout Percentage" to 1% (later 2%, 5%, 10%, 20%, 50%, 100%),
- click "Save"
+ c) click "Next", set "Rollout Percentage" to 50%, click "Save"
d) Go to "Publishing Overview", "Managed publishing" is usually off;
click "Send change for review", confirm
+2 days later, change "Rollout Percentage" to 99%. Two more days later to 100%.
+Rollout is anyways slower in practise, however,
+only as long as we do not enter 100%, we can retract the version
+(Once we reach 100%, we have to submit a new version for approval.
+During these up to 4 days, sometimes longer, we cannot do anything on existing rollout)
+
## Tag for F-Droid and create Github release
@@ -111,9 +117,8 @@ on :
12. a) for "Delta Chat", select "Add upcoming version" on the left
b) at "Step 1 / Existing file(s)" hit "Replace", upload the APK from above
c) on the "Step 1" page, add "Release notes" from CHANGELOG.md, hit "Next"
- d) on "Step 2" page: "Does your app collect or transfer user data to third parties?" -> No, then "Next"
- e) on "Step 3" page: "Next"
- f) on "Step 4" page: "Submit app"
+ d) on "Step 2" and "Step 3" pages, hit "Next"
+ e) on "Step 4" page: "Submit app"
## Release on Huawei AppGallery
diff --git a/build.gradle b/build.gradle
index 6536f0bcf0..022fe21ea1 100644
--- a/build.gradle
+++ b/build.gradle
@@ -29,12 +29,12 @@ android {
// > Task :stripFatDebugDebugSymbols
// Unable to strip the following libraries, packaging them as they are: libanimation-decoder-gif.so, libnative-utils.so.
// See for details.
- ndkVersion "23.2.8568313"
+ ndkVersion "27.0.12077973"
useLibrary 'org.apache.http.legacy'
defaultConfig {
- versionCode 30000694
- versionName "1.48.2"
+ versionCode 30000695
+ versionName "1.48.4"
applicationId "chat.delta.lite"
multiDexEnabled true
@@ -206,7 +206,7 @@ dependencies {
implementation 'androidx.lifecycle:lifecycle-viewmodel:2.6.2'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2'
implementation 'androidx.work:work-runtime:2.9.1'
- implementation 'androidx.emoji2:emoji2-emojipicker:1.4.0'
+ implementation 'androidx.emoji2:emoji2-emojipicker:1.5.0'
implementation 'com.google.guava:guava:31.1-android'
implementation 'com.google.android.exoplayer:exoplayer-core:2.19.1' // plays video and audio
implementation 'com.google.android.exoplayer:exoplayer-ui:2.19.1'
diff --git a/flake.lock b/flake.lock
index 795a35dfed..34f4dab3fb 100644
--- a/flake.lock
+++ b/flake.lock
@@ -7,11 +7,11 @@
"nixpkgs": "nixpkgs"
},
"locked": {
- "lastModified": 1710633978,
- "narHash": "sha256-yemnwSvW7cdWtXGpivFA5jDO35rGPs6fqxlQ4l6ODXs=",
+ "lastModified": 1720988215,
+ "narHash": "sha256-nQ0Zx0vAWJo0IOGNFjCOdIkDSgOpMa//GalR8tbTl3A=",
"owner": "tadfisher",
"repo": "android-nixpkgs",
- "rev": "e91fb3d8517538e5ad9b422c9a4f604b56008a9e",
+ "rev": "5a052c62cdb51b210bc0717177d5bd014cba3df1",
"type": "github"
},
"original": {
@@ -29,11 +29,11 @@
]
},
"locked": {
- "lastModified": 1708939976,
- "narHash": "sha256-O5+nFozxz2Vubpdl1YZtPrilcIXPcRAjqNdNE8oCRoA=",
+ "lastModified": 1717408969,
+ "narHash": "sha256-Q0OEFqe35fZbbRPPRdrjTUUChKVhhWXz3T9ZSKmaoVY=",
"owner": "numtide",
"repo": "devshell",
- "rev": "5ddecd67edbd568ebe0a55905273e56cc82aabe3",
+ "rev": "1ebbe68d57457c8cae98145410b164b5477761f4",
"type": "github"
},
"original": {
@@ -65,11 +65,11 @@
"systems": "systems_2"
},
"locked": {
- "lastModified": 1709126324,
- "narHash": "sha256-q6EQdSeUZOG26WelxqkmR7kArjgWCdw5sfJVHPH/7j8=",
+ "lastModified": 1710146030,
+ "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=",
"owner": "numtide",
"repo": "flake-utils",
- "rev": "d465f4819400de7c8d874d50b982301f28a84605",
+ "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a",
"type": "github"
},
"original": {
@@ -96,31 +96,13 @@
"type": "github"
}
},
- "flake-utils_4": {
- "inputs": {
- "systems": "systems_4"
- },
- "locked": {
- "lastModified": 1705309234,
- "narHash": "sha256-uNRRNRKmJyCRC/8y1RqBkqWBLM034y4qN7EprSdmgyA=",
- "owner": "numtide",
- "repo": "flake-utils",
- "rev": "1ef2e671c3b0c19053962c07dbda38332dcebf26",
- "type": "github"
- },
- "original": {
- "owner": "numtide",
- "repo": "flake-utils",
- "type": "github"
- }
- },
"nixpkgs": {
"locked": {
- "lastModified": 1709237383,
- "narHash": "sha256-cy6ArO4k5qTx+l5o+0mL9f5fa86tYUX3ozE1S+Txlds=",
+ "lastModified": 1720768451,
+ "narHash": "sha256-EYekUHJE2gxeo2pM/zM9Wlqw1Uw2XTJXOSAO79ksc4Y=",
"owner": "NixOS",
"repo": "nixpkgs",
- "rev": "1536926ef5621b09bba54035ae2bb6d806d72ac8",
+ "rev": "7e7c39ea35c5cdd002cd4588b03a3fb9ece6fad9",
"type": "github"
},
"original": {
@@ -132,11 +114,11 @@
},
"nixpkgs_2": {
"locked": {
- "lastModified": 1710889954,
- "narHash": "sha256-Pr6F5Pmd7JnNEMHHmspZ0qVqIBVxyZ13ik1pJtm2QXk=",
+ "lastModified": 1723221148,
+ "narHash": "sha256-7pjpeQlZUNQ4eeVntytU3jkw9dFK3k1Htgk2iuXjaD8=",
"owner": "NixOS",
"repo": "nixpkgs",
- "rev": "7872526e9c5332274ea5932a0c3270d6e4724f3b",
+ "rev": "154bcb95ad51bc257c2ce4043a725de6ca700ef6",
"type": "github"
},
"original": {
@@ -148,11 +130,11 @@
},
"nixpkgs_3": {
"locked": {
- "lastModified": 1706487304,
- "narHash": "sha256-LE8lVX28MV2jWJsidW13D2qrHU/RUUONendL2Q/WlJg=",
+ "lastModified": 1718428119,
+ "narHash": "sha256-WdWDpNaq6u1IPtxtYHHWpl5BmabtpmLnMAx0RdJ/vo8=",
"owner": "NixOS",
"repo": "nixpkgs",
- "rev": "90f456026d284c22b3e3497be980b2e47d0b28ac",
+ "rev": "e6cea36f83499eb4e9cd184c8a8e823296b50ad5",
"type": "github"
},
"original": {
@@ -172,15 +154,14 @@
},
"rust-overlay": {
"inputs": {
- "flake-utils": "flake-utils_4",
"nixpkgs": "nixpkgs_3"
},
"locked": {
- "lastModified": 1711073443,
- "narHash": "sha256-PpNb4xq7U5Q/DdX40qe7CijUsqhVVM3VZrhN0+c6Lcw=",
+ "lastModified": 1723429325,
+ "narHash": "sha256-4x/32xTCd+xCwFoI/kKSiCr5LQA2ZlyTRYXKEni5HR8=",
"owner": "oxalica",
"repo": "rust-overlay",
- "rev": "eec55ba9fcde6be4c63942827247e42afef7fafe",
+ "rev": "65e3dc0fe079fe8df087cd38f1fe6836a0373aad",
"type": "github"
},
"original": {
@@ -233,21 +214,6 @@
"repo": "default",
"type": "github"
}
- },
- "systems_4": {
- "locked": {
- "lastModified": 1681028828,
- "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
- "owner": "nix-systems",
- "repo": "default",
- "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
- "type": "github"
- },
- "original": {
- "owner": "nix-systems",
- "repo": "default",
- "type": "github"
- }
}
},
"root": "root",
diff --git a/flake.nix b/flake.nix
index d95dd35911..e870f6ea20 100644
--- a/flake.nix
+++ b/flake.nix
@@ -20,7 +20,7 @@
ndk-bundle
platform-tools
platforms-android-34
- ndk-23-2-8568313
+ ndk-27-0-11902837
]);
rust-version = pkgs.lib.removeSuffix "\n"
(builtins.readFile ./scripts/rust-toolchain);
@@ -28,7 +28,7 @@
devShells.default = pkgs.mkShell {
ANDROID_SDK_ROOT = "${android-sdk}/share/android-sdk";
ANDROID_NDK_ROOT =
- "${android-sdk}/share/android-sdk/ndk/23.2.8568313";
+ "${android-sdk}/share/android-sdk/ndk/27.0.11902837";
buildInputs = [
android-sdk
pkgs.openjdk17
diff --git a/jni/dc_wrapper.c b/jni/dc_wrapper.c
index 8954c84d89..25679a79fd 100644
--- a/jni/dc_wrapper.c
+++ b/jni/dc_wrapper.c
@@ -7,57 +7,6 @@
#include "deltachat-core-rust/deltachat-ffi/deltachat.h"
-#if __ANDROID_API__ == 16
-unsigned long getauxval(unsigned long type) {
- return 0;
-}
-
-#include
-#include
-
-int sendmmsg(int sockfd, struct mmsghdr *msgvec, unsigned int vlen,
- int flags)
-{
- if (flags != 0) {
- // Not supported by the fallback.
- return -1;
- }
-
- if (vlen == 0) {
- return 0;
- }
-
- ssize_t n = sendmsg(sockfd, &msgvec->msg_hdr, flags);
- if (n == -1) {
- return -1;
- }
-
- (*msgvec).msg_len = n;
- return 1;
-}
-
-int recvmmsg(int sockfd, struct mmsghdr *msgvec, unsigned int vlen,
- int flags, struct timespec *timeout)
-{
- if (flags != 0) {
- // Not supported by the fallback.
- return -1;
- }
-
- if (vlen == 0) {
- return 0;
- }
-
- int n = recvmsg(sockfd, &msgvec->msg_hdr, flags);
- if (n == -1) {
- return -1;
- }
- (*msgvec).msg_len = n;
- return 1;
-}
-#endif
-
-
static dc_msg_t* get_dc_msg(JNIEnv *env, jobject obj);
diff --git a/jni/deltachat-core-rust b/jni/deltachat-core-rust
index f66fbc2e29..8f8178d5e0 160000
--- a/jni/deltachat-core-rust
+++ b/jni/deltachat-core-rust
@@ -1 +1 @@
-Subproject commit f66fbc2e29a5b21a39f94893e46c4388cf71b3e3
+Subproject commit 8f8178d5e09ef1bcdafe08710cdc77a98fc5aefa
diff --git a/scripts/ndk-make.sh b/scripts/ndk-make.sh
index 3dac4874ec..82330bb9d4 100755
--- a/scripts/ndk-make.sh
+++ b/scripts/ndk-make.sh
@@ -77,9 +77,9 @@ if test -z "$NDK_HOST_TAG"; then
fi
TOOLCHAIN="$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/$NDK_HOST_TAG"
-export CARGO_TARGET_ARMV7_LINUX_ANDROIDEABI_LINKER="$TOOLCHAIN/bin/armv7a-linux-androideabi16-clang"
+export CARGO_TARGET_ARMV7_LINUX_ANDROIDEABI_LINKER="$TOOLCHAIN/bin/armv7a-linux-androideabi21-clang"
export CARGO_TARGET_AARCH64_LINUX_ANDROID_LINKER="$TOOLCHAIN/bin/aarch64-linux-android21-clang"
-export CARGO_TARGET_I686_LINUX_ANDROID_LINKER="$TOOLCHAIN/bin/i686-linux-android16-clang"
+export CARGO_TARGET_I686_LINUX_ANDROID_LINKER="$TOOLCHAIN/bin/i686-linux-android21-clang"
export CARGO_TARGET_X86_64_LINUX_ANDROID_LINKER="$TOOLCHAIN/bin/x86_64-linux-android21-clang"
export RUSTUP_TOOLCHAIN=$(cat "$(dirname "$0")/rust-toolchain")
@@ -125,7 +125,7 @@ unset CPATH
if test -z $1 || test $1 = armeabi-v7a; then
echo "-- cross compiling to armv7-linux-androideabi (arm) --"
- TARGET_CC="$TOOLCHAIN/bin/armv7a-linux-androideabi16-clang" \
+ TARGET_CC="$TOOLCHAIN/bin/armv7a-linux-androideabi21-clang" \
TARGET_AR="$TOOLCHAIN/bin/llvm-ar" \
TARGET_RANLIB="$TOOLCHAIN/bin/llvm-ranlib" \
cargo build $RELEASEFLAG --target armv7-linux-androideabi -p deltachat_ffi --features jsonrpc
@@ -143,7 +143,7 @@ fi
if test -z $1 || test $1 = x86; then
echo "-- cross compiling to i686-linux-android (x86) --"
- TARGET_CC="$TOOLCHAIN/bin/i686-linux-android16-clang" \
+ TARGET_CC="$TOOLCHAIN/bin/i686-linux-android21-clang" \
TARGET_AR="$TOOLCHAIN/bin/llvm-ar" \
TARGET_RANLIB="$TOOLCHAIN/bin/llvm-ranlib" \
cargo build $RELEASEFLAG --target i686-linux-android -p deltachat_ffi --features jsonrpc
diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml
index 30fabae56f..63d1e119dc 100644
--- a/src/main/AndroidManifest.xml
+++ b/src/main/AndroidManifest.xml
@@ -66,6 +66,10 @@
android:resource="@xml/automotive_app_desc" />
-->
+
+
+
Разное
Какие разрешения нужны Delta Chat?
- Работает ли Delta Chat работу с моим провайдером электронной почты?
+ Работает ли Delta Chat с моим провайдером электронной почты?
Я хочу управлять своим собственным почтовым сервером для Delta Chat. Что вы посоветуете?
Почему я должен вводить свой пароль от электронной почты в Delta Chat? Это безопасно?
Какие сообщения отображаются в Delta Chat?
@@ -217,7 +217,7 @@
-Профиль - это имя, изображение и некоторая дополнительная информация для шифрования сообщений.
+
Профиль — это имя, изображение и некоторая дополнительная информация для шифрования сообщений.
Профиль существует только на вашем устройстве(ах)
и использует серверы chatmail или обычные серверы электронной почты для передачи сообщений.
@@ -350,7 +350,7 @@
приложение Delta Chat каждого участника чата позаботится
об удалении сообщений
по истечении выбранного периода времени.
-Отсчет времени начинается
+Отсчет времени начинается,
когда получатель впервые видит сообщение в Delta Chat.
Сообщения удаляются
как в каждой учетной записи электронной почты на сервере,
@@ -429,7 +429,7 @@
- Обратите внимание, что если вы используете Delta Chat на нескольких устройствах,
+
Обратите внимание, что, если вы используете Delta Chat на нескольких устройствах,
необходимо оставлять сообщения на сервере с достаточным временным интервалом,
чтобы другое устройство(а) тоже смогло их загрузить.
@@ -575,8 +575,8 @@
Принудительное соединение в фоновом режиме: это запасной вариант
-если предыдущие варианты недоступны или или не обеспечивают “мгновенную доставку”.
-Включение этого параметра вызывает постоянное уведомление на вашем телефоне
+если предыдущие варианты недоступны или не обеспечивают “мгновенную доставку”.
+Включение этого параметра вызывает постоянное уведомление на вашем телефоне,
которое иногда может быть “сжато” на последних телефонах Android.
@@ -642,7 +642,7 @@ Autocrypt используется для автоматической
установки сквозного шифрования при работе с контактами и групповыми чатами.
Autocrypt использует ограниченное и безопасное подмножество стандарта OpenPGP .
-Сообщения, зашифрованные сквозным шифрованием помечаются замком
+Сообщения, зашифрованные сквозным шифрованием, помечаются замком
.
Протоколы Secure-Join
@@ -689,7 +689,7 @@
-Все сообщения зашифрованые сквозным шифрованием имеют значок замка:
+Все сообщения, зашифрованные сквозным шифрованием, имеют значок замка:
@@ -779,7 +779,7 @@
В профиле контакта можно несколько раз нажать на текст “Представлен …” несколько раз
пока не дойдёте до того, с кем вы непосредственно провели QR-сканирование .
- Обратите внимание, что в профиле контакта вы можете увидеть и присоеденённых знакомых
+
Обратите внимание, что в профиле контакта вы можете увидеть и присоединённых знакомых,
но в заголовке профиля нет зелёной галочки.
Обычно это означает, что контакт “отправил сообщение с другого устройства” .
@@ -797,10 +797,10 @@
Ваш чат с контактом утратил гарантированное сквозное шифрование.
-Зелёная галочка была удалёна для этого чата и контакта, и когда вы увидели предупреждение.
+Зелёная галочка была удалена для этого чата и контакта, и когда вы увидели предупреждение.
Если вы обнаружили внезапное прекращение гарантированного сквозного шифрования
для этого контакта, не принимайте предупреждение!
-Вместо этого свяжитесь со своим контактом по второму каналу
+Вместо этого свяжитесь со своим контактом по второму каналу,
например, видеозвонок, другой мессенджер или телефонный звонок,
чтобы узнать, что произошло.
@@ -935,7 +935,7 @@
и возвращает ошибку
если код обнаружения модификаций не совпадает.
- Delta Chat также никогда не был уязвим к атаке “Direct Exfiltration” EFAIL
+
Delta Chat также никогда не был уязвим к атаке “Direct Exfiltration” EFAIL,
потому что он расшифровывает только многочастные/зашифрованные
сообщения,
которые содержат ровно одну зашифрованную и подписанную часть,
как определено спецификацией Autocrypt Level 1.
@@ -1172,16 +1172,16 @@ .asc.
- Delta Chat поддерживает расспространённые форматы закрытых ключей OpenPGP, однако
+
Delta Chat поддерживает распространённые форматы закрытых ключей OpenPGP, однако
маловероятно, что мы будем поддерживать все закрытые ключи из любых источников. Это
-не является основной целью Delta Chat. На самом деле, подавляющее большинство пользователей
+не является основной целью Delta Chat. На самом деле, подавляющее большинство пользователей
Delta Chat не будут иметь никакого ключа, прежде чем они начнут использовать его.
Однако мы стремимся поддерживать закрытые ключи из как можно большего числа источников.
@@ -1305,7 +1305,7 @@
- Перепроверьте, что оба устройства находятся в в одной Wi-Fi или локальной сети .
+ Перепроверьте, что оба устройства находятся в одной Wi-Fi или локальной сети .
В Windows перейдите в Панель управления / Сеть и Интернет
@@ -1407,12 +1407,12 @@
- Приложения webxdc - это просто архивы zip, содержащие код html, css и javascript.
+ Приложения webxdc — это просто архивы zip, содержащие код html, css и javascript.
Вы можете расширить пример приложения Hello World
для начала.
Все остальное, что вам нужно знать, написано в
@@ -1572,7 +1572,7 @@
-
+
- Работает ли Delta Chat работу с моим провайдером электронной почты?
+ Работает ли Delta Chat с моим провайдером электронной почты?
@@ -1791,7 +1791,7 @@
основанную на Свободном и Открытом исходном коде.
В частности, разработка Delta Chat финансировалась из следующих источников,
-перечисленны в хронологическом порядке:
+перечислены в хронологическом порядке:
@@ -1910,7 +1910,7 @@
и выпустили первую бета-версию приложения для настольных систем, а также провели
исследования в области UX в контексте прав человека,
см. наш заключительный отчет Needfinding and UX report .
-Второй грант, полученый в 2019/2020 году (~$300тыс.), помог нам
+Второй грант, полученный в 2019/2020 году (~$300 тыс.), помог нам
выпустить версии Delta/iOS, перевести наш основной код на Rust и
предоставить новые функции для всех платформ.
diff --git a/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java b/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java
index dc8ccae5a5..72a6a03912 100644
--- a/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java
+++ b/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java
@@ -27,7 +27,6 @@
import com.b44t.messenger.DcEventEmitter;
import com.b44t.messenger.rpc.Rpc;
-import org.thoughtcrime.securesms.components.emoji.EmojiProvider;
import org.thoughtcrime.securesms.connect.AccountManager;
import org.thoughtcrime.securesms.connect.DcEventCenter;
import org.thoughtcrime.securesms.connect.DcHelper;
@@ -107,11 +106,6 @@ public void onCreate() {
Log.i("DeltaChat", "++++++++++++++++++ ApplicationContext.onCreate() ++++++++++++++++++");
- // The first call to `getInstance` takes about 100ms-300ms, so, do it on a background thread
- Thread t = new Thread(() -> EmojiProvider.getInstance(this), "InitEmojiProviderThread");
- t.setPriority(Thread.MIN_PRIORITY);
- t.start();
-
System.loadLibrary("native-utils");
dcAccounts = new DcAccounts(new File(getFilesDir(), "accounts").getAbsolutePath());
diff --git a/src/main/java/org/thoughtcrime/securesms/ConversationActivity.java b/src/main/java/org/thoughtcrime/securesms/ConversationActivity.java
index 3ddca3e15f..01edd92512 100644
--- a/src/main/java/org/thoughtcrime/securesms/ConversationActivity.java
+++ b/src/main/java/org/thoughtcrime/securesms/ConversationActivity.java
@@ -89,8 +89,6 @@
import org.thoughtcrime.securesms.components.KeyboardAwareLinearLayout.OnKeyboardShownListener;
import org.thoughtcrime.securesms.components.ScaleStableImageView;
import org.thoughtcrime.securesms.components.SendButton;
-import org.thoughtcrime.securesms.components.emoji.EmojiKeyboardProvider;
-import org.thoughtcrime.securesms.components.emoji.EmojiProvider;
import org.thoughtcrime.securesms.components.emoji.MediaKeyboard;
import org.thoughtcrime.securesms.connect.AccountManager;
import org.thoughtcrime.securesms.connect.DcEventCenter;
@@ -1238,7 +1236,6 @@ public void onFailure(ExecutionException e) {}
@Override
public void onEmojiToggle() {
if (!emojiDrawerStub.resolved()) {
- initializeMediaKeyboardProviders(emojiDrawerStub.get(), false);
inputPanel.setMediaKeyboard(emojiDrawerStub.get());
}
@@ -1277,13 +1274,6 @@ private void sendSticker(@NonNull Uri uri, String contentType) {
dcContext.sendMsg(chatId, msg);
}
- 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 {
diff --git a/src/main/java/org/thoughtcrime/securesms/ConversationItem.java b/src/main/java/org/thoughtcrime/securesms/ConversationItem.java
index c07640cd7b..1c2184f09f 100644
--- a/src/main/java/org/thoughtcrime/securesms/ConversationItem.java
+++ b/src/main/java/org/thoughtcrime/securesms/ConversationItem.java
@@ -56,7 +56,6 @@
import org.thoughtcrime.securesms.components.QuoteView;
import org.thoughtcrime.securesms.components.VcardView;
import org.thoughtcrime.securesms.components.WebxdcView;
-import org.thoughtcrime.securesms.components.emoji.EmojiTextView;
import org.thoughtcrime.securesms.connect.DcHelper;
import org.thoughtcrime.securesms.mms.AudioSlide;
import org.thoughtcrime.securesms.mms.DocumentSlide;
@@ -69,6 +68,7 @@
import org.thoughtcrime.securesms.mms.VcardSlide;
import org.thoughtcrime.securesms.reactions.ReactionsConversationView;
import org.thoughtcrime.securesms.recipients.Recipient;
+import org.thoughtcrime.securesms.util.Linkifier;
import org.thoughtcrime.securesms.util.LongClickMovementMethod;
import org.thoughtcrime.securesms.util.MarkdownUtil;
import org.thoughtcrime.securesms.util.MediaUtil;
@@ -112,6 +112,7 @@ public class ConversationItem extends BaseConversationItem
protected ViewGroup contactPhotoHolder;
private ViewGroup container;
private Button msgActionButton;
+ private Button showFullButton;
private @NonNull Stub mediaThumbnailStub;
private @NonNull Stub audioViewStub;
@@ -158,6 +159,7 @@ protected void onFinishInflate() {
this.container = findViewById(R.id.container);
this.replyView = findViewById(R.id.reply_icon);
this.msgActionButton = findViewById(R.id.msg_action_button);
+ this.showFullButton = findViewById(R.id.show_full_button);
setOnClickListener(new ClickListener(null));
@@ -399,7 +401,7 @@ else if (text.isEmpty()) {
else {
Spannable spannable = (Spannable) MarkdownUtil.toMarkdown(context, text);
if (batchSelected.isEmpty()) {
- spannable = EmojiTextView.linkify(spannable);
+ spannable = Linkifier.linkify(spannable);
}
bodyText.setText(spannable);
bodyText.setVisibility(View.VISIBLE);
@@ -407,6 +409,7 @@ else if (text.isEmpty()) {
int downloadState = messageRecord.getDownloadState();
if (downloadState == DcMsg.DC_DOWNLOAD_AVAILABLE || downloadState == DcMsg.DC_DOWNLOAD_FAILURE || downloadState == DcMsg.DC_DOWNLOAD_IN_PROGRESS) {
+ showFullButton.setVisibility(View.GONE);
msgActionButton.setVisibility(View.VISIBLE);
if (downloadState==DcMsg.DC_DOWNLOAD_IN_PROGRESS) {
msgActionButton.setEnabled(false);
@@ -427,6 +430,7 @@ else if (text.isEmpty()) {
}
});
} else if (messageRecord.getType() == DcMsg.DC_MSG_WEBXDC) {
+ showFullButton.setVisibility(View.GONE);
msgActionButton.setVisibility(View.VISIBLE);
msgActionButton.setEnabled(true);
msgActionButton.setText(webxdcViewStub.get().isCommunity()? R.string.join: R.string.start_app);
@@ -439,10 +443,11 @@ else if (text.isEmpty()) {
});
}
else if (messageRecord.hasHtml()) {
- msgActionButton.setVisibility(View.VISIBLE);
- msgActionButton.setEnabled(true);
- msgActionButton.setText(R.string.show_full_message);
- msgActionButton.setOnClickListener(view -> {
+ msgActionButton.setVisibility(View.GONE);
+ showFullButton.setVisibility(View.VISIBLE);
+ showFullButton.setEnabled(true);
+ showFullButton.setText(R.string.show_full_message);
+ showFullButton.setOnClickListener(view -> {
if (eventListener != null && batchSelected.isEmpty()) {
eventListener.onShowFullClicked(messageRecord);
} else {
@@ -451,6 +456,7 @@ else if (messageRecord.hasHtml()) {
});
} else {
msgActionButton.setVisibility(View.GONE);
+ showFullButton.setVisibility(View.GONE);
}
}
diff --git a/src/main/java/org/thoughtcrime/securesms/CreateProfileActivity.java b/src/main/java/org/thoughtcrime/securesms/CreateProfileActivity.java
index f831a7ad2f..62307d87f5 100644
--- a/src/main/java/org/thoughtcrime/securesms/CreateProfileActivity.java
+++ b/src/main/java/org/thoughtcrime/securesms/CreateProfileActivity.java
@@ -5,7 +5,6 @@
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
-import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.AsyncTask;
@@ -35,8 +34,6 @@
import org.thoughtcrime.securesms.components.AvatarSelector;
import org.thoughtcrime.securesms.components.InputAwareLayout;
-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.AttachmentManager;
@@ -54,7 +51,7 @@
@SuppressLint("StaticFieldLeak")
-public class CreateProfileActivity extends BaseActionBarActivity implements EmojiKeyboardProvider.EmojiEventListener {
+public class CreateProfileActivity extends BaseActionBarActivity {
private static final String TAG = CreateProfileActivity.class.getSimpleName();
@@ -66,7 +63,6 @@ public class CreateProfileActivity extends BaseActionBarActivity implements Emoj
private ImageView avatar;
private EditText name;
private EditText overridenName;
- private MediaKeyboard emojiDrawer;
private EditText statusView;
private boolean fromWelcome;
@@ -91,7 +87,6 @@ public void onCreate(Bundle bundle) {
attachmentManager = new AttachmentManager(this, () -> {});
avatarChanged = false;
initializeResources();
- initializeEmojiInput();
initializeProfileName();
initializeProfileAvatar();
initializeStatusText();
@@ -130,15 +125,6 @@ public void onBackPressed() {
}
}
- @Override
- public void onConfigurationChanged(Configuration newConfig) {
- super.onConfigurationChanged(newConfig);
-
- if (container.getCurrentInput() == emojiDrawer) {
- container.hideAttachedInput(true);
- }
- }
-
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) {
Permissions.onRequestPermissionsResult(this, requestCode, permissions, grantResults);
@@ -206,7 +192,6 @@ private void initializeResources() {
this.avatar = ViewUtil.findById(this, R.id.avatar);
this.name = ViewUtil.findById(this, R.id.name_text);
this.overridenName = ViewUtil.findById(this, R.id.overriden_name);
- this.emojiDrawer = ViewUtil.findById(this, R.id.emoji_drawer);
this.container = ViewUtil.findById(this, R.id.container);
this.statusView = ViewUtil.findById(this, R.id.status_text);
@@ -261,33 +246,6 @@ private void initializeProfileAvatar() {
);
}
-
- @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() {
- initializeMediaKeyboardProviders(emojiDrawer);
- this.name.setOnClickListener(v -> container.showSoftkey(name));
- }
-
private void initializeStatusText() {
String status = DcHelper.get(this, DcHelper.CONFIG_SELF_STATUS);
statusView.setText(status);
diff --git a/src/main/java/org/thoughtcrime/securesms/ProfileStatusItem.java b/src/main/java/org/thoughtcrime/securesms/ProfileStatusItem.java
index c17141f616..4e55e046c3 100644
--- a/src/main/java/org/thoughtcrime/securesms/ProfileStatusItem.java
+++ b/src/main/java/org/thoughtcrime/securesms/ProfileStatusItem.java
@@ -6,12 +6,14 @@
import android.view.View;
import android.widget.LinearLayout;
-import org.thoughtcrime.securesms.components.emoji.EmojiTextView;
+import androidx.appcompat.widget.AppCompatTextView;
+
+import org.thoughtcrime.securesms.util.Linkifier;
import org.thoughtcrime.securesms.util.LongClickMovementMethod;
public class ProfileStatusItem extends LinearLayout {
- private EmojiTextView statusTextView;
+ private AppCompatTextView statusTextView;
private final PassthroughClickListener passthroughClickListener = new PassthroughClickListener();
public ProfileStatusItem(Context context) {
@@ -32,7 +34,7 @@ protected void onFinishInflate() {
}
public void set(String status) {
- statusTextView.setText(EmojiTextView.linkify(new SpannableString(status)));
+ statusTextView.setText(Linkifier.linkify(new SpannableString(status)));
}
private class PassthroughClickListener implements View.OnLongClickListener, View.OnClickListener {
diff --git a/src/main/java/org/thoughtcrime/securesms/RegistrationActivity.java b/src/main/java/org/thoughtcrime/securesms/RegistrationActivity.java
index f52eafffb2..6d7f3ddd0d 100644
--- a/src/main/java/org/thoughtcrime/securesms/RegistrationActivity.java
+++ b/src/main/java/org/thoughtcrime/securesms/RegistrationActivity.java
@@ -31,7 +31,6 @@
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
-import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.TextView;
@@ -59,6 +58,7 @@
import org.thoughtcrime.securesms.util.DynamicTheme;
import org.thoughtcrime.securesms.util.IntentUtils;
import org.thoughtcrime.securesms.util.Util;
+import org.thoughtcrime.securesms.util.ViewUtil;
import org.thoughtcrime.securesms.util.views.ProgressDialog;
import java.lang.ref.WeakReference;
@@ -185,7 +185,7 @@ public void onTextChanged(CharSequence s, int start, int before, int count) { }
expandAdvanced = expandAdvanced || !TextUtils.isEmpty(strVal);
intVal = DcHelper.getInt(this, CONFIG_MAIL_SECURITY);
- imapSecurity.setSelection(intVal);
+ imapSecurity.setSelection(ViewUtil.checkBounds(intVal, imapSecurity));
expandAdvanced = expandAdvanced || intVal != 0;
TextInputEditText smtpLoginInput = findViewById(R.id.smtp_login_text);
@@ -207,7 +207,7 @@ public void onTextChanged(CharSequence s, int start, int before, int count) { }
expandAdvanced = expandAdvanced || !TextUtils.isEmpty(strVal);
intVal = DcHelper.getInt(this, CONFIG_SEND_SECURITY);
- smtpSecurity.setSelection(intVal);
+ smtpSecurity.setSelection(ViewUtil.checkBounds(intVal, smtpSecurity));
expandAdvanced = expandAdvanced || intVal != 0;
int serverFlags = DcHelper.getInt(this, CONFIG_SERVER_FLAGS);
@@ -222,12 +222,15 @@ public void onTextChanged(CharSequence s, int start, int before, int count) { }
}
// /remove gmail oauth2
}
- authMethod.setSelection(sel);
+ authMethod.setSelection(ViewUtil.checkBounds(sel, authMethod));
expandAdvanced = expandAdvanced || sel != 0;
- int certCheckFlags = DcHelper.getInt(this, "imap_certificate_checks");
- certCheck.setSelection(certCheckFlags);
- expandAdvanced = expandAdvanced || certCheckFlags != 0;
+ int imapCertificateChecks = DcHelper.getInt(this, "imap_certificate_checks");
+ if (imapCertificateChecks == 3) {
+ imapCertificateChecks = 2; // 3 is a deprecated alias for 2
+ }
+ certCheck.setSelection(ViewUtil.checkBounds(imapCertificateChecks, certCheck));
+ expandAdvanced = expandAdvanced || imapCertificateChecks != 0;
} else if (getIntent() != null && getIntent().getBundleExtra(ACCOUNT_DATA) != null) {
// Companion app might have sent account data
Bundle b = getIntent().getBundleExtra(ACCOUNT_DATA);
diff --git a/src/main/java/org/thoughtcrime/securesms/components/ComposeText.java b/src/main/java/org/thoughtcrime/securesms/components/ComposeText.java
index 73d1ba4dc4..15934399fc 100644
--- a/src/main/java/org/thoughtcrime/securesms/components/ComposeText.java
+++ b/src/main/java/org/thoughtcrime/securesms/components/ComposeText.java
@@ -7,6 +7,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
+import androidx.appcompat.widget.AppCompatEditText;
import androidx.core.view.inputmethod.EditorInfoCompat;
import androidx.core.view.inputmethod.InputConnectionCompat;
import androidx.core.view.inputmethod.InputContentInfoCompat;
@@ -25,10 +26,9 @@
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.TransportOption;
-import org.thoughtcrime.securesms.components.emoji.EmojiEditText;
import org.thoughtcrime.securesms.util.Prefs;
-public class ComposeText extends EmojiEditText {
+public class ComposeText extends AppCompatEditText {
private CharSequence hint;
private SpannableString subHint;
diff --git a/src/main/java/org/thoughtcrime/securesms/components/FromTextView.java b/src/main/java/org/thoughtcrime/securesms/components/FromTextView.java
index 06ff4487f1..c6d609ad8a 100644
--- a/src/main/java/org/thoughtcrime/securesms/components/FromTextView.java
+++ b/src/main/java/org/thoughtcrime/securesms/components/FromTextView.java
@@ -2,6 +2,8 @@
import android.content.Context;
import android.graphics.Typeface;
+
+import androidx.appcompat.widget.AppCompatTextView;
import androidx.core.view.ViewCompat;
import android.text.Spannable;
import android.text.SpannableString;
@@ -14,12 +16,11 @@
import android.util.AttributeSet;
import org.thoughtcrime.securesms.R;
-import org.thoughtcrime.securesms.components.emoji.EmojiTextView;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.util.ResUtil;
import org.thoughtcrime.securesms.util.spans.CenterAlignedRelativeSizeSpan;
-public class FromTextView extends EmojiTextView {
+public class FromTextView extends AppCompatTextView {
private static final String TAG = FromTextView.class.getSimpleName();
diff --git a/src/main/java/org/thoughtcrime/securesms/components/InputPanel.java b/src/main/java/org/thoughtcrime/securesms/components/InputPanel.java
index 7b6d010651..caf4264e98 100644
--- a/src/main/java/org/thoughtcrime/securesms/components/InputPanel.java
+++ b/src/main/java/org/thoughtcrime/securesms/components/InputPanel.java
@@ -9,7 +9,6 @@
import android.text.format.DateUtils;
import android.util.AttributeSet;
import android.util.Log;
-import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AlphaAnimation;
@@ -29,14 +28,12 @@
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.animation.AnimationCompleteListener;
-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.mms.GlideRequests;
import org.thoughtcrime.securesms.mms.QuoteModel;
import org.thoughtcrime.securesms.mms.SlideDeck;
import org.thoughtcrime.securesms.recipients.Recipient;
-import org.thoughtcrime.securesms.util.Prefs;
import org.thoughtcrime.securesms.util.Util;
import org.thoughtcrime.securesms.util.ViewUtil;
import org.thoughtcrime.securesms.util.concurrent.AssertedSuccessListener;
@@ -46,9 +43,9 @@
import java.util.concurrent.atomic.AtomicLong;
public class InputPanel extends ConstraintLayout
- implements MicrophoneRecorderView.Listener,
- KeyboardAwareLinearLayout.OnKeyboardShownListener,
- EmojiKeyboardProvider.EmojiEventListener
+ implements MicrophoneRecorderView.Listener,
+ KeyboardAwareLinearLayout.OnKeyboardShownListener,
+ MediaKeyboard.MediaKeyboardListener
{
private static final String TAG = InputPanel.class.getSimpleName();
@@ -56,7 +53,7 @@ public class InputPanel extends ConstraintLayout
private static final int FADE_TIME = 150;
private QuoteView quoteView;
- private EmojiToggle mediaKeyboard;
+ private EmojiToggle emojiToggle;
private ComposeText composeText;
private View quickCameraToggle;
private View quickAudioToggle;
@@ -70,7 +67,6 @@ public class InputPanel extends ConstraintLayout
private ValueAnimator quoteAnimator;
private @Nullable Listener listener;
- private boolean emojiVisible;
public InputPanel(Context context) {
super(context);
@@ -92,7 +88,7 @@ public void onFinishInflate() {
View quoteDismiss = findViewById(R.id.quote_dismiss);
this.quoteView = findViewById(R.id.quote_view);
- this.mediaKeyboard = findViewById(R.id.emoji_toggle);
+ this.emojiToggle = 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);
@@ -106,21 +102,13 @@ public void onFinishInflate() {
this.recordLockCancel.setOnClickListener(v -> microphoneRecorderView.cancelAction());
- if (Prefs.isSystemEmojiPreferred(getContext())) {
- mediaKeyboard.setVisibility(View.GONE);
- emojiVisible = false;
- } else {
- mediaKeyboard.setVisibility(View.VISIBLE);
- emojiVisible = true;
- }
-
quoteDismiss.setOnClickListener(v -> clearQuote());
}
public void setListener(final @NonNull Listener listener) {
this.listener = listener;
- mediaKeyboard.setOnClickListener(v -> listener.onEmojiToggle());
+ emojiToggle.setOnClickListener(v -> listener.onEmojiToggle());
}
public void setMediaListener(@NonNull MediaListener listener) {
@@ -207,7 +195,7 @@ public void clickOnComposeInput() {
}
public void setMediaKeyboard(@NonNull MediaKeyboard mediaKeyboard) {
- this.mediaKeyboard.attach(mediaKeyboard);
+ mediaKeyboard.setKeyboardListener(this);
}
@Override
@@ -221,7 +209,7 @@ public void onRecordPressed() {
recordTime.display();
slideToCancel.display();
- if (emojiVisible) ViewUtil.fadeOut(mediaKeyboard, FADE_TIME, View.INVISIBLE);
+ ViewUtil.fadeOut(emojiToggle, 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);
@@ -276,7 +264,7 @@ public void onPause() {
public void setEnabled(boolean enabled) {
composeText.setEnabled(enabled);
- mediaKeyboard.setEnabled(enabled);
+ emojiToggle.setEnabled(enabled);
quickAudioToggle.setEnabled(enabled);
quickCameraToggle.setEnabled(enabled);
}
@@ -290,7 +278,7 @@ private long onRecordHideEvent() {
future.addListener(new AssertedSuccessListener() {
@Override
public void onSuccess(Void result) {
- if (emojiVisible) ViewUtil.fadeIn(mediaKeyboard, FADE_TIME);
+ ViewUtil.fadeIn(emojiToggle, FADE_TIME);
ViewUtil.fadeIn(composeText, FADE_TIME);
ViewUtil.fadeIn(quickCameraToggle, FADE_TIME);
ViewUtil.fadeIn(quickAudioToggle, FADE_TIME);
@@ -304,25 +292,34 @@ public void onSuccess(Void result) {
@Override
public void onKeyboardShown() {
- mediaKeyboard.setToMedia();
+ emojiToggle.setToMedia();
}
- @Override
- public void onKeyEvent(KeyEvent keyEvent) {
- composeText.dispatchKeyEvent(keyEvent);
+ public boolean isRecordingInLockedMode() {
+ return microphoneRecorderView.isRecordingLocked();
+ }
+
+ public void releaseRecordingLock() {
+ microphoneRecorderView.unlockAction();
}
@Override
- public void onEmojiSelected(String emoji) {
- composeText.insertEmoji(emoji);
+ public void onShown() {
+ emojiToggle.setToIme();
}
- public boolean isRecordingInLockedMode() {
- return microphoneRecorderView.isRecordingLocked();
+ @Override
+ public void onHidden() {
+ emojiToggle.setToMedia();
}
- public void releaseRecordingLock() {
- microphoneRecorderView.unlockAction();
+ @Override
+ public void onEmojiPicked(String emoji) {
+ final int start = composeText.getSelectionStart();
+ final int end = composeText.getSelectionEnd();
+
+ composeText.getText().replace(Math.min(start, end), Math.max(start, end), emoji);
+ composeText.setSelection(start + emoji.length());
}
public interface Listener {
diff --git a/src/main/java/org/thoughtcrime/securesms/components/emoji/AnimatingImageSpan.java b/src/main/java/org/thoughtcrime/securesms/components/emoji/AnimatingImageSpan.java
deleted file mode 100644
index d75af0ba5e..0000000000
--- a/src/main/java/org/thoughtcrime/securesms/components/emoji/AnimatingImageSpan.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package org.thoughtcrime.securesms.components.emoji;
-
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.Drawable.Callback;
-import android.text.style.ImageSpan;
-
-public class AnimatingImageSpan extends ImageSpan {
- public AnimatingImageSpan(Drawable drawable, Callback callback) {
- super(drawable, ALIGN_BOTTOM);
- drawable.setCallback(callback);
- }
-}
diff --git a/src/main/java/org/thoughtcrime/securesms/components/emoji/AsciiEmojiView.java b/src/main/java/org/thoughtcrime/securesms/components/emoji/AsciiEmojiView.java
deleted file mode 100644
index 1364017f48..0000000000
--- a/src/main/java/org/thoughtcrime/securesms/components/emoji/AsciiEmojiView.java
+++ /dev/null
@@ -1,60 +0,0 @@
-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/main/java/org/thoughtcrime/securesms/components/emoji/AutoScaledEmojiTextView.java b/src/main/java/org/thoughtcrime/securesms/components/emoji/AutoScaledEmojiTextView.java
new file mode 100644
index 0000000000..da4e10bc9c
--- /dev/null
+++ b/src/main/java/org/thoughtcrime/securesms/components/emoji/AutoScaledEmojiTextView.java
@@ -0,0 +1,87 @@
+package org.thoughtcrime.securesms.components.emoji;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.util.AttributeSet;
+import android.util.TypedValue;
+
+import androidx.annotation.Nullable;
+import androidx.appcompat.widget.AppCompatTextView;
+
+import java.text.BreakIterator;
+import java.util.Locale;
+import java.util.regex.Pattern;
+
+
+public class AutoScaledEmojiTextView extends AppCompatTextView {
+
+ /*
+ source: https://util.unicode.org/UnicodeJsps/list-unicodeset.jsp?a=%5B%3AEmoji%3DYes%3A%5D&g=&i=
+ with spaces, *, # and 0-9 removed and the corresponding emojis added explicitly
+ to avoid matching normal text with such characters
+ */
+ private static final Pattern emojiRegex = Pattern.compile("([🏻-🏿😀😃😄😁😆😅🤣😂🙂🙃🫠😉😊😇🥰😍🤩😘😗☺😚😙🥲😋😛😜🤪😝🤑🤗🤭🫢🫣🤫🤔🫡🤐🤨😐😑😶🫥😏😒🙄😬🤥🫨😌😔😪🤤😴😷🤒🤕🤢🤮🤧🥵🥶🥴😵🤯🤠🥳🥸😎🤓🧐😕🫤😟🙁☹😮😯😲😳🥺🥹😦-😨😰😥😢😭😱😖😣😞😓😩😫🥱😤😡😠🤬😈👿💀☠💩🤡👹-👻👽👾🤖😺😸😹😻-😽🙀😿😾🙈-🙊💌💘💝💖💗💓💞💕💟❣💔❤🩷🧡💛💚💙🩵💜🤎🖤🩶🤍💋💯💢💥💫💦💨🕳💬🗨🗯💭💤👋🤚🖐✋🖖🫱-🫴🫷🫸👌🤌🤏✌🤞🫰🤟🤘🤙👈👉👆🖕👇☝🫵👍👎✊👊🤛🤜👏🙌🫶👐🤲🤝🙏✍💅🤳💪🦾🦿🦵🦶👂🦻👃🧠🫀🫁🦷🦴👀👁👅👄🫦👶🧒👦👧🧑👱👨🧔👩🧓👴👵🙍🙎🙅🙆💁🙋🧏🙇🤦🤷👮🕵💂🥷👷🫅🤴👸👳👲🧕🤵👰🤰🫃🫄🤱👼🎅🤶🦸🦹🧙-🧟🧌💆💇🚶🧍🧎🏃💃🕺🕴👯🧖🧗🤺🏇⛷🏂🏌🏄🚣🏊⛹🏋🚴🚵🤸🤼-🤾🤹🧘🛀🛌👭👫👬💏💑🗣👤👥🫂👪👣🦰🦱🦳🦲🐵🐒🦍🦧🐶🐕🦮🐩🐺🦊🦝🐱🐈🦁🐯🐅🐆🐴🫎🫏🐎🦄🦓🦌🦬🐮🐂-🐄🐷🐖🐗🐽🐏🐑🐐🐪🐫🦙🦒🐘🦣🦏🦛🐭🐁🐀🐹🐰🐇🐿🦫🦔🦇🐻🐨🐼🦥🦦🦨🦘🦡🐾🦃🐔🐓🐣-🐧🕊🦅🦆🦢🦉🦤🪶🦩🦚🦜🪽🪿🐸🐊🐢🦎🐍🐲🐉🦕🦖🐳🐋🐬🦭🐟-🐡🦈🐙🐚🪸🪼🐌🦋🐛-🐝🪲🐞🦗🪳🕷🕸🦂🦟🪰🪱🦠💐🌸💮🪷🏵🌹🥀🌺-🌼🌷🪻🌱🪴🌲-🌵🌾🌿☘🍀-🍃🪹🪺🍄🍇-🍍🥭🍎-🍓🫐🥝🍅🫒🥥🥑🍆🥔🥕🌽🌶🫑🥒🥬🥦🧄🧅🥜🫘🌰🫚🫛🍞🥐🥖🫓🥨🥯🥞🧇🧀🍖🍗🥩🥓🍔🍟🍕🌭🥪🌮🌯🫔🥙🧆🥚🍳🥘🍲🫕🥣🥗🍿🧈🧂🥫🍱🍘-🍝🍠🍢-🍥🥮🍡🥟-🥡🦀🦞🦐🦑🦪🍦-🍪🎂🍰🧁🥧🍫-🍯🍼🥛☕🫖🍵🍶🍾🍷-🍻🥂🥃🫗🥤🧋🧃🧉🧊🥢🍽🍴🥄🔪🫙🏺🌍-🌐🗺🗾🧭🏔⛰🌋🗻🏕🏖🏜-🏟🏛🏗🧱🪨🪵🛖🏘🏚🏠-🏦🏨-🏭🏯🏰💒🗼🗽⛪🕌🛕🕍⛩🕋⛲⛺🌁🌃🏙🌄-🌇🌉♨🎠🛝🎡🎢💈🎪🚂-🚊🚝🚞🚋-🚎🚐-🚙🛻🚚-🚜🏎🏍🛵🦽🦼🛺🚲🛴🛹🛼🚏🛣🛤🛢⛽🛞🚨🚥🚦🛑🚧⚓🛟⛵🛶🚤🛳⛴🛥🚢✈🛩🛫🛬🪂💺🚁🚟-🚡🛰🚀🛸🛎🧳⌛⏳⌚⏰-⏲🕰🕛🕧🕐🕜🕑🕝🕒🕞🕓🕟🕔🕠🕕🕡🕖🕢🕗🕣🕘🕤🕙🕥🕚🕦🌑-🌜🌡☀🌝🌞🪐⭐🌟🌠🌌☁⛅⛈🌤-🌬🌀🌈🌂☂☔⛱⚡❄☃⛄☄🔥💧🌊🎃🎄🎆🎇🧨✨🎈-🎋🎍-🎑🧧🎀🎁🎗🎟🎫🎖🏆🏅🥇-🥉⚽⚾🥎🏀🏐🏈🏉🎾🥏🎳🏏🏑🏒🥍🏓🏸🥊🥋🥅⛳⛸🎣🤿🎽🎿🛷🥌🎯🪀🪁🔫🎱🔮🪄🎮🕹🎰🎲🧩🧸🪅🪩🪆♠♥♦♣♟🃏🀄🎴🎭🖼🎨🧵🪡🧶🪢👓🕶🥽🥼🦺👔-👖🧣-🧦👗👘🥻🩱-🩳👙👚🪭👛-👝🛍🎒🩴👞👟🥾🥿👠👡🩰👢🪮👑👒🎩🎓🧢🪖⛑📿💄💍💎🔇-🔊📢📣📯🔔🔕🎼🎵🎶🎙-🎛🎤🎧📻🎷🪗🎸-🎻🪕🥁🪘🪇🪈📱📲☎📞-📠🔋🪫🔌💻🖥🖨⌨🖱🖲💽-📀🧮🎥🎞📽🎬📺📷-📹📼🔍🔎🕯💡🔦🏮🪔📔-📚📓📒📃📜📄📰🗞📑🔖🏷💰🪙💴-💸💳🧾💹✉📧-📩📤-📦📫📪📬-📮🗳✏✒🖋🖊🖌🖍📝💼📁📂🗂📅📆🗒🗓📇-📎🖇📏📐✂🗃🗄🗑🔒🔓🔏-🔑🗝🔨🪓⛏⚒🛠🗡⚔💣🪃🏹🛡🪚🔧🪛🔩⚙🗜⚖🦯🔗⛓🪝🧰🧲🪜⚗🧪-🧬🔬🔭📡💉🩸💊🩹🩼🩺🩻🚪🛗🪞🪟🛏🛋🪑🚽🪠🚿🛁🪤🪒🧴🧷🧹-🧻🪣🧼🫧🪥🧽🧯🛒🚬⚰🪦⚱🧿🪬🗿🪧🪪🏧🚮🚰♿🚹-🚼🚾🛂-🛅⚠🚸⛔🚫🚳🚭🚯🚱🚷📵🔞☢☣⬆↗➡↘⬇↙⬅↖↕↔↩↪⤴⤵🔃🔄🔙-🔝🛐⚛🕉✡☸☯✝☦☪☮🕎🔯🪯♈-♓⛎🔀-🔂▶⏩⏭⏯◀⏪⏮🔼⏫🔽⏬⏸-⏺⏏🎦🔅🔆📶🛜📳📴♀♂⚧✖➕-➗🟰♾‼⁉❓-❕❗〰💱💲⚕♻⚜🔱📛🔰⭕✅☑✔❌❎➰➿〽✳✴❇©®™🔟-🔤🅰🆎🅱🆑-🆓ℹ🆔Ⓜ🆕🆖🅾🆗🅿🆘-🆚🈁🈂🈷🈶🈯🉐🈹🈚🈲🉑🈸🈴🈳㊗㊙🈺🈵🔴🟠-🟢🔵🟣🟤⚫⚪🟥🟧-🟩🟦🟪🟫⬛⬜◼◻◾◽▪▫🔶-🔻💠🔘🔳🔲🏁🚩🎌🏴🏳🇦-🇿\uD83E\uDD89\uD83E\uDD8F\uD83E\uDDBE\uD83E\uDDC6\uD83E\uddcd\uD83E\udddf\uD83E\ude99]|#️⃣|\\*️⃣|0️⃣|1️⃣|2️⃣|3️⃣|4️⃣|5️⃣|6️⃣|7️⃣|8️⃣|9️⃣)+");
+ private final float originalFontSize;
+
+ public AutoScaledEmojiTextView(Context context) {
+ this(context, null);
+ }
+
+ public AutoScaledEmojiTextView(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public AutoScaledEmojiTextView(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ TypedArray typedArray = context.obtainStyledAttributes(attrs, new int[]{android.R.attr.textSize});
+ originalFontSize = typedArray.getDimensionPixelSize(0, 0);
+ typedArray.recycle();
+ }
+
+ @Override
+ public void setText(@Nullable CharSequence text, BufferType type) {
+ float scale = text != null ? getTextScale(text.toString()) : 1;
+ super.setTextSize(TypedValue.COMPLEX_UNIT_PX, originalFontSize * scale);
+ super.setText(text, type);
+ }
+
+
+ private float getTextScale(String text) {
+ if (text.length() > 21) {
+ return 1;
+ }
+ int emojiCount = countGraphemes(text, 8);
+ if (emojiCount > 8) {
+ return 1;
+ }
+
+ boolean isEmoji = emojiRegex.matcher(text).matches();
+ if (isEmoji) {
+ float scale = 1.25f;
+ if (emojiCount <= 6) scale += 0.25f;
+ if (emojiCount <= 4) scale += 0.25f;
+ if (emojiCount <= 2) scale += 0.25f;
+ return scale;
+ }
+ return 1;
+ }
+
+ public static int countGraphemes(String text, int max) {
+ // Create a BreakIterator for grapheme boundaries
+ BreakIterator graphemeIterator = BreakIterator.getCharacterInstance(Locale.getDefault());
+
+ // Set the text to be analyzed
+ graphemeIterator.setText(text);
+
+ // Initialize count
+ int graphemeCount = 0;
+
+ // Iterate over the text and count graphemes
+ int start = graphemeIterator.first();
+ for (int end = graphemeIterator.next(); end != BreakIterator.DONE; start = end, end = graphemeIterator.next()) {
+ if (++graphemeCount > max) break;
+ }
+
+ return graphemeCount;
+ }
+}
diff --git a/src/main/java/org/thoughtcrime/securesms/components/emoji/CompositeEmojiPageModel.java b/src/main/java/org/thoughtcrime/securesms/components/emoji/CompositeEmojiPageModel.java
deleted file mode 100644
index 28c4e9f385..0000000000
--- a/src/main/java/org/thoughtcrime/securesms/components/emoji/CompositeEmojiPageModel.java
+++ /dev/null
@@ -1,55 +0,0 @@
-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/main/java/org/thoughtcrime/securesms/components/emoji/Emoji.java b/src/main/java/org/thoughtcrime/securesms/components/emoji/Emoji.java
deleted file mode 100644
index 52d56cb48e..0000000000
--- a/src/main/java/org/thoughtcrime/securesms/components/emoji/Emoji.java
+++ /dev/null
@@ -1,21 +0,0 @@
-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/main/java/org/thoughtcrime/securesms/components/emoji/EmojiEditText.java b/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiEditText.java
deleted file mode 100644
index bf5d609339..0000000000
--- a/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiEditText.java
+++ /dev/null
@@ -1,62 +0,0 @@
-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.appcompat.widget.AppCompatEditText;
-import android.text.InputFilter;
-import android.util.AttributeSet;
-
-import org.thoughtcrime.securesms.R;
-import org.thoughtcrime.securesms.components.emoji.EmojiProvider.EmojiDrawable;
-import org.thoughtcrime.securesms.util.Prefs;
-
-
-public class EmojiEditText extends AppCompatEditText {
- private static final String TAG = EmojiEditText.class.getSimpleName();
-
- public EmojiEditText(Context context) {
- this(context, null);
- }
-
- public EmojiEditText(Context context, AttributeSet attrs) {
- this(context, attrs, R.attr.editTextStyle);
- }
-
- public EmojiEditText(Context context, AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
- if (!Prefs.isSystemEmojiPreferred(getContext())) {
- setFilters(appendEmojiFilter(this.getFilters()));
- }
- }
-
- public void insertEmoji(String emoji) {
- final int start = getSelectionStart();
- final int end = getSelectionEnd();
-
- getText().replace(Math.min(start, end), Math.max(start, end), emoji);
- setSelection(start + emoji.length());
- }
-
- @Override
- public void invalidateDrawable(@NonNull Drawable drawable) {
- if (drawable instanceof EmojiDrawable) invalidate();
- else super.invalidateDrawable(drawable);
- }
-
- private InputFilter[] appendEmojiFilter(@Nullable InputFilter[] originalFilters) {
- InputFilter[] result;
-
- if (originalFilters != null) {
- result = new InputFilter[originalFilters.length + 1];
- System.arraycopy(originalFilters, 0, result, 1, originalFilters.length);
- } else {
- result = new InputFilter[1];
- }
-
- result[0] = new EmojiFilter(this);
-
- return result;
- }
-}
diff --git a/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiFilter.java b/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiFilter.java
deleted file mode 100644
index f028454e0e..0000000000
--- a/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiFilter.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package org.thoughtcrime.securesms.components.emoji;
-
-import android.text.InputFilter;
-import android.text.Spannable;
-import android.text.Spanned;
-import android.text.TextUtils;
-import android.widget.TextView;
-
-public class EmojiFilter implements InputFilter {
- private final TextView view;
-
- public EmojiFilter(TextView view) {
- this.view = view;
- }
-
- @Override
- public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend)
- {
- char[] v = new char[end - start];
- TextUtils.getChars(source, start, end, v, 0);
-
- Spannable emojified = EmojiProvider.getInstance(view.getContext()).emojify(new String(v), view);
-
- if (source instanceof Spanned && emojified != null) {
- TextUtils.copySpansFrom((Spanned) source, start, end, null, emojified, 0);
- }
-
- return emojified;
- }
-}
diff --git a/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiImageView.java b/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiImageView.java
deleted file mode 100644
index c953b3d737..0000000000
--- a/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiImageView.java
+++ /dev/null
@@ -1,20 +0,0 @@
-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/main/java/org/thoughtcrime/securesms/components/emoji/EmojiKeyboardProvider.java b/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiKeyboardProvider.java
deleted file mode 100644
index 7949fe6ebe..0000000000
--- a/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiKeyboardProvider.java
+++ /dev/null
@@ -1,166 +0,0 @@
-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 final Context context;
- private final List pages;
- private final EmojiEventListener emojiSelectionListener;
- private final 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/main/java/org/thoughtcrime/securesms/components/emoji/EmojiPageModel.java b/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiPageModel.java
deleted file mode 100644
index 4c4d577584..0000000000
--- a/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiPageModel.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package org.thoughtcrime.securesms.components.emoji;
-
-import java.util.List;
-
-public interface EmojiPageModel {
- int getIconAttr();
- List getEmoji();
- List getDisplayEmoji();
- boolean hasSpriteMap();
- String getSprite();
- boolean isDynamic();
-}
diff --git a/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiPageView.java b/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiPageView.java
deleted file mode 100644
index f080ba6956..0000000000
--- a/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiPageView.java
+++ /dev/null
@@ -1,104 +0,0 @@
-package org.thoughtcrime.securesms.components.emoji;
-
-import android.content.Context;
-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.widget.FrameLayout;
-
-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 implements VariationSelectorListener {
- private static final String TAG = EmojiPageView.class.getSimpleName();
-
- private EmojiPageModel model;
- private final EmojiPageViewGridAdapter adapter;
- private final RecyclerView recyclerView;
- private final GridLayoutManager layoutManager;
- private final RecyclerView.OnItemTouchListener scrollDisabler;
- private final VariationSelectorListener variationSelectorListener;
- private final EmojiVariationSelectorPopup popup;
-
- 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);
-
- 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() && adapter != null) {
- adapter.notifyDataSetChanged();
- }
- }
-
- public void setModel(EmojiPageModel model) {
- this.model = model;
- adapter.setEmoji(model.getDisplayEmoji());
- }
-
- @Override
- protected void onVisibilityChanged(@NonNull View changedView, int visibility) {
- if (visibility != VISIBLE) {
- popup.dismiss();
- }
- }
-
- @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/main/java/org/thoughtcrime/securesms/components/emoji/EmojiPageViewGridAdapter.java b/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiPageViewGridAdapter.java
deleted file mode 100644
index 136a7581ec..0000000000
--- a/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiPageViewGridAdapter.java
+++ /dev/null
@@ -1,120 +0,0 @@
-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.setContentDescription(emoji.getValue());
-
- 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/main/java/org/thoughtcrime/securesms/components/emoji/EmojiPages.java b/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiPages.java
deleted file mode 100644
index d385d8ce86..0000000000
--- a/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiPages.java
+++ /dev/null
@@ -1,322 +0,0 @@
-package org.thoughtcrime.securesms.components.emoji;
-
-import org.thoughtcrime.securesms.R;
-import org.thoughtcrime.securesms.util.Pair;
-
-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.png");
-
- 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.png");
-
- 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.png");
-
- 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.png");
-
- 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.png");
-
- 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.png");
-
- 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.png");
-
- 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.png");
-
- 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.png");
-
- 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.png");
-
- 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.png");
-
- 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.png");
-
- 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.png");
-
- 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.png");
-
- 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.png");
-
- 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",
- ":-|", ":-\\", ":-(", ":'(", ":-[", ">:-(",
- "^.^", "^_^", "\\(\u02c6\u02da\u02c6)/",
- "\u30fd(\u00b0\u25c7\u00b0 )\u30ce", "\u00af\\(\u00b0_o)/\u00af",
- "\u00af\\_(\u30c4)_/\u00af", "(\u00ac_\u00ac)",
- "(>_<)", "(\u2565\ufe4f\u2565)", "(\u261e\uff9f\u30ee\uff9f)\u261e",
- "\u261c(\uff9f\u30ee\uff9f\u261c)", "\u261c(\u2312\u25bd\u2312)\u261e",
- "(\u256f\u00b0\u25a1\u00b0)\u256f\ufe35", "\u253b\u2501\u253b",
- "\u252c\u2500\u252c", "\u30ce(\u00b0\u2013\u00b0\u30ce)",
- "(^._.^)\uff89", "\u0e05^\u2022\ufecc\u2022^\u0e05",
- "\u0295\u2022\u1d25\u2022\u0294", "(\u2022_\u2022)",
- " \u25a0-\u25a0\u00ac <(\u2022_\u2022) ", "(\u25a0_\u25a0\u00ac)",
- "\u01aa(\u0693\u05f2)\u200e\u01aa\u200b\u200b", "( \u0361\u00B0 \u035C\u0296 \u0361\u00B0)",
- "(\u0CA5\uFE4F\u0CA5)", "( \u02D8 \u025C\u02D8) \u266C\u266A\u266B",
- "(\u201E\u2022 \u1D17 \u2022\u201E)", "( \u02D8\u2323\u02D8)\u2661(\u02D8\u2323\u02D8 )",
- "(\u3063\u02D8\u0437(\u02D8\u2323\u02D8 ) \u2661", "(\u2312_\u2312;)",
- "( `\u03B5\u00B4 )", "(\u222A\uFF61\u222A)\uFF61\uFF61\uFF61zzZ",
- "(\u30FB\u30FB ) ?", "(\u21BC_\u21BC)", "(\u0CA0_\u0CA0)", "(\u3065\uFFE3 \u00B3\uFFE3)\u3065",
- "(\u00AC\u203F\u00AC )", "(\uFF1B\u2323\u0300_\u2323\u0301)", "(\u1D54\u25E1\u1D54)", "(\u21C0\u2038\u21BC\u2036)",
- "(\u00D7\uFE4F\u00D7)", "\u2510(\u30B7)\u250C", "(\u2022\u0E34_\u2022\u0E34)?", "(\u2299_\u2299)", "(\u2312\u03C9\u2312)\uFF89",
- "(\u30FB_\u30FB)\u30CE", "\uFF3C(\u2312\u25BD\u2312)", "(\u3064\u2727\u03C9\u2727)\u3064", "(\uFF61\u2022\u0300\u1D17-)\u2727",
- "(^_-)\u2261\u2606", "\u252C\u2534\u252C\u2534\u2524(\uFF65_\u251C\u252C\u2534\u252C\u2534", "|\u0298\u203F\u0298)\u256F",
- "\u252C\u2534\u252C\u2534\u2524\uFF65\u03C9\uFF65)\uFF89", "(\uFF0D_\uFF0D) zzZ", "\u0295\u0CA0\u1D25\u0CA0\u0294",
- "\u0295 \u1D54\u1D25\u1D54 \u0294", "U\u30FB\u1D25\u30FBU", "\u30FD( \u2312o\u2312)\u4EBA(\u2312-\u2312 )\uFF89",
- "(\u00AC_\u00AC'')\u0505(\uFFE3\u03B5\uFFE3\u0505)", "\uFE3B\u30C7\u2550\u4E00", "\uFE3B\u2533\u2550\u4E00", "( -\u03C9-)\uFF0F\u5360~~~~~",
- "(\u2229\u1111_\u1111)\u2283\u2501\u2606\uFF9F*\uFF65\uFF61*\uFF65", "(\u02D8\u25E1\u02D8) \u250Ciii\u2510",
- "\u30FE(\u2310\u25A0_\u25A0)\u30CE\u266A", "( \u0360\u00B0 \u035F\u0296 \u0361\u00B0)", "(\u301C\uFFE3\u25BD\uFFE3)\u301C",
- "(\u02C7\u25BD\u02C7)\u30CE\u266A\u266C\u266B", "(\u0298 \u035F\u0296 \u0298)", "(\u0298 \u035C\u0296 \u0298)",
- "(\uFFE3^\uFFE3)\u309E", "(\uFFE3\uFE43\uFFE3)", "(\uFF0D\u2038\u10DA)", "`(=O*_*)=O Q(*_*Q)`"
- }, 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<>("\ud83d\udc71", "\ud83d\udc71\u200d\u2642\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\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/main/java/org/thoughtcrime/securesms/components/emoji/EmojiProvider.java b/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiProvider.java
deleted file mode 100644
index 4781144919..0000000000
--- a/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiProvider.java
+++ /dev/null
@@ -1,258 +0,0 @@
-package org.thoughtcrime.securesms.components.emoji;
-
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.ColorFilter;
-import android.graphics.Paint;
-import android.graphics.PixelFormat;
-import android.graphics.Rect;
-import android.graphics.drawable.Drawable;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import android.text.Spannable;
-import android.text.SpannableStringBuilder;
-import android.util.Log;
-import android.widget.TextView;
-
-import org.thoughtcrime.securesms.R;
-import org.thoughtcrime.securesms.components.emoji.parsing.EmojiDrawInfo;
-import org.thoughtcrime.securesms.components.emoji.parsing.EmojiPageBitmap;
-import org.thoughtcrime.securesms.components.emoji.parsing.EmojiParser;
-import org.thoughtcrime.securesms.components.emoji.parsing.EmojiTree;
-import org.thoughtcrime.securesms.util.FutureTaskListener;
-import org.thoughtcrime.securesms.util.Pair;
-import org.thoughtcrime.securesms.util.StringUtil;
-import org.thoughtcrime.securesms.util.Util;
-
-import java.io.IOException;
-import java.util.List;
-import java.util.concurrent.ExecutionException;
-import java.util.regex.Pattern;
-
-public class EmojiProvider {
-
- private static final String TAG = EmojiProvider.class.getSimpleName();
- private static volatile EmojiProvider instance = null;
- private static final Paint paint = new Paint(Paint.FILTER_BITMAP_FLAG | Paint.ANTI_ALIAS_FLAG);
- private static final Pattern EMOJI_PATTERN = Pattern.compile("^(?:(?:[\u00a9\u00ae\u203c\u2049\u2122\u2139\u2194-\u2199\u21a9-\u21aa\u231a-\u231b\u2328\u23cf\u23e9-\u23f3\u23f8-\u23fa\u24c2\u25aa-\u25ab\u25b6\u25c0\u25fb-\u25fe\u2600-\u2604\u260e\u2611\u2614-\u2615\u2618\u261d\u2620\u2622-\u2623\u2626\u262a\u262e-\u262f\u2638-\u263a\u2648-\u2653\u2660\u2663\u2665-\u2666\u2668\u267b\u267f\u2692-\u2694\u2696-\u2697\u2699\u269b-\u269c\u26a0-\u26a1\u26aa-\u26ab\u26b0-\u26b1\u26bd-\u26be\u26c4-\u26c5\u26c8\u26ce-\u26cf\u26d1\u26d3-\u26d4\u26e9-\u26ea\u26f0-\u26f5\u26f7-\u26fa\u26fd\u2702\u2705\u2708-\u270d\u270f\u2712\u2714\u2716\u271d\u2721\u2728\u2733-\u2734\u2744\u2747\u274c\u274e\u2753-\u2755\u2757\u2763-\u2764\u2795-\u2797\u27a1\u27b0\u27bf\u2934-\u2935\u2b05-\u2b07\u2b1b-\u2b1c\u2b50\u2b55\u3030\u303d\u3297\u3299\ud83c\udc04\ud83c\udccf\ud83c\udd70-\ud83c\udd71\ud83c\udd7e-\ud83c\udd7f\ud83c\udd8e\ud83c\udd91-\ud83c\udd9a\ud83c\ude01-\ud83c\ude02\ud83c\ude1a\ud83c\ude2f\ud83c\ude32-\ud83c\ude3a\ud83c\ude50-\ud83c\ude51\u200d\ud83c\udf00-\ud83d\uddff\ud83d\ude00-\ud83d\ude4f\ud83d\ude80-\ud83d\udeff\ud83e\udd00-\ud83e\uddff\udb40\udc20-\udb40\udc7f]|\u200d[\u2640\u2642]|[\ud83c\udde6-\ud83c\uddff]{2}|.[\u20e0\u20e3\ufe0f]+)+)+$");
-
- private final EmojiTree emojiTree = new EmojiTree();
-
- 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 = 16;
-
- private final float decodeScale;
- private final float verticalPad;
-
- public static EmojiProvider getInstance(Context context) {
- if (instance == null) {
- synchronized (EmojiProvider.class) {
- if (instance == null) {
- instance = new EmojiProvider(context);
- }
- }
- }
- return instance;
- }
-
- 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.DATA_PAGES) {
- if (page.hasSpriteMap()) {
- EmojiPageBitmap pageBitmap = new EmojiPageBitmap(context, page, decodeScale);
-
- List emojis = page.getEmoji();
- for (int i = 0; i < emojis.size(); i++) {
- emojiTree.add(emojis.get(i), new EmojiDrawInfo(pageBitmap, i));
- }
- }
- }
-
- for (Pair obsolete : EmojiPages.OBSOLETE) {
- emojiTree.add(obsolete.first(), emojiTree.getEmoji(obsolete.second(), 0, obsolete.second().length()));
- }
- }
-
- @Nullable EmojiParser.CandidateList getCandidates(@Nullable CharSequence text) {
- if (text == null) return null;
- return new EmojiParser(emojiTree).findCandidates(text);
- }
-
- @Nullable Spannable emojify(@Nullable CharSequence text, @NonNull TextView tv) {
- return emojify(getCandidates(text), text, tv, false);
- }
-
- @Nullable Spannable emojify(@Nullable EmojiParser.CandidateList matches,
- @Nullable CharSequence text,
- @NonNull TextView tv,
- boolean background) {
- if (matches == null || text == null) return null;
- SpannableStringBuilder builder = new SpannableStringBuilder(text);
-
- for (EmojiParser.Candidate candidate : matches) {
- Drawable drawable = getEmojiDrawable(candidate.getDrawInfo(), background);
-
- if (drawable != null) {
- builder.setSpan(new EmojiSpan(drawable, tv), candidate.getStartIndex(), candidate.getEndIndex(),
- Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- }
- }
-
- return builder;
- }
-
- @Nullable Drawable getEmojiDrawable(CharSequence emoji) {
- EmojiDrawInfo drawInfo = emojiTree.getEmoji(emoji, 0, emoji.length());
- return getEmojiDrawable(drawInfo, false);
- }
-
- public boolean isEmoji(CharSequence emoji) {
- return emojiTree.getEmoji(emoji, 0, emoji.length()) != null;
- }
-
- /**
- * True if the text is likely a single, valid emoji. Otherwise false.
- *
- * We do a two-tier check: first using our own knowledge of emojis (which could be incomplete),
- * followed by a more wide check for all of the valid emoji unicode ranges (which could lead to
- * some false positives). YMMV.
- */
- public boolean maybeEmoji(CharSequence emoji) {
- if (Util.isEmpty(emoji)) {
- return false;
- }
-
- if (StringUtil.getGraphemeCount(emoji) != 1) {
- return false;
- }
-
- return isEmoji(emoji) || EMOJI_PATTERN.matcher(emoji).matches();
- }
-
- public @Nullable Bitmap getEmojiBitmap(CharSequence emoji, float scale, boolean background) {
- EmojiDrawInfo drawInfo = emojiTree.getEmoji(emoji, 0, emoji.length());
- EmojiDrawable drawable = ((EmojiDrawable) getEmojiDrawable(drawInfo, background));
- if (drawable != null) {
- return drawable.getEmojiBitmap(scale);
- }
- return null;
- }
-
- protected @Nullable Drawable getEmojiDrawable(@Nullable EmojiDrawInfo drawInfo, boolean background) {
- 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();
- }
- } 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);
- }
- });
- }
- return drawable;
- }
-
- class EmojiDrawable extends Drawable {
- private final EmojiDrawInfo info;
- private Bitmap bmp;
- private final float intrinsicWidth;
- private final float intrinsicHeight;
-
- @Override
- public int getIntrinsicWidth() {
- return (int)intrinsicWidth;
- }
-
- @Override
- public int getIntrinsicHeight() {
- return (int)intrinsicHeight;
- }
-
- EmojiDrawable(EmojiDrawInfo info, float decodeScale) {
- this.info = info;
- this.intrinsicWidth = EMOJI_RAW_WIDTH * decodeScale;
- this.intrinsicHeight = EMOJI_RAW_HEIGHT * decodeScale;
- }
-
- private Bitmap getEmojiBitmap(float scale) {
- Bitmap singleEmoji = Bitmap.createBitmap((int) (intrinsicWidth * scale), (int) (intrinsicHeight*scale), Bitmap.Config.ARGB_8888);
-
- final int row = info.getIndex() / EMOJI_PER_ROW;
- final int rowIndex = info.getIndex() % EMOJI_PER_ROW;
-
- Rect desRect = new Rect(0, 0, (int) intrinsicWidth, (int) intrinsicWidth);
- Rect srcRect = new Rect((int)(rowIndex * intrinsicWidth),
- (int)(row * intrinsicHeight + row * verticalPad)+1,
- (int)(((rowIndex + 1) * intrinsicWidth)-1),
- (int)((row + 1) * intrinsicHeight + row * verticalPad)-1);
-
- Canvas canvas = new Canvas(singleEmoji);
- canvas.scale(scale, scale);
- canvas.drawBitmap(bmp, srcRect, desRect, paint);
-
- return singleEmoji;
- }
-
-
- @Override
- public void draw(@NonNull Canvas canvas) {
- if (bmp == null) {
- return;
- }
-
- final int row = info.getIndex() / EMOJI_PER_ROW;
- final int row_index = info.getIndex() % EMOJI_PER_ROW;
-
- canvas.drawBitmap(bmp,
- new Rect((int)(row_index * intrinsicWidth),
- (int)(row * intrinsicHeight + row * verticalPad)+1,
- (int)(((row_index + 1) * intrinsicWidth)-1),
- (int)((row + 1) * intrinsicHeight + row * verticalPad)-1),
- getBounds(),
- paint);
- }
-
- public void setBitmap(Bitmap bitmap) {
- setBitmap(bitmap, false);
- }
-
- public void setBitmap(Bitmap bitmap, boolean background) {
- if (!background) {
- Util.assertMainThread();
- }
- if (bmp == null || !bmp.sameAs(bitmap)) {
- bmp = bitmap;
- invalidateSelf();
- }
- }
-
- @Override
- public int getOpacity() {
- return PixelFormat.TRANSLUCENT;
- }
-
- @Override
- public void setAlpha(int alpha) { }
-
- @Override
- public void setColorFilter(ColorFilter cf) { }
- }
-
-}
diff --git a/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiSpan.java b/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiSpan.java
deleted file mode 100644
index 781691ec10..0000000000
--- a/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiSpan.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package org.thoughtcrime.securesms.components.emoji;
-
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.graphics.Paint.FontMetricsInt;
-import android.graphics.drawable.Drawable;
-import androidx.annotation.NonNull;
-import android.widget.TextView;
-
-import org.thoughtcrime.securesms.R;
-
-public class EmojiSpan extends AnimatingImageSpan {
-
- private final float SHIFT_FACTOR = 1.5f;
-
- private final int size;
- private final FontMetricsInt fm;
-
- public EmojiSpan(@NonNull Drawable drawable, @NonNull TextView tv) {
- super(drawable, tv);
- fm = tv.getPaint().getFontMetricsInt();
- size = fm != null ? Math.abs(fm.descent) + Math.abs(fm.ascent)
- : tv.getResources().getDimensionPixelSize(R.dimen.conversation_item_body_text_size);
- getDrawable().setBounds(0, 0, size, size);
- }
-
- @Override
- 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;
- fm.top = this.fm.top;
- fm.bottom = this.fm.bottom;
- fm.leading = this.fm.leading;
- return size;
- } else {
- return super.getSize(paint, text, start, end, fm);
- }
- }
-
- @Override
- 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);
- super.draw(canvas, text, start, end, x, top, y, bottom - adjustedMargin, paint);
- }
-}
diff --git a/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiStrings.java b/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiStrings.java
deleted file mode 100644
index e43fe4cc75..0000000000
--- a/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiStrings.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package org.thoughtcrime.securesms.components.emoji;
-
-public final class EmojiStrings {
- public static final String BUST_IN_SILHOUETTE = "\uD83D\uDC64";
-}
diff --git a/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiTextView.java b/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiTextView.java
deleted file mode 100644
index bf4109d1ac..0000000000
--- a/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiTextView.java
+++ /dev/null
@@ -1,249 +0,0 @@
-package org.thoughtcrime.securesms.components.emoji;
-
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.graphics.drawable.Drawable;
-import android.text.Spannable;
-import android.text.SpannableStringBuilder;
-import android.text.Spanned;
-import android.text.TextUtils;
-import android.text.style.URLSpan;
-import android.text.util.Linkify;
-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.LongClickCopySpan;
-import org.thoughtcrime.securesms.util.Prefs;
-import org.thoughtcrime.securesms.util.Util;
-import org.thoughtcrime.securesms.util.guava.Optional;
-
-import java.util.regex.Pattern;
-
-
-public class EmojiTextView extends AppCompatTextView {
-
- private final boolean scaleEmojis;
- private final boolean forceCustom;
- private final boolean createInBackground;
-
- private static final char ELLIPSIS = '…';
-
- private CharSequence previousText;
- private BufferType previousBufferType;
- private float originalFontSize;
- private boolean useSystemEmoji;
- private boolean sizeChangeInProgress;
- private final int maxLength;
- private CharSequence overflowText;
- private CharSequence previousOverflowText;
-
- public EmojiTextView(Context context) {
- this(context, null);
- }
-
- public EmojiTextView(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public EmojiTextView(Context context, AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
-
- TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.EmojiTextView, 0, 0);
- scaleEmojis = a.getBoolean(R.styleable.EmojiTextView_scaleEmojis, false);
- maxLength = a.getInteger(R.styleable.EmojiTextView_emoji_maxLength, -1);
- forceCustom = a.getBoolean(R.styleable.EmojiTextView_emoji_forceCustom, false);
- createInBackground = a.getBoolean(R.styleable.EmojiTextView_createInBackground, false);
- a.recycle();
-
- a = context.obtainStyledAttributes(attrs, new int[]{android.R.attr.textSize});
- originalFontSize = a.getDimensionPixelSize(0, 0);
- a.recycle();
- }
-
- @Override public void setText(@Nullable CharSequence text, BufferType type) {
- EmojiProvider provider = EmojiProvider.getInstance(getContext());
- EmojiParser.CandidateList candidates = provider.getCandidates(text);
-
- if (scaleEmojis && candidates != null && candidates.allEmojis) {
- int emojis = candidates.size();
- float scale = 1.0f;
-
- if (emojis <= 8) scale += 0.25f;
- if (emojis <= 6) scale += 0.25f;
- if (emojis <= 4) scale += 0.25f;
- if (emojis <= 2) scale += 0.25f;
-
- super.setTextSize(TypedValue.COMPLEX_UNIT_PX, originalFontSize * scale);
- } else if (scaleEmojis) {
- super.setTextSize(TypedValue.COMPLEX_UNIT_PX, originalFontSize);
- }
-
- if (unchanged(text, overflowText, type)) {
- return;
- }
-
- previousText = text;
- previousOverflowText = overflowText;
- previousBufferType = type;
- useSystemEmoji = useSystemEmoji();
-
- if (useSystemEmoji || candidates == null || candidates.size() == 0) {
- super.setText(new SpannableStringBuilder(Optional.fromNullable(text).or("")).append(Optional.fromNullable(overflowText).or("")), BufferType.NORMAL);
-
- if (getEllipsize() == TextUtils.TruncateAt.END && maxLength > 0) {
- ellipsizeAnyTextForMaxLength();
- }
- } else {
- CharSequence emojified = provider.emojify(candidates, text, this, createInBackground);
- 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) {
- if (maxLength > 0) {
- ellipsizeAnyTextForMaxLength();
- } else {
- ellipsizeEmojiTextForMaxLines();
- }
- }
- }
- }
-
- 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, createInBackground);
- super.setText(emojified, BufferType.SPANNABLE);
- }
- }
- }
-
- private void ellipsizeEmojiTextForMaxLines() {
- post(() -> {
- if (getLayout() == null) {
- ellipsizeEmojiTextForMaxLines();
- return;
- }
-
- int maxLines = TextViewCompat.getMaxLines(EmojiTextView.this);
- if (maxLines <= 0 && maxLength < 0) {
- return;
- }
-
- int lineCount = getLineCount();
- if (lineCount > maxLines) {
- int overflowStart = getLayout().getLineStart(maxLines - 1);
- CharSequence overflow = getText().subSequence(overflowStart, getText().length());
- CharSequence ellipsized = TextUtils.ellipsize(overflow, getPaint(), getWidth(), TextUtils.TruncateAt.END);
-
- SpannableStringBuilder newContent = new SpannableStringBuilder();
- newContent.append(getText().subSequence(0, overflowStart))
- .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);
-
- super.setText(emojified, BufferType.SPANNABLE);
- }
- });
- }
-
- 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 !forceCustom && Prefs.isSystemEmojiPreferred(getContext());
- }
-
- @Override
- protected void onSizeChanged(int w, int h, int oldw, int oldh) {
- super.onSizeChanged(w, h, oldw, oldh);
-
- if (!sizeChangeInProgress) {
- sizeChangeInProgress = true;
- setText(previousText, previousBufferType);
- sizeChangeInProgress = false;
- }
- }
-
- @Override
- public void invalidateDrawable(@NonNull Drawable drawable) {
- if (drawable instanceof EmojiDrawable) invalidate();
- else super.invalidateDrawable(drawable);
- }
-
- @Override
- public void setTextSize(float size) {
- setTextSize(TypedValue.COMPLEX_UNIT_SP, size);
- }
-
- @Override
- public void setTextSize(int unit, float size) {
- this.originalFontSize = TypedValue.applyDimension(unit, size, getResources().getDisplayMetrics());
- super.setTextSize(unit, size);
- }
-
-
- // tools for linkify
-
- private static final Pattern CMD_PATTERN = Pattern.compile("(?<=^|\\s)/[a-zA-Z][a-zA-Z@\\d_/.-]{0,254}");
- private static final Pattern CUSTOM_PATTERN = Pattern.compile("(?<=^|\\s)(OPENPGP4FPR|openpgp4fpr|mumble):[^ \\n]+");
- private static final Pattern PROXY_PATTERN = Pattern.compile("(?<=^|\\s)(SOCKS5|socks5|ss|SS):[^ \\n]+");
-
- private static void replaceURLSpan(Spannable messageBody) {
- URLSpan[] urlSpans = messageBody.getSpans(0, messageBody.length(), URLSpan.class);
- for (URLSpan urlSpan : urlSpans) {
- int start = messageBody.getSpanStart(urlSpan);
- int end = messageBody.getSpanEnd(urlSpan);
- // LongClickCopySpan must not be derived from URLSpan, otherwise links will be removed on the next addLinks() call
- messageBody.setSpan(new LongClickCopySpan(urlSpan.getURL()), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
- }
- }
-
- public static Spannable linkify(Spannable messageBody) {
- // linkify commands such as `/echo` -
- // do this first to avoid `/xkcd_123456` to be treated partly as a phone number
- Linkify.addLinks(messageBody, CMD_PATTERN, "cmd:", null, null);
- EmojiTextView.replaceURLSpan(messageBody); // replace URLSpan so that it is not removed on the next addLinks() call
-
- Linkify.addLinks(messageBody, CUSTOM_PATTERN, null, null, null);
- EmojiTextView.replaceURLSpan(messageBody);
-
- if (Linkify.addLinks(messageBody, PROXY_PATTERN, null, null, null)) {
- EmojiTextView.replaceURLSpan(messageBody); // replace URLSpan so that it is not removed on the next addLinks() call
- }
-
- // linkyfiy urls etc., this removes all existing URLSpan
- if (Linkify.addLinks(messageBody, Linkify.EMAIL_ADDRESSES|Linkify.WEB_URLS|Linkify.PHONE_NUMBERS)) {
- EmojiTextView.replaceURLSpan(messageBody);
- }
-
- return messageBody;
- }
-}
diff --git a/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiToggle.java b/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiToggle.java
index f3fc7d1442..8517966871 100644
--- a/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiToggle.java
+++ b/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiToggle.java
@@ -2,14 +2,14 @@
import android.content.Context;
import android.graphics.drawable.Drawable;
-import androidx.annotation.NonNull;
-import androidx.appcompat.widget.AppCompatImageButton;
import android.util.AttributeSet;
+import androidx.appcompat.widget.AppCompatImageButton;
+
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.util.ResUtil;
-public class EmojiToggle extends AppCompatImageButton implements MediaKeyboard.MediaKeyboardListener {
+public class EmojiToggle extends AppCompatImageButton {
private Drawable emojiToggle;
// private Drawable stickerToggle;
@@ -50,10 +50,6 @@ private void initialize() {
setToMedia();
}
- public void attach(MediaKeyboard drawer) {
- drawer.setKeyboardListener(this);
- }
-
public void setStickerMode(boolean stickerMode) {
this.mediaToggle = /*stickerMode ? stickerToggle :*/ emojiToggle;
@@ -66,20 +62,4 @@ public boolean isStickerMode() {
//return this.mediaToggle == stickerToggle;
return false;
}
-
- @Override public void onShown() {
- setToIme();
- }
-
- @Override public void onHidden() {
- 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/main/java/org/thoughtcrime/securesms/components/emoji/EmojiVariationSelectorPopup.java b/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiVariationSelectorPopup.java
deleted file mode 100644
index 1820569b2c..0000000000
--- a/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiVariationSelectorPopup.java
+++ /dev/null
@@ -1,51 +0,0 @@
-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/main/java/org/thoughtcrime/securesms/components/emoji/MediaKeyboard.java b/src/main/java/org/thoughtcrime/securesms/components/emoji/MediaKeyboard.java
index 3e9b1a0720..256da8f80d 100644
--- a/src/main/java/org/thoughtcrime/securesms/components/emoji/MediaKeyboard.java
+++ b/src/main/java/org/thoughtcrime/securesms/components/emoji/MediaKeyboard.java
@@ -1,74 +1,33 @@
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 androidx.core.util.Consumer;
+import androidx.emoji2.emojipicker.EmojiPickerView;
+import androidx.emoji2.emojipicker.EmojiViewItem;
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
-{
+public class MediaKeyboard extends FrameLayout implements InputView, Consumer {
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 EmojiPickerView emojiPicker;
- private MediaKeyboardBottomTabAdapter categoryTabAdapter;
-
- public MediaKeyboard(Context context) {
- this(context, null);
+ public MediaKeyboard(@NonNull Context context) {
+ super(context);
}
- public MediaKeyboard(Context context, AttributeSet attrs) {
+ public MediaKeyboard(@NonNull Context context, @Nullable 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) {
@@ -82,8 +41,6 @@ public boolean isShowing() {
@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);
@@ -93,12 +50,12 @@ public void show(int height, boolean immediate) {
}
public void show() {
- if (this.categoryPager == null) initView();
-
+ if (emojiPicker == null) {
+ emojiPicker = findViewById(R.id.emoji_picker);
+ emojiPicker.setOnEmojiPickedListener(this);
+ };
setVisibility(VISIBLE);
if (keyboardListener != null) keyboardListener.onShown();
-
- requestPresent(providers, providerIndex);
}
@Override
@@ -109,188 +66,13 @@ public void hide(boolean immediate) {
}
@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 void accept(EmojiViewItem emojiViewItem) {
+ if (keyboardListener != null) keyboardListener.onEmojiPicked(emojiViewItem.getEmoji());
}
public interface MediaKeyboardListener {
void onShown();
void onHidden();
- void onKeyboardProviderChanged(@NonNull MediaKeyboardProvider provider);
+ void onEmojiPicked(String emoji);
}
}
diff --git a/src/main/java/org/thoughtcrime/securesms/components/emoji/MediaKeyboardBottomTabAdapter.java b/src/main/java/org/thoughtcrime/securesms/components/emoji/MediaKeyboardBottomTabAdapter.java
deleted file mode 100644
index 80fd336813..0000000000
--- a/src/main/java/org/thoughtcrime/securesms/components/emoji/MediaKeyboardBottomTabAdapter.java
+++ /dev/null
@@ -1,103 +0,0 @@
-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/main/java/org/thoughtcrime/securesms/components/emoji/MediaKeyboardProvider.java b/src/main/java/org/thoughtcrime/securesms/components/emoji/MediaKeyboardProvider.java
deleted file mode 100644
index f1537cd202..0000000000
--- a/src/main/java/org/thoughtcrime/securesms/components/emoji/MediaKeyboardProvider.java
+++ /dev/null
@@ -1,51 +0,0 @@
-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/main/java/org/thoughtcrime/securesms/components/emoji/RecentEmojiPageModel.java b/src/main/java/org/thoughtcrime/securesms/components/emoji/RecentEmojiPageModel.java
deleted file mode 100644
index 77b1b45b6b..0000000000
--- a/src/main/java/org/thoughtcrime/securesms/components/emoji/RecentEmojiPageModel.java
+++ /dev/null
@@ -1,105 +0,0 @@
-package org.thoughtcrime.securesms.components.emoji;
-
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.os.AsyncTask;
-import android.preference.PreferenceManager;
-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;
-
-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 int EMOJI_LRU_SIZE = 50;
-
- private final SharedPreferences prefs;
- private final String preferenceName;
- private final LinkedHashSet recentlyUsed;
-
- 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(preferenceName, "[]");
- try {
- CollectionType collectionType = TypeFactory.defaultInstance()
- .constructCollectionType(LinkedHashSet.class, String.class);
- return JsonUtils.getMapper().readValue(serialized, collectionType);
- } catch (IOException e) {
- Log.w(TAG, e);
- return new LinkedHashSet<>();
- }
- }
-
- @Override public int getIconAttr() {
- return R.attr.emoji_category_recent;
- }
-
- @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() {
- return false;
- }
-
- @Override public String getSprite() {
- return null;
- }
-
- @Override public boolean isDynamic() {
- return true;
- }
-
- public void onCodePointSelected(String emoji) {
- recentlyUsed.remove(emoji);
- recentlyUsed.add(emoji);
-
- if (recentlyUsed.size() > EMOJI_LRU_SIZE) {
- Iterator iterator = recentlyUsed.iterator();
- iterator.next();
- iterator.remove();
- }
-
- final LinkedHashSet latestRecentlyUsed = new LinkedHashSet<>(recentlyUsed);
- new AsyncTask() {
-
- @Override
- protected Void doInBackground(Void... params) {
- try {
- String serialized = JsonUtils.toJson(latestRecentlyUsed);
- prefs.edit()
- .putString(preferenceName, serialized)
- .apply();
- } catch (IOException e) {
- Log.w(TAG, e);
- }
-
- return null;
- }
- }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
- }
-}
diff --git a/src/main/java/org/thoughtcrime/securesms/components/emoji/StaticEmojiPageModel.java b/src/main/java/org/thoughtcrime/securesms/components/emoji/StaticEmojiPageModel.java
deleted file mode 100644
index e1b248b5cc..0000000000
--- a/src/main/java/org/thoughtcrime/securesms/components/emoji/StaticEmojiPageModel.java
+++ /dev/null
@@ -1,66 +0,0 @@
-package org.thoughtcrime.securesms.components.emoji;
-
-import androidx.annotation.AttrRes;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.LinkedList;
-import java.util.List;
-
-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;
- }
-
- @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() {
- return sprite != null;
- }
-
- @Override
- public @Nullable String getSprite() {
- return sprite;
- }
-
- @Override
- public boolean isDynamic() {
- return false;
- }
-}
diff --git a/src/main/java/org/thoughtcrime/securesms/components/emoji/parsing/EmojiDrawInfo.java b/src/main/java/org/thoughtcrime/securesms/components/emoji/parsing/EmojiDrawInfo.java
deleted file mode 100644
index 387af40a08..0000000000
--- a/src/main/java/org/thoughtcrime/securesms/components/emoji/parsing/EmojiDrawInfo.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.thoughtcrime.securesms.components.emoji.parsing;
-
-
-import androidx.annotation.NonNull;
-
-public class EmojiDrawInfo {
-
- private final EmojiPageBitmap page;
- private final int index;
-
- public EmojiDrawInfo(final @NonNull EmojiPageBitmap page, final int index) {
- this.page = page;
- this.index = index;
- }
-
- public @NonNull EmojiPageBitmap getPage() {
- return page;
- }
-
- public int getIndex() {
- return index;
- }
-
- @Override
- public @NonNull String toString() {
- return "DrawInfo{" +
- "page=" + page +
- ", index=" + index +
- '}';
- }
-}
\ No newline at end of file
diff --git a/src/main/java/org/thoughtcrime/securesms/components/emoji/parsing/EmojiPageBitmap.java b/src/main/java/org/thoughtcrime/securesms/components/emoji/parsing/EmojiPageBitmap.java
deleted file mode 100644
index b9a44d3d9c..0000000000
--- a/src/main/java/org/thoughtcrime/securesms/components/emoji/parsing/EmojiPageBitmap.java
+++ /dev/null
@@ -1,106 +0,0 @@
-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 android.util.Log;
-
-import androidx.annotation.NonNull;
-
-import org.thoughtcrime.securesms.components.emoji.EmojiPageModel;
-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;
-
-public class EmojiPageBitmap {
-
- private static final String TAG = EmojiPageBitmap.class.getSimpleName();
-
- private final Context context;
- private final EmojiPageModel model;
- private final float decodeScale;
-
- private SoftReference bitmapReference;
- private ListenableFutureTask task;
-
- public EmojiPageBitmap(@NonNull Context context, @NonNull EmojiPageModel model, float decodeScale) {
- this.context = context.getApplicationContext();
- this.model = model;
- this.decodeScale = decodeScale;
- }
-
- @SuppressLint("StaticFieldLeak")
- public ListenableFutureTask get() {
- Util.assertMainThread();
- if (bitmapReference != null && bitmapReference.get() != null) {
- return new ListenableFutureTask<>(bitmapReference.get());
- } else if (task != null) {
- return task;
- } else {
- Callable callable = () -> {
- try {
- Log.i(TAG, "loading page " + model.getSprite());
- return loadPage();
- } catch (IOException ioe) {
- Log.w(TAG, ioe);
- }
- return null;
- };
- task = new ListenableFutureTask<>(callable);
- new AsyncTask() {
- @Override protected Void doInBackground(Void... params) {
- task.run();
- return null;
- }
-
- @Override protected void onPostExecute(Void aVoid) {
- task = null;
- }
- }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
- }
- return task;
- }
-
- public Bitmap loadPage() throws IOException {
- if (bitmapReference != null && bitmapReference.get() != null) return bitmapReference.get();
-
-
- float scale = decodeScale;
- AssetManager assetManager = context.getAssets();
- InputStream assetStream = assetManager.open(model.getSprite());
- BitmapFactory.Options options = new BitmapFactory.Options();
-
- 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 @NonNull String toString() {
- return model.getSprite();
- }
-}
diff --git a/src/main/java/org/thoughtcrime/securesms/components/emoji/parsing/EmojiParser.java b/src/main/java/org/thoughtcrime/securesms/components/emoji/parsing/EmojiParser.java
deleted file mode 100644
index 91450e102b..0000000000
--- a/src/main/java/org/thoughtcrime/securesms/components/emoji/parsing/EmojiParser.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/**
- * Copyright (c) 2014-present Vincent DURMONT vdurmont@gmail.com
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation the
- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-package org.thoughtcrime.securesms.components.emoji.parsing;
-
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * Based in part on code from emoji-java
- */
-public class EmojiParser {
-
- private final EmojiTree emojiTree;
-
- public EmojiParser(EmojiTree emojiTree) {
- this.emojiTree = emojiTree;
- }
-
- public @NonNull CandidateList findCandidates(@Nullable CharSequence text) {
- List results = new LinkedList<>();
-
- if (text == null) {
- return new CandidateList(results, false);
- }
-
- boolean allEmojis = text.length() > 0;
-
- for (int i = 0; i < text.length(); i++) {
- int emojiEnd = getEmojiEndPos(text, i);
-
- if (emojiEnd != -1) {
- EmojiDrawInfo drawInfo = emojiTree.getEmoji(text, i, emojiEnd);
-
- if (emojiEnd + 2 <= text.length()) {
- if (Fitzpatrick.fitzpatrickFromUnicode(text, emojiEnd) != null) {
- emojiEnd += 2;
- }
- }
-
- results.add(new Candidate(i, emojiEnd, drawInfo));
-
- i = emojiEnd - 1;
- } else if (text.charAt(i) != ' '){
- allEmojis = false;
- }
- }
-
- allEmojis &= !results.isEmpty();
-
- return new CandidateList(results, allEmojis);
- }
-
- private int getEmojiEndPos(CharSequence text, int startPos) {
- int best = -1;
-
- for (int j = startPos + 1; j <= text.length(); j++) {
- EmojiTree.Matches status = emojiTree.isEmoji(text, startPos, j);
-
- if (status.exactMatch()) {
- best = j;
- } else if (status.impossibleMatch()) {
- return best;
- }
- }
-
- return best;
- }
-
- public static class Candidate {
-
- private final int startIndex;
- private final int endIndex;
- private final EmojiDrawInfo drawInfo;
-
- Candidate(int startIndex, int endIndex, EmojiDrawInfo drawInfo) {
- this.startIndex = startIndex;
- this.endIndex = endIndex;
- this.drawInfo = drawInfo;
- }
-
- public EmojiDrawInfo getDrawInfo() {
- return drawInfo;
- }
-
- public int getEndIndex() {
- return endIndex;
- }
-
- public int getStartIndex() {
- return startIndex;
- }
- }
-
- public static class CandidateList implements Iterable {
- public final List list;
- public final boolean allEmojis;
-
- public CandidateList(List candidates, boolean allEmojis) {
- this.list = candidates;
- this.allEmojis = allEmojis;
- }
-
- public int size() {
- return list.size();
- }
-
- @Override
- public @NonNull Iterator iterator() {
- return list.iterator();
- }
- }
-
-}
diff --git a/src/main/java/org/thoughtcrime/securesms/components/emoji/parsing/EmojiTree.java b/src/main/java/org/thoughtcrime/securesms/components/emoji/parsing/EmojiTree.java
deleted file mode 100644
index 4a8abe2b31..0000000000
--- a/src/main/java/org/thoughtcrime/securesms/components/emoji/parsing/EmojiTree.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/**
- * Copyright (c) 2014-present Vincent DURMONT vdurmont@gmail.com
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation the
- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-package org.thoughtcrime.securesms.components.emoji.parsing;
-
-import androidx.annotation.Nullable;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Based in part on code from emoji-java
- */
-public class EmojiTree {
-
- private final EmojiTreeNode root = new EmojiTreeNode();
-
- private static final char TERMINATOR = '\ufe0f';
-
- public void add(String emojiEncoding, EmojiDrawInfo emoji) {
- EmojiTreeNode tree = root;
-
- for (char c: emojiEncoding.toCharArray()) {
- if (!tree.hasChild(c)) {
- tree.addChild(c);
- }
-
- tree = tree.getChild(c);
- }
-
- tree.setEmoji(emoji);
- }
-
- public Matches isEmoji(CharSequence sequence, int startPosition, int endPosition) {
- if (sequence == null) {
- return Matches.POSSIBLY;
- }
-
- EmojiTreeNode tree = root;
-
- for (int i=startPosition; i children = new HashMap<>();
- private EmojiDrawInfo emoji;
-
- public void setEmoji(EmojiDrawInfo emoji) {
- this.emoji = emoji;
- }
-
- public @Nullable EmojiDrawInfo getEmoji() {
- return emoji;
- }
-
- boolean hasChild(char child) {
- return children.containsKey(child);
- }
-
- void addChild(char child) {
- children.put(child, new EmojiTreeNode());
- }
-
- EmojiTreeNode getChild(char child) {
- return children.get(child);
- }
-
- boolean isEndOfEmoji() {
- return emoji != null;
- }
- }
-
- public enum Matches {
- EXACTLY, POSSIBLY, IMPOSSIBLE;
-
- public boolean exactMatch() {
- return this == EXACTLY;
- }
-
- public boolean impossibleMatch() {
- return this == IMPOSSIBLE;
- }
- }
-
-}
diff --git a/src/main/java/org/thoughtcrime/securesms/components/emoji/parsing/Fitzpatrick.java b/src/main/java/org/thoughtcrime/securesms/components/emoji/parsing/Fitzpatrick.java
deleted file mode 100644
index 68315a6eb6..0000000000
--- a/src/main/java/org/thoughtcrime/securesms/components/emoji/parsing/Fitzpatrick.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package org.thoughtcrime.securesms.components.emoji.parsing;
-
-
-public enum Fitzpatrick {
- /**
- * Fitzpatrick modifier of type 1/2 (pale white/white)
- */
- TYPE_1_2("\uD83C\uDFFB"),
-
- /**
- * Fitzpatrick modifier of type 3 (cream white)
- */
- TYPE_3("\uD83C\uDFFC"),
-
- /**
- * Fitzpatrick modifier of type 4 (moderate brown)
- */
- TYPE_4("\uD83C\uDFFD"),
-
- /**
- * Fitzpatrick modifier of type 5 (dark brown)
- */
- TYPE_5("\uD83C\uDFFE"),
-
- /**
- * Fitzpatrick modifier of type 6 (black)
- */
- TYPE_6("\uD83C\uDFFF");
-
- /**
- * The unicode representation of the Fitzpatrick modifier
- */
- public final String unicode;
-
- Fitzpatrick(String unicode) {
- this.unicode = unicode;
- }
-
-
- public static Fitzpatrick fitzpatrickFromUnicode(CharSequence unicode, int index) {
- for (Fitzpatrick v : values()) {
- boolean match = true;
-
- for (int i=0;i 0 ? String.format(Util.getLocale(), " %d%%", percent) : "";
+ statusLineText = getString(R.string.transferring) + formattedPercent;
hideSameNetworkHint = true;
} else if (permille == 1000) {
getTransferActivity().setTransferState(BackupTransferActivity.TransferState.TRANSFER_SUCCESS);
diff --git a/src/main/java/org/thoughtcrime/securesms/reactions/AddReactionView.java b/src/main/java/org/thoughtcrime/securesms/reactions/AddReactionView.java
index fdd38fb0d0..ae963a6643 100644
--- a/src/main/java/org/thoughtcrime/securesms/reactions/AddReactionView.java
+++ b/src/main/java/org/thoughtcrime/securesms/reactions/AddReactionView.java
@@ -7,6 +7,7 @@
import android.widget.LinearLayout;
import androidx.appcompat.app.AlertDialog;
+import androidx.appcompat.widget.AppCompatTextView;
import androidx.core.content.ContextCompat;
import androidx.emoji2.emojipicker.EmojiPickerView;
@@ -17,15 +18,14 @@
import com.b44t.messenger.rpc.Rpc;
import org.thoughtcrime.securesms.R;
-import org.thoughtcrime.securesms.components.emoji.EmojiTextView;
import org.thoughtcrime.securesms.connect.DcHelper;
import org.thoughtcrime.securesms.util.ViewUtil;
import java.util.Map;
public class AddReactionView extends LinearLayout {
- private EmojiTextView [] defaultReactionViews;
- private EmojiTextView anyReactionView;
+ private AppCompatTextView[] defaultReactionViews;
+ private AppCompatTextView anyReactionView;
private boolean anyReactionClearsReaction;
private Context context;
private DcContext dcContext;
@@ -46,7 +46,7 @@ private void init() {
context = getContext();
dcContext = DcHelper.getContext(context);
rpc = DcHelper.getRpc(getContext());
- defaultReactionViews = new EmojiTextView[]{
+ defaultReactionViews = new AppCompatTextView[]{
findViewById(R.id.reaction_0),
findViewById(R.id.reaction_1),
findViewById(R.id.reaction_2),
@@ -79,7 +79,7 @@ public void show(DcMsg msgToReactTo, View parentView, AddReactionListener listen
final String existingReaction = getSelfReaction();
boolean existingHilited = false;
- for (EmojiTextView defaultReactionView : defaultReactionViews) {
+ for (AppCompatTextView defaultReactionView : defaultReactionViews) {
if (defaultReactionView.getText().toString().equals(existingReaction)) {
defaultReactionView.setBackground(ContextCompat.getDrawable(context, R.drawable.reaction_pill_background_selected));
existingHilited = true;
@@ -105,7 +105,7 @@ public void show(DcMsg msgToReactTo, View parentView, AddReactionListener listen
} else {
x += offset;
}
- ViewUtil.setLeftMargin(this, x);
+ ViewUtil.setLeftMargin(this, Math.max(x, 0));
int y = Math.max((int)parentView.getY() - offset, offset/2);
ViewUtil.setTopMargin(this, y);
diff --git a/src/main/java/org/thoughtcrime/securesms/reactions/ReactionsConversationView.java b/src/main/java/org/thoughtcrime/securesms/reactions/ReactionsConversationView.java
index ac6f84d8bd..8000de3385 100644
--- a/src/main/java/org/thoughtcrime/securesms/reactions/ReactionsConversationView.java
+++ b/src/main/java/org/thoughtcrime/securesms/reactions/ReactionsConversationView.java
@@ -11,12 +11,12 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.appcompat.widget.AppCompatTextView;
import androidx.core.content.ContextCompat;
import com.b44t.messenger.rpc.Reaction;
import org.thoughtcrime.securesms.R;
-import org.thoughtcrime.securesms.components.emoji.EmojiTextView;
import org.thoughtcrime.securesms.util.ViewUtil;
import java.util.ArrayList;
@@ -93,7 +93,7 @@ public void setReactions(List reactions) {
private static View buildPill(@NonNull Context context, @NonNull ViewGroup parent, @NonNull Reaction reaction) {
View root = LayoutInflater.from(context).inflate(R.layout.reactions_pill, parent, false);
- EmojiTextView emojiView = root.findViewById(R.id.reactions_pill_emoji);
+ AppCompatTextView emojiView = root.findViewById(R.id.reactions_pill_emoji);
TextView countView = root.findViewById(R.id.reactions_pill_count);
View spacer = root.findViewById(R.id.reactions_pill_spacer);
diff --git a/src/main/java/org/thoughtcrime/securesms/util/Linkifier.java b/src/main/java/org/thoughtcrime/securesms/util/Linkifier.java
new file mode 100644
index 0000000000..2e42c27757
--- /dev/null
+++ b/src/main/java/org/thoughtcrime/securesms/util/Linkifier.java
@@ -0,0 +1,47 @@
+package org.thoughtcrime.securesms.util;
+
+import android.text.Spannable;
+import android.text.Spanned;
+import android.text.style.URLSpan;
+import android.text.util.Linkify;
+
+import java.util.regex.Pattern;
+
+/* Utility for text linkify-ing */
+public class Linkifier {
+ private static final Pattern CMD_PATTERN = Pattern.compile("(?<=^|\\s)/[a-zA-Z][a-zA-Z@\\d_/.-]{0,254}");
+ private static final Pattern CUSTOM_PATTERN = Pattern.compile("(?<=^|\\s)(OPENPGP4FPR|openpgp4fpr|mumble):[^ \\n]+");
+ private static final Pattern PROXY_PATTERN = Pattern.compile("(?<=^|\\s)(SOCKS5|socks5|ss|SS):[^ \\n]+");
+
+ private static void replaceURLSpan(Spannable messageBody) {
+ URLSpan[] urlSpans = messageBody.getSpans(0, messageBody.length(), URLSpan.class);
+ for (URLSpan urlSpan : urlSpans) {
+ int start = messageBody.getSpanStart(urlSpan);
+ int end = messageBody.getSpanEnd(urlSpan);
+ // LongClickCopySpan must not be derived from URLSpan, otherwise links will be removed on the next addLinks() call
+ messageBody.setSpan(new LongClickCopySpan(urlSpan.getURL()), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+ }
+ }
+
+ public static Spannable linkify(Spannable messageBody) {
+ // linkify commands such as `/echo` -
+ // do this first to avoid `/xkcd_123456` to be treated partly as a phone number
+ Linkify.addLinks(messageBody, CMD_PATTERN, "cmd:", null, null);
+ replaceURLSpan(messageBody); // replace URLSpan so that it is not removed on the next addLinks() call
+
+ Linkify.addLinks(messageBody, CUSTOM_PATTERN, null, null, null);
+ replaceURLSpan(messageBody);
+
+ if (Linkify.addLinks(messageBody, PROXY_PATTERN, null, null, null)) {
+ replaceURLSpan(messageBody); // replace URLSpan so that it is not removed on the next addLinks() call
+ }
+
+ // linkyfiy urls etc., this removes all existing URLSpan
+ if (Linkify.addLinks(messageBody, Linkify.EMAIL_ADDRESSES|Linkify.WEB_URLS|Linkify.PHONE_NUMBERS)) {
+ replaceURLSpan(messageBody);
+ }
+
+ return messageBody;
+ }
+
+}
diff --git a/src/main/java/org/thoughtcrime/securesms/util/Prefs.java b/src/main/java/org/thoughtcrime/securesms/util/Prefs.java
index 0d1871bb35..6f0e503655 100644
--- a/src/main/java/org/thoughtcrime/securesms/util/Prefs.java
+++ b/src/main/java/org/thoughtcrime/securesms/util/Prefs.java
@@ -52,7 +52,6 @@ public class Prefs {
public static final String NOTIFICATION_PRIVACY_PREF = "pref_notification_privacy";
public static final String NOTIFICATION_PRIORITY_PREF = "pref_notification_priority";
- public static final String SYSTEM_EMOJI_PREF = "pref_system_emoji";
public static final String BUILTIN_CAMERA_PREF = "pref_builtin_camera";
public static final String DIRECT_CAPTURE_CAMERA_ID = "pref_direct_capture_camera_id";
private static final String PROFILE_AVATAR_ID_PREF = "pref_profile_avatar_id";
@@ -256,10 +255,6 @@ public static void setBackgroundImagePath(Context context, int accountId, String
setStringPreference(context, BACKGROUND_PREF+accountId, path);
}
- public static boolean isSystemEmojiPreferred(Context context) {
- return true;
- }
-
public static boolean getAlwaysLoadRemoteContent(Context context) {
return getBooleanPreference(context, Prefs.ALWAYS_LOAD_REMOTE_CONTENT,
Prefs.ALWAYS_LOAD_REMOTE_CONTENT_DEFAULT);
diff --git a/src/main/java/org/thoughtcrime/securesms/util/SelectedContactsAdapter.java b/src/main/java/org/thoughtcrime/securesms/util/SelectedContactsAdapter.java
index cc8abb2809..b5d10b9970 100644
--- a/src/main/java/org/thoughtcrime/securesms/util/SelectedContactsAdapter.java
+++ b/src/main/java/org/thoughtcrime/securesms/util/SelectedContactsAdapter.java
@@ -4,6 +4,7 @@
import android.graphics.Color;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.appcompat.widget.AppCompatTextView;
import android.graphics.Typeface;
import android.view.LayoutInflater;
@@ -18,7 +19,6 @@
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.components.AvatarImageView;
-import org.thoughtcrime.securesms.components.emoji.EmojiTextView;
import org.thoughtcrime.securesms.connect.DcHelper;
import org.thoughtcrime.securesms.mms.GlideRequests;
import org.thoughtcrime.securesms.recipients.Recipient;
@@ -102,7 +102,7 @@ public View getView(final int position, View v, final ViewGroup parent) {
}
AvatarImageView avatar = v.findViewById(R.id.contact_photo_image);
- EmojiTextView name = v.findViewById(R.id.name);
+ AppCompatTextView name = v.findViewById(R.id.name);
TextView phone = v.findViewById(R.id.phone);
ImageButton delete = v.findViewById(R.id.delete);
diff --git a/src/main/java/org/thoughtcrime/securesms/util/ViewUtil.java b/src/main/java/org/thoughtcrime/securesms/util/ViewUtil.java
index 9934cbaf3f..683b84be99 100644
--- a/src/main/java/org/thoughtcrime/securesms/util/ViewUtil.java
+++ b/src/main/java/org/thoughtcrime/securesms/util/ViewUtil.java
@@ -31,6 +31,8 @@
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.interpolator.view.animation.FastOutSlowInInterpolator;
+
+import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
@@ -38,6 +40,7 @@
import android.view.ViewStub;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
+import android.widget.AbsSpinner;
import android.widget.TextView;
import com.b44t.messenger.util.concurrent.ListenableFuture;
@@ -46,6 +49,8 @@
import org.thoughtcrime.securesms.util.views.Stub;
public class ViewUtil {
+ private final static String TAG = ViewUtil.class.getSimpleName();
+
@SuppressWarnings("deprecation")
public static void setBackground(final @NonNull View v, final @Nullable Drawable drawable) {
v.setBackground(drawable);
@@ -267,4 +272,15 @@ public static int getStatusBarHeight(@NonNull View view) {
return result;
}
}
+
+ // Checks if a selection is valid for a given Spinner view.
+ // Returns given selection if valid.
+ // Otherwise, to avoid ArrayIndexOutOfBoundsException, 0 is returned, assuming to refer to a good default.
+ public static int checkBounds(int selection, AbsSpinner view) {
+ if (selection < 0 || selection >= view.getCount()) {
+ Log.w(TAG, "index " + selection + " out of bounds of " + view.toString());
+ return 0;
+ }
+ return selection;
+ }
}
diff --git a/src/main/res/layout/account_selection_list_item.xml b/src/main/res/layout/account_selection_list_item.xml
index 3b6d57d67d..0192093b8c 100644
--- a/src/main/res/layout/account_selection_list_item.xml
+++ b/src/main/res/layout/account_selection_list_item.xml
@@ -36,7 +36,7 @@
android:paddingEnd="16dp"
android:orientation="vertical">
-
-
-
-
+ android:visibility="gone">
+
+
+
+
diff --git a/src/main/res/layout/conversation_fragment.xml b/src/main/res/layout/conversation_fragment.xml
index 11d8e78359..23f8c5d8a2 100644
--- a/src/main/res/layout/conversation_fragment.xml
+++ b/src/main/res/layout/conversation_fragment.xml
@@ -16,7 +16,7 @@
android:clipChildren="false"
android:clipToPadding="false"/>
-
-
-
-
-
-
-
-
-
+
+
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/main/res/layout/emoji_grid_layout.xml b/src/main/res/layout/emoji_grid_layout.xml
deleted file mode 100644
index 9a35fb41b8..0000000000
--- a/src/main/res/layout/emoji_grid_layout.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
-
-
diff --git a/src/main/res/layout/emoji_keyboard_icon_dark.xml b/src/main/res/layout/emoji_keyboard_icon_dark.xml
deleted file mode 100644
index 48009b04ab..0000000000
--- a/src/main/res/layout/emoji_keyboard_icon_dark.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
-
-
diff --git a/src/main/res/layout/emoji_keyboard_icon_dark_selected.xml b/src/main/res/layout/emoji_keyboard_icon_dark_selected.xml
deleted file mode 100644
index 0fc900bb1c..0000000000
--- a/src/main/res/layout/emoji_keyboard_icon_dark_selected.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
-
-
diff --git a/src/main/res/layout/emoji_keyboard_icon_light.xml b/src/main/res/layout/emoji_keyboard_icon_light.xml
deleted file mode 100644
index bcca3a3e55..0000000000
--- a/src/main/res/layout/emoji_keyboard_icon_light.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
-
-
diff --git a/src/main/res/layout/emoji_keyboard_icon_light_selected.xml b/src/main/res/layout/emoji_keyboard_icon_light_selected.xml
deleted file mode 100644
index 5f96c59e05..0000000000
--- a/src/main/res/layout/emoji_keyboard_icon_light_selected.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
-
-
diff --git a/src/main/res/layout/emoji_variation_selector.xml b/src/main/res/layout/emoji_variation_selector.xml
deleted file mode 100644
index 4e5172f2fe..0000000000
--- a/src/main/res/layout/emoji_variation_selector.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
-
diff --git a/src/main/res/layout/emoji_variation_selector_item.xml b/src/main/res/layout/emoji_variation_selector_item.xml
deleted file mode 100644
index 94f805053d..0000000000
--- a/src/main/res/layout/emoji_variation_selector_item.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/main/res/layout/group_create_activity.xml b/src/main/res/layout/group_create_activity.xml
index 0622864c3e..85a53c4720 100644
--- a/src/main/res/layout/group_create_activity.xml
+++ b/src/main/res/layout/group_create_activity.xml
@@ -23,7 +23,7 @@
android:layout_marginEnd="10dp"
android:contentDescription="@string/group_avatar" />
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/main/res/layout/media_keyboard_bottom_tab_item.xml b/src/main/res/layout/media_keyboard_bottom_tab_item.xml
deleted file mode 100644
index 5b9d417938..0000000000
--- a/src/main/res/layout/media_keyboard_bottom_tab_item.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/main/res/layout/message_details_view.xml b/src/main/res/layout/message_details_view.xml
index 4614a832ec..71bbd10bd7 100644
--- a/src/main/res/layout/message_details_view.xml
+++ b/src/main/res/layout/message_details_view.xml
@@ -5,7 +5,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
-
-
-
-
-
-
diff --git a/src/main/res/layout/profile_preference_view.xml b/src/main/res/layout/profile_preference_view.xml
index 67043a88d1..2c0351c524 100644
--- a/src/main/res/layout/profile_preference_view.xml
+++ b/src/main/res/layout/profile_preference_view.xml
@@ -19,7 +19,7 @@
android:layout_marginRight="16dp"
android:layout_marginEnd="16dp">
-
-
-
-
-
-
-
+
diff --git a/src/main/res/layout/selected_contact_list_item.xml b/src/main/res/layout/selected_contact_list_item.xml
index 9201fcf0e9..744455eaeb 100644
--- a/src/main/res/layout/selected_contact_list_item.xml
+++ b/src/main/res/layout/selected_contact_list_item.xml
@@ -31,7 +31,7 @@
android:layout_centerVertical="true"
android:orientation="vertical">
-
-
- Bild kopieren
E-Mail kopieren
Von der Zwischenablage einfügen
- Der Verweis \"%1$d\" kann nicht im Webbrowser geöffnet werden. Möchten Sie den Link in die Zwischenablage kopieren?
+ Der Link \"%1$d\" kann nicht im Webbrowser geöffnet werden. Möchten Sie den Link in die Zwischenablage kopieren?
Nachricht weiterleiten
Antworten
Stummschalten
@@ -447,8 +447,8 @@
Sende \"%1$s\" an…
Nachricht senden an…
- Webxdc-Echtzeit-Kanäle
- Webxdc-Echtzeit-APIs aktivieren und direkte Verbindungen zwischen Geräten ermöglichen.
+ Echtzeit-Apps
+ Aktiviert Echtzeitverbindungen für in Chats verwendeten Apps. Wenn aktiviert, können Chat-Partner möglicherweise Ihre IP-Adresse ermitteln, wenn Sie eine App starten.
Standorte im Zeitrahmen anzeigen
@@ -622,12 +622,14 @@
Proxy verwenden
Proxy hinzufügen
Unterstützte Typen: HTTP(S), SOCKS5 und Shadowsocks.
- Proxy URL hier eingeben
- Ungültige oder nicht unterstützte Proxy-URL
+ Proxy-Link hier eingeben
+ Ungültiger oder nicht unterstützter Proxy
Proxies
Proxy löschen
\"%1$s\" löschen?
Proxy \"%1$s\" verwenden?
+ Freunde können das Proxy durch Scannen des QR-Codes verwenden.
+ Link teilen
SOCKS5
@@ -653,6 +655,9 @@
Ungültige Zertifikate akzeptieren
Profil wechseln
Profil hinzufügen
+ Private Bezeichnung
+ Familie, Arbeit, Freunde
+ Die Bezeichnung ist nur für Sie sichtbar um zwischen Profilen zu unterscheiden.
Profil löschen
Möchten Sie das Profil und alle Daten wirklich von diesem Gerät löschen?
Alle Daten des Profils \"%s\" werden von diesem Gerät gelöscht, dies schließt Ihre Ende-zu-Ende Autocrypt-Einstellungen, Kontakte, Chats, Nachrichten und Medien mit ein. Diese Aktion kann nicht rückgängig gemacht werden.
diff --git a/src/main/res/values-es/strings.xml b/src/main/res/values-es/strings.xml
index b00e29065d..6fe78fcc91 100644
--- a/src/main/res/values-es/strings.xml
+++ b/src/main/res/values-es/strings.xml
@@ -466,9 +466,6 @@
Enviar \"%1$s\" a…
Enviar mensaje a…
- Canales Webxdc en tiempo real
- Habilitar la API de tiempo real de Webxdc para poder crear conexiones directas entre dispositivos.
-
Mostrar ubicaciones en el marco de tiempo
Mostrar trazas
diff --git a/src/main/res/values-fi/strings.xml b/src/main/res/values-fi/strings.xml
index d92754e5e1..dd16d08ed1 100644
--- a/src/main/res/values-fi/strings.xml
+++ b/src/main/res/values-fi/strings.xml
@@ -427,9 +427,6 @@
Lähetä \"%1$s\" kohteeseen...
Lähetä viesti kohteeseen...
- Reaaliaikaiset Webxdc -kanavat
- Ota Webxdc:n reaaliaikaiset ohjelmointirajapinnat käyttöön niin voit luoda suoria yhteyksiä laitteiden välillä.
-
Näytä sijainnit aikajanalla
Näytä jäljet
diff --git a/src/main/res/values-fr/strings.xml b/src/main/res/values-fr/strings.xml
index 3b652c9f36..3b01680e23 100644
--- a/src/main/res/values-fr/strings.xml
+++ b/src/main/res/values-fr/strings.xml
@@ -443,9 +443,6 @@
Envoyer \"%1$s\" à
Envoyer un message à
- Canaux Webxdc temps réel
- Enclenchez l\'API temps réel Webxdc pour créer des connexions entre les appareils.
-
Afficher les positions pour une période
Afficher les traces
@@ -598,8 +595,6 @@
Utiliser le proxy
Ajouter un proxy
Types de proxy supportés: HTTP(S), SOCKS5 et Shadowsocks.
- Entrez l\'URL du proxy ici
- URL invalide ou non supportée
Sauver les proxy
Effacer le proxy
diff --git a/src/main/res/values-hu/strings.xml b/src/main/res/values-hu/strings.xml
index 10306c4525..c88e8ea6c4 100644
--- a/src/main/res/values-hu/strings.xml
+++ b/src/main/res/values-hu/strings.xml
@@ -7,6 +7,10 @@
vagy
Keresés kiürítése
+
+ Hivatkozás
+
+ Beolvasás
Igen
Nem
Kiválasztás
@@ -234,6 +238,7 @@
Üzenet részletei
Vágólapra másolás
Meghívó-hivatkozás megosztása
+ Ezen a hivatkozáson keresztül bárki megtekintheti az Ön profilját, és csevegést kezdeményezhet Önnel. Csak olyan emberekkel ossza meg, akikben megbízik.
Ismerősök meghívása
Lépjen kapcsolatba velem a Delta Chat-en:\n%1$s
@@ -441,9 +446,6 @@
„%1$s” küldése…
Üzenet küldése…
- Valósidejű Webxdc-csatornák
- A Webxdc valós idejű API-k engedélyezése az eszközök közötti közvetlen kapcsolatok létrehozásához.
-
Helyszínek megjelenítése időkeretben
Nyomvonalak megjelenítése
@@ -616,12 +618,14 @@
Proxy használata
Proxy hozzáadása
Támogatott proxytípusok: HTTP(S), SOCKS5 és ShadowSOCKS
- Adja meg a proxy webcímét
- Érvénytelen vagy nem támogatott a proxy webcíme
+ Adja meg a proxy hivatkozását
+ Érvénytelen vagy nem támogatott proxy
Mentett proxyk
Proxy törlése
Biztosan törli a következőt: „%1$s”?
Biztosan használni akarja a következő proxyt: „%1$s”?
+ Az ismerősei a QR-kód beolvasásával hozzáadhatják ezt a proxyt.
+ Hivatkozás megosztása
SOCKS5
@@ -647,6 +651,9 @@
Érvénytelen tanúsítványok elfogadása
Profilváltás
Profil hozzáadása
+ Privát címke
+ Például: „Munka”, „Család”
+ A címke csak az Ön számára jelenik meg; segít megkülönböztetni a profiljait.
Profil törlése
Biztosan törölni szeretné a profiladatait?
A(z) „%s” nevű profilhoz tartozó mindet adat ezen az eszközön törölve lesz, beleértve a végpontok közötti titkosítás beállításait, a névjegyeket, a csevegéseket, az üzeneteket és a médiát. Ez a művelet nem vonható vissza.
diff --git a/src/main/res/values-it/strings.xml b/src/main/res/values-it/strings.xml
index 55678a04c0..32f14aa0a0 100644
--- a/src/main/res/values-it/strings.xml
+++ b/src/main/res/values-it/strings.xml
@@ -463,8 +463,8 @@
Invia \"%1$s\" a…
Invia Messaggio a...
- Canali Webxdc in Tempo Reale
- Abilita le API in tempo reale Webxdc per creare connessioni dirette tra dispositivi
+ Apps in Tempo Reale
+ Abilitando connessioni in tempo reale per app condivise nelle chat. Se abilitato, i partner della chat potrebbero essere in grado di scoprire il tuo indirizzo IP quando avvii un\'app.
Mostra le posizioni nel tempo
@@ -638,12 +638,14 @@
Usa Proxy
Aggiungi Proxy
Tipi di proxy supportati: HTTP(S), SOCKS5 e Shadowsocks.
- Inserisci qui l\'URL del proxy
- URL proxy non valido o non supportato
+ Inserisci qui il collegamento proxy
+ Proxy non valido o non supportato
Proxy Salvati
Elimina Proxy
Sei sicuro di voler eliminare \"%1$s\"?
Vuoi usare il proxy \"%1$s\"?
+ I tuoi amici possono aggiungere questo proxy scansionando il Codice QR.
+ Condividi Collegamento
SOCKS5
@@ -669,6 +671,9 @@
Accetta certificati non validi
Cambia Account
Aggiungi Account
+ Etichetta Privata
+ es. Lavoro, Famiglia
+ Etichetta visibile solo a te, che ti aiuta a distinguere i tuoi profili.
Elimina Account
Sei certo di voler eliminare i dati dell\'account?
Verranno eliminati tutti i dati dell\'account di \"%s\" su questo dispositivo, inclusa la configurazione della crittografia end-to-end, contatti, chat, messaggi e contenuti multimediali. Questa azione non può essere annullata.
diff --git a/src/main/res/values-lt/strings.xml b/src/main/res/values-lt/strings.xml
index 820c69c8e2..1d5b2247d9 100644
--- a/src/main/res/values-lt/strings.xml
+++ b/src/main/res/values-lt/strings.xml
@@ -497,13 +497,10 @@
Naudoti įgaliotąjį serverį
Pridėti įgaliotąjį serverį
Palaikomi įgaliotųjų serverių tipai: HTTP(S), SOCKS5 ir Shadowsocks.
- Čia įveskite įgaliotojo serverio URL
- Neteisingas arba nepalaikomas įgaliotojo serverio URL
Įrašyti įgaliotieji serveriai
Ištrinti įgaliotąjį serverį
Ar tikrai norite ištrinti „%1$s“?
Ar norite naudoti įgaliotąjį serverį „%1$s“?
-
SOCKS5
Naudoti SOCKS5
diff --git a/src/main/res/values-nl/strings.xml b/src/main/res/values-nl/strings.xml
index a1bc810ec2..ed870e498d 100644
--- a/src/main/res/values-nl/strings.xml
+++ b/src/main/res/values-nl/strings.xml
@@ -446,9 +446,6 @@
“%1$s” versturen naar…
Bericht versturen naar…
- Live-webxdckanalen
- Maak gebruik van live-api\'s van Webxdc om directe verbindingen tussen apparaten op te zetten.
-
Locaties tonen in tijdsbeeld
Sporen tonen
@@ -621,12 +618,14 @@
Proxy gebruiken
Proxy toevoegen
Ondersteunde proxytypes: http(s), socks5 en shadowsocks.
- Voer een proxy-url in
- Ongeldige of niet-ondersteunde proxy-url
+ Voer een proxylink in
+ Ongeldige of niet-ondersteunde proxy
Bewaarde proxy\'s
Proxy verwijderen
Weet je zeker dat je ‘%1$s’ wilt verwijderen?
Wil je gebruikmaken van de proxy ‘%1$s’?
+ Je kunt vrienden toevoegen aan deze proxy door de QR-code te scannen.
+ Link delen
SOCKS5
@@ -652,6 +651,9 @@
Ongeldige certificaten accepteren
Ander account kiezen
Account toevoegen
+ Privélabel
+ bijv. werk, familie
+ Een label dat alleen jij kan zien, om profielen van elkaar te onderscheiden.
Account verwijderen
Weet je zeker dat je je accountgegevens wilt verwijderen?
Alle gegevens van ‘%s’ worden verwijderd: de eind-tot-eindinstellingen, contactpersonen, gesprekken, berichten en media. Deze actie kan niet ongedaan worden gemaakt.
diff --git a/src/main/res/values-pl/strings.xml b/src/main/res/values-pl/strings.xml
index 6d595e49ef..a5c9d8b8df 100644
--- a/src/main/res/values-pl/strings.xml
+++ b/src/main/res/values-pl/strings.xml
@@ -478,9 +478,6 @@
Wyślij „%1$s” do…
Wyślij wiadomość do…
- Kanał czasu rzeczywistego dla Webxdc
- Włącz API czasu rzeczywistego dla Webxdc, aby tworzyć bezpośrednie połączenia między urządzeniami.
-
Pokaż lokalizacje w ramach czasowych
Pokaż ślady
@@ -653,12 +650,14 @@
Użyj proxy
Dodaj proxy
Obsługiwane typy serwerów proxy: HTTP(S), SOCKS5 i Shadowsocks.
- Wpisz tu URL proxy
- Nieprawidłowy lub nieobsługiwany URL proxy
+ Wpisz tu link proxy
+ Nieprawidłowe lub nieobsługiwane proxy
Zapisane proxy
Usuń proxy
Na pewno chcesz usunąć „%1$s”?
Chcesz użyć proxy „%1$s”?
+ Twoi znajomi mogą dodać ten serwer proxy, skanując kod QR.
+ Udostępnij link
SOCKS5
@@ -684,6 +683,9 @@
Zaakceptuj nieprawidłowe certyfikaty
Przełącz konto
Dodaj konto
+ Prywatna etykieta
+ np. Praca, Rodzina
+ Etykieta jest widoczna tylko dla ciebie; pomaga odróżnić twoje profile.
Usuń konto
Czy na pewno chcesz usunąć dane swojego konta?
Wszystkie dane konta „%s” na tym urządzeniu zostaną usunięte, w tym konfiguracja szyfrowania end-to-end, kontakty, czaty, wiadomości i multimedia. Tej operacji nie można cofnąć.
diff --git a/src/main/res/values-ru/strings.xml b/src/main/res/values-ru/strings.xml
index 58bb92246f..cab205ce96 100644
--- a/src/main/res/values-ru/strings.xml
+++ b/src/main/res/values-ru/strings.xml
@@ -472,9 +472,6 @@
Отправить \"%1$s\" …
Отправить сообщение…
- Каналы Webxdc в реальном времени
- Активировать Webxdc API реального времени для создания прямого подключения между устройствами.
-
Показать местоположения с интервалом времени
Показывать маршруты
@@ -647,12 +644,14 @@
Использовать прокси
Добавить прокси
Поддерживаемые типы прокси: HTTP(S), SOCKS5 и Shadowsocks.
- Введите URL прокси
- Некорректный или неподдерживаемый URL прокси
+ Введите ссылку на прокси
+ Недопустимый или неподдерживаемый прокси
Сохранённые прокси
Удалить прокси
Вы уверены, что хотите удалить \"%1$s\"?
Вы хотите использовать прокси \"%1$s\"?
+ Ваши друзья могут добавить этот прокси, отсканировав QR-код.
+ Поделиться ссылкой
SOCKS5
@@ -678,6 +677,9 @@
Принимать недействительные сертификаты
Сменить профиль
Добавить профиль
+ Личный тег
+ Например: Работа, Семья
+ Тег, видимый только вам, помогает различать ваши профили.
Удалить профиль
Вы уверены, что хотите удалить данные своего профиля?
Все данные профиля \"%s\" на этом устройстве будут безвозвратно удалены, включая настройки сквозного шифрования, контакты, чаты, сообщения и медиафайлы. Это действие не может быть отменено.
diff --git a/src/main/res/values-sq/strings.xml b/src/main/res/values-sq/strings.xml
index b63f8cee0e..b615736af9 100644
--- a/src/main/res/values-sq/strings.xml
+++ b/src/main/res/values-sq/strings.xml
@@ -444,8 +444,6 @@
Dërgoni “%1$s” për …
Dërgoni Mesazh për…
- Aktivizoni API të atypëratyshme Webxdc, që të krijoni lidhje të drejtpërdrejta mes pajisjesh.
-
Shfaq vendndodhje në rrjedhë kohore
Shfaq gjurmë
@@ -618,12 +616,14 @@
Përdor Ndërmjetës
Shtoni Ndërmjetës
Lloje ndërmjetësish që mbulohen: HTTP(S), SOCKS5 dhe Shadowsocks.
- Jepni këtu URL-në e ndërmjetësit
- URL ndërmjetësi e pavlefshme, ose që s’mbulohet
+ Jepni këtu lidhjen e ndërmjetësit
+ Ndërmjetës i pavlefshëm, ose që s’mbulohet
Ndërmjetës të Ruajtur
Fshije Ndërmjetësin
Jeni i sigurt se doni të fshihet “%1$s”?
Doni të përdore ndërmjetësi “%1$s”?
+ Shokët tuaj mund ta shtojnë këtë ndërmjetës përmes skanimit të kodit QR.
+ Jepeni Lidhjen
SOCKS5
@@ -649,6 +649,9 @@
Prano dëshmi të pavlefshme
Ndërroni Llogari
Shtoni Llogari
+ Etiketë Private
+ p.sh., Pune, Familjeje
+ Ajo etiketë është e dukshme vetëm për ju; për t’ju ndihmuar ju të bëni dallimin mes profileve tuaja.
Fshije Llogarinë
Jeni i sigurt se doni të fshihen të dhënat e llogarisë tuaj?
Krejt të dhënat e llogarisë për “%s” në këtë pajisje do të fshihen, përfshi ato të ujdisjes tuaj për fshehtëzim skaj-më-skaj, kontakte, fjalosje, mesazhe dhe media. Ky veprim s’mund të zhbëhet.
diff --git a/src/main/res/values-sv/strings.xml b/src/main/res/values-sv/strings.xml
index 76906876b2..a6e7417ec2 100644
--- a/src/main/res/values-sv/strings.xml
+++ b/src/main/res/values-sv/strings.xml
@@ -433,9 +433,6 @@
Skicka \"%1$s\" till...
Skicka meddelande till...
- Realtids Webxdc-kanaler
- Aktivera Webxtc realtids-API för att skapa direktanslutningar mellan enheter.
-
Visa platser inom tidsramen
Visa spår
diff --git a/src/main/res/values-tr/strings.xml b/src/main/res/values-tr/strings.xml
index 7b9b73a1f6..a1cf209832 100644
--- a/src/main/res/values-tr/strings.xml
+++ b/src/main/res/values-tr/strings.xml
@@ -446,9 +446,6 @@
\"%1$s\" dosyasını gönder…
İletiyi gönder…
- Gerçek Zamanlı Webxdc Kanalları
- Aygıtlar arasında doğrudan bağlantılar oluşturmak için Webxdc gerçek zamanlı API\'lerini etkinleştirin.
-
Konumları zaman çerçevesinde göster
İzleri göster
@@ -621,13 +618,10 @@
Proxy Kullan
Proxy Ekle
Desteklenen proxy türleri: HTTP(S), SOCKS5 ve Shadowsocks.
- Buraya proxy URL\'sini girin
- Geçersiz ya da desteklenmeyen proxy URL\'si
Kaydedilen Proxy\'ler
Proxy\'yi Sil
\"%1$s\" proxy\'sini silmek istediğinizden emin misiniz?
\"%1$s\" proxy\'sini kullanmak istiyor musunuz?
-
SOCKS5
SOCKS5\'i Kullan
diff --git a/src/main/res/values-uk/strings.xml b/src/main/res/values-uk/strings.xml
index ae016ba1dc..0eeda0924a 100644
--- a/src/main/res/values-uk/strings.xml
+++ b/src/main/res/values-uk/strings.xml
@@ -7,6 +7,10 @@
або
Очистити пошук
+
+ Посилання
+
+ Сканувати
Так
Ні
Обрати
@@ -135,6 +139,12 @@
- %d повідомлень
- %d повідомлень
+
+ - %d реакція
+ - %d реакції
+ - %d реакцій
+ - %d реакції
+
- %d учасник
- %d учасники
@@ -246,6 +256,7 @@
Інформація про повідомлення
Копіювати в буфер обміну
Поділитися посиланням на запрошення
+ Будь-хто за цим посиланням може переглянути ваш профіль і почати з вами чат. Діліться ним лише з людьми, яким ви довіряєте.
Запросити друзів
Зв\'яжіться зі мною в Delta Chat:\n%1$s
@@ -467,9 +478,6 @@
Надіслати \"%1$s\" до…
Надіслати повідомлення до...
- Канали Webxdc в реальному часі
- Увімкніть API реального часу Webxdc для створення прямих з\'єднань між пристроями.
-
Показати місця у часовому проміжку
Показати треки
@@ -642,13 +650,10 @@
Використовувати проксі
Додати проксі-сервер
Підтримувані типи проксі: HTTP(S), SOCKS5 і Shadowsocks.
- Введіть URL проксі-сервера тут
- Невірний або непідтримуваний URL проксі-сервера
Збережені проксі-сервери
Видалити проксі-сервер
Ви дійсно хочете видалити \"%1$s\"?
Ви хочете використовувати проксі \"%1$s\"?
-
SOCKS5
Використовувати SOCKS5
@@ -686,6 +691,8 @@
Переслати...
+
+ Надіслати %1$d файли до \"%2$s\"?
Надіслати %1$d файл (файлів) у %2$d чати?
(Відео надсилаються у вигляді оригінальних великих файлів. Щоб надіслати відео у вигляді менших файлів, прикріпіть їх окремо)
Надіслати цей текст у %1$d чати?\n\n\"%2$s\"
diff --git a/src/main/res/values-zh-rCN/strings.xml b/src/main/res/values-zh-rCN/strings.xml
index c9be3e1191..80dbec9dcb 100644
--- a/src/main/res/values-zh-rCN/strings.xml
+++ b/src/main/res/values-zh-rCN/strings.xml
@@ -430,9 +430,6 @@
发送“%1$s\"到...
发送消息到...
- 实时 Webxdc 频道
- 启用 Webxdc 实时 API 来创建设备间的直接连接
-
显示时间范围内的位置
显示轨迹
@@ -605,12 +602,14 @@
使用代理
添加代理
支持的代理类型:HTTP(S)、SOCKS5 和 Shadowsocks.
- 在此输入代理 URL
- 无效或不受支持的代理 URL
+ 在此输入代理链接
+ 无效或不受支持的代理
已保存的代理
删除代理
你确定要删除 \"%1$s\"吗?
你想使用代理“%1$s”吗?
+ 你的好友可以扫描二维码添加此代理
+ 分享链接
SOCKS5
@@ -636,6 +635,9 @@
接受无效的证书
切换账号
添加账号
+ 私密标签
+ 如工作、家庭
+ 仅对你可见的标签;帮助你区分不同的配置文件
删除账号
是否确定要删除您的账号数据?
将会删除此设备上“%s”的所有账号数据,包括您的端到端加密设置、联系人、聊天、消息和媒体。此操作无法撤销。
diff --git a/src/main/res/values-zh-rTW/strings.xml b/src/main/res/values-zh-rTW/strings.xml
index d7a7aece24..2362865d25 100644
--- a/src/main/res/values-zh-rTW/strings.xml
+++ b/src/main/res/values-zh-rTW/strings.xml
@@ -398,9 +398,6 @@
傳送「%1$s」至…
傳送訊息至…
- 即時 Webxdc 頻道
- 啟用 Webxdc 即時 API 以在裝置之間建立直接連線。
-
顯示指定時間內的所在地
顯示移動足跡
diff --git a/src/main/res/values/arrays.xml b/src/main/res/values/arrays.xml
index 14f5788446..1470ee3f70 100644
--- a/src/main/res/values/arrays.xml
+++ b/src/main/res/values/arrays.xml
@@ -171,12 +171,6 @@
- @string/accept_invalid_certificates
-
- - 0
- - 1
- - 3
-
-
diff --git a/src/main/res/values/attrs.xml b/src/main/res/values/attrs.xml
index 93b08ad96e..934099b583 100644
--- a/src/main/res/values/attrs.xml
+++ b/src/main/res/values/attrs.xml
@@ -38,25 +38,9 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -126,13 +110,6 @@
-
-
-
-
-
-
-
diff --git a/src/main/res/values/dimens.xml b/src/main/res/values/dimens.xml
index 725cd70987..d9a6167764 100644
--- a/src/main/res/values/dimens.xml
+++ b/src/main/res/values/dimens.xml
@@ -39,9 +39,6 @@
1dp
- 5dp
- 4dp
-
-150dp
12dp
diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
index 67372c40e6..8edd133369 100644
--- a/src/main/res/values/strings.xml
+++ b/src/main/res/values/strings.xml
@@ -462,8 +462,8 @@
Send \"%1$s\" to…
Send Message to…
- Realtime Webxdc Channels
- Enable Webxdc realtime APIs to create direct connections between devices.
+ Real-Time Apps
+ Enable real-time connections for apps shared in chats. If enabled, chat partners may be able to discover your IP address when you start an app.
Show locations in time frame
diff --git a/src/main/res/values/text_styles.xml b/src/main/res/values/text_styles.xml
index 22830b8eaf..8cdde6c8ae 100644
--- a/src/main/res/values/text_styles.xml
+++ b/src/main/res/values/text_styles.xml
@@ -32,9 +32,9 @@
diff --git a/src/main/res/values/themes.xml b/src/main/res/values/themes.xml
index 9f4ec02905..d3fb03247b 100644
--- a/src/main/res/values/themes.xml
+++ b/src/main/res/values/themes.xml
@@ -88,25 +88,9 @@
- @drawable/contact_list_divider_light
- @color/gray65
- - @color/gray12
- - #66555555
- - #44555555
- - @color/gray20
- @color/black
- @color/grey_100
- - @drawable/ic_recent_light_20
- - @drawable/ic_emoji_people_light_20
- - @drawable/ic_emoji_animal_light_20
- - @drawable/ic_emoji_food_light_20
- - @drawable/ic_emoji_activity_light_20
- - @drawable/ic_emoji_travel_light_20
- - @drawable/ic_emoji_object_light_20
- - @drawable/ic_emoji_symbol_light_20
- - @drawable/ic_emoji_flag_light_20
- - @drawable/ic_emoji_emoticon_light_20
- - @drawable/emoji_variation_selector_background_light
-
- @color/white
@@ -243,27 +227,9 @@
- @drawable/ic_attach_white_24dp
- @color/gray13
- @color/white
-
- - @color/gray95
- - @color/gray65
- - @color/gray78
- - @color/gray70
- - @color/black
- @color/white
- @color/gray95
- - @drawable/ic_recent_dark_20
- - @drawable/ic_emoji_people_dark_20
- - @drawable/ic_emoji_animal_dark_20
- - @drawable/ic_emoji_food_dark_20
- - @drawable/ic_emoji_activity_dark_20
- - @drawable/ic_emoji_travel_dark_20
- - @drawable/ic_emoji_object_dark_20
- - @drawable/ic_emoji_symbol_dark_20
- - @drawable/ic_emoji_flag_dark_20
- - @drawable/ic_emoji_emoticon_dark_20
- - @drawable/emoji_variation_selector_background_dark
-
- @drawable/quick_camera_dark
- @drawable/ic_mic_white_24dp
- @drawable/recording_lock_background_dark
diff --git a/src/main/res/xml/preferences_advanced.xml b/src/main/res/xml/preferences_advanced.xml
index c65e5ea6fb..d87fdd31d3 100644
--- a/src/main/res/xml/preferences_advanced.xml
+++ b/src/main/res/xml/preferences_advanced.xml
@@ -8,6 +8,12 @@
android:entries="@array/pref_show_emails_entries"
android:entryValues="@array/pref_show_emails_values" />
+
+
diff --git a/src/main/res/xml/preferences_chats.xml b/src/main/res/xml/preferences_chats.xml
index 9c8965265c..f15d248893 100644
--- a/src/main/res/xml/preferences_chats.xml
+++ b/src/main/res/xml/preferences_chats.xml
@@ -24,7 +24,7 @@
+ android:title="@string/export_backup_desktop"/>