mirror of
https://github.com/Helium314/HeliBoard.git
synced 2025-06-06 14:50:14 +00:00
Update managing emoji categories (#1515)
This commit is contained in:
parent
880c7eaf33
commit
95d4bfe97c
27 changed files with 2117 additions and 2798 deletions
85
app/src/main/assets/emoji/ACTIVITIES.txt
Normal file
85
app/src/main/assets/emoji/ACTIVITIES.txt
Normal file
|
@ -0,0 +1,85 @@
|
||||||
|
🎃
|
||||||
|
🎄
|
||||||
|
🎆
|
||||||
|
🎇
|
||||||
|
🧨
|
||||||
|
✨
|
||||||
|
🎈
|
||||||
|
🎉
|
||||||
|
🎊
|
||||||
|
🎋
|
||||||
|
🎍
|
||||||
|
🎎
|
||||||
|
🎏
|
||||||
|
🎐
|
||||||
|
🎑
|
||||||
|
🧧
|
||||||
|
🎀
|
||||||
|
🎁
|
||||||
|
🎗️
|
||||||
|
🎟️
|
||||||
|
🎫
|
||||||
|
🎖️
|
||||||
|
🏆
|
||||||
|
🏅
|
||||||
|
🥇
|
||||||
|
🥈
|
||||||
|
🥉
|
||||||
|
⚽
|
||||||
|
⚾
|
||||||
|
🥎
|
||||||
|
🏀
|
||||||
|
🏐
|
||||||
|
🏈
|
||||||
|
🏉
|
||||||
|
🎾
|
||||||
|
🥏
|
||||||
|
🎳
|
||||||
|
🏏
|
||||||
|
🏑
|
||||||
|
🏒
|
||||||
|
🥍
|
||||||
|
🏓
|
||||||
|
🏸
|
||||||
|
🥊
|
||||||
|
🥋
|
||||||
|
🥅
|
||||||
|
⛳
|
||||||
|
⛸️
|
||||||
|
🎣
|
||||||
|
🤿
|
||||||
|
🎽
|
||||||
|
🎿
|
||||||
|
🛷
|
||||||
|
🥌
|
||||||
|
🎯
|
||||||
|
🪀
|
||||||
|
🪁
|
||||||
|
🔫
|
||||||
|
🎱
|
||||||
|
🔮
|
||||||
|
🪄
|
||||||
|
🎮
|
||||||
|
🕹️
|
||||||
|
🎰
|
||||||
|
🎲
|
||||||
|
🧩
|
||||||
|
🧸
|
||||||
|
🪅
|
||||||
|
🪩
|
||||||
|
🪆
|
||||||
|
♠️
|
||||||
|
♥️
|
||||||
|
♦️
|
||||||
|
♣️
|
||||||
|
♟️
|
||||||
|
🃏
|
||||||
|
🀄
|
||||||
|
🎴
|
||||||
|
🎭
|
||||||
|
🖼️
|
||||||
|
🎨
|
||||||
|
🧵
|
||||||
|
🪡
|
||||||
|
🧶
|
||||||
|
🪢
|
159
app/src/main/assets/emoji/ANIMALS_AND_NATURE.txt
Normal file
159
app/src/main/assets/emoji/ANIMALS_AND_NATURE.txt
Normal file
|
@ -0,0 +1,159 @@
|
||||||
|
🐵
|
||||||
|
🐒
|
||||||
|
🦍
|
||||||
|
🦧
|
||||||
|
🐶
|
||||||
|
🐕
|
||||||
|
🦮
|
||||||
|
🐕🦺
|
||||||
|
🐩
|
||||||
|
🐺
|
||||||
|
🦊
|
||||||
|
🦝
|
||||||
|
🐱
|
||||||
|
🐈
|
||||||
|
🐈⬛
|
||||||
|
🦁
|
||||||
|
🐯
|
||||||
|
🐅
|
||||||
|
🐆
|
||||||
|
🐴
|
||||||
|
🫎
|
||||||
|
🫏
|
||||||
|
🐎
|
||||||
|
🦄
|
||||||
|
🦓
|
||||||
|
🦌
|
||||||
|
🦬
|
||||||
|
🐮
|
||||||
|
🐂
|
||||||
|
🐃
|
||||||
|
🐄
|
||||||
|
🐷
|
||||||
|
🐖
|
||||||
|
🐗
|
||||||
|
🐽
|
||||||
|
🐏
|
||||||
|
🐑
|
||||||
|
🐐
|
||||||
|
🐪
|
||||||
|
🐫
|
||||||
|
🦙
|
||||||
|
🦒
|
||||||
|
🐘
|
||||||
|
🦣
|
||||||
|
🦏
|
||||||
|
🦛
|
||||||
|
🐭
|
||||||
|
🐁
|
||||||
|
🐀
|
||||||
|
🐹
|
||||||
|
🐰
|
||||||
|
🐇
|
||||||
|
🐿️
|
||||||
|
🦫
|
||||||
|
🦔
|
||||||
|
🦇
|
||||||
|
🐻
|
||||||
|
🐻❄️
|
||||||
|
🐨
|
||||||
|
🐼
|
||||||
|
🦥
|
||||||
|
🦦
|
||||||
|
🦨
|
||||||
|
🦘
|
||||||
|
🦡
|
||||||
|
🐾
|
||||||
|
🦃
|
||||||
|
🐔
|
||||||
|
🐓
|
||||||
|
🐣
|
||||||
|
🐤
|
||||||
|
🐥
|
||||||
|
🐦
|
||||||
|
🐧
|
||||||
|
🕊️
|
||||||
|
🦅
|
||||||
|
🦆
|
||||||
|
🦢
|
||||||
|
🦉
|
||||||
|
🦤
|
||||||
|
🪶
|
||||||
|
🦩
|
||||||
|
🦚
|
||||||
|
🦜
|
||||||
|
🪽
|
||||||
|
🐦⬛
|
||||||
|
🪿
|
||||||
|
🐦🔥
|
||||||
|
🐸
|
||||||
|
🐊
|
||||||
|
🐢
|
||||||
|
🦎
|
||||||
|
🐍
|
||||||
|
🐲
|
||||||
|
🐉
|
||||||
|
🦕
|
||||||
|
🦖
|
||||||
|
🐳
|
||||||
|
🐋
|
||||||
|
🐬
|
||||||
|
🦭
|
||||||
|
🐟
|
||||||
|
🐠
|
||||||
|
🐡
|
||||||
|
🦈
|
||||||
|
🐙
|
||||||
|
🐚
|
||||||
|
🪸
|
||||||
|
🪼
|
||||||
|
🦀
|
||||||
|
🦞
|
||||||
|
🦐
|
||||||
|
🦑
|
||||||
|
🦪
|
||||||
|
🐌
|
||||||
|
🦋
|
||||||
|
🐛
|
||||||
|
🐜
|
||||||
|
🐝
|
||||||
|
🪲
|
||||||
|
🐞
|
||||||
|
🦗
|
||||||
|
🪳
|
||||||
|
🕷️
|
||||||
|
🕸️
|
||||||
|
🦂
|
||||||
|
🦟
|
||||||
|
🪰
|
||||||
|
🪱
|
||||||
|
🦠
|
||||||
|
💐
|
||||||
|
🌸
|
||||||
|
💮
|
||||||
|
🪷
|
||||||
|
🏵️
|
||||||
|
🌹
|
||||||
|
🥀
|
||||||
|
🌺
|
||||||
|
🌻
|
||||||
|
🌼
|
||||||
|
🌷
|
||||||
|
🪻
|
||||||
|
🌱
|
||||||
|
🪴
|
||||||
|
🌲
|
||||||
|
🌳
|
||||||
|
🌴
|
||||||
|
🌵
|
||||||
|
🌾
|
||||||
|
🌿
|
||||||
|
☘️
|
||||||
|
🍀
|
||||||
|
🍁
|
||||||
|
🍂
|
||||||
|
🍃
|
||||||
|
🪹
|
||||||
|
🪺
|
||||||
|
🍄
|
||||||
|
|
25
app/src/main/assets/emoji/EMOTICONS.txt
Normal file
25
app/src/main/assets/emoji/EMOTICONS.txt
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
:-)
|
||||||
|
;-)
|
||||||
|
:-(
|
||||||
|
:-!
|
||||||
|
:-$
|
||||||
|
B-)
|
||||||
|
=-O
|
||||||
|
:-P
|
||||||
|
:O
|
||||||
|
:-*
|
||||||
|
:-D
|
||||||
|
:\'(
|
||||||
|
:-\\
|
||||||
|
O:-)
|
||||||
|
:-[
|
||||||
|
(╯°
|
||||||
|
□°)
|
||||||
|
╯︵
|
||||||
|
┻━┻
|
||||||
|
¯\\_
|
||||||
|
(ツ)
|
||||||
|
_/¯
|
||||||
|
┬─┬
|
||||||
|
︵ /(
|
||||||
|
.□.\\
|
270
app/src/main/assets/emoji/FLAGS.txt
Normal file
270
app/src/main/assets/emoji/FLAGS.txt
Normal file
|
@ -0,0 +1,270 @@
|
||||||
|
🏁
|
||||||
|
🚩
|
||||||
|
🎌
|
||||||
|
🏴
|
||||||
|
🏳️
|
||||||
|
🏳️🌈
|
||||||
|
🏳️⚧️
|
||||||
|
🏴☠️
|
||||||
|
🇦🇨
|
||||||
|
🇦🇩
|
||||||
|
🇦🇪
|
||||||
|
🇦🇫
|
||||||
|
🇦🇬
|
||||||
|
🇦🇮
|
||||||
|
🇦🇱
|
||||||
|
🇦🇲
|
||||||
|
🇦🇴
|
||||||
|
🇦🇶
|
||||||
|
🇦🇷
|
||||||
|
🇦🇸
|
||||||
|
🇦🇹
|
||||||
|
🇦🇺
|
||||||
|
🇦🇼
|
||||||
|
🇦🇽
|
||||||
|
🇦🇿
|
||||||
|
🇧🇦
|
||||||
|
🇧🇧
|
||||||
|
🇧🇩
|
||||||
|
🇧🇪
|
||||||
|
🇧🇫
|
||||||
|
🇧🇬
|
||||||
|
🇧🇭
|
||||||
|
🇧🇮
|
||||||
|
🇧🇯
|
||||||
|
🇧🇱
|
||||||
|
🇧🇲
|
||||||
|
🇧🇳
|
||||||
|
🇧🇴
|
||||||
|
🇧🇶
|
||||||
|
🇧🇷
|
||||||
|
🇧🇸
|
||||||
|
🇧🇹
|
||||||
|
🇧🇻
|
||||||
|
🇧🇼
|
||||||
|
🇧🇾
|
||||||
|
🇧🇿
|
||||||
|
🇨🇦
|
||||||
|
🇨🇨
|
||||||
|
🇨🇩
|
||||||
|
🇨🇫
|
||||||
|
🇨🇬
|
||||||
|
🇨🇭
|
||||||
|
🇨🇮
|
||||||
|
🇨🇰
|
||||||
|
🇨🇱
|
||||||
|
🇨🇲
|
||||||
|
🇨🇳
|
||||||
|
🇨🇴
|
||||||
|
🇨🇵
|
||||||
|
🇨🇶
|
||||||
|
🇨🇷
|
||||||
|
🇨🇺
|
||||||
|
🇨🇻
|
||||||
|
🇨🇼
|
||||||
|
🇨🇽
|
||||||
|
🇨🇾
|
||||||
|
🇨🇿
|
||||||
|
🇩🇪
|
||||||
|
🇩🇬
|
||||||
|
🇩🇯
|
||||||
|
🇩🇰
|
||||||
|
🇩🇲
|
||||||
|
🇩🇴
|
||||||
|
🇩🇿
|
||||||
|
🇪🇦
|
||||||
|
🇪🇨
|
||||||
|
🇪🇪
|
||||||
|
🇪🇬
|
||||||
|
🇪🇭
|
||||||
|
🇪🇷
|
||||||
|
🇪🇸
|
||||||
|
🇪🇹
|
||||||
|
🇪🇺
|
||||||
|
🇫🇮
|
||||||
|
🇫🇯
|
||||||
|
🇫🇰
|
||||||
|
🇫🇲
|
||||||
|
🇫🇴
|
||||||
|
🇫🇷
|
||||||
|
🇬🇦
|
||||||
|
🇬🇧
|
||||||
|
🇬🇩
|
||||||
|
🇬🇪
|
||||||
|
🇬🇫
|
||||||
|
🇬🇬
|
||||||
|
🇬🇭
|
||||||
|
🇬🇮
|
||||||
|
🇬🇱
|
||||||
|
🇬🇲
|
||||||
|
🇬🇳
|
||||||
|
🇬🇵
|
||||||
|
🇬🇶
|
||||||
|
🇬🇷
|
||||||
|
🇬🇸
|
||||||
|
🇬🇹
|
||||||
|
🇬🇺
|
||||||
|
🇬🇼
|
||||||
|
🇬🇾
|
||||||
|
🇭🇰
|
||||||
|
🇭🇲
|
||||||
|
🇭🇳
|
||||||
|
🇭🇷
|
||||||
|
🇭🇹
|
||||||
|
🇭🇺
|
||||||
|
🇮🇨
|
||||||
|
🇮🇩
|
||||||
|
🇮🇪
|
||||||
|
🇮🇱
|
||||||
|
🇮🇲
|
||||||
|
🇮🇳
|
||||||
|
🇮🇴
|
||||||
|
🇮🇶
|
||||||
|
🇮🇷
|
||||||
|
🇮🇸
|
||||||
|
🇮🇹
|
||||||
|
🇯🇪
|
||||||
|
🇯🇲
|
||||||
|
🇯🇴
|
||||||
|
🇯🇵
|
||||||
|
🇰🇪
|
||||||
|
🇰🇬
|
||||||
|
🇰🇭
|
||||||
|
🇰🇮
|
||||||
|
🇰🇲
|
||||||
|
🇰🇳
|
||||||
|
🇰🇵
|
||||||
|
🇰🇷
|
||||||
|
🇰🇼
|
||||||
|
🇰🇾
|
||||||
|
🇰🇿
|
||||||
|
🇱🇦
|
||||||
|
🇱🇧
|
||||||
|
🇱🇨
|
||||||
|
🇱🇮
|
||||||
|
🇱🇰
|
||||||
|
🇱🇷
|
||||||
|
🇱🇸
|
||||||
|
🇱🇹
|
||||||
|
🇱🇺
|
||||||
|
🇱🇻
|
||||||
|
🇱🇾
|
||||||
|
🇲🇦
|
||||||
|
🇲🇨
|
||||||
|
🇲🇩
|
||||||
|
🇲🇪
|
||||||
|
🇲🇫
|
||||||
|
🇲🇬
|
||||||
|
🇲🇭
|
||||||
|
🇲🇰
|
||||||
|
🇲🇱
|
||||||
|
🇲🇲
|
||||||
|
🇲🇳
|
||||||
|
🇲🇴
|
||||||
|
🇲🇵
|
||||||
|
🇲🇶
|
||||||
|
🇲🇷
|
||||||
|
🇲🇸
|
||||||
|
🇲🇹
|
||||||
|
🇲🇺
|
||||||
|
🇲🇻
|
||||||
|
🇲🇼
|
||||||
|
🇲🇽
|
||||||
|
🇲🇾
|
||||||
|
🇲🇿
|
||||||
|
🇳🇦
|
||||||
|
🇳🇨
|
||||||
|
🇳🇪
|
||||||
|
🇳🇫
|
||||||
|
🇳🇬
|
||||||
|
🇳🇮
|
||||||
|
🇳🇱
|
||||||
|
🇳🇴
|
||||||
|
🇳🇵
|
||||||
|
🇳🇷
|
||||||
|
🇳🇺
|
||||||
|
🇳🇿
|
||||||
|
🇴🇲
|
||||||
|
🇵🇦
|
||||||
|
🇵🇪
|
||||||
|
🇵🇫
|
||||||
|
🇵🇬
|
||||||
|
🇵🇭
|
||||||
|
🇵🇰
|
||||||
|
🇵🇱
|
||||||
|
🇵🇲
|
||||||
|
🇵🇳
|
||||||
|
🇵🇷
|
||||||
|
🇵🇸
|
||||||
|
🇵🇹
|
||||||
|
🇵🇼
|
||||||
|
🇵🇾
|
||||||
|
🇶🇦
|
||||||
|
🇷🇪
|
||||||
|
🇷🇴
|
||||||
|
🇷🇸
|
||||||
|
🇷🇺
|
||||||
|
🇷🇼
|
||||||
|
🇸🇦
|
||||||
|
🇸🇧
|
||||||
|
🇸🇨
|
||||||
|
🇸🇩
|
||||||
|
🇸🇪
|
||||||
|
🇸🇬
|
||||||
|
🇸🇭
|
||||||
|
🇸🇮
|
||||||
|
🇸🇯
|
||||||
|
🇸🇰
|
||||||
|
🇸🇱
|
||||||
|
🇸🇲
|
||||||
|
🇸🇳
|
||||||
|
🇸🇴
|
||||||
|
🇸🇷
|
||||||
|
🇸🇸
|
||||||
|
🇸🇹
|
||||||
|
🇸🇻
|
||||||
|
🇸🇽
|
||||||
|
🇸🇾
|
||||||
|
🇸🇿
|
||||||
|
🇹🇦
|
||||||
|
🇹🇨
|
||||||
|
🇹🇩
|
||||||
|
🇹🇫
|
||||||
|
🇹🇬
|
||||||
|
🇹🇭
|
||||||
|
🇹🇯
|
||||||
|
🇹🇰
|
||||||
|
🇹🇱
|
||||||
|
🇹🇲
|
||||||
|
🇹🇳
|
||||||
|
🇹🇴
|
||||||
|
🇹🇷
|
||||||
|
🇹🇹
|
||||||
|
🇹🇻
|
||||||
|
🇹🇼
|
||||||
|
🇹🇿
|
||||||
|
🇺🇦
|
||||||
|
🇺🇬
|
||||||
|
🇺🇲
|
||||||
|
🇺🇳
|
||||||
|
🇺🇸
|
||||||
|
🇺🇾
|
||||||
|
🇺🇿
|
||||||
|
🇻🇦
|
||||||
|
🇻🇨
|
||||||
|
🇻🇪
|
||||||
|
🇻🇬
|
||||||
|
🇻🇮
|
||||||
|
🇻🇳
|
||||||
|
🇻🇺
|
||||||
|
🇼🇫
|
||||||
|
🇼🇸
|
||||||
|
🇽🇰
|
||||||
|
🇾🇪
|
||||||
|
🇾🇹
|
||||||
|
🇿🇦
|
||||||
|
🇿🇲
|
||||||
|
🇿🇼
|
||||||
|
🏴
|
||||||
|
🏴
|
||||||
|
🏴
|
131
app/src/main/assets/emoji/FOOD_AND_DRINK.txt
Normal file
131
app/src/main/assets/emoji/FOOD_AND_DRINK.txt
Normal file
|
@ -0,0 +1,131 @@
|
||||||
|
🍇
|
||||||
|
🍈
|
||||||
|
🍉
|
||||||
|
🍊
|
||||||
|
🍋
|
||||||
|
🍋🟩
|
||||||
|
🍌
|
||||||
|
🍍
|
||||||
|
🥭
|
||||||
|
🍎
|
||||||
|
🍏
|
||||||
|
🍐
|
||||||
|
🍑
|
||||||
|
🍒
|
||||||
|
🍓
|
||||||
|
🫐
|
||||||
|
🥝
|
||||||
|
🍅
|
||||||
|
🫒
|
||||||
|
🥥
|
||||||
|
🥑
|
||||||
|
🍆
|
||||||
|
🥔
|
||||||
|
🥕
|
||||||
|
🌽
|
||||||
|
🌶️
|
||||||
|
🫑
|
||||||
|
🥒
|
||||||
|
🥬
|
||||||
|
🥦
|
||||||
|
🧄
|
||||||
|
🧅
|
||||||
|
🥜
|
||||||
|
🫘
|
||||||
|
🌰
|
||||||
|
🫚
|
||||||
|
🫛
|
||||||
|
🍄🟫
|
||||||
|
|
||||||
|
🍞
|
||||||
|
🥐
|
||||||
|
🥖
|
||||||
|
🫓
|
||||||
|
🥨
|
||||||
|
🥯
|
||||||
|
🥞
|
||||||
|
🧇
|
||||||
|
🧀
|
||||||
|
🍖
|
||||||
|
🍗
|
||||||
|
🥩
|
||||||
|
🥓
|
||||||
|
🍔
|
||||||
|
🍟
|
||||||
|
🍕
|
||||||
|
🌭
|
||||||
|
🥪
|
||||||
|
🌮
|
||||||
|
🌯
|
||||||
|
🫔
|
||||||
|
🥙
|
||||||
|
🧆
|
||||||
|
🥚
|
||||||
|
🍳
|
||||||
|
🥘
|
||||||
|
🍲
|
||||||
|
🫕
|
||||||
|
🥣
|
||||||
|
🥗
|
||||||
|
🍿
|
||||||
|
🧈
|
||||||
|
🧂
|
||||||
|
🥫
|
||||||
|
🍱
|
||||||
|
🍘
|
||||||
|
🍙
|
||||||
|
🍚
|
||||||
|
🍛
|
||||||
|
🍜
|
||||||
|
🍝
|
||||||
|
🍠
|
||||||
|
🍢
|
||||||
|
🍣
|
||||||
|
🍤
|
||||||
|
🍥
|
||||||
|
🥮
|
||||||
|
🍡
|
||||||
|
🥟
|
||||||
|
🥠
|
||||||
|
🥡
|
||||||
|
🍦
|
||||||
|
🍧
|
||||||
|
🍨
|
||||||
|
🍩
|
||||||
|
🍪
|
||||||
|
🎂
|
||||||
|
🍰
|
||||||
|
🧁
|
||||||
|
🥧
|
||||||
|
🍫
|
||||||
|
🍬
|
||||||
|
🍭
|
||||||
|
🍮
|
||||||
|
🍯
|
||||||
|
🍼
|
||||||
|
🥛
|
||||||
|
☕
|
||||||
|
🫖
|
||||||
|
🍵
|
||||||
|
🍶
|
||||||
|
🍾
|
||||||
|
🍷
|
||||||
|
🍸
|
||||||
|
🍹
|
||||||
|
🍺
|
||||||
|
🍻
|
||||||
|
🥂
|
||||||
|
🥃
|
||||||
|
🫗
|
||||||
|
🥤
|
||||||
|
🧋
|
||||||
|
🧃
|
||||||
|
🧉
|
||||||
|
🧊
|
||||||
|
🥢
|
||||||
|
🍽️
|
||||||
|
🍴
|
||||||
|
🥄
|
||||||
|
🔪
|
||||||
|
🫙
|
||||||
|
🏺
|
264
app/src/main/assets/emoji/OBJECTS.txt
Normal file
264
app/src/main/assets/emoji/OBJECTS.txt
Normal file
|
@ -0,0 +1,264 @@
|
||||||
|
👓
|
||||||
|
🕶️
|
||||||
|
🥽
|
||||||
|
🥼
|
||||||
|
🦺
|
||||||
|
👔
|
||||||
|
👕
|
||||||
|
👖
|
||||||
|
🧣
|
||||||
|
🧤
|
||||||
|
🧥
|
||||||
|
🧦
|
||||||
|
👗
|
||||||
|
👘
|
||||||
|
🥻
|
||||||
|
🩱
|
||||||
|
🩲
|
||||||
|
🩳
|
||||||
|
👙
|
||||||
|
👚
|
||||||
|
🪭
|
||||||
|
👛
|
||||||
|
👜
|
||||||
|
👝
|
||||||
|
🛍️
|
||||||
|
🎒
|
||||||
|
🩴
|
||||||
|
👞
|
||||||
|
👟
|
||||||
|
🥾
|
||||||
|
🥿
|
||||||
|
👠
|
||||||
|
👡
|
||||||
|
🩰
|
||||||
|
👢
|
||||||
|
🪮
|
||||||
|
👑
|
||||||
|
👒
|
||||||
|
🎩
|
||||||
|
🎓
|
||||||
|
🧢
|
||||||
|
🪖
|
||||||
|
⛑️
|
||||||
|
📿
|
||||||
|
💄
|
||||||
|
💍
|
||||||
|
💎
|
||||||
|
🔇
|
||||||
|
🔈
|
||||||
|
🔉
|
||||||
|
🔊
|
||||||
|
📢
|
||||||
|
📣
|
||||||
|
📯
|
||||||
|
🔔
|
||||||
|
🔕
|
||||||
|
🎼
|
||||||
|
🎵
|
||||||
|
🎶
|
||||||
|
🎙️
|
||||||
|
🎚️
|
||||||
|
🎛️
|
||||||
|
🎤
|
||||||
|
🎧
|
||||||
|
📻
|
||||||
|
🎷
|
||||||
|
🪗
|
||||||
|
🎸
|
||||||
|
🎹
|
||||||
|
🎺
|
||||||
|
🎻
|
||||||
|
🪕
|
||||||
|
🥁
|
||||||
|
🪘
|
||||||
|
🪇
|
||||||
|
🪈
|
||||||
|
|
||||||
|
📱
|
||||||
|
📲
|
||||||
|
☎️
|
||||||
|
📞
|
||||||
|
📟
|
||||||
|
📠
|
||||||
|
🔋
|
||||||
|
🪫
|
||||||
|
🔌
|
||||||
|
💻
|
||||||
|
🖥️
|
||||||
|
🖨️
|
||||||
|
⌨️
|
||||||
|
🖱️
|
||||||
|
🖲️
|
||||||
|
💽
|
||||||
|
💾
|
||||||
|
💿
|
||||||
|
📀
|
||||||
|
🧮
|
||||||
|
🎥
|
||||||
|
🎞️
|
||||||
|
📽️
|
||||||
|
🎬
|
||||||
|
📺
|
||||||
|
📷
|
||||||
|
📸
|
||||||
|
📹
|
||||||
|
📼
|
||||||
|
🔍
|
||||||
|
🔎
|
||||||
|
🕯️
|
||||||
|
💡
|
||||||
|
🔦
|
||||||
|
🏮
|
||||||
|
🪔
|
||||||
|
📔
|
||||||
|
📕
|
||||||
|
📖
|
||||||
|
📗
|
||||||
|
📘
|
||||||
|
📙
|
||||||
|
📚
|
||||||
|
📓
|
||||||
|
📒
|
||||||
|
📃
|
||||||
|
📜
|
||||||
|
📄
|
||||||
|
📰
|
||||||
|
🗞️
|
||||||
|
📑
|
||||||
|
🔖
|
||||||
|
🏷️
|
||||||
|
💰
|
||||||
|
🪙
|
||||||
|
💴
|
||||||
|
💵
|
||||||
|
💶
|
||||||
|
💷
|
||||||
|
💸
|
||||||
|
💳
|
||||||
|
🧾
|
||||||
|
💹
|
||||||
|
✉️
|
||||||
|
📧
|
||||||
|
📨
|
||||||
|
📩
|
||||||
|
📤
|
||||||
|
📥
|
||||||
|
📦
|
||||||
|
📫
|
||||||
|
📪
|
||||||
|
📬
|
||||||
|
📭
|
||||||
|
📮
|
||||||
|
🗳️
|
||||||
|
✏️
|
||||||
|
✒️
|
||||||
|
🖋️
|
||||||
|
🖊️
|
||||||
|
🖌️
|
||||||
|
🖍️
|
||||||
|
📝
|
||||||
|
💼
|
||||||
|
📁
|
||||||
|
📂
|
||||||
|
🗂️
|
||||||
|
📅
|
||||||
|
📆
|
||||||
|
🗒️
|
||||||
|
🗓️
|
||||||
|
📇
|
||||||
|
📈
|
||||||
|
📉
|
||||||
|
📊
|
||||||
|
📋
|
||||||
|
📌
|
||||||
|
📍
|
||||||
|
📎
|
||||||
|
🖇️
|
||||||
|
📏
|
||||||
|
📐
|
||||||
|
✂️
|
||||||
|
🗃️
|
||||||
|
🗄️
|
||||||
|
🗑️
|
||||||
|
🔒
|
||||||
|
🔓
|
||||||
|
🔏
|
||||||
|
🔐
|
||||||
|
🔑
|
||||||
|
🗝️
|
||||||
|
🔨
|
||||||
|
🪓
|
||||||
|
⛏️
|
||||||
|
⚒️
|
||||||
|
🛠️
|
||||||
|
🗡️
|
||||||
|
⚔️
|
||||||
|
💣
|
||||||
|
🪃
|
||||||
|
🏹
|
||||||
|
🛡️
|
||||||
|
🪚
|
||||||
|
🔧
|
||||||
|
🪛
|
||||||
|
🔩
|
||||||
|
⚙️
|
||||||
|
🗜️
|
||||||
|
⚖️
|
||||||
|
🦯
|
||||||
|
🔗
|
||||||
|
⛓️💥
|
||||||
|
⛓️
|
||||||
|
🪝
|
||||||
|
🧰
|
||||||
|
🧲
|
||||||
|
🪜
|
||||||
|
|
||||||
|
⚗️
|
||||||
|
🧪
|
||||||
|
🧫
|
||||||
|
🧬
|
||||||
|
🔬
|
||||||
|
🔭
|
||||||
|
📡
|
||||||
|
💉
|
||||||
|
🩸
|
||||||
|
💊
|
||||||
|
🩹
|
||||||
|
🩼
|
||||||
|
🩺
|
||||||
|
🩻
|
||||||
|
🚪
|
||||||
|
🛗
|
||||||
|
🪞
|
||||||
|
🪟
|
||||||
|
🛏️
|
||||||
|
🛋️
|
||||||
|
🪑
|
||||||
|
🚽
|
||||||
|
🪠
|
||||||
|
🚿
|
||||||
|
🛁
|
||||||
|
🪤
|
||||||
|
🪒
|
||||||
|
🧴
|
||||||
|
🧷
|
||||||
|
🧹
|
||||||
|
🧺
|
||||||
|
🧻
|
||||||
|
🪣
|
||||||
|
🧼
|
||||||
|
🫧
|
||||||
|
🪥
|
||||||
|
🧽
|
||||||
|
🧯
|
||||||
|
🛒
|
||||||
|
🚬
|
||||||
|
⚰️
|
||||||
|
🪦
|
||||||
|
⚱️
|
||||||
|
🧿
|
||||||
|
🪬
|
||||||
|
🗿
|
||||||
|
🪧
|
||||||
|
🪪
|
386
app/src/main/assets/emoji/PEOPLE_AND_BODY.txt
Normal file
386
app/src/main/assets/emoji/PEOPLE_AND_BODY.txt
Normal file
|
@ -0,0 +1,386 @@
|
||||||
|
👋 👋🏻 👋🏼 👋🏽 👋🏾 👋🏿
|
||||||
|
🤚 🤚🏻 🤚🏼 🤚🏽 🤚🏾 🤚🏿
|
||||||
|
🖐️ 🖐🏻 🖐🏼 🖐🏽 🖐🏾 🖐🏿
|
||||||
|
✋ ✋🏻 ✋🏼 ✋🏽 ✋🏾 ✋🏿
|
||||||
|
🖖 🖖🏻 🖖🏼 🖖🏽 🖖🏾 🖖🏿
|
||||||
|
🫱 🫱🏻 🫱🏼 🫱🏽 🫱🏾 🫱🏿
|
||||||
|
🫲 🫲🏻 🫲🏼 🫲🏽 🫲🏾 🫲🏿
|
||||||
|
🫳 🫳🏻 🫳🏼 🫳🏽 🫳🏾 🫳🏿
|
||||||
|
🫴 🫴🏻 🫴🏼 🫴🏽 🫴🏾 🫴🏿
|
||||||
|
🫷 🫷🏻 🫷🏼 🫷🏽 🫷🏾 🫷🏿
|
||||||
|
🫸 🫸🏻 🫸🏼 🫸🏽 🫸🏾 🫸🏿
|
||||||
|
👌 👌🏻 👌🏼 👌🏽 👌🏾 👌🏿
|
||||||
|
🤌 🤌🏻 🤌🏼 🤌🏽 🤌🏾 🤌🏿
|
||||||
|
🤏 🤏🏻 🤏🏼 🤏🏽 🤏🏾 🤏🏿
|
||||||
|
✌️ ✌🏻 ✌🏼 ✌🏽 ✌🏾 ✌🏿
|
||||||
|
🤞 🤞🏻 🤞🏼 🤞🏽 🤞🏾 🤞🏿
|
||||||
|
🫰 🫰🏻 🫰🏼 🫰🏽 🫰🏾 🫰🏿
|
||||||
|
🤟 🤟🏻 🤟🏼 🤟🏽 🤟🏾 🤟🏿
|
||||||
|
🤘 🤘🏻 🤘🏼 🤘🏽 🤘🏾 🤘🏿
|
||||||
|
🤙 🤙🏻 🤙🏼 🤙🏽 🤙🏾 🤙🏿
|
||||||
|
👈 👈🏻 👈🏼 👈🏽 👈🏾 👈🏿
|
||||||
|
👉 👉🏻 👉🏼 👉🏽 👉🏾 👉🏿
|
||||||
|
👆 👆🏻 👆🏼 👆🏽 👆🏾 👆🏿
|
||||||
|
🖕 🖕🏻 🖕🏼 🖕🏽 🖕🏾 🖕🏿
|
||||||
|
👇 👇🏻 👇🏼 👇🏽 👇🏾 👇🏿
|
||||||
|
☝️ ☝🏻 ☝🏼 ☝🏽 ☝🏾 ☝🏿
|
||||||
|
🫵 🫵🏻 🫵🏼 🫵🏽 🫵🏾 🫵🏿
|
||||||
|
👍 👍🏻 👍🏼 👍🏽 👍🏾 👍🏿
|
||||||
|
👎 👎🏻 👎🏼 👎🏽 👎🏾 👎🏿
|
||||||
|
✊ ✊🏻 ✊🏼 ✊🏽 ✊🏾 ✊🏿
|
||||||
|
👊 👊🏻 👊🏼 👊🏽 👊🏾 👊🏿
|
||||||
|
🤛 🤛🏻 🤛🏼 🤛🏽 🤛🏾 🤛🏿
|
||||||
|
🤜 🤜🏻 🤜🏼 🤜🏽 🤜🏾 🤜🏿
|
||||||
|
👏 👏🏻 👏🏼 👏🏽 👏🏾 👏🏿
|
||||||
|
🙌 🙌🏻 🙌🏼 🙌🏽 🙌🏾 🙌🏿
|
||||||
|
🫶 🫶🏻 🫶🏼 🫶🏽 🫶🏾 🫶🏿
|
||||||
|
👐 👐🏻 👐🏼 👐🏽 👐🏾 👐🏿
|
||||||
|
🤲 🤲🏻 🤲🏼 🤲🏽 🤲🏾 🤲🏿
|
||||||
|
🤝 🤝🏻 🤝🏼 🤝🏽 🤝🏾 🤝🏿
|
||||||
|
🙏 🙏🏻 🙏🏼 🙏🏽 🙏🏾 🙏🏿
|
||||||
|
✍️ ✍🏻 ✍🏼 ✍🏽 ✍🏾 ✍🏿
|
||||||
|
💅 💅🏻 💅🏼 💅🏽 💅🏾 💅🏿
|
||||||
|
🤳 🤳🏻 🤳🏼 🤳🏽 🤳🏾 🤳🏿
|
||||||
|
💪 💪🏻 💪🏼 💪🏽 💪🏾 💪🏿
|
||||||
|
🦾
|
||||||
|
🦿
|
||||||
|
🦵 🦵🏻 🦵🏼 🦵🏽 🦵🏾 🦵🏿
|
||||||
|
🦶 🦶🏻 🦶🏼 🦶🏽 🦶🏾 🦶🏿
|
||||||
|
👂 👂🏻 👂🏼 👂🏽 👂🏾 👂🏿
|
||||||
|
🦻 🦻🏻 🦻🏼 🦻🏽 🦻🏾 🦻🏿
|
||||||
|
👃 👃🏻 👃🏼 👃🏽 👃🏾 👃🏿
|
||||||
|
🧠
|
||||||
|
🫀
|
||||||
|
🫁
|
||||||
|
🦷
|
||||||
|
🦴
|
||||||
|
👀
|
||||||
|
👁️
|
||||||
|
👅
|
||||||
|
👄
|
||||||
|
🫦
|
||||||
|
👶 👶🏻 👶🏼 👶🏽 👶🏾 👶🏿
|
||||||
|
🧒 🧒🏻 🧒🏼 🧒🏽 🧒🏾 🧒🏿
|
||||||
|
👦 👦🏻 👦🏼 👦🏽 👦🏾 👦🏿
|
||||||
|
👧 👧🏻 👧🏼 👧🏽 👧🏾 👧🏿
|
||||||
|
🧑 🧑🏻 🧑🏼 🧑🏽 🧑🏾 🧑🏿
|
||||||
|
👱 👱🏻 👱🏼 👱🏽 👱🏾 👱🏿
|
||||||
|
👨 👨🏻 👨🏼 👨🏽 👨🏾 👨🏿
|
||||||
|
🧔 🧔🏻 🧔🏼 🧔🏽 🧔🏾 🧔🏿
|
||||||
|
🧔♂️ 🧔🏻♂️ 🧔🏼♂️ 🧔🏽♂️ 🧔🏾♂️ 🧔🏿♂️
|
||||||
|
🧔♀️ 🧔🏻♀️ 🧔🏼♀️ 🧔🏽♀️ 🧔🏾♀️ 🧔🏿♀️
|
||||||
|
👨🦰 👨🏻🦰 👨🏼🦰 👨🏽🦰 👨🏾🦰 👨🏿🦰
|
||||||
|
👨🦱 👨🏻🦱 👨🏼🦱 👨🏽🦱 👨🏾🦱 👨🏿🦱
|
||||||
|
👨🦳 👨🏻🦳 👨🏼🦳 👨🏽🦳 👨🏾🦳 👨🏿🦳
|
||||||
|
👨🦲 👨🏻🦲 👨🏼🦲 👨🏽🦲 👨🏾🦲 👨🏿🦲
|
||||||
|
👩 👩🏻 👩🏼 👩🏽 👩🏾 👩🏿
|
||||||
|
👩🦰 👩🏻🦰 👩🏼🦰 👩🏽🦰 👩🏾🦰 👩🏿🦰
|
||||||
|
🧑🦰 🧑🏻🦰 🧑🏼🦰 🧑🏽🦰 🧑🏾🦰 🧑🏿🦰
|
||||||
|
👩🦱 👩🏻🦱 👩🏼🦱 👩🏽🦱 👩🏾🦱 👩🏿🦱
|
||||||
|
🧑🦱 🧑🏻🦱 🧑🏼🦱 🧑🏽🦱 🧑🏾🦱 🧑🏿🦱
|
||||||
|
👩🦳 👩🏻🦳 👩🏼🦳 👩🏽🦳 👩🏾🦳 👩🏿🦳
|
||||||
|
🧑🦳 🧑🏻🦳 🧑🏼🦳 🧑🏽🦳 🧑🏾🦳 🧑🏿🦳
|
||||||
|
👩🦲 👩🏻🦲 👩🏼🦲 👩🏽🦲 👩🏾🦲 👩🏿🦲
|
||||||
|
🧑🦲 🧑🏻🦲 🧑🏼🦲 🧑🏽🦲 🧑🏾🦲 🧑🏿🦲
|
||||||
|
👱♀️ 👱🏻♀️ 👱🏼♀️ 👱🏽♀️ 👱🏾♀️ 👱🏿♀️
|
||||||
|
👱♂️ 👱🏻♂️ 👱🏼♂️ 👱🏽♂️ 👱🏾♂️ 👱🏿♂️
|
||||||
|
🧓 🧓🏻 🧓🏼 🧓🏽 🧓🏾 🧓🏿
|
||||||
|
👴 👴🏻 👴🏼 👴🏽 👴🏾 👴🏿
|
||||||
|
👵 👵🏻 👵🏼 👵🏽 👵🏾 👵🏿
|
||||||
|
🙍 🙍🏻 🙍🏼 🙍🏽 🙍🏾 🙍🏿
|
||||||
|
🙍♂️ 🙍🏻♂️ 🙍🏼♂️ 🙍🏽♂️ 🙍🏾♂️ 🙍🏿♂️
|
||||||
|
🙍♀️ 🙍🏻♀️ 🙍🏼♀️ 🙍🏽♀️ 🙍🏾♀️ 🙍🏿♀️
|
||||||
|
🙎 🙎🏻 🙎🏼 🙎🏽 🙎🏾 🙎🏿
|
||||||
|
🙎♂️ 🙎🏻♂️ 🙎🏼♂️ 🙎🏽♂️ 🙎🏾♂️ 🙎🏿♂️
|
||||||
|
🙎♀️ 🙎🏻♀️ 🙎🏼♀️ 🙎🏽♀️ 🙎🏾♀️ 🙎🏿♀️
|
||||||
|
🙅 🙅🏻 🙅🏼 🙅🏽 🙅🏾 🙅🏿
|
||||||
|
🙅♂️ 🙅🏻♂️ 🙅🏼♂️ 🙅🏽♂️ 🙅🏾♂️ 🙅🏿♂️
|
||||||
|
🙅♀️ 🙅🏻♀️ 🙅🏼♀️ 🙅🏽♀️ 🙅🏾♀️ 🙅🏿♀️
|
||||||
|
🙆 🙆🏻 🙆🏼 🙆🏽 🙆🏾 🙆🏿
|
||||||
|
🙆♂️ 🙆🏻♂️ 🙆🏼♂️ 🙆🏽♂️ 🙆🏾♂️ 🙆🏿♂️
|
||||||
|
🙆♀️ 🙆🏻♀️ 🙆🏼♀️ 🙆🏽♀️ 🙆🏾♀️ 🙆🏿♀️
|
||||||
|
💁 💁🏻 💁🏼 💁🏽 💁🏾 💁🏿
|
||||||
|
💁♂️ 💁🏻♂️ 💁🏼♂️ 💁🏽♂️ 💁🏾♂️ 💁🏿♂️
|
||||||
|
💁♀️ 💁🏻♀️ 💁🏼♀️ 💁🏽♀️ 💁🏾♀️ 💁🏿♀️
|
||||||
|
🙋 🙋🏻 🙋🏼 🙋🏽 🙋🏾 🙋🏿
|
||||||
|
🙋♂️ 🙋🏻♂️ 🙋🏼♂️ 🙋🏽♂️ 🙋🏾♂️ 🙋🏿♂️
|
||||||
|
🙋♀️ 🙋🏻♀️ 🙋🏼♀️ 🙋🏽♀️ 🙋🏾♀️ 🙋🏿♀️
|
||||||
|
🧏 🧏🏻 🧏🏼 🧏🏽 🧏🏾 🧏🏿
|
||||||
|
🧏♂️ 🧏🏻♂️ 🧏🏼♂️ 🧏🏽♂️ 🧏🏾♂️ 🧏🏿♂️
|
||||||
|
🧏♀️ 🧏🏻♀️ 🧏🏼♀️ 🧏🏽♀️ 🧏🏾♀️ 🧏🏿♀️
|
||||||
|
🙇 🙇🏻 🙇🏼 🙇🏽 🙇🏾 🙇🏿
|
||||||
|
🙇♂️ 🙇🏻♂️ 🙇🏼♂️ 🙇🏽♂️ 🙇🏾♂️ 🙇🏿♂️
|
||||||
|
🙇♀️ 🙇🏻♀️ 🙇🏼♀️ 🙇🏽♀️ 🙇🏾♀️ 🙇🏿♀️
|
||||||
|
🤦 🤦🏻 🤦🏼 🤦🏽 🤦🏾 🤦🏿
|
||||||
|
🤦♂️ 🤦🏻♂️ 🤦🏼♂️ 🤦🏽♂️ 🤦🏾♂️ 🤦🏿♂️
|
||||||
|
🤦♀️ 🤦🏻♀️ 🤦🏼♀️ 🤦🏽♀️ 🤦🏾♀️ 🤦🏿♀️
|
||||||
|
🤷 🤷🏻 🤷🏼 🤷🏽 🤷🏾 🤷🏿
|
||||||
|
🤷♂️ 🤷🏻♂️ 🤷🏼♂️ 🤷🏽♂️ 🤷🏾♂️ 🤷🏿♂️
|
||||||
|
🤷♀️ 🤷🏻♀️ 🤷🏼♀️ 🤷🏽♀️ 🤷🏾♀️ 🤷🏿♀️
|
||||||
|
🧑⚕️ 🧑🏻⚕️ 🧑🏼⚕️ 🧑🏽⚕️ 🧑🏾⚕️ 🧑🏿⚕️
|
||||||
|
👨⚕️ 👨🏻⚕️ 👨🏼⚕️ 👨🏽⚕️ 👨🏾⚕️ 👨🏿⚕️
|
||||||
|
👩⚕️ 👩🏻⚕️ 👩🏼⚕️ 👩🏽⚕️ 👩🏾⚕️ 👩🏿⚕️
|
||||||
|
🧑🎓 🧑🏻🎓 🧑🏼🎓 🧑🏽🎓 🧑🏾🎓 🧑🏿🎓
|
||||||
|
👨🎓 👨🏻🎓 👨🏼🎓 👨🏽🎓 👨🏾🎓 👨🏿🎓
|
||||||
|
👩🎓 👩🏻🎓 👩🏼🎓 👩🏽🎓 👩🏾🎓 👩🏿🎓
|
||||||
|
🧑🏫 🧑🏻🏫 🧑🏼🏫 🧑🏽🏫 🧑🏾🏫 🧑🏿🏫
|
||||||
|
👨🏫 👨🏻🏫 👨🏼🏫 👨🏽🏫 👨🏾🏫 👨🏿🏫
|
||||||
|
👩🏫 👩🏻🏫 👩🏼🏫 👩🏽🏫 👩🏾🏫 👩🏿🏫
|
||||||
|
🧑⚖️ 🧑🏻⚖️ 🧑🏼⚖️ 🧑🏽⚖️ 🧑🏾⚖️ 🧑🏿⚖️
|
||||||
|
👨⚖️ 👨🏻⚖️ 👨🏼⚖️ 👨🏽⚖️ 👨🏾⚖️ 👨🏿⚖️
|
||||||
|
👩⚖️ 👩🏻⚖️ 👩🏼⚖️ 👩🏽⚖️ 👩🏾⚖️ 👩🏿⚖️
|
||||||
|
🧑🌾 🧑🏻🌾 🧑🏼🌾 🧑🏽🌾 🧑🏾🌾 🧑🏿🌾
|
||||||
|
👨🌾 👨🏻🌾 👨🏼🌾 👨🏽🌾 👨🏾🌾 👨🏿🌾
|
||||||
|
👩🌾 👩🏻🌾 👩🏼🌾 👩🏽🌾 👩🏾🌾 👩🏿🌾
|
||||||
|
🧑🍳 🧑🏻🍳 🧑🏼🍳 🧑🏽🍳 🧑🏾🍳 🧑🏿🍳
|
||||||
|
👨🍳 👨🏻🍳 👨🏼🍳 👨🏽🍳 👨🏾🍳 👨🏿🍳
|
||||||
|
👩🍳 👩🏻🍳 👩🏼🍳 👩🏽🍳 👩🏾🍳 👩🏿🍳
|
||||||
|
🧑🔧 🧑🏻🔧 🧑🏼🔧 🧑🏽🔧 🧑🏾🔧 🧑🏿🔧
|
||||||
|
👨🔧 👨🏻🔧 👨🏼🔧 👨🏽🔧 👨🏾🔧 👨🏿🔧
|
||||||
|
👩🔧 👩🏻🔧 👩🏼🔧 👩🏽🔧 👩🏾🔧 👩🏿🔧
|
||||||
|
🧑🏭 🧑🏻🏭 🧑🏼🏭 🧑🏽🏭 🧑🏾🏭 🧑🏿🏭
|
||||||
|
👨🏭 👨🏻🏭 👨🏼🏭 👨🏽🏭 👨🏾🏭 👨🏿🏭
|
||||||
|
👩🏭 👩🏻🏭 👩🏼🏭 👩🏽🏭 👩🏾🏭 👩🏿🏭
|
||||||
|
🧑💼 🧑🏻💼 🧑🏼💼 🧑🏽💼 🧑🏾💼 🧑🏿💼
|
||||||
|
👨💼 👨🏻💼 👨🏼💼 👨🏽💼 👨🏾💼 👨🏿💼
|
||||||
|
👩💼 👩🏻💼 👩🏼💼 👩🏽💼 👩🏾💼 👩🏿💼
|
||||||
|
🧑🔬 🧑🏻🔬 🧑🏼🔬 🧑🏽🔬 🧑🏾🔬 🧑🏿🔬
|
||||||
|
👨🔬 👨🏻🔬 👨🏼🔬 👨🏽🔬 👨🏾🔬 👨🏿🔬
|
||||||
|
👩🔬 👩🏻🔬 👩🏼🔬 👩🏽🔬 👩🏾🔬 👩🏿🔬
|
||||||
|
🧑💻 🧑🏻💻 🧑🏼💻 🧑🏽💻 🧑🏾💻 🧑🏿💻
|
||||||
|
👨💻 👨🏻💻 👨🏼💻 👨🏽💻 👨🏾💻 👨🏿💻
|
||||||
|
👩💻 👩🏻💻 👩🏼💻 👩🏽💻 👩🏾💻 👩🏿💻
|
||||||
|
🧑🎤 🧑🏻🎤 🧑🏼🎤 🧑🏽🎤 🧑🏾🎤 🧑🏿🎤
|
||||||
|
👨🎤 👨🏻🎤 👨🏼🎤 👨🏽🎤 👨🏾🎤 👨🏿🎤
|
||||||
|
👩🎤 👩🏻🎤 👩🏼🎤 👩🏽🎤 👩🏾🎤 👩🏿🎤
|
||||||
|
🧑🎨 🧑🏻🎨 🧑🏼🎨 🧑🏽🎨 🧑🏾🎨 🧑🏿🎨
|
||||||
|
👨🎨 👨🏻🎨 👨🏼🎨 👨🏽🎨 👨🏾🎨 👨🏿🎨
|
||||||
|
👩🎨 👩🏻🎨 👩🏼🎨 👩🏽🎨 👩🏾🎨 👩🏿🎨
|
||||||
|
🧑✈️ 🧑🏻✈️ 🧑🏼✈️ 🧑🏽✈️ 🧑🏾✈️ 🧑🏿✈️
|
||||||
|
👨✈️ 👨🏻✈️ 👨🏼✈️ 👨🏽✈️ 👨🏾✈️ 👨🏿✈️
|
||||||
|
👩✈️ 👩🏻✈️ 👩🏼✈️ 👩🏽✈️ 👩🏾✈️ 👩🏿✈️
|
||||||
|
🧑🚀 🧑🏻🚀 🧑🏼🚀 🧑🏽🚀 🧑🏾🚀 🧑🏿🚀
|
||||||
|
👨🚀 👨🏻🚀 👨🏼🚀 👨🏽🚀 👨🏾🚀 👨🏿🚀
|
||||||
|
👩🚀 👩🏻🚀 👩🏼🚀 👩🏽🚀 👩🏾🚀 👩🏿🚀
|
||||||
|
🧑🚒 🧑🏻🚒 🧑🏼🚒 🧑🏽🚒 🧑🏾🚒 🧑🏿🚒
|
||||||
|
👨🚒 👨🏻🚒 👨🏼🚒 👨🏽🚒 👨🏾🚒 👨🏿🚒
|
||||||
|
👩🚒 👩🏻🚒 👩🏼🚒 👩🏽🚒 👩🏾🚒 👩🏿🚒
|
||||||
|
👮 👮🏻 👮🏼 👮🏽 👮🏾 👮🏿
|
||||||
|
👮♂️ 👮🏻♂️ 👮🏼♂️ 👮🏽♂️ 👮🏾♂️ 👮🏿♂️
|
||||||
|
👮♀️ 👮🏻♀️ 👮🏼♀️ 👮🏽♀️ 👮🏾♀️ 👮🏿♀️
|
||||||
|
🕵️ 🕵🏻 🕵🏼 🕵🏽 🕵🏾 🕵🏿
|
||||||
|
🕵️♂️ 🕵🏻♂️ 🕵🏼♂️ 🕵🏽♂️ 🕵🏾♂️ 🕵🏿♂️
|
||||||
|
🕵️♀️ 🕵🏻♀️ 🕵🏼♀️ 🕵🏽♀️ 🕵🏾♀️ 🕵🏿♀️
|
||||||
|
💂 💂🏻 💂🏼 💂🏽 💂🏾 💂🏿
|
||||||
|
💂♂️ 💂🏻♂️ 💂🏼♂️ 💂🏽♂️ 💂🏾♂️ 💂🏿♂️
|
||||||
|
💂♀️ 💂🏻♀️ 💂🏼♀️ 💂🏽♀️ 💂🏾♀️ 💂🏿♀️
|
||||||
|
🥷 🥷🏻 🥷🏼 🥷🏽 🥷🏾 🥷🏿
|
||||||
|
👷 👷🏻 👷🏼 👷🏽 👷🏾 👷🏿
|
||||||
|
👷♂️ 👷🏻♂️ 👷🏼♂️ 👷🏽♂️ 👷🏾♂️ 👷🏿♂️
|
||||||
|
👷♀️ 👷🏻♀️ 👷🏼♀️ 👷🏽♀️ 👷🏾♀️ 👷🏿♀️
|
||||||
|
🫅 🫅🏻 🫅🏼 🫅🏽 🫅🏾 🫅🏿
|
||||||
|
🤴 🤴🏻 🤴🏼 🤴🏽 🤴🏾 🤴🏿
|
||||||
|
👸 👸🏻 👸🏼 👸🏽 👸🏾 👸🏿
|
||||||
|
👳 👳🏻 👳🏼 👳🏽 👳🏾 👳🏿
|
||||||
|
👳♂️ 👳🏻♂️ 👳🏼♂️ 👳🏽♂️ 👳🏾♂️ 👳🏿♂️
|
||||||
|
👳♀️ 👳🏻♀️ 👳🏼♀️ 👳🏽♀️ 👳🏾♀️ 👳🏿♀️
|
||||||
|
👲 👲🏻 👲🏼 👲🏽 👲🏾 👲🏿
|
||||||
|
🧕 🧕🏻 🧕🏼 🧕🏽 🧕🏾 🧕🏿
|
||||||
|
🤵 🤵🏻 🤵🏼 🤵🏽 🤵🏾 🤵🏿
|
||||||
|
🤵♂️ 🤵🏻♂️ 🤵🏼♂️ 🤵🏽♂️ 🤵🏾♂️ 🤵🏿♂️
|
||||||
|
🤵♀️ 🤵🏻♀️ 🤵🏼♀️ 🤵🏽♀️ 🤵🏾♀️ 🤵🏿♀️
|
||||||
|
👰 👰🏻 👰🏼 👰🏽 👰🏾 👰🏿
|
||||||
|
👰♂️ 👰🏻♂️ 👰🏼♂️ 👰🏽♂️ 👰🏾♂️ 👰🏿♂️
|
||||||
|
👰♀️ 👰🏻♀️ 👰🏼♀️ 👰🏽♀️ 👰🏾♀️ 👰🏿♀️
|
||||||
|
🤰 🤰🏻 🤰🏼 🤰🏽 🤰🏾 🤰🏿
|
||||||
|
🫃 🫃🏻 🫃🏼 🫃🏽 🫃🏾 🫃🏿
|
||||||
|
🫄 🫄🏻 🫄🏼 🫄🏽 🫄🏾 🫄🏿
|
||||||
|
🤱 🤱🏻 🤱🏼 🤱🏽 🤱🏾 🤱🏿
|
||||||
|
👩🍼 👩🏻🍼 👩🏼🍼 👩🏽🍼 👩🏾🍼 👩🏿🍼
|
||||||
|
👨🍼 👨🏻🍼 👨🏼🍼 👨🏽🍼 👨🏾🍼 👨🏿🍼
|
||||||
|
🧑🍼 🧑🏻🍼 🧑🏼🍼 🧑🏽🍼 🧑🏾🍼 🧑🏿🍼
|
||||||
|
👼 👼🏻 👼🏼 👼🏽 👼🏾 👼🏿
|
||||||
|
🎅 🎅🏻 🎅🏼 🎅🏽 🎅🏾 🎅🏿
|
||||||
|
🤶 🤶🏻 🤶🏼 🤶🏽 🤶🏾 🤶🏿
|
||||||
|
🧑🎄 🧑🏻🎄 🧑🏼🎄 🧑🏽🎄 🧑🏾🎄 🧑🏿🎄
|
||||||
|
🦸 🦸🏻 🦸🏼 🦸🏽 🦸🏾 🦸🏿
|
||||||
|
🦸♂️ 🦸🏻♂️ 🦸🏼♂️ 🦸🏽♂️ 🦸🏾♂️ 🦸🏿♂️
|
||||||
|
🦸♀️ 🦸🏻♀️ 🦸🏼♀️ 🦸🏽♀️ 🦸🏾♀️ 🦸🏿♀️
|
||||||
|
🦹 🦹🏻 🦹🏼 🦹🏽 🦹🏾 🦹🏿
|
||||||
|
🦹♂️ 🦹🏻♂️ 🦹🏼♂️ 🦹🏽♂️ 🦹🏾♂️ 🦹🏿♂️
|
||||||
|
🦹♀️ 🦹🏻♀️ 🦹🏼♀️ 🦹🏽♀️ 🦹🏾♀️ 🦹🏿♀️
|
||||||
|
🧙 🧙🏻 🧙🏼 🧙🏽 🧙🏾 🧙🏿
|
||||||
|
🧙♂️ 🧙🏻♂️ 🧙🏼♂️ 🧙🏽♂️ 🧙🏾♂️ 🧙🏿♂️
|
||||||
|
🧙♀️ 🧙🏻♀️ 🧙🏼♀️ 🧙🏽♀️ 🧙🏾♀️ 🧙🏿♀️
|
||||||
|
🧚 🧚🏻 🧚🏼 🧚🏽 🧚🏾 🧚🏿
|
||||||
|
🧚♂️ 🧚🏻♂️ 🧚🏼♂️ 🧚🏽♂️ 🧚🏾♂️ 🧚🏿♂️
|
||||||
|
🧚♀️ 🧚🏻♀️ 🧚🏼♀️ 🧚🏽♀️ 🧚🏾♀️ 🧚🏿♀️
|
||||||
|
🧛 🧛🏻 🧛🏼 🧛🏽 🧛🏾 🧛🏿
|
||||||
|
🧛♂️ 🧛🏻♂️ 🧛🏼♂️ 🧛🏽♂️ 🧛🏾♂️ 🧛🏿♂️
|
||||||
|
🧛♀️ 🧛🏻♀️ 🧛🏼♀️ 🧛🏽♀️ 🧛🏾♀️ 🧛🏿♀️
|
||||||
|
🧜 🧜🏻 🧜🏼 🧜🏽 🧜🏾 🧜🏿
|
||||||
|
🧜♂️ 🧜🏻♂️ 🧜🏼♂️ 🧜🏽♂️ 🧜🏾♂️ 🧜🏿♂️
|
||||||
|
🧜♀️ 🧜🏻♀️ 🧜🏼♀️ 🧜🏽♀️ 🧜🏾♀️ 🧜🏿♀️
|
||||||
|
🧝 🧝🏻 🧝🏼 🧝🏽 🧝🏾 🧝🏿
|
||||||
|
🧝♂️ 🧝🏻♂️ 🧝🏼♂️ 🧝🏽♂️ 🧝🏾♂️ 🧝🏿♂️
|
||||||
|
🧝♀️ 🧝🏻♀️ 🧝🏼♀️ 🧝🏽♀️ 🧝🏾♀️ 🧝🏿♀️
|
||||||
|
🧞
|
||||||
|
🧞♂️
|
||||||
|
🧞♀️
|
||||||
|
🧟
|
||||||
|
🧟♂️
|
||||||
|
🧟♀️
|
||||||
|
🧌
|
||||||
|
💆 💆🏻 💆🏼 💆🏽 💆🏾 💆🏿
|
||||||
|
💆♂️ 💆🏻♂️ 💆🏼♂️ 💆🏽♂️ 💆🏾♂️ 💆🏿♂️
|
||||||
|
💆♀️ 💆🏻♀️ 💆🏼♀️ 💆🏽♀️ 💆🏾♀️ 💆🏿♀️
|
||||||
|
💇 💇🏻 💇🏼 💇🏽 💇🏾 💇🏿
|
||||||
|
💇♂️ 💇🏻♂️ 💇🏼♂️ 💇🏽♂️ 💇🏾♂️ 💇🏿♂️
|
||||||
|
💇♀️ 💇🏻♀️ 💇🏼♀️ 💇🏽♀️ 💇🏾♀️ 💇🏿♀️
|
||||||
|
🚶 🚶🏻 🚶🏼 🚶🏽 🚶🏾 🚶🏿
|
||||||
|
🚶♂️ 🚶🏻♂️ 🚶🏼♂️ 🚶🏽♂️ 🚶🏾♂️ 🚶🏿♂️
|
||||||
|
🚶♀️ 🚶🏻♀️ 🚶🏼♀️ 🚶🏽♀️ 🚶🏾♀️ 🚶🏿♀️
|
||||||
|
🚶➡️ 🚶🏻➡️ 🚶🏼➡️ 🚶🏽➡️ 🚶🏾➡️ 🚶🏿➡️
|
||||||
|
🚶♀️➡️ 🚶🏻♀️➡️ 🚶🏼♀️➡️ 🚶🏽♀️➡️ 🚶🏾♀️➡️ 🚶🏿♀️➡️
|
||||||
|
🚶♂️➡️ 🚶🏻♂️➡️ 🚶🏼♂️➡️ 🚶🏽♂️➡️ 🚶🏾♂️➡️ 🚶🏿♂️➡️
|
||||||
|
🧍 🧍🏻 🧍🏼 🧍🏽 🧍🏾 🧍🏿
|
||||||
|
🧍♂️ 🧍🏻♂️ 🧍🏼♂️ 🧍🏽♂️ 🧍🏾♂️ 🧍🏿♂️
|
||||||
|
🧍♀️ 🧍🏻♀️ 🧍🏼♀️ 🧍🏽♀️ 🧍🏾♀️ 🧍🏿♀️
|
||||||
|
🧎 🧎🏻 🧎🏼 🧎🏽 🧎🏾 🧎🏿
|
||||||
|
🧎♂️ 🧎🏻♂️ 🧎🏼♂️ 🧎🏽♂️ 🧎🏾♂️ 🧎🏿♂️
|
||||||
|
🧎♀️ 🧎🏻♀️ 🧎🏼♀️ 🧎🏽♀️ 🧎🏾♀️ 🧎🏿♀️
|
||||||
|
🧎➡️ 🧎🏻➡️ 🧎🏼➡️ 🧎🏽➡️ 🧎🏾➡️ 🧎🏿➡️
|
||||||
|
🧎♀️➡️ 🧎🏻♀️➡️ 🧎🏼♀️➡️ 🧎🏽♀️➡️ 🧎🏾♀️➡️ 🧎🏿♀️➡️
|
||||||
|
🧎♂️➡️ 🧎🏻♂️➡️ 🧎🏼♂️➡️ 🧎🏽♂️➡️ 🧎🏾♂️➡️ 🧎🏿♂️➡️
|
||||||
|
🧑🦯 🧑🏻🦯 🧑🏼🦯 🧑🏽🦯 🧑🏾🦯 🧑🏿🦯
|
||||||
|
🧑🦯➡️ 🧑🏻🦯➡️ 🧑🏼🦯➡️ 🧑🏽🦯➡️ 🧑🏾🦯➡️ 🧑🏿🦯➡️
|
||||||
|
👨🦯 👨🏻🦯 👨🏼🦯 👨🏽🦯 👨🏾🦯 👨🏿🦯
|
||||||
|
👨🦯➡️ 👨🏻🦯➡️ 👨🏼🦯➡️ 👨🏽🦯➡️ 👨🏾🦯➡️ 👨🏿🦯➡️
|
||||||
|
👩🦯 👩🏻🦯 👩🏼🦯 👩🏽🦯 👩🏾🦯 👩🏿🦯
|
||||||
|
👩🦯➡️ 👩🏻🦯➡️ 👩🏼🦯➡️ 👩🏽🦯➡️ 👩🏾🦯➡️ 👩🏿🦯➡️
|
||||||
|
🧑🦼 🧑🏻🦼 🧑🏼🦼 🧑🏽🦼 🧑🏾🦼 🧑🏿🦼
|
||||||
|
🧑🦼➡️ 🧑🏻🦼➡️ 🧑🏼🦼➡️ 🧑🏽🦼➡️ 🧑🏾🦼➡️ 🧑🏿🦼➡️
|
||||||
|
👨🦼 👨🏻🦼 👨🏼🦼 👨🏽🦼 👨🏾🦼 👨🏿🦼
|
||||||
|
👨🦼➡️ 👨🏻🦼➡️ 👨🏼🦼➡️ 👨🏽🦼➡️ 👨🏾🦼➡️ 👨🏿🦼➡️
|
||||||
|
👩🦼 👩🏻🦼 👩🏼🦼 👩🏽🦼 👩🏾🦼 👩🏿🦼
|
||||||
|
👩🦼➡️ 👩🏻🦼➡️ 👩🏼🦼➡️ 👩🏽🦼➡️ 👩🏾🦼➡️ 👩🏿🦼➡️
|
||||||
|
🧑🦽 🧑🏻🦽 🧑🏼🦽 🧑🏽🦽 🧑🏾🦽 🧑🏿🦽
|
||||||
|
🧑🦽➡️ 🧑🏻🦽➡️ 🧑🏼🦽➡️ 🧑🏽🦽➡️ 🧑🏾🦽➡️ 🧑🏿🦽➡️
|
||||||
|
👨🦽 👨🏻🦽 👨🏼🦽 👨🏽🦽 👨🏾🦽 👨🏿🦽
|
||||||
|
👨🦽➡️ 👨🏻🦽➡️ 👨🏼🦽➡️ 👨🏽🦽➡️ 👨🏾🦽➡️ 👨🏿🦽➡️
|
||||||
|
👩🦽 👩🏻🦽 👩🏼🦽 👩🏽🦽 👩🏾🦽 👩🏿🦽
|
||||||
|
👩🦽➡️ 👩🏻🦽➡️ 👩🏼🦽➡️ 👩🏽🦽➡️ 👩🏾🦽➡️ 👩🏿🦽➡️
|
||||||
|
🏃 🏃🏻 🏃🏼 🏃🏽 🏃🏾 🏃🏿
|
||||||
|
🏃♂️ 🏃🏻♂️ 🏃🏼♂️ 🏃🏽♂️ 🏃🏾♂️ 🏃🏿♂️
|
||||||
|
🏃♀️ 🏃🏻♀️ 🏃🏼♀️ 🏃🏽♀️ 🏃🏾♀️ 🏃🏿♀️
|
||||||
|
🏃➡️ 🏃🏻➡️ 🏃🏼➡️ 🏃🏽➡️ 🏃🏾➡️ 🏃🏿➡️
|
||||||
|
🏃♀️➡️ 🏃🏻♀️➡️ 🏃🏼♀️➡️ 🏃🏽♀️➡️ 🏃🏾♀️➡️ 🏃🏿♀️➡️
|
||||||
|
🏃♂️➡️ 🏃🏻♂️➡️ 🏃🏼♂️➡️ 🏃🏽♂️➡️ 🏃🏾♂️➡️ 🏃🏿♂️➡️
|
||||||
|
💃 💃🏻 💃🏼 💃🏽 💃🏾 💃🏿
|
||||||
|
🕺 🕺🏻 🕺🏼 🕺🏽 🕺🏾 🕺🏿
|
||||||
|
🕴️ 🕴🏻 🕴🏼 🕴🏽 🕴🏾 🕴🏿
|
||||||
|
👯
|
||||||
|
👯♂️
|
||||||
|
👯♀️
|
||||||
|
🧖 🧖🏻 🧖🏼 🧖🏽 🧖🏾 🧖🏿
|
||||||
|
🧖♂️ 🧖🏻♂️ 🧖🏼♂️ 🧖🏽♂️ 🧖🏾♂️ 🧖🏿♂️
|
||||||
|
🧖♀️ 🧖🏻♀️ 🧖🏼♀️ 🧖🏽♀️ 🧖🏾♀️ 🧖🏿♀️
|
||||||
|
🧗 🧗🏻 🧗🏼 🧗🏽 🧗🏾 🧗🏿
|
||||||
|
🧗♂️ 🧗🏻♂️ 🧗🏼♂️ 🧗🏽♂️ 🧗🏾♂️ 🧗🏿♂️
|
||||||
|
🧗♀️ 🧗🏻♀️ 🧗🏼♀️ 🧗🏽♀️ 🧗🏾♀️ 🧗🏿♀️
|
||||||
|
🤺
|
||||||
|
🏇 🏇🏻 🏇🏼 🏇🏽 🏇🏾 🏇🏿
|
||||||
|
⛷️
|
||||||
|
🏂 🏂🏻 🏂🏼 🏂🏽 🏂🏾 🏂🏿
|
||||||
|
🏌️ 🏌🏻 🏌🏼 🏌🏽 🏌🏾 🏌🏿
|
||||||
|
🏌️♂️ 🏌🏻♂️ 🏌🏼♂️ 🏌🏽♂️ 🏌🏾♂️ 🏌🏿♂️
|
||||||
|
🏌️♀️ 🏌🏻♀️ 🏌🏼♀️ 🏌🏽♀️ 🏌🏾♀️ 🏌🏿♀️
|
||||||
|
🏄 🏄🏻 🏄🏼 🏄🏽 🏄🏾 🏄🏿
|
||||||
|
🏄♂️ 🏄🏻♂️ 🏄🏼♂️ 🏄🏽♂️ 🏄🏾♂️ 🏄🏿♂️
|
||||||
|
🏄♀️ 🏄🏻♀️ 🏄🏼♀️ 🏄🏽♀️ 🏄🏾♀️ 🏄🏿♀️
|
||||||
|
🚣 🚣🏻 🚣🏼 🚣🏽 🚣🏾 🚣🏿
|
||||||
|
🚣♂️ 🚣🏻♂️ 🚣🏼♂️ 🚣🏽♂️ 🚣🏾♂️ 🚣🏿♂️
|
||||||
|
🚣♀️ 🚣🏻♀️ 🚣🏼♀️ 🚣🏽♀️ 🚣🏾♀️ 🚣🏿♀️
|
||||||
|
🏊 🏊🏻 🏊🏼 🏊🏽 🏊🏾 🏊🏿
|
||||||
|
🏊♂️ 🏊🏻♂️ 🏊🏼♂️ 🏊🏽♂️ 🏊🏾♂️ 🏊🏿♂️
|
||||||
|
🏊♀️ 🏊🏻♀️ 🏊🏼♀️ 🏊🏽♀️ 🏊🏾♀️ 🏊🏿♀️
|
||||||
|
⛹️ ⛹🏻 ⛹🏼 ⛹🏽 ⛹🏾 ⛹🏿
|
||||||
|
⛹️♂️ ⛹🏻♂️ ⛹🏼♂️ ⛹🏽♂️ ⛹🏾♂️ ⛹🏿♂️
|
||||||
|
⛹️♀️ ⛹🏻♀️ ⛹🏼♀️ ⛹🏽♀️ ⛹🏾♀️ ⛹🏿♀️
|
||||||
|
🏋️ 🏋🏻 🏋🏼 🏋🏽 🏋🏾 🏋🏿
|
||||||
|
🏋️♂️ 🏋🏻♂️ 🏋🏼♂️ 🏋🏽♂️ 🏋🏾♂️ 🏋🏿♂️
|
||||||
|
🏋️♀️ 🏋🏻♀️ 🏋🏼♀️ 🏋🏽♀️ 🏋🏾♀️ 🏋🏿♀️
|
||||||
|
🚴 🚴🏻 🚴🏼 🚴🏽 🚴🏾 🚴🏿
|
||||||
|
🚴♂️ 🚴🏻♂️ 🚴🏼♂️ 🚴🏽♂️ 🚴🏾♂️ 🚴🏿♂️
|
||||||
|
🚴♀️ 🚴🏻♀️ 🚴🏼♀️ 🚴🏽♀️ 🚴🏾♀️ 🚴🏿♀️
|
||||||
|
🚵 🚵🏻 🚵🏼 🚵🏽 🚵🏾 🚵🏿
|
||||||
|
🚵♂️ 🚵🏻♂️ 🚵🏼♂️ 🚵🏽♂️ 🚵🏾♂️ 🚵🏿♂️
|
||||||
|
🚵♀️ 🚵🏻♀️ 🚵🏼♀️ 🚵🏽♀️ 🚵🏾♀️ 🚵🏿♀️
|
||||||
|
🤸 🤸🏻 🤸🏼 🤸🏽 🤸🏾 🤸🏿
|
||||||
|
🤸♂️ 🤸🏻♂️ 🤸🏼♂️ 🤸🏽♂️ 🤸🏾♂️ 🤸🏿♂️
|
||||||
|
🤸♀️ 🤸🏻♀️ 🤸🏼♀️ 🤸🏽♀️ 🤸🏾♀️ 🤸🏿♀️
|
||||||
|
🤼
|
||||||
|
🤼♂️
|
||||||
|
🤼♀️
|
||||||
|
🤽 🤽🏻 🤽🏼 🤽🏽 🤽🏾 🤽🏿
|
||||||
|
🤽♂️ 🤽🏻♂️ 🤽🏼♂️ 🤽🏽♂️ 🤽🏾♂️ 🤽🏿♂️
|
||||||
|
🤽♀️ 🤽🏻♀️ 🤽🏼♀️ 🤽🏽♀️ 🤽🏾♀️ 🤽🏿♀️
|
||||||
|
🤾 🤾🏻 🤾🏼 🤾🏽 🤾🏾 🤾🏿
|
||||||
|
🤾♂️ 🤾🏻♂️ 🤾🏼♂️ 🤾🏽♂️ 🤾🏾♂️ 🤾🏿♂️
|
||||||
|
🤾♀️ 🤾🏻♀️ 🤾🏼♀️ 🤾🏽♀️ 🤾🏾♀️ 🤾🏿♀️
|
||||||
|
🤹 🤹🏻 🤹🏼 🤹🏽 🤹🏾 🤹🏿
|
||||||
|
🤹♂️ 🤹🏻♂️ 🤹🏼♂️ 🤹🏽♂️ 🤹🏾♂️ 🤹🏿♂️
|
||||||
|
🤹♀️ 🤹🏻♀️ 🤹🏼♀️ 🤹🏽♀️ 🤹🏾♀️ 🤹🏿♀️
|
||||||
|
🧘 🧘🏻 🧘🏼 🧘🏽 🧘🏾 🧘🏿
|
||||||
|
🧘♂️ 🧘🏻♂️ 🧘🏼♂️ 🧘🏽♂️ 🧘🏾♂️ 🧘🏿♂️
|
||||||
|
🧘♀️ 🧘🏻♀️ 🧘🏼♀️ 🧘🏽♀️ 🧘🏾♀️ 🧘🏿♀️
|
||||||
|
🛀 🛀🏻 🛀🏼 🛀🏽 🛀🏾 🛀🏿
|
||||||
|
🛌 🛌🏻 🛌🏼 🛌🏽 🛌🏾 🛌🏿
|
||||||
|
🧑🤝🧑
|
||||||
|
👭 👭🏻 👭🏼 👭🏽 👭🏾 👭🏿
|
||||||
|
👫 👫🏻 👫🏼 👫🏽 👫🏾 👫🏿
|
||||||
|
👬 👬🏻 👬🏼 👬🏽 👬🏾 👬🏿
|
||||||
|
💏 💏🏻 💏🏼 💏🏽 💏🏾 💏🏿
|
||||||
|
👩❤️💋👨
|
||||||
|
👨❤️💋👨
|
||||||
|
👩❤️💋👩
|
||||||
|
💑 💑🏻 💑🏼 💑🏽 💑🏾 💑🏿
|
||||||
|
👩❤️👨
|
||||||
|
👨❤️👨
|
||||||
|
👩❤️👩
|
||||||
|
👨👩👦
|
||||||
|
👨👩👧
|
||||||
|
👨👩👧👦
|
||||||
|
👨👩👦👦
|
||||||
|
👨👩👧👧
|
||||||
|
👨👨👦
|
||||||
|
👨👨👧
|
||||||
|
👨👨👧👦
|
||||||
|
👨👨👦👦
|
||||||
|
👨👨👧👧
|
||||||
|
👩👩👦
|
||||||
|
👩👩👧
|
||||||
|
👩👩👧👦
|
||||||
|
👩👩👦👦
|
||||||
|
👩👩👧👧
|
||||||
|
👨👦
|
||||||
|
👨👦👦
|
||||||
|
👨👧
|
||||||
|
👨👧👦
|
||||||
|
👨👧👧
|
||||||
|
👩👦
|
||||||
|
👩👦👦
|
||||||
|
👩👧
|
||||||
|
👩👧👦
|
||||||
|
👩👧👧
|
||||||
|
🗣️
|
||||||
|
👤
|
||||||
|
👥
|
||||||
|
🫂
|
||||||
|
👪
|
||||||
|
🧑🧑🧒
|
||||||
|
🧑🧑🧒🧒
|
||||||
|
🧑🧒
|
||||||
|
🧑🧒🧒
|
||||||
|
👣
|
||||||
|
|
169
app/src/main/assets/emoji/SMILEYS_AND_EMOTION.txt
Normal file
169
app/src/main/assets/emoji/SMILEYS_AND_EMOTION.txt
Normal file
|
@ -0,0 +1,169 @@
|
||||||
|
😀
|
||||||
|
😃
|
||||||
|
😄
|
||||||
|
😁
|
||||||
|
😆
|
||||||
|
😅
|
||||||
|
🤣
|
||||||
|
😂
|
||||||
|
🙂
|
||||||
|
🙃
|
||||||
|
🫠
|
||||||
|
😉
|
||||||
|
😊
|
||||||
|
😇
|
||||||
|
🥰
|
||||||
|
😍
|
||||||
|
🤩
|
||||||
|
😘
|
||||||
|
😗
|
||||||
|
☺️
|
||||||
|
😚
|
||||||
|
😙
|
||||||
|
🥲
|
||||||
|
😋
|
||||||
|
😛
|
||||||
|
😜
|
||||||
|
🤪
|
||||||
|
😝
|
||||||
|
🤑
|
||||||
|
🤗
|
||||||
|
🤭
|
||||||
|
🫢
|
||||||
|
🫣
|
||||||
|
🤫
|
||||||
|
🤔
|
||||||
|
🫡
|
||||||
|
🤐
|
||||||
|
🤨
|
||||||
|
😐
|
||||||
|
😑
|
||||||
|
😶
|
||||||
|
🫥
|
||||||
|
😶🌫️
|
||||||
|
😏
|
||||||
|
😒
|
||||||
|
🙄
|
||||||
|
😬
|
||||||
|
😮💨
|
||||||
|
🤥
|
||||||
|
🫨
|
||||||
|
🙂↔️
|
||||||
|
🙂↕️
|
||||||
|
😌
|
||||||
|
😔
|
||||||
|
😪
|
||||||
|
🤤
|
||||||
|
😴
|
||||||
|
|
||||||
|
😷
|
||||||
|
🤒
|
||||||
|
🤕
|
||||||
|
🤢
|
||||||
|
🤮
|
||||||
|
🤧
|
||||||
|
🥵
|
||||||
|
🥶
|
||||||
|
🥴
|
||||||
|
😵
|
||||||
|
😵💫
|
||||||
|
🤯
|
||||||
|
🤠
|
||||||
|
🥳
|
||||||
|
🥸
|
||||||
|
😎
|
||||||
|
🤓
|
||||||
|
🧐
|
||||||
|
😕
|
||||||
|
🫤
|
||||||
|
😟
|
||||||
|
🙁
|
||||||
|
☹️
|
||||||
|
😮
|
||||||
|
😯
|
||||||
|
😲
|
||||||
|
😳
|
||||||
|
🥺
|
||||||
|
🥹
|
||||||
|
😦
|
||||||
|
😧
|
||||||
|
😨
|
||||||
|
😰
|
||||||
|
😥
|
||||||
|
😢
|
||||||
|
😭
|
||||||
|
😱
|
||||||
|
😖
|
||||||
|
😣
|
||||||
|
😞
|
||||||
|
😓
|
||||||
|
😩
|
||||||
|
😫
|
||||||
|
🥱
|
||||||
|
😤
|
||||||
|
😡
|
||||||
|
😠
|
||||||
|
🤬
|
||||||
|
😈
|
||||||
|
👿
|
||||||
|
💀
|
||||||
|
☠️
|
||||||
|
💩
|
||||||
|
🤡
|
||||||
|
👹
|
||||||
|
👺
|
||||||
|
👻
|
||||||
|
👽
|
||||||
|
👾
|
||||||
|
🤖
|
||||||
|
😺
|
||||||
|
😸
|
||||||
|
😹
|
||||||
|
😻
|
||||||
|
😼
|
||||||
|
😽
|
||||||
|
🙀
|
||||||
|
😿
|
||||||
|
😾
|
||||||
|
🙈
|
||||||
|
🙉
|
||||||
|
🙊
|
||||||
|
💌
|
||||||
|
💘
|
||||||
|
💝
|
||||||
|
💖
|
||||||
|
💗
|
||||||
|
💓
|
||||||
|
💞
|
||||||
|
💕
|
||||||
|
💟
|
||||||
|
❣️
|
||||||
|
💔
|
||||||
|
❤️🔥
|
||||||
|
❤️🩹
|
||||||
|
❤️
|
||||||
|
🩷
|
||||||
|
🧡
|
||||||
|
💛
|
||||||
|
💚
|
||||||
|
💙
|
||||||
|
🩵
|
||||||
|
💜
|
||||||
|
🤎
|
||||||
|
🖤
|
||||||
|
🩶
|
||||||
|
🤍
|
||||||
|
💋
|
||||||
|
💯
|
||||||
|
💢
|
||||||
|
💥
|
||||||
|
💫
|
||||||
|
💦
|
||||||
|
💨
|
||||||
|
🕳️
|
||||||
|
💬
|
||||||
|
👁️🗨️
|
||||||
|
🗨️
|
||||||
|
🗯️
|
||||||
|
💭
|
||||||
|
💤
|
250
app/src/main/assets/emoji/SYMBOLS.txt
Normal file
250
app/src/main/assets/emoji/SYMBOLS.txt
Normal file
|
@ -0,0 +1,250 @@
|
||||||
|
🏧
|
||||||
|
🚮
|
||||||
|
🚰
|
||||||
|
♿
|
||||||
|
🚹
|
||||||
|
🚺
|
||||||
|
🚻
|
||||||
|
🚼
|
||||||
|
🚾
|
||||||
|
🛂
|
||||||
|
🛃
|
||||||
|
🛄
|
||||||
|
🛅
|
||||||
|
⚠️
|
||||||
|
🚸
|
||||||
|
⛔
|
||||||
|
🚫
|
||||||
|
🚳
|
||||||
|
🚭
|
||||||
|
🚯
|
||||||
|
🚱
|
||||||
|
🚷
|
||||||
|
📵
|
||||||
|
🔞
|
||||||
|
☢️
|
||||||
|
☣️
|
||||||
|
⬆️
|
||||||
|
↗️
|
||||||
|
➡️
|
||||||
|
↘️
|
||||||
|
⬇️
|
||||||
|
↙️
|
||||||
|
⬅️
|
||||||
|
↖️
|
||||||
|
↕️
|
||||||
|
↔️
|
||||||
|
↩️
|
||||||
|
↪️
|
||||||
|
⤴️
|
||||||
|
⤵️
|
||||||
|
🔃
|
||||||
|
🔄
|
||||||
|
🔙
|
||||||
|
🔚
|
||||||
|
🔛
|
||||||
|
🔜
|
||||||
|
🔝
|
||||||
|
🛐
|
||||||
|
⚛️
|
||||||
|
🕉️
|
||||||
|
✡️
|
||||||
|
☸️
|
||||||
|
☯️
|
||||||
|
✝️
|
||||||
|
☦️
|
||||||
|
☪️
|
||||||
|
☮️
|
||||||
|
🕎
|
||||||
|
🔯
|
||||||
|
🪯
|
||||||
|
♈
|
||||||
|
♉
|
||||||
|
♊
|
||||||
|
♋
|
||||||
|
♌
|
||||||
|
♍
|
||||||
|
♎
|
||||||
|
♏
|
||||||
|
♐
|
||||||
|
♑
|
||||||
|
♒
|
||||||
|
♓
|
||||||
|
⛎
|
||||||
|
🔀
|
||||||
|
🔁
|
||||||
|
🔂
|
||||||
|
▶️
|
||||||
|
⏩
|
||||||
|
⏭️
|
||||||
|
⏯️
|
||||||
|
◀️
|
||||||
|
⏪
|
||||||
|
⏮️
|
||||||
|
🔼
|
||||||
|
⏫
|
||||||
|
🔽
|
||||||
|
⏬
|
||||||
|
⏸️
|
||||||
|
⏹️
|
||||||
|
⏺️
|
||||||
|
⏏️
|
||||||
|
🎦
|
||||||
|
🔅
|
||||||
|
🔆
|
||||||
|
📶
|
||||||
|
🛜
|
||||||
|
📳
|
||||||
|
📴
|
||||||
|
♀️
|
||||||
|
♂️
|
||||||
|
⚧️
|
||||||
|
✖️
|
||||||
|
➕
|
||||||
|
➖
|
||||||
|
➗
|
||||||
|
🟰
|
||||||
|
♾️
|
||||||
|
‼️
|
||||||
|
⁉️
|
||||||
|
❓
|
||||||
|
❔
|
||||||
|
❕
|
||||||
|
❗
|
||||||
|
〰️
|
||||||
|
💱
|
||||||
|
💲
|
||||||
|
⚕️
|
||||||
|
♻️
|
||||||
|
⚜️
|
||||||
|
🔱
|
||||||
|
📛
|
||||||
|
🔰
|
||||||
|
⭕
|
||||||
|
✅
|
||||||
|
☑️
|
||||||
|
✔️
|
||||||
|
❌
|
||||||
|
❎
|
||||||
|
➰
|
||||||
|
➿
|
||||||
|
〽️
|
||||||
|
✳️
|
||||||
|
✴️
|
||||||
|
❇️
|
||||||
|
©️
|
||||||
|
®️
|
||||||
|
™️
|
||||||
|
|
||||||
|
🇦
|
||||||
|
🇧
|
||||||
|
🇨
|
||||||
|
🇩
|
||||||
|
🇪
|
||||||
|
🇫
|
||||||
|
🇬
|
||||||
|
🇭
|
||||||
|
🇮
|
||||||
|
🇯
|
||||||
|
🇰
|
||||||
|
🇱
|
||||||
|
🇲
|
||||||
|
🇳
|
||||||
|
🇴
|
||||||
|
🇵
|
||||||
|
🇶
|
||||||
|
🇷
|
||||||
|
🇸
|
||||||
|
🇹
|
||||||
|
🇺
|
||||||
|
🇻
|
||||||
|
🇼
|
||||||
|
🇽
|
||||||
|
🇾
|
||||||
|
🇿
|
||||||
|
#️⃣
|
||||||
|
*️⃣
|
||||||
|
0️⃣
|
||||||
|
1️⃣
|
||||||
|
2️⃣
|
||||||
|
3️⃣
|
||||||
|
4️⃣
|
||||||
|
5️⃣
|
||||||
|
6️⃣
|
||||||
|
7️⃣
|
||||||
|
8️⃣
|
||||||
|
9️⃣
|
||||||
|
🔟
|
||||||
|
🔠
|
||||||
|
🔡
|
||||||
|
🔢
|
||||||
|
🔣
|
||||||
|
🔤
|
||||||
|
🅰️
|
||||||
|
🆎
|
||||||
|
🅱️
|
||||||
|
🆑
|
||||||
|
🆒
|
||||||
|
🆓
|
||||||
|
ℹ️
|
||||||
|
🆔
|
||||||
|
Ⓜ️
|
||||||
|
🆕
|
||||||
|
🆖
|
||||||
|
🅾️
|
||||||
|
🆗
|
||||||
|
🅿️
|
||||||
|
🆘
|
||||||
|
🆙
|
||||||
|
🆚
|
||||||
|
🈁
|
||||||
|
🈂️
|
||||||
|
🈷️
|
||||||
|
🈶
|
||||||
|
🈯
|
||||||
|
🉐
|
||||||
|
🈹
|
||||||
|
🈚
|
||||||
|
🈲
|
||||||
|
🉑
|
||||||
|
🈸
|
||||||
|
🈴
|
||||||
|
🈳
|
||||||
|
㊗️
|
||||||
|
㊙️
|
||||||
|
🈺
|
||||||
|
🈵
|
||||||
|
🔴
|
||||||
|
🟠
|
||||||
|
🟡
|
||||||
|
🟢
|
||||||
|
🔵
|
||||||
|
🟣
|
||||||
|
🟤
|
||||||
|
⚫
|
||||||
|
⚪
|
||||||
|
🟥
|
||||||
|
🟧
|
||||||
|
🟨
|
||||||
|
🟩
|
||||||
|
🟦
|
||||||
|
🟪
|
||||||
|
🟫
|
||||||
|
⬛
|
||||||
|
⬜
|
||||||
|
◼️
|
||||||
|
◻️
|
||||||
|
◾
|
||||||
|
◽
|
||||||
|
▪️
|
||||||
|
▫️
|
||||||
|
🔶
|
||||||
|
🔷
|
||||||
|
🔸
|
||||||
|
🔹
|
||||||
|
🔺
|
||||||
|
🔻
|
||||||
|
💠
|
||||||
|
🔘
|
||||||
|
🔳
|
||||||
|
🔲
|
218
app/src/main/assets/emoji/TRAVEL_AND_PLACES.txt
Normal file
218
app/src/main/assets/emoji/TRAVEL_AND_PLACES.txt
Normal file
|
@ -0,0 +1,218 @@
|
||||||
|
🌍
|
||||||
|
🌎
|
||||||
|
🌏
|
||||||
|
🌐
|
||||||
|
🗺️
|
||||||
|
🗾
|
||||||
|
🧭
|
||||||
|
🏔️
|
||||||
|
⛰️
|
||||||
|
🌋
|
||||||
|
🗻
|
||||||
|
🏕️
|
||||||
|
🏖️
|
||||||
|
🏜️
|
||||||
|
🏝️
|
||||||
|
🏞️
|
||||||
|
🏟️
|
||||||
|
🏛️
|
||||||
|
🏗️
|
||||||
|
🧱
|
||||||
|
🪨
|
||||||
|
🪵
|
||||||
|
🛖
|
||||||
|
🏘️
|
||||||
|
🏚️
|
||||||
|
🏠
|
||||||
|
🏡
|
||||||
|
🏢
|
||||||
|
🏣
|
||||||
|
🏤
|
||||||
|
🏥
|
||||||
|
🏦
|
||||||
|
🏨
|
||||||
|
🏩
|
||||||
|
🏪
|
||||||
|
🏫
|
||||||
|
🏬
|
||||||
|
🏭
|
||||||
|
🏯
|
||||||
|
🏰
|
||||||
|
💒
|
||||||
|
🗼
|
||||||
|
🗽
|
||||||
|
⛪
|
||||||
|
🕌
|
||||||
|
🛕
|
||||||
|
🕍
|
||||||
|
⛩️
|
||||||
|
🕋
|
||||||
|
⛲
|
||||||
|
⛺
|
||||||
|
🌁
|
||||||
|
🌃
|
||||||
|
🏙️
|
||||||
|
🌄
|
||||||
|
🌅
|
||||||
|
🌆
|
||||||
|
🌇
|
||||||
|
🌉
|
||||||
|
♨️
|
||||||
|
🎠
|
||||||
|
🛝
|
||||||
|
🎡
|
||||||
|
🎢
|
||||||
|
💈
|
||||||
|
🎪
|
||||||
|
🚂
|
||||||
|
🚃
|
||||||
|
🚄
|
||||||
|
🚅
|
||||||
|
🚆
|
||||||
|
🚇
|
||||||
|
🚈
|
||||||
|
🚉
|
||||||
|
🚊
|
||||||
|
🚝
|
||||||
|
🚞
|
||||||
|
🚋
|
||||||
|
🚌
|
||||||
|
🚍
|
||||||
|
🚎
|
||||||
|
🚐
|
||||||
|
🚑
|
||||||
|
🚒
|
||||||
|
🚓
|
||||||
|
🚔
|
||||||
|
🚕
|
||||||
|
🚖
|
||||||
|
🚗
|
||||||
|
🚘
|
||||||
|
🚙
|
||||||
|
🛻
|
||||||
|
🚚
|
||||||
|
🚛
|
||||||
|
🚜
|
||||||
|
🏎️
|
||||||
|
🏍️
|
||||||
|
🛵
|
||||||
|
🦽
|
||||||
|
🦼
|
||||||
|
🛺
|
||||||
|
🚲
|
||||||
|
🛴
|
||||||
|
🛹
|
||||||
|
🛼
|
||||||
|
🚏
|
||||||
|
🛣️
|
||||||
|
🛤️
|
||||||
|
🛢️
|
||||||
|
⛽
|
||||||
|
🛞
|
||||||
|
🚨
|
||||||
|
🚥
|
||||||
|
🚦
|
||||||
|
🛑
|
||||||
|
🚧
|
||||||
|
⚓
|
||||||
|
🛟
|
||||||
|
⛵
|
||||||
|
🛶
|
||||||
|
🚤
|
||||||
|
🛳️
|
||||||
|
⛴️
|
||||||
|
🛥️
|
||||||
|
🚢
|
||||||
|
✈️
|
||||||
|
🛩️
|
||||||
|
🛫
|
||||||
|
🛬
|
||||||
|
🪂
|
||||||
|
💺
|
||||||
|
🚁
|
||||||
|
🚟
|
||||||
|
🚠
|
||||||
|
🚡
|
||||||
|
🛰️
|
||||||
|
🚀
|
||||||
|
🛸
|
||||||
|
🛎️
|
||||||
|
🧳
|
||||||
|
⌛
|
||||||
|
⏳
|
||||||
|
⌚
|
||||||
|
⏰
|
||||||
|
⏱️
|
||||||
|
⏲️
|
||||||
|
🕰️
|
||||||
|
🕛
|
||||||
|
🕧
|
||||||
|
🕐
|
||||||
|
🕜
|
||||||
|
🕑
|
||||||
|
🕝
|
||||||
|
🕒
|
||||||
|
🕞
|
||||||
|
🕓
|
||||||
|
🕟
|
||||||
|
🕔
|
||||||
|
🕠
|
||||||
|
🕕
|
||||||
|
🕡
|
||||||
|
🕖
|
||||||
|
🕢
|
||||||
|
🕗
|
||||||
|
🕣
|
||||||
|
🕘
|
||||||
|
🕤
|
||||||
|
🕙
|
||||||
|
🕥
|
||||||
|
🕚
|
||||||
|
🕦
|
||||||
|
🌑
|
||||||
|
🌒
|
||||||
|
🌓
|
||||||
|
🌔
|
||||||
|
🌕
|
||||||
|
🌖
|
||||||
|
🌗
|
||||||
|
🌘
|
||||||
|
🌙
|
||||||
|
🌚
|
||||||
|
🌛
|
||||||
|
🌜
|
||||||
|
🌡️
|
||||||
|
☀️
|
||||||
|
🌝
|
||||||
|
🌞
|
||||||
|
🪐
|
||||||
|
⭐
|
||||||
|
🌟
|
||||||
|
🌠
|
||||||
|
🌌
|
||||||
|
☁️
|
||||||
|
⛅
|
||||||
|
⛈️
|
||||||
|
🌤️
|
||||||
|
🌥️
|
||||||
|
🌦️
|
||||||
|
🌧️
|
||||||
|
🌨️
|
||||||
|
🌩️
|
||||||
|
🌪️
|
||||||
|
🌫️
|
||||||
|
🌬️
|
||||||
|
🌀
|
||||||
|
🌈
|
||||||
|
🌂
|
||||||
|
☂️
|
||||||
|
☔
|
||||||
|
⛱️
|
||||||
|
⚡
|
||||||
|
❄️
|
||||||
|
☃️
|
||||||
|
⛄
|
||||||
|
☄️
|
||||||
|
🔥
|
||||||
|
💧
|
||||||
|
🌊
|
12
app/src/main/assets/emoji/minApi.txt
Normal file
12
app/src/main/assets/emoji/minApi.txt
Normal file
File diff suppressed because one or more lines are too long
|
@ -11,6 +11,7 @@ import static helium314.keyboard.keyboard.internal.keyboard_parser.EmojiParserKt
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
|
|
||||||
|
import helium314.keyboard.latin.common.Constants;
|
||||||
import helium314.keyboard.latin.settings.Defaults;
|
import helium314.keyboard.latin.settings.Defaults;
|
||||||
import helium314.keyboard.latin.utils.Log;
|
import helium314.keyboard.latin.utils.Log;
|
||||||
|
|
||||||
|
@ -34,8 +35,6 @@ import java.util.List;
|
||||||
*/
|
*/
|
||||||
final class DynamicGridKeyboard extends Keyboard {
|
final class DynamicGridKeyboard extends Keyboard {
|
||||||
private static final String TAG = DynamicGridKeyboard.class.getSimpleName();
|
private static final String TAG = DynamicGridKeyboard.class.getSimpleName();
|
||||||
private static final int TEMPLATE_KEY_CODE_0 = 0x30;
|
|
||||||
private static final int TEMPLATE_KEY_CODE_1 = 0x31;
|
|
||||||
private final Object mLock = new Object();
|
private final Object mLock = new Object();
|
||||||
|
|
||||||
private final SharedPreferences mPrefs;
|
private final SharedPreferences mPrefs;
|
||||||
|
@ -60,8 +59,8 @@ final class DynamicGridKeyboard extends Keyboard {
|
||||||
mBaseWidth = width - paddingWidth;
|
mBaseWidth = width - paddingWidth;
|
||||||
mOccupiedWidth = width;
|
mOccupiedWidth = width;
|
||||||
final float spacerWidth = Settings.getValues().mSplitKeyboardSpacerRelativeWidth * mBaseWidth;
|
final float spacerWidth = Settings.getValues().mSplitKeyboardSpacerRelativeWidth * mBaseWidth;
|
||||||
final Key key0 = getTemplateKey(TEMPLATE_KEY_CODE_0);
|
final Key key0 = getTemplateKey(Constants.RECENTS_TEMPLATE_KEY_CODE_0);
|
||||||
final Key key1 = getTemplateKey(TEMPLATE_KEY_CODE_1);
|
final Key key1 = getTemplateKey(Constants.RECENTS_TEMPLATE_KEY_CODE_1);
|
||||||
final int horizontalGap = Math.abs(key1.getX() - key0.getX()) - key0.getWidth();
|
final int horizontalGap = Math.abs(key1.getX() - key0.getX()) - key0.getWidth();
|
||||||
final float widthScale = determineWidthScale(key0.getWidth() + horizontalGap);
|
final float widthScale = determineWidthScale(key0.getWidth() + horizontalGap);
|
||||||
mHorizontalGap = (int) (horizontalGap * widthScale);
|
mHorizontalGap = (int) (horizontalGap * widthScale);
|
||||||
|
@ -213,7 +212,7 @@ final class DynamicGridKeyboard extends Keyboard {
|
||||||
}
|
}
|
||||||
|
|
||||||
// fall back to creating the key
|
// fall back to creating the key
|
||||||
return new Key(getTemplateKey(TEMPLATE_KEY_CODE_0), null, null, Key.BACKGROUND_TYPE_EMPTY, code, null);
|
return new Key(getTemplateKey(Constants.RECENTS_TEMPLATE_KEY_CODE_0), null, null, Key.BACKGROUND_TYPE_EMPTY, code, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Key getKeyByOutputText(final Collection<DynamicGridKeyboard> keyboards,
|
private Key getKeyByOutputText(final Collection<DynamicGridKeyboard> keyboards,
|
||||||
|
@ -227,7 +226,7 @@ final class DynamicGridKeyboard extends Keyboard {
|
||||||
}
|
}
|
||||||
|
|
||||||
// fall back to creating the key
|
// fall back to creating the key
|
||||||
return new Key(getTemplateKey(TEMPLATE_KEY_CODE_0), null, null, Key.BACKGROUND_TYPE_EMPTY, 0, outputText);
|
return new Key(getTemplateKey(Constants.RECENTS_TEMPLATE_KEY_CODE_0), null, null, Key.BACKGROUND_TYPE_EMPTY, 0, outputText);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void loadRecentKeys(final Collection<DynamicGridKeyboard> keyboards) {
|
public void loadRecentKeys(final Collection<DynamicGridKeyboard> keyboards) {
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
package helium314.keyboard.keyboard.emoji
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import helium314.keyboard.latin.settings.Defaults
|
||||||
|
import helium314.keyboard.latin.settings.Settings
|
||||||
|
import helium314.keyboard.latin.utils.Log
|
||||||
|
import helium314.keyboard.latin.utils.prefs
|
||||||
|
|
||||||
|
object SupportedEmojis {
|
||||||
|
private val unsupportedEmojis = hashSetOf<String>()
|
||||||
|
|
||||||
|
fun load(context: Context) {
|
||||||
|
val maxSdk = context.prefs().getInt(Settings.PREF_EMOJI_MAX_SDK, Defaults.PREF_EMOJI_MAX_SDK)
|
||||||
|
Log.i("test", "max $maxSdk")
|
||||||
|
unsupportedEmojis.clear()
|
||||||
|
context.assets.open("emoji/minApi.txt").reader().readLines().forEach {
|
||||||
|
val s = it.split(" ")
|
||||||
|
val minApi = s.first().toInt()
|
||||||
|
if (minApi > maxSdk)
|
||||||
|
unsupportedEmojis.addAll(s.drop(1))
|
||||||
|
}
|
||||||
|
Log.i("test", "have ${unsupportedEmojis.size}, longest emoji: ${unsupportedEmojis.maxOfOrNull { it.length }}")
|
||||||
|
}
|
||||||
|
|
||||||
|
fun isSupported(emoji: String) = emoji !in unsupportedEmojis
|
||||||
|
}
|
|
@ -48,7 +48,7 @@ open class KeyboardBuilder<KP : KeyboardParams>(protected val mContext: Context,
|
||||||
if (id.isEmojiKeyboard) {
|
if (id.isEmojiKeyboard) {
|
||||||
mParams.mAllowRedundantPopupKeys = true
|
mParams.mAllowRedundantPopupKeys = true
|
||||||
readAttributes(R.xml.kbd_emoji)
|
readAttributes(R.xml.kbd_emoji)
|
||||||
keysInRows = EmojiParser(mParams, mContext, Settings.getValues().mEmojiMaxSdk).parse()
|
keysInRows = EmojiParser(mParams, mContext).parse()
|
||||||
} else {
|
} else {
|
||||||
try {
|
try {
|
||||||
setupParams()
|
setupParams()
|
||||||
|
|
|
@ -5,38 +5,45 @@ import android.content.Context
|
||||||
import helium314.keyboard.keyboard.Key
|
import helium314.keyboard.keyboard.Key
|
||||||
import helium314.keyboard.keyboard.Key.KeyParams
|
import helium314.keyboard.keyboard.Key.KeyParams
|
||||||
import helium314.keyboard.keyboard.KeyboardId
|
import helium314.keyboard.keyboard.KeyboardId
|
||||||
|
import helium314.keyboard.keyboard.emoji.SupportedEmojis
|
||||||
import helium314.keyboard.keyboard.internal.KeyboardParams
|
import helium314.keyboard.keyboard.internal.KeyboardParams
|
||||||
import helium314.keyboard.keyboard.internal.keyboard_parser.floris.KeyCode
|
import helium314.keyboard.keyboard.internal.keyboard_parser.floris.KeyCode
|
||||||
import helium314.keyboard.latin.R
|
import helium314.keyboard.latin.R
|
||||||
|
import helium314.keyboard.latin.common.Constants
|
||||||
import helium314.keyboard.latin.common.StringUtils
|
import helium314.keyboard.latin.common.StringUtils
|
||||||
import helium314.keyboard.latin.settings.Settings
|
import helium314.keyboard.latin.settings.Settings
|
||||||
import helium314.keyboard.latin.utils.ResourceUtils
|
import helium314.keyboard.latin.utils.ResourceUtils
|
||||||
import kotlin.math.sqrt
|
import kotlin.math.sqrt
|
||||||
|
|
||||||
class EmojiParser(private val params: KeyboardParams, private val context: Context, private val maxSdk: Int) {
|
class EmojiParser(private val params: KeyboardParams, private val context: Context) {
|
||||||
|
|
||||||
fun parse(): ArrayList<ArrayList<KeyParams>> {
|
fun parse(): ArrayList<ArrayList<KeyParams>> {
|
||||||
val emojiArrayId = when (params.mId.mElementId) {
|
val emojiFileName = when (params.mId.mElementId) {
|
||||||
KeyboardId.ELEMENT_EMOJI_RECENTS -> R.array.emoji_recents
|
KeyboardId.ELEMENT_EMOJI_CATEGORY1 -> "SMILEYS_AND_EMOTION.txt"
|
||||||
KeyboardId.ELEMENT_EMOJI_CATEGORY1 -> R.array.emoji_smileys_emotion
|
KeyboardId.ELEMENT_EMOJI_CATEGORY2 -> "PEOPLE_AND_BODY.txt"
|
||||||
KeyboardId.ELEMENT_EMOJI_CATEGORY2 -> R.array.emoji_people_body
|
KeyboardId.ELEMENT_EMOJI_CATEGORY3 -> "ANIMALS_AND_NATURE.txt"
|
||||||
KeyboardId.ELEMENT_EMOJI_CATEGORY3 -> R.array.emoji_animals_nature
|
KeyboardId.ELEMENT_EMOJI_CATEGORY4 -> "FOOD_AND_DRINK.txt"
|
||||||
KeyboardId.ELEMENT_EMOJI_CATEGORY4 -> R.array.emoji_food_drink
|
KeyboardId.ELEMENT_EMOJI_CATEGORY5 -> "TRAVEL_AND_PLACES.txt"
|
||||||
KeyboardId.ELEMENT_EMOJI_CATEGORY5 -> R.array.emoji_travel_places
|
KeyboardId.ELEMENT_EMOJI_CATEGORY6 -> "ACTIVITIES.txt"
|
||||||
KeyboardId.ELEMENT_EMOJI_CATEGORY6 -> R.array.emoji_activities
|
KeyboardId.ELEMENT_EMOJI_CATEGORY7 -> "OBJECTS.txt"
|
||||||
KeyboardId.ELEMENT_EMOJI_CATEGORY7 -> R.array.emoji_objects
|
KeyboardId.ELEMENT_EMOJI_CATEGORY8 -> "SYMBOLS.txt"
|
||||||
KeyboardId.ELEMENT_EMOJI_CATEGORY8 -> R.array.emoji_symbols
|
KeyboardId.ELEMENT_EMOJI_CATEGORY9 -> "FLAGS.txt"
|
||||||
KeyboardId.ELEMENT_EMOJI_CATEGORY9 -> R.array.emoji_flags
|
KeyboardId.ELEMENT_EMOJI_CATEGORY10 -> "EMOTICONS.txt"
|
||||||
KeyboardId.ELEMENT_EMOJI_CATEGORY10 -> R.array.emoji_emoticons
|
else -> null
|
||||||
else -> throw(IllegalStateException("can only parse emoji categories where an array exists"))
|
|
||||||
}
|
}
|
||||||
val emojiArray = context.resources.getStringArray(emojiArrayId)
|
val emojiLines = if (emojiFileName == null) {
|
||||||
val popupEmojisArray = if (params.mId.mElementId != KeyboardId.ELEMENT_EMOJI_CATEGORY2) null
|
listOf( // special template keys for recents category
|
||||||
else context.resources.getStringArray(R.array.emoji_people_body_more)
|
StringUtils.newSingleCodePointString(Constants.RECENTS_TEMPLATE_KEY_CODE_0),
|
||||||
if (popupEmojisArray != null && emojiArray.size != popupEmojisArray.size)
|
StringUtils.newSingleCodePointString(Constants.RECENTS_TEMPLATE_KEY_CODE_1),
|
||||||
throw(IllegalStateException("Inconsistent array size between codesArray and popupKeysArray"))
|
)
|
||||||
|
} else {
|
||||||
|
context.assets.open("emoji/$emojiFileName").reader().use { it.readLines() }
|
||||||
|
}
|
||||||
|
return parseLines(emojiLines)
|
||||||
|
}
|
||||||
|
|
||||||
val row = ArrayList<KeyParams>(emojiArray.size)
|
private fun parseLines(lines: List<String>): ArrayList<ArrayList<KeyParams>> {
|
||||||
|
val row = ArrayList<KeyParams>(lines.size)
|
||||||
var currentX = params.mLeftPadding.toFloat()
|
var currentX = params.mLeftPadding.toFloat()
|
||||||
val currentY = params.mTopPadding.toFloat() // no need to ever change, assignment to rows into rows is done in DynamicGridKeyboard
|
val currentY = params.mTopPadding.toFloat() // no need to ever change, assignment to rows into rows is done in DynamicGridKeyboard
|
||||||
|
|
||||||
|
@ -56,8 +63,8 @@ class EmojiParser(private val params: KeyboardParams, private val context: Conte
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
emojiArray.forEachIndexed { i, codeArraySpec ->
|
lines.forEach { line ->
|
||||||
val keyParams = parseEmojiKey(codeArraySpec, popupEmojisArray?.get(i)?.takeIf { it.isNotEmpty() }) ?: return@forEachIndexed
|
val keyParams = parseEmojiKeyNew(line) ?: return@forEach
|
||||||
keyParams.xPos = currentX
|
keyParams.xPos = currentX
|
||||||
keyParams.yPos = currentY
|
keyParams.yPos = currentY
|
||||||
keyParams.mAbsoluteWidth = keyWidth
|
keyParams.mAbsoluteWidth = keyWidth
|
||||||
|
@ -68,44 +75,30 @@ class EmojiParser(private val params: KeyboardParams, private val context: Conte
|
||||||
return arrayListOf(row)
|
return arrayListOf(row)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getLabelAndCode(spec: String): Pair<String, Int>? {
|
private fun parseEmojiKeyNew(line: String): KeyParams? {
|
||||||
val specAndSdk = spec.split("||")
|
if (!line.contains(" ") || params.mId.mElementId == KeyboardId.ELEMENT_EMOJI_CATEGORY10) {
|
||||||
if (specAndSdk.getOrNull(1)?.toIntOrNull()?.let { it > maxSdk } == true) return null
|
// single emoji without popups, or emoticons (there is one that contains space...)
|
||||||
if ("," !in specAndSdk.first()) {
|
return if (!SupportedEmojis.isSupported(line)) null
|
||||||
val code = specAndSdk.first().toIntOrNull(16) ?: return specAndSdk.first() to KeyCode.MULTIPLE_CODE_POINTS // text emojis
|
else KeyParams(line, line.getCode(), null, null, Key.LABEL_FLAGS_FONT_NORMAL, params)
|
||||||
val label = StringUtils.newSingleCodePointString(code)
|
|
||||||
return label to code
|
|
||||||
}
|
}
|
||||||
val labelBuilder = StringBuilder()
|
val split = line.split(" ")
|
||||||
for (codePointString in specAndSdk.first().split(",")) {
|
val label = split.first()
|
||||||
val cp = codePointString.toInt(16)
|
if (!SupportedEmojis.isSupported(label)) return null
|
||||||
labelBuilder.appendCodePoint(cp)
|
val popupKeysSpec = split.drop(1).filter { SupportedEmojis.isSupported(it) }
|
||||||
}
|
.takeIf { it.isNotEmpty() }?.joinToString(",")
|
||||||
return labelBuilder.toString() to KeyCode.MULTIPLE_CODE_POINTS
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun parseEmojiKey(spec: String, popupKeysString: String? = null): KeyParams? {
|
|
||||||
val (label, code) = getLabelAndCode(spec) ?: return null
|
|
||||||
val sb = StringBuilder()
|
|
||||||
popupKeysString?.split(";")?.let { popupKeys ->
|
|
||||||
popupKeys.forEach {
|
|
||||||
val (mkLabel, _) = getLabelAndCode(it) ?: return@forEach
|
|
||||||
sb.append(mkLabel).append(",")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
val popupKeysSpec = if (sb.isNotEmpty()) {
|
|
||||||
sb.deleteCharAt(sb.length - 1)
|
|
||||||
sb.toString()
|
|
||||||
} else null
|
|
||||||
return KeyParams(
|
return KeyParams(
|
||||||
label,
|
label,
|
||||||
code,
|
label.getCode(),
|
||||||
if (popupKeysSpec != null) EMOJI_HINT_LABEL else null,
|
if (popupKeysSpec != null) EMOJI_HINT_LABEL else null,
|
||||||
popupKeysSpec,
|
popupKeysSpec,
|
||||||
Key.LABEL_FLAGS_FONT_NORMAL,
|
Key.LABEL_FLAGS_FONT_NORMAL,
|
||||||
params
|
params
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun String.getCode(): Int =
|
||||||
|
if (StringUtils.codePointCount(this) != 1) KeyCode.MULTIPLE_CODE_POINTS
|
||||||
|
else Character.codePointAt(this, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
const val EMOJI_HINT_LABEL = "◥"
|
const val EMOJI_HINT_LABEL = "◥"
|
||||||
|
|
|
@ -6,6 +6,7 @@ import android.content.Context
|
||||||
import androidx.core.content.edit
|
import androidx.core.content.edit
|
||||||
import helium314.keyboard.keyboard.ColorSetting
|
import helium314.keyboard.keyboard.ColorSetting
|
||||||
import helium314.keyboard.keyboard.KeyboardTheme
|
import helium314.keyboard.keyboard.KeyboardTheme
|
||||||
|
import helium314.keyboard.keyboard.emoji.SupportedEmojis
|
||||||
import helium314.keyboard.keyboard.internal.keyboard_parser.floris.KeyCode.checkAndConvertCode
|
import helium314.keyboard.keyboard.internal.keyboard_parser.floris.KeyCode.checkAndConvertCode
|
||||||
import helium314.keyboard.latin.common.ColorType
|
import helium314.keyboard.latin.common.ColorType
|
||||||
import helium314.keyboard.latin.common.Constants.Separators
|
import helium314.keyboard.latin.common.Constants.Separators
|
||||||
|
@ -52,6 +53,7 @@ class App : Application() {
|
||||||
app = this
|
app = this
|
||||||
Defaults.initDynamicDefaults(this)
|
Defaults.initDynamicDefaults(this)
|
||||||
LayoutUtilsCustom.removeMissingLayouts(this) // only after version upgrade
|
LayoutUtilsCustom.removeMissingLayouts(this) // only after version upgrade
|
||||||
|
SupportedEmojis.load(this)
|
||||||
|
|
||||||
val packageInfo = packageManager.getPackageInfo(packageName, 0)
|
val packageInfo = packageManager.getPackageInfo(packageName, 0)
|
||||||
@Suppress("DEPRECATION")
|
@Suppress("DEPRECATION")
|
||||||
|
|
|
@ -197,6 +197,8 @@ public final class Constants {
|
||||||
public static final int CODE_GRAVE_ACCENT = '`';
|
public static final int CODE_GRAVE_ACCENT = '`';
|
||||||
public static final int CODE_CIRCUMFLEX_ACCENT = '^';
|
public static final int CODE_CIRCUMFLEX_ACCENT = '^';
|
||||||
public static final int CODE_TILDE = '~';
|
public static final int CODE_TILDE = '~';
|
||||||
|
public static final int RECENTS_TEMPLATE_KEY_CODE_0 = 0x30;
|
||||||
|
public static final int RECENTS_TEMPLATE_KEY_CODE_1 = 0x31;
|
||||||
|
|
||||||
public static final String REGEXP_PERIOD = "\\.";
|
public static final String REGEXP_PERIOD = "\\.";
|
||||||
public static final String STRING_SPACE = " ";
|
public static final String STRING_SPACE = " ";
|
||||||
|
|
|
@ -156,7 +156,6 @@ object Defaults {
|
||||||
const val PREF_REMOVE_REDUNDANT_POPUPS = false
|
const val PREF_REMOVE_REDUNDANT_POPUPS = false
|
||||||
const val PREF_SPACE_BAR_TEXT = ""
|
const val PREF_SPACE_BAR_TEXT = ""
|
||||||
const val PREF_TIMESTAMP_FORMAT = "yyyy-MM-dd HH:mm:ss"
|
const val PREF_TIMESTAMP_FORMAT = "yyyy-MM-dd HH:mm:ss"
|
||||||
@JvmField
|
|
||||||
val PREF_EMOJI_MAX_SDK = Build.VERSION.SDK_INT
|
val PREF_EMOJI_MAX_SDK = Build.VERSION.SDK_INT
|
||||||
const val PREF_EMOJI_RECENT_KEYS = ""
|
const val PREF_EMOJI_RECENT_KEYS = ""
|
||||||
const val PREF_LAST_SHOWN_EMOJI_CATEGORY_PAGE_ID = 0
|
const val PREF_LAST_SHOWN_EMOJI_CATEGORY_PAGE_ID = 0
|
||||||
|
|
|
@ -145,7 +145,6 @@ public class SettingsValues {
|
||||||
public final SettingsValuesForSuggestion mSettingsValuesForSuggestion;
|
public final SettingsValuesForSuggestion mSettingsValuesForSuggestion;
|
||||||
public final boolean mIncognitoModeEnabled;
|
public final boolean mIncognitoModeEnabled;
|
||||||
public final boolean mLongPressSymbolsForNumpad;
|
public final boolean mLongPressSymbolsForNumpad;
|
||||||
public final int mEmojiMaxSdk;
|
|
||||||
|
|
||||||
// User-defined colors
|
// User-defined colors
|
||||||
public final Colors mColors;
|
public final Colors mColors;
|
||||||
|
@ -287,7 +286,6 @@ public class SettingsValues {
|
||||||
mAlphaAfterNumpadAndSpace = prefs.getBoolean(Settings.PREF_ABC_AFTER_NUMPAD_SPACE, Defaults.PREF_ABC_AFTER_NUMPAD_SPACE);
|
mAlphaAfterNumpadAndSpace = prefs.getBoolean(Settings.PREF_ABC_AFTER_NUMPAD_SPACE, Defaults.PREF_ABC_AFTER_NUMPAD_SPACE);
|
||||||
mRemoveRedundantPopups = prefs.getBoolean(Settings.PREF_REMOVE_REDUNDANT_POPUPS, Defaults.PREF_REMOVE_REDUNDANT_POPUPS);
|
mRemoveRedundantPopups = prefs.getBoolean(Settings.PREF_REMOVE_REDUNDANT_POPUPS, Defaults.PREF_REMOVE_REDUNDANT_POPUPS);
|
||||||
mSpaceBarText = prefs.getString(Settings.PREF_SPACE_BAR_TEXT, Defaults.PREF_SPACE_BAR_TEXT);
|
mSpaceBarText = prefs.getString(Settings.PREF_SPACE_BAR_TEXT, Defaults.PREF_SPACE_BAR_TEXT);
|
||||||
mEmojiMaxSdk = prefs.getInt(Settings.PREF_EMOJI_MAX_SDK, Defaults.PREF_EMOJI_MAX_SDK);
|
|
||||||
mFontSizeMultiplier = prefs.getFloat(Settings.PREF_FONT_SCALE, Defaults.PREF_FONT_SCALE);
|
mFontSizeMultiplier = prefs.getFloat(Settings.PREF_FONT_SCALE, Defaults.PREF_FONT_SCALE);
|
||||||
mFontSizeMultiplierEmoji = prefs.getFloat(Settings.PREF_EMOJI_FONT_SCALE, Defaults.PREF_EMOJI_FONT_SCALE);
|
mFontSizeMultiplierEmoji = prefs.getFloat(Settings.PREF_EMOJI_FONT_SCALE, Defaults.PREF_EMOJI_FONT_SCALE);
|
||||||
mEmojiKeyFit = prefs.getBoolean(Settings.PREF_EMOJI_KEY_FIT, Defaults.PREF_EMOJI_KEY_FIT);
|
mEmojiKeyFit = prefs.getBoolean(Settings.PREF_EMOJI_KEY_FIT, Defaults.PREF_EMOJI_KEY_FIT);
|
||||||
|
|
|
@ -13,6 +13,7 @@ import androidx.compose.ui.platform.LocalContext
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import helium314.keyboard.dictionarypack.DictionaryPackConstants
|
import helium314.keyboard.dictionarypack.DictionaryPackConstants
|
||||||
import helium314.keyboard.keyboard.KeyboardSwitcher
|
import helium314.keyboard.keyboard.KeyboardSwitcher
|
||||||
|
import helium314.keyboard.keyboard.emoji.SupportedEmojis
|
||||||
import helium314.keyboard.latin.R
|
import helium314.keyboard.latin.R
|
||||||
import helium314.keyboard.latin.checkVersionUpgrade
|
import helium314.keyboard.latin.checkVersionUpgrade
|
||||||
import helium314.keyboard.latin.common.FileUtils
|
import helium314.keyboard.latin.common.FileUtils
|
||||||
|
@ -166,6 +167,7 @@ fun BackupRestorePreference(setting: Setting) {
|
||||||
LayoutUtilsCustom.onLayoutFileChanged()
|
LayoutUtilsCustom.onLayoutFileChanged()
|
||||||
LayoutUtilsCustom.removeMissingLayouts(ctx)
|
LayoutUtilsCustom.removeMissingLayouts(ctx)
|
||||||
(ctx.getActivity() as? SettingsActivity)?.prefChanged()
|
(ctx.getActivity() as? SettingsActivity)?.prefChanged()
|
||||||
|
SupportedEmojis.load(ctx)
|
||||||
KeyboardSwitcher.getInstance().setThemeNeedsReload()
|
KeyboardSwitcher.getInstance().setThemeNeedsReload()
|
||||||
}
|
}
|
||||||
Preference(name = setting.title, onClick = { showDialog = true })
|
Preference(name = setting.title, onClick = { showDialog = true })
|
||||||
|
|
|
@ -17,6 +17,7 @@ import androidx.compose.ui.tooling.preview.Preview
|
||||||
import helium314.keyboard.keyboard.KeyboardActionListener
|
import helium314.keyboard.keyboard.KeyboardActionListener
|
||||||
import helium314.keyboard.keyboard.KeyboardLayoutSet
|
import helium314.keyboard.keyboard.KeyboardLayoutSet
|
||||||
import helium314.keyboard.keyboard.KeyboardSwitcher
|
import helium314.keyboard.keyboard.KeyboardSwitcher
|
||||||
|
import helium314.keyboard.keyboard.emoji.SupportedEmojis
|
||||||
import helium314.keyboard.keyboard.internal.keyboard_parser.POPUP_KEYS_ALL
|
import helium314.keyboard.keyboard.internal.keyboard_parser.POPUP_KEYS_ALL
|
||||||
import helium314.keyboard.keyboard.internal.keyboard_parser.POPUP_KEYS_MAIN
|
import helium314.keyboard.keyboard.internal.keyboard_parser.POPUP_KEYS_MAIN
|
||||||
import helium314.keyboard.keyboard.internal.keyboard_parser.POPUP_KEYS_MORE
|
import helium314.keyboard.keyboard.internal.keyboard_parser.POPUP_KEYS_MORE
|
||||||
|
@ -208,6 +209,7 @@ fun createAdvancedSettings(context: Context) = listOf(
|
||||||
) { NextScreenIcon() }
|
) { NextScreenIcon() }
|
||||||
},
|
},
|
||||||
Setting(context, Settings.PREF_EMOJI_MAX_SDK, R.string.prefs_key_emoji_max_sdk) { setting ->
|
Setting(context, Settings.PREF_EMOJI_MAX_SDK, R.string.prefs_key_emoji_max_sdk) { setting ->
|
||||||
|
val ctx = LocalContext.current
|
||||||
SliderPreference(
|
SliderPreference(
|
||||||
name = setting.title,
|
name = setting.title,
|
||||||
key = setting.key,
|
key = setting.key,
|
||||||
|
@ -233,7 +235,10 @@ fun createAdvancedSettings(context: Context) = listOf(
|
||||||
else -> "version unknown"
|
else -> "version unknown"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onConfirmed = { KeyboardSwitcher.getInstance().setThemeNeedsReload() }
|
onConfirmed = {
|
||||||
|
SupportedEmojis.load(ctx)
|
||||||
|
KeyboardSwitcher.getInstance().setThemeNeedsReload()
|
||||||
|
}
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
Setting(context, Settings.PREF_URL_DETECTION, R.string.url_detection_title, R.string.url_detection_summary) {
|
Setting(context, Settings.PREF_URL_DETECTION, R.string.url_detection_title, R.string.url_detection_summary) {
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -19,13 +19,13 @@ jar {
|
||||||
task makeEmoji(type: JavaExec, dependsOn: ['jar']) {
|
task makeEmoji(type: JavaExec, dependsOn: ['jar']) {
|
||||||
main = '-jar'
|
main = '-jar'
|
||||||
args jar.archiveFile.get()
|
args jar.archiveFile.get()
|
||||||
args '-res'
|
args '-assets'
|
||||||
args project.rootProject.project('app').projectDir.path + File.separator + 'src' +
|
args project.rootProject.project('app').projectDir.path + File.separator + 'src' +
|
||||||
File.separator + 'main' + File.separator + 'res'
|
File.separator + 'main' + File.separator + 'assets' + File.separator + 'emoji'
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation "org.jetbrains.kotlin:kotlin-stdlib:2.0.21"
|
implementation "org.jetbrains.kotlin:kotlin-stdlib:2.1.10"
|
||||||
}
|
}
|
||||||
|
|
||||||
java {
|
java {
|
||||||
|
|
|
@ -1,155 +0,0 @@
|
||||||
// SPDX-License-Identifier: GPL-3.0-only
|
|
||||||
|
|
||||||
package com.majeur.inputmethod.tools.emoji
|
|
||||||
|
|
||||||
import com.majeur.inputmethod.tools.emoji.model.EmojiData
|
|
||||||
import com.majeur.inputmethod.tools.emoji.model.EmojiGroup
|
|
||||||
import java.io.*
|
|
||||||
import java.nio.charset.Charset
|
|
||||||
import java.util.jar.JarFile
|
|
||||||
|
|
||||||
class EmojiCategoriesResource(private val jarFile: JarFile) {
|
|
||||||
|
|
||||||
fun writeToAndroidRes(outDir: String?, emojiData: EmojiData, supportData: Map<Int, Int>) {
|
|
||||||
val template = JarUtils.getAndroidResTemplateResource(jarFile)
|
|
||||||
val resourceDir = template.substring(0, template.lastIndexOf('/'))
|
|
||||||
var ps: PrintStream? = null
|
|
||||||
var lnr: LineNumberReader? = null
|
|
||||||
try {
|
|
||||||
ps = if (outDir == null) {
|
|
||||||
System.out
|
|
||||||
} else {
|
|
||||||
val outDir = File(outDir, resourceDir)
|
|
||||||
val outputFile = File(outDir,
|
|
||||||
ANDROID_RES_TEMPLATE.replace(".tmpl", ".xml"))
|
|
||||||
outDir.mkdirs()
|
|
||||||
println("Building android resource file into ${outputFile.absoluteFile}")
|
|
||||||
PrintStream(outputFile, Charset.forName("UTF-8"))
|
|
||||||
}
|
|
||||||
lnr = LineNumberReader(InputStreamReader(JarUtils.openResource(template), Charset.forName("UTF-8")))
|
|
||||||
inflateTemplate(lnr, ps!!, emojiData, supportData)
|
|
||||||
} catch (e: IOException) {
|
|
||||||
throw RuntimeException(e)
|
|
||||||
} finally {
|
|
||||||
JarUtils.close(lnr)
|
|
||||||
JarUtils.close(ps)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Throws(IOException::class)
|
|
||||||
private fun inflateTemplate(reader: LineNumberReader, out: PrintStream,
|
|
||||||
emojis: EmojiData, supportData: Map<Int, Int>) {
|
|
||||||
reader.lines().forEach {
|
|
||||||
when {
|
|
||||||
it.contains(MARK_UNICODE_VER) ->
|
|
||||||
out.println(it.replace(MARK_UNICODE_VER, emojis.unicodeVersion))
|
|
||||||
it.contains(MARK_API_LEVEL) ->
|
|
||||||
out.println(it.replace(MARK_API_LEVEL, supportData.values.maxOrNull().toString()))
|
|
||||||
it.contains(MARK_SMILEYS_AND_EMOTION) ->
|
|
||||||
dumpEmojiSpecs(out, emojis, supportData,EmojiGroup.SMILEYS_AND_EMOTION)
|
|
||||||
it.contains(MARK_PEOPLE_AND_BODY) ->
|
|
||||||
dumpEmojiSpecs(out, emojis, supportData,EmojiGroup.PEOPLE_AND_BODY)
|
|
||||||
it.contains(MARK_ANIMALS_AND_NATURE) ->
|
|
||||||
dumpEmojiSpecs(out, emojis, supportData,EmojiGroup.ANIMALS_AND_NATURE)
|
|
||||||
it.contains(MARK_FOOD_AND_DRINK) ->
|
|
||||||
dumpEmojiSpecs(out, emojis, supportData,EmojiGroup.FOOD_AND_DRINK)
|
|
||||||
it.contains(MARK_TRAVEL_AND_PLACES) ->
|
|
||||||
dumpEmojiSpecs(out, emojis, supportData,EmojiGroup.TRAVEL_AND_PLACES)
|
|
||||||
it.contains(MARK_ACTIVITIES) ->
|
|
||||||
dumpEmojiSpecs(out, emojis, supportData,EmojiGroup.ACTIVITIES)
|
|
||||||
it.contains(MARK_OBJECTS) ->
|
|
||||||
dumpEmojiSpecs(out, emojis, supportData,EmojiGroup.OBJECTS)
|
|
||||||
it.contains(MARK_SYMBOLS) ->
|
|
||||||
dumpEmojiSpecs(out, emojis, supportData,EmojiGroup.SYMBOLS)
|
|
||||||
it.contains(MARK_FLAGS) ->
|
|
||||||
dumpEmojiSpecs(out, emojis, supportData,EmojiGroup.FLAGS)
|
|
||||||
it.contains(MARK_PEOPLE_AND_BODY_MORE) ->
|
|
||||||
dumpEmojiSpecsVariant(out, emojis, supportData,EmojiGroup.PEOPLE_AND_BODY)
|
|
||||||
else -> out.println(it)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun dumpEmojiSpecs(out: PrintStream, emojiData: EmojiData, supportData: Map<Int, Int>,
|
|
||||||
group: EmojiGroup) {
|
|
||||||
emojiData[group].forEach { emoji ->
|
|
||||||
val minApi = getMinApi(emoji.codes, supportData)
|
|
||||||
if (minApi < 0) {
|
|
||||||
// We have no clue of which android version supports this emoji,
|
|
||||||
// so we ignore it.
|
|
||||||
printCompatNotFound(emoji.codes)
|
|
||||||
return@forEach
|
|
||||||
}
|
|
||||||
val text = makeEmojiKey(emoji.codes, minApi)
|
|
||||||
out.println(" <item>$text</item>")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun dumpEmojiSpecsVariant(out: PrintStream, emojiData: EmojiData, supportData: Map<Int, Int>,
|
|
||||||
group: EmojiGroup) {
|
|
||||||
emojiData[group].forEach { baseEmoji ->
|
|
||||||
val minApi = getMinApi(baseEmoji.codes, supportData)
|
|
||||||
if (minApi < 0) {
|
|
||||||
// Same thing, we already encountered it when dumping base emoji,
|
|
||||||
// ignoring this one silently.
|
|
||||||
return@forEach
|
|
||||||
}
|
|
||||||
|
|
||||||
val text = baseEmoji.variants.filter { emoji ->
|
|
||||||
if (getMinApi(emoji.codes, supportData) < 0) {
|
|
||||||
// Again
|
|
||||||
printCompatNotFound(emoji.codes)
|
|
||||||
return@filter false
|
|
||||||
}
|
|
||||||
true
|
|
||||||
}.map { emoji ->
|
|
||||||
// Not very efficient, minApi is accessed twice,
|
|
||||||
// but hey, we are making tooling here
|
|
||||||
makeEmojiKey(emoji.codes, getMinApi(emoji.codes, supportData))
|
|
||||||
}.filter { key ->
|
|
||||||
key.isNotBlank()
|
|
||||||
}.joinToString(separator = ";")
|
|
||||||
|
|
||||||
if (text.isNotBlank()) out.println(" <item>$text</item>")
|
|
||||||
else out.println(" <item/>")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun makeEmojiKey(codes: IntArray, minApi: Int): String {
|
|
||||||
val cps = codes
|
|
||||||
.joinToString(separator = ",") {
|
|
||||||
it.toString(radix = 16)
|
|
||||||
.uppercase()
|
|
||||||
}
|
|
||||||
return if (minApi > 21) "$cps||$minApi" else cps
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun getMinApi(codes: IntArray, supportData: Map<Int, Int>): Int {
|
|
||||||
val hash = codes
|
|
||||||
.joinToString(separator = "")
|
|
||||||
.hashCode()
|
|
||||||
return supportData[hash] ?: -1
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun printCompatNotFound(codes: IntArray) {
|
|
||||||
val formattedCps = codes.joinToString(" ") { "U+" + it.toString(radix = 16).uppercase() }
|
|
||||||
println(" - No android compatibility found for emoji $formattedCps, ignoring...")
|
|
||||||
}
|
|
||||||
|
|
||||||
companion object {
|
|
||||||
private const val ANDROID_RES_TEMPLATE = "emoji-categories.tmpl"
|
|
||||||
private const val MARK_UNICODE_VER = "@UNICODE_VERSION@"
|
|
||||||
private const val MARK_API_LEVEL = "@ANDROID_API_LEVEL@"
|
|
||||||
private const val MARK_SMILEYS_AND_EMOTION = "@SMILEYS_AND_EMOTION@"
|
|
||||||
private const val MARK_PEOPLE_AND_BODY = "@PEOPLE_AND_BODY@"
|
|
||||||
private const val MARK_PEOPLE_AND_BODY_MORE = "@PEOPLE_AND_BODY MORE@"
|
|
||||||
private const val MARK_ANIMALS_AND_NATURE = "@ANIMALS_AND_NATURE@"
|
|
||||||
private const val MARK_FOOD_AND_DRINK = "@FOOD_AND_DRINKS@"
|
|
||||||
private const val MARK_TRAVEL_AND_PLACES = "@TRAVEL_AND_PLACES@"
|
|
||||||
private const val MARK_ACTIVITIES = "@ACTIVITIES@"
|
|
||||||
private const val MARK_OBJECTS = "@OBJECTS@"
|
|
||||||
private const val MARK_SYMBOLS = "@SYMBOLS@"
|
|
||||||
private const val MARK_FLAGS = "@FLAGS@"
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -2,6 +2,11 @@
|
||||||
|
|
||||||
package com.majeur.inputmethod.tools.emoji
|
package com.majeur.inputmethod.tools.emoji
|
||||||
|
|
||||||
|
import com.majeur.inputmethod.tools.emoji.model.EmojiData
|
||||||
|
import com.majeur.inputmethod.tools.emoji.model.EmojiGroup
|
||||||
|
import com.majeur.inputmethod.tools.emoji.model.EmojiSpec
|
||||||
|
import java.io.File
|
||||||
|
import java.nio.charset.Charset
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import kotlin.system.exitProcess
|
import kotlin.system.exitProcess
|
||||||
|
|
||||||
|
@ -9,9 +14,9 @@ class MakeEmojiKeys {
|
||||||
|
|
||||||
class Options(argsArray: Array<String>) {
|
class Options(argsArray: Array<String>) {
|
||||||
|
|
||||||
private val OPTION_RES = "-res"
|
private val OPTION_ASSETS = "-assets"
|
||||||
|
|
||||||
var resPath: String? = null
|
var assetPath: String? = null
|
||||||
|
|
||||||
init {
|
init {
|
||||||
val args = listOf(*argsArray).toMutableList()
|
val args = listOf(*argsArray).toMutableList()
|
||||||
|
@ -19,8 +24,8 @@ class MakeEmojiKeys {
|
||||||
try {
|
try {
|
||||||
while (args.isNotEmpty()) {
|
while (args.isNotEmpty()) {
|
||||||
arg = args.removeFirst()
|
arg = args.removeFirst()
|
||||||
if (arg == OPTION_RES) {
|
if (arg == OPTION_ASSETS) {
|
||||||
resPath = args.removeFirst()
|
assetPath = args.removeFirst()
|
||||||
} else {
|
} else {
|
||||||
usage("Unknown option: $arg")
|
usage("Unknown option: $arg")
|
||||||
}
|
}
|
||||||
|
@ -32,7 +37,7 @@ class MakeEmojiKeys {
|
||||||
|
|
||||||
fun usage(message: String?) {
|
fun usage(message: String?) {
|
||||||
message?.let { System.err.println(it) }
|
message?.let { System.err.println(it) }
|
||||||
System.err.println("usage: make-emoji-keys $OPTION_RES <res_output_dir>")
|
System.err.println("usage: make-emoji-keys $OPTION_ASSETS <res_output_dir>")
|
||||||
exitProcess(1)
|
exitProcess(1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -51,8 +56,52 @@ class MakeEmojiKeys {
|
||||||
parser2.parse(JarUtils.getEmojiSupportResource(jar))
|
parser2.parse(JarUtils.getEmojiSupportResource(jar))
|
||||||
val supportData = parser2.getParsedData()
|
val supportData = parser2.getParsedData()
|
||||||
|
|
||||||
EmojiCategoriesResource(jar).writeToAndroidRes(options.resPath, emojis, supportData)
|
if (options.assetPath != null) {
|
||||||
|
writeMinApiLevels(options.assetPath!!, emojis, supportData)
|
||||||
|
writeEmojis(options.assetPath!!, emojis)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun writeMinApiLevels(outDir: String, emojiData: EmojiData, supportData: Map<Int, Int>) {
|
||||||
|
val minApiLevels = mutableMapOf<Int, MutableSet<String>>()
|
||||||
|
fun addMinLevel(emoji: EmojiSpec) {
|
||||||
|
val minApi = getMinApi(emoji.codes, supportData)
|
||||||
|
if (minApi < 0)
|
||||||
|
throw Exception("unknown min SDK for ${emoji.name}")
|
||||||
|
if (minApi > 21)
|
||||||
|
minApiLevels.getOrPut(minApi) { mutableSetOf() }.add(emoji.text)
|
||||||
|
}
|
||||||
|
|
||||||
|
EmojiGroup.entries.filterNot { it == EmojiGroup.COMPONENT }.forEach { group ->
|
||||||
|
emojiData[group].forEach { emoji ->
|
||||||
|
addMinLevel(emoji)
|
||||||
|
emoji.variants.forEach { addMinLevel(it) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (minApiLevels.any { it.value.any { it.contains(" ") } })
|
||||||
|
throw Exception("emoji contains space")
|
||||||
|
val text = minApiLevels.map { "${it.key} ${it.value.joinToString(" ")}" }
|
||||||
|
.sorted().joinToString("\n")
|
||||||
|
File(outDir, "minApi.txt").writeText(text, Charset.forName("UTF-8"))
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun writeEmojis(outDir: String, emojiData: EmojiData) {
|
||||||
|
// each category gets a file, one main emoji per line, followed by popups
|
||||||
|
EmojiGroup.entries.filterNot { it == EmojiGroup.COMPONENT }
|
||||||
|
.forEach { writeEmojiGroup(File(outDir, it.name + ".txt"), emojiData[it]) }
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun writeEmojiGroup(outFile: File, emojis: List<EmojiSpec>) {
|
||||||
|
val text = emojis.map { emoji ->
|
||||||
|
if (emoji.variants.isEmpty()) emoji.text
|
||||||
|
else "${emoji.text} ${emoji.variants.joinToString(" ") { it.text }}"
|
||||||
|
}.joinToString("\n")
|
||||||
|
outFile.writeText(text, Charset.forName("UTF-8"))
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getMinApi(codes: IntArray, supportData: Map<Int, Int>): Int {
|
||||||
|
val hash = codes.joinToString("").hashCode()
|
||||||
|
return supportData[hash] ?: -1
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -19,5 +19,7 @@ data class EmojiSpec(val codes: IntArray, val unicodeVer: Float, val name: Strin
|
||||||
return codes contentEquals other.codes
|
return codes contentEquals other.codes
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val text get() = codes.joinToString("") { Character.toString(it) }
|
||||||
|
|
||||||
override fun hashCode() = codes.contentHashCode()
|
override fun hashCode() = codes.contentHashCode()
|
||||||
}
|
}
|
|
@ -1,132 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<!--
|
|
||||||
SPDX-License-Identifier: GPL-3.0-only
|
|
||||||
-->
|
|
||||||
|
|
||||||
<!--
|
|
||||||
|
|
||||||
!!!!! DO NOT EDIT THIS FILE !!!!!
|
|
||||||
|
|
||||||
This file is generated by tools/make-emoji-keys. The base template file is
|
|
||||||
tools/make-emoji-keys/src/main/resources/values/emoji-categories.tmpl
|
|
||||||
|
|
||||||
This file must be updated when any a new release of unicode comes out. Base data
|
|
||||||
can be found at https://unicode.org/Public/emoji/. Table must be defined in
|
|
||||||
tools/make-emoji-keys/src/main/resources/emoji/UNICODE_VERSION/emoji-test.txt.
|
|
||||||
|
|
||||||
To update this file, please run the following commands.
|
|
||||||
$ gradle :tools:make-emoji-keys:makeEmoji
|
|
||||||
|
|
||||||
The updated source file will be generated to the following path (this file).
|
|
||||||
app/src/main/res/values/emoji-categories.xml
|
|
||||||
|
|
||||||
Unicode version @UNICODE_VERSION@.
|
|
||||||
Platform compatibility up to API level @ANDROID_API_LEVEL@.
|
|
||||||
|
|
||||||
-->
|
|
||||||
|
|
||||||
<!-- arrays are used in kbd_emoji_category*.xml, but this is not detected-->
|
|
||||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
|
||||||
|
|
||||||
<array
|
|
||||||
name="emoji_smileys_emotion"
|
|
||||||
format="string" tools:keep="@array/emoji_smileys_emotion">
|
|
||||||
<!-- @SMILEYS_AND_EMOTION@ -->
|
|
||||||
</array>
|
|
||||||
|
|
||||||
<array
|
|
||||||
name="emoji_people_body"
|
|
||||||
format="string" tools:keep="@array/emoji_people_body">
|
|
||||||
<!-- @PEOPLE_AND_BODY@ -->
|
|
||||||
</array>
|
|
||||||
|
|
||||||
<array
|
|
||||||
name="emoji_people_body_more"
|
|
||||||
format="string" tools:keep="@array/emoji_people_body_more">
|
|
||||||
<!-- @PEOPLE_AND_BODY MORE@ -->
|
|
||||||
</array>
|
|
||||||
|
|
||||||
<array
|
|
||||||
name="emoji_animals_nature"
|
|
||||||
format="string" tools:keep="@array/emoji_animals_nature">
|
|
||||||
<!-- @ANIMALS_AND_NATURE@ -->
|
|
||||||
</array>
|
|
||||||
|
|
||||||
<array
|
|
||||||
name="emoji_food_drink"
|
|
||||||
format="string" tools:keep="@array/emoji_food_drink">
|
|
||||||
<!-- @FOOD_AND_DRINKS@ -->
|
|
||||||
</array>
|
|
||||||
|
|
||||||
<array
|
|
||||||
name="emoji_travel_places"
|
|
||||||
format="string" tools:keep="@array/emoji_travel_places">
|
|
||||||
<!-- @TRAVEL_AND_PLACES@ -->
|
|
||||||
</array>
|
|
||||||
|
|
||||||
<array
|
|
||||||
name="emoji_activities"
|
|
||||||
format="string" tools:keep="@array/emoji_activities">
|
|
||||||
<!-- @ACTIVITIES@ -->
|
|
||||||
</array>
|
|
||||||
|
|
||||||
<array
|
|
||||||
name="emoji_objects"
|
|
||||||
format="string" tools:keep="@array/emoji_objects">
|
|
||||||
<!-- @OBJECTS@ -->
|
|
||||||
</array>
|
|
||||||
|
|
||||||
<array
|
|
||||||
name="emoji_symbols"
|
|
||||||
format="string" tools:keep="@array/emoji_symbols">
|
|
||||||
<!-- @SYMBOLS@ -->
|
|
||||||
</array>
|
|
||||||
|
|
||||||
<array
|
|
||||||
name="emoji_flags"
|
|
||||||
format="string" tools:keep="@array/emoji_flags">
|
|
||||||
<!-- @FLAGS@ -->
|
|
||||||
</array>
|
|
||||||
|
|
||||||
<!-- Dummy codeArrays for recents emoji keyboard.
|
|
||||||
Do not remove these keys, because they are used as a template. -->
|
|
||||||
<array
|
|
||||||
name="emoji_recents"
|
|
||||||
format="string" tools:keep="@array/emoji_recents">
|
|
||||||
<!-- These code point should be aligned with {@link RecentsKeyboard#TEMPLATE_KEY_CODE_*. -->
|
|
||||||
<item>30</item>
|
|
||||||
<item>31</item>
|
|
||||||
</array>
|
|
||||||
|
|
||||||
<array
|
|
||||||
name="emoji_emoticons"
|
|
||||||
format="string" tools:keep="@array/emoji_emoticons">
|
|
||||||
<item>:-)</item>
|
|
||||||
<item>;-)</item>
|
|
||||||
<item>:-(</item>
|
|
||||||
<item>:-!</item>
|
|
||||||
<item>:-$</item>
|
|
||||||
<item>B-)</item>
|
|
||||||
<item>=-O</item>
|
|
||||||
<item>:-P</item>
|
|
||||||
<item>:O</item>
|
|
||||||
<item>:-*</item>
|
|
||||||
<item>:-D</item>
|
|
||||||
<item>:\'(</item>
|
|
||||||
<item>:-\\</item>
|
|
||||||
<item>O:-)</item>
|
|
||||||
<item>:-[</item>
|
|
||||||
<item>(╯°</item>
|
|
||||||
<item>□°)</item>
|
|
||||||
<item>╯︵</item>
|
|
||||||
<item>┻━┻</item>
|
|
||||||
<item>¯\\_</item>
|
|
||||||
<item>(ツ)</item>
|
|
||||||
<item>_/¯</item>
|
|
||||||
<item>┬─┬</item>
|
|
||||||
<item>︵ /(</item>
|
|
||||||
<item>.□.\\</item>
|
|
||||||
</array>
|
|
||||||
|
|
||||||
</resources>
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue