diff --git a/app/build.gradle.kts b/app/build.gradle.kts index c7ed8ad2..05f433b4 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -139,6 +139,8 @@ detekt { } dependencies { + + implementation(libs.fossify.commons) implementation(libs.androidx.emoji2.bundled) implementation(libs.androidx.autofill) @@ -146,4 +148,9 @@ dependencies { implementation(libs.bundles.room) ksp(libs.androidx.room.compiler) detektPlugins(libs.compose.detekt) + + implementation (project(":emojipicker")) + } + + diff --git a/app/src/main/kotlin/org/fossify/keyboard/activities/ManageClipboardItemsActivity.kt b/app/src/main/kotlin/org/fossify/keyboard/activities/ManageClipboardItemsActivity.kt index 34e22931..8301cf1f 100644 --- a/app/src/main/kotlin/org/fossify/keyboard/activities/ManageClipboardItemsActivity.kt +++ b/app/src/main/kotlin/org/fossify/keyboard/activities/ManageClipboardItemsActivity.kt @@ -61,10 +61,10 @@ class ManageClipboardItemsActivity : SimpleActivity(), RefreshRecyclerViewListen override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) { super.onActivityResult(requestCode, resultCode, resultData) - if (requestCode == PICK_EXPORT_CLIPS_INTENT && resultCode == Activity.RESULT_OK && resultData != null && resultData.data != null) { + if (requestCode == PICK_EXPORT_CLIPS_INTENT && resultCode == RESULT_OK && resultData != null && resultData.data != null) { val outputStream = contentResolver.openOutputStream(resultData.data!!) exportClipsTo(outputStream) - } else if (requestCode == PICK_IMPORT_CLIPS_SOURCE_INTENT && resultCode == Activity.RESULT_OK && resultData != null && resultData.data != null) { + } else if (requestCode == PICK_IMPORT_CLIPS_SOURCE_INTENT && resultCode == RESULT_OK && resultData != null && resultData.data != null) { val inputStream = contentResolver.openInputStream(resultData.data!!) parseFile(inputStream) } diff --git a/app/src/main/kotlin/org/fossify/keyboard/helpers/OtherInputConnection.kt b/app/src/main/kotlin/org/fossify/keyboard/helpers/OtherInputConnection.kt new file mode 100644 index 00000000..ea70b1ed --- /dev/null +++ b/app/src/main/kotlin/org/fossify/keyboard/helpers/OtherInputConnection.kt @@ -0,0 +1,198 @@ +package org.fossify.keyboard.helpers + +import android.os.Bundle +import android.text.Editable +import android.text.Spanned +import android.text.style.SuggestionSpan +import android.util.Log +import android.view.inputmethod.BaseInputConnection +import android.view.inputmethod.CompletionInfo +import android.view.inputmethod.CorrectionInfo +import android.view.inputmethod.ExtractedText +import android.view.inputmethod.ExtractedTextRequest +import android.widget.SearchView +import android.widget.TextView +import androidx.appcompat.widget.AppCompatAutoCompleteTextView + +/** + * Source: https://stackoverflow.com/a/39460124 + */ +class OtherInputConnection(private val mTextView: AppCompatAutoCompleteTextView?) : BaseInputConnection( + mTextView!!, true +) { + // Keeps track of nested begin/end batch edit to ensure this connection always has a + // balanced impact on its associated TextView. + // A negative value means that this connection has been finished by the InputMethodManager. + private var mBatchEditNesting = 0 + + + override fun getEditable(): Editable? { + val tv = mTextView + + return tv?.editableText + } + + + + override fun beginBatchEdit(): Boolean { + synchronized(this) { + if (mBatchEditNesting >= 0) { + mTextView!!.beginBatchEdit() + mBatchEditNesting++ + return true + } + } + return false + } + + override fun endBatchEdit(): Boolean { + synchronized(this) { + if (mBatchEditNesting > 0) { + // When the connection is reset by the InputMethodManager and reportFinish + // is called, some endBatchEdit calls may still be asynchronously received from the + // IME. Do not take these into account, thus ensuring that this IC's final + // contribution to mTextView's nested batch edit count is zero. + mTextView!!.endBatchEdit() + mBatchEditNesting-- + return true + } + } + return false + } + + //clear the meta key states means shift, alt, ctrl + override fun clearMetaKeyStates(states: Int): Boolean { + val content = editable ?: return false + val kl = mTextView!!.keyListener //listen keyevents like a, enter, space + if (kl != null) { + try { + kl.clearMetaKeyState(mTextView, content, states) + } catch (e: AbstractMethodError) { + // This is an old listener that doesn't implement the + // new method. + } + } + return true + } + + //When a user selects a suggestion from an autocomplete or suggestion list, the input method may call commitCompletion + override fun commitCompletion(text: CompletionInfo): Boolean { + if (DEBUG) Log.v( + TAG, + "commitCompletion $text" + ) + mTextView!!.beginBatchEdit() + mTextView.onCommitCompletion(text) + mTextView.endBatchEdit() + return true + } + + /** + which is used to commit a correction to a previously entered text. + This correction could be suggested by the input method or obtained through some other means. + */ + override fun commitCorrection(correctionInfo: CorrectionInfo): Boolean { + if (DEBUG) Log.v( + TAG, + "commitCorrection$correctionInfo" + ) + mTextView!!.beginBatchEdit() + mTextView.onCommitCorrection(correctionInfo) + mTextView.endBatchEdit() + return true + } + + /* It's used to simulate the action associated with an editor action, typically triggered by pressing the "Done" or "Enter" key on the keyboard.*/ + override fun performEditorAction(actionCode: Int): Boolean { + if (DEBUG) Log.v( + TAG, + "performEditorAction $actionCode" + ) + mTextView!!.onEditorAction(actionCode) + return true + } + +/* + handle actions triggered from the context menu associated with the search text. + This menu typically appears when you long-press on the search text field. +*/ + override fun performContextMenuAction(id: Int): Boolean { + if (DEBUG) Log.v( + TAG, + "performContextMenuAction $id" + ) + mTextView!!.beginBatchEdit() + mTextView.onTextContextMenuItem(id) + mTextView.endBatchEdit() + return true + } + + /*It is used to retrieve information about the currently extracted text + * eg- selected text, the start and end offsets, the total number of characters, and more.*/ + override fun getExtractedText(request: ExtractedTextRequest, flags: Int): ExtractedText? { + if (mTextView != null) { + val et = ExtractedText() + if (mTextView.extractText(request, et)) { + if (flags and GET_EXTRACTED_TEXT_MONITOR != 0) { +// mTextView.setExtracting(request); + } + return et + } + } + return null + } + +// API to send private commands from an input method to its connected editor. This can be used to provide domain-specific features + override fun performPrivateCommand(action: String, data: Bundle): Boolean { + mTextView!!.onPrivateIMECommand(action, data) + return true + } + + //send the text to the connected editor from the keyboard pressed + override fun commitText( + text: CharSequence, + newCursorPosition: Int + ): Boolean { + if (mTextView == null) { + return super.commitText(text, newCursorPosition) + } + if (text is Spanned) { + text.getSpans( + 0, text.length, + SuggestionSpan::class.java + ) + // mIMM.registerSuggestionSpansForNotification(spans); + } + +// mTextView.resetErrorChangedFlag(); + // mTextView.hideErrorIfUnchanged(); + return super.commitText(text, newCursorPosition) + } + + override fun requestCursorUpdates(cursorUpdateMode: Int): Boolean { + if (DEBUG) Log.v( + TAG, + "requestUpdateCursorAnchorInfo $cursorUpdateMode" + ) + + // It is possible that any other bit is used as a valid flag in a future release. + // We should reject the entire request in such a case. + val KNOWN_FLAGS_MASK = CURSOR_UPDATE_IMMEDIATE or CURSOR_UPDATE_MONITOR + val unknownFlags = cursorUpdateMode and KNOWN_FLAGS_MASK.inv() + if (unknownFlags != 0) { + if (DEBUG) { + Log.d( + TAG, + "Rejecting requestUpdateCursorAnchorInfo due to unknown flags. cursorUpdateMode=$cursorUpdateMode unknownFlags=$unknownFlags" + ) + } + return false + } + return false + } + + companion object { + private const val DEBUG = false + private val TAG = "loool" + } +} diff --git a/app/src/main/kotlin/org/fossify/keyboard/interfaces/OnKeyboardActionListener.kt b/app/src/main/kotlin/org/fossify/keyboard/interfaces/OnKeyboardActionListener.kt index 081f3ff2..3f5b77a4 100644 --- a/app/src/main/kotlin/org/fossify/keyboard/interfaces/OnKeyboardActionListener.kt +++ b/app/src/main/kotlin/org/fossify/keyboard/interfaces/OnKeyboardActionListener.kt @@ -6,6 +6,11 @@ import android.view.inputmethod.InputMethodSubtype * The SimpleKeyboardIME class uses this interface to communicate with the input connection */ interface OnKeyboardActionListener { + /* + + called when focus on the searchview */ + fun searchViewFocused(searchView: androidx.appcompat.widget.AppCompatAutoCompleteTextView) + /** * Called when the user presses a key. This is sent before the [.onKey] is called. For keys that repeat, this is only called once. * @param primaryCode the unicode of the key being pressed. If the touch is not on a valid key, the value will be zero. @@ -48,4 +53,5 @@ interface OnKeyboardActionListener { * Called when input method is changed in-app. */ fun changeInputMethod(id: String, subtype: InputMethodSubtype) + fun updateShiftStateToLowercase() } diff --git a/app/src/main/kotlin/org/fossify/keyboard/services/SimpleKeyboardIME.kt b/app/src/main/kotlin/org/fossify/keyboard/services/SimpleKeyboardIME.kt index 8ce056fa..c7a9d019 100644 --- a/app/src/main/kotlin/org/fossify/keyboard/services/SimpleKeyboardIME.kt +++ b/app/src/main/kotlin/org/fossify/keyboard/services/SimpleKeyboardIME.kt @@ -23,6 +23,7 @@ import android.view.inputmethod.EditorInfo.IME_FLAG_NO_ENTER_ACTION import android.view.inputmethod.EditorInfo.IME_MASK_ACTION import android.widget.inline.InlinePresentationSpec import androidx.annotation.RequiresApi +import androidx.appcompat.widget.AppCompatAutoCompleteTextView import androidx.autofill.inline.UiVersions import androidx.autofill.inline.common.ImageViewStyle import androidx.autofill.inline.common.TextViewStyle @@ -44,6 +45,7 @@ import org.fossify.keyboard.extensions.safeStorageContext import org.fossify.keyboard.helpers.* import org.fossify.keyboard.interfaces.OnKeyboardActionListener import org.fossify.keyboard.views.MyKeyboardView +import org.fossify.keyboard.views.MyKeyboardView.Companion.searching import java.io.ByteArrayOutputStream import java.util.Locale @@ -72,6 +74,7 @@ class SimpleKeyboardIME : InputMethodService(), OnKeyboardActionListener, Shared private var enterKeyType = IME_ACTION_NONE private var switchToLetters = false private var breakIterator: BreakIterator? = null + private var otherInputConnection:OtherInputConnection? = null private lateinit var binding: KeyboardViewKeyboardBinding @@ -101,6 +104,11 @@ class SimpleKeyboardIME : InputMethodService(), OnKeyboardActionListener, Shared } } + override fun searchViewFocused(popupToolbarEditText: AppCompatAutoCompleteTextView) { + otherInputConnection = OtherInputConnection(popupToolbarEditText) + + } + override fun onPress(primaryCode: Int) { if (primaryCode != 0) { keyboardView?.vibrateIfNeeded() @@ -126,9 +134,11 @@ class SimpleKeyboardIME : InputMethodService(), OnKeyboardActionListener, Shared return } + + val editorInfo = currentInputEditorInfo if (config.enableSentencesCapitalization && editorInfo != null && editorInfo.inputType != TYPE_NULL) { - if (currentInputConnection.getCursorCapsMode(editorInfo.inputType) != 0) { + if (currentInputConnection.getCursorCapsMode(editorInfo.inputType) != 0 && !searching) { keyboard?.setShifted(ShiftState.ON_ONE_CHAR) keyboardView?.invalidateAllKeys() return @@ -171,7 +181,7 @@ class SimpleKeyboardIME : InputMethodService(), OnKeyboardActionListener, Shared } override fun onKey(code: Int) { - val inputConnection = currentInputConnection + val inputConnection = getMyCurrentInputConnection() if (keyboard == null || inputConnection == null) { return } @@ -305,6 +315,7 @@ class SimpleKeyboardIME : InputMethodService(), OnKeyboardActionListener, Shared else -> { inputConnection.commitText(codeChar.toString(), 1) updateShiftKeyState() + } } } @@ -360,7 +371,9 @@ class SimpleKeyboardIME : InputMethodService(), OnKeyboardActionListener, Shared } override fun onText(text: String) { - currentInputConnection?.commitText(text, 1) + getMyCurrentInputConnection().commitText(text, 1) + +// currentInputConnection?.commitText(text, 1) } override fun reloadKeyboard() { @@ -377,6 +390,10 @@ class SimpleKeyboardIME : InputMethodService(), OnKeyboardActionListener, Shared } } + override fun updateShiftStateToLowercase() { + updateShiftKeyState() + } + private fun createNewKeyboard(): MyKeyboard { val keyboardXml = when (inputTypeClass) { TYPE_CLASS_NUMBER -> { @@ -582,4 +599,19 @@ class SimpleKeyboardIME : InputMethodService(), OnKeyboardActionListener, Shared return Icon.createWithData(byteArray, 0, byteArray.size) } + + + fun getMyCurrentInputConnection():InputConnection{ + + if (searching){ + if(otherInputConnection==null){ + return currentInputConnection + }else{ + return otherInputConnection!! + } + + }else{ + return currentInputConnection + } + } } diff --git a/app/src/main/kotlin/org/fossify/keyboard/views/MyKeyboardView.kt b/app/src/main/kotlin/org/fossify/keyboard/views/MyKeyboardView.kt index 534bc7c7..1999f103 100644 --- a/app/src/main/kotlin/org/fossify/keyboard/views/MyKeyboardView.kt +++ b/app/src/main/kotlin/org/fossify/keyboard/views/MyKeyboardView.kt @@ -23,6 +23,9 @@ import android.os.Build import android.os.Handler import android.os.Looper import android.os.Message +import android.text.Editable +import android.text.SpannableStringBuilder +import android.text.TextWatcher import android.util.AttributeSet import android.util.TypedValue import android.view.Gravity @@ -33,20 +36,21 @@ import android.view.View import android.view.ViewConfiguration import android.view.animation.AccelerateInterpolator import android.view.inputmethod.EditorInfo -import android.widget.ImageButton +import android.widget.EditText import android.widget.LinearLayout import android.widget.PopupWindow +import android.widget.SearchView import android.widget.TextView import android.widget.inline.InlineContentView +import androidx.annotation.ColorInt import androidx.annotation.RequiresApi import androidx.core.animation.doOnEnd import androidx.core.animation.doOnStart +import androidx.core.graphics.drawable.DrawableCompat import androidx.core.view.ViewCompat -import androidx.core.view.children import androidx.core.view.updateMarginsRelative import androidx.emoji2.text.EmojiCompat -import androidx.emoji2.text.EmojiCompat.EMOJI_SUPPORTED -import androidx.recyclerview.widget.GridLayoutManager.SpanSizeLookup +import com.rishabh.emojipicker.EmojiPickedFromSuggestion import org.fossify.commons.extensions.adjustAlpha import org.fossify.commons.extensions.applyColorFilter import org.fossify.commons.extensions.beGone @@ -71,8 +75,6 @@ import org.fossify.keyboard.R import org.fossify.keyboard.activities.ManageClipboardItemsActivity import org.fossify.keyboard.activities.SettingsActivity import org.fossify.keyboard.adapters.ClipsKeyboardAdapter -import org.fossify.keyboard.adapters.EmojisAdapter -import org.fossify.keyboard.databinding.ItemEmojiCategoryBinding import org.fossify.keyboard.databinding.KeyboardKeyPreviewBinding import org.fossify.keyboard.databinding.KeyboardPopupKeyboardBinding import org.fossify.keyboard.databinding.KeyboardViewKeyboardBinding @@ -84,11 +86,8 @@ import org.fossify.keyboard.extensions.getCurrentVoiceInputMethod import org.fossify.keyboard.extensions.getKeyboardBackgroundColor import org.fossify.keyboard.extensions.getStrokeColor import org.fossify.keyboard.extensions.isDeviceLocked -import org.fossify.keyboard.extensions.onScroll import org.fossify.keyboard.extensions.safeStorageContext import org.fossify.keyboard.helpers.AccessHelper -import org.fossify.keyboard.helpers.EMOJI_SPEC_FILE_PATH -import org.fossify.keyboard.helpers.EmojiData import org.fossify.keyboard.helpers.LANGUAGE_TURKISH_Q import org.fossify.keyboard.helpers.LANGUAGE_VIETNAMESE_TELEX import org.fossify.keyboard.helpers.LANGUAGE_VN_TELEX @@ -101,11 +100,8 @@ import org.fossify.keyboard.helpers.MyKeyboard.Companion.KEYCODE_MODE_CHANGE import org.fossify.keyboard.helpers.MyKeyboard.Companion.KEYCODE_SHIFT import org.fossify.keyboard.helpers.MyKeyboard.Companion.KEYCODE_SPACE import org.fossify.keyboard.helpers.MyKeyboard.Companion.KEYCODE_SYMBOLS_MODE_CHANGE -import org.fossify.keyboard.helpers.RECENTLY_USED_EMOJIS import org.fossify.keyboard.helpers.ShiftState import org.fossify.keyboard.helpers.cachedVNTelexData -import org.fossify.keyboard.helpers.getCategoryIconRes -import org.fossify.keyboard.helpers.parseRawEmojiSpecsFile import org.fossify.keyboard.helpers.parseRawJsonSpecsFile import org.fossify.keyboard.interfaces.OnKeyboardActionListener import org.fossify.keyboard.interfaces.RefreshClipsListener @@ -114,6 +110,7 @@ import org.fossify.keyboard.models.ClipsSectionLabel import org.fossify.keyboard.models.ListItem import java.util.Arrays import java.util.Locale +import kotlin.toString @SuppressLint("UseCompatLoadingForDrawables", "ClickableViewAccessibility") class MyKeyboardView @JvmOverloads constructor( @@ -130,6 +127,8 @@ class MyKeyboardView @JvmOverloads constructor( } } + + private var keyboardPopupBinding: KeyboardPopupKeyboardBinding? = null private var keyboardViewBinding: KeyboardViewKeyboardBinding? = null @@ -229,6 +228,9 @@ class MyKeyboardView @JvmOverloads constructor( private var mHandler: Handler? = null + private var stopTextWatcherTopPopupSearchView = true + + companion object { private const val NOT_A_KEY = -1 private val LONG_PRESSABLE_STATE_SET = intArrayOf(R.attr.state_long_pressable) @@ -240,6 +242,12 @@ class MyKeyboardView @JvmOverloads constructor( private const val REPEAT_INTERVAL = 50 // ~20 keys per second private const val REPEAT_START_DELAY = 400 private val LONGPRESS_TIMEOUT = ViewConfiguration.getLongPressTimeout() + + + var typeTextInSearchView:String = "" + + /*it assign the imputmethod to the default one and remove from the keybaord*/ + var searching:Boolean = false } init { @@ -338,6 +346,9 @@ class MyKeyboardView @JvmOverloads constructor( closeClipboardManager() removeMessages() + keyboardViewBinding?.topPopupSearchBarToolbar?.beGone() + keyboardViewBinding?.emojiSearchView?.beVisible() + keyboardViewBinding?.searchResultEmojiPickerView?.beGone() mKeyboard = keyboard val keys = mKeyboard!!.mKeys mKeys = keys!!.toMutableList() as ArrayList @@ -360,7 +371,7 @@ class MyKeyboardView @JvmOverloads constructor( /** Sets the top row above the keyboard containing a couple buttons and the clipboard **/ fun setKeyboardHolder(binding: KeyboardViewKeyboardBinding) { keyboardViewBinding = binding.apply { - mToolbarHolder = toolbarHolder + mToolbarHolder = settingsCliboardToolbarHolder mClipboardManagerHolder = clipboardManagerHolder mEmojiPaletteHolder = emojiPaletteHolder @@ -414,8 +425,12 @@ class MyKeyboardView @JvmOverloads constructor( binding.suggestionsHolder.removeOnLayoutChangeListener(this) } }) + } + + + val clipboardManager = (context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager) clipboardManager.addPrimaryClipChangedListener { @@ -445,6 +460,130 @@ class MyKeyboardView @JvmOverloads constructor( closeEmojiPalette() } } + + } + + + + + @SuppressLint("NotifyDataSetChanged") + fun onEmojiSearchViewOperation() { + keyboardViewBinding?.emojiSearchView?.setOnQueryTextListener(null) + + keyboardViewBinding?.emojiSearchView?.setOnQueryTextFocusChangeListener { v, hasFocus -> + if (hasFocus) { + keyboardViewBinding?.apply { + + topPopupSearchBarToolbar.beVisible() + stopTextWatcherTopPopupSearchView = true + topPopupSearchBar.text = SpannableStringBuilder(emojiSearchView.query.toString()) + stopTextWatcherTopPopupSearchView = false + settingsCliboardToolbarHolder.beGone() + emojiSearchView.beGone() + + searching = true + mOnKeyboardActionListener?.updateShiftStateToLowercase() + emojiSearchView.clearFocus() + topPopupSearchBar.requestFocus() + //to connect with otherInputConnection + mOnKeyboardActionListener?.searchViewFocused(topPopupSearchBar) + + + + + + + searchResultEmojiPickerView.beVisible() + emojiPaletteHolder.beGone() + + /*It's s interface it runn when someone picked ffrom the emoji search result suggestion*/ + val mainRecentProvider = keyboardViewBinding!!.emojiPickerView.getRecentEmojiProvider() + val emojipickedFromSuggestion: EmojiPickedFromSuggestion = + object : EmojiPickedFromSuggestion { + override fun pickedEmoji(emoji: String) { + searching = false + mOnKeyboardActionListener?.onText(emoji) + mainRecentProvider!!.recordSelection(emoji) + searching = true + + + } + } + + // searchResultEmojiPickerView.build(mTextColor) {}//all the emoji is loaded + + keyboardViewBinding!!.searchResultEmojiPickerView.setRecentEmojiProvider(mainRecentProvider!!) + keyboardViewBinding!!.emojiPickerView.setRecentEmojiProvider(mainRecentProvider) + searchResultEmojiPickerView.build(mTextColor) { + searchResultEmojiPickerView.usedInSearchResult = true + + + searchResultEmojiPickerView.emojiPickedFromSuggestion = (emojipickedFromSuggestion) + + + searchResultEmojiPickerView.emojiPickerItems = searchResultEmojiPickerView.buildEmojiPickerItems(true) + searchResultEmojiPickerView.bodyAdapter.hideTitleAndEmptyHint = true + searchResultEmojiPickerView.bodyAdapter.notifyDataSetChanged() + + + } + + + + + + topPopupSearchBar.hint = resources.getString(R.string.search_emoji) + + + } + + } + } + + keyboardViewBinding?.apply { + //clear the variable in the SimpleKeyhoardIME that holds keyboards typing + popupToolbarCross.setOnClickListener(OnClickListener { + stopTextWatcherTopPopupSearchView = true + topPopupSearchBar.setText("") + stopTextWatcherTopPopupSearchView = false + typeTextInSearchView = "" + }) + + //on backpressed + topPopupSearchBarBack.setOnClickListener { + + settingsCliboardToolbarHolder.beVisible() + searching = false + it.clearFocus() + topPopupSearchBarToolbar.beGone() + emojiSearchView.beVisible() + searchResultEmojiPickerView.beGone() + emojiPaletteHolder.beVisible() + + } + + + //on realtime show emoji when typed + var beforeTextEndPosition = 0 + + + val textWatcher = object : TextWatcher { + override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { beforeTextEndPosition = start } + + override fun onTextChanged(editable: CharSequence?, start: Int, before: Int, count: Int) {} + + override fun afterTextChanged(editable: Editable?) { + if(!stopTextWatcherTopPopupSearchView) { + searchResultEmojiPickerView.emojiPickerItems = searchResultEmojiPickerView!!.buildEmojiPickerItems(false, editable.toString()) + searchResultEmojiPickerView!!.bodyAdapter.notifyDataSetChanged() + } + } + } + + // Attach the TextWatcher initially + + topPopupSearchBar.addTextChangedListener(textWatcher) + } } fun setEditorInfo(editorInfo: EditorInfo) { @@ -1643,6 +1782,27 @@ class MyKeyboardView @JvmOverloads constructor( emojiPaletteHolder.background = ColorDrawable(backgroundColor) emojiPaletteClose.applyColorFilter(textColor) emojiPaletteLabel.setTextColor(textColor) + // Get the internal EditText (works on all AOSP devices) + val searchEditTextId = emojiSearchView.context.resources + .getIdentifier("search_src_text", "id", "android") + + val searchEditText = emojiSearchView.findViewById(searchEditTextId) + + searchEditText?.setTextColor(textColor) + searchEditText?.setHintTextColor(textColor) + + tintSearchViewUnderline(emojiSearchView, textColor) + + topPopupSearchBarToolbar.background = ColorDrawable(toolbarColor) + topPopupSearchBarBack.applyColorFilter(mTextColor) + topPopupSearchBar.setTextColor(mTextColor) + popupSearchIcon.applyColorFilter(mTextColor) + popupToolbarCross.applyColorFilter(mTextColor) + topPopupSearchBar.setHintTextColor(mTextColor) + + + + emojiPaletteBottomBar.background = ColorDrawable(toolbarColor) emojiPaletteModeChange.apply { @@ -1682,40 +1842,67 @@ class MyKeyboardView @JvmOverloads constructor( } } - setupEmojis() + keyboardViewBinding!!.emojiPickerView.build(mTextColor){} + } + + fun tintSearchViewUnderline(searchView: SearchView, @ColorInt color: Int) { + searchView.post { + val res = searchView.context.resources + + + val id = res.getIdentifier("search_plate", "id", "android") + if (id != 0) { + val view = searchView.findViewById(id) + view?.background?.let { bg -> + val wrapped = DrawableCompat.wrap(bg.mutate()) + DrawableCompat.setTint(wrapped, color) + view.background = wrapped + } + } + + } } fun openEmojiPalette() { keyboardViewBinding!!.emojiPaletteHolder.beVisible() keyboardViewBinding!!.suggestionsHolder.beGone() - setupEmojis() + keyboardViewBinding!!.suggestionsHolder.beGone() + + keyboardViewBinding!!.emojiSearchView.onActionViewExpanded() + keyboardViewBinding!!.emojiSearchView.clearFocus() +// setupEmojis() + + keyboardViewBinding!!.emojiPickerView.setOnEmojiPickedListener{ + mOnKeyboardActionListener?.onText(it.emoji) + } + onEmojiSearchViewOperation() } private fun closeEmojiPalette() { keyboardViewBinding?.apply { emojiPaletteHolder.beGone() - emojisList.scrollToPosition(0) +// emojisList.scrollToPosition(0) suggestionsHolder.beVisible() } } - private fun setupEmojis() { - ensureBackgroundThread { - val fullEmojiList = parseRawEmojiSpecsFile(context, EMOJI_SPEC_FILE_PATH) - val systemFontPaint = Paint().apply { - typeface = Typeface.DEFAULT - } - - val emojis = fullEmojiList.filter { emoji -> - systemFontPaint.hasGlyph(emoji.emoji) || (EmojiCompat.get().loadState == EmojiCompat.LOAD_STATE_SUCCEEDED && EmojiCompat.get() - .getEmojiMatch(emoji.emoji, emojiCompatMetadataVersion) == EMOJI_SUPPORTED) - } - - Handler(Looper.getMainLooper()).post { - setupEmojiAdapter(emojis) - } - } - } +// private fun setupEmojis() { +// ensureBackgroundThread { +// val fullEmojiList = parseRawEmojiSpecsFile(context, EMOJI_SPEC_FILE_PATH) +// val systemFontPaint = Paint().apply { +// typeface = Typeface.DEFAULT +// } +// +// val emojis = fullEmojiList.filter { emoji -> +// systemFontPaint.hasGlyph(emoji.emoji) || (EmojiCompat.get().loadState == EmojiCompat.LOAD_STATE_SUCCEEDED && EmojiCompat.get() +// .getEmojiMatch(emoji.emoji, emojiCompatMetadataVersion) == EMOJI_SUPPORTED) +// } +// +// Handler(Looper.getMainLooper()).post { +// setupEmojiAdapter(emojis) +// } +// } +// } // For Vietnamese - Telex private fun setupLanguageTelex() { @@ -1724,126 +1911,126 @@ class MyKeyboardView @JvmOverloads constructor( } } - private fun prepareEmojiCategories(emojis: List): Map> { - val recentEmojis = context.config.recentlyUsedEmojis - .mapNotNull { emoji -> - val emojiData = emojis.firstOrNull { it.emoji == emoji } - emojiData?.copy(category = RECENTLY_USED_EMOJIS) - } - - return (recentEmojis + emojis).groupBy { it.category } - } - - private fun prepareEmojiItems(categories: Map>): List { - val emojiItems = mutableListOf() - categories.entries.forEach { (category, emojis) -> - emojiItems.add(EmojisAdapter.Item.Category(category)) - emojiItems.addAll(emojis.map(EmojisAdapter.Item::Emoji)) - } - - return emojiItems - } - - private fun setupEmojiAdapter(emojis: List) { - val emojiCategories = prepareEmojiCategories(emojis) - var emojiItems = prepareEmojiItems(emojiCategories) - - val emojiLayoutManager = AutoGridLayoutManager( - context = context, - itemWidth = context.resources.getDimensionPixelSize(R.dimen.emoji_item_size) - ).apply { - spanSizeLookup = object : SpanSizeLookup() { - override fun getSpanSize(position: Int): Int { - return if (emojiItems[position] is EmojisAdapter.Item.Category) { - spanCount - } else { - 1 - } - } - } - } - - val emojiCategoryIds = mutableMapOf() - val emojiCategoryColor = mTextColor.adjustAlpha(0.8f) - keyboardViewBinding?.emojiCategoriesStrip?.apply { - weightSum = emojiCategories.count().toFloat() - val strip = this - removeAllViews() - emojiCategories.entries.forEach { (category, _) -> - ItemEmojiCategoryBinding.inflate( - LayoutInflater.from(context), - this, - true - ).root.apply { - id = generateViewId() - emojiCategoryIds[id] = category - setImageResource(getCategoryIconRes(category)) - layoutParams = LinearLayout.LayoutParams( - LinearLayout.LayoutParams.MATCH_PARENT, - LinearLayout.LayoutParams.MATCH_PARENT, - 1f - ) - setOnClickListener { - strip.children.filterIsInstance().forEach { - it.applyColorFilter(emojiCategoryColor) - } - applyColorFilter(mPrimaryColor) - keyboardViewBinding?.emojisList?.stopScroll() - emojiLayoutManager.scrollToPositionWithOffset( - emojiItems.indexOfFirst { it is EmojisAdapter.Item.Category && it.value == category }, - 0 - ) - } - applyColorFilter(emojiCategoryColor) - } - } - } - - keyboardViewBinding?.emojisList?.apply { - layoutManager = emojiLayoutManager - adapter = EmojisAdapter(context = safeStorageContext, items = emojiItems) { emoji -> - mOnKeyboardActionListener!!.onText(emoji.emoji) - vibrateIfNeeded() - - context.config.addRecentEmoji(emoji.emoji) - (adapter as? EmojisAdapter)?.apply { - emojiItems = prepareEmojiItems(prepareEmojiCategories(emojis)) - updateItems(emojiItems) - } - } - - clearOnScrollListeners() - onScroll { offset -> - keyboardViewBinding!!.emojiPaletteTopBar.elevation = when { - offset > 4 -> context.resources.getDimensionPixelSize(R.dimen.one_dp).toFloat() - else -> 0f - } - - emojiLayoutManager.findFirstCompletelyVisibleItemPosition() - .also { firstVisibleIndex -> - emojiItems - .withIndex() - .lastOrNull { it.value is EmojisAdapter.Item.Category && it.index <= firstVisibleIndex } - ?.also { activeCategory -> - val id = emojiCategoryIds.entries.first { - it.value == (activeCategory.value as EmojisAdapter.Item.Category).value - }.key - - keyboardViewBinding - ?.emojiCategoriesStrip - ?.children - ?.filterIsInstance() - ?.forEach { button -> - val selected = button.id == id - button.applyColorFilter( - if (selected) mPrimaryColor else emojiCategoryColor - ) - } - } - } - } - } - } +// private fun prepareEmojiCategories(emojis: List): Map> { +// val recentEmojis = context.config.recentlyUsedEmojis +// .mapNotNull { emoji -> +// val emojiData = emojis.firstOrNull { it.emoji == emoji } +// emojiData?.copy(category = RECENTLY_USED_EMOJIS) +// } +// +// return (recentEmojis + emojis).groupBy { it.category } +// } +// +// private fun prepareEmojiItems(categories: Map>): List { +// val emojiItems = mutableListOf() +// categories.entries.forEach { (category, emojis) -> +// emojiItems.add(EmojisAdapter.Item.Category(category)) +// emojiItems.addAll(emojis.map(EmojisAdapter.Item::Emoji)) +// } +// +// return emojiItems +// } +// +// private fun setupEmojiAdapter(emojis: List) { +// val emojiCategories = prepareEmojiCategories(emojis) +// var emojiItems = prepareEmojiItems(emojiCategories) +// +// val emojiLayoutManager = AutoGridLayoutManager( +// context = context, +// itemWidth = context.resources.getDimensionPixelSize(R.dimen.emoji_item_size) +// ).apply { +// spanSizeLookup = object : SpanSizeLookup() { +// override fun getSpanSize(position: Int): Int { +// return if (emojiItems[position] is EmojisAdapter.Item.Category) { +// spanCount +// } else { +// 1 +// } +// } +// } +// } +// +// val emojiCategoryIds = mutableMapOf() +// val emojiCategoryColor = mTextColor.adjustAlpha(0.8f) +// keyboardViewBinding?.emojiCategoriesStrip?.apply { +// weightSum = emojiCategories.count().toFloat() +// val strip = this +// removeAllViews() +// emojiCategories.entries.forEach { (category, _) -> +// ItemEmojiCategoryBinding.inflate( +// LayoutInflater.from(context), +// this, +// true +// ).root.apply { +// id = generateViewId() +// emojiCategoryIds[id] = category +// setImageResource(getCategoryIconRes(category)) +// layoutParams = LinearLayout.LayoutParams( +// LinearLayout.LayoutParams.MATCH_PARENT, +// LinearLayout.LayoutParams.MATCH_PARENT, +// 1f +// ) +// setOnClickListener { +// strip.children.filterIsInstance().forEach { +// it.applyColorFilter(emojiCategoryColor) +// } +// applyColorFilter(mPrimaryColor) +// keyboardViewBinding?.emojisList?.stopScroll() +// emojiLayoutManager.scrollToPositionWithOffset( +// emojiItems.indexOfFirst { it is EmojisAdapter.Item.Category && it.value == category }, +// 0 +// ) +// } +// applyColorFilter(emojiCategoryColor) +// } +// } +// } +// +// keyboardViewBinding?.emojisList?.apply { +// layoutManager = emojiLayoutManager +// adapter = EmojisAdapter(context = safeStorageContext, items = emojiItems) { emoji -> +// mOnKeyboardActionListener!!.onText(emoji.emoji) +// vibrateIfNeeded() +// +// context.config.addRecentEmoji(emoji.emoji) +// (adapter as? EmojisAdapter)?.apply { +// emojiItems = prepareEmojiItems(prepareEmojiCategories(emojis)) +// updateItems(emojiItems) +// } +// } +// +// clearOnScrollListeners() +// onScroll { offset -> +// keyboardViewBinding!!.emojiPaletteTopBar.elevation = when { +// offset > 4 -> context.resources.getDimensionPixelSize(R.dimen.one_dp).toFloat() +// else -> 0f +// } +// +// emojiLayoutManager.findFirstCompletelyVisibleItemPosition() +// .also { firstVisibleIndex -> +// emojiItems +// .withIndex() +// .lastOrNull { it.value is EmojisAdapter.Item.Category && it.index <= firstVisibleIndex } +// ?.also { activeCategory -> +// val id = emojiCategoryIds.entries.first { +// it.value == (activeCategory.value as EmojisAdapter.Item.Category).value +// }.key +// +// keyboardViewBinding +// ?.emojiCategoriesStrip +// ?.children +// ?.filterIsInstance() +// ?.forEach { button -> +// val selected = button.id == id +// button.applyColorFilter( +// if (selected) mPrimaryColor else emojiCategoryColor +// ) +// } +// } +// } +// } +// } +// } private fun closing() { if (mPreviewPopup.isShowing) { diff --git a/app/src/main/res/drawable/search_icon.xml b/app/src/main/res/drawable/search_icon.xml new file mode 100644 index 00000000..d9a7f564 --- /dev/null +++ b/app/src/main/res/drawable/search_icon.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/layout/emoji_list.xml b/app/src/main/res/layout/emoji_list.xml deleted file mode 100644 index 737e2c33..00000000 --- a/app/src/main/res/layout/emoji_list.xml +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/app/src/main/res/layout/keyboard_view_keyboard.xml b/app/src/main/res/layout/keyboard_view_keyboard.xml index 1897354b..1fe1b7fa 100644 --- a/app/src/main/res/layout/keyboard_view_keyboard.xml +++ b/app/src/main/res/layout/keyboard_view_keyboard.xml @@ -5,120 +5,218 @@ android:layout_width="match_parent" android:layout_height="wrap_content"> + + app:layout_constraintEnd_toEndOf="parent"> - + app:layout_constraintEnd_toEndOf="parent" /> - + + android:visibility="gone" + app:layout_constraintBottom_toTopOf="@id/settings_cliboard_toolbar_holder" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toEndOf="parent" > + + + + + + + + + + + + - - + + + + + + + + + + + android:gravity="center_horizontal" + android:orientation="horizontal"> + + + + + + + + - + - + - + - + - + - @@ -127,6 +225,7 @@ style="@style/MyKeyboardView" android:layout_width="match_parent" android:layout_height="0dp" + android:visibility="visible" android:background="@color/theme_dark_background_color" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" @@ -142,7 +241,7 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="@+id/toolbar_holder"> + app:layout_constraintTop_toTopOf="@+id/parentToolbar"> + + + + + + @@ -237,6 +371,7 @@ android:src="@drawable/ic_clear_vector" /> + + app:layout_constraintTop_toTopOf="@+id/parentToolbar"> سجل الحافظة فارغ. بمجرد نسخ بعض النص ، سيظهر هنا. يمكنك أيضًا تثبيت المقاطع حتى لا تختفي لاحقًا. مسح بيانات الحافظة - هل أنت متأكد أنك تريد مسح بيانات الحافظة؟ حالي المثبته أضف عنصرًا جديدًا diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index e6df7fe3..8126af9d 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -6,9 +6,7 @@ Ваш буфер абмену пусты. Калі вы скапіруеце тэкст, ён з\'явіцца тут. Вы таксама можаце замацаваць кліпы, каб яны не зніклі пазней. Ачысціць даныя буфера абмену - Вы ўпэўнены, што хочаце ачысціць даныя буфера абмену\? Буфер абмену - Апошнія Ток Замацаваны Дадайце новы элемент diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index a71c9662..211c64fb 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -6,9 +6,7 @@ Вашият клипборд е празен. След като копирате някакъв текст, той ще се появи тук. Можете също да закачите клипове, за да не изчезнат по-късно. Изчистване на клипборд данните - Сигурни ли сте, че искате да изтриете клипборд данните\? Клипборд - Скорошни Текущо Закачено Добавяне на нов елемент @@ -26,4 +24,4 @@ Език на клавиатурата Височина на клавиатурата Емоджита - \ No newline at end of file + diff --git a/app/src/main/res/values-bqi/strings.xml b/app/src/main/res/values-bqi/strings.xml index 2934d7eb..34be32c0 100644 --- a/app/src/main/res/values-bqi/strings.xml +++ b/app/src/main/res/values-bqi/strings.xml @@ -6,7 +6,6 @@ کیلیپ بورد ایسا پتی هڌ. روفتن داده یل کیلیپ بورد کیلیپ بورد - دیندایی هیم سکویی دیسنیڌه وابیڌه diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 295093a5..2250d9da 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -6,7 +6,6 @@ El porta-retalls està buit. Després de copiar text, es mostrarà aquí. També podeu fixar clips perquè no desapareguin més tard. Neteja les dades del porta-retalls - Esteu segur que voleu netejar les dades del porta-retalls\? Porta-retalls Actual Fixat @@ -29,7 +28,6 @@ Mostra les vores de les tecles Mostra els números en una fila separada Comença les frases amb una lletra majúscula - Recent Fixa el text Emojis Activeu el Fossify Keyboard a la pantalla següent, per a fer-lo disponible. Premeu «Enrere» una vegada activat. diff --git a/app/src/main/res/values-ckb/strings.xml b/app/src/main/res/values-ckb/strings.xml index 29f2fd81..f54509b4 100644 --- a/app/src/main/res/values-ckb/strings.xml +++ b/app/src/main/res/values-ckb/strings.xml @@ -6,9 +6,7 @@ بەشی لەبەرگیراوەکان بەتاڵە. هەرکاتێ نووسینێکت کۆپی کرد بە خۆکاری لێرەدا دەرەکەون، بۆ هێشتنەوە لەبەرگیراوەکان پێویستە جێگیریان بکەیت. سڕینەوەی لەبەرگیراوەکان - ئایا دڵنیایت لە سڕینەوەی لەبەرگیراوەکان؟ لەبەرگیراوەکان - دوایین لەبەرگیراوە لەبەرگیراوەکان جێگیرکراو زیادکردنی نوێ diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 62f55fe6..4d0b5288 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -6,9 +6,7 @@ Vaše schránka je prázdná. Jakmile zkopírujete nějaký text, zobrazí se zde. Výstřižky můžete také připnout, aby později nezmizely. Vyčistit schránku - Opravdu chcete vyčistit data schránky\? Schránka - Nedávné Současná Připnuté Přidat novou položku @@ -46,4 +44,4 @@ Zvířata a příroda Jídlo a pití Věci - \ No newline at end of file + diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 334e6276..e6f71cf4 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -6,7 +6,6 @@ Din udklipsholder er tom. Når du kopierer tekst, vises det her. Du kan også fastgøre udklip, så de ikke forsvinder senere. Ryd data i udklipsholder - Er du sikker på, at du vil slette data i udklipsholderen\? Nuværende Fastgjort Tilføj nyt element @@ -28,7 +27,6 @@ Vis tastegrænser Vis tal i en separat række Emojis - Seneste Enter Mellemrumstast Administrer tastatursprog diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 3fc57999..0f19ba19 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -7,9 +7,7 @@ Ihre Zwischenablage ist leer. Sobald du einen Text kopierst, wird er hier angezeigt. Du kannst auch Clips anheften, damit sie später nicht verschwinden. Daten in der Zwischenablage löschen - Sollen wirklich die Daten in der Zwischenablage gelöscht werden\? Zwischenablage - Neueste Aktuell Angeheftet Ein neues Element hinzufügen @@ -46,4 +44,4 @@ Essen und Trinken Reisen und Orte Flaggen - \ No newline at end of file + diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 0f85380f..4119843f 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -6,9 +6,7 @@ Το πρόχειρό σας είναι άδειο. Μόλις αντιγράψετε κάποιο κείμενο, θα εμφανιστεί εδώ. Μπορείτε επίσης να καρφιτσώσετε κλιπ ώστε να μην εξαφανιστούν αργότερα. Καθαρισμός δεδομένων πρόχειρου - Είστε βέβαιοι ότι θέλετε να διαγράψετε τα δεδομένα του πρόχειρου; Πρόχειρο - Πρόσφατα Τρέχον Καρφιτσωμένα Προσθήκη νέου στοιχείου diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml index d48198c5..29d1109e 100644 --- a/app/src/main/res/values-eo/strings.xml +++ b/app/src/main/res/values-eo/strings.xml @@ -17,9 +17,7 @@ Spacobreta Flagoj Eksporti tondujajn erojn - Ĉu vi certas, ke vi volas forigi la datumojn de la tondujo? Tondujo - Lastatempa Aktuala Aldoni novan eron Vi povas administri aŭ aldoni klipoj ĉi tie por rapida aliro. @@ -46,4 +44,4 @@ Vojaĝo kaj lokoj Objektoj Simboloj - \ No newline at end of file + diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 08ba9e6b..cb90f19e 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -6,9 +6,7 @@ Su portapapeles está vacío. Una vez que copies un texto, aparecerá aquí. También puedes anclar clips para que no desaparezcan después. Borrar los datos del portapapeles - ¿Está seguro de que desea borrar los datos del portapapeles\? Portapapeles - Recientes Actual Fijado Añadir un nuevo elemento diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 3b652c19..128a1a56 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -6,9 +6,7 @@ Lõikelaud on tühi. Kui sa mingi teksti oled kopeerinud, siis on ta siin nähtav. Et kirjed hiljem ei kaoks, siis võid neid ka klammerdada. Kustuta lõikelaua kirjed - Kas sa oled kindel, et soovid kustutada kõik kirjed lõikelaualt\? Lõikelaud - Hiljutine Praegune Klammerdatud Lisa uus kirje @@ -46,4 +44,4 @@ Toit ja jook Reisimine ja kohad Esemed - \ No newline at end of file + diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 0a34336d..7072003f 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -7,9 +7,7 @@ Zure arbela hutsik dago. Behin testua kopiatuta, bertan agertuko da. Klipak ere jar ditzakezu, gero ez desagertzeko. Garbitu arbeleko datuak - Seguru zaude arbeleko datuak garbitu nahi dituzula? Arbela - Azken aldikoak Unekoa Finkatua Gehitu elementu berri bat diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index f5b602a3..11ca732f 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -6,9 +6,7 @@ Leikepöytä on tyhjä. Kun kopioit tekstiä, se näkyy tässä. Voit myös kiinnittää leikkeitä, jotta ne eivät katoa myöhemmin. Tyhjennä leikepöydän tiedot - Haluatko varmasti tyhjentää leikepöydän tiedot\? Leikepöytä - Viimeisimmät Nykyinen Kiinnitetty Lisää uusi kohde @@ -46,4 +44,4 @@ Liput Puheella kirjoittaminen Vaihda puhekirjoitukseen - \ No newline at end of file + diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 00c1a364..5a52cbd1 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -6,9 +6,7 @@ Votre presse-papiers est vide. Lorsque vous copiez du texte, il s\'affiche ici. Vous pouvez également épingler des copies pour qu’elles ne disparaissent pas plus tard. Effacer les données du presse-papiers - Voulez-vous vraiment effacer les données du presse-papiers \? Presse-papiers - Récent Actuel Épinglé Ajouter un nouvel élément diff --git a/app/src/main/res/values-ga/strings.xml b/app/src/main/res/values-ga/strings.xml index 5af81477..74e92748 100644 --- a/app/src/main/res/values-ga/strings.xml +++ b/app/src/main/res/values-ga/strings.xml @@ -9,9 +9,7 @@ Bainistigh míreanna gearrthaisce Tá do ghearrthaisce folamh. Nuair a chóipeálann tú roinnt téacs, taispeánfar anseo é. Is féidir leat gearrthóga bioráin freisin ionas nach n-imeoidh siad níos déanaí. - An bhfuil tú cinnte go bhfuil fonn ort sonraí na gearrthaisce a ghlanadh? Gearrthaisce - Le déanaí Reatha Pinned Cuir mír nua leis @@ -46,4 +44,4 @@ Bratacha Modh clóscríofa gutha Athraigh go clóscríobh gutha - \ No newline at end of file + diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index d0633526..01ede376 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -6,7 +6,6 @@ O teu portapapeis está baleiro. Despois de copiar algún texto, mostrarase aquí. Tamén pode fixar clips para que non desaparezan máis tarde. Borrar os datos do portapapeis - Atoposte seguro de borrar os datos do portapapeis\? Actual Fixado Engade un novo elemento @@ -24,7 +23,6 @@ Emoticona Por favor, active Fossify Keyboard na pantalla que segue para facelo dispoñible. Prema «Atrás» tras rematar. Portapapeis - Recentes Xestionar os idiomas do teclado Fixar o texto Exportar os elementos do portapapeis diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index d90725e4..65f5fbcc 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -9,9 +9,7 @@ आपका क्लिपबोर्ड खाली है। कृपया इसे उपलब्ध कीबोर्ड बनाने के लिए अगली स्क्रीन पर फोसिफाई कीबोर्ड सक्षम करें। सक्षम होने पर \'पीछे\' दबाएं। क्लिपबोर्ड डेटा साफ करें - क्या आप वाकई क्लिपबोर्ड डेटा साफ करना चाहते हैं? क्लिपबोर्ड - हालिया मौजूदा आप त्वरित पहुंच के लिए यहां क्लिप प्रबंधित या जोड़ सकते हैं। पिन किया गया @@ -46,4 +44,4 @@ वस्तुएं प्रतीक झंडे - \ No newline at end of file + diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index a4414f94..4d3e228a 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -6,9 +6,7 @@ Tvoj međuspremnik je prazan. Kada kopiraš neki tekst, on će se pojaviti ovdje. Također možeš prikvačiti isječke kako kasnije ne bi nestali. Izbriši podatke međuspremnika - Stvarno želiš izbrisati podatke međuspremnika\? Međuspremnik - Nedavni Aktualni Prikvačeni Dodaj novu stavku @@ -46,4 +44,4 @@ Životinje i priroda Hrana i pića Simboli - \ No newline at end of file + diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index d94b1fe6..318c1247 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -5,9 +5,7 @@ A vágólapja üres. Ha bemásolsz egy szöveget, az itt fog megjelenni. A klipeket is rögzítheted, hogy később ne tűnjenek el. Vágólapadatok törlése - Biztos, hogy törli a vágólapadatokat? Vágólap - Legutóbbi Jelenlegi Kitűzve Új elem hozzáadása @@ -46,4 +44,4 @@ Váltson hangalapú gépelésre Legutóbb használt Billentyűzetnyelvek kezelése - \ No newline at end of file + diff --git a/app/src/main/res/values-ia/strings.xml b/app/src/main/res/values-ia/strings.xml index f9a7e5ae..732e6360 100644 --- a/app/src/main/res/values-ia/strings.xml +++ b/app/src/main/res/values-ia/strings.xml @@ -4,7 +4,6 @@ Gerer le elementos del area de transferentia Tu area de transferentia es vacue. Rader le datos del area de transferentia - Es tu secur que tu vole rader le datos del area de transferentia? Area de transferentia Adder un nove elemento Exportar elementos del area de transferentia @@ -13,6 +12,5 @@ Cambiar le typo de claviero Monstrar contentos del area de transferentia si es disponibile Lingua del claviero - Recentes Actual - \ No newline at end of file + diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index c8c97c07..00fddfde 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -5,9 +5,7 @@ Papan klip Anda kosong. Setelah Anda menyalin teks, itu akan muncul di sini. Anda juga bisa sematkan klip supaya mereka tidak hilang. Hapus data papan klip - Yakin untuk menghapus data papan klip\? Papan klip - Terkini Saat ini Disematkan Tambahkan item baru diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 9bfbc488..7538c6c3 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -6,7 +6,6 @@ Gli appunti sono vuoti. Una volta copiato del testo, verrà mostrato qui. Puoi anche appuntare le clip in modo che non spariscano più tardi. Elimina i dati degli appunti - Vuoi davvero eliminare i dati degli appunti\? Attuale Appuntato Aggiungi un nuovo elemento @@ -31,7 +30,6 @@ Emoji Attiva Tastiera Fossify nella schermata successiva per renderla disponibile. Una volta abilitata, premi \"Indietro\". Appunti - Recente Oggetti Simboli Bandiere @@ -46,4 +44,4 @@ Cibo e bevande Viaggi e luoghi Attività - \ No newline at end of file + diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index 99c23b43..dc8b230b 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -6,9 +6,7 @@ הלוח העתקה שלך ריק. לאחר שתעתיק טקסט, הוא יופיע כאן. תוכל גם להצמיד קטעים כדי שלא ייעלמו אחר כך. נקה את לוח העתקה - האם אתה בטוח שאתה רוצה לנקות את נתוני הלוח\? לוח העתקה - לאחרונה נוכחי מוצמד הוסף פריט חדש diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 5d5b56cf..ad71afad 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -6,9 +6,7 @@ クリップボードが空です。 テキストをコピーすると、ここに表示されます。また、後で消えないように、クリップをピン留めしておけます。 クリップボードデータを削除する - クリップボードのデータをクリアしてもよろしいですか? クリップボード - 最近 現在 ピン留め 新しいアイテムを追加 @@ -46,4 +44,4 @@ オブジェクト シンボル - \ No newline at end of file + diff --git a/app/src/main/res/values-kab/strings.xml b/app/src/main/res/values-kab/strings.xml index 21d3a969..9be0ad75 100644 --- a/app/src/main/res/values-kab/strings.xml +++ b/app/src/main/res/values-kab/strings.xml @@ -4,7 +4,6 @@ Sekcem Nɣel aḍris Anayen - Melmi kan Kkes Anasiw Imujiten diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index f60c5695..9f09de4f 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -3,9 +3,7 @@ 다음 화면에서 Fossify 키보드를 사용 가능한 키보드로 설정하세요. 설정 후 \'뒤로가기\'를 누르세요. 키보드 변경 키보드 - 클립보드 항목을 모두 지우시겠습니까? 클립보드 - 최근 현재 고정됨 새 항목 추가 @@ -36,4 +34,4 @@ 클립보드가 비어있습니다. 복사한 텍스트가 여기에 표시됩니다. 나중에 사라지지 않도록 클립을 고정할 수 있습니다. 음성 입력 - \ No newline at end of file + diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 5ebf4f77..125882ef 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -3,7 +3,6 @@ Klaviatūra Keisti klaviatūrą Valyti iškarpinės duomenis - Ar tikrai norite išvalyti iškarpinės duomenis\? Keisti klaviatūros tipą Jei prieinama, rodyti iškarpinės turinį Tolesniame ekrane įjunkite „Fossify Keyboard“, kad ji taptų pasiekiama klaviatūra. Įjungę spauskite „Atgal“. @@ -11,7 +10,6 @@ Jūsų iškarpinė tuščia. Kai nukopijuosite tekstą, jis bus rodomas čia. Taip pat galite prisegti iškarpas, tad jie vėliau nepradingtų. Iškarpinė - Naujausi Dabartiniai Prisegti Įtraukti naują elementą diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml index f79b1939..c4b7c89f 100644 --- a/app/src/main/res/values-lv/strings.xml +++ b/app/src/main/res/values-lv/strings.xml @@ -6,9 +6,7 @@ Jūsu starpliktuve ir tukša. Šeit parādīsies teksts pēc tam, kad jūs to nokopēsiet. Jūs arī varat piespraust datus, lai nepazaudētu tos. Izdzēst starpliktuves datus - Vai jūs tiešām gribat izdzēst starpliktuves datus\? Starpliktuve - Nesens Pašreizējais Piesprausts Pievienot jaunu datu diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml index 3c62aad5..44c1352a 100644 --- a/app/src/main/res/values-ml/strings.xml +++ b/app/src/main/res/values-ml/strings.xml @@ -6,9 +6,7 @@ നിങ്ങളുടെ ക്ലിപ്പ്ബോർഡ് ശൂന്യമാണ്. നിങ്ങൾ കുറച്ച് വാചകം പകർത്തിക്കഴിഞ്ഞാൽ, അത് ഇവിടെ കാണിക്കും. നിങ്ങൾക്ക് ക്ലിപ്പുകൾ പിൻ ചെയ്യാനും കഴിയും, അതിനാൽ അവ പിന്നീട് അപ്രത്യക്ഷമാകില്ല. ക്ലിപ്പ്ബോർഡ് ഡാറ്റ മായ്‌ക്കുക - ക്ലിപ്പ്ബോർഡ് ഡാറ്റ മായ്‌ക്കണമെന്ന് തീർച്ചയാണോ\? ക്ലിപ്പ്ബോർഡ് - അടുത്തിടെ നിലവിലുള്ളത് പിൻ ചെയ്തു ഒരു പുതിയ ഇനം ചേർക്കുക diff --git a/app/src/main/res/values-night-v31/colors.xml b/app/src/main/res/values-night-v31/colors.xml index 7ac423b4..084bd221 100644 --- a/app/src/main/res/values-night-v31/colors.xml +++ b/app/src/main/res/values-night-v31/colors.xml @@ -1,4 +1,6 @@ @android:color/system_neutral2_900 + @color/theme_light_background_color + diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index dbfb3ef4..c4a6a207 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -6,7 +6,6 @@ Het klembord is leeg. Bij het kopiëren van tekst zal die hier als clip verschijnen. Clips kunnen ook worden vastgezet, zodat ze later niet zullen verdwijnen. Klembord wissen - Klembordgegevens verwijderen\? Klembord Huidig Vastgezet @@ -32,7 +31,6 @@ Schakel Fossify Toetsenbord in bij het hierop volgende scherm om het beschikbaar te maken als toetsenbord. Druk daarna eenmaal op de Terug-knop. Shift Enter - Recent Toetsenbordtalen beheren Spraakgestuurd typen Methode voor spraakgestuurd typen @@ -46,4 +44,4 @@ Recent gebruikt Smileys en emoticons Mens en lichaam - \ No newline at end of file + diff --git a/app/src/main/res/values-pa-rPK/strings.xml b/app/src/main/res/values-pa-rPK/strings.xml index 22102a3d..85540367 100644 --- a/app/src/main/res/values-pa-rPK/strings.xml +++ b/app/src/main/res/values-pa-rPK/strings.xml @@ -6,9 +6,7 @@ کوئی کاپی نہیں اے۔ جدوں کجھ لکھت کاپی کرن، اِتھے ویکھو۔ اِتھے تسی لکھت لگ وی سکدے او تاں جو اوہ بعد وچ غائب نا ہوݨ۔ کاپی کیتے ڈیٹے ہٹاؤ - کیہ تسیں پکے، ہٹ چاہندے او؟ کاپی کیتے - حالیہ موجودہ لگیاں نویں چیز پایو diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index 26e75a64..0b309c06 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -6,9 +6,7 @@ ਤੁਹਾਡਾ ਕਲਿੱਪਬੋਰਡ ਖਾਲੀ ਹੈ। ਇੱਕ ਵਾਰ ਜਦ ਤੁਸੀਂ ਕਿਸੇ ਟੈਕਸਟ ਨੂੰ ਕਾਪੀ ਕਰ ਲੈਂਦੇ ਹੋ, ਤਾਂ ਇਹ ਏਥੇ ਦਿਖਾਈ ਦੇਵੇਗਾ। ਤੁਸੀਂ ਕਲਿੱਪਾਂ ਨੂੰ ਪਿੰਨ ਵੀ ਕਰ ਸਕਦੇ ਹੋ ਤਾਂ ਜੋ ਉਹ ਬਾਅਦ ਵਿੱਚ ਗਾਇਬ ਨਾ ਹੋਣ। ਕਲਿੱਪਬੋਰਡ ਡਾਟਾ ਸਾਫ਼ ਕਰੋ - ਕੀ ਤੁਸੀਂ ਯਕੀਨੀ ਤੌਰ \'ਤੇ ਕਲਿੱਪਬੋਰਡ ਡੇਟਾ ਨੂੰ ਸਾਫ਼ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ\? ਕਲਿੱਪਬੋਰਡ - ਹਾਲ ਹੀ ਮੌਜੂਦਾ ਪਿੰਨ ਕੀਤਾ ਨਵੀਂ ਆਈਟਮ ਸ਼ਾਮਲ ਕਰੋ diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 06f79c5e..70b42e53 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -7,9 +7,7 @@ Twój schowek jest pusty. Gdy skopiujesz jakiś tekst, pojawi się on tutaj. Możesz także przypinać wpisy, aby później nie zniknęły. Wyczyść dane schowka - Czy wyczyścić dane schowka\? Schowek - Ostatnie Bieżący Przypięte Dodaj nowy element @@ -46,4 +44,4 @@ Symbole Flagi Buźki i emocje - \ No newline at end of file + diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 4c32d0e8..34ab89c4 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -6,9 +6,7 @@ Área de transferência vazia. Depois de copiar algum texto, ele aparecerá aqui. Você também pode fixar clipes para que eles não desapareçam mais tarde. Esvaziar área de transferência - Certeza que quer esvaziar a área de transferência? Área de transferência - Recente Atual Fixado Adicionar novo item diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index b895a23d..32fb0c37 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -5,9 +5,7 @@ Limpar área de transferência Eliminar Emojis - Tem a certeza de que pretende limpar a área de transferência? Ative o teclado Fossify no próximo ecrã e defina-o para ser utilizado por omissão. Prima \'Recuar\' assim que o ativar. - Recente Trocar de teclado Gerir itens na área de transferência Atual @@ -46,4 +44,4 @@ Objetos Símbolos Bandeiras - \ No newline at end of file + diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 1c7f35bb..c74bd835 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -6,9 +6,7 @@ Área de transferência vazia. Assim que algum texto for copiado, será mostrado aqui. Pode também fixar entradas para que não desapareçam. Limpar área de transferência - Tem a certeza de que pretende limpar a área de transferência\? Área de transferência - Recente Atual Fixada Adicionar novo item @@ -46,4 +44,4 @@ Atividades Método de introdução por voz Comutar para escrita por voz - \ No newline at end of file + diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 61332326..c75010f6 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -6,7 +6,6 @@ Clipboard-ul dvs. este gol. Odată ce ați copiat un text, acesta va apărea aici. De asemenea, puteți fixa clipuri pentru ca acestea să nu dispară mai târziu. Ștergeți datele din clipboard - Sunteți sigur că doriți să ștergeți datele din clipboard\? Curent Fixat Adăugați un articol nou @@ -25,7 +24,6 @@ Înălțime tastatură Emoticoane Planșa de transfer - Recente Bara de spațiu Începe propozițiile cu o literă mare Arată numerele pe un rând separat @@ -46,4 +44,4 @@ Băuturi și mâncare Activități Steaguri - \ No newline at end of file + diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 62ae4e05..a5ae5083 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -6,9 +6,7 @@ Ваш буфер обмена пуст. Здесь появится текст после того, как вы его скопируете. Вы также можете закрепить любой текст, чтобы он не был удалён автоматически. Очистить данные буфера обмена - Вы уверены, что хотите очистить данные буфера обмена\? Буфер обмена - Недавнее Текущее Закреплено Добавить @@ -46,4 +44,4 @@ Символы Флаги Деятельность - \ No newline at end of file + diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index ef101f6d..6b076e5a 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -6,9 +6,7 @@ Vaša schránka je prázdna. Akonáhle skopírujete nejaký text, objaví sa tu. Budete ho aj môcť pripnúť, aby sa časom nestratil. Vyčistič schránku - Ste si istý, že chcete vyčistiť schránku? Schránka - Nedávne Súčasné Pripnuté Pridať novú položku diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index 3b900c13..9d8f9da8 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -6,9 +6,7 @@ Vaše odložišče je prazno. Skopirano besedilo se bo prikazalo tu. Izrezke lahko tudi pripnete, da pozneje ne bodo izginili. Počisti podatke odložišča - Ali ste prepričani, da želite izbrisati podatke iz odložišča\? Odložišče - Nedavno Trenutno Pripeto Dodaj nov element diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index e4920762..53059be9 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -6,9 +6,7 @@ Ваш међуспремник је празан. Када копирате неки текст, он ће се појавити овде. Такође можете да закачите клипове како касније не би нестали. Обришите податке међумеморије - Да ли сте сигурни да желите да обришете податке из међуспремника\? Цлипбоард - Скорашњи Тренутни Закачен Додајте нову ставку diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 9a826df1..43ed50e0 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -6,9 +6,7 @@ Ditt urklipp är tomt. När du kopierar text visas den här. Du kan också fästa klipp så att de inte försvinner senare. Rensa urklippsdata - Är du säker på att du vill rensa datan från urklippet\? Urklipp - Senaste Nuvarande Fästa Lägg till ett nytt objekt @@ -46,4 +44,4 @@ Föremål Flaggor Aktivera Fossify Keyboard på nästa skärm för att göra tangentbordet tillgängligt. Tryck på \'Tillbaka\' när det har aktiverats. - \ No newline at end of file + diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml index 17a7954d..21d092fa 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -23,7 +23,6 @@ คลิปบอร์ดของคุณว่างอยู่ ล้างข้อมูลคลิปบอร์ด คลิปบอร์ด - ไม่นานนี้ ปัจจุบัน ยก ใช้ไม่นานนี้ @@ -32,4 +31,4 @@ สัตว์และธรรมชาติ อาหารและเครื่องดื่ม กิจกรรม - \ No newline at end of file + diff --git a/app/src/main/res/values-tok/strings.xml b/app/src/main/res/values-tok/strings.xml index c0b8601c..a78ab6cb 100644 --- a/app/src/main/res/values-tok/strings.xml +++ b/app/src/main/res/values-tok/strings.xml @@ -7,7 +7,6 @@ poki sitelen tenpo sina li ale ala. sina sama e sitelen seme la ona li lukin lon ni. kin sina ken taki e sitelen tenpo la ona li weka ala. o weka e sona pi poki sitelen tenpo - sina wile weka ala weka e sona pi poki sitelen tenpo? moku en telo tawa en ma pali @@ -17,7 +16,6 @@ nasin pana kalama o ante tawa pana kalama poki sitelen tenpo - tenpo sin tenpo ni taki o lawi e toki pi poki sitelen @@ -46,4 +44,4 @@ o namako e ijo sin o tawa lon pana sitelen soweli en ma - \ No newline at end of file + diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 7b46bc9f..655253ea 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -7,9 +7,7 @@ Panonuz boş. Bir metni kopyaladığınızda burada görünecektir. Kaybolmamaları için bunları sabitleyebilirsiniz. Pano verilerini temizle - Pano verilerini silmek istediğinizden emin misiniz\? Pano - Son kopyalananlar Geçerli Sabitlenen Yeni öge ekle diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index a73ec123..3c2882af 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -6,9 +6,7 @@ Ваш буфер обміну порожній. Як тільки ви скопіюєте текст, він з\'явиться тут. Ви також можете закріпити буфер, щоб він пізніше не зник. Очистити дані буфера обміну - Ви впевнені, що хочете очистити дані буфера обміну\? Буфер обміну - Останнє Поточне Закріплене Додати новий елемент @@ -46,4 +44,4 @@ Люди й тіло Символи Прапори - \ No newline at end of file + diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 9c16e7a5..9f9436a6 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -7,9 +7,7 @@ Khay nhớ tạm của bạn trống. Sau khi bạn sao chép một số văn bản, văn bản đó sẽ hiển thị ở đây. Bạn cũng có thể ghim các clip để sau này chúng không biến mất. Xóa dữ liệu trong khay nhớ tạm - Bạn có chắc chắn muốn xóa dữ liệu clipboard không? Khay nhớ tạm - Gần đây Hiện tại Đã ghim Thêm mục mới diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index de15108c..0831516d 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -7,9 +7,7 @@ 您的剪贴板是空的。 您复制的文本将显示在此处。 你还可以固定文本片段,这样它们之后不会消失。 清除剪贴板数据 - 您确定想清除剪贴板数据吗? 剪贴板 - 最近 当前 已固定 添加新项目 @@ -46,4 +44,4 @@ 物体 符号 旗帜 - \ No newline at end of file + diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 17e1cc45..115b4358 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -7,9 +7,7 @@ 您的剪貼簿是空的。 當您複製文字後,它們會出現在這裡。您亦可釘選文字,讓它們之後不會消失。 清除剪貼簿資料 - 您確定要清除剪貼簿資料嗎? 剪貼簿 - 最近 目前 釘選 新增項目 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 34e95815..2a2e0448 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -6,9 +6,7 @@ 您的剪貼簿空空的。 當您複製了文字之後,它們就會出現在這裡。也可以釘選起來,讓它們之後不會消失。 清除剪貼簿資料 - 您確定要清除剪貼簿資料嗎? 剪貼簿 - 最近 目前 釘選 新增項目 @@ -46,4 +44,4 @@ 物件 符號 旗幟 - \ No newline at end of file + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index c4a92ef9..f812fbff 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -1,4 +1,4 @@ - #11ffffff + @color/theme_dark_background_color diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 65d954bb..ce522cd0 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -9,7 +9,6 @@ -10dp 28dp 42dp - 24dp 42dp 200dp diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index dbadaef0..af54ed31 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -8,9 +8,7 @@ Your clipboard is empty. Once you copy some text, it will show up here. You can also pin clips so they won\'t disappear later. Clear clipboard data - Are you sure you want to clear the clipboard data? Clipboard - Recent Current Pinned Add a new item @@ -51,6 +49,7 @@ Voice typing method Switch to voice typing + Search Emoji + + + diff --git a/emojipicker/app/src/main/androidx/androidx/emoji2/androidx-emoji2-emoji2-emojipicker-documentation.md b/emojipicker/app/src/main/androidx/androidx/emoji2/androidx-emoji2-emoji2-emojipicker-documentation.md new file mode 100644 index 00000000..f751ab7b --- /dev/null +++ b/emojipicker/app/src/main/androidx/androidx/emoji2/androidx-emoji2-emoji2-emojipicker-documentation.md @@ -0,0 +1,8 @@ +# Module root + +androidx.emoji2 emoji2-emojipicker + +# Package androidx.emoji2.emojipicker + +This library provides the latest emoji support and emoji picker UI including +skin-tone variants and emoji compat support. diff --git a/emojipicker/app/src/main/androidx/emoji2/androidx-emoji2-emoji2-emojipicker-documentation.md b/emojipicker/app/src/main/androidx/emoji2/androidx-emoji2-emoji2-emojipicker-documentation.md new file mode 100644 index 00000000..fc1b9355 --- /dev/null +++ b/emojipicker/app/src/main/androidx/emoji2/androidx-emoji2-emoji2-emojipicker-documentation.md @@ -0,0 +1,8 @@ +# Module root + +androidx.emoji2 emoji2-emojipicker + +# package reeshabh.emojipicker + +This library provides the latest emoji support and emoji picker UI including +skin-tone variants and emoji compat support. diff --git a/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/BundledEmojiListLoader.kt b/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/BundledEmojiListLoader.kt new file mode 100644 index 00000000..f884679f --- /dev/null +++ b/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/BundledEmojiListLoader.kt @@ -0,0 +1,134 @@ +/* + * Copyright 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package androidx.emoji2.emojipicker + +import android.content.Context +import android.content.res.TypedArray +import androidx.annotation.DrawableRes +import androidx.core.content.res.use +import androidx.emoji2.emojipicker.utils.FileCache +import androidx.emoji2.emojipicker.utils.UnicodeRenderableManager +import kotlinx.coroutines.async +import kotlinx.coroutines.awaitAll +import kotlinx.coroutines.coroutineScope + +/** + * A data loader that loads the following objects either from file based caches or from resources. + * + * categorizedEmojiData: a list that holds bundled emoji separated by category, filtered by + * renderability check. This is the data source for EmojiPickerView. + * + * emojiVariantsLookup: a map of emoji variants in bundled emoji, keyed by the base emoji. This + * allows faster variants lookup. + * + * primaryEmojiLookup: a map of base emoji to its variants in bundled emoji. This allows faster + * variants lookup. + */ +internal object BundledEmojiListLoader { + private var categorizedEmojiData: List? = null + private var emojiVariantsLookup: Map>? = null + + internal suspend fun load(context: Context) { + val categoryNames = context.resources.getStringArray(R.array.category_names) + val categoryHeaderIconIds = + context.resources.obtainTypedArray(R.array.emoji_categories_icons).use { typedArray -> + IntArray(typedArray.length()) { typedArray.getResourceId(it, 0) } + } + val resources = + if (UnicodeRenderableManager.isEmoji12Supported()) + R.array.emoji_by_category_raw_resources_gender_inclusive + else R.array.emoji_by_category_raw_resources + val emojiFileCache = FileCache.getInstance(context) + + categorizedEmojiData = + context.resources.obtainTypedArray(resources).use { ta -> + loadEmoji(ta, categoryHeaderIconIds, categoryNames, emojiFileCache, context) + } + emojiVariantsLookup = + categorizedEmojiData!! + .flatMap { it.emojiDataList } + .filter { it.variants.isNotEmpty() } + .flatMap { it.variants.map { variant -> EmojiViewItem(variant, it.variants) } } + .associate { it.emoji to it.variants } + .also { emojiVariantsLookup = it } + } + + internal fun getCategorizedEmojiData() = + categorizedEmojiData + ?: throw IllegalStateException("BundledEmojiListLoader.load is not called or complete") + + internal fun getEmojiVariantsLookup() = + emojiVariantsLookup + ?: throw IllegalStateException("BundledEmojiListLoader.load is not called or complete") + + private suspend fun loadEmoji( + ta: TypedArray, + @DrawableRes categoryHeaderIconIds: IntArray, + categoryNames: Array, + emojiFileCache: FileCache, + context: Context + ): List = coroutineScope { + (0 until ta.length()) + .map { + async { + emojiFileCache + .getOrPut(getCacheFileName(it)) { + loadSingleCategory(context, ta.getResourceId(it, 0)) + } + .let { data -> + EmojiDataCategory(categoryHeaderIconIds[it], categoryNames[it], data) + } + } + } + .awaitAll() + } + + private fun loadSingleCategory( + context: Context, + resId: Int, + ): List = + context.resources + .openRawResource(resId) + .bufferedReader() + .useLines { it.toList() } + .map { filterRenderableEmojis(it.split(",")) } + .filter { it.isNotEmpty() } + .map { EmojiViewItem(it.first(), it.drop(1)) } + + private fun getCacheFileName(categoryIndex: Int) = + StringBuilder() + .append("emoji.v1.") + .append(if (EmojiPickerView.emojiCompatLoaded) 1 else 0) + .append(".") + .append(categoryIndex) + .append(".") + .append(if (UnicodeRenderableManager.isEmoji12Supported()) 1 else 0) + .toString() + + /** + * To eliminate 'Tofu' (the fallback glyph when an emoji is not renderable), check the + * renderability of emojis and keep only when they are renderable on the current device. + */ + private fun filterRenderableEmojis(emojiList: List) = + emojiList.filter { UnicodeRenderableManager.isEmojiRenderable(it) }.toList() + + internal data class EmojiDataCategory( + @DrawableRes val headerIconId: Int, + val categoryName: String, + val emojiDataList: List + ) +} diff --git a/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/DefaultRecentEmojiProvider.kt b/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/DefaultRecentEmojiProvider.kt new file mode 100644 index 00000000..95a805da --- /dev/null +++ b/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/DefaultRecentEmojiProvider.kt @@ -0,0 +1,56 @@ +/* + * Copyright 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package androidx.emoji2.emojipicker + +import android.content.Context +import android.content.Context.MODE_PRIVATE + +/** + * Provides recently shared emoji. This is the default recent emoji list provider. Clients could + * specify the provider by their own. + */ +internal class DefaultRecentEmojiProvider(context: Context) : RecentEmojiProvider { + + companion object { + private const val PREF_KEY_RECENT_EMOJI = "pref_key_recent_emoji" + private const val RECENT_EMOJI_LIST_FILE_NAME = "androidx.emoji2.emojipicker.preferences" + private const val SPLIT_CHAR = "," + } + + private val sharedPreferences = + context.getSharedPreferences(RECENT_EMOJI_LIST_FILE_NAME, MODE_PRIVATE) + private val recentEmojiList: MutableList = + sharedPreferences.getString(PREF_KEY_RECENT_EMOJI, null)?.split(SPLIT_CHAR)?.toMutableList() + ?: mutableListOf() + + override suspend fun getRecentEmojiList(): List { + return recentEmojiList + } + + override fun recordSelection(emoji: String) { + recentEmojiList.remove(emoji) + recentEmojiList.add(0, emoji) + saveToPreferences() + } + + private fun saveToPreferences() { + sharedPreferences + .edit() + .putString(PREF_KEY_RECENT_EMOJI, recentEmojiList.joinToString(SPLIT_CHAR)) + .commit() + } +} diff --git a/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/EmojiPickerBodyAdapter.kt b/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/EmojiPickerBodyAdapter.kt new file mode 100644 index 00000000..178add78 --- /dev/null +++ b/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/EmojiPickerBodyAdapter.kt @@ -0,0 +1,139 @@ +/* + * Copyright 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package androidx.emoji2.emojipicker + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.view.ViewGroup.LayoutParams +import android.widget.TextView +import androidx.annotation.LayoutRes +import androidx.annotation.UiThread +import androidx.core.view.ViewCompat +import androidx.emoji2.emojipicker.Extensions.toItemType +import androidx.recyclerview.widget.RecyclerView.Adapter +import androidx.recyclerview.widget.RecyclerView.ViewHolder + +/** RecyclerView adapter for emoji body. */ +internal class EmojiPickerBodyAdapter( + private val context: Context, + private val emojiGridColumns: Int, + private val emojiGridRows: Float?, + private val stickyVariantProvider: StickyVariantProvider, + private val emojiPickerItemsProvider: () -> EmojiPickerItems, + private val onEmojiPickedListener: EmojiPickerBodyAdapter.(EmojiViewItem) -> Unit, +) : Adapter() { + private val layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var emojiCellWidth: Int? = null + private var emojiCellHeight: Int? = null + + @UiThread + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + emojiCellWidth = emojiCellWidth ?: (getParentWidth(parent) / emojiGridColumns) + emojiCellHeight = + emojiCellHeight + ?: emojiGridRows?.let { getEmojiCellTotalHeight(parent) / it }?.toInt() + ?: emojiCellWidth + + return when (viewType.toItemType()) { + ItemType.CATEGORY_TITLE -> createSimpleHolder(R.layout.category_text_view, parent) + ItemType.PLACEHOLDER_TEXT -> + createSimpleHolder(R.layout.empty_category_text_view, parent) { + minimumHeight = emojiCellHeight!! + } + ItemType.EMOJI -> { + EmojiViewHolder( + context, + emojiCellWidth!!, + emojiCellHeight!!, + stickyVariantProvider, + onEmojiPickedListener = { emojiViewItem -> + onEmojiPickedListener(emojiViewItem) + }, + onEmojiPickedFromPopupListener = { emoji -> + val baseEmoji = BundledEmojiListLoader.getEmojiVariantsLookup()[emoji]!![0] + emojiPickerItemsProvider().forEachIndexed { index, itemViewData -> + if ( + itemViewData is EmojiViewData && + BundledEmojiListLoader.getEmojiVariantsLookup()[ + itemViewData.emoji] + ?.get(0) == baseEmoji && + itemViewData.updateToSticky + ) { + itemViewData.emoji = emoji + notifyItemChanged(index) + } + } + } + ) + } + } + } + + override fun onBindViewHolder(viewHolder: ViewHolder, position: Int) { + val item = emojiPickerItemsProvider().getBodyItem(position) + when (getItemViewType(position).toItemType()) { + ItemType.CATEGORY_TITLE -> + ViewCompat.requireViewById(viewHolder.itemView, R.id.category_name).text = + (item as CategoryTitle).title + ItemType.PLACEHOLDER_TEXT -> + ViewCompat.requireViewById( + viewHolder.itemView, + R.id.emoji_picker_empty_category_view + ) + .text = (item as PlaceholderText).text + ItemType.EMOJI -> { + (viewHolder as EmojiViewHolder).bindEmoji((item as EmojiViewData).emoji) + } + } + } + + override fun getItemId(position: Int): Long = + emojiPickerItemsProvider().getBodyItem(position).hashCode().toLong() + + override fun getItemCount(): Int { + return emojiPickerItemsProvider().size + } + + override fun getItemViewType(position: Int): Int { + return emojiPickerItemsProvider().getBodyItem(position).viewType + } + + private fun getParentWidth(parent: ViewGroup): Int { + return parent.measuredWidth - parent.paddingLeft - parent.paddingRight + } + + private fun getEmojiCellTotalHeight(parent: ViewGroup) = + parent.measuredHeight - + context.resources.getDimensionPixelSize(R.dimen.emoji_picker_category_name_height) * 2 - + context.resources.getDimensionPixelSize(R.dimen.emoji_picker_category_name_padding_top) + + private fun createSimpleHolder( + @LayoutRes layoutId: Int, + parent: ViewGroup, + init: (View.() -> Unit)? = null, + ) = + object : + ViewHolder( + layoutInflater.inflate(layoutId, parent, /* attachToRoot= */ false).also { + it.layoutParams = + LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT) + init?.invoke(it) + } + ) {} +} diff --git a/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/EmojiPickerConstants.kt b/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/EmojiPickerConstants.kt new file mode 100644 index 00000000..ba7a5cfc --- /dev/null +++ b/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/EmojiPickerConstants.kt @@ -0,0 +1,35 @@ +/* + * Copyright 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package androidx.emoji2.emojipicker + +/** A utility class to hold various constants used by the Emoji Picker library. */ +internal object EmojiPickerConstants { + + // The default number of body columns. + const val DEFAULT_BODY_COLUMNS = 9 + + // The default number of rows of recent items held. + const val DEFAULT_MAX_RECENT_ITEM_ROWS = 3 + + // The max pool size of the Emoji ItemType in RecyclerViewPool. + const val EMOJI_VIEW_POOL_SIZE = 100 + + const val ADD_VIEW_EXCEPTION_MESSAGE = "Adding views to the EmojiPickerView is unsupported" + + const val REMOVE_VIEW_EXCEPTION_MESSAGE = + "Removing views from the EmojiPickerView is unsupported" +} diff --git a/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/EmojiPickerHeaderAdapter.kt b/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/EmojiPickerHeaderAdapter.kt new file mode 100644 index 00000000..d4c8fa08 --- /dev/null +++ b/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/EmojiPickerHeaderAdapter.kt @@ -0,0 +1,88 @@ +/* + * Copyright 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package androidx.emoji2.emojipicker + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.view.accessibility.AccessibilityEvent +import android.widget.ImageView +import androidx.core.view.ViewCompat +import androidx.recyclerview.widget.RecyclerView.Adapter +import androidx.recyclerview.widget.RecyclerView.ViewHolder + +/** RecyclerView adapter for emoji header. */ +internal class EmojiPickerHeaderAdapter( + context: Context, + private val emojiPickerItems: EmojiPickerItems, + private val onHeaderIconClicked: (Int) -> Unit, +) : Adapter() { + private val layoutInflater: LayoutInflater = LayoutInflater.from(context) + + var selectedGroupIndex: Int = 0 + set(value) { + if (value == field) return + notifyItemChanged(field) + notifyItemChanged(value) + field = value + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + return object : + ViewHolder( + layoutInflater.inflate( + R.layout.header_icon_holder, + parent, + /* attachToRoot = */ false + ) + ) {} + } + + override fun onBindViewHolder(viewHolder: ViewHolder, i: Int) { + val isItemSelected = i == selectedGroupIndex + val headerIcon = + ViewCompat.requireViewById( + viewHolder.itemView, + R.id.emoji_picker_header_icon + ) + .apply { + setImageDrawable(context.getDrawable(emojiPickerItems.getHeaderIconId(i))) + isSelected = isItemSelected + contentDescription = emojiPickerItems.getHeaderIconDescription(i) + } + viewHolder.itemView.setOnClickListener { + onHeaderIconClicked(i) + selectedGroupIndex = i + } + if (isItemSelected) { + headerIcon.post { + headerIcon.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_HOVER_ENTER) + } + } + + ViewCompat.requireViewById(viewHolder.itemView, R.id.emoji_picker_header_underline) + .apply { + visibility = if (isItemSelected) View.VISIBLE else View.GONE + isSelected = isItemSelected + } + } + + override fun getItemCount(): Int { + return emojiPickerItems.numGroups + } +} diff --git a/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/EmojiPickerItems.kt b/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/EmojiPickerItems.kt new file mode 100644 index 00000000..2d7b36dd --- /dev/null +++ b/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/EmojiPickerItems.kt @@ -0,0 +1,111 @@ +/* + * Copyright 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package androidx.emoji2.emojipicker + +import androidx.annotation.DrawableRes +import androidx.annotation.IntRange + +/** + * A group of items in RecyclerView for emoji picker body. [titleItem] comes first. [contentItems] + * comes after [titleItem]. [emptyPlaceholderItem] will be served after [titleItem] only if + * [contentItems] is empty. [maxContentItemCount], if provided, will truncate [contentItems] to + * certain size. + * + * [categoryIconId] is the corresponding category icon in emoji picker header. + */ +internal class ItemGroup( + @DrawableRes internal val categoryIconId: Int, + internal val titleItem: CategoryTitle, + private val contentItems: List, + private val maxContentItemCount: Int? = null, + private val emptyPlaceholderItem: PlaceholderText? = null +) { + + val size: Int + get() = + 1 /* title */ + + when { + contentItems.isEmpty() -> if (emptyPlaceholderItem != null) 1 else 0 + maxContentItemCount != null && contentItems.size > maxContentItemCount -> + maxContentItemCount + else -> contentItems.size + } + + operator fun get(index: Int): ItemViewData { + if (index == 0) return titleItem + val contentIndex = index - 1 + if (contentIndex < contentItems.size) return contentItems[contentIndex] + if (contentIndex == 0 && emptyPlaceholderItem != null) return emptyPlaceholderItem + throw IndexOutOfBoundsException() + } + + fun getAll(): List = IntRange(0, size - 1).map { get(it) } +} + +/** A view of concatenated list of [ItemGroup]. */ +internal class EmojiPickerItems( + private val groups: List, +) : Iterable { + val size: Int + get() = groups.sumOf { it.size } + + init { + check(groups.isNotEmpty()) { "Initialized with empty categorized sources" } + } + + fun getBodyItem(@IntRange(from = 0) absolutePosition: Int): ItemViewData { + var localPosition = absolutePosition + for (group in groups) { + if (localPosition < group.size) return group[localPosition] + else localPosition -= group.size + } + throw IndexOutOfBoundsException() + } + + val numGroups: Int + get() = groups.size + + @DrawableRes + fun getHeaderIconId(@IntRange(from = 0) index: Int): Int = groups[index].categoryIconId + + fun getHeaderIconDescription(@IntRange(from = 0) index: Int): String = + groups[index].titleItem.title + + fun groupIndexByItemPosition(@IntRange(from = 0) absolutePosition: Int): Int { + var localPosition = absolutePosition + var index = 0 + for (group in groups) { + if (localPosition < group.size) return index + else { + localPosition -= group.size + index++ + } + } + throw IndexOutOfBoundsException() + } + + fun firstItemPositionByGroupIndex(@IntRange(from = 0) groupIndex: Int): Int = + groups.take(groupIndex).sumOf { it.size } + + fun groupRange(group: ItemGroup): kotlin.ranges.IntRange { + check(groups.contains(group)) + val index = groups.indexOf(group) + return firstItemPositionByGroupIndex(index).let { it until it + group.size } + } + + override fun iterator(): Iterator = groups.flatMap { it.getAll() }.iterator() +} diff --git a/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/EmojiPickerPopupBidirectionalDesign.kt b/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/EmojiPickerPopupBidirectionalDesign.kt new file mode 100644 index 00000000..ffe773b0 --- /dev/null +++ b/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/EmojiPickerPopupBidirectionalDesign.kt @@ -0,0 +1,110 @@ +/* + * Copyright 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package androidx.emoji2.emojipicker + +import android.content.Context +import android.view.Gravity +import android.view.View +import android.view.ViewGroup +import android.widget.FrameLayout +import android.widget.LinearLayout +import androidx.appcompat.widget.AppCompatImageView + +/** Emoji picker popup view with bidirectional UI design to switch emoji to face left or right. */ +internal class EmojiPickerPopupBidirectionalDesign( + override val context: Context, + override val targetEmojiView: View, + override val variants: List, + override val popupView: LinearLayout, + override val emojiViewOnClickListener: View.OnClickListener +) : EmojiPickerPopupDesign() { + private var emojiFacingLeft = true + + init { + updateTemplate() + } + + override fun addLayoutHeader() { + val row = + LinearLayout(context).apply { + orientation = LinearLayout.HORIZONTAL + gravity = Gravity.CENTER + layoutParams = + LinearLayout.LayoutParams( + FrameLayout.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.WRAP_CONTENT + ) + } + FrameLayout.inflate(context, R.layout.emoji_picker_popup_bidirectional, row) + .findViewById(R.id.emoji_picker_popup_bidirectional_icon) + .apply { + layoutParams = + LinearLayout.LayoutParams(targetEmojiView.width, targetEmojiView.height) + } + popupView.addView(row) + val imageView = + row.findViewById(R.id.emoji_picker_popup_bidirectional_icon) + imageView.setOnClickListener { + emojiFacingLeft = !emojiFacingLeft + updateTemplate() + popupView.removeViews(/* start= */ 1, getActualNumberOfRows()) + addRowsToPopupView() + imageView.announceForAccessibility( + context.getString(R.string.emoji_bidirectional_switcher_clicked_desc) + ) + } + } + + override fun getNumberOfRows(): Int { + // Adding one row for the bidirectional switcher. + return variants.size / 2 / BIDIRECTIONAL_COLUMN_COUNT + 1 + } + + override fun getNumberOfColumns(): Int { + return BIDIRECTIONAL_COLUMN_COUNT + } + + private fun getActualNumberOfRows(): Int { + // Removing one extra row of the bidirectional switcher. + return getNumberOfRows() - 1 + } + + private fun updateTemplate() { + template = + if (emojiFacingLeft) + arrayOf((variants.indices.filter { it % 12 < 6 }.map { it + 1 }).toIntArray()) + else arrayOf((variants.indices.filter { it % 12 >= 6 }.map { it + 1 }).toIntArray()) + + val row = getActualNumberOfRows() + val column = getNumberOfColumns() + val overrideTemplate = Array(row) { IntArray(column) } + var index = 0 + for (i in 0 until row) { + for (j in 0 until column) { + if (index < template[0].size) { + overrideTemplate[i][j] = template[0][index] + index++ + } + } + } + template = overrideTemplate + } + + companion object { + private const val BIDIRECTIONAL_COLUMN_COUNT = 6 + } +} diff --git a/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/EmojiPickerPopupDesign.kt b/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/EmojiPickerPopupDesign.kt new file mode 100644 index 00000000..6111539d --- /dev/null +++ b/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/EmojiPickerPopupDesign.kt @@ -0,0 +1,89 @@ +/* + * Copyright 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package androidx.emoji2.emojipicker + +import android.content.Context +import android.view.View +import android.view.ViewGroup +import android.view.accessibility.AccessibilityEvent +import android.widget.FrameLayout +import android.widget.LinearLayout + +/** Emoji picker popup view UI design. Each UI design needs to inherit this abstract class. */ +internal abstract class EmojiPickerPopupDesign { + abstract val context: Context + abstract val targetEmojiView: View + abstract val variants: List + abstract val popupView: LinearLayout + abstract val emojiViewOnClickListener: View.OnClickListener + lateinit var template: Array + + open fun addLayoutHeader() { + // no-ops + } + + open fun addRowsToPopupView() { + for (row in template) { + val rowLayout = + LinearLayout(context).apply { + orientation = LinearLayout.HORIZONTAL + layoutParams = + LinearLayout.LayoutParams( + FrameLayout.LayoutParams.WRAP_CONTENT, + FrameLayout.LayoutParams.WRAP_CONTENT + ) + } + for (item in row) { + val cell = + if (item == 0) { + EmojiView(context) + } else { + EmojiView(context).apply { + willDrawVariantIndicator = false + emoji = variants[item - 1] + setOnClickListener(emojiViewOnClickListener) + if (item == 1) { + // Hover on the first emoji in the popup + popupView.post { + sendAccessibilityEvent( + AccessibilityEvent.TYPE_VIEW_HOVER_ENTER + ) + } + } + } + } + .apply { + layoutParams = + ViewGroup.LayoutParams( + targetEmojiView.width, + targetEmojiView.height + ) + } + rowLayout.addView(cell) + } + popupView.addView(rowLayout) + } + } + + open fun addLayoutFooter() { + // no-ops + } + + abstract fun getNumberOfRows(): Int + + abstract fun getNumberOfColumns(): Int +} diff --git a/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/EmojiPickerPopupFlatDesign.kt b/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/EmojiPickerPopupFlatDesign.kt new file mode 100644 index 00000000..813a1ea9 --- /dev/null +++ b/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/EmojiPickerPopupFlatDesign.kt @@ -0,0 +1,60 @@ +/* + * Copyright 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package androidx.emoji2.emojipicker + +import android.content.Context +import android.view.View +import android.widget.LinearLayout + +/** Emoji picker popup view with flat design to list emojis. */ +internal class EmojiPickerPopupFlatDesign( + override val context: Context, + override val targetEmojiView: View, + override val variants: List, + override val popupView: LinearLayout, + override val emojiViewOnClickListener: View.OnClickListener +) : EmojiPickerPopupDesign() { + init { + template = arrayOf(variants.indices.map { it + 1 }.toIntArray()) + var row = getNumberOfRows() + var column = getNumberOfColumns() + val overrideTemplate = Array(row) { IntArray(column) } + var index = 0 + for (i in 0 until row) { + for (j in 0 until column) { + if (index < template[0].size) { + overrideTemplate[i][j] = template[0][index] + index++ + } + } + } + template = overrideTemplate + } + + override fun getNumberOfRows(): Int { + val column = getNumberOfColumns() + return variants.size / column + if (variants.size % column == 0) 0 else 1 + } + + override fun getNumberOfColumns(): Int { + return minOf(FLAT_COLUMN_MAX_COUNT, template[0].size) + } + + companion object { + private const val FLAT_COLUMN_MAX_COUNT = 6 + } +} diff --git a/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/EmojiPickerPopupMultiSkintoneDesign.kt b/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/EmojiPickerPopupMultiSkintoneDesign.kt new file mode 100644 index 00000000..949a75ed --- /dev/null +++ b/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/EmojiPickerPopupMultiSkintoneDesign.kt @@ -0,0 +1,400 @@ +/* + * Copyright 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package androidx.emoji2.emojipicker + +import android.content.Context +import android.content.res.ColorStateList +import android.graphics.Color +import android.graphics.drawable.Drawable +import android.util.Log +import android.view.ContextThemeWrapper +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.FrameLayout +import android.widget.ImageView +import android.widget.LinearLayout +import androidx.annotation.StringRes +import androidx.core.content.res.ResourcesCompat +import com.google.common.collect.ImmutableMap +import com.google.common.primitives.ImmutableIntArray + +/** Emoji picker popup with multi-skintone selection panel. */ +internal class EmojiPickerPopupMultiSkintoneDesign( + override val context: Context, + override val targetEmojiView: View, + override val variants: List, + override val popupView: LinearLayout, + override val emojiViewOnClickListener: View.OnClickListener, + targetEmoji: String +) : EmojiPickerPopupDesign() { + + private val inflater = LayoutInflater.from(context) + private val resultRow = + LinearLayout(context).apply { + orientation = LinearLayout.HORIZONTAL + layoutParams = + LinearLayout.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT + ) + } + + private var selectedLeftSkintone = -1 + private var selectedRightSkintone = -1 + + init { + val triggerVariantIndex: Int = variants.indexOf(targetEmoji) + if (triggerVariantIndex > 0) { + selectedLeftSkintone = (triggerVariantIndex - 1) / getNumberOfColumns() + selectedRightSkintone = + triggerVariantIndex - selectedLeftSkintone * getNumberOfColumns() - 1 + } + } + + override fun addRowsToPopupView() { + for (row in 0 until getActualNumberOfRows()) { + val rowLayout = + LinearLayout(context).apply { + orientation = LinearLayout.HORIZONTAL + layoutParams = + LinearLayout.LayoutParams( + FrameLayout.LayoutParams.WRAP_CONTENT, + FrameLayout.LayoutParams.WRAP_CONTENT + ) + } + for (column in 0 until getNumberOfColumns()) { + inflater.inflate(R.layout.emoji_picker_popup_image_view, rowLayout) + val imageView = rowLayout.getChildAt(column) as ImageView + imageView.apply { + layoutParams = + LinearLayout.LayoutParams(targetEmojiView.width, targetEmojiView.height) + isClickable = true + contentDescription = getImageContentDescription(context, row, column) + if ( + (hasLeftSkintone() && row == 0 && selectedLeftSkintone == column) || + (hasRightSkintone() && row == 1 && selectedRightSkintone == column) + ) { + isSelected = true + isClickable = false + } + setImageDrawable(getDrawableRes(context, row, column)) + setOnClickListener { + var unSelectedView: View? = null + if (row == 0) { + if (hasLeftSkintone()) { + unSelectedView = rowLayout.getChildAt(selectedLeftSkintone) + } + selectedLeftSkintone = column + } else { + if (hasRightSkintone()) { + unSelectedView = rowLayout.getChildAt(selectedRightSkintone) + } + selectedRightSkintone = column + } + if (unSelectedView != null) { + unSelectedView.isSelected = false + unSelectedView.isClickable = true + } + isClickable = false + isSelected = true + processResultView() + } + } + } + popupView.addView(rowLayout) + } + } + + private fun processResultView() { + val childCount = resultRow.childCount + if (childCount < 1 || childCount > 2) { + Log.e(TAG, "processResultEmojiForRectangleLayout(): unexpected emoji result row size") + return + } + // Remove the result emoji if it's already available. It will be available after the row is + // inflated the first time. + if (childCount == 2) { + resultRow.removeViewAt(1) + } + if (hasLeftSkintone() && hasRightSkintone()) { + inflater.inflate(R.layout.emoji_picker_popup_emoji_view, resultRow) + val layout = resultRow.getChildAt(1) as LinearLayout + layout.findViewById(R.id.emoji_picker_popup_emoji_view).apply { + willDrawVariantIndicator = false + isClickable = true + emoji = + variants[ + selectedLeftSkintone * getNumberOfColumns() + selectedRightSkintone + 1] + setOnClickListener(emojiViewOnClickListener) + layoutParams = + LinearLayout.LayoutParams(targetEmojiView.width, targetEmojiView.height) + } + layout.findViewById(R.id.emoji_picker_popup_emoji_view_wrapper).apply { + layoutParams = + LinearLayout.LayoutParams( + targetEmojiView.width * getNumberOfColumns() / 2, + targetEmojiView.height + ) + } + } else if (hasLeftSkintone()) { + drawImageView( + /* row= */ 0, + /*column=*/ selectedLeftSkintone, + /* applyGrayTint= */ false + ) + } else if (hasRightSkintone()) { + drawImageView( + /* row= */ 1, + /*column=*/ selectedRightSkintone, + /* applyGrayTint= */ false + ) + } else { + drawImageView(/* row= */ 0, /* column= */ 0, /* applyGrayTint= */ true) + } + } + + private fun drawImageView(row: Int, column: Int, applyGrayTint: Boolean) { + inflater + .inflate(R.layout.emoji_picker_popup_image_view, resultRow) + .findViewById(R.id.emoji_picker_popup_image_view) + .apply { + layoutParams = LinearLayout.LayoutParams(0, targetEmojiView.height, 1f) + setImageDrawable(getDrawableRes(context, row, column)) + if (applyGrayTint) { + imageTintList = ColorStateList.valueOf(Color.GRAY) + } + + var contentDescriptionRow = selectedLeftSkintone + var contentDescriptionColumn = selectedRightSkintone + if (hasLeftSkintone()) { + contentDescriptionRow = 0 + contentDescriptionColumn = selectedLeftSkintone + } else if (hasRightSkintone()) { + contentDescriptionRow = 1 + contentDescriptionColumn = selectedRightSkintone + } + contentDescription = + getImageContentDescription( + context, + contentDescriptionRow, + contentDescriptionColumn + ) + } + } + + override fun addLayoutFooter() { + inflater.inflate(R.layout.emoji_picker_popup_emoji_view, resultRow) + val layout = resultRow.getChildAt(0) as LinearLayout + layout.findViewById(R.id.emoji_picker_popup_emoji_view).apply { + willDrawVariantIndicator = false + emoji = variants[0] + layoutParams = LinearLayout.LayoutParams(targetEmojiView.width, targetEmojiView.height) + isClickable = true + setOnClickListener(emojiViewOnClickListener) + } + layout.findViewById(R.id.emoji_picker_popup_emoji_view_wrapper).apply { + layoutParams = + LinearLayout.LayoutParams( + targetEmojiView.width * getNumberOfColumns() / 2, + targetEmojiView.height + ) + } + processResultView() + popupView.addView(resultRow) + } + + override fun getNumberOfRows(): Int { + // Add one extra row for the neutral skin tone combination + return LAYOUT_ROWS + 1 + } + + override fun getNumberOfColumns(): Int { + return LAYOUT_COLUMNS + } + + private fun getActualNumberOfRows(): Int { + return LAYOUT_ROWS + } + + private fun hasLeftSkintone(): Boolean { + return selectedLeftSkintone != -1 + } + + private fun hasRightSkintone(): Boolean { + return selectedRightSkintone != -1 + } + + private fun getDrawableRes(context: Context, row: Int, column: Int): Drawable? { + val resArray: ImmutableIntArray? = SKIN_TONES_EMOJI_TO_RESOURCES[variants[0]] + if (resArray != null) { + val contextThemeWrapper = ContextThemeWrapper(context, VARIANT_STYLES[column]) + return ResourcesCompat.getDrawable( + context.resources, + resArray[row], + contextThemeWrapper.getTheme() + ) + } + return null + } + + private fun getImageContentDescription(context: Context, row: Int, column: Int): String { + return context.getString( + R.string.emoji_variant_content_desc_template, + context.getString(getSkintoneStringRes(/* isLeft= */ true, row, column)), + context.getString(getSkintoneStringRes(/* isLeft= */ false, row, column)) + ) + } + + @StringRes + private fun getSkintoneStringRes(isLeft: Boolean, row: Int, column: Int): Int { + // When there is no column, the selected position -1 will be passed in as column. + if (column == -1) { + return R.string.emoji_skin_tone_shadow_content_desc + } + return if (isLeft) { + if (row == 0) SKIN_TONE_CONTENT_DESC_RES_IDS[column] + else R.string.emoji_skin_tone_shadow_content_desc + } else { + if (row == 0) R.string.emoji_skin_tone_shadow_content_desc + else SKIN_TONE_CONTENT_DESC_RES_IDS[column] + } + } + + companion object { + private const val TAG = "MultiSkintoneDesign" + private const val LAYOUT_ROWS = 2 + private const val LAYOUT_COLUMNS = 5 + + private val SKIN_TONE_CONTENT_DESC_RES_IDS = + ImmutableIntArray.of( + R.string.emoji_skin_tone_light_content_desc, + R.string.emoji_skin_tone_medium_light_content_desc, + R.string.emoji_skin_tone_medium_content_desc, + R.string.emoji_skin_tone_medium_dark_content_desc, + R.string.emoji_skin_tone_dark_content_desc + ) + + private val VARIANT_STYLES = + ImmutableIntArray.of( + R.style.EmojiSkintoneSelectorLight, + R.style.EmojiSkintoneSelectorMediumLight, + R.style.EmojiSkintoneSelectorMedium, + R.style.EmojiSkintoneSelectorMediumDark, + R.style.EmojiSkintoneSelectorDark + ) + + /** + * Map from emoji that use the square layout strategy with skin tone swatches or rectangle + * strategy to their resources. + */ + private val SKIN_TONES_EMOJI_TO_RESOURCES = + ImmutableMap.Builder() + .put( + "🤝", + ImmutableIntArray.of( + R.drawable.handshake_skintone_shadow, + R.drawable.handshake_shadow_skintone + ) + ) + .put( + "👭", + ImmutableIntArray.of( + R.drawable.holding_women_skintone_shadow, + R.drawable.holding_women_shadow_skintone + ) + ) + .put( + "👫", + ImmutableIntArray.of( + R.drawable.holding_woman_man_skintone_shadow, + R.drawable.holding_woman_man_shadow_skintone + ) + ) + .put( + "👬", + ImmutableIntArray.of( + R.drawable.holding_men_skintone_shadow, + R.drawable.holding_men_shadow_skintone + ) + ) + .put( + "🧑‍🤝‍🧑", + ImmutableIntArray.of( + R.drawable.holding_people_skintone_shadow, + R.drawable.holding_people_shadow_skintone + ) + ) + .put( + "💏", + ImmutableIntArray.of( + R.drawable.kiss_people_skintone_shadow, + R.drawable.kiss_people_shadow_skintone + ) + ) + .put( + "👩‍❤️‍💋‍👨", + ImmutableIntArray.of( + R.drawable.kiss_woman_man_skintone_shadow, + R.drawable.kiss_woman_man_shadow_skintone + ) + ) + .put( + "👨‍❤️‍💋‍👨", + ImmutableIntArray.of( + R.drawable.kiss_men_skintone_shadow, + R.drawable.kiss_men_shadow_skintone + ) + ) + .put( + "👩‍❤️‍💋‍👩", + ImmutableIntArray.of( + R.drawable.kiss_women_skintone_shadow, + R.drawable.kiss_women_shadow_skintone + ) + ) + .put( + "💑", + ImmutableIntArray.of( + R.drawable.couple_heart_people_skintone_shadow, + R.drawable.couple_heart_people_shadow_skintone + ) + ) + .put( + "👩‍❤️‍👨", + ImmutableIntArray.of( + R.drawable.couple_heart_woman_man_skintone_shadow, + R.drawable.couple_heart_woman_man_shadow_skintone + ) + ) + .put( + "👨‍❤️‍👨", + ImmutableIntArray.of( + R.drawable.couple_heart_men_skintone_shadow, + R.drawable.couple_heart_men_shadow_skintone + ) + ) + .put( + "👩‍❤️‍👩", + ImmutableIntArray.of( + R.drawable.couple_heart_women_skintone_shadow, + R.drawable.couple_heart_women_shadow_skintone + ) + ) + .buildOrThrow() + } +} diff --git a/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/EmojiPickerPopupSquareDesign.kt b/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/EmojiPickerPopupSquareDesign.kt new file mode 100644 index 00000000..13f94c6c --- /dev/null +++ b/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/EmojiPickerPopupSquareDesign.kt @@ -0,0 +1,57 @@ +/* + * Copyright 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package androidx.emoji2.emojipicker + +import android.content.Context +import android.view.View +import android.widget.LinearLayout + +/** Emoji picker popup view with square design. */ +internal class EmojiPickerPopupSquareDesign( + override val context: Context, + override val targetEmojiView: View, + override val variants: List, + override val popupView: LinearLayout, + override val emojiViewOnClickListener: View.OnClickListener +) : EmojiPickerPopupDesign() { + init { + template = SQUARE_LAYOUT_TEMPLATE + } + + override fun getNumberOfRows(): Int { + return SQUARE_LAYOUT_TEMPLATE.size + } + + override fun getNumberOfColumns(): Int { + return SQUARE_LAYOUT_TEMPLATE[0].size + } + + companion object { + /** + * Square variant layout template without skin tone. 0 : a place holder Positive number is + * the index + 1 in the variant array + */ + private val SQUARE_LAYOUT_TEMPLATE = + arrayOf( + intArrayOf(0, 2, 3, 4, 5, 6), + intArrayOf(0, 7, 8, 9, 10, 11), + intArrayOf(0, 12, 13, 14, 15, 16), + intArrayOf(0, 17, 18, 19, 20, 21), + intArrayOf(1, 22, 23, 24, 25, 26) + ) + } +} diff --git a/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/EmojiPickerPopupView.kt b/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/EmojiPickerPopupView.kt new file mode 100644 index 00000000..fcb2aabe --- /dev/null +++ b/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/EmojiPickerPopupView.kt @@ -0,0 +1,134 @@ +/* + * Copyright 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package androidx.emoji2.emojipicker + +import android.content.Context +import android.util.AttributeSet +import android.view.View +import android.widget.FrameLayout +import android.widget.LinearLayout + +/** Popup view for emoji picker to show emoji variants. */ +internal class EmojiPickerPopupView +@JvmOverloads +constructor( + context: Context, + attrs: AttributeSet?, + defStyleAttr: Int = 0, + private val targetEmojiView: View, + private val targetEmojiItem: EmojiViewItem, + private val emojiViewOnClickListener: OnClickListener +) : FrameLayout(context, attrs, defStyleAttr) { + + private val variants = targetEmojiItem.variants + private val targetEmoji = targetEmojiItem.emoji + private val popupView: LinearLayout + private val popupDesign: EmojiPickerPopupDesign + + init { + popupView = + inflate(context, R.layout.variant_popup, /* root= */ null) + .findViewById(R.id.variant_popup) + val layout = getLayout() + popupDesign = + when (layout) { + Layout.FLAT -> + EmojiPickerPopupFlatDesign( + context, + targetEmojiView, + variants, + popupView, + emojiViewOnClickListener + ) + Layout.SQUARE -> + EmojiPickerPopupSquareDesign( + context, + targetEmojiView, + variants, + popupView, + emojiViewOnClickListener + ) + Layout.SQUARE_WITH_SKIN_TONE_CIRCLE -> + EmojiPickerPopupMultiSkintoneDesign( + context, + targetEmojiView, + variants, + popupView, + emojiViewOnClickListener, + targetEmoji + ) + Layout.BIDIRECTIONAL -> + EmojiPickerPopupBidirectionalDesign( + context, + targetEmojiView, + variants, + popupView, + emojiViewOnClickListener + ) + } + popupDesign.addLayoutHeader() + popupDesign.addRowsToPopupView() + popupDesign.addLayoutFooter() + addView(popupView) + } + + fun getPopupViewWidth(): Int { + return popupDesign.getNumberOfColumns() * targetEmojiView.width + + popupView.paddingStart + + popupView.paddingEnd + } + + fun getPopupViewHeight(): Int { + return popupDesign.getNumberOfRows() * targetEmojiView.height + + popupView.paddingTop + + popupView.paddingBottom + } + + private fun getLayout(): Layout { + if (variants.size == SQUARE_LAYOUT_VARIANT_COUNT) + if (SQUARE_LAYOUT_EMOJI_NO_SKIN_TONE.contains(variants[0])) return Layout.SQUARE + else return Layout.SQUARE_WITH_SKIN_TONE_CIRCLE + else if (variants.size == BIDIRECTIONAL_VARIANTS_COUNT) return Layout.BIDIRECTIONAL + else return Layout.FLAT + } + + companion object { + private enum class Layout { + FLAT, + SQUARE, + SQUARE_WITH_SKIN_TONE_CIRCLE, + BIDIRECTIONAL + } + + /** + * The number of variants expected when using a square layout strategy. Square layouts are + * comprised of a 5x5 grid + the base variant. + */ + private const val SQUARE_LAYOUT_VARIANT_COUNT = 26 + + /** + * The number of variants expected when using a bidirectional layout strategy. Bidirectional + * layouts are comprised of bidirectional icon and a 3x6 grid with left direction emojis as + * default. After clicking the bidirectional icon, it switches to a bidirectional icon and a + * 3x6 grid with right direction emojis. + */ + private const val BIDIRECTIONAL_VARIANTS_COUNT = 36 + + // Set of emojis that use the square layout without skin tone swatches. + private val SQUARE_LAYOUT_EMOJI_NO_SKIN_TONE = setOf("👪") + } +} diff --git a/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/EmojiPickerPopupViewController.kt b/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/EmojiPickerPopupViewController.kt new file mode 100644 index 00000000..479cf741 --- /dev/null +++ b/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/EmojiPickerPopupViewController.kt @@ -0,0 +1,84 @@ +package androidx.emoji2.emojipicker + +/* + * Copyright 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import android.content.Context +import android.view.Gravity +import android.view.View +import android.view.ViewGroup.LayoutParams +import android.view.WindowManager +import android.widget.PopupWindow +import android.widget.Toast +import kotlin.math.roundToInt + +/** + * Default controller class for emoji picker popup view. + * + *

Shows the popup view above the target Emoji. View under control is a {@code + * EmojiPickerPopupView}. + */ +internal class EmojiPickerPopupViewController( + private val context: Context, + private val emojiPickerPopupView: EmojiPickerPopupView, + private val clickedEmojiView: View +) { + private val popupWindow: PopupWindow = + PopupWindow( + emojiPickerPopupView, + LayoutParams.WRAP_CONTENT, + LayoutParams.WRAP_CONTENT, + /* focusable= */ false + ) + + fun show() { + popupWindow.apply { + val location = IntArray(2) + clickedEmojiView.getLocationInWindow(location) + // Make the popup view center align with the target emoji view. + val x = + location[0] + clickedEmojiView.width / 2f - + emojiPickerPopupView.getPopupViewWidth() / 2f + val y = location[1] - emojiPickerPopupView.getPopupViewHeight() + // Set background drawable so that the popup window is dismissed properly when clicking + // outside / scrolling for API < 23. + setBackgroundDrawable(context.getDrawable(R.drawable.popup_view_rounded_background)) + isOutsideTouchable = true + isTouchable = true + animationStyle = R.style.VariantPopupAnimation + elevation = + clickedEmojiView.context.resources + .getDimensionPixelSize(R.dimen.emoji_picker_popup_view_elevation) + .toFloat() + try { + showAtLocation(clickedEmojiView, Gravity.NO_GRAVITY, x.roundToInt(), y) + } catch (e: WindowManager.BadTokenException) { + Toast.makeText( + context, + "Don't use EmojiPickerView inside a Popup", + Toast.LENGTH_LONG + ) + .show() + } + } + } + + fun dismiss() { + if (popupWindow.isShowing) { + popupWindow.dismiss() + } + } +} diff --git a/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/EmojiPickerView.kt b/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/EmojiPickerView.kt new file mode 100644 index 00000000..b6be0514 --- /dev/null +++ b/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/EmojiPickerView.kt @@ -0,0 +1,460 @@ +/* + * Copyright 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package androidx.emoji2.emojipicker + +import android.content.Context +import android.content.res.TypedArray +import android.util.AttributeSet +import android.view.View +import android.view.ViewGroup +import android.widget.FrameLayout +import androidx.core.util.Consumer +import androidx.core.view.ViewCompat +import androidx.emoji2.emojipicker.EmojiPickerConstants.DEFAULT_MAX_RECENT_ITEM_ROWS +import androidx.emoji2.text.EmojiCompat +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import kotlin.coroutines.EmptyCoroutineContext +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext + +/** + * The emoji picker view that provides up-to-date emojis in a vertical scrollable view with a + * clickable horizontal header. + */ +class EmojiPickerView +@JvmOverloads +constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : + FrameLayout(context, attrs, defStyleAttr) { + + internal companion object { + internal var emojiCompatLoaded: Boolean = false + } + + private var _emojiGridRows: Float? = null + /** + * The number of rows of the emoji picker. + * + * Optional field. If not set, the value will be calculated based on parent view height and + * [emojiGridColumns]. Float value indicates that the picker could display the last row + * partially, so the users get the idea that they can scroll down for more contents. + * + * @attr ref androidx.emoji2.emojipicker.R.styleable.EmojiPickerView_emojiGridRows + */ + var emojiGridRows: Float + get() = _emojiGridRows ?: -1F + set(value) { + _emojiGridRows = value.takeIf { it > 0 } + // Refresh when emojiGridRows is reset + if (isLaidOut) { + showEmojiPickerView() + } + } + + /** + * The number of columns of the emoji picker. + * + * Default value([EmojiPickerConstants.DEFAULT_BODY_COLUMNS]: 9) will be used if + * emojiGridColumns is set to non-positive value. + * + * @attr ref androidx.emoji2.emojipicker.R.styleable.EmojiPickerView_emojiGridColumns + */ + var emojiGridColumns: Int = EmojiPickerConstants.DEFAULT_BODY_COLUMNS + set(value) { + field = value.takeIf { it > 0 } ?: EmojiPickerConstants.DEFAULT_BODY_COLUMNS + // Refresh when emojiGridColumns is reset + if (isLaidOut) { + showEmojiPickerView() + } + } + + private val stickyVariantProvider = StickyVariantProvider(context) + private val scope = CoroutineScope(EmptyCoroutineContext) + + private var recentEmojiProvider: RecentEmojiProvider = DefaultRecentEmojiProvider(context) + private var recentNeedsRefreshing: Boolean = true + private val recentItems: MutableList = mutableListOf() + private lateinit var recentItemGroup: ItemGroup + + private lateinit var emojiPickerItems: EmojiPickerItems + private lateinit var bodyAdapter: EmojiPickerBodyAdapter + + private var onEmojiPickedListener: Consumer? = null + + init { + + val typedArray: TypedArray = + context.obtainStyledAttributes(attrs, R.styleable.EmojiPickerView, 0, 0) + _emojiGridRows = + with(R.styleable.EmojiPickerView_emojiGridRows) { + if (typedArray.hasValue(this)) { + typedArray.getFloat(this, 0F) + } else null + } + emojiGridColumns = + typedArray.getInt( + R.styleable.EmojiPickerView_emojiGridColumns, + EmojiPickerConstants.DEFAULT_BODY_COLUMNS + ) + typedArray.recycle() + + if (EmojiCompat.isConfigured()) { + when (EmojiCompat.get().loadState) { + EmojiCompat.LOAD_STATE_SUCCEEDED -> emojiCompatLoaded = true + EmojiCompat.LOAD_STATE_LOADING, + EmojiCompat.LOAD_STATE_DEFAULT -> + EmojiCompat.get() + .registerInitCallback( + object : EmojiCompat.InitCallback() { + override fun onInitialized() { + emojiCompatLoaded = true + scope.launch(Dispatchers.IO) { + BundledEmojiListLoader.load(context) + withContext(Dispatchers.Main) { + emojiPickerItems = buildEmojiPickerItems() + bodyAdapter.notifyDataSetChanged() + } + } + } + + override fun onFailed(throwable: Throwable?) {} + } + ) + } + } + scope.launch(Dispatchers.IO) { + val load = launch { BundledEmojiListLoader.load(context) } + refreshRecent() + load.join() + + withContext(Dispatchers.Main) { showEmojiPickerView() } + } + } + + private fun createEmojiPickerBodyAdapter(): EmojiPickerBodyAdapter { + return EmojiPickerBodyAdapter( + context, + emojiGridColumns, + _emojiGridRows, + stickyVariantProvider, + emojiPickerItemsProvider = { emojiPickerItems }, + onEmojiPickedListener = { emojiViewItem -> + onEmojiPickedListener?.accept(emojiViewItem) + recentEmojiProvider.recordSelection(emojiViewItem.emoji) + recentNeedsRefreshing = true + } + ) + } + + internal fun buildEmojiPickerItems() = + EmojiPickerItems( + buildList { + add( + ItemGroup( + R.drawable.quantum_gm_ic_access_time_filled_vd_theme_24, + CategoryTitle(context.getString(R.string.emoji_category_recent)), + recentItems, + maxContentItemCount = DEFAULT_MAX_RECENT_ITEM_ROWS * emojiGridColumns, + emptyPlaceholderItem = + PlaceholderText( + context.getString(R.string.emoji_empty_recent_category) + ) + ) + .also { recentItemGroup = it } + ) + + for ((i, category) in + BundledEmojiListLoader.getCategorizedEmojiData().withIndex()) { + add( + ItemGroup( + category.headerIconId, + CategoryTitle(category.categoryName), + category.emojiDataList.mapIndexed { j, emojiData -> + EmojiViewData( + stickyVariantProvider[emojiData.emoji], + dataIndex = i + j + ) + }, + ) + ) + } + } + ) + + private fun showEmojiPickerView() { + emojiPickerItems = buildEmojiPickerItems() + + val bodyLayoutManager = + GridLayoutManager( + context, + emojiGridColumns, + LinearLayoutManager.VERTICAL, + /* reverseLayout = */ false + ) + .apply { + spanSizeLookup = + object : GridLayoutManager.SpanSizeLookup() { + override fun getSpanSize(position: Int): Int { + return when (emojiPickerItems.getBodyItem(position).itemType) { + ItemType.CATEGORY_TITLE, + ItemType.PLACEHOLDER_TEXT -> emojiGridColumns + else -> 1 + } + } + } + } + + val headerAdapter = + EmojiPickerHeaderAdapter( + context, + emojiPickerItems, + onHeaderIconClicked = { + with(emojiPickerItems.firstItemPositionByGroupIndex(it)) { + if (this == emojiPickerItems.groupRange(recentItemGroup).first) { + scope.launch { refreshRecent() } + } + bodyLayoutManager.scrollToPositionWithOffset(this, 0) + // The scroll position change will not be reflected until the next layout + // call, + // so force a new layout call here. + invalidate() + } + } + ) + + // clear view's children in case of resetting layout + super.removeAllViews() + with(inflate(context, R.layout.emoji_picker, this)) { + // set headerView + ViewCompat.requireViewById(this, R.id.emoji_picker_header).apply { + layoutManager = + object : LinearLayoutManager(context, HORIZONTAL, /* reverseLayout= */ false) { + override fun checkLayoutParams(lp: RecyclerView.LayoutParams): Boolean { + lp.width = + (width - paddingStart - paddingEnd) / emojiPickerItems.numGroups + return true + } + } + adapter = headerAdapter + } + + // set bodyView + ViewCompat.requireViewById(this, R.id.emoji_picker_body).apply { + layoutManager = bodyLayoutManager + adapter = + createEmojiPickerBodyAdapter() + .apply { setHasStableIds(true) } + .also { bodyAdapter = it } + addOnScrollListener( + object : RecyclerView.OnScrollListener() { + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { + super.onScrolled(recyclerView, dx, dy) + headerAdapter.selectedGroupIndex = + emojiPickerItems.groupIndexByItemPosition( + bodyLayoutManager.findFirstCompletelyVisibleItemPosition() + ) + if ( + recentNeedsRefreshing && + bodyLayoutManager.findFirstVisibleItemPosition() !in + emojiPickerItems.groupRange(recentItemGroup) + ) { + scope.launch { refreshRecent() } + } + } + } + ) + // Disable item insertion/deletion animation. This keeps view holder unchanged when + // item updates. + itemAnimator = null + setRecycledViewPool( + RecyclerView.RecycledViewPool().apply { + setMaxRecycledViews( + ItemType.EMOJI.ordinal, + EmojiPickerConstants.EMOJI_VIEW_POOL_SIZE + ) + } + ) + } + } + } + + internal suspend fun refreshRecent() { + if (!recentNeedsRefreshing) { + return + } + val oldGroupSize = if (::recentItemGroup.isInitialized) recentItemGroup.size else 0 + val recent = recentEmojiProvider.getRecentEmojiList() + withContext(Dispatchers.Main) { + recentItems.clear() + recentItems.addAll( + recent.map { + EmojiViewData( + it, + updateToSticky = false, + ) + } + ) + if (::emojiPickerItems.isInitialized) { + val range = emojiPickerItems.groupRange(recentItemGroup) + if (recentItemGroup.size > oldGroupSize) { + bodyAdapter.notifyItemRangeInserted( + range.first + oldGroupSize, + recentItemGroup.size - oldGroupSize + ) + } else if (recentItemGroup.size < oldGroupSize) { + bodyAdapter.notifyItemRangeRemoved( + range.first + recentItemGroup.size, + oldGroupSize - recentItemGroup.size + ) + } + bodyAdapter.notifyItemRangeChanged( + range.first, + minOf(oldGroupSize, recentItemGroup.size) + ) + recentNeedsRefreshing = false + } + } + } + + /** + * This function is used to set the custom behavior after clicking on an emoji icon. Clients + * could specify their own behavior inside this function. + */ + fun setOnEmojiPickedListener(onEmojiPickedListener: Consumer?) { + this.onEmojiPickedListener = onEmojiPickedListener + } + + fun setRecentEmojiProvider(recentEmojiProvider: RecentEmojiProvider) { + this.recentEmojiProvider = recentEmojiProvider + scope.launch { + recentNeedsRefreshing = true + refreshRecent() + } + } + + /** + * The following functions disallow clients to add view to the EmojiPickerView + * + * @param child the child view to be added + * @throws UnsupportedOperationException + */ + override fun addView(child: View?) { + if (childCount > 0) + throw UnsupportedOperationException(EmojiPickerConstants.ADD_VIEW_EXCEPTION_MESSAGE) + else super.addView(child) + } + + /** + * @param child + * @param params + * @throws UnsupportedOperationException + */ + override fun addView(child: View?, params: ViewGroup.LayoutParams?) { + if (childCount > 0) + throw UnsupportedOperationException(EmojiPickerConstants.ADD_VIEW_EXCEPTION_MESSAGE) + else super.addView(child, params) + } + + /** + * @param child + * @param index + * @throws UnsupportedOperationException + */ + override fun addView(child: View?, index: Int) { + if (childCount > 0) + throw UnsupportedOperationException(EmojiPickerConstants.ADD_VIEW_EXCEPTION_MESSAGE) + else super.addView(child, index) + } + + /** + * @param child + * @param index + * @param params + * @throws UnsupportedOperationException + */ + override fun addView(child: View?, index: Int, params: ViewGroup.LayoutParams?) { + if (childCount > 0) + throw UnsupportedOperationException(EmojiPickerConstants.ADD_VIEW_EXCEPTION_MESSAGE) + else super.addView(child, index, params) + } + + /** + * @param child + * @param width + * @param height + * @throws UnsupportedOperationException + */ + override fun addView(child: View?, width: Int, height: Int) { + if (childCount > 0) + throw UnsupportedOperationException(EmojiPickerConstants.ADD_VIEW_EXCEPTION_MESSAGE) + else super.addView(child, width, height) + } + + /** + * The following functions disallow clients to remove view from the EmojiPickerView + * + * @throws UnsupportedOperationException + */ + override fun removeAllViews() { + throw UnsupportedOperationException(EmojiPickerConstants.REMOVE_VIEW_EXCEPTION_MESSAGE) + } + + /** + * @param child + * @throws UnsupportedOperationException + */ + override fun removeView(child: View?) { + throw UnsupportedOperationException(EmojiPickerConstants.REMOVE_VIEW_EXCEPTION_MESSAGE) + } + + /** + * @param index + * @throws UnsupportedOperationException + */ + override fun removeViewAt(index: Int) { + throw UnsupportedOperationException(EmojiPickerConstants.REMOVE_VIEW_EXCEPTION_MESSAGE) + } + + /** + * @param child + * @throws UnsupportedOperationException + */ + override fun removeViewInLayout(child: View?) { + throw UnsupportedOperationException(EmojiPickerConstants.REMOVE_VIEW_EXCEPTION_MESSAGE) + } + + /** + * @param start + * @param count + * @throws UnsupportedOperationException + */ + override fun removeViews(start: Int, count: Int) { + throw UnsupportedOperationException(EmojiPickerConstants.REMOVE_VIEW_EXCEPTION_MESSAGE) + } + + /** + * @param start + * @param count + * @throws UnsupportedOperationException + */ + override fun removeViewsInLayout(start: Int, count: Int) { + throw UnsupportedOperationException(EmojiPickerConstants.REMOVE_VIEW_EXCEPTION_MESSAGE) + } +} diff --git a/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/EmojiView.kt b/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/EmojiView.kt new file mode 100644 index 00000000..d25831d8 --- /dev/null +++ b/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/EmojiView.kt @@ -0,0 +1,187 @@ +/* + * Copyright 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package androidx.emoji2.emojipicker + +import android.content.Context +import android.graphics.Bitmap +import android.graphics.Canvas +import android.graphics.Color +import android.graphics.Paint +import android.graphics.Rect +import android.os.Build +import android.text.Layout +import android.text.Spanned +import android.text.StaticLayout +import android.text.TextPaint +import android.util.AttributeSet +import android.util.TypedValue +import android.view.View +import androidx.annotation.RequiresApi +import androidx.core.graphics.applyCanvas +import androidx.emoji2.text.EmojiCompat + +/** A customized view to support drawing emojis asynchronously. */ +internal class EmojiView +@JvmOverloads +constructor( + context: Context, + attrs: AttributeSet? = null, +) : View(context, attrs) { + + companion object { + private const val EMOJI_DRAW_TEXT_SIZE_SP = 30 + } + + init { + background = context.getDrawable(R.drawable.ripple_emoji_view) + importantForAccessibility = IMPORTANT_FOR_ACCESSIBILITY_YES + } + + internal var willDrawVariantIndicator: Boolean = true + + private val textPaint = + TextPaint(Paint.ANTI_ALIAS_FLAG or Paint.FILTER_BITMAP_FLAG).apply { + textSize = + TypedValue.applyDimension( + TypedValue.COMPLEX_UNIT_SP, + EMOJI_DRAW_TEXT_SIZE_SP.toFloat(), + context.resources.displayMetrics + ) + } + + private val offscreenCanvasBitmap: Bitmap = + with(textPaint.fontMetricsInt) { + val size = bottom - top + Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888) + } + + override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { + val size = + minOf(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.getSize(heightMeasureSpec)) - + context.resources.getDimensionPixelSize(R.dimen.emoji_picker_emoji_view_padding) + setMeasuredDimension(size, size) + } + + override fun draw(canvas: Canvas) { + super.draw(canvas) + canvas.run { + save() + scale( + width.toFloat() / offscreenCanvasBitmap.width, + height.toFloat() / offscreenCanvasBitmap.height + ) + drawBitmap(offscreenCanvasBitmap, 0f, 0f, null) + restore() + } + } + + var emoji: CharSequence? = null + set(value) { + field = value + post { + if (value != null) { + if (value == this.emoji) { + drawEmoji( + if (EmojiPickerView.emojiCompatLoaded) + EmojiCompat.get().process(value) ?: value + else value, + drawVariantIndicator = + willDrawVariantIndicator && + BundledEmojiListLoader.getEmojiVariantsLookup() + .containsKey(value) + ) + contentDescription = value + } + invalidate() + } else { + offscreenCanvasBitmap.eraseColor(Color.TRANSPARENT) + } + } + } + + private fun drawEmoji(emoji: CharSequence, drawVariantIndicator: Boolean) { + offscreenCanvasBitmap.eraseColor(Color.TRANSPARENT) + offscreenCanvasBitmap.applyCanvas { + if (emoji is Spanned) { + createStaticLayout(emoji, width).draw(this) + } else { + val textWidth = textPaint.measureText(emoji, 0, emoji.length) + drawText( + emoji, + /* start = */ 0, + /* end = */ emoji.length, + /* x = */ (width - textWidth) / 2, + /* y = */ -textPaint.fontMetrics.top, + textPaint, + ) + } + if (drawVariantIndicator) { + context + .getDrawable(R.drawable.variant_availability_indicator) + ?.apply { + val canvasWidth = this@applyCanvas.width + val canvasHeight = this@applyCanvas.height + val indicatorWidth = + context.resources.getDimensionPixelSize( + R.dimen.variant_availability_indicator_width + ) + val indicatorHeight = + context.resources.getDimensionPixelSize( + R.dimen.variant_availability_indicator_height + ) + bounds = + Rect( + canvasWidth - indicatorWidth, + canvasHeight - indicatorHeight, + canvasWidth, + canvasHeight + ) + }!! + .draw(this) + } + } + } + + @RequiresApi(23) + internal object Api23Impl { + fun createStaticLayout(emoji: Spanned, textPaint: TextPaint, width: Int): StaticLayout = + StaticLayout.Builder.obtain(emoji, 0, emoji.length, textPaint, width) + .apply { + setAlignment(Layout.Alignment.ALIGN_CENTER) + setLineSpacing(/* spacingAdd= */ 0f, /* spacingMult= */ 1f) + setIncludePad(false) + } + .build() + } + + private fun createStaticLayout(emoji: Spanned, width: Int): StaticLayout { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + return Api23Impl.createStaticLayout(emoji, textPaint, width) + } else { + @Suppress("DEPRECATION") + return StaticLayout( + emoji, + textPaint, + width, + Layout.Alignment.ALIGN_CENTER, + /* spacingmult = */ 1f, + /* spacingadd = */ 0f, + /* includepad = */ false, + ) + } + } +} diff --git a/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/EmojiViewHolder.kt b/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/EmojiViewHolder.kt new file mode 100644 index 00000000..4a8714ea --- /dev/null +++ b/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/EmojiViewHolder.kt @@ -0,0 +1,95 @@ +/* + * Copyright 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package androidx.emoji2.emojipicker + +import android.content.Context +import android.view.View +import android.view.View.OnLongClickListener +import android.view.ViewGroup.LayoutParams +import android.view.accessibility.AccessibilityEvent +import androidx.recyclerview.widget.RecyclerView.ViewHolder + +/** A [ViewHolder] containing an emoji view and emoji data. */ +internal class EmojiViewHolder( + context: Context, + width: Int, + height: Int, + private val stickyVariantProvider: StickyVariantProvider, + private val onEmojiPickedListener: EmojiViewHolder.(EmojiViewItem) -> Unit, + private val onEmojiPickedFromPopupListener: EmojiViewHolder.(String) -> Unit +) : ViewHolder(EmojiView(context)) { + private val onEmojiLongClickListener: OnLongClickListener = + OnLongClickListener { targetEmojiView -> + showEmojiPopup(context, targetEmojiView) + } + + private val emojiView: EmojiView = + (itemView as EmojiView).apply { + layoutParams = LayoutParams(width, height) + isClickable = true + setOnClickListener { + it.sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT) + onEmojiPickedListener(emojiViewItem) + } + } + private lateinit var emojiViewItem: EmojiViewItem + private lateinit var emojiPickerPopupViewController: EmojiPickerPopupViewController + + fun bindEmoji( + emoji: String, + ) { + emojiView.emoji = emoji + emojiViewItem = makeEmojiViewItem(emoji) + + if (emojiViewItem.variants.isNotEmpty()) { + emojiView.setOnLongClickListener(onEmojiLongClickListener) + emojiView.isLongClickable = true + } else { + emojiView.setOnLongClickListener(null) + emojiView.isLongClickable = false + } + } + + private fun showEmojiPopup(context: Context, clickedEmojiView: View): Boolean { + val emojiPickerPopupView = + EmojiPickerPopupView( + context, + /* attrs= */ null, + targetEmojiView = clickedEmojiView, + targetEmojiItem = emojiViewItem, + emojiViewOnClickListener = { view -> + val emojiPickedInPopup = (view as EmojiView).emoji.toString() + onEmojiPickedFromPopupListener(emojiPickedInPopup) + onEmojiPickedListener(makeEmojiViewItem(emojiPickedInPopup)) + // variants[0] is always the base (i.e., primary) emoji + stickyVariantProvider.update(emojiViewItem.variants[0], emojiPickedInPopup) + emojiPickerPopupViewController.dismiss() + // Hover on the base emoji after popup dismissed + clickedEmojiView.sendAccessibilityEvent( + AccessibilityEvent.TYPE_VIEW_HOVER_ENTER + ) + } + ) + emojiPickerPopupViewController = + EmojiPickerPopupViewController(context, emojiPickerPopupView, clickedEmojiView) + emojiPickerPopupViewController.show() + return true + } + + private fun makeEmojiViewItem(emoji: String) = + EmojiViewItem(emoji, BundledEmojiListLoader.getEmojiVariantsLookup()[emoji] ?: listOf()) +} diff --git a/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/EmojiViewItem.kt b/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/EmojiViewItem.kt new file mode 100644 index 00000000..e6121f13 --- /dev/null +++ b/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/EmojiViewItem.kt @@ -0,0 +1,25 @@ +/* + * Copyright 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package androidx.emoji2.emojipicker + +/** + * [EmojiViewItem] is a class holding the displayed emoji and its emoji variants + * + * @param emoji Used to represent the displayed emoji of the [EmojiViewItem]. + * @param variants Used to represent the corresponding emoji variants of this base emoji. + */ +class EmojiViewItem(val emoji: String, val variants: List) diff --git a/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/ItemViewData.kt b/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/ItemViewData.kt new file mode 100644 index 00000000..8bf6bcbc --- /dev/null +++ b/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/ItemViewData.kt @@ -0,0 +1,46 @@ +/* + * Copyright 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package androidx.emoji2.emojipicker + +internal enum class ItemType { + CATEGORY_TITLE, + PLACEHOLDER_TEXT, + EMOJI, +} + +/** Represents an item within the body RecyclerView. */ +internal sealed class ItemViewData(val itemType: ItemType) { + val viewType = itemType.ordinal +} + +/** Title of each category. */ +internal data class CategoryTitle(val title: String) : ItemViewData(ItemType.CATEGORY_TITLE) + +/** Text to display when the category contains no items. */ +internal data class PlaceholderText(val text: String) : ItemViewData(ItemType.PLACEHOLDER_TEXT) + +/** Represents an emoji. */ +internal data class EmojiViewData( + var emoji: String, + val updateToSticky: Boolean = true, + // Needed to ensure uniqueness since we enabled stable Id. + val dataIndex: Int = 0 +) : ItemViewData(ItemType.EMOJI) + +internal object Extensions { + internal fun Int.toItemType() = ItemType.values()[this] +} diff --git a/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/RecentEmojiAsyncProvider.kt b/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/RecentEmojiAsyncProvider.kt new file mode 100644 index 00000000..3661dd3a --- /dev/null +++ b/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/RecentEmojiAsyncProvider.kt @@ -0,0 +1,41 @@ +/* + * Copyright 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package androidx.emoji2.emojipicker + +import com.google.common.util.concurrent.ListenableFuture +import kotlinx.coroutines.guava.await + +/** + * A interface equivalent to [RecentEmojiProvider] that allows java clients to override the + * [ListenableFuture] based function [getRecentEmojiListAsync] in order to provide recent emojis. + */ +interface RecentEmojiAsyncProvider { + fun recordSelection(emoji: String) + + fun getRecentEmojiListAsync(): ListenableFuture> +} + +/** An adapter for the [RecentEmojiAsyncProvider]. */ +class RecentEmojiProviderAdapter(private val recentEmojiAsyncProvider: RecentEmojiAsyncProvider) : + RecentEmojiProvider { + override fun recordSelection(emoji: String) { + recentEmojiAsyncProvider.recordSelection(emoji) + } + + override suspend fun getRecentEmojiList() = + recentEmojiAsyncProvider.getRecentEmojiListAsync().await() +} diff --git a/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/RecentEmojiProvider.kt b/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/RecentEmojiProvider.kt new file mode 100644 index 00000000..edccc637 --- /dev/null +++ b/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/RecentEmojiProvider.kt @@ -0,0 +1,33 @@ +/* + * Copyright 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package androidx.emoji2.emojipicker + +/** An interface to provide recent emoji list. */ +interface RecentEmojiProvider { + /** + * Records an emoji into recent emoji list. This fun will be called when an emoji is selected. + * Clients could specify the behavior to record recently used emojis.(e.g. click frequency). + */ + fun recordSelection(emoji: String) + + /** + * Returns a list of recent emojis. Default behavior: The most recently used emojis will be + * displayed first. Clients could also specify the behavior such as displaying the emojis from + * high click frequency to low click frequency. + */ + suspend fun getRecentEmojiList(): List +} diff --git a/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/StickyVariantProvider.kt b/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/StickyVariantProvider.kt new file mode 100644 index 00000000..8ff80758 --- /dev/null +++ b/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/StickyVariantProvider.kt @@ -0,0 +1,60 @@ +/* + * Copyright 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package androidx.emoji2.emojipicker + +import android.content.Context +import android.content.Context.MODE_PRIVATE + +/** A class that handles user's emoji variant selection using SharedPreferences. */ +internal class StickyVariantProvider(context: Context) { + companion object { + const val PREFERENCES_FILE_NAME = "androidx.emoji2.emojipicker.preferences" + const val STICKY_VARIANT_PROVIDER_KEY = "pref_key_sticky_variant" + const val KEY_VALUE_DELIMITER = "=" + const val ENTRY_DELIMITER = "|" + } + val userUnlocked = context.getSystemService(UserManager::class.java)?.isUserUnlocked ?: true + + private val sharedPreferences = if (userUnlocked) { + context.getSharedPreferences(PREFERENCES_FILE_NAME, MODE_PRIVATE)}else{null} + + private val stickyVariantMap: MutableMap by lazy { + sharedPreferences? + .getString(STICKY_VARIANT_PROVIDER_KEY, null) + ?.split(ENTRY_DELIMITER) + ?.associate { entry -> + entry + .split(KEY_VALUE_DELIMITER, limit = 2) + .takeIf { it.size == 2 } + ?.let { it[0] to it[1] } ?: ("" to "") + } + ?.toMutableMap() ?: mutableMapOf() + } + + internal operator fun get(emoji: String): String = stickyVariantMap[emoji] ?: emoji + + internal fun update(baseEmoji: String, variantClicked: String) { + stickyVariantMap.apply { + if (baseEmoji == variantClicked) { + this.remove(baseEmoji) + } else { + this[baseEmoji] = variantClicked + } + sharedPreferences?.edit()?.putString(STICKY_VARIANT_PROVIDER_KEY, entries.joinToString(ENTRY_DELIMITER))?.commit() + } + } +} diff --git a/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/utils/FileCache.kt b/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/utils/FileCache.kt new file mode 100644 index 00000000..01b2e08b --- /dev/null +++ b/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/utils/FileCache.kt @@ -0,0 +1,149 @@ +/* + * Copyright 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package androidx.emoji2.emojipicker.utils + +import android.content.Context +import android.content.pm.PackageManager +import android.os.Build +import android.util.Log +import androidx.annotation.GuardedBy +import androidx.annotation.RequiresApi +import androidx.annotation.VisibleForTesting +import androidx.core.content.ContextCompat +import androidx.emoji2.emojipicker.BundledEmojiListLoader +import androidx.emoji2.emojipicker.EmojiViewItem +import java.io.File +import java.io.IOException + +/** + * A class that manages cache files for the emoji picker. All cache files are stored in DE (Device + * Encryption) storage (N+), and will be invalidated if device OS version or App version is updated. + * + * Currently this class is only used by [BundledEmojiListLoader]. All renderable emojis will be + * cached by categories under /app.package.name/cache/emoji_picker/ + * /emoji.... + */ +internal class FileCache(context: Context) { + + @VisibleForTesting @GuardedBy("lock") internal val emojiPickerCacheDir: File + private val currentProperty: String + private val lock = Any() + + init { + val osVersion = "${Build.VERSION.SDK_INT}_${Build.TIME}" + val appVersion = getVersionCode(context) + currentProperty = "$osVersion.$appVersion" + emojiPickerCacheDir = + File(getDeviceProtectedStorageContext(context).cacheDir, EMOJI_PICKER_FOLDER) + if (!emojiPickerCacheDir.exists()) emojiPickerCacheDir.mkdir() + } + + /** Get cache for a given file name, or write to a new file using the [defaultValue] factory. */ + internal fun getOrPut( + key: String, + defaultValue: () -> List + ): List { + synchronized(lock) { + val targetDir = File(emojiPickerCacheDir, currentProperty) + // No matching cache folder for current property, clear stale cache directory if any + if (!targetDir.exists()) { + emojiPickerCacheDir.listFiles()?.forEach { it.deleteRecursively() } + targetDir.mkdirs() + } + + val targetFile = File(targetDir, key) + return readFrom(targetFile) ?: writeTo(targetFile, defaultValue) + } + } + + private fun readFrom(targetFile: File): List? { + if (!targetFile.isFile) return null + return targetFile + .bufferedReader() + .useLines { it.toList() } + .map { it.split(",") } + .map { EmojiViewItem(it.first(), it.drop(1)) } + } + + private fun writeTo( + targetFile: File, + defaultValue: () -> List + ): List { + val data = defaultValue.invoke() + if (targetFile.exists()) { + if (!targetFile.delete()) { + Log.wtf(TAG, "Can't delete file: $targetFile") + } + } + if (!targetFile.createNewFile()) { + throw IOException("Can't create file: $targetFile") + } + targetFile.bufferedWriter().use { out -> + for (emoji in data) { + out.write(emoji.emoji) + emoji.variants.forEach { out.write(",$it") } + out.newLine() + } + } + return data + } + + /** Returns a new [context] for accessing device protected storage. */ + private fun getDeviceProtectedStorageContext(context: Context) = + context.takeIf { ContextCompat.isDeviceProtectedStorage(it) } + ?: run { ContextCompat.createDeviceProtectedStorageContext(context) } + ?: context + + /** Gets the version code for a package. */ + @Suppress("DEPRECATION") + private fun getVersionCode(context: Context): Long = + try { + if (Build.VERSION.SDK_INT >= 33) Api33Impl.getAppVersionCode(context) + else if (Build.VERSION.SDK_INT >= 28) Api28Impl.getAppVersionCode(context) + else context.packageManager.getPackageInfo(context.packageName, 0).versionCode.toLong() + } catch (e: PackageManager.NameNotFoundException) { + // Default version to 1 + 1 + } + + companion object { + @Volatile private var instance: FileCache? = null + + internal fun getInstance(context: Context): FileCache = + instance ?: synchronized(this) { instance ?: FileCache(context).also { instance = it } } + + private const val EMOJI_PICKER_FOLDER = "emoji_picker" + private const val TAG = "emojipicker.FileCache" + } + + @RequiresApi(Build.VERSION_CODES.TIRAMISU) + internal object Api33Impl { + fun getAppVersionCode(context: Context) = + context.packageManager + .getPackageInfo(context.packageName, PackageManager.PackageInfoFlags.of(0)) + .longVersionCode + } + + @Suppress("DEPRECATION") + @RequiresApi(Build.VERSION_CODES.P) + internal object Api28Impl { + fun getAppVersionCode(context: Context) = + context.packageManager + .getPackageInfo(context.packageName, /* flags= */ 0) + .longVersionCode + } +} diff --git a/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/utils/UnicodeRenderableManager.kt b/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/utils/UnicodeRenderableManager.kt new file mode 100644 index 00000000..d13af541 --- /dev/null +++ b/emojipicker/app/src/main/androidx/java/androidx/emoji2/emojipicker/utils/UnicodeRenderableManager.kt @@ -0,0 +1,83 @@ +/* + * Copyright 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package androidx.emoji2.emojipicker.utils + +import android.os.Build +import android.text.TextPaint +import androidx.annotation.VisibleForTesting +import androidx.core.graphics.PaintCompat +import androidx.emoji2.emojipicker.EmojiPickerView +import androidx.emoji2.text.EmojiCompat + +/** Checks renderability of unicode characters. */ +internal object UnicodeRenderableManager { + + private const val VARIATION_SELECTOR = "\uFE0F" + + private const val YAWNING_FACE_EMOJI = "\uD83E\uDD71" + + private val paint = TextPaint() + + /** + * Some emojis were usual (non-emoji) characters. Old devices cannot render them with variation + * selector (U+FE0F) so it's worth trying to check renderability again without variation + * selector. + */ + private val CATEGORY_MOVED_EMOJIS = + listOf( // These three characters have been emoji since Unicode emoji version 4. + // version 3: https://unicode.org/Public/emoji/3.0/emoji-data.txt + // version 4: https://unicode.org/Public/emoji/4.0/emoji-data.txt + "\u2695\uFE0F", // STAFF OF AESCULAPIUS + "\u2640\uFE0F", // FEMALE SIGN + "\u2642\uFE0F", // MALE SIGN + // These three characters have been emoji since Unicode emoji version 11. + // version 5: https://unicode.org/Public/emoji/5.0/emoji-data.txt + // version 11: https://unicode.org/Public/emoji/11.0/emoji-data.txt + "\u265F\uFE0F", // BLACK_CHESS_PAWN + "\u267E\uFE0F" // PERMANENT_PAPER_SIGN + ) + + /** + * For a given emoji, check it's renderability with EmojiCompat if enabled. Otherwise, use + * [PaintCompat#hasGlyph]. + * + * Note: For older API version, codepoints {@code U+0xFE0F} are removed. + */ + internal fun isEmojiRenderable(emoji: String) = + if (EmojiPickerView.emojiCompatLoaded) + EmojiCompat.get().getEmojiMatch(emoji, Int.MAX_VALUE) == EmojiCompat.EMOJI_SUPPORTED + else getClosestRenderable(emoji) != null + + // Yawning face is added in emoji 12 which is the first version starts to support gender + // inclusive emojis. + internal fun isEmoji12Supported() = isEmojiRenderable(YAWNING_FACE_EMOJI) + + @VisibleForTesting + fun getClosestRenderable(emoji: String): String? { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) { + return emoji.replace(VARIATION_SELECTOR, "").takeIfHasGlyph() + } + return emoji.takeIfHasGlyph() + ?: run { + if (CATEGORY_MOVED_EMOJIS.contains(emoji)) + emoji.replace(VARIATION_SELECTOR, "").takeIfHasGlyph() + else null + } + } + + private fun String.takeIfHasGlyph() = takeIf { PaintCompat.hasGlyph(paint, this) } +} diff --git a/emojipicker/app/src/main/androidx/res/anim/slide_down_and_fade_out.xml b/emojipicker/app/src/main/androidx/res/anim/slide_down_and_fade_out.xml new file mode 100644 index 00000000..39f3163e --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/anim/slide_down_and_fade_out.xml @@ -0,0 +1,31 @@ + + + + + + + + \ No newline at end of file diff --git a/emojipicker/app/src/main/androidx/res/anim/slide_up_and_fade_in.xml b/emojipicker/app/src/main/androidx/res/anim/slide_up_and_fade_in.xml new file mode 100644 index 00000000..5dad0a8e --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/anim/slide_up_and_fade_in.xml @@ -0,0 +1,31 @@ + + + + + + + + \ No newline at end of file diff --git a/emojipicker/app/src/main/androidx/res/drawable/couple_heart_men_shadow_skintone.xml b/emojipicker/app/src/main/androidx/res/drawable/couple_heart_men_shadow_skintone.xml new file mode 100644 index 00000000..e480cbf5 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/drawable/couple_heart_men_shadow_skintone.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/app/src/main/androidx/res/drawable/couple_heart_men_skintone_shadow.xml b/emojipicker/app/src/main/androidx/res/drawable/couple_heart_men_skintone_shadow.xml new file mode 100644 index 00000000..6d54233c --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/drawable/couple_heart_men_skintone_shadow.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/app/src/main/androidx/res/drawable/couple_heart_people_shadow_skintone.xml b/emojipicker/app/src/main/androidx/res/drawable/couple_heart_people_shadow_skintone.xml new file mode 100644 index 00000000..219fb0aa --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/drawable/couple_heart_people_shadow_skintone.xml @@ -0,0 +1,218 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/emojipicker/app/src/main/androidx/res/drawable/couple_heart_people_skintone_shadow.xml b/emojipicker/app/src/main/androidx/res/drawable/couple_heart_people_skintone_shadow.xml new file mode 100644 index 00000000..09e95e56 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/drawable/couple_heart_people_skintone_shadow.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/app/src/main/androidx/res/drawable/couple_heart_woman_man_shadow_skintone.xml b/emojipicker/app/src/main/androidx/res/drawable/couple_heart_woman_man_shadow_skintone.xml new file mode 100644 index 00000000..1107c60c --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/drawable/couple_heart_woman_man_shadow_skintone.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/app/src/main/androidx/res/drawable/couple_heart_woman_man_skintone_shadow.xml b/emojipicker/app/src/main/androidx/res/drawable/couple_heart_woman_man_skintone_shadow.xml new file mode 100644 index 00000000..1334b677 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/drawable/couple_heart_woman_man_skintone_shadow.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/app/src/main/androidx/res/drawable/couple_heart_women_shadow_skintone.xml b/emojipicker/app/src/main/androidx/res/drawable/couple_heart_women_shadow_skintone.xml new file mode 100644 index 00000000..4fe76d7d --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/drawable/couple_heart_women_shadow_skintone.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/app/src/main/androidx/res/drawable/couple_heart_women_skintone_shadow.xml b/emojipicker/app/src/main/androidx/res/drawable/couple_heart_women_skintone_shadow.xml new file mode 100644 index 00000000..b8b66009 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/drawable/couple_heart_women_skintone_shadow.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/app/src/main/androidx/res/drawable/gm_filled_emoji_emotions_vd_theme_24.xml b/emojipicker/app/src/main/androidx/res/drawable/gm_filled_emoji_emotions_vd_theme_24.xml new file mode 100644 index 00000000..ba3a8688 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/drawable/gm_filled_emoji_emotions_vd_theme_24.xml @@ -0,0 +1,26 @@ + + + + + diff --git a/emojipicker/app/src/main/androidx/res/drawable/gm_filled_emoji_events_vd_theme_24.xml b/emojipicker/app/src/main/androidx/res/drawable/gm_filled_emoji_events_vd_theme_24.xml new file mode 100644 index 00000000..864a0cda --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/drawable/gm_filled_emoji_events_vd_theme_24.xml @@ -0,0 +1,26 @@ + + + + + diff --git a/emojipicker/app/src/main/androidx/res/drawable/gm_filled_emoji_food_beverage_vd_theme_24.xml b/emojipicker/app/src/main/androidx/res/drawable/gm_filled_emoji_food_beverage_vd_theme_24.xml new file mode 100644 index 00000000..e7722102 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/drawable/gm_filled_emoji_food_beverage_vd_theme_24.xml @@ -0,0 +1,29 @@ + + + + + + diff --git a/emojipicker/app/src/main/androidx/res/drawable/gm_filled_emoji_nature_vd_theme_24.xml b/emojipicker/app/src/main/androidx/res/drawable/gm_filled_emoji_nature_vd_theme_24.xml new file mode 100644 index 00000000..7d9d06b4 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/drawable/gm_filled_emoji_nature_vd_theme_24.xml @@ -0,0 +1,29 @@ + + + + + + diff --git a/emojipicker/app/src/main/androidx/res/drawable/gm_filled_emoji_objects_vd_theme_24.xml b/emojipicker/app/src/main/androidx/res/drawable/gm_filled_emoji_objects_vd_theme_24.xml new file mode 100644 index 00000000..0e38ec46 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/drawable/gm_filled_emoji_objects_vd_theme_24.xml @@ -0,0 +1,26 @@ + + + + + diff --git a/emojipicker/app/src/main/androidx/res/drawable/gm_filled_emoji_people_vd_theme_24.xml b/emojipicker/app/src/main/androidx/res/drawable/gm_filled_emoji_people_vd_theme_24.xml new file mode 100644 index 00000000..882a024f --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/drawable/gm_filled_emoji_people_vd_theme_24.xml @@ -0,0 +1,29 @@ + + + + + + \ No newline at end of file diff --git a/emojipicker/app/src/main/androidx/res/drawable/gm_filled_emoji_symbols_vd_theme_24.xml b/emojipicker/app/src/main/androidx/res/drawable/gm_filled_emoji_symbols_vd_theme_24.xml new file mode 100644 index 00000000..0cbe0eaf --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/drawable/gm_filled_emoji_symbols_vd_theme_24.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + diff --git a/emojipicker/app/src/main/androidx/res/drawable/gm_filled_emoji_transportation_vd_theme_24.xml b/emojipicker/app/src/main/androidx/res/drawable/gm_filled_emoji_transportation_vd_theme_24.xml new file mode 100644 index 00000000..63d96993 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/drawable/gm_filled_emoji_transportation_vd_theme_24.xml @@ -0,0 +1,41 @@ + + + + + + + + + + diff --git a/emojipicker/app/src/main/androidx/res/drawable/gm_filled_flag_vd_theme_24.xml b/emojipicker/app/src/main/androidx/res/drawable/gm_filled_flag_vd_theme_24.xml new file mode 100644 index 00000000..a5ebe269 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/drawable/gm_filled_flag_vd_theme_24.xml @@ -0,0 +1,26 @@ + + + + + diff --git a/emojipicker/app/src/main/androidx/res/drawable/handshake_shadow_skintone.xml b/emojipicker/app/src/main/androidx/res/drawable/handshake_shadow_skintone.xml new file mode 100644 index 00000000..04259f35 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/drawable/handshake_shadow_skintone.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/emojipicker/app/src/main/androidx/res/drawable/handshake_skintone_shadow.xml b/emojipicker/app/src/main/androidx/res/drawable/handshake_skintone_shadow.xml new file mode 100644 index 00000000..dfe4f213 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/drawable/handshake_skintone_shadow.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/emojipicker/app/src/main/androidx/res/drawable/holding_men_shadow_skintone.xml b/emojipicker/app/src/main/androidx/res/drawable/holding_men_shadow_skintone.xml new file mode 100644 index 00000000..4b84e94a --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/drawable/holding_men_shadow_skintone.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/app/src/main/androidx/res/drawable/holding_men_skintone_shadow.xml b/emojipicker/app/src/main/androidx/res/drawable/holding_men_skintone_shadow.xml new file mode 100644 index 00000000..e9def1c6 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/drawable/holding_men_skintone_shadow.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/app/src/main/androidx/res/drawable/holding_people_shadow_skintone.xml b/emojipicker/app/src/main/androidx/res/drawable/holding_people_shadow_skintone.xml new file mode 100644 index 00000000..ebbd0f4c --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/drawable/holding_people_shadow_skintone.xml @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/app/src/main/androidx/res/drawable/holding_people_skintone_shadow.xml b/emojipicker/app/src/main/androidx/res/drawable/holding_people_skintone_shadow.xml new file mode 100644 index 00000000..039b6207 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/drawable/holding_people_skintone_shadow.xml @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/app/src/main/androidx/res/drawable/holding_woman_man_shadow_skintone.xml b/emojipicker/app/src/main/androidx/res/drawable/holding_woman_man_shadow_skintone.xml new file mode 100644 index 00000000..a921ec26 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/drawable/holding_woman_man_shadow_skintone.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/app/src/main/androidx/res/drawable/holding_woman_man_skintone_shadow.xml b/emojipicker/app/src/main/androidx/res/drawable/holding_woman_man_skintone_shadow.xml new file mode 100644 index 00000000..85c33276 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/drawable/holding_woman_man_skintone_shadow.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/app/src/main/androidx/res/drawable/holding_women_shadow_skintone.xml b/emojipicker/app/src/main/androidx/res/drawable/holding_women_shadow_skintone.xml new file mode 100644 index 00000000..0e918b99 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/drawable/holding_women_shadow_skintone.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/app/src/main/androidx/res/drawable/holding_women_skintone_shadow.xml b/emojipicker/app/src/main/androidx/res/drawable/holding_women_skintone_shadow.xml new file mode 100644 index 00000000..035cc21e --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/drawable/holding_women_skintone_shadow.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/app/src/main/androidx/res/drawable/icon_tint_selector.xml b/emojipicker/app/src/main/androidx/res/drawable/icon_tint_selector.xml new file mode 100644 index 00000000..c1531b66 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/drawable/icon_tint_selector.xml @@ -0,0 +1,20 @@ + + + + + + diff --git a/emojipicker/app/src/main/androidx/res/drawable/kiss_men_shadow_skintone.xml b/emojipicker/app/src/main/androidx/res/drawable/kiss_men_shadow_skintone.xml new file mode 100644 index 00000000..e3df38d5 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/drawable/kiss_men_shadow_skintone.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/app/src/main/androidx/res/drawable/kiss_men_skintone_shadow.xml b/emojipicker/app/src/main/androidx/res/drawable/kiss_men_skintone_shadow.xml new file mode 100644 index 00000000..2abbd884 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/drawable/kiss_men_skintone_shadow.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/app/src/main/androidx/res/drawable/kiss_people_shadow_skintone.xml b/emojipicker/app/src/main/androidx/res/drawable/kiss_people_shadow_skintone.xml new file mode 100644 index 00000000..ddaa4839 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/drawable/kiss_people_shadow_skintone.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/app/src/main/androidx/res/drawable/kiss_people_skintone_shadow.xml b/emojipicker/app/src/main/androidx/res/drawable/kiss_people_skintone_shadow.xml new file mode 100644 index 00000000..f81d8633 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/drawable/kiss_people_skintone_shadow.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/app/src/main/androidx/res/drawable/kiss_woman_man_shadow_skintone.xml b/emojipicker/app/src/main/androidx/res/drawable/kiss_woman_man_shadow_skintone.xml new file mode 100644 index 00000000..11831237 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/drawable/kiss_woman_man_shadow_skintone.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/app/src/main/androidx/res/drawable/kiss_woman_man_skintone_shadow.xml b/emojipicker/app/src/main/androidx/res/drawable/kiss_woman_man_skintone_shadow.xml new file mode 100644 index 00000000..5ded1f96 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/drawable/kiss_woman_man_skintone_shadow.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/app/src/main/androidx/res/drawable/kiss_women_shadow_skintone.xml b/emojipicker/app/src/main/androidx/res/drawable/kiss_women_shadow_skintone.xml new file mode 100644 index 00000000..555d28cd --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/drawable/kiss_women_shadow_skintone.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/app/src/main/androidx/res/drawable/kiss_women_skintone_shadow.xml b/emojipicker/app/src/main/androidx/res/drawable/kiss_women_skintone_shadow.xml new file mode 100644 index 00000000..61d91624 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/drawable/kiss_women_skintone_shadow.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/app/src/main/androidx/res/drawable/popup_view_rounded_background.xml b/emojipicker/app/src/main/androidx/res/drawable/popup_view_rounded_background.xml new file mode 100644 index 00000000..65b86b30 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/drawable/popup_view_rounded_background.xml @@ -0,0 +1,21 @@ + + + + + + + \ No newline at end of file diff --git a/emojipicker/app/src/main/androidx/res/drawable/quantum_gm_ic_access_time_filled_vd_theme_24.xml b/emojipicker/app/src/main/androidx/res/drawable/quantum_gm_ic_access_time_filled_vd_theme_24.xml new file mode 100644 index 00000000..28aa933e --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/drawable/quantum_gm_ic_access_time_filled_vd_theme_24.xml @@ -0,0 +1,26 @@ + + + + + diff --git a/emojipicker/app/src/main/androidx/res/drawable/ripple_emoji_view.xml b/emojipicker/app/src/main/androidx/res/drawable/ripple_emoji_view.xml new file mode 100644 index 00000000..f42fea4a --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/drawable/ripple_emoji_view.xml @@ -0,0 +1,25 @@ + + + + + + + + + + \ No newline at end of file diff --git a/emojipicker/app/src/main/androidx/res/drawable/ripple_image_view.xml b/emojipicker/app/src/main/androidx/res/drawable/ripple_image_view.xml new file mode 100644 index 00000000..4c0c3a46 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/drawable/ripple_image_view.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/app/src/main/androidx/res/drawable/swap_horiz_vd_theme_24.xml b/emojipicker/app/src/main/androidx/res/drawable/swap_horiz_vd_theme_24.xml new file mode 100644 index 00000000..e3684d49 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/drawable/swap_horiz_vd_theme_24.xml @@ -0,0 +1,26 @@ + + + + + diff --git a/emojipicker/app/src/main/androidx/res/drawable/underline_rounded.xml b/emojipicker/app/src/main/androidx/res/drawable/underline_rounded.xml new file mode 100644 index 00000000..df2aecec --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/drawable/underline_rounded.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/emojipicker/app/src/main/androidx/res/drawable/variant_availability_indicator.xml b/emojipicker/app/src/main/androidx/res/drawable/variant_availability_indicator.xml new file mode 100644 index 00000000..7415fab2 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/drawable/variant_availability_indicator.xml @@ -0,0 +1,26 @@ + + + + + \ No newline at end of file diff --git a/emojipicker/app/src/main/androidx/res/layout/category_text_view.xml b/emojipicker/app/src/main/androidx/res/layout/category_text_view.xml new file mode 100644 index 00000000..d5ee11de --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/layout/category_text_view.xml @@ -0,0 +1,35 @@ + + + + + + diff --git a/emojipicker/app/src/main/androidx/res/layout/emoji_picker.xml b/emojipicker/app/src/main/androidx/res/layout/emoji_picker.xml new file mode 100644 index 00000000..84192cc8 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/layout/emoji_picker.xml @@ -0,0 +1,33 @@ + + + + + + + + diff --git a/emojipicker/app/src/main/androidx/res/layout/emoji_picker_popup_bidirectional.xml b/emojipicker/app/src/main/androidx/res/layout/emoji_picker_popup_bidirectional.xml new file mode 100644 index 00000000..be0c3df7 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/layout/emoji_picker_popup_bidirectional.xml @@ -0,0 +1,26 @@ + + + diff --git a/emojipicker/app/src/main/androidx/res/layout/emoji_picker_popup_emoji_view.xml b/emojipicker/app/src/main/androidx/res/layout/emoji_picker_popup_emoji_view.xml new file mode 100644 index 00000000..d50dd939 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/layout/emoji_picker_popup_emoji_view.xml @@ -0,0 +1,32 @@ + + + + + + diff --git a/emojipicker/app/src/main/androidx/res/layout/emoji_picker_popup_image_view.xml b/emojipicker/app/src/main/androidx/res/layout/emoji_picker_popup_image_view.xml new file mode 100644 index 00000000..da10bf12 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/layout/emoji_picker_popup_image_view.xml @@ -0,0 +1,27 @@ + + + + diff --git a/emojipicker/app/src/main/androidx/res/layout/empty_category_text_view.xml b/emojipicker/app/src/main/androidx/res/layout/empty_category_text_view.xml new file mode 100644 index 00000000..71a75912 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/layout/empty_category_text_view.xml @@ -0,0 +1,25 @@ + + + diff --git a/emojipicker/app/src/main/androidx/res/layout/header_icon_holder.xml b/emojipicker/app/src/main/androidx/res/layout/header_icon_holder.xml new file mode 100644 index 00000000..dd4ba743 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/layout/header_icon_holder.xml @@ -0,0 +1,38 @@ + + + + + + + diff --git a/emojipicker/app/src/main/androidx/res/layout/variant_popup.xml b/emojipicker/app/src/main/androidx/res/layout/variant_popup.xml new file mode 100644 index 00000000..3a90b181 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/layout/variant_popup.xml @@ -0,0 +1,27 @@ + + + + \ No newline at end of file diff --git a/emojipicker/app/src/main/androidx/res/raw/emoji_category_activity.csv b/emojipicker/app/src/main/androidx/res/raw/emoji_category_activity.csv new file mode 100644 index 00000000..ff009b32 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/raw/emoji_category_activity.csv @@ -0,0 +1,115 @@ +🎉 +🎊 +🎈 +🎂 +🎀 +🎁 +🎇 +🎆 +🧨 +🧧 +🪔 +🪅 +🪩 +🎐 +🎏 +🎎 +🎑 +🎍 +🎋 +🎄 +🎃 +🎗️ +🥇 +🥈 +🥉 +🏅 +🎖️ +🏆 +📢 +⚽ +⚾ +🥎 +🏀 +🏐 +🏈 +🏉 +🥅 +🎾 +🏸 +🥍 +🏏 +🏑 +🏒 +🥌 +🛷 +🎿 +⛸️ +🛼 +🩰 +🛹 +⛳ +🎯 +🏹 +🥏 +🪃 +🪁 +🎣 +🤿 +🩱 +🎽 +🥋 +🥊 +🎱 +🏓 +🎳 +♟️ +🪀 +🧩 +🎮 +🕹️ +👾 +🔫 +🎲 +🎰 +🎴 +🀄 +🃏 +🪄 +🎩 +📷 +📸 +🖼️ +🎨 +🖌️ +🖍️ +🪡 +🧵 +🧶 +🎹 +🎷 +🎺 +🎸 +🪕 +🎻 +🪘 +🥁 +🪇 +🪈 +🪗 +🎤 +🎧 +🎚️ +🎛️ +🎙️ +📻 +📺 +📼 +📹 +📽️ +🎥 +🎞️ +🎬 +🎭 +🎫 +🎟️ diff --git a/emojipicker/app/src/main/androidx/res/raw/emoji_category_animals_nature.csv b/emojipicker/app/src/main/androidx/res/raw/emoji_category_animals_nature.csv new file mode 100644 index 00000000..40a39944 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/raw/emoji_category_animals_nature.csv @@ -0,0 +1,223 @@ +💐 +🌹 +🥀 +🌺 +🌷 +🪷 +🌸 +💮 +🏵️ +🪻 +🌻 +🌼 +🍂 +🍁 +🍄 +🌾 +🌱 +🌿 +🍃 +☘️ +🍀 +🪴 +🌵 +🌴 +🌳 +🌲 +🪵 +🪹 +🪺 +🪨 +⛰️ +🏔️ +❄️ +☃️ +⛄ +🌫️ +🌡️ +🔥 +🌋 +🏜️ +🏞️ +🏝️ +🏖️ +🌅 +🌄 +🌈 +🫧 +🌊 +🌬️ +🌀 +🌪️ +⚡ +☔ +💧 +☁️ +🌨️ +🌧️ +🌩️ +⛈️ +🌦️ +🌥️ +⛅ +🌤️ +☀️ +🌞 +🌝 +🌚 +🌜 +🌛 +⭐ +🌟 +✨ +💫 +🌙 +☄️ +🕳️ +🌠 +🌌 +🌍 +🌎 +🌏 +🪐 +🌑 +🌒 +🌓 +🌔 +🌕 +🌖 +🌗 +🌘 +🙈 +🙉 +🙊 +🐵 +🦁 +🐯 +🐱 +🐶 +🐺 +🐻 +🐻‍❄️ +🐨 +🐼 +🐹 +🐭 +🐰 +🦊 +🦝 +🐮 +🐷 +🐽 +🐗 +🦓 +🦄 +🐴 +🫎 +🐲 +🦎 +🐉 +🦖 +🦕 +🐢 +🐊 +🐍 +🐸 +🐇 +🐁 +🐀 +🐈 +🐈‍⬛ +🐩 +🐕 +🦮 +🐕‍🦺 +🐖 +🐎 +🫏 +🐄 +🐂 +🐃 +🦬 +🐏 +🐑 +🐐 +🦌 +🦙 +🦥 +🦘 +🐘 +🦣 +🦏 +🦛 +🦒 +🐆 +🐅 +🐒 +🦍 +🦧 +🐪 +🐫 +🐿️ +🦫 +🦨 +🦡 +🦔 +🦦 +🦇 +🪽 +🪶 +🐦 +🐦‍⬛ +🐓 +🐔 +🐣 +🐤 +🐥 +🦅 +🦉 +🦜 +🕊️ +🦤 +🦢 +🦆 +🪿 +🦩 +🦚 +🐦‍🔥 +🦃 +🐧 +🦭 +🦈 +🐬 +🐋 +🐳 +🐟 +🐠 +🐡 +🦐 +🦞 +🦀 +🦑 +🐙 +🪼 +🦪 +🪸 +🦂 +🕷️ +🕸️ +🐚 +🐌 +🐜 +🦗 +🪲 +🦟 +🪳 +🪰 +🐝 +🐞 +🦋 +🐛 +🪱 +🦠 +🐾 diff --git a/emojipicker/app/src/main/androidx/res/raw/emoji_category_emotions.csv b/emojipicker/app/src/main/androidx/res/raw/emoji_category_emotions.csv new file mode 100644 index 00000000..176daa67 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/raw/emoji_category_emotions.csv @@ -0,0 +1,242 @@ +😀 +😃 +😄 +😁 +😆 +😅 +😂 +🤣 +😭 +😉 +😗 +😙 +😚 +😘 +🥰 +😍 +🤩 +🥳 +🫠 +🙃 +🙂 +🥲 +🥹 +😊 +☺️ +😌 +🙂‍↕️ +🙂‍↔️ +😏 +🤤 +😋 +😛 +😝 +😜 +🤪 +🥴 +😔 +🥺 +😬 +😑 +😐 +😶 +😶‍🌫️ +🫥 +🤐 +🫡 +🤔 +🤫 +🫢 +🤭 +🥱 +🤗 +🫣 +😱 +🤨 +🧐 +😒 +🙄 +😮‍💨 +😤 +😠 +😡 +🤬 +😞 +😓 +😟 +😥 +😢 +☹️ +🙁 +🫤 +😕 +😰 +😨 +😧 +😦 +😮 +😯 +😲 +😳 +🤯 +😖 +😣 +😩 +😫 +😵 +😵‍💫 +🫨 +🥶 +🥵 +🤢 +🤮 +😴 +😪 +🤧 +🤒 +🤕 +😷 +🤥 +😇 +🤠 +🤑 +🤓 +😎 +🥸 +🤡 +😈 +👿 +👻 +💀 +☠️ +👹 +👺 +🎃 +💩 +🤖 +👽 +👾 +🌚 +🌝 +🌞 +🌛 +🌜 +🙈 +🙉 +🙊 +😺 +😸 +😹 +😻 +😼 +😽 +🙀 +😿 +😾 +💫 +⭐ +🌟 +✨ +💥 +💨 +💦 +💤 +🕳️ +🔥 +💯 +🎉 +❤️ +🧡 +💛 +💚 +🩵 +💙 +💜 +🤎 +🖤 +🩶 +🤍 +🩷 +💘 +💝 +💖 +💗 +💓 +💞 +💕 +💌 +💟 +♥️ +❣️ +❤️‍🩹 +💔 +❤️‍🔥 +💋 +🫂 +👥 +👤 +🗣️ +👣 +🧠 +🫀 +🫁 +🩸 +🦠 +🦷 +🦴 +👀 +👁️ +👄 +🫦 +👅 +👃,👃,👃🏻,👃🏼,👃🏽,👃🏾,👃🏿 +👂,👂,👂🏻,👂🏼,👂🏽,👂🏾,👂🏿 +🦻,🦻,🦻🏻,🦻🏼,🦻🏽,🦻🏾,🦻🏿 +🦶,🦶,🦶🏻,🦶🏼,🦶🏽,🦶🏾,🦶🏿 +🦵,🦵,🦵🏻,🦵🏼,🦵🏽,🦵🏾,🦵🏿 +🦿 +🦾 +💪,💪,💪🏻,💪🏼,💪🏽,💪🏾,💪🏿 +👏,👏,👏🏻,👏🏼,👏🏽,👏🏾,👏🏿 +👍,👍,👍🏻,👍🏼,👍🏽,👍🏾,👍🏿 +👎,👎,👎🏻,👎🏼,👎🏽,👎🏾,👎🏿 +🫶,🫶,🫶🏻,🫶🏼,🫶🏽,🫶🏾,🫶🏿 +🙌,🙌,🙌🏻,🙌🏼,🙌🏽,🙌🏾,🙌🏿 +👐,👐,👐🏻,👐🏼,👐🏽,👐🏾,👐🏿 +🤲,🤲,🤲🏻,🤲🏼,🤲🏽,🤲🏾,🤲🏿 +🤜,🤜,🤜🏻,🤜🏼,🤜🏽,🤜🏾,🤜🏿 +🤛,🤛,🤛🏻,🤛🏼,🤛🏽,🤛🏾,🤛🏿 +✊,✊,✊🏻,✊🏼,✊🏽,✊🏾,✊🏿 +👊,👊,👊🏻,👊🏼,👊🏽,👊🏾,👊🏿 +🫳,🫳,🫳🏻,🫳🏼,🫳🏽,🫳🏾,🫳🏿 +🫴,🫴,🫴🏻,🫴🏼,🫴🏽,🫴🏾,🫴🏿 +🫱,🫱,🫱🏻,🫱🏼,🫱🏽,🫱🏾,🫱🏿 +🫲,🫲,🫲🏻,🫲🏼,🫲🏽,🫲🏾,🫲🏿 +🫸,🫸,🫸🏻,🫸🏼,🫸🏽,🫸🏾,🫸🏿 +🫷,🫷,🫷🏻,🫷🏼,🫷🏽,🫷🏾,🫷🏿 +👋,👋,👋🏻,👋🏼,👋🏽,👋🏾,👋🏿 +🤚,🤚,🤚🏻,🤚🏼,🤚🏽,🤚🏾,🤚🏿 +🖐️,🖐️,🖐🏻,🖐🏼,🖐🏽,🖐🏾,🖐🏿 +✋,✋,✋🏻,✋🏼,✋🏽,✋🏾,✋🏿 +🖖,🖖,🖖🏻,🖖🏼,🖖🏽,🖖🏾,🖖🏿 +🤟,🤟,🤟🏻,🤟🏼,🤟🏽,🤟🏾,🤟🏿 +🤘,🤘,🤘🏻,🤘🏼,🤘🏽,🤘🏾,🤘🏿 +✌️,✌️,✌🏻,✌🏼,✌🏽,✌🏾,✌🏿 +🤞,🤞,🤞🏻,🤞🏼,🤞🏽,🤞🏾,🤞🏿 +🫰,🫰,🫰🏻,🫰🏼,🫰🏽,🫰🏾,🫰🏿 +🤙,🤙,🤙🏻,🤙🏼,🤙🏽,🤙🏾,🤙🏿 +🤌,🤌,🤌🏻,🤌🏼,🤌🏽,🤌🏾,🤌🏿 +🤏,🤏,🤏🏻,🤏🏼,🤏🏽,🤏🏾,🤏🏿 +👌,👌,👌🏻,👌🏼,👌🏽,👌🏾,👌🏿 +🫵,🫵,🫵🏻,🫵🏼,🫵🏽,🫵🏾,🫵🏿 +👉,👉,👉🏻,👉🏼,👉🏽,👉🏾,👉🏿 +👈,👈,👈🏻,👈🏼,👈🏽,👈🏾,👈🏿 +☝️,☝️,☝🏻,☝🏼,☝🏽,☝🏾,☝🏿 +👆,👆,👆🏻,👆🏼,👆🏽,👆🏾,👆🏿 +👇,👇,👇🏻,👇🏼,👇🏽,👇🏾,👇🏿 +🖕,🖕,🖕🏻,🖕🏼,🖕🏽,🖕🏾,🖕🏿 +✍️,✍️,✍🏻,✍🏼,✍🏽,✍🏾,✍🏿 +🤳,🤳,🤳🏻,🤳🏼,🤳🏽,🤳🏾,🤳🏿 +🙏,🙏,🙏🏻,🙏🏼,🙏🏽,🙏🏾,🙏🏿 +💅,💅,💅🏻,💅🏼,💅🏽,💅🏾,💅🏿 +🤝,🤝,🤝🏻,🫱🏻‍🫲🏼,🫱🏻‍🫲🏽,🫱🏻‍🫲🏾,🫱🏻‍🫲🏿,🫱🏼‍🫲🏻,🤝🏼,🫱🏼‍🫲🏽,🫱🏼‍🫲🏾,🫱🏼‍🫲🏿,🫱🏽‍🫲🏻,🫱🏽‍🫲🏼,🤝🏽,🫱🏽‍🫲🏾,🫱🏽‍🫲🏿,🫱🏾‍🫲🏻,🫱🏾‍🫲🏼,🫱🏾‍🫲🏽,🤝🏾,🫱🏾‍🫲🏿,🫱🏿‍🫲🏻,🫱🏿‍🫲🏼,🫱🏿‍🫲🏽,🫱🏿‍🫲🏾,🤝🏿 diff --git a/emojipicker/app/src/main/androidx/res/raw/emoji_category_flags.csv b/emojipicker/app/src/main/androidx/res/raw/emoji_category_flags.csv new file mode 100644 index 00000000..c8fd0c06 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/raw/emoji_category_flags.csv @@ -0,0 +1,269 @@ +🏁 +🚩 +🎌 +🏴 +🏳️ +🏳️‍🌈 +🏳️‍⚧️ +🏴‍☠️ +🇦🇨 +🇦🇩 +🇦🇪 +🇦🇫 +🇦🇬 +🇦🇮 +🇦🇱 +🇦🇲 +🇦🇴 +🇦🇶 +🇦🇷 +🇦🇸 +🇦🇹 +🇦🇺 +🇦🇼 +🇦🇽 +🇦🇿 +🇧🇦 +🇧🇧 +🇧🇩 +🇧🇪 +🇧🇫 +🇧🇬 +🇧🇭 +🇧🇮 +🇧🇯 +🇧🇱 +🇧🇲 +🇧🇳 +🇧🇴 +🇧🇶 +🇧🇷 +🇧🇸 +🇧🇹 +🇧🇻 +🇧🇼 +🇧🇾 +🇧🇿 +🇨🇦 +🇨🇨 +🇨🇩 +🇨🇫 +🇨🇬 +🇨🇭 +🇨🇮 +🇨🇰 +🇨🇱 +🇨🇲 +🇨🇳 +🇨🇴 +🇨🇵 +🇨🇷 +🇨🇺 +🇨🇻 +🇨🇼 +🇨🇽 +🇨🇾 +🇨🇿 +🇩🇪 +🇩🇬 +🇩🇯 +🇩🇰 +🇩🇲 +🇩🇴 +🇩🇿 +🇪🇦 +🇪🇨 +🇪🇪 +🇪🇬 +🇪🇭 +🇪🇷 +🇪🇸 +🇪🇹 +🇪🇺 +🇫🇮 +🇫🇯 +🇫🇰 +🇫🇲 +🇫🇴 +🇫🇷 +🇬🇦 +🇬🇧 +🇬🇩 +🇬🇪 +🇬🇫 +🇬🇬 +🇬🇭 +🇬🇮 +🇬🇱 +🇬🇲 +🇬🇳 +🇬🇵 +🇬🇶 +🇬🇷 +🇬🇸 +🇬🇹 +🇬🇺 +🇬🇼 +🇬🇾 +🇭🇰 +🇭🇲 +🇭🇳 +🇭🇷 +🇭🇹 +🇭🇺 +🇮🇨 +🇮🇩 +🇮🇪 +🇮🇱 +🇮🇲 +🇮🇳 +🇮🇴 +🇮🇶 +🇮🇷 +🇮🇸 +🇮🇹 +🇯🇪 +🇯🇲 +🇯🇴 +🇯🇵 +🇰🇪 +🇰🇬 +🇰🇭 +🇰🇮 +🇰🇲 +🇰🇳 +🇰🇵 +🇰🇷 +🇰🇼 +🇰🇾 +🇰🇿 +🇱🇦 +🇱🇧 +🇱🇨 +🇱🇮 +🇱🇰 +🇱🇷 +🇱🇸 +🇱🇹 +🇱🇺 +🇱🇻 +🇱🇾 +🇲🇦 +🇲🇨 +🇲🇩 +🇲🇪 +🇲🇫 +🇲🇬 +🇲🇭 +🇲🇰 +🇲🇱 +🇲🇲 +🇲🇳 +🇲🇴 +🇲🇵 +🇲🇶 +🇲🇷 +🇲🇸 +🇲🇹 +🇲🇺 +🇲🇻 +🇲🇼 +🇲🇽 +🇲🇾 +🇲🇿 +🇳🇦 +🇳🇨 +🇳🇪 +🇳🇫 +🇳🇬 +🇳🇮 +🇳🇱 +🇳🇴 +🇳🇵 +🇳🇷 +🇳🇺 +🇳🇿 +🇴🇲 +🇵🇦 +🇵🇪 +🇵🇫 +🇵🇬 +🇵🇭 +🇵🇰 +🇵🇱 +🇵🇲 +🇵🇳 +🇵🇷 +🇵🇸 +🇵🇹 +🇵🇼 +🇵🇾 +🇶🇦 +🇷🇪 +🇷🇴 +🇷🇸 +🇷🇺 +🇷🇼 +🇸🇦 +🇸🇧 +🇸🇨 +🇸🇩 +🇸🇪 +🇸🇬 +🇸🇭 +🇸🇮 +🇸🇯 +🇸🇰 +🇸🇱 +🇸🇲 +🇸🇳 +🇸🇴 +🇸🇷 +🇸🇸 +🇸🇹 +🇸🇻 +🇸🇽 +🇸🇾 +🇸🇿 +🇹🇦 +🇹🇨 +🇹🇩 +🇹🇫 +🇹🇬 +🇹🇭 +🇹🇯 +🇹🇰 +🇹🇱 +🇹🇲 +🇹🇳 +🇹🇴 +🇹🇷 +🇹🇹 +🇹🇻 +🇹🇼 +🇹🇿 +🇺🇦 +🇺🇬 +🇺🇲 +🇺🇳 +🇺🇸 +🇺🇾 +🇺🇿 +🇻🇦 +🇻🇨 +🇻🇪 +🇻🇬 +🇻🇮 +🇻🇳 +🇻🇺 +🇼🇫 +🇼🇸 +🇽🇰 +🇾🇪 +🇾🇹 +🇿🇦 +🇿🇲 +🇿🇼 +🏴󠁧󠁢󠁥󠁮󠁧󠁿 +🏴󠁧󠁢󠁳󠁣󠁴󠁿 +🏴󠁧󠁢󠁷󠁬󠁳󠁿 diff --git a/emojipicker/app/src/main/androidx/res/raw/emoji_category_food_drink.csv b/emojipicker/app/src/main/androidx/res/raw/emoji_category_food_drink.csv new file mode 100644 index 00000000..8a15f1e4 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/raw/emoji_category_food_drink.csv @@ -0,0 +1,131 @@ +🍓 +🍒 +🍎 +🍉 +🍑 +🍊 +🥭 +🍍 +🍌 +🍋 +🍋‍🟩 +🍈 +🍏 +🍐 +🥝 +🫒 +🫐 +🍇 +🥥 +🍅 +🌶️ +🫚 +🥕 +🧅 +🌽 +🥦 +🥒 +🥬 +🫛 +🫑 +🥑 +🍠 +🍆 +🧄 +🥔 +🍄‍🟫 +🫘 +🌰 +🥜 +🍞 +🫓 +🥐 +🥖 +🥯 +🧇 +🥞 +🍳 +🥚 +🧀 +🥓 +🥩 +🍗 +🍖 +🍔 +🌭 +🥪 +🥨 +🍟 +🍕 +🫔 +🌮 +🌯 +🥙 +🧆 +🥘 +🍝 +🥫 +🫕 +🥣 +🥗 +🍲 +🍛 +🍜 +🦪 +🦞 +🍣 +🍤 +🥡 +🍚 +🍱 +🥟 +🍢 +🍙 +🍘 +🍥 +🍡 +🥠 +🥮 +🍧 +🍨 +🍦 +🥧 +🍰 +🍮 +🎂 +🧁 +🍭 +🍬 +🍫 +🍩 +🍪 +🍯 +🧂 +🧈 +🍿 +🧊 +🫙 +🥤 +🧋 +🧃 +🥛 +🍼 +🍵 +☕ +🫖 +🧉 +🍺 +🍻 +🥂 +🍾 +🍷 +🥃 +🫗 +🍸 +🍹 +🍶 +🥢 +🍴 +🥄 +🔪 +🍽️ diff --git a/emojipicker/app/src/main/androidx/res/raw/emoji_category_objects.csv b/emojipicker/app/src/main/androidx/res/raw/emoji_category_objects.csv new file mode 100644 index 00000000..32c4a4fc --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/raw/emoji_category_objects.csv @@ -0,0 +1,265 @@ +📱 +☎️ +📞 +📟 +📠 +🔌 +🔋 +🪫 +🖲️ +💽 +💾 +💿 +📀 +🖥️ +💻 +⌨️ +🖨️ +🖱️ +🪙 +💸 +💵 +💴 +💶 +💷 +💳 +💰 +🧾 +🧮 +⚖️ +🛒 +🛍️ +🕯️ +💡 +🔦 +🏮 +🧱 +🪟 +🪞 +🚪 +🪑 +🛏️ +🛋️ +🚿 +🛁 +🚽 +🧻 +🪠 +🧸 +🪆 +🧷 +🪢 +🧹 +🧴 +🧽 +🧼 +🪥 +🪒 +🪮 +🧺 +🧦 +🧤 +🧣 +👖 +👕 +🎽 +👚 +👔 +👗 +👘 +🥻 +🩱 +👙 +🩳 +🩲 +🧥 +🥼 +🦺 +⛑️ +🪖 +🎓 +🎩 +👒 +🧢 +👑 +🪭 +🎒 +👝 +👛 +👜 +💼 +🧳 +☂️ +🌂 +💍 +💎 +💄 +👠 +👟 +👞 +🥿 +🩴 +👡 +👢 +🥾 +🦯 +🕶️ +👓 +🥽 +⚗️ +🧫 +🧪 +🌡️ +💉 +💊 +🩹 +🩺 +🩻 +🧬 +🔭 +🔬 +📡 +🛰️ +🧯 +🪓 +🪜 +🪣 +🪝 +🧲 +🧰 +🗜️ +🔩 +🪛 +🪚 +🔧 +🔨 +⚒️ +🛠️ +⛏️ +⚙️ +⛓️‍💥 +🔗 +⛓️ +📎 +🖇️ +📏 +📐 +🖌️ +🖍️ +🖊️ +🖋️ +✒️ +✏️ +📝 +📖 +📚 +📒 +📔 +📕 +📓 +📗 +📘 +📙 +🔖 +🗒️ +📄 +📃 +📋 +📑 +📂 +📁 +🗂️ +🗃️ +🗄️ +📊 +📈 +📉 +📇 +🪪 +📌 +📍 +✂️ +🗑️ +📰 +🗞️ +🏷️ +📦 +📫 +📪 +📬 +📭 +📮 +✉️ +📧 +📩 +📨 +💌 +📤 +📥 +🗳️ +🕛 +🕧 +🕐 +🕜 +🕑 +🕝 +🕒 +🕞 +🕓 +🕟 +🕔 +🕠 +🕕 +🕡 +🕖 +🕢 +🕗 +🕣 +🕘 +🕤 +🕙 +🕥 +🕚 +🕦 +⏱️ +⌚ +🕰️ +⌛ +⏳ +⏲️ +⏰ +📅 +📆 +🗓️ +🪧 +🛎️ +🔔 +📯 +📢 +📣 +🔈 +🔉 +🔊 +🔍 +🔎 +🔮 +🧿 +🪬 +📿 +🏺 +⚱️ +⚰️ +🪦 +🚬 +💣 +🪤 +📜 +⚔️ +🗡️ +🛡️ +🗝️ +🔑 +🔐 +🔏 +🔒 +🔓 diff --git a/emojipicker/app/src/main/androidx/res/raw/emoji_category_people.csv b/emojipicker/app/src/main/androidx/res/raw/emoji_category_people.csv new file mode 100644 index 00000000..f6e06f6a --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/raw/emoji_category_people.csv @@ -0,0 +1,151 @@ +🙇,🙇‍♀️,🙇🏻‍♀️,🙇🏼‍♀️,🙇🏽‍♀️,🙇🏾‍♀️,🙇🏿‍♀️,🙇‍♂️,🙇🏻‍♂️,🙇🏼‍♂️,🙇🏽‍♂️,🙇🏾‍♂️,🙇🏿‍♂️ +🙋,🙋‍♀️,🙋🏻‍♀️,🙋🏼‍♀️,🙋🏽‍♀️,🙋🏾‍♀️,🙋🏿‍♀️,🙋‍♂️,🙋🏻‍♂️,🙋🏼‍♂️,🙋🏽‍♂️,🙋🏾‍♂️,🙋🏿‍♂️ +💁,💁‍♀️,💁🏻‍♀️,💁🏼‍♀️,💁🏽‍♀️,💁🏾‍♀️,💁🏿‍♀️,💁‍♂️,💁🏻‍♂️,💁🏼‍♂️,💁🏽‍♂️,💁🏾‍♂️,💁🏿‍♂️ +🙆,🙆‍♀️,🙆🏻‍♀️,🙆🏼‍♀️,🙆🏽‍♀️,🙆🏾‍♀️,🙆🏿‍♀️,🙆‍♂️,🙆🏻‍♂️,🙆🏼‍♂️,🙆🏽‍♂️,🙆🏾‍♂️,🙆🏿‍♂️ +🙅,🙅‍♀️,🙅🏻‍♀️,🙅🏼‍♀️,🙅🏽‍♀️,🙅🏾‍♀️,🙅🏿‍♀️,🙅‍♂️,🙅🏻‍♂️,🙅🏼‍♂️,🙅🏽‍♂️,🙅🏾‍♂️,🙅🏿‍♂️ +🤷,🤷‍♀️,🤷🏻‍♀️,🤷🏼‍♀️,🤷🏽‍♀️,🤷🏾‍♀️,🤷🏿‍♀️,🤷‍♂️,🤷🏻‍♂️,🤷🏼‍♂️,🤷🏽‍♂️,🤷🏾‍♂️,🤷🏿‍♂️ +🤦,🤦‍♀️,🤦🏻‍♀️,🤦🏼‍♀️,🤦🏽‍♀️,🤦🏾‍♀️,🤦🏿‍♀️,🤦‍♂️,🤦🏻‍♂️,🤦🏼‍♂️,🤦🏽‍♂️,🤦🏾‍♂️,🤦🏿‍♂️ +🙍,🙍‍♀️,🙍🏻‍♀️,🙍🏼‍♀️,🙍🏽‍♀️,🙍🏾‍♀️,🙍🏿‍♀️,🙍‍♂️,🙍🏻‍♂️,🙍🏼‍♂️,🙍🏽‍♂️,🙍🏾‍♂️,🙍🏿‍♂️ +🙎,🙎‍♀️,🙎🏻‍♀️,🙎🏼‍♀️,🙎🏽‍♀️,🙎🏾‍♀️,🙎🏿‍♀️,🙎‍♂️,🙎🏻‍♂️,🙎🏼‍♂️,🙎🏽‍♂️,🙎🏾‍♂️,🙎🏿‍♂️ +🧏,🧏‍♀️,🧏🏻‍♀️,🧏🏼‍♀️,🧏🏽‍♀️,🧏🏾‍♀️,🧏🏿‍♀️,🧏‍♂️,🧏🏻‍♂️,🧏🏼‍♂️,🧏🏽‍♂️,🧏🏾‍♂️,🧏🏿‍♂️ +💆,💆‍♀️,💆🏻‍♀️,💆🏼‍♀️,💆🏽‍♀️,💆🏾‍♀️,💆🏿‍♀️,💆‍♂️,💆🏻‍♂️,💆🏼‍♂️,💆🏽‍♂️,💆🏾‍♂️,💆🏿‍♂️ +💇,💇‍♀️,💇🏻‍♀️,💇🏼‍♀️,💇🏽‍♀️,💇🏾‍♀️,💇🏿‍♀️,💇‍♂️,💇🏻‍♂️,💇🏼‍♂️,💇🏽‍♂️,💇🏾‍♂️,💇🏿‍♂️ +🧖,🧖‍♀️,🧖🏻‍♀️,🧖🏼‍♀️,🧖🏽‍♀️,🧖🏾‍♀️,🧖🏿‍♀️,🧖‍♂️,🧖🏻‍♂️,🧖🏼‍♂️,🧖🏽‍♂️,🧖🏾‍♂️,🧖🏿‍♂️ +🛀,🛀,🛀🏻,🛀🏼,🛀🏽,🛀🏾,🛀🏿 +🛌,🛌,🛌🏻,🛌🏼,🛌🏽,🛌🏾,🛌🏿 +🧘,🧘‍♀️,🧘🏻‍♀️,🧘🏼‍♀️,🧘🏽‍♀️,🧘🏾‍♀️,🧘🏿‍♀️,🧘‍♂️,🧘🏻‍♂️,🧘🏼‍♂️,🧘🏽‍♂️,🧘🏾‍♂️,🧘🏿‍♂️ +👨‍🦯,👨‍🦯,👨🏻‍🦯,👨🏼‍🦯,👨🏽‍🦯,👨🏾‍🦯,👨🏿‍🦯 +👩‍🦯,👩‍🦯,👩🏻‍🦯,👩🏼‍🦯,👩🏽‍🦯,👩🏾‍🦯,👩🏿‍🦯 +👨‍🦼,👨‍🦼,👨🏻‍🦼,👨🏼‍🦼,👨🏽‍🦼,👨🏾‍🦼,👨🏿‍🦼 +👩‍🦼,👩‍🦼,👩🏻‍🦼,👩🏼‍🦼,👩🏽‍🦼,👩🏾‍🦼,👩🏿‍🦼 +👨‍🦽,👨‍🦽,👨🏻‍🦽,👨🏼‍🦽,👨🏽‍🦽,👨🏾‍🦽,👨🏿‍🦽 +👩‍🦽,👩‍🦽,👩🏻‍🦽,👩🏼‍🦽,👩🏽‍🦽,👩🏾‍🦽,👩🏿‍🦽 +🧎,🧎‍♀️,🧎🏻‍♀️,🧎🏼‍♀️,🧎🏽‍♀️,🧎🏾‍♀️,🧎🏿‍♀️,🧎‍♂️,🧎🏻‍♂️,🧎🏼‍♂️,🧎🏽‍♂️,🧎🏾‍♂️,🧎🏿‍♂️ +🧍,🧍‍♀️,🧍🏻‍♀️,🧍🏼‍♀️,🧍🏽‍♀️,🧍🏾‍♀️,🧍🏿‍♀️,🧍‍♂️,🧍🏻‍♂️,🧍🏼‍♂️,🧍🏽‍♂️,🧍🏾‍♂️,🧍🏿‍♂️ +🚶,🚶‍♀️,🚶🏻‍♀️,🚶🏼‍♀️,🚶🏽‍♀️,🚶🏾‍♀️,🚶🏿‍♀️,🚶‍♂️,🚶🏻‍♂️,🚶🏼‍♂️,🚶🏽‍♂️,🚶🏾‍♂️,🚶🏿‍♂️ +🏃,🏃‍♀️,🏃🏻‍♀️,🏃🏼‍♀️,🏃🏽‍♀️,🏃🏾‍♀️,🏃🏿‍♀️,🏃‍♂️,🏃🏻‍♂️,🏃🏼‍♂️,🏃🏽‍♂️,🏃🏾‍♂️,🏃🏿‍♂️ +🤸,🤸‍♀️,🤸🏻‍♀️,🤸🏼‍♀️,🤸🏽‍♀️,🤸🏾‍♀️,🤸🏿‍♀️,🤸‍♂️,🤸🏻‍♂️,🤸🏼‍♂️,🤸🏽‍♂️,🤸🏾‍♂️,🤸🏿‍♂️ +🏋️,🏋️‍♀️,🏋🏻‍♀️,🏋🏼‍♀️,🏋🏽‍♀️,🏋🏾‍♀️,🏋🏿‍♀️,🏋️‍♂️,🏋🏻‍♂️,🏋🏼‍♂️,🏋🏽‍♂️,🏋🏾‍♂️,🏋🏿‍♂️ +⛹️,⛹️‍♀️,⛹🏻‍♀️,⛹🏼‍♀️,⛹🏽‍♀️,⛹🏾‍♀️,⛹🏿‍♀️,⛹️‍♂️,⛹🏻‍♂️,⛹🏼‍♂️,⛹🏽‍♂️,⛹🏾‍♂️,⛹🏿‍♂️ +🤾,🤾‍♀️,🤾🏻‍♀️,🤾🏼‍♀️,🤾🏽‍♀️,🤾🏾‍♀️,🤾🏿‍♀️,🤾‍♂️,🤾🏻‍♂️,🤾🏼‍♂️,🤾🏽‍♂️,🤾🏾‍♂️,🤾🏿‍♂️ +🚴,🚴‍♀️,🚴🏻‍♀️,🚴🏼‍♀️,🚴🏽‍♀️,🚴🏾‍♀️,🚴🏿‍♀️,🚴‍♂️,🚴🏻‍♂️,🚴🏼‍♂️,🚴🏽‍♂️,🚴🏾‍♂️,🚴🏿‍♂️ +🚵,🚵‍♀️,🚵🏻‍♀️,🚵🏼‍♀️,🚵🏽‍♀️,🚵🏾‍♀️,🚵🏿‍♀️,🚵‍♂️,🚵🏻‍♂️,🚵🏼‍♂️,🚵🏽‍♂️,🚵🏾‍♂️,🚵🏿‍♂️ +🧗,🧗‍♀️,🧗🏻‍♀️,🧗🏼‍♀️,🧗🏽‍♀️,🧗🏾‍♀️,🧗🏿‍♀️,🧗‍♂️,🧗🏻‍♂️,🧗🏼‍♂️,🧗🏽‍♂️,🧗🏾‍♂️,🧗🏿‍♂️ +🤼,🤼‍♀️,🤼‍♂️ +🤹,🤹‍♀️,🤹🏻‍♀️,🤹🏼‍♀️,🤹🏽‍♀️,🤹🏾‍♀️,🤹🏿‍♀️,🤹‍♂️,🤹🏻‍♂️,🤹🏼‍♂️,🤹🏽‍♂️,🤹🏾‍♂️,🤹🏿‍♂️ +🏌️,🏌️‍♀️,🏌🏻‍♀️,🏌🏼‍♀️,🏌🏽‍♀️,🏌🏾‍♀️,🏌🏿‍♀️,🏌️‍♂️,🏌🏻‍♂️,🏌🏼‍♂️,🏌🏽‍♂️,🏌🏾‍♂️,🏌🏿‍♂️ +🏇,🏇,🏇🏻,🏇🏼,🏇🏽,🏇🏾,🏇🏿 +🤺 +⛷️ +🏂,🏂,🏂🏻,🏂🏼,🏂🏽,🏂🏾,🏂🏿 +🪂 +🏄,🏄‍♀️,🏄🏻‍♀️,🏄🏼‍♀️,🏄🏽‍♀️,🏄🏾‍♀️,🏄🏿‍♀️,🏄‍♂️,🏄🏻‍♂️,🏄🏼‍♂️,🏄🏽‍♂️,🏄🏾‍♂️,🏄🏿‍♂️ +🚣,🚣‍♀️,🚣🏻‍♀️,🚣🏼‍♀️,🚣🏽‍♀️,🚣🏾‍♀️,🚣🏿‍♀️,🚣‍♂️,🚣🏻‍♂️,🚣🏼‍♂️,🚣🏽‍♂️,🚣🏾‍♂️,🚣🏿‍♂️ +🏊,🏊‍♀️,🏊🏻‍♀️,🏊🏼‍♀️,🏊🏽‍♀️,🏊🏾‍♀️,🏊🏿‍♀️,🏊‍♂️,🏊🏻‍♂️,🏊🏼‍♂️,🏊🏽‍♂️,🏊🏾‍♂️,🏊🏿‍♂️ +🤽,🤽‍♀️,🤽🏻‍♀️,🤽🏼‍♀️,🤽🏽‍♀️,🤽🏾‍♀️,🤽🏿‍♀️,🤽‍♂️,🤽🏻‍♂️,🤽🏼‍♂️,🤽🏽‍♂️,🤽🏾‍♂️,🤽🏿‍♂️ +🧜,🧜‍♀️,🧜🏻‍♀️,🧜🏼‍♀️,🧜🏽‍♀️,🧜🏾‍♀️,🧜🏿‍♀️,🧜‍♂️,🧜🏻‍♂️,🧜🏼‍♂️,🧜🏽‍♂️,🧜🏾‍♂️,🧜🏿‍♂️ +🧚,🧚‍♀️,🧚🏻‍♀️,🧚🏼‍♀️,🧚🏽‍♀️,🧚🏾‍♀️,🧚🏿‍♀️,🧚‍♂️,🧚🏻‍♂️,🧚🏼‍♂️,🧚🏽‍♂️,🧚🏾‍♂️,🧚🏿‍♂️ +🧞,🧞‍♀️,🧞‍♂️ +🦸,🦸‍♀️,🦸🏻‍♀️,🦸🏼‍♀️,🦸🏽‍♀️,🦸🏾‍♀️,🦸🏿‍♀️,🦸‍♂️,🦸🏻‍♂️,🦸🏼‍♂️,🦸🏽‍♂️,🦸🏾‍♂️,🦸🏿‍♂️ +🦹,🦹‍♀️,🦹🏻‍♀️,🦹🏼‍♀️,🦹🏽‍♀️,🦹🏾‍♀️,🦹🏿‍♀️,🦹‍♂️,🦹🏻‍♂️,🦹🏼‍♂️,🦹🏽‍♂️,🦹🏾‍♂️,🦹🏿‍♂️ +🧝,🧝‍♀️,🧝🏻‍♀️,🧝🏼‍♀️,🧝🏽‍♀️,🧝🏾‍♀️,🧝🏿‍♀️,🧝‍♂️,🧝🏻‍♂️,🧝🏼‍♂️,🧝🏽‍♂️,🧝🏾‍♂️,🧝🏿‍♂️ +🧙,🧙‍♀️,🧙🏻‍♀️,🧙🏼‍♀️,🧙🏽‍♀️,🧙🏾‍♀️,🧙🏿‍♀️,🧙‍♂️,🧙🏻‍♂️,🧙🏼‍♂️,🧙🏽‍♂️,🧙🏾‍♂️,🧙🏿‍♂️ +🧟,🧟‍♀️,🧟‍♂️ +🧛,🧛‍♀️,🧛🏻‍♀️,🧛🏼‍♀️,🧛🏽‍♀️,🧛🏾‍♀️,🧛🏿‍♀️,🧛‍♂️,🧛🏻‍♂️,🧛🏼‍♂️,🧛🏽‍♂️,🧛🏾‍♂️,🧛🏿‍♂️ +👼,👼,👼🏻,👼🏼,👼🏽,👼🏾,👼🏿 +🎅,🎅,🎅🏻,🎅🏼,🎅🏽,🎅🏾,🎅🏿 +🤶,🤶,🤶🏻,🤶🏼,🤶🏽,🤶🏾,🤶🏿 +💂,💂‍♀️,💂🏻‍♀️,💂🏼‍♀️,💂🏽‍♀️,💂🏾‍♀️,💂🏿‍♀️,💂‍♂️,💂🏻‍♂️,💂🏼‍♂️,💂🏽‍♂️,💂🏾‍♂️,💂🏿‍♂️ +🤴,🤴,🤴🏻,🤴🏼,🤴🏽,🤴🏾,🤴🏿 +👸,👸,👸🏻,👸🏼,👸🏽,👸🏾,👸🏿 +🤵,🤵,🤵🏻,🤵🏼,🤵🏽,🤵🏾,🤵🏿 +👰,👰,👰🏻,👰🏼,👰🏽,👰🏾,👰🏿 +👩‍🚀,👨‍🚀,👨🏻‍🚀,👨🏼‍🚀,👨🏽‍🚀,👨🏾‍🚀,👨🏿‍🚀,👩‍🚀,👩🏻‍🚀,👩🏼‍🚀,👩🏽‍🚀,👩🏾‍🚀,👩🏿‍🚀 +👷,👷‍♀️,👷🏻‍♀️,👷🏼‍♀️,👷🏽‍♀️,👷🏾‍♀️,👷🏿‍♀️,👷‍♂️,👷🏻‍♂️,👷🏼‍♂️,👷🏽‍♂️,👷🏾‍♂️,👷🏿‍♂️ +👮,👮‍♀️,👮🏻‍♀️,👮🏼‍♀️,👮🏽‍♀️,👮🏾‍♀️,👮🏿‍♀️,👮‍♂️,👮🏻‍♂️,👮🏼‍♂️,👮🏽‍♂️,👮🏾‍♂️,👮🏿‍♂️ +🕵️,🕵️‍♀️,🕵🏻‍♀️,🕵🏼‍♀️,🕵🏽‍♀️,🕵🏾‍♀️,🕵🏿‍♀️,🕵️‍♂️,🕵🏻‍♂️,🕵🏼‍♂️,🕵🏽‍♂️,🕵🏾‍♂️,🕵🏿‍♂️ +👩‍✈️,👨‍✈️,👨🏻‍✈️,👨🏼‍✈️,👨🏽‍✈️,👨🏾‍✈️,👨🏿‍✈️,👩‍✈️,👩🏻‍✈️,👩🏼‍✈️,👩🏽‍✈️,👩🏾‍✈️,👩🏿‍✈️ +👩‍🔬,👨‍🔬,👨🏻‍🔬,👨🏼‍🔬,👨🏽‍🔬,👨🏾‍🔬,👨🏿‍🔬,👩‍🔬,👩🏻‍🔬,👩🏼‍🔬,👩🏽‍🔬,👩🏾‍🔬,👩🏿‍🔬 +👩‍⚕️,👨‍⚕️,👨🏻‍⚕️,👨🏼‍⚕️,👨🏽‍⚕️,👨🏾‍⚕️,👨🏿‍⚕️,👩‍⚕️,👩🏻‍⚕️,👩🏼‍⚕️,👩🏽‍⚕️,👩🏾‍⚕️,👩🏿‍⚕️ +👩‍🔧,👨‍🔧,👨🏻‍🔧,👨🏼‍🔧,👨🏽‍🔧,👨🏾‍🔧,👨🏿‍🔧,👩‍🔧,👩🏻‍🔧,👩🏼‍🔧,👩🏽‍🔧,👩🏾‍🔧,👩🏿‍🔧 +👩‍🏭,👨‍🏭,👨🏻‍🏭,👨🏼‍🏭,👨🏽‍🏭,👨🏾‍🏭,👨🏿‍🏭,👩‍🏭,👩🏻‍🏭,👩🏼‍🏭,👩🏽‍🏭,👩🏾‍🏭,👩🏿‍🏭 +👩‍🚒,👨‍🚒,👨🏻‍🚒,👨🏼‍🚒,👨🏽‍🚒,👨🏾‍🚒,👨🏿‍🚒,👩‍🚒,👩🏻‍🚒,👩🏼‍🚒,👩🏽‍🚒,👩🏾‍🚒,👩🏿‍🚒 +👩‍🌾,👨‍🌾,👨🏻‍🌾,👨🏼‍🌾,👨🏽‍🌾,👨🏾‍🌾,👨🏿‍🌾,👩‍🌾,👩🏻‍🌾,👩🏼‍🌾,👩🏽‍🌾,👩🏾‍🌾,👩🏿‍🌾 +👩‍🏫,👨‍🏫,👨🏻‍🏫,👨🏼‍🏫,👨🏽‍🏫,👨🏾‍🏫,👨🏿‍🏫,👩‍🏫,👩🏻‍🏫,👩🏼‍🏫,👩🏽‍🏫,👩🏾‍🏫,👩🏿‍🏫 +👩‍🎓,👨‍🎓,👨🏻‍🎓,👨🏼‍🎓,👨🏽‍🎓,👨🏾‍🎓,👨🏿‍🎓,👩‍🎓,👩🏻‍🎓,👩🏼‍🎓,👩🏽‍🎓,👩🏾‍🎓,👩🏿‍🎓 +👩‍💼,👨‍💼,👨🏻‍💼,👨🏼‍💼,👨🏽‍💼,👨🏾‍💼,👨🏿‍💼,👩‍💼,👩🏻‍💼,👩🏼‍💼,👩🏽‍💼,👩🏾‍💼,👩🏿‍💼 +👩‍⚖️,👨‍⚖️,👨🏻‍⚖️,👨🏼‍⚖️,👨🏽‍⚖️,👨🏾‍⚖️,👨🏿‍⚖️,👩‍⚖️,👩🏻‍⚖️,👩🏼‍⚖️,👩🏽‍⚖️,👩🏾‍⚖️,👩🏿‍⚖️ +👩‍💻,👨‍💻,👨🏻‍💻,👨🏼‍💻,👨🏽‍💻,👨🏾‍💻,👨🏿‍💻,👩‍💻,👩🏻‍💻,👩🏼‍💻,👩🏽‍💻,👩🏾‍💻,👩🏿‍💻 +👩‍🎤,👨‍🎤,👨🏻‍🎤,👨🏼‍🎤,👨🏽‍🎤,👨🏾‍🎤,👨🏿‍🎤,👩‍🎤,👩🏻‍🎤,👩🏼‍🎤,👩🏽‍🎤,👩🏾‍🎤,👩🏿‍🎤 +👩‍🎨,👨‍🎨,👨🏻‍🎨,👨🏼‍🎨,👨🏽‍🎨,👨🏾‍🎨,👨🏿‍🎨,👩‍🎨,👩🏻‍🎨,👩🏼‍🎨,👩🏽‍🎨,👩🏾‍🎨,👩🏿‍🎨 +👩‍🍳,👨‍🍳,👨🏻‍🍳,👨🏼‍🍳,👨🏽‍🍳,👨🏾‍🍳,👨🏿‍🍳,👩‍🍳,👩🏻‍🍳,👩🏼‍🍳,👩🏽‍🍳,👩🏾‍🍳,👩🏿‍🍳 +👳,👳‍♀️,👳🏻‍♀️,👳🏼‍♀️,👳🏽‍♀️,👳🏾‍♀️,👳🏿‍♀️,👳‍♂️,👳🏻‍♂️,👳🏼‍♂️,👳🏽‍♂️,👳🏾‍♂️,👳🏿‍♂️ +🧕,🧕,🧕🏻,🧕🏼,🧕🏽,🧕🏾,🧕🏿 +👲,👲,👲🏻,👲🏼,👲🏽,👲🏾,👲🏿 +👶,👶,👶🏻,👶🏼,👶🏽,👶🏾,👶🏿 +🧒,🧒,🧒🏻,🧒🏼,🧒🏽,🧒🏾,🧒🏿 +👦,👦,👦🏻,👦🏼,👦🏽,👦🏾,👦🏿 +👧,👧,👧🏻,👧🏼,👧🏽,👧🏾,👧🏿 +🧑,🧑,🧑🏻,🧑🏼,🧑🏽,🧑🏾,🧑🏿 +👨,👨,👨🏻,👨🏼,👨🏽,👨🏾,👨🏿 +👩,👩,👩🏻,👩🏼,👩🏽,👩🏾,👩🏿 +🧓,🧓,🧓🏻,🧓🏼,🧓🏽,🧓🏾,🧓🏿 +👴,👴,👴🏻,👴🏼,👴🏽,👴🏾,👴🏿 +👵,👵,👵🏻,👵🏼,👵🏽,👵🏾,👵🏿 +👨‍🦳,👨‍🦳,👨🏻‍🦳,👨🏼‍🦳,👨🏽‍🦳,👨🏾‍🦳,👨🏿‍🦳 +👩‍🦳,👩‍🦳,👩🏻‍🦳,👩🏼‍🦳,👩🏽‍🦳,👩🏾‍🦳,👩🏿‍🦳 +👨‍🦰,👨‍🦰,👨🏻‍🦰,👨🏼‍🦰,👨🏽‍🦰,👨🏾‍🦰,👨🏿‍🦰 +👩‍🦰,👩‍🦰,👩🏻‍🦰,👩🏼‍🦰,👩🏽‍🦰,👩🏾‍🦰,👩🏿‍🦰 +👱,👱‍♀️,👱🏻‍♀️,👱🏼‍♀️,👱🏽‍♀️,👱🏾‍♀️,👱🏿‍♀️,👱‍♂️,👱🏻‍♂️,👱🏼‍♂️,👱🏽‍♂️,👱🏾‍♂️,👱🏿‍♂️ +👨‍🦱,👨‍🦱,👨🏻‍🦱,👨🏼‍🦱,👨🏽‍🦱,👨🏾‍🦱,👨🏿‍🦱 +👩‍🦱,👩‍🦱,👩🏻‍🦱,👩🏼‍🦱,👩🏽‍🦱,👩🏾‍🦱,👩🏿‍🦱 +👨‍🦲,👨‍🦲,👨🏻‍🦲,👨🏼‍🦲,👨🏽‍🦲,👨🏾‍🦲,👨🏿‍🦲 +👩‍🦲,👩‍🦲,👩🏻‍🦲,👩🏼‍🦲,👩🏽‍🦲,👩🏾‍🦲,👩🏿‍🦲 +🧔,🧔,🧔🏻,🧔🏼,🧔🏽,🧔🏾,🧔🏿 +🕴️,🕴️,🕴🏻,🕴🏼,🕴🏽,🕴🏾,🕴🏿 +💃,💃,💃🏻,💃🏼,💃🏽,💃🏾,💃🏿 +🕺,🕺,🕺🏻,🕺🏼,🕺🏽,🕺🏾,🕺🏿 +👯,👯‍♀️,👯‍♂️ +👭 +👫 +👬 +💏 +👩‍❤️‍💋‍👨 +👨‍❤️‍💋‍👨 +👩‍❤️‍💋‍👩 +💑 +👩‍❤️‍👨 +👨‍❤️‍👨 +👩‍❤️‍👩 +👪 +👨‍👩‍👦 +👨‍👩‍👧 +👨‍👩‍👧‍👦 +👨‍👩‍👦‍👦 +👨‍👩‍👧‍👧 +👨‍👨‍👦 +👨‍👨‍👧 +👨‍👨‍👧‍👦 +👨‍👨‍👦‍👦 +👨‍👨‍👧‍👧 +👩‍👩‍👦 +👩‍👩‍👧 +👩‍👩‍👧‍👦 +👩‍👩‍👦‍👦 +👩‍👩‍👧‍👧 +👨‍👦 +👨‍👦‍👦 +👨‍👧 +👨‍👧‍👦 +👨‍👧‍👧 +👩‍👦 +👩‍👦‍👦 +👩‍👧 +👩‍👧‍👦 +👩‍👧‍👧 +🤰,🤰,🤰🏻,🤰🏼,🤰🏽,🤰🏾,🤰🏿 +🤱,🤱,🤱🏻,🤱🏼,🤱🏽,🤱🏾,🤱🏿 +🗣️ +👤 +👥 +👣 diff --git a/emojipicker/app/src/main/androidx/res/raw/emoji_category_people_gender_inclusive.csv b/emojipicker/app/src/main/androidx/res/raw/emoji_category_people_gender_inclusive.csv new file mode 100644 index 00000000..ec86a370 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/raw/emoji_category_people_gender_inclusive.csv @@ -0,0 +1,110 @@ +🙇,🙇,🙇🏻,🙇🏼,🙇🏽,🙇🏾,🙇🏿,🙇‍♀️,🙇🏻‍♀️,🙇🏼‍♀️,🙇🏽‍♀️,🙇🏾‍♀️,🙇🏿‍♀️,🙇‍♂️,🙇🏻‍♂️,🙇🏼‍♂️,🙇🏽‍♂️,🙇🏾‍♂️,🙇🏿‍♂️ +🙋,🙋,🙋🏻,🙋🏼,🙋🏽,🙋🏾,🙋🏿,🙋‍♀️,🙋🏻‍♀️,🙋🏼‍♀️,🙋🏽‍♀️,🙋🏾‍♀️,🙋🏿‍♀️,🙋‍♂️,🙋🏻‍♂️,🙋🏼‍♂️,🙋🏽‍♂️,🙋🏾‍♂️,🙋🏿‍♂️ +💁,💁,💁🏻,💁🏼,💁🏽,💁🏾,💁🏿,💁‍♀️,💁🏻‍♀️,💁🏼‍♀️,💁🏽‍♀️,💁🏾‍♀️,💁🏿‍♀️,💁‍♂️,💁🏻‍♂️,💁🏼‍♂️,💁🏽‍♂️,💁🏾‍♂️,💁🏿‍♂️ +🙆,🙆,🙆🏻,🙆🏼,🙆🏽,🙆🏾,🙆🏿,🙆‍♀️,🙆🏻‍♀️,🙆🏼‍♀️,🙆🏽‍♀️,🙆🏾‍♀️,🙆🏿‍♀️,🙆‍♂️,🙆🏻‍♂️,🙆🏼‍♂️,🙆🏽‍♂️,🙆🏾‍♂️,🙆🏿‍♂️ +🙅,🙅,🙅🏻,🙅🏼,🙅🏽,🙅🏾,🙅🏿,🙅‍♀️,🙅🏻‍♀️,🙅🏼‍♀️,🙅🏽‍♀️,🙅🏾‍♀️,🙅🏿‍♀️,🙅‍♂️,🙅🏻‍♂️,🙅🏼‍♂️,🙅🏽‍♂️,🙅🏾‍♂️,🙅🏿‍♂️ +🤷,🤷,🤷🏻,🤷🏼,🤷🏽,🤷🏾,🤷🏿,🤷‍♀️,🤷🏻‍♀️,🤷🏼‍♀️,🤷🏽‍♀️,🤷🏾‍♀️,🤷🏿‍♀️,🤷‍♂️,🤷🏻‍♂️,🤷🏼‍♂️,🤷🏽‍♂️,🤷🏾‍♂️,🤷🏿‍♂️ +🤦,🤦,🤦🏻,🤦🏼,🤦🏽,🤦🏾,🤦🏿,🤦‍♀️,🤦🏻‍♀️,🤦🏼‍♀️,🤦🏽‍♀️,🤦🏾‍♀️,🤦🏿‍♀️,🤦‍♂️,🤦🏻‍♂️,🤦🏼‍♂️,🤦🏽‍♂️,🤦🏾‍♂️,🤦🏿‍♂️ +🙍,🙍,🙍🏻,🙍🏼,🙍🏽,🙍🏾,🙍🏿,🙍‍♀️,🙍🏻‍♀️,🙍🏼‍♀️,🙍🏽‍♀️,🙍🏾‍♀️,🙍🏿‍♀️,🙍‍♂️,🙍🏻‍♂️,🙍🏼‍♂️,🙍🏽‍♂️,🙍🏾‍♂️,🙍🏿‍♂️ +🙎,🙎,🙎🏻,🙎🏼,🙎🏽,🙎🏾,🙎🏿,🙎‍♀️,🙎🏻‍♀️,🙎🏼‍♀️,🙎🏽‍♀️,🙎🏾‍♀️,🙎🏿‍♀️,🙎‍♂️,🙎🏻‍♂️,🙎🏼‍♂️,🙎🏽‍♂️,🙎🏾‍♂️,🙎🏿‍♂️ +🧏,🧏,🧏🏻,🧏🏼,🧏🏽,🧏🏾,🧏🏿,🧏‍♀️,🧏🏻‍♀️,🧏🏼‍♀️,🧏🏽‍♀️,🧏🏾‍♀️,🧏🏿‍♀️,🧏‍♂️,🧏🏻‍♂️,🧏🏼‍♂️,🧏🏽‍♂️,🧏🏾‍♂️,🧏🏿‍♂️ +💆,💆,💆🏻,💆🏼,💆🏽,💆🏾,💆🏿,💆‍♀️,💆🏻‍♀️,💆🏼‍♀️,💆🏽‍♀️,💆🏾‍♀️,💆🏿‍♀️,💆‍♂️,💆🏻‍♂️,💆🏼‍♂️,💆🏽‍♂️,💆🏾‍♂️,💆🏿‍♂️ +💇,💇,💇🏻,💇🏼,💇🏽,💇🏾,💇🏿,💇‍♀️,💇🏻‍♀️,💇🏼‍♀️,💇🏽‍♀️,💇🏾‍♀️,💇🏿‍♀️,💇‍♂️,💇🏻‍♂️,💇🏼‍♂️,💇🏽‍♂️,💇🏾‍♂️,💇🏿‍♂️ +🧖,🧖,🧖🏻,🧖🏼,🧖🏽,🧖🏾,🧖🏿,🧖‍♀️,🧖🏻‍♀️,🧖🏼‍♀️,🧖🏽‍♀️,🧖🏾‍♀️,🧖🏿‍♀️,🧖‍♂️,🧖🏻‍♂️,🧖🏼‍♂️,🧖🏽‍♂️,🧖🏾‍♂️,🧖🏿‍♂️ +🛀,🛀,🛀🏻,🛀🏼,🛀🏽,🛀🏾,🛀🏿 +🛌,🛌,🛌🏻,🛌🏼,🛌🏽,🛌🏾,🛌🏿 +🧘,🧘,🧘🏻,🧘🏼,🧘🏽,🧘🏾,🧘🏿,🧘‍♀️,🧘🏻‍♀️,🧘🏼‍♀️,🧘🏽‍♀️,🧘🏾‍♀️,🧘🏿‍♀️,🧘‍♂️,🧘🏻‍♂️,🧘🏼‍♂️,🧘🏽‍♂️,🧘🏾‍♂️,🧘🏿‍♂️ +🧍,🧍,🧍🏻,🧍🏼,🧍🏽,🧍🏾,🧍🏿,🧍‍♀️,🧍🏻‍♀️,🧍🏼‍♀️,🧍🏽‍♀️,🧍🏾‍♀️,🧍🏿‍♀️,🧍‍♂️,🧍🏻‍♂️,🧍🏼‍♂️,🧍🏽‍♂️,🧍🏾‍♂️,🧍🏿‍♂️ +🤸,🤸,🤸🏻,🤸🏼,🤸🏽,🤸🏾,🤸🏿,🤸‍♀️,🤸🏻‍♀️,🤸🏼‍♀️,🤸🏽‍♀️,🤸🏾‍♀️,🤸🏿‍♀️,🤸‍♂️,🤸🏻‍♂️,🤸🏼‍♂️,🤸🏽‍♂️,🤸🏾‍♂️,🤸🏿‍♂️ +🧎,🧎,🧎🏻,🧎🏼,🧎🏽,🧎🏾,🧎🏿,🧎‍➡️,🧎🏻‍➡️,🧎🏼‍➡️,🧎🏽‍➡️,🧎🏾‍➡️,🧎🏿‍➡️,🧎‍♀️,🧎🏻‍♀️,🧎🏼‍♀️,🧎🏽‍♀️,🧎🏾‍♀️,🧎🏿‍♀️,🧎‍♀️‍➡️,🧎🏻‍♀️‍➡️,🧎🏼‍♀️‍➡️,🧎🏽‍♀️‍➡️,🧎🏾‍♀️‍➡️,🧎🏿‍♀️‍➡️,🧎‍♂️,🧎🏻‍♂️,🧎🏼‍♂️,🧎🏽‍♂️,🧎🏾‍♂️,🧎🏿‍♂️,🧎‍♂️‍➡️,🧎🏻‍♂️‍➡️,🧎🏼‍♂️‍➡️,🧎🏽‍♂️‍➡️,🧎🏾‍♂️‍➡️,🧎🏿‍♂️‍➡️ +🧑‍🦼,🧑‍🦼,🧑🏻‍🦼,🧑🏼‍🦼,🧑🏽‍🦼,🧑🏾‍🦼,🧑🏿‍🦼,🧑‍🦼‍➡️,🧑🏻‍🦼‍➡️,🧑🏼‍🦼‍➡️,🧑🏽‍🦼‍➡️,🧑🏾‍🦼‍➡️,🧑🏿‍🦼‍➡️,👩‍🦼,👩🏻‍🦼,👩🏼‍🦼,👩🏽‍🦼,👩🏾‍🦼,👩🏿‍🦼,👩‍🦼‍➡️,👩🏻‍🦼‍➡️,👩🏼‍🦼‍➡️,👩🏽‍🦼‍➡️,👩🏾‍🦼‍➡️,👩🏿‍🦼‍➡️,👨‍🦼,👨🏻‍🦼,👨🏼‍🦼,👨🏽‍🦼,👨🏾‍🦼,👨🏿‍🦼,👨‍🦼‍➡️,👨🏻‍🦼‍➡️,👨🏼‍🦼‍➡️,👨🏽‍🦼‍➡️,👨🏾‍🦼‍➡️,👨🏿‍🦼‍➡️ +🧑‍🦽,🧑‍🦽,🧑🏻‍🦽,🧑🏼‍🦽,🧑🏽‍🦽,🧑🏾‍🦽,🧑🏿‍🦽,🧑‍🦽‍➡️,🧑🏻‍🦽‍➡️,🧑🏼‍🦽‍➡️,🧑🏽‍🦽‍➡️,🧑🏾‍🦽‍➡️,🧑🏿‍🦽‍➡️,👩‍🦽,👩🏻‍🦽,👩🏼‍🦽,👩🏽‍🦽,👩🏾‍🦽,👩🏿‍🦽,👩‍🦽‍➡️,👩🏻‍🦽‍➡️,👩🏼‍🦽‍➡️,👩🏽‍🦽‍➡️,👩🏾‍🦽‍➡️,👩🏿‍🦽‍➡️,👨‍🦽,👨🏻‍🦽,👨🏼‍🦽,👨🏽‍🦽,👨🏾‍🦽,👨🏿‍🦽,👨‍🦽‍➡️,👨🏻‍🦽‍➡️,👨🏼‍🦽‍➡️,👨🏽‍🦽‍➡️,👨🏾‍🦽‍➡️,👨🏿‍🦽‍➡️ +🧑‍🦯,🧑‍🦯,🧑🏻‍🦯,🧑🏼‍🦯,🧑🏽‍🦯,🧑🏾‍🦯,🧑🏿‍🦯,🧑‍🦯‍➡️,🧑🏻‍🦯‍➡️,🧑🏼‍🦯‍➡️,🧑🏽‍🦯‍➡️,🧑🏾‍🦯‍➡️,🧑🏿‍🦯‍➡️,👩‍🦯,👩🏻‍🦯,👩🏼‍🦯,👩🏽‍🦯,👩🏾‍🦯,👩🏿‍🦯,👩‍🦯‍➡️,👩🏻‍🦯‍➡️,👩🏼‍🦯‍➡️,👩🏽‍🦯‍➡️,👩🏾‍🦯‍➡️,👩🏿‍🦯‍➡️,👨‍🦯,👨🏻‍🦯,👨🏼‍🦯,👨🏽‍🦯,👨🏾‍🦯,👨🏿‍🦯,👨‍🦯‍➡️,👨🏻‍🦯‍➡️,👨🏼‍🦯‍➡️,👨🏽‍🦯‍➡️,👨🏾‍🦯‍➡️,👨🏿‍🦯‍➡️ +🚶,🚶,🚶🏻,🚶🏼,🚶🏽,🚶🏾,🚶🏿,🚶‍➡️,🚶🏻‍➡️,🚶🏼‍➡️,🚶🏽‍➡️,🚶🏾‍➡️,🚶🏿‍➡️,🚶‍♀️,🚶🏻‍♀️,🚶🏼‍♀️,🚶🏽‍♀️,🚶🏾‍♀️,🚶🏿‍♀️,🚶‍♀️‍➡️,🚶🏻‍♀️‍➡️,🚶🏼‍♀️‍➡️,🚶🏽‍♀️‍➡️,🚶🏾‍♀️‍➡️,🚶🏿‍♀️‍➡️,🚶‍♂️,🚶🏻‍♂️,🚶🏼‍♂️,🚶🏽‍♂️,🚶🏾‍♂️,🚶🏿‍♂️,🚶‍♂️‍➡️,🚶🏻‍♂️‍➡️,🚶🏼‍♂️‍➡️,🚶🏽‍♂️‍➡️,🚶🏾‍♂️‍➡️,🚶🏿‍♂️‍➡️ +🏃,🏃,🏃🏻,🏃🏼,🏃🏽,🏃🏾,🏃🏿,🏃‍➡️,🏃🏻‍➡️,🏃🏼‍➡️,🏃🏽‍➡️,🏃🏾‍➡️,🏃🏿‍➡️,🏃‍♀️,🏃🏻‍♀️,🏃🏼‍♀️,🏃🏽‍♀️,🏃🏾‍♀️,🏃🏿‍♀️,🏃‍♀️‍➡️,🏃🏻‍♀️‍➡️,🏃🏼‍♀️‍➡️,🏃🏽‍♀️‍➡️,🏃🏾‍♀️‍➡️,🏃🏿‍♀️‍➡️,🏃‍♂️,🏃🏻‍♂️,🏃🏼‍♂️,🏃🏽‍♂️,🏃🏾‍♂️,🏃🏿‍♂️,🏃‍♂️‍➡️,🏃🏻‍♂️‍➡️,🏃🏼‍♂️‍➡️,🏃🏽‍♂️‍➡️,🏃🏾‍♂️‍➡️,🏃🏿‍♂️‍➡️ +⛹️,⛹️,⛹🏻,⛹🏼,⛹🏽,⛹🏾,⛹🏿,⛹️‍♀️,⛹🏻‍♀️,⛹🏼‍♀️,⛹🏽‍♀️,⛹🏾‍♀️,⛹🏿‍♀️,⛹️‍♂️,⛹🏻‍♂️,⛹🏼‍♂️,⛹🏽‍♂️,⛹🏾‍♂️,⛹🏿‍♂️ +🤾,🤾,🤾🏻,🤾🏼,🤾🏽,🤾🏾,🤾🏿,🤾‍♀️,🤾🏻‍♀️,🤾🏼‍♀️,🤾🏽‍♀️,🤾🏾‍♀️,🤾🏿‍♀️,🤾‍♂️,🤾🏻‍♂️,🤾🏼‍♂️,🤾🏽‍♂️,🤾🏾‍♂️,🤾🏿‍♂️ +🚴,🚴,🚴🏻,🚴🏼,🚴🏽,🚴🏾,🚴🏿,🚴‍♀️,🚴🏻‍♀️,🚴🏼‍♀️,🚴🏽‍♀️,🚴🏾‍♀️,🚴🏿‍♀️,🚴‍♂️,🚴🏻‍♂️,🚴🏼‍♂️,🚴🏽‍♂️,🚴🏾‍♂️,🚴🏿‍♂️ +🚵,🚵,🚵🏻,🚵🏼,🚵🏽,🚵🏾,🚵🏿,🚵‍♀️,🚵🏻‍♀️,🚵🏼‍♀️,🚵🏽‍♀️,🚵🏾‍♀️,🚵🏿‍♀️,🚵‍♂️,🚵🏻‍♂️,🚵🏼‍♂️,🚵🏽‍♂️,🚵🏾‍♂️,🚵🏿‍♂️ +🧗,🧗,🧗🏻,🧗🏼,🧗🏽,🧗🏾,🧗🏿,🧗‍♀️,🧗🏻‍♀️,🧗🏼‍♀️,🧗🏽‍♀️,🧗🏾‍♀️,🧗🏿‍♀️,🧗‍♂️,🧗🏻‍♂️,🧗🏼‍♂️,🧗🏽‍♂️,🧗🏾‍♂️,🧗🏿‍♂️ +🏋️,🏋️,🏋🏻,🏋🏼,🏋🏽,🏋🏾,🏋🏿,🏋️‍♀️,🏋🏻‍♀️,🏋🏼‍♀️,🏋🏽‍♀️,🏋🏾‍♀️,🏋🏿‍♀️,🏋️‍♂️,🏋🏻‍♂️,🏋🏼‍♂️,🏋🏽‍♂️,🏋🏾‍♂️,🏋🏿‍♂️ +🤼,🤼,🤼‍♀️,🤼‍♂️ +🤹,🤹,🤹🏻,🤹🏼,🤹🏽,🤹🏾,🤹🏿,🤹‍♀️,🤹🏻‍♀️,🤹🏼‍♀️,🤹🏽‍♀️,🤹🏾‍♀️,🤹🏿‍♀️,🤹‍♂️,🤹🏻‍♂️,🤹🏼‍♂️,🤹🏽‍♂️,🤹🏾‍♂️,🤹🏿‍♂️ +🏌️,🏌️,🏌🏻,🏌🏼,🏌🏽,🏌🏾,🏌🏿,🏌️‍♀️,🏌🏻‍♀️,🏌🏼‍♀️,🏌🏽‍♀️,🏌🏾‍♀️,🏌🏿‍♀️,🏌️‍♂️,🏌🏻‍♂️,🏌🏼‍♂️,🏌🏽‍♂️,🏌🏾‍♂️,🏌🏿‍♂️ +🏇,🏇,🏇🏻,🏇🏼,🏇🏽,🏇🏾,🏇🏿 +🤺 +⛷️ +🏂,🏂,🏂🏻,🏂🏼,🏂🏽,🏂🏾,🏂🏿 +🪂 +🏄,🏄,🏄🏻,🏄🏼,🏄🏽,🏄🏾,🏄🏿,🏄‍♀️,🏄🏻‍♀️,🏄🏼‍♀️,🏄🏽‍♀️,🏄🏾‍♀️,🏄🏿‍♀️,🏄‍♂️,🏄🏻‍♂️,🏄🏼‍♂️,🏄🏽‍♂️,🏄🏾‍♂️,🏄🏿‍♂️ +🚣,🚣,🚣🏻,🚣🏼,🚣🏽,🚣🏾,🚣🏿,🚣‍♀️,🚣🏻‍♀️,🚣🏼‍♀️,🚣🏽‍♀️,🚣🏾‍♀️,🚣🏿‍♀️,🚣‍♂️,🚣🏻‍♂️,🚣🏼‍♂️,🚣🏽‍♂️,🚣🏾‍♂️,🚣🏿‍♂️ +🏊,🏊,🏊🏻,🏊🏼,🏊🏽,🏊🏾,🏊🏿,🏊‍♀️,🏊🏻‍♀️,🏊🏼‍♀️,🏊🏽‍♀️,🏊🏾‍♀️,🏊🏿‍♀️,🏊‍♂️,🏊🏻‍♂️,🏊🏼‍♂️,🏊🏽‍♂️,🏊🏾‍♂️,🏊🏿‍♂️ +🤽,🤽,🤽🏻,🤽🏼,🤽🏽,🤽🏾,🤽🏿,🤽‍♀️,🤽🏻‍♀️,🤽🏼‍♀️,🤽🏽‍♀️,🤽🏾‍♀️,🤽🏿‍♀️,🤽‍♂️,🤽🏻‍♂️,🤽🏼‍♂️,🤽🏽‍♂️,🤽🏾‍♂️,🤽🏿‍♂️ +🧜,🧜,🧜🏻,🧜🏼,🧜🏽,🧜🏾,🧜🏿,🧜‍♀️,🧜🏻‍♀️,🧜🏼‍♀️,🧜🏽‍♀️,🧜🏾‍♀️,🧜🏿‍♀️,🧜‍♂️,🧜🏻‍♂️,🧜🏼‍♂️,🧜🏽‍♂️,🧜🏾‍♂️,🧜🏿‍♂️ +🧚,🧚,🧚🏻,🧚🏼,🧚🏽,🧚🏾,🧚🏿,🧚‍♀️,🧚🏻‍♀️,🧚🏼‍♀️,🧚🏽‍♀️,🧚🏾‍♀️,🧚🏿‍♀️,🧚‍♂️,🧚🏻‍♂️,🧚🏼‍♂️,🧚🏽‍♂️,🧚🏾‍♂️,🧚🏿‍♂️ +🧞,🧞,🧞‍♀️,🧞‍♂️ +🧝,🧝,🧝🏻,🧝🏼,🧝🏽,🧝🏾,🧝🏿,🧝‍♀️,🧝🏻‍♀️,🧝🏼‍♀️,🧝🏽‍♀️,🧝🏾‍♀️,🧝🏿‍♀️,🧝‍♂️,🧝🏻‍♂️,🧝🏼‍♂️,🧝🏽‍♂️,🧝🏾‍♂️,🧝🏿‍♂️ +🧙,🧙,🧙🏻,🧙🏼,🧙🏽,🧙🏾,🧙🏿,🧙‍♀️,🧙🏻‍♀️,🧙🏼‍♀️,🧙🏽‍♀️,🧙🏾‍♀️,🧙🏿‍♀️,🧙‍♂️,🧙🏻‍♂️,🧙🏼‍♂️,🧙🏽‍♂️,🧙🏾‍♂️,🧙🏿‍♂️ +🧛,🧛,🧛🏻,🧛🏼,🧛🏽,🧛🏾,🧛🏿,🧛‍♀️,🧛🏻‍♀️,🧛🏼‍♀️,🧛🏽‍♀️,🧛🏾‍♀️,🧛🏿‍♀️,🧛‍♂️,🧛🏻‍♂️,🧛🏼‍♂️,🧛🏽‍♂️,🧛🏾‍♂️,🧛🏿‍♂️ +🧟,🧟,🧟‍♀️,🧟‍♂️ +🧌 +🦸,🦸,🦸🏻,🦸🏼,🦸🏽,🦸🏾,🦸🏿,🦸‍♀️,🦸🏻‍♀️,🦸🏼‍♀️,🦸🏽‍♀️,🦸🏾‍♀️,🦸🏿‍♀️,🦸‍♂️,🦸🏻‍♂️,🦸🏼‍♂️,🦸🏽‍♂️,🦸🏾‍♂️,🦸🏿‍♂️ +🦹,🦹,🦹🏻,🦹🏼,🦹🏽,🦹🏾,🦹🏿,🦹‍♀️,🦹🏻‍♀️,🦹🏼‍♀️,🦹🏽‍♀️,🦹🏾‍♀️,🦹🏿‍♀️,🦹‍♂️,🦹🏻‍♂️,🦹🏼‍♂️,🦹🏽‍♂️,🦹🏾‍♂️,🦹🏿‍♂️ +🥷,🥷,🥷🏻,🥷🏼,🥷🏽,🥷🏾,🥷🏿 +🧑‍🎄,🧑‍🎄,🧑🏻‍🎄,🧑🏼‍🎄,🧑🏽‍🎄,🧑🏾‍🎄,🧑🏿‍🎄,🤶,🤶🏻,🤶🏼,🤶🏽,🤶🏾,🤶🏿,🎅,🎅🏻,🎅🏼,🎅🏽,🎅🏾,🎅🏿 +👼,👼,👼🏻,👼🏼,👼🏽,👼🏾,👼🏿 +💂,💂,💂🏻,💂🏼,💂🏽,💂🏾,💂🏿,💂‍♀️,💂🏻‍♀️,💂🏼‍♀️,💂🏽‍♀️,💂🏾‍♀️,💂🏿‍♀️,💂‍♂️,💂🏻‍♂️,💂🏼‍♂️,💂🏽‍♂️,💂🏾‍♂️,💂🏿‍♂️ +🫅,🫅,🫅🏻,🫅🏼,🫅🏽,🫅🏾,🫅🏿,👸,👸🏻,👸🏼,👸🏽,👸🏾,👸🏿,🤴,🤴🏻,🤴🏼,🤴🏽,🤴🏾,🤴🏿 +🤵,🤵,🤵🏻,🤵🏼,🤵🏽,🤵🏾,🤵🏿,🤵‍♀️,🤵🏻‍♀️,🤵🏼‍♀️,🤵🏽‍♀️,🤵🏾‍♀️,🤵🏿‍♀️,🤵‍♂️,🤵🏻‍♂️,🤵🏼‍♂️,🤵🏽‍♂️,🤵🏾‍♂️,🤵🏿‍♂️ +👰,👰,👰🏻,👰🏼,👰🏽,👰🏾,👰🏿,👰‍♀️,👰🏻‍♀️,👰🏼‍♀️,👰🏽‍♀️,👰🏾‍♀️,👰🏿‍♀️,👰‍♂️,👰🏻‍♂️,👰🏼‍♂️,👰🏽‍♂️,👰🏾‍♂️,👰🏿‍♂️ +🧑‍🚀,🧑‍🚀,🧑🏻‍🚀,🧑🏼‍🚀,🧑🏽‍🚀,🧑🏾‍🚀,🧑🏿‍🚀,👩‍🚀,👩🏻‍🚀,👩🏼‍🚀,👩🏽‍🚀,👩🏾‍🚀,👩🏿‍🚀,👨‍🚀,👨🏻‍🚀,👨🏼‍🚀,👨🏽‍🚀,👨🏾‍🚀,👨🏿‍🚀 +👷,👷,👷🏻,👷🏼,👷🏽,👷🏾,👷🏿,👷‍♀️,👷🏻‍♀️,👷🏼‍♀️,👷🏽‍♀️,👷🏾‍♀️,👷🏿‍♀️,👷‍♂️,👷🏻‍♂️,👷🏼‍♂️,👷🏽‍♂️,👷🏾‍♂️,👷🏿‍♂️ +👮,👮,👮🏻,👮🏼,👮🏽,👮🏾,👮🏿,👮‍♀️,👮🏻‍♀️,👮🏼‍♀️,👮🏽‍♀️,👮🏾‍♀️,👮🏿‍♀️,👮‍♂️,👮🏻‍♂️,👮🏼‍♂️,👮🏽‍♂️,👮🏾‍♂️,👮🏿‍♂️ +🕵️,🕵️,🕵🏻,🕵🏼,🕵🏽,🕵🏾,🕵🏿,🕵️‍♀️,🕵🏻‍♀️,🕵🏼‍♀️,🕵🏽‍♀️,🕵🏾‍♀️,🕵🏿‍♀️,🕵️‍♂️,🕵🏻‍♂️,🕵🏼‍♂️,🕵🏽‍♂️,🕵🏾‍♂️,🕵🏿‍♂️ +🧑‍✈️,🧑‍✈️,🧑🏻‍✈️,🧑🏼‍✈️,🧑🏽‍✈️,🧑🏾‍✈️,🧑🏿‍✈️,👩‍✈️,👩🏻‍✈️,👩🏼‍✈️,👩🏽‍✈️,👩🏾‍✈️,👩🏿‍✈️,👨‍✈️,👨🏻‍✈️,👨🏼‍✈️,👨🏽‍✈️,👨🏾‍✈️,👨🏿‍✈️ +🧑‍🔬,🧑‍🔬,🧑🏻‍🔬,🧑🏼‍🔬,🧑🏽‍🔬,🧑🏾‍🔬,🧑🏿‍🔬,👩‍🔬,👩🏻‍🔬,👩🏼‍🔬,👩🏽‍🔬,👩🏾‍🔬,👩🏿‍🔬,👨‍🔬,👨🏻‍🔬,👨🏼‍🔬,👨🏽‍🔬,👨🏾‍🔬,👨🏿‍🔬 +🧑‍⚕️,🧑‍⚕️,🧑🏻‍⚕️,🧑🏼‍⚕️,🧑🏽‍⚕️,🧑🏾‍⚕️,🧑🏿‍⚕️,👩‍⚕️,👩🏻‍⚕️,👩🏼‍⚕️,👩🏽‍⚕️,👩🏾‍⚕️,👩🏿‍⚕️,👨‍⚕️,👨🏻‍⚕️,👨🏼‍⚕️,👨🏽‍⚕️,👨🏾‍⚕️,👨🏿‍⚕️ +🧑‍🔧,🧑‍🔧,🧑🏻‍🔧,🧑🏼‍🔧,🧑🏽‍🔧,🧑🏾‍🔧,🧑🏿‍🔧,👩‍🔧,👩🏻‍🔧,👩🏼‍🔧,👩🏽‍🔧,👩🏾‍🔧,👩🏿‍🔧,👨‍🔧,👨🏻‍🔧,👨🏼‍🔧,👨🏽‍🔧,👨🏾‍🔧,👨🏿‍🔧 +🧑‍🏭,🧑‍🏭,🧑🏻‍🏭,🧑🏼‍🏭,🧑🏽‍🏭,🧑🏾‍🏭,🧑🏿‍🏭,👩‍🏭,👩🏻‍🏭,👩🏼‍🏭,👩🏽‍🏭,👩🏾‍🏭,👩🏿‍🏭,👨‍🏭,👨🏻‍🏭,👨🏼‍🏭,👨🏽‍🏭,👨🏾‍🏭,👨🏿‍🏭 +🧑‍🚒,🧑‍🚒,🧑🏻‍🚒,🧑🏼‍🚒,🧑🏽‍🚒,🧑🏾‍🚒,🧑🏿‍🚒,👩‍🚒,👩🏻‍🚒,👩🏼‍🚒,👩🏽‍🚒,👩🏾‍🚒,👩🏿‍🚒,👨‍🚒,👨🏻‍🚒,👨🏼‍🚒,👨🏽‍🚒,👨🏾‍🚒,👨🏿‍🚒 +🧑‍🌾,🧑‍🌾,🧑🏻‍🌾,🧑🏼‍🌾,🧑🏽‍🌾,🧑🏾‍🌾,🧑🏿‍🌾,👩‍🌾,👩🏻‍🌾,👩🏼‍🌾,👩🏽‍🌾,👩🏾‍🌾,👩🏿‍🌾,👨‍🌾,👨🏻‍🌾,👨🏼‍🌾,👨🏽‍🌾,👨🏾‍🌾,👨🏿‍🌾 +🧑‍🏫,🧑‍🏫,🧑🏻‍🏫,🧑🏼‍🏫,🧑🏽‍🏫,🧑🏾‍🏫,🧑🏿‍🏫,👩‍🏫,👩🏻‍🏫,👩🏼‍🏫,👩🏽‍🏫,👩🏾‍🏫,👩🏿‍🏫,👨‍🏫,👨🏻‍🏫,👨🏼‍🏫,👨🏽‍🏫,👨🏾‍🏫,👨🏿‍🏫 +🧑‍🎓,🧑‍🎓,🧑🏻‍🎓,🧑🏼‍🎓,🧑🏽‍🎓,🧑🏾‍🎓,🧑🏿‍🎓,👩‍🎓,👩🏻‍🎓,👩🏼‍🎓,👩🏽‍🎓,👩🏾‍🎓,👩🏿‍🎓,👨‍🎓,👨🏻‍🎓,👨🏼‍🎓,👨🏽‍🎓,👨🏾‍🎓,👨🏿‍🎓 +🧑‍💼,🧑‍💼,🧑🏻‍💼,🧑🏼‍💼,🧑🏽‍💼,🧑🏾‍💼,🧑🏿‍💼,👩‍💼,👩🏻‍💼,👩🏼‍💼,👩🏽‍💼,👩🏾‍💼,👩🏿‍💼,👨‍💼,👨🏻‍💼,👨🏼‍💼,👨🏽‍💼,👨🏾‍💼,👨🏿‍💼 +🧑‍⚖️,🧑‍⚖️,🧑🏻‍⚖️,🧑🏼‍⚖️,🧑🏽‍⚖️,🧑🏾‍⚖️,🧑🏿‍⚖️,👩‍⚖️,👩🏻‍⚖️,👩🏼‍⚖️,👩🏽‍⚖️,👩🏾‍⚖️,👩🏿‍⚖️,👨‍⚖️,👨🏻‍⚖️,👨🏼‍⚖️,👨🏽‍⚖️,👨🏾‍⚖️,👨🏿‍⚖️ +🧑‍💻,🧑‍💻,🧑🏻‍💻,🧑🏼‍💻,🧑🏽‍💻,🧑🏾‍💻,🧑🏿‍💻,👩‍💻,👩🏻‍💻,👩🏼‍💻,👩🏽‍💻,👩🏾‍💻,👩🏿‍💻,👨‍💻,👨🏻‍💻,👨🏼‍💻,👨🏽‍💻,👨🏾‍💻,👨🏿‍💻 +🧑‍🎤,🧑‍🎤,🧑🏻‍🎤,🧑🏼‍🎤,🧑🏽‍🎤,🧑🏾‍🎤,🧑🏿‍🎤,👩‍🎤,👩🏻‍🎤,👩🏼‍🎤,👩🏽‍🎤,👩🏾‍🎤,👩🏿‍🎤,👨‍🎤,👨🏻‍🎤,👨🏼‍🎤,👨🏽‍🎤,👨🏾‍🎤,👨🏿‍🎤 +🧑‍🎨,🧑‍🎨,🧑🏻‍🎨,🧑🏼‍🎨,🧑🏽‍🎨,🧑🏾‍🎨,🧑🏿‍🎨,👩‍🎨,👩🏻‍🎨,👩🏼‍🎨,👩🏽‍🎨,👩🏾‍🎨,👩🏿‍🎨,👨‍🎨,👨🏻‍🎨,👨🏼‍🎨,👨🏽‍🎨,👨🏾‍🎨,👨🏿‍🎨 +🧑‍🍳,🧑‍🍳,🧑🏻‍🍳,🧑🏼‍🍳,🧑🏽‍🍳,🧑🏾‍🍳,🧑🏿‍🍳,👩‍🍳,👩🏻‍🍳,👩🏼‍🍳,👩🏽‍🍳,👩🏾‍🍳,👩🏿‍🍳,👨‍🍳,👨🏻‍🍳,👨🏼‍🍳,👨🏽‍🍳,👨🏾‍🍳,👨🏿‍🍳 +👳,👳,👳🏻,👳🏼,👳🏽,👳🏾,👳🏿,👳‍♀️,👳🏻‍♀️,👳🏼‍♀️,👳🏽‍♀️,👳🏾‍♀️,👳🏿‍♀️,👳‍♂️,👳🏻‍♂️,👳🏼‍♂️,👳🏽‍♂️,👳🏾‍♂️,👳🏿‍♂️ +🧕,🧕,🧕🏻,🧕🏼,🧕🏽,🧕🏾,🧕🏿 +👲,👲,👲🏻,👲🏼,👲🏽,👲🏾,👲🏿 +👶,👶,👶🏻,👶🏼,👶🏽,👶🏾,👶🏿 +🧒,🧒,🧒🏻,🧒🏼,🧒🏽,🧒🏾,🧒🏿,👧,👧🏻,👧🏼,👧🏽,👧🏾,👧🏿,👦,👦🏻,👦🏼,👦🏽,👦🏾,👦🏿 +🧑,🧑,🧑🏻,🧑🏼,🧑🏽,🧑🏾,🧑🏿,👩,👩🏻,👩🏼,👩🏽,👩🏾,👩🏿,👨,👨🏻,👨🏼,👨🏽,👨🏾,👨🏿 +🧓,🧓,🧓🏻,🧓🏼,🧓🏽,🧓🏾,🧓🏿,👵,👵🏻,👵🏼,👵🏽,👵🏾,👵🏿,👴,👴🏻,👴🏼,👴🏽,👴🏾,👴🏿 +🧑‍🦳,🧑‍🦳,🧑🏻‍🦳,🧑🏼‍🦳,🧑🏽‍🦳,🧑🏾‍🦳,🧑🏿‍🦳,👩‍🦳,👩🏻‍🦳,👩🏼‍🦳,👩🏽‍🦳,👩🏾‍🦳,👩🏿‍🦳,👨‍🦳,👨🏻‍🦳,👨🏼‍🦳,👨🏽‍🦳,👨🏾‍🦳,👨🏿‍🦳 +🧑‍🦰,🧑‍🦰,🧑🏻‍🦰,🧑🏼‍🦰,🧑🏽‍🦰,🧑🏾‍🦰,🧑🏿‍🦰,👩‍🦰,👩🏻‍🦰,👩🏼‍🦰,👩🏽‍🦰,👩🏾‍🦰,👩🏿‍🦰,👨‍🦰,👨🏻‍🦰,👨🏼‍🦰,👨🏽‍🦰,👨🏾‍🦰,👨🏿‍🦰 +👱,👱,👱🏻,👱🏼,👱🏽,👱🏾,👱🏿,👱‍♀️,👱🏻‍♀️,👱🏼‍♀️,👱🏽‍♀️,👱🏾‍♀️,👱🏿‍♀️,👱‍♂️,👱🏻‍♂️,👱🏼‍♂️,👱🏽‍♂️,👱🏾‍♂️,👱🏿‍♂️ +🧑‍🦱,🧑‍🦱,🧑🏻‍🦱,🧑🏼‍🦱,🧑🏽‍🦱,🧑🏾‍🦱,🧑🏿‍🦱,👩‍🦱,👩🏻‍🦱,👩🏼‍🦱,👩🏽‍🦱,👩🏾‍🦱,👩🏿‍🦱,👨‍🦱,👨🏻‍🦱,👨🏼‍🦱,👨🏽‍🦱,👨🏾‍🦱,👨🏿‍🦱 +🧑‍🦲,🧑‍🦲,🧑🏻‍🦲,🧑🏼‍🦲,🧑🏽‍🦲,🧑🏾‍🦲,🧑🏿‍🦲,👩‍🦲,👩🏻‍🦲,👩🏼‍🦲,👩🏽‍🦲,👩🏾‍🦲,👩🏿‍🦲,👨‍🦲,👨🏻‍🦲,👨🏼‍🦲,👨🏽‍🦲,👨🏾‍🦲,👨🏿‍🦲 +🧔,🧔,🧔🏻,🧔🏼,🧔🏽,🧔🏾,🧔🏿,🧔‍♀️,🧔🏻‍♀️,🧔🏼‍♀️,🧔🏽‍♀️,🧔🏾‍♀️,🧔🏿‍♀️,🧔‍♂️,🧔🏻‍♂️,🧔🏼‍♂️,🧔🏽‍♂️,🧔🏾‍♂️,🧔🏿‍♂️ +🕴️,🕴️,🕴🏻,🕴🏼,🕴🏽,🕴🏾,🕴🏿 +💃,💃,💃🏻,💃🏼,💃🏽,💃🏾,💃🏿 +🕺,🕺,🕺🏻,🕺🏼,🕺🏽,🕺🏾,🕺🏿 +👯,👯,👯‍♂️,👯‍♀️ +🧑‍🤝‍🧑,🧑‍🤝‍🧑,🧑🏻‍🤝‍🧑🏻,🧑🏻‍🤝‍🧑🏼,🧑🏻‍🤝‍🧑🏽,🧑🏻‍🤝‍🧑🏾,🧑🏻‍🤝‍🧑🏿,🧑🏼‍🤝‍🧑🏻,🧑🏼‍🤝‍🧑🏼,🧑🏼‍🤝‍🧑🏽,🧑🏼‍🤝‍🧑🏾,🧑🏼‍🤝‍🧑🏿,🧑🏽‍🤝‍🧑🏻,🧑🏽‍🤝‍🧑🏼,🧑🏽‍🤝‍🧑🏽,🧑🏽‍🤝‍🧑🏾,🧑🏽‍🤝‍🧑🏿,🧑🏾‍🤝‍🧑🏻,🧑🏾‍🤝‍🧑🏼,🧑🏾‍🤝‍🧑🏽,🧑🏾‍🤝‍🧑🏾,🧑🏾‍🤝‍🧑🏿,🧑🏿‍🤝‍🧑🏻,🧑🏿‍🤝‍🧑🏼,🧑🏿‍🤝‍🧑🏽,🧑🏿‍🤝‍🧑🏾,🧑🏿‍🤝‍🧑🏿 +👭,👭,👭🏻,👩🏻‍🤝‍👩🏼,👩🏻‍🤝‍👩🏽,👩🏻‍🤝‍👩🏾,👩🏻‍🤝‍👩🏿,👩🏼‍🤝‍👩🏻,👭🏼,👩🏼‍🤝‍👩🏽,👩🏼‍🤝‍👩🏾,👩🏼‍🤝‍👩🏿,👩🏽‍🤝‍👩🏻,👩🏽‍🤝‍👩🏼,👭🏽,👩🏽‍🤝‍👩🏾,👩🏽‍🤝‍👩🏿,👩🏾‍🤝‍👩🏻,👩🏾‍🤝‍👩🏼,👩🏾‍🤝‍👩🏽,👭🏾,👩🏾‍🤝‍👩🏿,👩🏿‍🤝‍👩🏻,👩🏿‍🤝‍👩🏼,👩🏿‍🤝‍👩🏽,👩🏿‍🤝‍👩🏾,👭🏿 +👬,👬,👬🏻,👨🏻‍🤝‍👨🏼,👨🏻‍🤝‍👨🏽,👨🏻‍🤝‍👨🏾,👨🏻‍🤝‍👨🏿,👨🏼‍🤝‍👨🏻,👬🏼,👨🏼‍🤝‍👨🏽,👨🏼‍🤝‍👨🏾,👨🏼‍🤝‍👨🏿,👨🏽‍🤝‍👨🏻,👨🏽‍🤝‍👨🏼,👬🏽,👨🏽‍🤝‍👨🏾,👨🏽‍🤝‍👨🏿,👨🏾‍🤝‍👨🏻,👨🏾‍🤝‍👨🏼,👨🏾‍🤝‍👨🏽,👬🏾,👨🏾‍🤝‍👨🏿,👨🏿‍🤝‍👨🏻,👨🏿‍🤝‍👨🏼,👨🏿‍🤝‍👨🏽,👨🏿‍🤝‍👨🏾,👬🏿 +👫,👫,👫🏻,👩🏻‍🤝‍👨🏼,👩🏻‍🤝‍👨🏽,👩🏻‍🤝‍👨🏾,👩🏻‍🤝‍👨🏿,👩🏼‍🤝‍👨🏻,👫🏼,👩🏼‍🤝‍👨🏽,👩🏼‍🤝‍👨🏾,👩🏼‍🤝‍👨🏿,👩🏽‍🤝‍👨🏻,👩🏽‍🤝‍👨🏼,👫🏽,👩🏽‍🤝‍👨🏾,👩🏽‍🤝‍👨🏿,👩🏾‍🤝‍👨🏻,👩🏾‍🤝‍👨🏼,👩🏾‍🤝‍👨🏽,👫🏾,👩🏾‍🤝‍👨🏿,👩🏿‍🤝‍👨🏻,👩🏿‍🤝‍👨🏼,👩🏿‍🤝‍👨🏽,👩🏿‍🤝‍👨🏾,👫🏿 +💏,💏,💏🏻,🧑🏻‍❤️‍💋‍🧑🏼,🧑🏻‍❤️‍💋‍🧑🏽,🧑🏻‍❤️‍💋‍🧑🏾,🧑🏻‍❤️‍💋‍🧑🏿,🧑🏼‍❤️‍💋‍🧑🏻,💏🏼,🧑🏼‍❤️‍💋‍🧑🏽,🧑🏼‍❤️‍💋‍🧑🏾,🧑🏼‍❤️‍💋‍🧑🏿,🧑🏽‍❤️‍💋‍🧑🏻,🧑🏽‍❤️‍💋‍🧑🏼,💏🏽,🧑🏽‍❤️‍💋‍🧑🏾,🧑🏽‍❤️‍💋‍🧑🏿,🧑🏾‍❤️‍💋‍🧑🏻,🧑🏾‍❤️‍💋‍🧑🏼,🧑🏾‍❤️‍💋‍🧑🏽,💏🏾,🧑🏾‍❤️‍💋‍🧑🏿,🧑🏿‍❤️‍💋‍🧑🏻,🧑🏿‍❤️‍💋‍🧑🏼,🧑🏿‍❤️‍💋‍🧑🏽,🧑🏿‍❤️‍💋‍🧑🏾,💏🏿 +👩‍❤️‍💋‍👨,👩‍❤️‍💋‍👨,👩🏻‍❤️‍💋‍👨🏻,👩🏻‍❤️‍💋‍👨🏼,👩🏻‍❤️‍💋‍👨🏽,👩🏻‍❤️‍💋‍👨🏾,👩🏻‍❤️‍💋‍👨🏿,👩🏼‍❤️‍💋‍👨🏻,👩🏼‍❤️‍💋‍👨🏼,👩🏼‍❤️‍💋‍👨🏽,👩🏼‍❤️‍💋‍👨🏾,👩🏼‍❤️‍💋‍👨🏿,👩🏽‍❤️‍💋‍👨🏻,👩🏽‍❤️‍💋‍👨🏼,👩🏽‍❤️‍💋‍👨🏽,👩🏽‍❤️‍💋‍👨🏾,👩🏽‍❤️‍💋‍👨🏿,👩🏾‍❤️‍💋‍👨🏻,👩🏾‍❤️‍💋‍👨🏼,👩🏾‍❤️‍💋‍👨🏽,👩🏾‍❤️‍💋‍👨🏾,👩🏾‍❤️‍💋‍👨🏿,👩🏿‍❤️‍💋‍👨🏻,👩🏿‍❤️‍💋‍👨🏼,👩🏿‍❤️‍💋‍👨🏽,👩🏿‍❤️‍💋‍👨🏾,👩🏿‍❤️‍💋‍👨🏿 +👨‍❤️‍💋‍👨,👨‍❤️‍💋‍👨,👨🏻‍❤️‍💋‍👨🏻,👨🏻‍❤️‍💋‍👨🏼,👨🏻‍❤️‍💋‍👨🏽,👨🏻‍❤️‍💋‍👨🏾,👨🏻‍❤️‍💋‍👨🏿,👨🏼‍❤️‍💋‍👨🏻,👨🏼‍❤️‍💋‍👨🏼,👨🏼‍❤️‍💋‍👨🏽,👨🏼‍❤️‍💋‍👨🏾,👨🏼‍❤️‍💋‍👨🏿,👨🏽‍❤️‍💋‍👨🏻,👨🏽‍❤️‍💋‍👨🏼,👨🏽‍❤️‍💋‍👨🏽,👨🏽‍❤️‍💋‍👨🏾,👨🏽‍❤️‍💋‍👨🏿,👨🏾‍❤️‍💋‍👨🏻,👨🏾‍❤️‍💋‍👨🏼,👨🏾‍❤️‍💋‍👨🏽,👨🏾‍❤️‍💋‍👨🏾,👨🏾‍❤️‍💋‍👨🏿,👨🏿‍❤️‍💋‍👨🏻,👨🏿‍❤️‍💋‍👨🏼,👨🏿‍❤️‍💋‍👨🏽,👨🏿‍❤️‍💋‍👨🏾,👨🏿‍❤️‍💋‍👨🏿 +👩‍❤️‍💋‍👩,👩‍❤️‍💋‍👩,👩🏻‍❤️‍💋‍👩🏻,👩🏻‍❤️‍💋‍👩🏼,👩🏻‍❤️‍💋‍👩🏽,👩🏻‍❤️‍💋‍👩🏾,👩🏻‍❤️‍💋‍👩🏿,👩🏼‍❤️‍💋‍👩🏻,👩🏼‍❤️‍💋‍👩🏼,👩🏼‍❤️‍💋‍👩🏽,👩🏼‍❤️‍💋‍👩🏾,👩🏼‍❤️‍💋‍👩🏿,👩🏽‍❤️‍💋‍👩🏻,👩🏽‍❤️‍💋‍👩🏼,👩🏽‍❤️‍💋‍👩🏽,👩🏽‍❤️‍💋‍👩🏾,👩🏽‍❤️‍💋‍👩🏿,👩🏾‍❤️‍💋‍👩🏻,👩🏾‍❤️‍💋‍👩🏼,👩🏾‍❤️‍💋‍👩🏽,👩🏾‍❤️‍💋‍👩🏾,👩🏾‍❤️‍💋‍👩🏿,👩🏿‍❤️‍💋‍👩🏻,👩🏿‍❤️‍💋‍👩🏼,👩🏿‍❤️‍💋‍👩🏽,👩🏿‍❤️‍💋‍👩🏾,👩🏿‍❤️‍💋‍👩🏿 +💑,💑,💑🏻,🧑🏻‍❤️‍🧑🏼,🧑🏻‍❤️‍🧑🏽,🧑🏻‍❤️‍🧑🏾,🧑🏻‍❤️‍🧑🏿,🧑🏼‍❤️‍🧑🏻,💑🏼,🧑🏼‍❤️‍🧑🏽,🧑🏼‍❤️‍🧑🏾,🧑🏼‍❤️‍🧑🏿,🧑🏽‍❤️‍🧑🏻,🧑🏽‍❤️‍🧑🏼,💑🏽,🧑🏽‍❤️‍🧑🏾,🧑🏽‍❤️‍🧑🏿,🧑🏾‍❤️‍🧑🏻,🧑🏾‍❤️‍🧑🏼,🧑🏾‍❤️‍🧑🏽,💑🏾,🧑🏾‍❤️‍🧑🏿,🧑🏿‍❤️‍🧑🏻,🧑🏿‍❤️‍🧑🏼,🧑🏿‍❤️‍🧑🏽,🧑🏿‍❤️‍🧑🏾,💑🏿 +👩‍❤️‍👨,👩‍❤️‍👨,👩🏻‍❤️‍👨🏻,👩🏻‍❤️‍👨🏼,👩🏻‍❤️‍👨🏽,👩🏻‍❤️‍👨🏾,👩🏻‍❤️‍👨🏿,👩🏼‍❤️‍👨🏻,👩🏼‍❤️‍👨🏼,👩🏼‍❤️‍👨🏽,👩🏼‍❤️‍👨🏾,👩🏼‍❤️‍👨🏿,👩🏽‍❤️‍👨🏻,👩🏽‍❤️‍👨🏼,👩🏽‍❤️‍👨🏽,👩🏽‍❤️‍👨🏾,👩🏽‍❤️‍👨🏿,👩🏾‍❤️‍👨🏻,👩🏾‍❤️‍👨🏼,👩🏾‍❤️‍👨🏽,👩🏾‍❤️‍👨🏾,👩🏾‍❤️‍👨🏿,👩🏿‍❤️‍👨🏻,👩🏿‍❤️‍👨🏼,👩🏿‍❤️‍👨🏽,👩🏿‍❤️‍👨🏾,👩🏿‍❤️‍👨🏿 +👨‍❤️‍👨,👨‍❤️‍👨,👨🏻‍❤️‍👨🏻,👨🏻‍❤️‍👨🏼,👨🏻‍❤️‍👨🏽,👨🏻‍❤️‍👨🏾,👨🏻‍❤️‍👨🏿,👨🏼‍❤️‍👨🏻,👨🏼‍❤️‍👨🏼,👨🏼‍❤️‍👨🏽,👨🏼‍❤️‍👨🏾,👨🏼‍❤️‍👨🏿,👨🏽‍❤️‍👨🏻,👨🏽‍❤️‍👨🏼,👨🏽‍❤️‍👨🏽,👨🏽‍❤️‍👨🏾,👨🏽‍❤️‍👨🏿,👨🏾‍❤️‍👨🏻,👨🏾‍❤️‍👨🏼,👨🏾‍❤️‍👨🏽,👨🏾‍❤️‍👨🏾,👨🏾‍❤️‍👨🏿,👨🏿‍❤️‍👨🏻,👨🏿‍❤️‍👨🏼,👨🏿‍❤️‍👨🏽,👨🏿‍❤️‍👨🏾,👨🏿‍❤️‍👨🏿 +👩‍❤️‍👩,👩‍❤️‍👩,👩🏻‍❤️‍👩🏻,👩🏻‍❤️‍👩🏼,👩🏻‍❤️‍👩🏽,👩🏻‍❤️‍👩🏾,👩🏻‍❤️‍👩🏿,👩🏼‍❤️‍👩🏻,👩🏼‍❤️‍👩🏼,👩🏼‍❤️‍👩🏽,👩🏼‍❤️‍👩🏾,👩🏼‍❤️‍👩🏿,👩🏽‍❤️‍👩🏻,👩🏽‍❤️‍👩🏼,👩🏽‍❤️‍👩🏽,👩🏽‍❤️‍👩🏾,👩🏽‍❤️‍👩🏿,👩🏾‍❤️‍👩🏻,👩🏾‍❤️‍👩🏼,👩🏾‍❤️‍👩🏽,👩🏾‍❤️‍👩🏾,👩🏾‍❤️‍👩🏿,👩🏿‍❤️‍👩🏻,👩🏿‍❤️‍👩🏼,👩🏿‍❤️‍👩🏽,👩🏿‍❤️‍👩🏾,👩🏿‍❤️‍👩🏿 +🫄,🫄,🫄🏻,🫄🏼,🫄🏽,🫄🏾,🫄🏿,🤰,🤰🏻,🤰🏼,🤰🏽,🤰🏾,🤰🏿,🫃,🫃🏻,🫃🏼,🫃🏽,🫃🏾,🫃🏿 +🤱,🤱,🤱🏻,🤱🏼,🤱🏽,🤱🏾,🤱🏿 +🧑‍🍼,🧑‍🍼,🧑🏻‍🍼,🧑🏼‍🍼,🧑🏽‍🍼,🧑🏾‍🍼,🧑🏿‍🍼,👩‍🍼,👩🏻‍🍼,👩🏼‍🍼,👩🏽‍🍼,👩🏾‍🍼,👩🏿‍🍼,👨‍🍼,👨🏻‍🍼,👨🏼‍🍼,👨🏽‍🍼,👨🏾‍🍼,👨🏿‍🍼 diff --git a/emojipicker/app/src/main/androidx/res/raw/emoji_category_symbols.csv b/emojipicker/app/src/main/androidx/res/raw/emoji_category_symbols.csv new file mode 100644 index 00000000..d917e274 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/raw/emoji_category_symbols.csv @@ -0,0 +1,261 @@ +🔴 +🟠 +🟡 +🟢 +🔵 +🟣 +🟤 +⚫ +⚪ +🟥 +🟧 +🟨 +🟩 +🟦 +🟪 +🟫 +⬛ +⬜ +❤️ +🧡 +💛 +💚 +💙 +💜 +🤎 +🖤 +🤍 +🩷 +🩵 +🩶 +♥️ +♦️ +♣️ +♠️ +♈ +♉ +♊ +♋ +♌ +♍ +♎ +♏ +♐ +♑ +♒ +♓ +⛎ +♀️ +♂️ +⚧️ +💭 +🗯️ +💬 +🗨️ +❕ +❔ +❗ +❓ +⁉️ +‼️ +⭕ +❌ +🚫 +🚳 +🚭 +🚯 +🚱 +🚷 +📵 +🔞 +🔕 +🔇 +🅰️ +🆎 +🅱️ +🅾️ +🆑 +🆘 +🛑 +⛔ +📛 +♨️ +💢 +🔻 +🔺 +🉐 +㊙️ +㊗️ +🈴 +🈵 +🈹 +🈲 +🉑 +🈶 +🈚 +🈸 +🈺 +🈷️ +✴️ +🔶 +🔸 +🔆 +🔅 +🆚 +🎦 +📶 +🔁 +🔂 +🔀 +▶️ +⏩ +⏭️ +⏯️ +◀️ +⏪ +⏮️ +🔼 +⏫ +🔽 +⏬ +⏸️ +⏹️ +⏺️ +⏏️ +📴 +🛜 +📳 +📲 +☢️ +☣️ +⚠️ +🚸 +⚜️ +🔱 +〽️ +🔰 +✳️ +❇️ +♻️ +💱 +💲 +💹 +🈯 +❎ +✅ +✔️ +☑️ +⬆️ +↗️ +➡️ +↘️ +⬇️ +↙️ +⬅️ +↖️ +↕️ +↔️ +↩️ +↪️ +⤴️ +⤵️ +🔃 +🔄 +🔙 +🔛 +🔝 +🔚 +🔜 +🆕 +🆓 +🆙 +🆗 +🆒 +🆖 +ℹ️ +🅿️ +🈁 +🈂️ +🈳 +🔣 +🔤 +🔠 +🔡 +🔢 +#️⃣ +*️⃣ +0️⃣ +1️⃣ +2️⃣ +3️⃣ +4️⃣ +5️⃣ +6️⃣ +7️⃣ +8️⃣ +9️⃣ +🔟 +🌐 +💠 +🔷 +🔹 +🏧 +Ⓜ️ +🚾 +🚻 +🚹 +🚺 +♿ +🚼 +🛗 +🚮 +🚰 +🛂 +🛃 +🛄 +🛅 +💟 +⚛️ +🛐 +🕉️ +☸️ +☮️ +☯️ +☪️ +🪯 +✝️ +☦️ +✡️ +🔯 +🕎 +♾️ +🆔 +🧑‍🧑‍🧒 +🧑‍🧑‍🧒‍🧒 +🧑‍🧒 +🧑‍🧒‍🧒 +⚕️ +🎼 +🎵 +🎶 +✖️ +➕ +➖ +➗ +🟰 +➰ +➿ +〰️ +©️ +®️ +™️ +🔘 +🔳 +◼️ +◾ +▪️ +🔲 +◻️ +◽ +▫️ +👁️‍🗨️ diff --git a/emojipicker/app/src/main/androidx/res/raw/emoji_category_travel_places.csv b/emojipicker/app/src/main/androidx/res/raw/emoji_category_travel_places.csv new file mode 100644 index 00000000..8704e956 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/raw/emoji_category_travel_places.csv @@ -0,0 +1,122 @@ +🛑 +🚧 +🚨 +⛽ +🛢️ +🧭 +🛞 +🛟 +⚓ +🚏 +🚇 +🚥 +🚦 +🛴 +🦽 +🦼 +🩼 +🚲 +🛵 +🏍️ +🚙 +🚗 +🛻 +🚐 +🚚 +🚛 +🚜 +🏎️ +🚒 +🚑 +🚓 +🚕 +🛺 +🚌 +🚈 +🚝 +🚅 +🚄 +🚂 +🚃 +🚋 +🚎 +🚞 +🚊 +🚉 +🚍 +🚔 +🚘 +🚖 +🚆 +🚢 +🛳️ +🛥️ +🚤 +⛴️ +⛵ +🛶 +🚟 +🚠 +🚡 +🚁 +🛸 +🚀 +✈️ +🛫 +🛬 +🛩️ +🛝 +🎢 +🎡 +🎠 +🎪 +🗼 +🗽 +🗿 +🗻 +🏛️ +💈 +⛲ +⛩️ +🕍 +🕌 +🕋 +🛕 +⛪ +💒 +🏩 +🏯 +🏰 +🏗️ +🏢 +🏭 +🏬 +🏪 +🏟️ +🏦 +🏫 +🏨 +🏣 +🏤 +🏥 +🏚️ +🏠 +🏡 +🏘️ +🛖 +⛺ +🏕️ +⛱️ +🏙️ +🌆 +🌇 +🌃 +🌉 +🌁 +🛤️ +🛣️ +🗾 +🗺️ +🌐 +💺 +🧳 diff --git a/emojipicker/app/src/main/androidx/res/values-af/strings.xml b/emojipicker/app/src/main/androidx/res/values-af/strings.xml new file mode 100644 index 00000000..ef7bb7c4 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-af/strings.xml @@ -0,0 +1,42 @@ + + + + + "ONLANGS GEBRUIK" + "EMOSIEKONE EN EMOSIES" + "MENSE" + "DIERE EN NATUUR" + "KOS EN DRINKGOED" + "REIS EN PLEKKE" + "AKTIWITEITE EN GELEENTHEDE" + "VOORWERPE" + "SIMBOLE" + "VLAE" + "Geen emosiekone beskikbaar nie" + "Jy het nog geen emosiekone gebruik nie" + "emosiekoon-tweerigtingoorskakelaar" + "rigting waarin emosiekoon wys is gewissel" + "emosiekoonvariantkieser" + "%1$s en %2$s" + "skadu" + "ligte velkleur" + "mediumligte velkleur" + "medium velkleur" + "mediumdonker velkleur" + "donker velkleur" + diff --git a/emojipicker/app/src/main/androidx/res/values-am/strings.xml b/emojipicker/app/src/main/androidx/res/values-am/strings.xml new file mode 100644 index 00000000..5be491cc --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-am/strings.xml @@ -0,0 +1,42 @@ + + + + + "በቅርብ ጊዜ ጥቅም ላይ የዋለ" + "ሳቂታዎች እና ስሜቶች" + "ሰዎች" + "እንስሳት እና ተፈጥሮ" + "ምግብ እና መጠጥ" + "ጉዞ እና ቦታዎች" + "እንቅስቃሴዎች እና ክስተቶች" + "ነገሮች" + "ምልክቶች" + "ባንዲራዎች" + "ምንም ስሜት ገላጭ ምስሎች አይገኙም" + "ምንም ስሜት ገላጭ ምስሎችን እስካሁን አልተጠቀሙም" + "የስሜት ገላጭ ምስል ባለሁለት አቅጣጫ መቀያየሪያ" + "የስሜት ገላጭ ምስል አቅጣጫ ተቀይሯል" + "የስሜት ገላጭ ምስል ተለዋዋጭ መራጭ" + "%1$s እና %2$s" + "ጥላ" + "ነጣ ያለ የቆዳ ቀለም" + "መካከለኛ ነጣ ያለ የቆዳ ቀለም" + "መካከለኛ የቆዳ ቀለም" + "መካከለኛ ጠቆር ያለ የቆዳ ቀለም" + "ጠቆር ያለ የቆዳ ቀለም" + diff --git a/emojipicker/app/src/main/androidx/res/values-ar/strings.xml b/emojipicker/app/src/main/androidx/res/values-ar/strings.xml new file mode 100644 index 00000000..4d42ff9e --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-ar/strings.xml @@ -0,0 +1,42 @@ + + + + + "المستخدمة حديثًا" + "الوجوه المبتسمة والرموز التعبيرية" + "الأشخاص" + "الحيوانات والطبيعة" + "المأكولات والمشروبات" + "السفر والأماكن" + "الأنشطة والأحداث" + "عناصر متنوعة" + "الرموز" + "الأعلام" + "لا تتوفر أي رموز تعبيرية." + "لم تستخدم أي رموز تعبيرية حتى الآن." + "مفتاح ثنائي الاتجاه للرموز التعبيرية" + "تم تغيير اتجاه الإيموجي" + "أداة اختيار الرموز التعبيرية" + "‏%1$s و%2$s" + "الظل" + "بشرة فاتحة" + "بشرة فاتحة متوسّطة" + "بشرة متوسّطة" + "بشرة داكنة متوسّطة" + "بشرة داكنة" + diff --git a/emojipicker/app/src/main/androidx/res/values-as/strings.xml b/emojipicker/app/src/main/androidx/res/values-as/strings.xml new file mode 100644 index 00000000..6ca5f5b7 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-as/strings.xml @@ -0,0 +1,42 @@ + + + + + "অলপতে ব্যৱহৃত" + "স্মাইলী আৰু আৱেগ" + "মানুহ" + "পশু আৰু প্ৰকৃতি" + "খাদ্য আৰু পানীয়" + "ভ্ৰমণ আৰু স্থান" + "কাৰ্যকলাপ আৰু অনুষ্ঠান" + "বস্তু" + "চিহ্ন" + "পতাকা" + "কোনো ইম’জি উপলব্ধ নহয়" + "আপুনি এতিয়ালৈকে কোনো ইম’জি ব্যৱহাৰ কৰা নাই" + "ইম’জি বাইডাইৰেকশ্বনেল ছুইচ্চাৰ" + "দিক্-নিৰ্দেশনা প্ৰদৰ্শন কৰা ইম’জি সলনি কৰা হৈছে" + "ইম’জিৰ প্ৰকাৰ বাছনি কৰোঁতা" + "%1$s আৰু %2$s" + "ছাঁ" + "পাতলীয়া ছালৰ ৰং" + "মধ্যমীয়া পাতল ছালৰ ৰং" + "মিঠাবৰণীয়া ছালৰ ৰং" + "মধ্যমীয়া গাঢ় ছালৰ ৰং" + "গাঢ় ছালৰ ৰং" + diff --git a/emojipicker/app/src/main/androidx/res/values-az/strings.xml b/emojipicker/app/src/main/androidx/res/values-az/strings.xml new file mode 100644 index 00000000..c4c52857 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-az/strings.xml @@ -0,0 +1,42 @@ + + + + + "SON İSTİFADƏ EDİLƏN" + "SMAYLİK VƏ EMOSİYALAR" + "ADAMLAR" + "HEYVANLAR VƏ TƏBİƏT" + "QİDA VƏ İÇKİ" + "SƏYAHƏT VƏ MƏKANLAR" + "FƏALİYYƏTLƏR VƏ TƏDBİRLƏR" + "OBYEKTLƏR" + "SİMVOLLAR" + "BAYRAQLAR" + "Əlçatan emoji yoxdur" + "Hələ heç bir emojidən istifadə etməməsiniz" + "ikitərəfli emoji dəyişdirici" + "emoji istiqaməti dəyişdirildi" + "emoji variant seçicisi" + "%1$s və %2$s" + "kölgə" + "açıq dəri rəngi" + "orta açıq dəri rəngi" + "orta dəri rəngi" + "orta tünd dəri rəngi" + "tünd dəri rəngi" + diff --git a/emojipicker/app/src/main/androidx/res/values-b+sr+Latn/strings.xml b/emojipicker/app/src/main/androidx/res/values-b+sr+Latn/strings.xml new file mode 100644 index 00000000..8feb2961 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-b+sr+Latn/strings.xml @@ -0,0 +1,42 @@ + + + + + "NEDAVNO KORIŠĆENO" + "SMAJLIJI I EMOCIJE" + "LJUDI" + "ŽIVOTINJE I PRIRODA" + "HRANA I PIĆE" + "PUTOVANJA I MESTA" + "AKTIVNOSTI I DOGAĐAJI" + "OBJEKTI" + "SIMBOLI" + "ZASTAVE" + "Emodžiji nisu dostupni" + "Još niste koristili emodžije" + "dvosmerni prebacivač emodžija" + "smer emodžija je promenjen" + "birač varijanti emodžija" + "%1$s i %2$s" + "senka" + "koža svetle puti" + "koža srednjesvetle puti" + "koža srednje puti" + "koža srednjetamne puti" + "koža tamne puti" + diff --git a/emojipicker/app/src/main/androidx/res/values-be/strings.xml b/emojipicker/app/src/main/androidx/res/values-be/strings.xml new file mode 100644 index 00000000..67dc3c2e --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-be/strings.xml @@ -0,0 +1,42 @@ + + + + + "НЯДАЎНА ВЫКАРЫСТАНЫЯ" + "СМАЙЛІКІ І ЭМОЦЫІ" + "ЛЮДЗІ" + "ЖЫВЁЛЫ І ПРЫРОДА" + "ЕЖА І НАПОІ" + "ПАДАРОЖЖЫ І МЕСЦЫ" + "ДЗЕЯННІ І ПАДЗЕІ" + "АБ\'ЕКТЫ" + "СІМВАЛЫ" + "СЦЯГІ" + "Няма даступных эмодзі" + "Вы пакуль не выкарыстоўвалі эмодзі" + "пераключальнік кірунку для эмодзі" + "кірунак арыентацыі эмодзі зменены" + "інструмент выбару варыянтаў эмодзі" + "%1$s і %2$s" + "цень" + "светлы колер скуры" + "умерана светлы колер скуры" + "нейтральны колер скуры" + "умерана цёмны колер скуры" + "цёмны колер скуры" + diff --git a/emojipicker/app/src/main/androidx/res/values-bg/strings.xml b/emojipicker/app/src/main/androidx/res/values-bg/strings.xml new file mode 100644 index 00000000..929d7676 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-bg/strings.xml @@ -0,0 +1,42 @@ + + + + + "НАСКОРО ИЗПОЛЗВАНИ" + "ЕМОТИКОНИ И ЕМОЦИИ" + "ХОРА" + "ЖИВОТНИ И ПРИРОДА" + "ХРАНИ И НАПИТКИ" + "ПЪТУВАНИЯ И МЕСТА" + "АКТИВНОСТИ И СЪБИТИЯ" + "ПРЕДМЕТИ" + "СИМВОЛИ" + "ЗНАМЕНА" + "Няма налични емоджи" + "Все още не сте използвали емоджита" + "двупосочен превключвател на емоджи" + "посоката на емоджи бе променена" + "инструмент за избор на варианти за емоджи" + "%1$s и %2$s" + "сянка" + "светъл цвят на кожата" + "средно светъл цвят на кожата" + "междинен цвят на кожата" + "средно тъмен цвят на кожата" + "тъмен цвят на кожата" + diff --git a/emojipicker/app/src/main/androidx/res/values-bn/strings.xml b/emojipicker/app/src/main/androidx/res/values-bn/strings.xml new file mode 100644 index 00000000..55a691f2 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-bn/strings.xml @@ -0,0 +1,42 @@ + + + + + "সম্প্রতি ব্যবহার করা হয়েছে" + "স্মাইলি ও আবেগ" + "ব্যক্তি" + "প্রাণী ও প্রকৃতি" + "খাদ্য ও পানীয়" + "ভ্রমণ ও জায়গা" + "অ্যাক্টিভিটি ও ইভেন্ট" + "অবজেক্ট" + "প্রতীক" + "ফ্ল্যাগ" + "কোনও ইমোজি উপলভ্য নেই" + "আপনি এখনও কোনও ইমোজি ব্যবহার করেননি" + "ইমোজি দ্বিমুখী সুইচার" + "ইমোজির দিক পরিবর্তন হয়েছে" + "ইমোজি ভেরিয়েন্ট বাছাইকারী" + "%1$s এবং %2$s" + "ছায়া" + "হাল্কা স্কিন টোন" + "মাঝারি-হাল্কা স্কিন টোন" + "মাঝারি স্কিন টোন" + "মাঝারি-গাঢ় স্কিন টোন" + "গাঢ় স্কিন টোন" + diff --git a/emojipicker/app/src/main/androidx/res/values-bs/strings.xml b/emojipicker/app/src/main/androidx/res/values-bs/strings.xml new file mode 100644 index 00000000..401f6c82 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-bs/strings.xml @@ -0,0 +1,42 @@ + + + + + "NEDAVNO KORIŠTENO" + "SMAJLIJI I EMOCIJE" + "OSOBE" + "ŽIVOTINJE I PRIRODA" + "HRANA I PIĆE" + "PUTOVANJA I MJESTA" + "AKTIVNOSTI I DOGAĐAJI" + "PREDMETI" + "SIMBOLI" + "ZASTAVE" + "Emoji sličice nisu dostupne" + "Još niste koristili nijednu emoji sličicu" + "dvosmjerni prebacivač emodžija" + "emodži gleda u smjeru postavke prekidača" + "birač varijanti emodžija" + "%1$s i %2$s" + "sjenka" + "svijetla boja kože" + "srednje svijetla boja kože" + "srednja boja kože" + "srednje tamna boja kože" + "tamna boja kože" + diff --git a/emojipicker/app/src/main/androidx/res/values-ca/strings.xml b/emojipicker/app/src/main/androidx/res/values-ca/strings.xml new file mode 100644 index 00000000..09e2bc9a --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-ca/strings.xml @@ -0,0 +1,42 @@ + + + + + "UTILITZATS FA POC" + "EMOTICONES I EMOCIONS" + "PERSONES" + "ANIMALS I NATURALESA" + "MENJAR I BEGUDA" + "VIATGES I LLOCS" + "ACTIVITATS I ESDEVENIMENTS" + "OBJECTES" + "SÍMBOLS" + "BANDERES" + "No hi ha cap emoji disponible" + "Encara no has fet servir cap emoji" + "selector bidireccional d\'emojis" + "s\'ha canviat la direcció de l\'emoji" + "selector de variants d\'emojis" + "%1$s i %2$s" + "ombra" + "to de pell clar" + "to de pell mitjà-clar" + "to de pell mitjà" + "to de pell mitjà-fosc" + "to de pell fosc" + diff --git a/emojipicker/app/src/main/androidx/res/values-cs/strings.xml b/emojipicker/app/src/main/androidx/res/values-cs/strings.xml new file mode 100644 index 00000000..8d7e0f50 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-cs/strings.xml @@ -0,0 +1,42 @@ + + + + + "NEDÁVNO POUŽITÉ" + "SMAJLÍCI A EMOCE" + "LIDÉ" + "ZVÍŘATA A PŘÍRODA" + "JÍDLO A PITÍ" + "CESTOVÁNÍ A MÍSTA" + "AKTIVITY A UDÁLOSTI" + "OBJEKTY" + "SYMBOLY" + "VLAJKY" + "Nejsou k dispozici žádné smajlíky" + "Zatím jste žádná emodži nepoužili" + "dvousměrný přepínač smajlíků" + "směr pohledu smajlíků přepnut" + "výběr variant emodži" + "%1$s a %2$s" + "stín" + "světlý tón pleti" + "středně světlý tón pleti" + "střední tón pleti" + "středně tmavý tón pleti" + "tmavý tón pleti" + diff --git a/emojipicker/app/src/main/androidx/res/values-da/strings.xml b/emojipicker/app/src/main/androidx/res/values-da/strings.xml new file mode 100644 index 00000000..e9eb67b9 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-da/strings.xml @@ -0,0 +1,42 @@ + + + + + "BRUGT FOR NYLIG" + "SMILEYS OG HUMØRIKONER" + "PERSONER" + "DYR OG NATUR" + "MAD OG DRIKKE" + "REJSER OG STEDER" + "AKTIVITETER OG BEGIVENHEDER" + "TING" + "SYMBOLER" + "FLAG" + "Der er ingen tilgængelige emojis" + "Du har ikke brugt nogen emojis endnu" + "tovejsskifter til emojis" + "emojien vender en anden retning" + "vælger for emojivariant" + "%1$s og %2$s" + "skygge" + "lys hudfarve" + "mellemlys hudfarve" + "medium hudfarve" + "mellemmørk hudfarve" + "mørk hudfarve" + diff --git a/emojipicker/app/src/main/androidx/res/values-de/strings.xml b/emojipicker/app/src/main/androidx/res/values-de/strings.xml new file mode 100644 index 00000000..6e72ab75 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-de/strings.xml @@ -0,0 +1,42 @@ + + + + + "ZULETZT VERWENDET" + "SMILEYS UND EMOTIONEN" + "PERSONEN" + "TIERE UND NATUR" + "ESSEN UND TRINKEN" + "REISEN UND ORTE" + "AKTIVITÄTEN UND EVENTS" + "OBJEKTE" + "SYMBOLE" + "FLAGGEN" + "Keine Emojis verfügbar" + "Du hast noch keine Emojis verwendet" + "Bidirektionale Emoji-Auswahl" + "Emoji-Richtung geändert" + "Emojivarianten-Auswahl" + "%1$s und %2$s" + "Hautton" + "Heller Hautton" + "Mittelheller Hautton" + "Mittlerer Hautton" + "Mitteldunkler Hautton" + "Dunkler Hautton" + diff --git a/emojipicker/app/src/main/androidx/res/values-el/strings.xml b/emojipicker/app/src/main/androidx/res/values-el/strings.xml new file mode 100644 index 00000000..4a59ed67 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-el/strings.xml @@ -0,0 +1,42 @@ + + + + + "ΧΡΗΣΙΜΟΠΟΙΗΘΗΚΑΝ ΠΡΟΣΦΑΤΑ" + "ΕΙΚΟΝΙΔΙΑ SMILEY ΚΑΙ ΣΥΝΑΙΣΘΗΜΑΤΑ" + "ΑΤΟΜΑ" + "ΖΩΑ ΚΑΙ ΦΥΣΗ" + "ΦΑΓΗΤΟ ΚΑΙ ΠΟΤΟ" + "ΤΑΞΙΔΙΑ ΚΑΙ ΜΕΡΗ" + "ΔΡΑΣΤΗΡΙΟΤΗΤΕΣ ΚΑΙ ΣΥΜΒΑΝΤΑ" + "ΑΝΤΙΚΕΙΜΕΝΑ" + "ΣΥΜΒΟΛΑ" + "ΣΗΜΑΙΕΣ" + "Δεν υπάρχουν διαθέσιμα emoji" + "Δεν έχετε χρησιμοποιήσει κανένα emoji ακόμα" + "αμφίδρομο στοιχείο εναλλαγής emoji" + "έγινε εναλλαγή της κατεύθυνσης που είναι στραμμένο το emoji" + "επιλογέας παραλλαγής emoji" + "%1$s και %2$s" + "σκιά" + "ανοιχτός τόνος επιδερμίδας" + "μεσαίος προς ανοιχτός τόνος επιδερμίδας" + "μεσαίος τόνος επιδερμίδας" + "μεσαίος προς σκούρος τόνος επιδερμίδας" + "σκούρος τόνος επιδερμίδας" + diff --git a/emojipicker/app/src/main/androidx/res/values-en-rAU/strings.xml b/emojipicker/app/src/main/androidx/res/values-en-rAU/strings.xml new file mode 100644 index 00000000..0b651f51 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-en-rAU/strings.xml @@ -0,0 +1,42 @@ + + + + + "RECENTLY USED" + "SMILEYS AND EMOTIONS" + "PEOPLE" + "ANIMALS AND NATURE" + "FOOD AND DRINK" + "TRAVEL AND PLACES" + "ACTIVITIES AND EVENTS" + "OBJECTS" + "SYMBOLS" + "FLAGS" + "No emojis available" + "You haven\'t used any emoji yet" + "emoji bidirectional switcher" + "emoji facing direction switched" + "emoji variant selector" + "%1$s and %2$s" + "shadow" + "light skin tone" + "medium-light skin tone" + "medium skin tone" + "medium-dark skin tone" + "dark skin tone" + diff --git a/emojipicker/app/src/main/androidx/res/values-en-rCA/strings.xml b/emojipicker/app/src/main/androidx/res/values-en-rCA/strings.xml new file mode 100644 index 00000000..d056590c --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-en-rCA/strings.xml @@ -0,0 +1,42 @@ + + + + + "RECENTLY USED" + "SMILEYS AND EMOTIONS" + "PEOPLE" + "ANIMALS AND NATURE" + "FOOD AND DRINK" + "TRAVEL AND PLACES" + "ACTIVITIES AND EVENTS" + "OBJECTS" + "SYMBOLS" + "FLAGS" + "No emojis available" + "You haven\'t used any emojis yet" + "emoji bidirectional switcher" + "emoji facing direction switched" + "emoji variant selector" + "%1$s and %2$s" + "shadow" + "light skin tone" + "medium light skin tone" + "medium skin tone" + "medium dark skin tone" + "dark skin tone" + diff --git a/emojipicker/app/src/main/androidx/res/values-en-rGB/strings.xml b/emojipicker/app/src/main/androidx/res/values-en-rGB/strings.xml new file mode 100644 index 00000000..0b651f51 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-en-rGB/strings.xml @@ -0,0 +1,42 @@ + + + + + "RECENTLY USED" + "SMILEYS AND EMOTIONS" + "PEOPLE" + "ANIMALS AND NATURE" + "FOOD AND DRINK" + "TRAVEL AND PLACES" + "ACTIVITIES AND EVENTS" + "OBJECTS" + "SYMBOLS" + "FLAGS" + "No emojis available" + "You haven\'t used any emoji yet" + "emoji bidirectional switcher" + "emoji facing direction switched" + "emoji variant selector" + "%1$s and %2$s" + "shadow" + "light skin tone" + "medium-light skin tone" + "medium skin tone" + "medium-dark skin tone" + "dark skin tone" + diff --git a/emojipicker/app/src/main/androidx/res/values-en-rIN/strings.xml b/emojipicker/app/src/main/androidx/res/values-en-rIN/strings.xml new file mode 100644 index 00000000..0b651f51 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-en-rIN/strings.xml @@ -0,0 +1,42 @@ + + + + + "RECENTLY USED" + "SMILEYS AND EMOTIONS" + "PEOPLE" + "ANIMALS AND NATURE" + "FOOD AND DRINK" + "TRAVEL AND PLACES" + "ACTIVITIES AND EVENTS" + "OBJECTS" + "SYMBOLS" + "FLAGS" + "No emojis available" + "You haven\'t used any emoji yet" + "emoji bidirectional switcher" + "emoji facing direction switched" + "emoji variant selector" + "%1$s and %2$s" + "shadow" + "light skin tone" + "medium-light skin tone" + "medium skin tone" + "medium-dark skin tone" + "dark skin tone" + diff --git a/emojipicker/app/src/main/androidx/res/values-en-rXC/strings.xml b/emojipicker/app/src/main/androidx/res/values-en-rXC/strings.xml new file mode 100644 index 00000000..3e02185f --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-en-rXC/strings.xml @@ -0,0 +1,42 @@ + + + + + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‎‎‏‏‏‏‎‏‏‎‏‎‎‎‏‏‎‏‎‏‎‏‏‏‏‏‎‏‏‎‏‏‎‏‏‏‎‏‎‏‏‏‏‎‎‏‏‎‎‏‎‎‏‏‏‎RECENTLY USED‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‏‏‏‎‎‏‏‎‎‏‎‏‏‎‏‏‎‎‏‏‏‎‎‎‏‏‏‎‏‏‏‏‏‎‏‏‎‎‏‎‏‎‏‏‎‏‎‎‏‏‏‎‎‎‎‎‏‎SMILEYS AND EMOTIONS‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‏‎‎‏‎‏‎‎‏‎‏‎‎‎‏‏‎‏‏‏‎‏‎‏‏‎‏‏‏‏‏‎‎‎‏‏‎‏‎‏‎‏‏‏‏‎‏‎‏‎‏‏‎‎‎‏‎PEOPLE‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‎‎‏‏‎‎‏‏‏‎‏‎‏‎‏‎‎‏‏‏‎‏‏‏‎‏‎‎‏‏‏‎‎‏‎‏‏‏‏‏‏‎‎‏‎‎‏‎‎‏‎‎‏‎‏‎‏‎ANIMALS AND NATURE‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‎‏‎‎‎‎‎‏‏‏‎‏‎‎‎‎‏‎‎‎‏‏‎‎‏‎‏‎‏‎‏‎‎‏‎‎‏‎‏‎‎‏‏‏‏‎‎‎‎‏‏‏‎‏‎‏‏‎FOOD AND DRINK‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‎‎‏‏‏‏‏‎‏‎‏‎‎‎‏‏‎‏‏‎‏‎‎‏‎‎‏‎‎‎‏‎‎‎‎‏‎‎‎‏‏‎‏‏‏‏‎‎‎‏‏‎‎‎‎‎‎‎TRAVEL AND PLACES‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‎‏‏‎‎‏‏‎‎‏‏‏‎‏‎‏‏‎‎‏‎‏‏‎‎‏‎‏‏‏‏‏‏‎‏‏‎‏‏‎‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‎ACTIVITIES AND EVENTS‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‎‏‎‏‏‏‏‎‏‎‏‎‎‎‏‏‏‏‏‎‎‎‏‏‎‎‎‏‏‎‎‎‎‏‏‎‏‎‏‏‎‎‏‎‎‏‏‎‎‏‏‏‎‎‎‏‏‎OBJECTS‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‎‎‎‎‏‎‏‎‎‎‎‏‎‏‏‎‏‎‏‎‏‏‏‏‏‏‏‏‎‎‎‎‎‏‏‎‏‏‏‎‎‎‎‏‏‎‎‎‎‎‎‎‏‏‎‏‏‎SYMBOLS‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‏‏‏‎‏‎‏‏‏‏‏‎‎‏‏‏‎‎‏‎‏‏‎‏‏‎‎‎‎‎‏‎‎‏‎‏‏‎‎‎‏‏‏‏‏‏‏‎‎‏‏‏‎‎‏‏‏‎FLAGS‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‎‎‎‎‎‎‎‎‏‎‎‎‎‏‏‎‏‎‏‏‎‏‎‏‏‎‎‎‎‎‎‎‏‎‏‎‏‎‎‏‏‎‎‎‎‎‏‎‏‎‎‏‎‏‎‎‎‏‎No emojis available‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‎‏‎‎‏‎‎‎‏‎‎‎‎‏‏‎‏‏‎‎‏‏‏‎‎‎‎‏‎‎‎‏‏‏‏‏‎‏‎‎‎‎‏‏‎‎‎‏‎‏‎‏‎‏‏‎‎‎‎You haven\'t used any emojis yet‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‎‏‎‎‏‎‎‎‎‎‎‏‎‎‎‎‎‏‏‏‎‏‎‎‏‏‏‏‎‏‎‏‏‏‎‏‎‎‏‎‏‎‎‎‎‏‎‏‎‎‎‏‏‏‏‎‏‎emoji bidirectional switcher‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‎‎‎‏‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‎‎‏‎‏‎‎‏‎‏‎‏‏‏‏‏‎‏‏‎‏‏‏‏‏‏‎‎‎‎‎‏‏‎emoji facing direction switched‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‎‎‎‎‏‏‏‎‏‏‎‎‎‏‎‏‎‏‏‏‏‎‏‎‏‎‏‏‎‏‎‎‎‏‎‎‏‎‎‏‎‎‎‏‏‎‏‎‏‎‎‏‏‎‎‎‎‎‎emoji variant selector‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‎‏‎‎‏‎‎‎‏‎‎‏‎‏‏‏‎‎‏‎‎‏‎‏‏‏‏‏‏‎‎‎‏‏‎‎‏‎‎‏‎‏‎‎‎‏‎‏‏‏‏‎‏‎‎‎‏‎%1$s and %2$s‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‎‎‏‏‎‏‏‎‎‎‏‏‏‎‎‎‏‏‏‏‏‏‏‎‎‎‏‏‎‏‎‎‏‎‏‎‎‏‏‏‏‎‎‎‎‏‏‏‎‏‎‏‏‎‎‎‎‎shadow‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‏‎‏‎‎‏‏‎‏‎‎‏‎‎‏‏‎‏‏‏‎‏‎‏‎‏‎‎‏‎‏‏‎‏‎‎‎‎‎‏‎‎‏‏‎‎‎‏‏‏‏‎‎‏‎‎‎‏‎light skin tone‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‏‎‎‎‏‎‎‏‎‎‏‏‏‎‎‎‎‎‏‏‏‏‏‏‎‎‏‏‎‏‏‎‎‎‎‎‏‏‎‎‏‎‏‎‏‏‎‏‏‎‏‏‎‏‎‏‎‎medium light skin tone‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‏‏‎‎‏‏‎‏‏‎‏‎‎‏‎‏‏‏‏‎‏‎‎‎‎‎‎‏‎‏‎‏‏‎‎‏‏‎‏‏‏‎‎‎‏‎‎‎‎‎‏‏‎medium skin tone‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‎‎‏‎‏‎‏‎‎‏‏‏‎‎‏‎‎‎‎‎‎‎‏‏‏‏‏‎‎‏‎‎‎‎‏‏‏‎‎‎‏‎‏‏‏‏‎‏‎‏‎‏‎‏‏‎‏‎medium dark skin tone‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‎‏‎‎‎‏‏‎‎‏‎‏‎‏‎‎‎‎‏‎‏‎‏‏‎‎‎‎‏‎‎‎‏‏‎‎‎‎‎‎‏‏‏‎‎‏‏‎‎‏‏‏‏‎‏‏‏‎‎dark skin tone‎‏‎‎‏‎" + diff --git a/emojipicker/app/src/main/androidx/res/values-es-rUS/strings.xml b/emojipicker/app/src/main/androidx/res/values-es-rUS/strings.xml new file mode 100644 index 00000000..e9001edf --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-es-rUS/strings.xml @@ -0,0 +1,42 @@ + + + + + "USADOS RECIENTEMENTE" + "EMOTICONES Y EMOCIONES" + "PERSONAS" + "ANIMALES Y NATURALEZA" + "COMIDAS Y BEBIDAS" + "VIAJES Y LUGARES" + "ACTIVIDADES Y EVENTOS" + "OBJETOS" + "SÍMBOLOS" + "BANDERAS" + "No hay ningún emoji disponible" + "Todavía no usaste ningún emoji" + "selector bidireccional de emojis" + "se cambió la dirección del emoji" + "selector de variantes de emojis" + "%1$s y %2$s" + "sombra" + "tono de piel claro" + "tono de piel medio claro" + "tono de piel intermedio" + "tono de piel medio oscuro" + "tono de piel oscuro" + diff --git a/emojipicker/app/src/main/androidx/res/values-es/strings.xml b/emojipicker/app/src/main/androidx/res/values-es/strings.xml new file mode 100644 index 00000000..d2aed368 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-es/strings.xml @@ -0,0 +1,42 @@ + + + + + "USADOS RECIENTEMENTE" + "EMOTICONOS Y EMOCIONES" + "PERSONAS" + "ANIMALES Y NATURALEZA" + "COMIDA Y BEBIDA" + "VIAJES Y SITIOS" + "ACTIVIDADES Y EVENTOS" + "OBJETOS" + "SÍMBOLOS" + "BANDERAS" + "No hay emojis disponibles" + "Aún no has usado ningún emoji" + "cambio bidireccional de emojis" + "dirección a la que se orienta el emoji cambiada" + "selector de variantes de emojis" + "%1$s y %2$s" + "sombra" + "tono de piel claro" + "tono de piel medio claro" + "tono de piel medio" + "tono de piel medio oscuro" + "tono de piel oscuro" + diff --git a/emojipicker/app/src/main/androidx/res/values-et/strings.xml b/emojipicker/app/src/main/androidx/res/values-et/strings.xml new file mode 100644 index 00000000..8b3d05aa --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-et/strings.xml @@ -0,0 +1,42 @@ + + + + + "HILJUTI KASUTATUD" + "NÄOIKOONID JA EMOTSIOONID" + "INIMESED" + "LOOMAD JA LOODUS" + "SÖÖK JA JOOK" + "REISIMINE JA KOHAD" + "TEGEVUSED JA SÜNDMUSED" + "OBJEKTID" + "SÜMBOLID" + "LIPUD" + "Ühtegi emotikoni pole saadaval" + "Te pole veel ühtegi emotikoni kasutanud" + "emotikoni kahesuunaline lüliti" + "emotikoni suunda vahetati" + "emotikoni variandi valija" + "%1$s ja %2$s" + "vari" + "hele nahatoon" + "keskmiselt hele nahatoon" + "keskmine nahatoon" + "keskmiselt tume nahatoon" + "tume nahatoon" + diff --git a/emojipicker/app/src/main/androidx/res/values-eu/strings.xml b/emojipicker/app/src/main/androidx/res/values-eu/strings.xml new file mode 100644 index 00000000..9c550ca9 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-eu/strings.xml @@ -0,0 +1,42 @@ + + + + + "ERABILITAKO AZKENAK" + "AURPEGIERAK ETA ALDARTEAK" + "JENDEA" + "ANIMALIAK ETA NATURA" + "JAN-EDANAK" + "BIDAIAK ETA TOKIAK" + "JARDUERAK ETA GERTAERAK" + "OBJEKTUAK" + "IKURRAK" + "BANDERAK" + "Ez dago emotikonorik erabilgarri" + "Ez duzu erabili emojirik oraingoz" + "noranzko biko emoji-aldatzailea" + "emojiaren norabidea aldatu da" + "emojien aldaeren hautatzailea" + "%1$s eta %2$s" + "itzala" + "azalaren tonu argia" + "azalaren tonu argixka" + "azalaren tarteko tonua" + "azalaren tonu ilunxkoa" + "azalaren tonu iluna" + diff --git a/emojipicker/app/src/main/androidx/res/values-fa/strings.xml b/emojipicker/app/src/main/androidx/res/values-fa/strings.xml new file mode 100644 index 00000000..5930a4f0 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-fa/strings.xml @@ -0,0 +1,42 @@ + + + + + "اخیراً استفاده‌شده" + "شکلک‌ها و احساسات" + "افراد" + "حیوانات و طبیعت" + "غذا و نوشیدنی" + "سفر و مکان‌ها" + "فعالیت‌ها و رویدادها" + "اشیاء" + "نشان‌ها" + "پرچم‌ها" + "اموجی دردسترس نیست" + "هنوز از هیچ اموجی‌ای استفاده نکرده‌اید" + "تغییردهنده دوسویه اموجی" + "جهت چهره اموجی تغییر کرد" + "گزینشگر متغیر اموجی" + "‏%1$s و %2$s" + "سایه" + "رنگ‌مایه پوست روشن" + "رنگ‌مایه پوست ملایم روشن" + "رنگ‌مایه پوست ملایم" + "رنگ‌مایه پوست ملایم تیره" + "رنگ‌مایه پوست تیره" + diff --git a/emojipicker/app/src/main/androidx/res/values-fi/strings.xml b/emojipicker/app/src/main/androidx/res/values-fi/strings.xml new file mode 100644 index 00000000..bb6ccb58 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-fi/strings.xml @@ -0,0 +1,42 @@ + + + + + "VIIMEKSI KÄYTETYT" + "HYMIÖT JA TUNNETILAT" + "IHMISET" + "ELÄIMET JA LUONTO" + "RUOKA JA JUOMA" + "MATKAILU JA PAIKAT" + "AKTIVITEETIT JA TAPAHTUMAT" + "ESINEET" + "SYMBOLIT" + "LIPUT" + "Ei emojeita saatavilla" + "Et ole vielä käyttänyt emojeita" + "emoji kaksisuuntainen vaihtaja" + "emojin osoitussuunta vaihdettu" + "emojivalitsin" + "%1$s ja %2$s" + "varjostus" + "vaalea ihonväri" + "melko vaalea ihonväri" + "keskimääräinen ihonväri" + "melko tumma ihonväri" + "tumma ihonväri" + diff --git a/emojipicker/app/src/main/androidx/res/values-fr-rCA/strings.xml b/emojipicker/app/src/main/androidx/res/values-fr-rCA/strings.xml new file mode 100644 index 00000000..334f18f5 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-fr-rCA/strings.xml @@ -0,0 +1,42 @@ + + + + + "UTILISÉS RÉCEMMENT" + "ÉMOTICÔNES ET ÉMOTIONS" + "PERSONNES" + "ANIMAUX ET NATURE" + "ALIMENTS ET BOISSONS" + "VOYAGES ET LIEUX" + "ACTIVITÉS ET ÉVÉNEMENTS" + "OBJETS" + "SYMBOLES" + "DRAPEAUX" + "Aucun émoji proposé" + "Vous n\'avez encore utilisé aucun émoji" + "sélecteur bidirectionnel d\'émoji" + "Émoji tourné dans la direction inverse" + "sélecteur de variantes d\'émoji" + "%1$s et %2$s" + "ombre" + "teint clair" + "teint moyennement clair" + "teint moyen" + "teint moyennement foncé" + "teint foncé" + diff --git a/emojipicker/app/src/main/androidx/res/values-fr/strings.xml b/emojipicker/app/src/main/androidx/res/values-fr/strings.xml new file mode 100644 index 00000000..66f9f4d8 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-fr/strings.xml @@ -0,0 +1,42 @@ + + + + + "UTILISÉS RÉCEMMENT" + "ÉMOTICÔNES ET ÉMOTIONS" + "PERSONNES" + "ANIMAUX ET NATURE" + "ALIMENTATION ET BOISSONS" + "VOYAGES ET LIEUX" + "ACTIVITÉS ET ÉVÉNEMENTS" + "OBJETS" + "SYMBOLES" + "DRAPEAUX" + "Aucun emoji disponible" + "Vous n\'avez pas encore utilisé d\'emoji" + "sélecteur d\'emoji bidirectionnel" + "sens de l\'orientation de l\'emoji inversé" + "sélecteur de variante d\'emoji" + "%1$s et %2$s" + "ombre" + "teint clair" + "teint intermédiaire à clair" + "teint intermédiaire" + "teint intermédiaire à foncé" + "teint foncé" + diff --git a/emojipicker/app/src/main/androidx/res/values-gl/strings.xml b/emojipicker/app/src/main/androidx/res/values-gl/strings.xml new file mode 100644 index 00000000..f8715c36 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-gl/strings.xml @@ -0,0 +1,42 @@ + + + + + "USADOS HAI POUCO" + "ICONAS XESTUAIS E EMOTICONAS" + "PERSOAS" + "ANIMAIS E NATUREZA" + "COMIDA E BEBIDA" + "VIAXES E LUGARES" + "ACTIVIDADES E EVENTOS" + "OBXECTOS" + "SÍMBOLOS" + "BANDEIRAS" + "Non hai ningún emoji dispoñible" + "Aínda non utilizaches ningún emoji" + "selector bidireccional de emojis" + "dirección do emoji cambiada" + "selector de variantes de emojis" + "%1$s e %2$s" + "sombra" + "ton de pel claro" + "ton de pel lixeiramente claro" + "ton de pel medio" + "ton de pel lixeiramente escuro" + "ton de pel escuro" + diff --git a/emojipicker/app/src/main/androidx/res/values-gu/strings.xml b/emojipicker/app/src/main/androidx/res/values-gu/strings.xml new file mode 100644 index 00000000..dad9fd38 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-gu/strings.xml @@ -0,0 +1,42 @@ + + + + + "તાજેતરમાં વપરાયેલું" + "સ્માઇલી અને મનોભાવો" + "લોકો" + "પ્રાણીઓ અને પ્રકૃતિ" + "ભોજન અને પીણાં" + "મુસાફરી અને સ્થળો" + "પ્રવૃત્તિઓ અને ઇવેન્ટ" + "ઑબ્જેક્ટ" + "પ્રતીકો" + "ઝંડા" + "કોઈ ઇમોજી ઉપલબ્ધ નથી" + "તમે હજી સુધી કોઈ ઇમોજીનો ઉપયોગ કર્યો નથી" + "બે દિશામાં સ્વિચ થઈ શકતું ઇમોજી સ્વિચર" + "ઇમોજીની દિશા બદલવામાં આવી" + "ઇમોજીનો પ્રકાર પસંદગીકર્તા" + "%1$s અને %2$s" + "શૅડો" + "ત્વચાનો હળવો ટોન" + "ત્વચાનો મધ્યમ હળવો ટોન" + "ત્વચાનો મધ્યમ ટોન" + "ત્વચાનો મધ્યમ ઘેરો ટોન" + "ત્વચાનો ઘેરો ટોન" + diff --git a/emojipicker/app/src/main/androidx/res/values-hi/strings.xml b/emojipicker/app/src/main/androidx/res/values-hi/strings.xml new file mode 100644 index 00000000..81cd653a --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-hi/strings.xml @@ -0,0 +1,42 @@ + + + + + "हाल ही में इस्तेमाल किए गए" + "स्माइली और भावनाएं" + "लोग" + "जानवर और प्रकृति" + "खाने-पीने की चीज़ें" + "यात्रा और जगहें" + "गतिविधियां और इवेंट" + "ऑब्जेक्ट" + "सिंबल" + "झंडे" + "कोई इमोजी उपलब्ध नहीं है" + "आपने अब तक किसी भी इमोजी का इस्तेमाल नहीं किया है" + "दोनों तरफ़ ले जा सकने वाले स्विचर का इमोजी" + "इमोजी को फ़्लिप किया गया" + "इमोजी के वैरिएंट चुनने का टूल" + "%1$s और %2$s" + "शैडो" + "हल्के रंग की त्वचा" + "थोड़े हल्के रंग की त्वचा" + "सामान्य रंग की त्वचा" + "थोड़े गहरे रंग की त्वचा" + "गहरे रंग की त्वचा" + diff --git a/emojipicker/app/src/main/androidx/res/values-hr/strings.xml b/emojipicker/app/src/main/androidx/res/values-hr/strings.xml new file mode 100644 index 00000000..481b4867 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-hr/strings.xml @@ -0,0 +1,42 @@ + + + + + "NEDAVNO KORIŠTENO" + "SMAJLIĆI I EMOCIJE" + "OSOBE" + "ŽIVOTINJE I PRIRODA" + "HRANA I PIĆE" + "PUTOVANJA I MJESTA" + "AKTIVNOSTI I DOGAĐAJI" + "OBJEKTI" + "SIMBOLI" + "ZASTAVE" + "Nije dostupan nijedan emoji" + "Još niste upotrijebili emojije" + "dvosmjerni izmjenjivač emojija" + "promijenjen je smjer emojija" + "alat za odabir varijante emojija" + "%1$s i %2$s" + "sjena" + "svijetla boja kože" + "srednje svijetla boja kože" + "srednja boja kože" + "srednje tamna boja kože" + "tamna boja kože" + diff --git a/emojipicker/app/src/main/androidx/res/values-hu/strings.xml b/emojipicker/app/src/main/androidx/res/values-hu/strings.xml new file mode 100644 index 00000000..d048746c --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-hu/strings.xml @@ -0,0 +1,42 @@ + + + + + "LEGUTÓBB HASZNÁLT" + "HANGULATJELEK ÉS HANGULATOK" + "SZEMÉLYEK" + "ÁLLATOK ÉS TERMÉSZET" + "ÉTEL ÉS ITAL" + "UTAZÁS ÉS HELYEK" + "TEVÉKENYSÉGEK ÉS ESEMÉNYEK" + "TÁRGYAK" + "SZIMBÓLUMOK" + "ZÁSZLÓK" + "Nincsenek rendelkezésre álló emojik" + "Még nem használt emojikat" + "kétirányú emojiváltó" + "módosítva lett, hogy merre nézzen az emoji" + "emojiváltozat-választó" + "%1$s és %2$s" + "árnyék" + "világos bőrtónus" + "közepesen világos bőrtónus" + "közepes bőrtónus" + "közepesen sötét bőrtónus" + "sötét bőrtónus" + diff --git a/emojipicker/app/src/main/androidx/res/values-hy/strings.xml b/emojipicker/app/src/main/androidx/res/values-hy/strings.xml new file mode 100644 index 00000000..be551dec --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-hy/strings.xml @@ -0,0 +1,42 @@ + + + + + "ՎԵՐՋԵՐՍ ՕԳՏԱԳՈՐԾՎԱԾ" + "ԶՄԱՅԼԻԿՆԵՐ ԵՎ ՀՈՒԶԱՊԱՏԿԵՐԱԿՆԵՐ" + "ՄԱՐԴԻԿ" + "ԿԵՆԴԱՆԻՆԵՐ ԵՎ ԲՆՈՒԹՅՈՒՆ" + "ՍՆՈՒՆԴ ԵՎ ԽՄԻՉՔ" + "ՃԱՄՓՈՐԴՈՒԹՅՈՒՆ ԵՎ ՏԵՍԱՐԺԱՆ ՎԱՅՐԵՐ" + "ԺԱՄԱՆՑ ԵՎ ՄԻՋՈՑԱՌՈՒՄՆԵՐ" + "ԱՌԱՐԿԱՆԵՐ" + "ՆՇԱՆՆԵՐ" + "ԴՐՈՇՆԵՐ" + "Հասանելի էմոջիներ չկան" + "Դուք դեռ չեք օգտագործել էմոջիներ" + "էմոջիների երկկողմանի փոխանջատիչ" + "էմոջիի դեմքի ուղղությունը փոխվեց" + "էմոջիների տարբերակի ընտրիչ" + "%1$s և %2$s" + "ստվեր" + "մաշկի բաց երանգ" + "մաշկի չափավոր բաց երանգ" + "մաշկի չեզոք երանգ" + "մաշկի չափավոր մուգ երանգ" + "մաշկի մուգ երանգ" + diff --git a/emojipicker/app/src/main/androidx/res/values-in/strings.xml b/emojipicker/app/src/main/androidx/res/values-in/strings.xml new file mode 100644 index 00000000..09703b72 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-in/strings.xml @@ -0,0 +1,42 @@ + + + + + "TERAKHIR DIGUNAKAN" + "SMILEY DAN EMOTIKON" + "ORANG" + "HEWAN DAN ALAM" + "MAKANAN DAN MINUMAN" + "WISATA DAN TEMPAT" + "AKTIVITAS DAN ACARA" + "OBJEK" + "SIMBOL" + "BENDERA" + "Tidak ada emoji yang tersedia" + "Anda belum menggunakan emoji apa pun" + "pengalih dua arah emoji" + "arah hadap emoji dialihkan" + "pemilih varian emoji" + "%1$s dan %2$s" + "bayangan" + "warna kulit cerah" + "warna kulit kuning langsat" + "warna kulit sawo matang" + "warna kulit cokelat" + "warna kulit gelap" + diff --git a/emojipicker/app/src/main/androidx/res/values-is/strings.xml b/emojipicker/app/src/main/androidx/res/values-is/strings.xml new file mode 100644 index 00000000..691d3c62 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-is/strings.xml @@ -0,0 +1,42 @@ + + + + + "NOTAÐ NÝLEGA" + "BROSKARLAR OG TILFINNINGAR" + "FÓLK" + "DÝR OG NÁTTÚRA" + "MATUR OG DRYKKUR" + "FERÐALÖG OG STAÐIR" + "VIRKNI OG VIÐBURÐIR" + "HLUTIR" + "TÁKN" + "FÁNAR" + "Engin emoji-tákn í boði" + "Þú hefur ekki notað nein emoji enn" + "emoji-val í báðar áttir" + "Áttinni sem emoji snýr að hefur verið breytt" + "val emoji-afbrigðis" + "%1$s og %2$s" + "skuggi" + "ljós húðlitur" + "meðalljós húðlitur" + "húðlitur í meðallagi" + "meðaldökkur húðlitur" + "dökkur húðlitur" + diff --git a/emojipicker/app/src/main/androidx/res/values-it/strings.xml b/emojipicker/app/src/main/androidx/res/values-it/strings.xml new file mode 100644 index 00000000..6ff2bf9c --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-it/strings.xml @@ -0,0 +1,42 @@ + + + + + "USATE DI RECENTE" + "SMILE ED EMOZIONI" + "PERSONE" + "ANIMALI E NATURA" + "CIBO E BEVANDE" + "VIAGGI E LUOGHI" + "ATTIVITÀ ED EVENTI" + "OGGETTI" + "SIMBOLI" + "BANDIERE" + "Nessuna emoji disponibile" + "Non hai ancora usato alcuna emoji" + "selettore bidirezionale di emoji" + "emoji sottosopra" + "selettore variante emoji" + "%1$s e %2$s" + "ombra" + "carnagione chiara" + "carnagione medio-chiara" + "carnagione media" + "carnagione medio-scura" + "carnagione scura" + diff --git a/emojipicker/app/src/main/androidx/res/values-iw/strings.xml b/emojipicker/app/src/main/androidx/res/values-iw/strings.xml new file mode 100644 index 00000000..7a8eae8a --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-iw/strings.xml @@ -0,0 +1,42 @@ + + + + + "בשימוש לאחרונה" + "סמיילי ואמוטיקונים" + "אנשים" + "בעלי חיים וטבע" + "מזון ומשקאות" + "נסיעות ומקומות" + "פעילויות ואירועים" + "אובייקטים" + "סמלים" + "דגלים" + "אין סמלי אמוג\'י זמינים" + "עדיין לא השתמשת באף אמוג\'י" + "לחצן דו-כיווני למעבר לאמוג\'י" + "מתג נגישות להחלפת הכיוון של האמוג\'י" + "בורר של סוגי אמוג\'י" + "‏%1$s ו-%2$s" + "צל" + "גוון עור בהיר" + "גוון עור בינוני-בהיר" + "גוון עור בינוני" + "גוון עור בינוני-כהה" + "גוון עור כהה" + diff --git a/emojipicker/app/src/main/androidx/res/values-ja/strings.xml b/emojipicker/app/src/main/androidx/res/values-ja/strings.xml new file mode 100644 index 00000000..395ee6d7 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-ja/strings.xml @@ -0,0 +1,42 @@ + + + + + "最近使用した絵文字" + "顔文字、気分" + "人物" + "動物、自然" + "食べ物、飲み物" + "移動、場所" + "活動、イベント" + "アイテム" + "記号" + "旗" + "使用できる絵文字がありません" + "まだ絵文字を使用していません" + "絵文字の双方向切り替え" + "絵文字の向きを切り替えました" + "絵文字バリエーション セレクタ" + "%1$s、%2$s" + "シャドウ" + "明るい肌の色" + "やや明るい肌の色" + "中間の明るさの肌の色" + "やや濃い肌の色" + "濃い肌の色" + diff --git a/emojipicker/app/src/main/androidx/res/values-ka/strings.xml b/emojipicker/app/src/main/androidx/res/values-ka/strings.xml new file mode 100644 index 00000000..5d23faa2 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-ka/strings.xml @@ -0,0 +1,42 @@ + + + + + "ბოლო დროს გამოყენებული" + "სიცილაკები და ემოციები" + "ადამიანები" + "ცხოველები და ბუნება" + "საჭმელი და სასმელი" + "მოგზაურობა და ადგილები" + "აქტივობები და მოვლენები" + "ობიექტები" + "სიმბოლოები" + "დროშები" + "Emoji-ები მიუწვდომელია" + "Emoji-ებით ჯერ არ გისარგებლიათ" + "emoji-ს ორმიმართულებიანი გადამრთველი" + "emoji-ის მიმართულება შეცვლილია" + "emoji-ს ვარიანტის ამომრჩევი" + "%1$s და %2$s" + "ჩრდილი" + "კანის ღია ტონი" + "კანის ღია საშუალო ტონი" + "კანის საშუალო ტონი" + "კანის მუქი საშუალო ტონი" + "კანის მუქი ტონი" + diff --git a/emojipicker/app/src/main/androidx/res/values-kk/strings.xml b/emojipicker/app/src/main/androidx/res/values-kk/strings.xml new file mode 100644 index 00000000..cd6a8c57 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-kk/strings.xml @@ -0,0 +1,42 @@ + + + + + "СОҢҒЫ ҚОЛДАНЫЛҒАНДАР" + "СМАЙЛДАР МЕН ЭМОЦИЯЛАР" + "АДАМДАР" + "ЖАНУАРЛАР ЖӘНЕ ТАБИҒАТ" + "ТАМАҚ ПЕН СУСЫН" + "САЯХАТ ЖӘНЕ ОРЫНДАР" + "ӘРЕКЕТТЕР МЕН ІС-ШАРАЛАР" + "НЫСАНДАР" + "ТАҢБАЛАР" + "ЖАЛАУШАЛАР" + "Эмоджи жоқ" + "Әлі ешқандай эмоджи пайдаланылған жоқ." + "екіжақты эмоджи ауыстырғыш" + "эмоджи бағыты ауыстырылды" + "эмоджи нұсқаларын таңдау құралы" + "%1$s және %2$s" + "көлеңке" + "терінің ақшыл реңі" + "терінің орташа ақшыл реңі" + "терінің орташа реңі" + "терінің орташа қараторы реңі" + "терінің қараторы реңі" + diff --git a/emojipicker/app/src/main/androidx/res/values-km/strings.xml b/emojipicker/app/src/main/androidx/res/values-km/strings.xml new file mode 100644 index 00000000..0b4dffc2 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-km/strings.xml @@ -0,0 +1,42 @@ + + + + + "បាន​ប្រើ​ថ្មីៗ​នេះ" + "រូប​ទឹក​មុខ និងអារម្មណ៍" + "មនុស្ស" + "សត្វ និងធម្មជាតិ" + "អាហារ និងភេសជ្ជៈ" + "ការធ្វើដំណើរ និងទីកន្លែង" + "សកម្មភាព និងព្រឹត្តិការណ៍" + "វត្ថុ" + "និមិត្តសញ្ញា" + "ទង់" + "មិនមាន​រូប​អារម្មណ៍ទេ" + "អ្នក​មិនទាន់​បានប្រើរូប​អារម្មណ៍​ណាមួយ​នៅឡើយទេ" + "មុខងារប្ដូរទ្វេទិសនៃរូប​អារម្មណ៍" + "បានប្ដូរទិសដៅបែររបស់រូប​អារម្មណ៍" + "ផ្ទាំងជ្រើសរើសជម្រើសរូប​អារម្មណ៍" + "%1$s និង %2$s" + "ស្រមោល" + "សម្បុរស្បែក​ស" + "សម្បុរស្បែក​សល្មម" + "សម្បុរ​ស្បែក​ល្មម" + "សម្បុរ​ស្បែកខ្មៅល្មម" + "សម្បុរ​ស្បែក​ខ្មៅ" + diff --git a/emojipicker/app/src/main/androidx/res/values-kn/strings.xml b/emojipicker/app/src/main/androidx/res/values-kn/strings.xml new file mode 100644 index 00000000..b05a64c2 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-kn/strings.xml @@ -0,0 +1,42 @@ + + + + + "ಇತ್ತೀಚೆಗೆ ಬಳಸಿರುವುದು" + "ಸ್ಮೈಲಿಗಳು ಮತ್ತು ಭಾವನೆಗಳು" + "ಜನರು" + "ಪ್ರಾಣಿಗಳು ಮತ್ತು ಪ್ರಕೃತಿ" + "ಆಹಾರ ಮತ್ತು ಪಾನೀಯ" + "ಪ್ರಯಾಣ ಮತ್ತು ಸ್ಥಳಗಳು" + "ಚಟುವಟಿಕೆಗಳು ಮತ್ತು ಈವೆಂಟ್‌ಗಳು" + "ವಸ್ತುಗಳು" + "ಸಂಕೇತಗಳು" + "ಫ್ಲ್ಯಾಗ್‌ಗಳು" + "ಯಾವುದೇ ಎಮೊಜಿಗಳು ಲಭ್ಯವಿಲ್ಲ" + "ನೀವು ಇನ್ನೂ ಯಾವುದೇ ಎಮೋಜಿಗಳನ್ನು ಬಳಸಿಲ್ಲ" + "ಎಮೋಜಿ ಬೈಡೈರೆಕ್ಷನಲ್ ಸ್ವಿಚರ್" + "ಎಮೋಜಿ ಎದುರಿಸುತ್ತಿರುವ ದಿಕ್ಕನ್ನು ಬದಲಾಯಿಸಲಾಗಿದೆ" + "ಎಮೋಜಿ ವೇರಿಯಂಟ್ ಸೆಲೆಕ್ಟರ್" + "%1$s ಮತ್ತು %2$s" + "ನೆರಳು" + "ಲೈಟ್ ಸ್ಕಿನ್ ಟೋನ್" + "ಮೀಡಿಯಮ್ ಲೈಟ್ ಸ್ಕಿನ್ ಟೋನ್" + "ಮೀಡಿಯಮ್ ಸ್ಕಿನ್ ಟೋನ್" + "ಮೀಡಿಯಮ್ ಡಾರ್ಕ್ ಸ್ಕಿನ್ ಟೋನ್" + "ಡಾರ್ಕ್ ಸ್ಕಿನ್ ಟೋನ್" + diff --git a/emojipicker/app/src/main/androidx/res/values-ko/strings.xml b/emojipicker/app/src/main/androidx/res/values-ko/strings.xml new file mode 100644 index 00000000..22cace83 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-ko/strings.xml @@ -0,0 +1,42 @@ + + + + + "최근 사용" + "이모티콘 및 감정" + "사람" + "동물 및 자연" + "식음료" + "여행 및 장소" + "활동 및 이벤트" + "사물" + "기호" + "깃발" + "사용 가능한 그림 이모티콘 없음" + "아직 사용한 이모티콘이 없습니다." + "그림 이모티콘 양방향 전환기" + "이모티콘 방향 전환됨" + "그림 이모티콘 옵션 선택기" + "%1$s 및 %2$s" + "그림자" + "밝은 피부색" + "약간 밝은 피부색" + "중간 피부색" + "약간 어두운 피부색" + "어두운 피부색" + diff --git a/emojipicker/app/src/main/androidx/res/values-ky/strings.xml b/emojipicker/app/src/main/androidx/res/values-ky/strings.xml new file mode 100644 index 00000000..aa345469 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-ky/strings.xml @@ -0,0 +1,42 @@ + + + + + "АКЫРКЫ КОЛДОНУЛГАНДАР" + "БЫЙТЫКЧАЛАР ЖАНА ЭМОЦИЯЛАР" + "АДАМДАР" + "ЖАНЫБАРЛАР ЖАНА ЖАРАТЫЛЫШ" + "АЗЫК-ТҮЛҮК ЖАНА СУУСУНДУКТАР" + "САЯКАТ ЖАНА ЖЕРЛЕР" + "ИШ-АРАКЕТТЕР ЖАНА ИШ-ЧАРАЛАР" + "ОБЪЕКТТЕР" + "СИМВОЛДОР" + "ЖЕЛЕКТЕР" + "Жеткиликтүү быйтыкчалар жок" + "Бир да быйтыкча колдоно элексиз" + "эки тараптуу быйтыкча которгуч" + "быйтыкчанын багыты которулду" + "быйтыкча тандагыч" + "%1$s жана %2$s" + "көлөкө" + "ачык түстүү тери" + "агыраак түстүү тери" + "орточо түстүү тери" + "орточо кара тору түстүү тери" + "кара тору түстүү тери" + diff --git a/emojipicker/app/src/main/androidx/res/values-lo/strings.xml b/emojipicker/app/src/main/androidx/res/values-lo/strings.xml new file mode 100644 index 00000000..174400e0 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-lo/strings.xml @@ -0,0 +1,42 @@ + + + + + "ໃຊ້ຫຼ້າສຸດ" + "ໜ້າຍິ້ມ ແລະ ຄວາມຮູ້ສຶກ" + "ຜູ້ຄົນ" + "ສັດ ແລະ ທຳມະຊາດ" + "ອາຫານ ແລະ ເຄື່ອງດື່ມ" + "ການເດີນທາງ ແລະ ສະຖານທີ່" + "ການເຄື່ອນໄຫວ ແລະ ກິດຈະກຳ" + "ວັດຖຸ" + "ສັນຍາລັກ" + "ທຸງ" + "ບໍ່ມີອີໂມຈິໃຫ້ນຳໃຊ້" + "ທ່ານຍັງບໍ່ໄດ້ໃຊ້ອີໂມຈິໃດເທື່ອ" + "ຕົວສະຫຼັບອີໂມຈິແບບ 2 ທິດທາງ" + "ປ່ຽນທິດທາງການຫັນໜ້າຂອງອີໂມຈິແລ້ວ" + "ຕົວເລືອກຕົວແປອີໂມຈິ" + "%1$s ແລະ %2$s" + "ເງົາ" + "ສະກິນໂທນແຈ້ງ" + "ສະກິນໂທນແຈ້ງປານກາງ" + "ສະກິນໂທນປານກາງ" + "ສະກິນໂທນມືດປານກາງ" + "ສະກິນໂທນມືດ" + diff --git a/emojipicker/app/src/main/androidx/res/values-lt/strings.xml b/emojipicker/app/src/main/androidx/res/values-lt/strings.xml new file mode 100644 index 00000000..72390ae4 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-lt/strings.xml @@ -0,0 +1,42 @@ + + + + + "NESENIAI NAUDOTI" + "JAUSTUKAI IR EMOCIJOS" + "ŽMONĖS" + "GYVŪNAI IR GAMTA" + "MAISTAS IR GĖRIMAI" + "KELIONĖS IR VIETOS" + "VEIKLA IR ĮVYKIAI" + "OBJEKTAI" + "SIMBOLIAI" + "VĖLIAVOS" + "Nėra jokių pasiekiamų jaustukų" + "Dar nenaudojote jokių jaustukų" + "dvikryptis jaustukų perjungikli" + "perjungta jaustukų nuoroda" + "jaustuko varianto parinkiklis" + "%1$s ir %2$s" + "šešėlis" + "šviesi odos spalva" + "vidutiniškai šviesi odos spalva" + "nei tamsi, nei šviesi odos spalva" + "vidutiniškai tamsi odos spalva" + "tamsi odos spalva" + diff --git a/emojipicker/app/src/main/androidx/res/values-lv/strings.xml b/emojipicker/app/src/main/androidx/res/values-lv/strings.xml new file mode 100644 index 00000000..0fe66ac7 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-lv/strings.xml @@ -0,0 +1,42 @@ + + + + + "NESEN LIETOTAS" + "SMAIDIŅI UN EMOCIJAS" + "PERSONAS" + "DZĪVNIEKI UN DABA" + "ĒDIENI UN DZĒRIENI" + "CEĻOJUMI UN VIETAS" + "PASĀKUMI UN NOTIKUMI" + "OBJEKTI" + "SIMBOLI" + "KAROGI" + "Nav pieejamu emocijzīmju" + "Jūs vēl neesat izmantojis nevienu emocijzīmi" + "emocijzīmju divvirzienu pārslēdzējs" + "mainīts emocijzīmes virziens" + "emocijzīmes varianta atlasītājs" + "%1$s un %2$s" + "ēna" + "gaišs ādas tonis" + "vidēji gaišs ādas tonis" + "vidējs ādas tonis" + "vidēji tumšs ādas tonis" + "tumšs ādas tonis" + diff --git a/emojipicker/app/src/main/androidx/res/values-mk/strings.xml b/emojipicker/app/src/main/androidx/res/values-mk/strings.xml new file mode 100644 index 00000000..b7ceab0f --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-mk/strings.xml @@ -0,0 +1,42 @@ + + + + + "НЕОДАМНА КОРИСТЕНИ" + "СМЕШКОВЦИ И ЕМОЦИИ" + "ЛУЃЕ" + "ЖИВОТНИ И ПРИРОДА" + "ХРАНА И ПИЈАЛАЦИ" + "ПАТУВАЊЕ И МЕСТА" + "АКТИВНОСТИ И НАСТАНИ" + "ОБЈЕКТИ" + "СИМБОЛИ" + "ЗНАМИЊА" + "Нема достапни емоџија" + "Сѐ уште не сте користеле емоџија" + "двонасочен менувач на емоџија" + "насоката во којашто е свртено емоџито е сменета" + "избирач на варијанти на емоџија" + "%1$s и %2$s" + "сенка" + "светол тон на кожата" + "средно светол тон на кожата" + "среден тон на кожата" + "средно темен тон на кожата" + "темен тон на кожата" + diff --git a/emojipicker/app/src/main/androidx/res/values-ml/strings.xml b/emojipicker/app/src/main/androidx/res/values-ml/strings.xml new file mode 100644 index 00000000..60b98570 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-ml/strings.xml @@ -0,0 +1,42 @@ + + + + + "അടുത്തിടെ ഉപയോഗിച്ചവ" + "സ്മൈലികളും ഇമോഷനുകളും" + "ആളുകൾ" + "മൃഗങ്ങളും പ്രകൃതിയും" + "ഭക്ഷണപാനീയങ്ങൾ" + "യാത്രയും സ്ഥലങ്ങളും" + "ആക്‌റ്റിവിറ്റികളും ഇവന്റുകളും" + "വസ്‌തുക്കൾ" + "ചിഹ്നങ്ങൾ" + "പതാകകൾ" + "ഇമോജികളൊന്നും ലഭ്യമല്ല" + "നിങ്ങൾ ഇതുവരെ ഇമോജികളൊന്നും ഉപയോഗിച്ചിട്ടില്ല" + "ഇമോജി ദ്വിദിശ സ്വിച്ചർ" + "ഇമോജിയുടെ ദിശ മാറ്റി" + "ഇമോജി വേരിയന്റ് സെലക്‌ടർ" + "%1$s, %2$s" + "ഷാഡോ" + "ലൈറ്റ് സ്‌കിൻ ടോൺ" + "മീഡിയം ലൈറ്റ് സ്‌കിൻ ടോൺ" + "മീഡിയം സ്‌കിൻ ടോൺ" + "മീഡിയം ഡാർക്ക് സ്‌കിൻ ടോൺ" + "ഡാർക്ക് സ്‌കിൻ ടോൺ" + diff --git a/emojipicker/app/src/main/androidx/res/values-mn/strings.xml b/emojipicker/app/src/main/androidx/res/values-mn/strings.xml new file mode 100644 index 00000000..6b07ea5a --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-mn/strings.xml @@ -0,0 +1,42 @@ + + + + + "САЯХАН АШИГЛАСАН" + "ИНЭЭМСЭГЛЭЛ БОЛОН СЭТГЭЛ ХӨДЛӨЛ" + "ХҮМҮҮС" + "АМЬТАД БА БАЙГАЛЬ" + "ХООЛ БОЛОН УУХ ЗҮЙЛ" + "АЯЛАЛ БОЛОН ГАЗРУУД" + "ҮЙЛ АЖИЛЛАГАА БОЛОН АРГА ХЭМЖЭЭ" + "ОБЪЕКТ" + "ТЭМДЭГ" + "ТУГ" + "Боломжтой эможи алга" + "Та ямар нэгэн эможи ашиглаагүй байна" + "эможигийн хоёр чиглэлтэй сэлгүүр" + "эможигийн харж буй чиглэлийг сэлгэсэн" + "эможигийн хувилбар сонгогч" + "%1$s болон %2$s" + "сүүдэр" + "цайвар арьсны өнгө" + "дунд зэргийн цайвар арьсны өнгө" + "дунд зэргийн арьсны өнгө" + "дунд зэргийн бараан арьсны өнгө" + "бараан арьсны өнгө" + diff --git a/emojipicker/app/src/main/androidx/res/values-mr/strings.xml b/emojipicker/app/src/main/androidx/res/values-mr/strings.xml new file mode 100644 index 00000000..316b2c48 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-mr/strings.xml @@ -0,0 +1,42 @@ + + + + + "अलीकडे वापरलेला" + "स्मायली आणि भावना" + "लोक" + "प्राणी आणि निसर्ग" + "खाद्यपदार्थ आणि पेय" + "प्रवास आणि ठिकाणे" + "ॲक्टिव्हिटी आणि इव्हेंट" + "ऑब्जेक्ट" + "चिन्हे" + "ध्वज" + "कोणतेही इमोजी उपलब्ध नाहीत" + "तुम्ही अद्याप कोणतेही इमोजी वापरलेले नाहीत" + "इमोजीचा द्विदिश स्विचर" + "दिशा दाखवणारा इमोजी स्विच केला" + "इमोजी व्हेरीयंट सिलेक्टर" + "%1$s आणि %2$s" + "शॅडो" + "उजळ रंगाची त्वचा" + "मध्यम उजळ रंगाची त्वचा" + "मध्यम रंगाची त्वचा" + "मध्यम गडद रंगाची त्वचा" + "गडद रंगाची त्वचा" + diff --git a/emojipicker/app/src/main/androidx/res/values-ms/strings.xml b/emojipicker/app/src/main/androidx/res/values-ms/strings.xml new file mode 100644 index 00000000..d5ecef2d --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-ms/strings.xml @@ -0,0 +1,42 @@ + + + + + "DIGUNAKAN BARU-BARU INI" + "SMILEY DAN EMOSI" + "ORANG" + "HAIWAN DAN ALAM SEMULA JADI" + "MAKANAN DAN MINUMAN" + "PERJALANAN DAN TEMPAT" + "AKTIVITI DAN ACARA" + "OBJEK" + "SIMBOL" + "BENDERA" + "Tiada emoji tersedia" + "Anda belum menggunakan mana-mana emoji lagi" + "penukar dwiarah emoji" + "emoji menghadap arah ditukar" + "pemilih varian emoji" + "%1$s dan %2$s" + "bebayang" + "ton kulit cerah" + "ton kulit sederhana cerah" + "ton kulit sederhana" + "ton kulit sederhana gelap" + "ton kulit gelap" + diff --git a/emojipicker/app/src/main/androidx/res/values-my/strings.xml b/emojipicker/app/src/main/androidx/res/values-my/strings.xml new file mode 100644 index 00000000..99fb7ff2 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-my/strings.xml @@ -0,0 +1,42 @@ + + + + + "မကြာသေးမီက သုံးထားသည်များ" + "စမိုင်းလီနှင့် ခံစားချက်များ" + "လူများ" + "တိရစ္ဆာန်များနှင့် သဘာဝ" + "အစားအသောက်" + "ခရီးသွားခြင်းနှင့် အရပ်ဒေသများ" + "လုပ်ဆောင်ချက်နှင့် အစီအစဉ်များ" + "အရာဝတ္ထုများ" + "သင်္ကေတများ" + "အလံများ" + "အီမိုဂျီ မရနိုင်ပါ" + "အီမိုဂျီ အသုံးမပြုသေးပါ" + "အီမိုဂျီ လမ်းကြောင်းနှစ်ခုပြောင်းစနစ်" + "အီမိုဂျီလှည့်သောဘက်ကို ပြောင်းထားသည်" + "အီမိုဂျီမူကွဲ ရွေးချယ်စနစ်" + "%1$s နှင့် %2$s" + "အရိပ်" + "ဖြူသည့် အသားအရောင်" + "အနည်းငယ်ဖြူသည့် အသားအရောင်" + "အလယ်အလတ် အသားအရောင်" + "အနည်းငယ်ညိုသည့် အသားအရောင်" + "ညိုသည့် အသားအရောင်" + diff --git a/emojipicker/app/src/main/androidx/res/values-nb/strings.xml b/emojipicker/app/src/main/androidx/res/values-nb/strings.xml new file mode 100644 index 00000000..368ef416 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-nb/strings.xml @@ -0,0 +1,42 @@ + + + + + "NYLIG BRUKT" + "SMILEFJES OG UTTRYKKSIKONER" + "PERSONER" + "DYR OG NATUR" + "MAT OG DRIKKE" + "REISE OG STEDER" + "AKTIVITETER OG ARRANGEMENTER" + "GJENSTANDER" + "SYMBOLER" + "FLAGG" + "Ingen emojier er tilgjengelige" + "Du har ikke brukt noen emojier ennå" + "toveisvelger for emoji" + "emojiretningen er slått på" + "velger for emojivariant" + "%1$s og %2$s" + "skygge" + "lys hudtone" + "middels lys hudtone" + "middels hudtone" + "middels mørk hudtone" + "mørk hudtone" + diff --git a/emojipicker/app/src/main/androidx/res/values-ne/strings.xml b/emojipicker/app/src/main/androidx/res/values-ne/strings.xml new file mode 100644 index 00000000..50a489be --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-ne/strings.xml @@ -0,0 +1,42 @@ + + + + + "हालसालै प्रयोग गरिएको" + "स्माइली र भावनाहरू" + "मान्छेहरू" + "पशु र प्रकृति" + "खाद्य तथा पेय पदार्थ" + "यात्रा र ठाउँहरू" + "क्रियाकलाप तथा कार्यक्रमहरू" + "वस्तुहरू" + "चिन्हहरू" + "झन्डाहरू" + "कुनै पनि इमोजी उपलब्ध छैन" + "तपाईंले हालसम्म कुनै पनि इमोजी प्रयोग गर्नुभएको छैन" + "दुवै दिशामा लैजान सकिने स्विचरको इमोजी" + "इमोजी फर्केको दिशा बदलियो" + "इमोजी भेरियन्ट सेलेक्टर" + "%1$s र %2$s" + "छाया" + "छालाको फिक्का रङ" + "छालाको मध्यम फिक्का रङ" + "छालाको मध्यम रङ" + "छालाको मध्यम गाढा रङ" + "छालाको गाढा रङ" + diff --git a/emojipicker/app/src/main/androidx/res/values-nl/strings.xml b/emojipicker/app/src/main/androidx/res/values-nl/strings.xml new file mode 100644 index 00000000..12d8b405 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-nl/strings.xml @@ -0,0 +1,42 @@ + + + + + "ONLANGS GEBRUIKT" + "SMILEYS EN EMOTIES" + "MENSEN" + "DIEREN EN NATUUR" + "ETEN EN DRINKEN" + "REIZEN EN PLAATSEN" + "ACTIVITEITEN EN EVENEMENTEN" + "OBJECTEN" + "SYMBOLEN" + "VLAGGEN" + "Geen emoji\'s beschikbaar" + "Je hebt nog geen emoji\'s gebruikt" + "bidirectionele emoji-schakelaar" + "richting van emoji omgewisseld" + "emoji-variantkiezer" + "%1$s en %2$s" + "schaduw" + "lichte huidskleur" + "middellichte huidskleur" + "medium huidskleur" + "middeldonkere huidskleur" + "donkere huidskleur" + diff --git a/emojipicker/app/src/main/androidx/res/values-or/strings.xml b/emojipicker/app/src/main/androidx/res/values-or/strings.xml new file mode 100644 index 00000000..30ffd391 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-or/strings.xml @@ -0,0 +1,42 @@ + + + + + "ବର୍ତ୍ତମାନ ବ୍ୟବହାର କରାଯାଇଛି" + "ସ୍ମାଇଲି ଓ ଆବେଗଗୁଡ଼ିକ" + "ଲୋକମାନେ" + "ଜୀବଜନ୍ତୁ ଓ ପ୍ରକୃତି" + "ଖାଦ୍ୟ ଓ ପାନୀୟ" + "ଟ୍ରାଭେଲ ଓ ସ୍ଥାନଗୁଡ଼ିକ" + "କାର୍ଯ୍ୟକଳାପ ଓ ଇଭେଣ୍ଟଗୁଡ଼ିକ" + "ଅବଜେକ୍ଟଗୁଡ଼ିକ" + "ଚିହ୍ନଗୁଡ଼ିକ" + "ଫ୍ଲାଗଗୁଡ଼ିକ" + "କୌଣସି ଇମୋଜି ଉପଲବ୍ଧ ନାହିଁ" + "ଆପଣ ଏପର୍ଯ୍ୟନ୍ତ କୌଣସି ଇମୋଜି ବ୍ୟବହାର କରିନାହାଁନ୍ତି" + "ଇମୋଜିର ବାଇଡାଇରେକ୍ସନାଲ ସୁଇଚର" + "ଇମୋଜି ଫେସିଂ ଦିଗନିର୍ଦ୍ଦେଶ ସୁଇଚ କରାଯାଇଛି" + "ଇମୋଜି ଭାରିଏଣ୍ଟ ଚୟନକାରୀ" + "%1$s ଏବଂ %2$s" + "ସେଡୋ" + "ଲାଇଟ ସ୍କିନ ଟୋନ" + "ମଧ୍ୟମ ଲାଇଟ ସ୍କିନ ଟୋନ" + "ମଧ୍ୟମ ସ୍କିନ ଟୋନ" + "ମଧ୍ୟମ ଡାର୍କ ସ୍କିନ ଟୋନ" + "ଡାର୍କ ସ୍କିନ ଟୋନ" + diff --git a/emojipicker/app/src/main/androidx/res/values-pa/strings.xml b/emojipicker/app/src/main/androidx/res/values-pa/strings.xml new file mode 100644 index 00000000..85db6c7f --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-pa/strings.xml @@ -0,0 +1,42 @@ + + + + + "ਹਾਲ ਹੀ ਵਿੱਚ ਵਰਤਿਆ ਗਿਆ" + "ਸਮਾਈਲੀ ਅਤੇ ਜਜ਼ਬਾਤ" + "ਲੋਕ" + "ਜਾਨਵਰ ਅਤੇ ਕੁਦਰਤ" + "ਖਾਣਾ ਅਤੇ ਪੀਣਾ" + "ਯਾਤਰਾ ਅਤੇ ਥਾਵਾਂ" + "ਸਰਗਰਮੀਆਂ ਅਤੇ ਇਵੈਂਟ" + "ਵਸਤੂਆਂ" + "ਚਿੰਨ੍ਹ" + "ਝੰਡੇ" + "ਕੋਈ ਇਮੋਜੀ ਉਪਲਬਧ ਨਹੀਂ ਹੈ" + "ਤੁਸੀਂ ਹਾਲੇ ਤੱਕ ਕਿਸੇ ਵੀ ਇਮੋਜੀ ਦੀ ਵਰਤੋਂ ਨਹੀਂ ਕੀਤੀ ਹੈ" + "ਇਮੋਜੀ ਬਾਇਡਾਇਰੈਕਸ਼ਨਲ ਸਵਿੱਚਰ" + "ਇਮੋਜੀ ਦੀ ਦਿਸ਼ਾ ਬਦਲ ਦਿੱਤੀ ਗਈ" + "ਇਮੋਜੀ ਕਿਸਮ ਚੋਣਕਾਰ" + "%1$s ਅਤੇ %2$s" + "ਸ਼ੈਡੋ" + "ਚਮੜੀ ਦਾ ਹਲਕਾ ਰੰਗ" + "ਚਮੜੀ ਦਾ ਦਰਮਿਆਨਾ ਹਲਕਾ ਰੰਗ" + "ਚਮੜੀ ਦਾ ਦਰਮਿਆਨਾ ਰੰਗ" + "ਚਮੜੀ ਦਾ ਦਰਮਿਆਨਾ ਗੂੜ੍ਹਾ ਰੰਗ" + "ਚਮੜੀ ਦਾ ਗੂੜ੍ਹਾ ਰੰਗ" + diff --git a/emojipicker/app/src/main/androidx/res/values-pl/strings.xml b/emojipicker/app/src/main/androidx/res/values-pl/strings.xml new file mode 100644 index 00000000..3ed8bd34 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-pl/strings.xml @@ -0,0 +1,42 @@ + + + + + "OSTATNIO UŻYWANE" + "EMOTIKONY" + "UCZESTNICY" + "ZWIERZĘTA I PRZYRODA" + "JEDZENIE I NAPOJE" + "PODRÓŻE I MIEJSCA" + "DZIAŁANIA I ZDARZENIA" + "PRZEDMIOTY" + "SYMBOLE" + "FLAGI" + "Brak dostępnych emotikonów" + "Żadne emotikony nie zostały jeszcze użyte" + "dwukierunkowy przełącznik emotikonów" + "zmieniono kierunek emotikonów" + "selektor wariantu emotikona" + "%1$s i %2$s" + "cień" + "jasny odcień skóry" + "średnio jasny odcień skóry" + "pośredni odcień skóry" + "średnio ciemny odcień skóry" + "ciemny odcień skóry" + diff --git a/emojipicker/app/src/main/androidx/res/values-pt-rBR/strings.xml b/emojipicker/app/src/main/androidx/res/values-pt-rBR/strings.xml new file mode 100644 index 00000000..5883fcb3 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-pt-rBR/strings.xml @@ -0,0 +1,42 @@ + + + + + "USADOS RECENTEMENTE" + "CARINHAS E EMOTICONS" + "PESSOAS" + "ANIMAIS E NATUREZA" + "COMIDAS E BEBIDAS" + "VIAGENS E LUGARES" + "ATIVIDADES E EVENTOS" + "OBJETOS" + "SÍMBOLOS" + "BANDEIRAS" + "Não há emojis disponíveis" + "Você ainda não usou emojis" + "seletor bidirecional de emojis" + "emoji virado para a direção trocada" + "seletor de variante do emoji" + "%1$s e %2$s" + "sombra" + "tom de pele claro" + "tom de pele médio-claro" + "tom de pele médio" + "tom de pele médio-escuro" + "tom de pele escuro" + diff --git a/emojipicker/app/src/main/androidx/res/values-pt-rPT/strings.xml b/emojipicker/app/src/main/androidx/res/values-pt-rPT/strings.xml new file mode 100644 index 00000000..2ef06acc --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-pt-rPT/strings.xml @@ -0,0 +1,42 @@ + + + + + "USADOS RECENTEMENTE" + "EMOTICONS E ÍCONES EXPRESSIVOS" + "PESSOAS" + "ANIMAIS E NATUREZA" + "ALIMENTOS E BEBIDAS" + "VIAGENS E LOCAIS" + "ATIVIDADES E EVENTOS" + "OBJETOS" + "SÍMBOLOS" + "BANDEIRAS" + "Nenhum emoji disponível" + "Ainda não utilizou emojis" + "comutador bidirecional de emojis" + "direção voltada para o emoji alterada" + "seletor de variantes de emojis" + "%1$s e %2$s" + "sombra" + "tom de pele claro" + "tom de pele claro médio" + "tom de pele médio" + "tom de pele escuro médio" + "tom de pele escuro" + diff --git a/emojipicker/app/src/main/androidx/res/values-pt/strings.xml b/emojipicker/app/src/main/androidx/res/values-pt/strings.xml new file mode 100644 index 00000000..5883fcb3 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-pt/strings.xml @@ -0,0 +1,42 @@ + + + + + "USADOS RECENTEMENTE" + "CARINHAS E EMOTICONS" + "PESSOAS" + "ANIMAIS E NATUREZA" + "COMIDAS E BEBIDAS" + "VIAGENS E LUGARES" + "ATIVIDADES E EVENTOS" + "OBJETOS" + "SÍMBOLOS" + "BANDEIRAS" + "Não há emojis disponíveis" + "Você ainda não usou emojis" + "seletor bidirecional de emojis" + "emoji virado para a direção trocada" + "seletor de variante do emoji" + "%1$s e %2$s" + "sombra" + "tom de pele claro" + "tom de pele médio-claro" + "tom de pele médio" + "tom de pele médio-escuro" + "tom de pele escuro" + diff --git a/emojipicker/app/src/main/androidx/res/values-ro/strings.xml b/emojipicker/app/src/main/androidx/res/values-ro/strings.xml new file mode 100644 index 00000000..45fad5a7 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-ro/strings.xml @@ -0,0 +1,42 @@ + + + + + "FOLOSITE RECENT" + "EMOTICOANE ȘI EMOȚII" + "PERSOANE" + "ANIMALE ȘI NATURĂ" + "MÂNCARE ȘI BĂUTURĂ" + "CĂLĂTORII ȘI LOCAȚII" + "ACTIVITĂȚI ȘI EVENIMENTE" + "OBIECTE" + "SIMBOLURI" + "STEAGURI" + "Nu sunt disponibile emoji-uri" + "Încă nu ai folosit emoji" + "comutator bidirecțional de emojiuri" + "direcția de orientare a emojiului comutată" + "selector de variante de emoji" + "%1$s și %2$s" + "umbră" + "nuanță deschisă a pielii" + "nuanță deschisă medie a pielii" + "nuanță medie a pielii" + "nuanță închisă medie a pielii" + "nuanță închisă a pielii" + diff --git a/emojipicker/app/src/main/androidx/res/values-ru/strings.xml b/emojipicker/app/src/main/androidx/res/values-ru/strings.xml new file mode 100644 index 00000000..ecf42faa --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-ru/strings.xml @@ -0,0 +1,42 @@ + + + + + "НЕДАВНИЕ" + "СМАЙЛИКИ И ЭМОЦИИ" + "ЛЮДИ" + "ПРИРОДА И ЖИВОТНЫЕ" + "ЕДА И НАПИТКИ" + "ПУТЕШЕСТВИЯ" + "ДЕЙСТВИЯ И СОБЫТИЯ" + "ОБЪЕКТЫ" + "СИМВОЛЫ" + "ФЛАГИ" + "Нет доступных эмодзи" + "Вы ещё не использовали эмодзи" + "Двухсторонний переключатель эмодзи" + "изменен поворот лица эмодзи" + "выбор вариантов эмодзи" + "%1$s и %2$s" + "теневой" + "светлый оттенок кожи" + "умеренно светлый оттенок кожи" + "нейтральный оттенок кожи" + "умеренно темный оттенок кожи" + "темный оттенок кожи" + diff --git a/emojipicker/app/src/main/androidx/res/values-si/strings.xml b/emojipicker/app/src/main/androidx/res/values-si/strings.xml new file mode 100644 index 00000000..2ecdc77b --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-si/strings.xml @@ -0,0 +1,42 @@ + + + + + "මෑතදී භාවිත කළ" + "සිනාසීම් සහ චිත්තවේග" + "පුද්ගලයින්" + "සතුන් හා ස්වභාවධර්මය" + "ආහාර පාන" + "සංචාර හා ස්ථාන" + "ක්‍රියාකාරකම් සහ සිදුවීම්" + "වස්තු" + "සංකේත" + "ධජ" + "ඉමොජි කිසිවක් නොලැබේ" + "ඔබ තවමත් කිසිදු ඉමෝජියක් භාවිතා කර නැත" + "ද්විත්ව දිශා ඉමොජි මාරුකරණය" + "ඉමොජි මුහුණ දෙන දිශාව මාරු විය" + "ඉමොජි ප්‍රභේද තෝරකය" + "%1$s සහ %2$s" + "සෙවනැල්ල" + "ලා සමේ වර්ණය" + "මධ්‍යම ලා සම් වර්ණය" + "මධ්‍යම සම් වර්ණය" + "මධ්‍යම අඳුරු සම් වර්ණය" + "අඳුරු සම් වර්ණය" + diff --git a/emojipicker/app/src/main/androidx/res/values-sk/strings.xml b/emojipicker/app/src/main/androidx/res/values-sk/strings.xml new file mode 100644 index 00000000..11ed0eea --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-sk/strings.xml @@ -0,0 +1,42 @@ + + + + + "NEDÁVNO POUŽITÉ" + "SMAJLÍKY A EMÓCIE" + "ĽUDIA" + "ZVIERATÁ A PRÍRODA" + "JEDLO A NÁPOJE" + "CESTOVANIE A MIESTA" + "AKTIVITY A UDALOSTI" + "PREDMETY" + "SYMBOLY" + "VLAJKY" + "Nie sú k dispozícii žiadne emodži" + "Zatiaľ ste nepoužili žiadne emodži" + "obojsmerný prepínač emodži" + "smer otočenia emodži bol prepnutý" + "selektor variantu emodži" + "%1$s a %2$s" + "tieň" + "svetlý odtieň pokožky" + "stredne svetlý odtieň pokožky" + "stredný odtieň pokožky" + "stredne tmavý odtieň pokožky" + "tmavý odtieň pokožky" + diff --git a/emojipicker/app/src/main/androidx/res/values-sl/strings.xml b/emojipicker/app/src/main/androidx/res/values-sl/strings.xml new file mode 100644 index 00000000..f345226d --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-sl/strings.xml @@ -0,0 +1,42 @@ + + + + + "NEDAVNO UPORABLJENI" + "ČUSTVENI SIMBOLI IN ČUSTVA" + "OSEBE" + "ŽIVALI IN NARAVA" + "HRANA IN PIJAČA" + "POTOVANJE IN MESTA" + "DEJAVNOSTI IN DOGODKI" + "PREDMETI" + "SIMBOLI" + "ZASTAVE" + "Ni emodžijev" + "Uporabili niste še nobenega emodžija." + "dvosmerni preklopnik emodžijev" + "preklopljena usmerjenost emodžija" + "Izbirnik različice emodžija" + "%1$s in %2$s" + "senčenje" + "svetel odtenek kože" + "srednje svetel odtenek kože" + "srednji odtenek kože" + "srednje temen odtenek kože" + "temen odtenek kože" + diff --git a/emojipicker/app/src/main/androidx/res/values-sq/strings.xml b/emojipicker/app/src/main/androidx/res/values-sq/strings.xml new file mode 100644 index 00000000..f30f751e --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-sq/strings.xml @@ -0,0 +1,42 @@ + + + + + "PËRDORUR SË FUNDI" + "BUZËQESHJE DHE EMOCIONE" + "NJERËZ" + "KAFSHË DHE NATYRË" + "USHQIME DHE PIJE" + "UDHËTIME DHE VENDE" + "AKTIVITETE DHE NGJARJE" + "OBJEKTE" + "SIMBOLE" + "FLAMUJ" + "Nuk ofrohen emoji" + "Nuk ke përdorur ende asnjë emoji" + "ndërruesi me dy drejtime për emoji-t" + "drejtimi i emoji-t u ndryshua" + "përzgjedhësi i variantit të emoji-t" + "%1$s dhe %2$s" + "hije" + "ton lëkure i zbehtë" + "ton lëkure mesatarisht i zbehtë" + "ton lëkure mesatar" + "ton lëkure mesatarisht i errët" + "ton lëkure i errët" + diff --git a/emojipicker/app/src/main/androidx/res/values-sr/strings.xml b/emojipicker/app/src/main/androidx/res/values-sr/strings.xml new file mode 100644 index 00000000..67d3619f --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-sr/strings.xml @@ -0,0 +1,42 @@ + + + + + "НЕДАВНО КОРИШЋЕНО" + "СМАЈЛИЈИ И ЕМОЦИЈЕ" + "ЉУДИ" + "ЖИВОТИЊЕ И ПРИРОДА" + "ХРАНА И ПИЋЕ" + "ПУТОВАЊА И МЕСТА" + "АКТИВНОСТИ И ДОГАЂАЈИ" + "ОБЈЕКТИ" + "СИМБОЛИ" + "ЗАСТАВЕ" + "Емоџији нису доступни" + "Још нисте користили емоџије" + "двосмерни пребацивач емоџија" + "смер емоџија је промењен" + "бирач варијанти емоџија" + "%1$s и %2$s" + "сенка" + "кожа светле пути" + "кожа средњесветле пути" + "кожа средње пути" + "кожа средњетамне пути" + "кожа тамне пути" + diff --git a/emojipicker/app/src/main/androidx/res/values-sv/strings.xml b/emojipicker/app/src/main/androidx/res/values-sv/strings.xml new file mode 100644 index 00000000..dede0672 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-sv/strings.xml @@ -0,0 +1,42 @@ + + + + + "NYLIGEN ANVÄNDA" + "KÄNSLOIKONER OCH KÄNSLOR" + "PERSONER" + "DJUR OCH NATUR" + "MAT OCH DRYCK" + "RESOR OCH PLATSER" + "AKTIVITETER OCH HÄNDELSER" + "FÖREMÅL" + "SYMBOLER" + "FLAGGOR" + "Inga emojier tillgängliga" + "Du har ännu inte använt emojis" + "dubbelriktad emojiväxlare" + "emojins riktning har bytts" + "Väljare av emoji-varianter" + "%1$s och %2$s" + "skugga" + "ljus hudfärg" + "medelljus hudfärg" + "medelmörk hudfärg" + "mellanmörk hudfärg" + "mörk hudfärg" + diff --git a/emojipicker/app/src/main/androidx/res/values-sw/strings.xml b/emojipicker/app/src/main/androidx/res/values-sw/strings.xml new file mode 100644 index 00000000..3f7e24b0 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-sw/strings.xml @@ -0,0 +1,42 @@ + + + + + "ZILIZOTUMIKA HIVI MAJUZI" + "VICHESHI NA HISIA" + "WATU" + "WANYAMA NA MAZINGIRA" + "VYAKULA NA VINYWAJI" + "SAFARI NA MAENEO" + "SHUGHULI NA MATUKIO" + "VITU" + "ALAMA" + "BENDERA" + "Hakuna emoji zinazopatikana" + "Bado hujatumia emoji zozote" + "kibadilishaji cha emoji cha pande mbili" + "imebadilisha upande ambao emoji inaangalia" + "kiteuzi cha kibadala cha emoji" + "%1$s na %2$s" + "kivuli" + "ngozi ya rangi nyeupe" + "ngozi ya rangi nyeupe kiasi" + "ngozi ya rangi ya maji ya kunde" + "ngozi ya rangi nyeusi kiasi" + "ngozi ya rangi nyeusi" + diff --git a/emojipicker/app/src/main/androidx/res/values-ta/strings.xml b/emojipicker/app/src/main/androidx/res/values-ta/strings.xml new file mode 100644 index 00000000..5954c77f --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-ta/strings.xml @@ -0,0 +1,42 @@ + + + + + "சமீபத்தில் பயன்படுத்தியவை" + "ஸ்மைலிகளும் எமோடிகான்களும்" + "நபர்" + "விலங்குகளும் இயற்கையும்" + "உணவும் பானமும்" + "பயணமும் இடங்களும்" + "செயல்பாடுகளும் நிகழ்வுகளும்" + "பொருட்கள்" + "சின்னங்கள்" + "கொடிகள்" + "ஈமோஜிகள் எதுவுமில்லை" + "இதுவரை ஈமோஜி எதையும் நீங்கள் பயன்படுத்தவில்லை" + "ஈமோஜி இருபக்க மாற்றி" + "ஈமோஜி காட்டப்படும் திசை மாற்றப்பட்டது" + "ஈமோஜி வகைத் தேர்வி" + "%1$s மற்றும் %2$s" + "நிழல்" + "வெள்ளை நிறம்" + "கொஞ்சம் வெள்ளை நிறம்" + "மாநிறம்" + "கொஞ்சம் கருநிறம்" + "கருநிறம்" + diff --git a/emojipicker/app/src/main/androidx/res/values-te/strings.xml b/emojipicker/app/src/main/androidx/res/values-te/strings.xml new file mode 100644 index 00000000..db21e73a --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-te/strings.xml @@ -0,0 +1,42 @@ + + + + + "ఇటీవల ఉపయోగించినవి" + "స్మైలీలు, ఎమోషన్‌లు" + "వ్యక్తులు" + "జంతువులు, ప్రకృతి" + "ఆహారం, పానీయం" + "ప్రయాణం, స్థలాలు" + "యాక్టివిటీలు, ఈవెంట్‌లు" + "ఆబ్జెక్ట్‌లు" + "గుర్తులు" + "ఫ్లాగ్‌లు" + "ఎమోజీలు ఏవీ అందుబాటులో లేవు" + "మీరు ఇంకా ఎమోజీలు ఏవీ ఉపయోగించలేదు" + "ఎమోజీ ద్విదిశాత్మక స్విచ్చర్" + "ఎమోజీ దిశ మార్చబడింది" + "ఎమోజి రకాన్ని ఎంపిక చేసే సాధనం" + "%1$s, %2$s" + "షాడో" + "లైట్ స్కిన్ రంగు" + "చామనఛాయ లైట్ స్కిన్ రంగు" + "చామనఛాయ స్కిన్ రంగు" + "చామనఛాయ డార్క్ స్కిన్ రంగు" + "డార్క్ స్కిన్ రంగు" + diff --git a/emojipicker/app/src/main/androidx/res/values-th/strings.xml b/emojipicker/app/src/main/androidx/res/values-th/strings.xml new file mode 100644 index 00000000..74d28694 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-th/strings.xml @@ -0,0 +1,42 @@ + + + + + "ใช้ล่าสุด" + "หน้ายิ้มและอารมณ์" + "ผู้คน" + "สัตว์และธรรมชาติ" + "อาหารและเครื่องดื่ม" + "การเดินทางและสถานที่" + "กิจกรรมและเหตุการณ์" + "วัตถุ" + "สัญลักษณ์" + "ธง" + "ไม่มีอีโมจิ" + "คุณยังไม่ได้ใช้อีโมจิเลย" + "ตัวสลับอีโมจิแบบ 2 ทาง" + "เปลี่ยนทิศทางการหันหน้าของอีโมจิแล้ว" + "ตัวเลือกตัวแปรอีโมจิ" + "%1$s และ %2$s" + "เงา" + "โทนผิวสีอ่อน" + "โทนผิวสีอ่อนปานกลาง" + "โทนผิวสีปานกลาง" + "โทนผิวสีเข้มปานกลาง" + "โทนผิวสีเข้ม" + diff --git a/emojipicker/app/src/main/androidx/res/values-tl/strings.xml b/emojipicker/app/src/main/androidx/res/values-tl/strings.xml new file mode 100644 index 00000000..2a14fba7 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-tl/strings.xml @@ -0,0 +1,42 @@ + + + + + "KAMAKAILANG GINAMIT" + "MGA SMILEY AT MGA EMOSYON" + "MGA TAO" + "MGA HAYOP AT KALIKASAN" + "PAGKAIN AT INUMIN" + "PAGLALAKBAY AT MGA LUGAR" + "MGA AKTIBIDAD AT EVENT" + "MGA BAGAY" + "MGA SIMBOLO" + "MGA BANDILA" + "Walang available na emoji" + "Hindi ka pa gumamit ng anumang emoji" + "bidirectional na switcher ng emoji" + "pinalitan ang direksyon kung saan nakaharap ang emoji" + "selector ng variant ng emoji" + "%1$s at %2$s" + "shadow" + "maputing kulay ng balat" + "katamtamang maputing kulay ng balat" + "katamtamang kulay ng balat" + "katamtamang maitim na kulay ng balat" + "maitim na kulay ng balat" + diff --git a/emojipicker/app/src/main/androidx/res/values-tr/strings.xml b/emojipicker/app/src/main/androidx/res/values-tr/strings.xml new file mode 100644 index 00000000..f0d13cdd --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-tr/strings.xml @@ -0,0 +1,42 @@ + + + + + "SON KULLANILANLAR" + "SMILEY\'LER VE İFADELER" + "İNSANLAR" + "HAYVANLAR VE DOĞA" + "YİYECEK VE İÇECEK" + "SEYAHAT VE YERLER" + "AKTİVİTELER VE ETKİNLİKLER" + "NESNELER" + "SEMBOLLER" + "BAYRAKLAR" + "Kullanılabilir emoji yok" + "Henüz emoji kullanmadınız" + "çift yönlü emoji değiştirici" + "emoji yönü değiştirildi" + "emoji varyant seçici" + "%1$s ve %2$s" + "gölge" + "açık ten rengi" + "orta-açık ten rengi" + "orta ten rengi" + "orta-koyu ten rengi" + "koyu ten rengi" + diff --git a/emojipicker/app/src/main/androidx/res/values-uk/strings.xml b/emojipicker/app/src/main/androidx/res/values-uk/strings.xml new file mode 100644 index 00000000..46e9e3dc --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-uk/strings.xml @@ -0,0 +1,42 @@ + + + + + "НЕЩОДАВНО ВИКОРИСТАНІ" + "СМАЙЛИКИ Й ЕМОЦІЇ" + "ЛЮДИ" + "ТВАРИНИ Й ПРИРОДА" + "ЇЖА Й НАПОЇ" + "ПОДОРОЖІ Й МІСЦЯ" + "АКТИВНІСТЬ І ПОДІЇ" + "ОБ’ЄКТИ" + "СИМВОЛИ" + "ПРАПОРИ" + "Немає смайлів" + "Ви ще не використовували смайли" + "двосторонній перемикач смайлів" + "змінено напрям обличчя смайлів" + "засіб вибору варіанта смайла" + "%1$s і %2$s" + "тінь" + "світлий відтінок шкіри" + "помірно світлий відтінок шкіри" + "помірний відтінок шкіри" + "помірно темний відтінок шкіри" + "темний відтінок шкіри" + diff --git a/emojipicker/app/src/main/androidx/res/values-ur/strings.xml b/emojipicker/app/src/main/androidx/res/values-ur/strings.xml new file mode 100644 index 00000000..68fa937d --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-ur/strings.xml @@ -0,0 +1,42 @@ + + + + + "حال ہی میں استعمال کردہ" + "اسمائلیز اور جذبات" + "لوگ" + "جانور اور قدرت" + "خوراک اور مشروب" + "سفر اور جگہیں" + "سرگرمیاں اور ایونٹس" + "آبجیکٹس" + "علامات" + "جھنڈے" + "کوئی بھی ایموجی دستیاب نہیں ہے" + "آپ نے ابھی تک کوئی بھی ایموجی استعمال نہیں کی ہے" + "دو طرفہ سوئچر ایموجی" + "ایموجی کا سمتِ رخ سوئچ کر دیا گیا" + "ایموجی کی قسم کا منتخب کنندہ" + "‏‎%1$s اور ‎%2$s" + "پرچھائیں" + "جلد کا ہلکا ٹون" + "جلد کا متوسط ہلکا ٹون" + "جلد کا متوسط ٹون" + "جلد کا متوسط گہرا ٹون" + "جلد کا گہرا ٹون" + diff --git a/emojipicker/app/src/main/androidx/res/values-uz/strings.xml b/emojipicker/app/src/main/androidx/res/values-uz/strings.xml new file mode 100644 index 00000000..6610ffd5 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-uz/strings.xml @@ -0,0 +1,42 @@ + + + + + "YAQINDA ISHLATILGAN" + "KULGICH VA EMOJILAR" + "ODAMLAR" + "HAYVONLAR VA TABIAT" + "TAOM VA ICHIMLIKLAR" + "SAYOHAT VA JOYLAR" + "HODISA VA TADBIRLAR" + "BUYUMLAR" + "BELGILAR" + "BAYROQCHALAR" + "Hech qanday emoji mavjud emas" + "Hanuz birorta emoji ishlatmagansiz" + "ikki tomonlama emoji almashtirgich" + "emoji yuzlanish tomoni almashdi" + "emoji variant tanlagich" + "%1$s va %2$s" + "soya" + "och rang tusli" + "oʻrtacha och rang tusli" + "neytral rang tusli" + "oʻrtacha toʻq rang tusli" + "toʻq rang tusli" + diff --git a/emojipicker/app/src/main/androidx/res/values-vi/strings.xml b/emojipicker/app/src/main/androidx/res/values-vi/strings.xml new file mode 100644 index 00000000..9e1eac8e --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-vi/strings.xml @@ -0,0 +1,42 @@ + + + + + "MỚI DÙNG GẦN ĐÂY" + "MẶT CƯỜI VÀ BIỂU TƯỢNG CẢM XÚC" + "MỌI NGƯỜI" + "ĐỘNG VẬT VÀ THIÊN NHIÊN" + "THỰC PHẨM VÀ ĐỒ UỐNG" + "DU LỊCH VÀ ĐỊA ĐIỂM" + "HOẠT ĐỘNG VÀ SỰ KIỆN" + "ĐỒ VẬT" + "BIỂU TƯỢNG" + "CỜ" + "Không có biểu tượng cảm xúc nào" + "Bạn chưa sử dụng biểu tượng cảm xúc nào" + "trình chuyển đổi hai chiều biểu tượng cảm xúc" + "đã chuyển hướng mặt của biểu tượng cảm xúc" + "bộ chọn biến thể biểu tượng cảm xúc" + "%1$s và %2$s" + "bóng" + "tông màu da sáng" + "tông màu da sáng trung bình" + "tông màu da trung bình" + "tông màu da tối trung bình" + "tông màu da tối" + diff --git a/emojipicker/app/src/main/androidx/res/values-zh-rCN/strings.xml b/emojipicker/app/src/main/androidx/res/values-zh-rCN/strings.xml new file mode 100644 index 00000000..453eb005 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-zh-rCN/strings.xml @@ -0,0 +1,42 @@ + + + + + "最近使用过" + "表情符号" + "人物" + "动物和自然" + "食品和饮料" + "旅游和地点" + "活动和庆典" + "物体" + "符号" + "旗帜" + "没有可用的表情符号" + "您尚未使用过任何表情符号" + "表情符号双向切换器" + "已切换表情符号朝向" + "表情符号变体选择器" + "%1$s和%2$s" + "阴影" + "浅肤色" + "中等偏浅肤色" + "中等肤色" + "中等偏深肤色" + "深肤色" + diff --git a/emojipicker/app/src/main/androidx/res/values-zh-rHK/strings.xml b/emojipicker/app/src/main/androidx/res/values-zh-rHK/strings.xml new file mode 100644 index 00000000..21b7318f --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-zh-rHK/strings.xml @@ -0,0 +1,42 @@ + + + + + "最近使用過" + "表情符號" + "人物" + "動物和大自然" + "飲食" + "旅遊和地點" + "活動和事件" + "物件" + "符號" + "旗幟" + "沒有可用的 Emoji" + "你尚未使用任何 Emoji" + "Emoji 雙向切換工具" + "轉咗 Emoji 方向" + "Emoji 變化版本選取器" + "%1$s和%2$s" + "陰影" + "淺膚色" + "偏淺膚色" + "中等膚色" + "偏深膚色" + "深膚色" + diff --git a/emojipicker/app/src/main/androidx/res/values-zh-rTW/strings.xml b/emojipicker/app/src/main/androidx/res/values-zh-rTW/strings.xml new file mode 100644 index 00000000..546e9de2 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-zh-rTW/strings.xml @@ -0,0 +1,42 @@ + + + + + "最近使用過" + "表情符號" + "人物" + "動物與大自然" + "飲食" + "旅行與地點" + "活動與事件" + "物品" + "符號" + "旗幟" + "沒有可用的表情符號" + "你尚未使用任何表情符號" + "表情符號雙向切換器" + "已切換表情符號方向" + "表情符號變化版本選取器" + "%1$s和%2$s" + "陰影" + "淺膚色" + "偏淺膚色" + "中等膚色" + "偏深膚色" + "深膚色" + diff --git a/emojipicker/app/src/main/androidx/res/values-zu/strings.xml b/emojipicker/app/src/main/androidx/res/values-zu/strings.xml new file mode 100644 index 00000000..3918f298 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values-zu/strings.xml @@ -0,0 +1,42 @@ + + + + + "EZISANDA KUSETSHENZISWA" + "AMASMAYILI NEMIZWA" + "ABANTU" + "IZILWANE NENDALO" + "UKUDLA NESIPHUZO" + "UKUVAKASHA NEZINDAWO" + "IMISEBENZI NEMICIMBI" + "IZINTO" + "AMASIMBULI" + "AMAFULEGI" + "Awekho ama-emoji atholakalayo" + "Awukasebenzisi noma yimaphi ama-emoji okwamanje" + "isishintshi se-emoji ye-bidirectional" + "isikhombisi-ndlela esibheke ku-emoji sishintshiwe" + "isikhethi esihlukile se-emoji" + "Okuthi %1$s nokuthi %2$s" + "isithunzi" + "ibala lesikhumba elikhanyayo" + "ibala lesikhumba elikhanya ngokumaphakathi" + "ibala lesikhumba eliphakathi nendawo" + "ibala lesikhumba elinsundu ngokumaphakathi" + "ibala lesikhumba elimnyama" + diff --git a/emojipicker/app/src/main/androidx/res/values/arrays.xml b/emojipicker/app/src/main/androidx/res/values/arrays.xml new file mode 100644 index 00000000..59961b62 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values/arrays.xml @@ -0,0 +1,68 @@ + + + + + + @raw/emoji_category_emotions + @raw/emoji_category_people + @raw/emoji_category_animals_nature + @raw/emoji_category_food_drink + @raw/emoji_category_travel_places + @raw/emoji_category_activity + @raw/emoji_category_objects + @raw/emoji_category_symbols + @raw/emoji_category_flags + + + + + @raw/emoji_category_emotions + + @raw/emoji_category_animals_nature + @raw/emoji_category_food_drink + @raw/emoji_category_travel_places + @raw/emoji_category_activity + @raw/emoji_category_objects + @raw/emoji_category_symbols + @raw/emoji_category_flags + + + + @drawable/gm_filled_emoji_emotions_vd_theme_24 + @drawable/gm_filled_emoji_people_vd_theme_24 + @drawable/gm_filled_emoji_nature_vd_theme_24 + @drawable/gm_filled_emoji_food_beverage_vd_theme_24 + @drawable/gm_filled_emoji_transportation_vd_theme_24 + @drawable/gm_filled_emoji_events_vd_theme_24 + @drawable/gm_filled_emoji_objects_vd_theme_24 + @drawable/gm_filled_emoji_symbols_vd_theme_24 + @drawable/gm_filled_flag_vd_theme_24 + + + + @string/emoji_category_emotions + @string/emoji_category_people + @string/emoji_category_animals_nature + @string/emoji_category_food_drink + @string/emoji_category_travel_places + @string/emoji_category_activity + @string/emoji_category_objects + @string/emoji_category_symbols + @string/emoji_category_flags + + \ No newline at end of file diff --git a/emojipicker/app/src/main/androidx/res/values/attrs.xml b/emojipicker/app/src/main/androidx/res/values/attrs.xml new file mode 100644 index 00000000..c84e3d86 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values/attrs.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/app/src/main/androidx/res/values/colors.xml b/emojipicker/app/src/main/androidx/res/values/colors.xml new file mode 100644 index 00000000..b21b0357 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values/colors.xml @@ -0,0 +1,26 @@ + + + + + #edbd82 + #ba8f63 + #91674d + #875334 + #4a2f27 + + #ffffff + diff --git a/emojipicker/app/src/main/androidx/res/values/dimens.xml b/emojipicker/app/src/main/androidx/res/values/dimens.xml new file mode 100644 index 00000000..6be5c11d --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values/dimens.xml @@ -0,0 +1,38 @@ + + + + + 39dp + 46dp + 20dp + 20dp + 28dp + 2dp + 42dp + 5dp + 5dp + 5dp + 10dp + 10dp + 10dp + 8dp + 30dp + 6dp + 24dp + 4dp + 2dp + \ No newline at end of file diff --git a/emojipicker/app/src/main/androidx/res/values/strings.xml b/emojipicker/app/src/main/androidx/res/values/strings.xml new file mode 100644 index 00000000..2e8238bc --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values/strings.xml @@ -0,0 +1,75 @@ + + + + + RECENTLY USED + + SMILEYS AND EMOTIONS + + PEOPLE + + ANIMALS AND NATURE + + FOOD AND DRINK + + TRAVEL AND PLACES + + ACTIVITIES AND EVENTS + + OBJECTS + + SYMBOLS + + FLAGS + + + No emojis available + + You haven\'t used any emojis yet + + + emoji bidirectional switcher + + + emoji facing direction switched + + + emoji variant selector + + + %1$s and %2$s + + + shadow + + + light skin tone + + + medium light skin tone + + + medium skin tone + + + medium dark skin tone + + + dark skin tone + diff --git a/emojipicker/app/src/main/androidx/res/values/styles.xml b/emojipicker/app/src/main/androidx/res/values/styles.xml new file mode 100644 index 00000000..5a67a534 --- /dev/null +++ b/emojipicker/app/src/main/androidx/res/values/styles.xml @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + diff --git a/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/BundledEmojiListLoader.kt b/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/BundledEmojiListLoader.kt new file mode 100644 index 00000000..0a242d45 --- /dev/null +++ b/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/BundledEmojiListLoader.kt @@ -0,0 +1,121 @@ + + +package com.rishabh.emojipicker + +import android.content.Context +import android.content.res.TypedArray +import androidx.annotation.DrawableRes +import androidx.core.content.res.use +import com.rishabh.emojipicker.utils.UnicodeRenderableManager +import com.rishabh.emojipicker.utils.FileCache + +import kotlinx.coroutines.async +import kotlinx.coroutines.awaitAll +import kotlinx.coroutines.coroutineScope + +/** + * A data loader that loads the following objects either from file based caches or from resources. + * + * categorizedEmojiData: a list that holds bundled emoji separated by category, filtered by + * renderability check. This is the data source for EmojiPickerView. + * + * emojiVariantsLookup: a map of emoji variants in bundled emoji, keyed by the base emoji. This + * allows faster variants lookup. + * + * primaryEmojiLookup: a map of base emoji to its variants in bundled emoji. This allows faster + * variants lookup. + */ +internal object BundledEmojiListLoader { + private var categorizedEmojiData: List? = null + private var emojiVariantsLookup: Map>? = null + + internal suspend fun load(context: Context) { + val categoryNames = context.resources.getStringArray(R.array.category_names) + val categoryHeaderIconIds = + context.resources.obtainTypedArray(R.array.emoji_categories_icons).use { typedArray -> + IntArray(typedArray.length()) { typedArray.getResourceId(it, 0) } + } + val resources = + if (UnicodeRenderableManager.isEmoji12Supported()) + R.array.emoji_by_category_raw_resources_gender_inclusive + else R.array.emoji_by_category_raw_resources + val emojiFileCache = FileCache.getInstance(context) + + categorizedEmojiData = + context.resources.obtainTypedArray(resources).use { ta -> + loadEmoji(ta, categoryHeaderIconIds, categoryNames, emojiFileCache, context) + } + emojiVariantsLookup = + categorizedEmojiData!! + .flatMap { it.emojiDataList } + .filter { it.variants.isNotEmpty() } + .flatMap { it.variants.map { variant -> EmojiViewItem(variant, it.variants) } } + .associate { it.emoji to it.variants } + .also { emojiVariantsLookup = it } + } + + internal fun getCategorizedEmojiData() = + categorizedEmojiData + ?: throw IllegalStateException("BundledEmojiListLoader.load is not called or complete") + + internal fun getEmojiVariantsLookup() = + emojiVariantsLookup + ?: throw IllegalStateException("BundledEmojiListLoader.load is not called or complete") + + private suspend fun loadEmoji( + ta: TypedArray, + @DrawableRes categoryHeaderIconIds: IntArray, + categoryNames: Array, + emojiFileCache: FileCache, + context: Context + ): List = coroutineScope { + (0 until ta.length()) + .map {intvalue-> + async { + emojiFileCache + .getOrPut(getCacheFileName(intvalue)) { + loadSingleCategory(context, ta.getResourceId(intvalue, 0)) + } + .let { + EmojiDataCategory(categoryHeaderIconIds[intvalue], categoryNames[intvalue], it) + } + } + } + .awaitAll() + } + + private fun loadSingleCategory( + context: Context, + resId: Int, + ): List = + context.resources + .openRawResource(resId) + .bufferedReader() + .useLines { it.toList() } + .map { filterRenderableEmojis(it.split(",")) } + .filter { it.isNotEmpty() } + .map { EmojiViewItem(it.first(), it.drop(1)) } + + private fun getCacheFileName(categoryIndex: Int) = + StringBuilder() + .append("emoji.v1.") + .append(if (EmojiPickerView.emojiCompatLoaded) 1 else 0) + .append(".") + .append(categoryIndex) + .append(".") + .append(if (UnicodeRenderableManager.isEmoji12Supported()) 1 else 0) + .toString() + + /** + * To eliminate 'Tofu' (the fallback glyph when an emoji is not renderable), check the + * renderability of emojis and keep only when they are renderable on the current device. + */ + private fun filterRenderableEmojis(emojiList: List) = + emojiList.filter { UnicodeRenderableManager.isEmojiRenderable(it) }.toList() + + internal data class EmojiDataCategory( + @DrawableRes val headerIconId: Int, + val categoryName: String, + val emojiDataList: List + ) +} diff --git a/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/DefaultRecentEmojiProvider.kt b/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/DefaultRecentEmojiProvider.kt new file mode 100644 index 00000000..f525b5dd --- /dev/null +++ b/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/DefaultRecentEmojiProvider.kt @@ -0,0 +1,40 @@ +package com.rishabh.emojipicker + +import android.content.Context +import android.content.Context.MODE_PRIVATE + +/** + * Provides recently shared emoji. This is the default recent emoji list provider. Clients could + * specify the provider by their own. + */ +internal class DefaultRecentEmojiProvider(context: Context) : RecentEmojiProvider { + + companion object { + private const val PREF_KEY_RECENT_EMOJI = "pref_key_recent_emoji" + private const val RECENT_EMOJI_LIST_FILE_NAME = "androidx.emoji2.emojipicker.preferences" + private const val SPLIT_CHAR = "," + } + + private val sharedPreferences = + context.getSharedPreferences(RECENT_EMOJI_LIST_FILE_NAME, MODE_PRIVATE) + private val recentEmojiList: MutableList = + sharedPreferences.getString(PREF_KEY_RECENT_EMOJI, null)?.split(SPLIT_CHAR)?.toMutableList() + ?: mutableListOf() + + override suspend fun getRecentEmojiList(): List { + return recentEmojiList + } + + override fun recordSelection(emoji: String) { + recentEmojiList.remove(emoji) + recentEmojiList.add(0, emoji) + saveToPreferences() + } + + private fun saveToPreferences() { + sharedPreferences + .edit() + .putString(PREF_KEY_RECENT_EMOJI, recentEmojiList.joinToString(SPLIT_CHAR)) + .commit() + } +} diff --git a/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/EmojiPickerBodyAdapter.kt b/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/EmojiPickerBodyAdapter.kt new file mode 100644 index 00000000..1ddf443d --- /dev/null +++ b/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/EmojiPickerBodyAdapter.kt @@ -0,0 +1,126 @@ + + +package com.rishabh.emojipicker + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.view.ViewGroup.LayoutParams +import android.widget.TextView +import androidx.annotation.LayoutRes +import androidx.annotation.UiThread +import androidx.core.view.ViewCompat + +import androidx.recyclerview.widget.RecyclerView.Adapter +import androidx.recyclerview.widget.RecyclerView.ViewHolder +import com.rishabh.emojipicker.Extensions.toItemType + +/** RecyclerView adapter for emoji body. */ +internal class EmojiPickerBodyAdapter( + private val context: Context, + private val emojiGridColumns: Int, + private val emojiGridRows: Float?, + private val stickyVariantProvider: StickyVariantProvider, + private val emojiPickerItemsProvider: () -> EmojiPickerItems, + private val onEmojiPickedListener: EmojiPickerBodyAdapter.(EmojiViewItem) -> Unit, +) : Adapter() { + private val layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var emojiCellWidth: Int? = null + private var emojiCellHeight: Int? = null + + @UiThread + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + emojiCellWidth = emojiCellWidth ?: (getParentWidth(parent) / emojiGridColumns) + emojiCellHeight = + emojiCellHeight + ?: emojiGridRows?.let { getEmojiCellTotalHeight(parent) / it }?.toInt() + ?: emojiCellWidth + + return when (viewType.toItemType()) { + ItemType.CATEGORY_TITLE -> createSimpleHolder(R.layout.category_text_view, parent) + ItemType.PLACEHOLDER_TEXT -> + createSimpleHolder(R.layout.empty_category_text_view, parent) { + minimumHeight = emojiCellHeight!! + } + ItemType.EMOJI -> { + EmojiViewHolder( + context, + emojiCellWidth!!, + emojiCellHeight!!, + stickyVariantProvider, + onEmojiPickedListener = { emojiViewItem -> + onEmojiPickedListener(emojiViewItem) + }, + onEmojiPickedFromPopupListener = { emoji -> + val baseEmoji = BundledEmojiListLoader.getEmojiVariantsLookup()[emoji]!![0] + emojiPickerItemsProvider().forEachIndexed { index, itemViewData -> + if ( + itemViewData is EmojiViewData && + BundledEmojiListLoader.getEmojiVariantsLookup()[ + itemViewData.emoji] + ?.get(0) == baseEmoji && + itemViewData.updateToSticky + ) { + itemViewData.emoji = emoji + notifyItemChanged(index) + } + } + } + ) + } + } + } + + override fun onBindViewHolder(viewHolder: ViewHolder, position: Int) { + val item = emojiPickerItemsProvider().getBodyItem(position) + when (getItemViewType(position).toItemType()) { + ItemType.CATEGORY_TITLE -> + ViewCompat.requireViewById(viewHolder.itemView, R.id.category_name).text = + (item as CategoryTitle).title + ItemType.PLACEHOLDER_TEXT -> + ViewCompat.requireViewById( + viewHolder.itemView, + R.id.emoji_picker_empty_category_view + ) + .text = (item as PlaceholderText).text + ItemType.EMOJI -> { + (viewHolder as EmojiViewHolder).bindEmoji((item as EmojiViewData).emoji) + } + } + } + + override fun getItemId(position: Int): Long = + emojiPickerItemsProvider().getBodyItem(position).hashCode().toLong() + + override fun getItemCount(): Int { + return emojiPickerItemsProvider().size + } + + override fun getItemViewType(position: Int): Int { + return emojiPickerItemsProvider().getBodyItem(position).viewType + } + + private fun getParentWidth(parent: ViewGroup): Int { + return parent.measuredWidth - parent.paddingLeft - parent.paddingRight + } + + private fun getEmojiCellTotalHeight(parent: ViewGroup) = + parent.measuredHeight - + context.resources.getDimensionPixelSize(R.dimen.emoji_picker_category_name_height) * 2 - + context.resources.getDimensionPixelSize(R.dimen.emoji_picker_category_name_padding_top) + + private fun createSimpleHolder( + @LayoutRes layoutId: Int, + parent: ViewGroup, + init: (View.() -> Unit)? = null, + ) = + object : + ViewHolder( + layoutInflater.inflate(layoutId, parent, /* attachToRoot= */ false).also { + it.layoutParams = + LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT) + init?.invoke(it) + } + ) {} +} diff --git a/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/EmojiPickerConstants.kt b/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/EmojiPickerConstants.kt new file mode 100644 index 00000000..e7e8d2a4 --- /dev/null +++ b/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/EmojiPickerConstants.kt @@ -0,0 +1,21 @@ + + +package com.rishabh.emojipicker + +/** A utility class to hold various constants used by the Emoji Picker library. */ +internal object EmojiPickerConstants { + + // The default number of body columns. + const val DEFAULT_BODY_COLUMNS = 9 + + // The default number of rows of recent items held. + const val DEFAULT_MAX_RECENT_ITEM_ROWS = 3 + + // The max pool size of the Emoji ItemType in RecyclerViewPool. + const val EMOJI_VIEW_POOL_SIZE = 100 + + const val ADD_VIEW_EXCEPTION_MESSAGE = "Adding views to the EmojiPickerView is unsupported" + + const val REMOVE_VIEW_EXCEPTION_MESSAGE = + "Removing views from the EmojiPickerView is unsupported" +} diff --git a/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/EmojiPickerHeaderAdapter.kt b/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/EmojiPickerHeaderAdapter.kt new file mode 100644 index 00000000..a6c3dd01 --- /dev/null +++ b/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/EmojiPickerHeaderAdapter.kt @@ -0,0 +1,74 @@ + + +package com.rishabh.emojipicker + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.view.accessibility.AccessibilityEvent +import android.widget.ImageView +import androidx.core.view.ViewCompat +import androidx.recyclerview.widget.RecyclerView.Adapter +import androidx.recyclerview.widget.RecyclerView.ViewHolder + +/** RecyclerView adapter for emoji header. */ +internal class EmojiPickerHeaderAdapter( + context: Context, + private val emojiPickerItems: EmojiPickerItems, + private val onHeaderIconClicked: (Int) -> Unit, +) : Adapter() { + private val layoutInflater: LayoutInflater = LayoutInflater.from(context) + + var selectedGroupIndex: Int = 0 + set(value) { + if (value == field) return + notifyItemChanged(field) + notifyItemChanged(value) + field = value + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + return object : + ViewHolder( + layoutInflater.inflate( + R.layout.header_icon_holder, + parent, + /* attachToRoot = */ false + ) + ) {} + } + + override fun onBindViewHolder(viewHolder: ViewHolder, i: Int) { + val isItemSelected = i == selectedGroupIndex + val headerIcon = + ViewCompat.requireViewById( + viewHolder.itemView, + R.id.emoji_picker_header_icon + ) + .apply { + setImageDrawable(context.getDrawable(emojiPickerItems.getHeaderIconId(i))) + isSelected = isItemSelected + contentDescription = emojiPickerItems.getHeaderIconDescription(i) + } + viewHolder.itemView.setOnClickListener { + onHeaderIconClicked(i) + selectedGroupIndex = i + } + if (isItemSelected) { + headerIcon.post { + headerIcon.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_HOVER_ENTER) + } + } + + ViewCompat.requireViewById(viewHolder.itemView, R.id.emoji_picker_header_underline) + .apply { + visibility = if (isItemSelected) View.VISIBLE else View.GONE + isSelected = isItemSelected + } + } + + override fun getItemCount(): Int { + return emojiPickerItems.numGroups + } +} diff --git a/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/EmojiPickerItems.kt b/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/EmojiPickerItems.kt new file mode 100644 index 00000000..fe9093d8 --- /dev/null +++ b/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/EmojiPickerItems.kt @@ -0,0 +1,97 @@ + + +package com.rishabh.emojipicker + +import androidx.annotation.DrawableRes +import androidx.annotation.IntRange + +/** + * A group of items in RecyclerView for emoji picker body. [titleItem] comes first. [contentItems] + * comes after [titleItem]. [emptyPlaceholderItem] will be served after [titleItem] only if + * [contentItems] is empty. [maxContentItemCount], if provided, will truncate [contentItems] to + * certain size. + * + * [categoryIconId] is the corresponding category icon in emoji picker header. + */ +internal class ItemGroup( + @DrawableRes internal val categoryIconId: Int, + internal val titleItem: CategoryTitle, + private val contentItems: List, + private val maxContentItemCount: Int? = null, + private val emptyPlaceholderItem: PlaceholderText? = null +) { + + val size: Int + get() = + 1 /* title */ + + when { + contentItems.isEmpty() -> if (emptyPlaceholderItem != null) 1 else 0 + maxContentItemCount != null && contentItems.size > maxContentItemCount -> + maxContentItemCount + else -> contentItems.size + } + + operator fun get(index: Int): ItemViewData { + if (index == 0) return titleItem + val contentIndex = index - 1 + if (contentIndex < contentItems.size) return contentItems[contentIndex] + if (contentIndex == 0 && emptyPlaceholderItem != null) return emptyPlaceholderItem + throw IndexOutOfBoundsException() + } + + fun getAll(): List = IntRange(0, size - 1).map { get(it) } +} + +/** A view of concatenated list of [ItemGroup]. */ +internal class EmojiPickerItems( + private val groups: List, +) : Iterable { + val size: Int + get() = groups.sumOf { it.size } + + init { + check(groups.isNotEmpty()) { "Initialized with empty categorized sources" } + } + + fun getBodyItem(@IntRange(from = 0) absolutePosition: Int): ItemViewData { + var localPosition = absolutePosition + for (group in groups) { + if (localPosition < group.size) return group[localPosition] + else localPosition -= group.size + } + throw IndexOutOfBoundsException() + } + + val numGroups: Int + get() = groups.size + + @DrawableRes + fun getHeaderIconId(@IntRange(from = 0) index: Int): Int = groups[index].categoryIconId + + fun getHeaderIconDescription(@IntRange(from = 0) index: Int): String = + groups[index].titleItem.title + + fun groupIndexByItemPosition(@IntRange(from = 0) absolutePosition: Int): Int { + var localPosition = absolutePosition + var index = 0 + for (group in groups) { + if (localPosition < group.size) return index + else { + localPosition -= group.size + index++ + } + } + throw IndexOutOfBoundsException() + } + + fun firstItemPositionByGroupIndex(@IntRange(from = 0) groupIndex: Int): Int = + groups.take(groupIndex).sumOf { it.size } + + fun groupRange(group: ItemGroup): kotlin.ranges.IntRange { + check(groups.contains(group)) + val index = groups.indexOf(group) + return firstItemPositionByGroupIndex(index).let { it until it + group.size } + } + + override fun iterator(): Iterator = groups.flatMap { it.getAll() }.iterator() +} diff --git a/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/EmojiPickerPopupBidirectionalDesign.kt b/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/EmojiPickerPopupBidirectionalDesign.kt new file mode 100644 index 00000000..1829233f --- /dev/null +++ b/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/EmojiPickerPopupBidirectionalDesign.kt @@ -0,0 +1,110 @@ +/* + * Copyright 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.rishabh.emojipicker + +import android.content.Context +import android.view.Gravity +import android.view.View +import android.view.ViewGroup +import android.widget.FrameLayout +import android.widget.LinearLayout +import androidx.appcompat.widget.AppCompatImageView + +/** Emoji picker popup view with bidirectional UI design to switch emoji to face left or right. */ +internal class EmojiPickerPopupBidirectionalDesign( + override val context: Context, + override val targetEmojiView: View, + override val variants: List, + override val popupView: LinearLayout, + override val emojiViewOnClickListener: View.OnClickListener +) : EmojiPickerPopupDesign() { + private var emojiFacingLeft = true + + init { + updateTemplate() + } + + override fun addLayoutHeader() { + val row = + LinearLayout(context).apply { + orientation = LinearLayout.HORIZONTAL + gravity = Gravity.CENTER + layoutParams = + LinearLayout.LayoutParams( + FrameLayout.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.WRAP_CONTENT + ) + } + FrameLayout.inflate(context, R.layout.emoji_picker_popup_bidirectional, row) + .findViewById(R.id.emoji_picker_popup_bidirectional_icon) + .apply { + layoutParams = + LinearLayout.LayoutParams(targetEmojiView.width, targetEmojiView.height) + } + popupView.addView(row) + val imageView = + row.findViewById(R.id.emoji_picker_popup_bidirectional_icon) + imageView.setOnClickListener { + emojiFacingLeft = !emojiFacingLeft + updateTemplate() + popupView.removeViews(/* start= */ 1, getActualNumberOfRows()) + addRowsToPopupView() + imageView.announceForAccessibility( + context.getString(R.string.emoji_bidirectional_switcher_clicked_desc) + ) + } + } + + override fun getNumberOfRows(): Int { + // Adding one row for the bidirectional switcher. + return variants.size / 2 / BIDIRECTIONAL_COLUMN_COUNT + 1 + } + + override fun getNumberOfColumns(): Int { + return BIDIRECTIONAL_COLUMN_COUNT + } + + private fun getActualNumberOfRows(): Int { + // Removing one extra row of the bidirectional switcher. + return getNumberOfRows() - 1 + } + + private fun updateTemplate() { + template = + if (emojiFacingLeft) + arrayOf((variants.indices.filter { it % 12 < 6 }.map { it + 1 }).toIntArray()) + else arrayOf((variants.indices.filter { it % 12 >= 6 }.map { it + 1 }).toIntArray()) + + val row = getActualNumberOfRows() + val column = getNumberOfColumns() + val overrideTemplate = Array(row) { IntArray(column) } + var index = 0 + for (i in 0 until row) { + for (j in 0 until column) { + if (index < template[0].size) { + overrideTemplate[i][j] = template[0][index] + index++ + } + } + } + template = overrideTemplate + } + + companion object { + private const val BIDIRECTIONAL_COLUMN_COUNT = 6 + } +} diff --git a/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/EmojiPickerPopupDesign.kt b/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/EmojiPickerPopupDesign.kt new file mode 100644 index 00000000..e55f53df --- /dev/null +++ b/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/EmojiPickerPopupDesign.kt @@ -0,0 +1,89 @@ +/* + * Copyright 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.rishabh.emojipicker + +import android.content.Context +import android.view.View +import android.view.ViewGroup +import android.view.accessibility.AccessibilityEvent +import android.widget.FrameLayout +import android.widget.LinearLayout + +/** Emoji picker popup view UI design. Each UI design needs to inherit this abstract class. */ +internal abstract class EmojiPickerPopupDesign { + abstract val context: Context + abstract val targetEmojiView: View + abstract val variants: List + abstract val popupView: LinearLayout + abstract val emojiViewOnClickListener: View.OnClickListener + lateinit var template: Array + + open fun addLayoutHeader() { + // no-ops + } + + open fun addRowsToPopupView() { + for (row in template) { + val rowLayout = + LinearLayout(context).apply { + orientation = LinearLayout.HORIZONTAL + layoutParams = + LinearLayout.LayoutParams( + FrameLayout.LayoutParams.WRAP_CONTENT, + FrameLayout.LayoutParams.WRAP_CONTENT + ) + } + for (item in row) { + val cell = + if (item == 0) { + EmojiView(context) + } else { + EmojiView(context).apply { + willDrawVariantIndicator = false + emoji = variants[item - 1] + setOnClickListener(emojiViewOnClickListener) + if (item == 1) { + // Hover on the first emoji in the popup + popupView.post { + sendAccessibilityEvent( + AccessibilityEvent.TYPE_VIEW_HOVER_ENTER + ) + } + } + } + } + .apply { + layoutParams = + ViewGroup.LayoutParams( + targetEmojiView.width, + targetEmojiView.height + ) + } + rowLayout.addView(cell) + } + popupView.addView(rowLayout) + } + } + + open fun addLayoutFooter() { + // no-ops + } + + abstract fun getNumberOfRows(): Int + + abstract fun getNumberOfColumns(): Int +} diff --git a/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/EmojiPickerPopupFlatDesign.kt b/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/EmojiPickerPopupFlatDesign.kt new file mode 100644 index 00000000..4b511256 --- /dev/null +++ b/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/EmojiPickerPopupFlatDesign.kt @@ -0,0 +1,60 @@ +/* + * Copyright 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.rishabh.emojipicker + +import android.content.Context +import android.view.View +import android.widget.LinearLayout + +/** Emoji picker popup view with flat design to list emojis. */ +internal class EmojiPickerPopupFlatDesign( + override val context: Context, + override val targetEmojiView: View, + override val variants: List, + override val popupView: LinearLayout, + override val emojiViewOnClickListener: View.OnClickListener +) : EmojiPickerPopupDesign() { + init { + template = arrayOf(variants.indices.map { it + 1 }.toIntArray()) + var row = getNumberOfRows() + var column = getNumberOfColumns() + val overrideTemplate = Array(row) { IntArray(column) } + var index = 0 + for (i in 0 until row) { + for (j in 0 until column) { + if (index < template[0].size) { + overrideTemplate[i][j] = template[0][index] + index++ + } + } + } + template = overrideTemplate + } + + override fun getNumberOfRows(): Int { + val column = getNumberOfColumns() + return variants.size / column + if (variants.size % column == 0) 0 else 1 + } + + override fun getNumberOfColumns(): Int { + return minOf(FLAT_COLUMN_MAX_COUNT, template[0].size) + } + + companion object { + private const val FLAT_COLUMN_MAX_COUNT = 6 + } +} diff --git a/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/EmojiPickerPopupMultiSkintoneDesign.kt b/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/EmojiPickerPopupMultiSkintoneDesign.kt new file mode 100644 index 00000000..2dab8179 --- /dev/null +++ b/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/EmojiPickerPopupMultiSkintoneDesign.kt @@ -0,0 +1,401 @@ +/* + * Copyright 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.rishabh.emojipicker + +import android.content.Context +import android.content.res.ColorStateList +import android.graphics.Color +import android.graphics.drawable.Drawable +import android.util.Log +import android.view.ContextThemeWrapper +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.FrameLayout +import android.widget.ImageView +import android.widget.LinearLayout +import androidx.annotation.StringRes +import androidx.core.content.res.ResourcesCompat +import com.google.firebase.crashlytics.buildtools.reloc.com.google.common.collect.ImmutableMap +import com.google.firebase.crashlytics.buildtools.reloc.com.google.common.primitives.ImmutableIntArray + + +/** Emoji picker popup with multi-skintone selection panel. */ +internal class EmojiPickerPopupMultiSkintoneDesign( + override val context: Context, + override val targetEmojiView: View, + override val variants: List, + override val popupView: LinearLayout, + override val emojiViewOnClickListener: View.OnClickListener, + targetEmoji: String +) : EmojiPickerPopupDesign() { + + private val inflater = LayoutInflater.from(context) + private val resultRow = + LinearLayout(context).apply { + orientation = LinearLayout.HORIZONTAL + layoutParams = + LinearLayout.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT + ) + } + + private var selectedLeftSkintone = -1 + private var selectedRightSkintone = -1 + + init { + val triggerVariantIndex: Int = variants.indexOf(targetEmoji) + if (triggerVariantIndex > 0) { + selectedLeftSkintone = (triggerVariantIndex - 1) / getNumberOfColumns() + selectedRightSkintone = + triggerVariantIndex - selectedLeftSkintone * getNumberOfColumns() - 1 + } + } + + override fun addRowsToPopupView() { + for (row in 0 until getActualNumberOfRows()) { + val rowLayout = + LinearLayout(context).apply { + orientation = LinearLayout.HORIZONTAL + layoutParams = + LinearLayout.LayoutParams( + FrameLayout.LayoutParams.WRAP_CONTENT, + FrameLayout.LayoutParams.WRAP_CONTENT + ) + } + for (column in 0 until getNumberOfColumns()) { + inflater.inflate(R.layout.emoji_picker_popup_image_view, rowLayout) + val imageView = rowLayout.getChildAt(column) as ImageView + imageView.apply { + layoutParams = + LinearLayout.LayoutParams(targetEmojiView.width, targetEmojiView.height) + isClickable = true + contentDescription = getImageContentDescription(context, row, column) + if ( + (hasLeftSkintone() && row == 0 && selectedLeftSkintone == column) || + (hasRightSkintone() && row == 1 && selectedRightSkintone == column) + ) { + isSelected = true + isClickable = false + } + setImageDrawable(getDrawableRes(context, row, column)) + setOnClickListener { + var unSelectedView: View? = null + if (row == 0) { + if (hasLeftSkintone()) { + unSelectedView = rowLayout.getChildAt(selectedLeftSkintone) + } + selectedLeftSkintone = column + } else { + if (hasRightSkintone()) { + unSelectedView = rowLayout.getChildAt(selectedRightSkintone) + } + selectedRightSkintone = column + } + if (unSelectedView != null) { + unSelectedView.isSelected = false + unSelectedView.isClickable = true + } + isClickable = false + isSelected = true + processResultView() + } + } + } + popupView.addView(rowLayout) + } + } + + private fun processResultView() { + val childCount = resultRow.childCount + if (childCount < 1 || childCount > 2) { + Log.e(TAG, "processResultEmojiForRectangleLayout(): unexpected emoji result row size") + return + } + // Remove the result emoji if it's already available. It will be available after the row is + // inflated the first time. + if (childCount == 2) { + resultRow.removeViewAt(1) + } + if (hasLeftSkintone() && hasRightSkintone()) { + inflater.inflate(R.layout.emoji_picker_popup_emoji_view, resultRow) + val layout = resultRow.getChildAt(1) as LinearLayout + layout.findViewById(R.id.emoji_picker_popup_emoji_view).apply { + willDrawVariantIndicator = false + isClickable = true + emoji = + variants[ + selectedLeftSkintone * getNumberOfColumns() + selectedRightSkintone + 1] + setOnClickListener(emojiViewOnClickListener) + layoutParams = + LinearLayout.LayoutParams(targetEmojiView.width, targetEmojiView.height) + } + layout.findViewById(R.id.emoji_picker_popup_emoji_view_wrapper).apply { + layoutParams = + LinearLayout.LayoutParams( + targetEmojiView.width * getNumberOfColumns() / 2, + targetEmojiView.height + ) + } + } else if (hasLeftSkintone()) { + drawImageView( + /* row= */ 0, + /*column=*/ selectedLeftSkintone, + /* applyGrayTint= */ false + ) + } else if (hasRightSkintone()) { + drawImageView( + /* row= */ 1, + /*column=*/ selectedRightSkintone, + /* applyGrayTint= */ false + ) + } else { + drawImageView(/* row= */ 0, /* column= */ 0, /* applyGrayTint= */ true) + } + } + + private fun drawImageView(row: Int, column: Int, applyGrayTint: Boolean) { + inflater + .inflate(R.layout.emoji_picker_popup_image_view, resultRow) + .findViewById(R.id.emoji_picker_popup_image_view) + .apply { + layoutParams = LinearLayout.LayoutParams(0, targetEmojiView.height, 1f) + setImageDrawable(getDrawableRes(context, row, column)) + if (applyGrayTint) { + imageTintList = ColorStateList.valueOf(Color.GRAY) + } + + var contentDescriptionRow = selectedLeftSkintone + var contentDescriptionColumn = selectedRightSkintone + if (hasLeftSkintone()) { + contentDescriptionRow = 0 + contentDescriptionColumn = selectedLeftSkintone + } else if (hasRightSkintone()) { + contentDescriptionRow = 1 + contentDescriptionColumn = selectedRightSkintone + } + contentDescription = + getImageContentDescription( + context, + contentDescriptionRow, + contentDescriptionColumn + ) + } + } + + override fun addLayoutFooter() { + inflater.inflate(R.layout.emoji_picker_popup_emoji_view, resultRow) + val layout = resultRow.getChildAt(0) as LinearLayout + layout.findViewById(R.id.emoji_picker_popup_emoji_view).apply { + willDrawVariantIndicator = false + emoji = variants[0] + layoutParams = LinearLayout.LayoutParams(targetEmojiView.width, targetEmojiView.height) + isClickable = true + setOnClickListener(emojiViewOnClickListener) + } + layout.findViewById(R.id.emoji_picker_popup_emoji_view_wrapper).apply { + layoutParams = + LinearLayout.LayoutParams( + targetEmojiView.width * getNumberOfColumns() / 2, + targetEmojiView.height + ) + } + processResultView() + popupView.addView(resultRow) + } + + override fun getNumberOfRows(): Int { + // Add one extra row for the neutral skin tone combination + return LAYOUT_ROWS + 1 + } + + override fun getNumberOfColumns(): Int { + return LAYOUT_COLUMNS + } + + private fun getActualNumberOfRows(): Int { + return LAYOUT_ROWS + } + + private fun hasLeftSkintone(): Boolean { + return selectedLeftSkintone != -1 + } + + private fun hasRightSkintone(): Boolean { + return selectedRightSkintone != -1 + } + + private fun getDrawableRes(context: Context, row: Int, column: Int): Drawable? { + val resArray: ImmutableIntArray? = SKIN_TONES_EMOJI_TO_RESOURCES[variants[0]] + if (resArray != null) { + val contextThemeWrapper = ContextThemeWrapper(context, VARIANT_STYLES[column]) + return ResourcesCompat.getDrawable( + context.resources, + resArray[row], + contextThemeWrapper.getTheme() + ) + } + return null + } + + private fun getImageContentDescription(context: Context, row: Int, column: Int): String { + return context.getString( + R.string.emoji_variant_content_desc_template, + context.getString(getSkintoneStringRes(/* isLeft= */ true, row, column)), + context.getString(getSkintoneStringRes(/* isLeft= */ false, row, column)) + ) + } + + @StringRes + private fun getSkintoneStringRes(isLeft: Boolean, row: Int, column: Int): Int { + // When there is no column, the selected position -1 will be passed in as column. + if (column == -1) { + return R.string.emoji_skin_tone_shadow_content_desc + } + return if (isLeft) { + if (row == 0) SKIN_TONE_CONTENT_DESC_RES_IDS[column] + else R.string.emoji_skin_tone_shadow_content_desc + } else { + if (row == 0) R.string.emoji_skin_tone_shadow_content_desc + else SKIN_TONE_CONTENT_DESC_RES_IDS[column] + } + } + + companion object { + private const val TAG = "MultiSkintoneDesign" + private const val LAYOUT_ROWS = 2 + private const val LAYOUT_COLUMNS = 5 + + private val SKIN_TONE_CONTENT_DESC_RES_IDS = + ImmutableIntArray.of( + R.string.emoji_skin_tone_light_content_desc, + R.string.emoji_skin_tone_medium_light_content_desc, + R.string.emoji_skin_tone_medium_content_desc, + R.string.emoji_skin_tone_medium_dark_content_desc, + R.string.emoji_skin_tone_dark_content_desc + ) + + private val VARIANT_STYLES = + ImmutableIntArray.of( + R.style.EmojiSkintoneSelectorLight, + R.style.EmojiSkintoneSelectorMediumLight, + R.style.EmojiSkintoneSelectorMedium, + R.style.EmojiSkintoneSelectorMediumDark, + R.style.EmojiSkintoneSelectorDark + ) + + /** + * Map from emoji that use the square layout strategy with skin tone swatches or rectangle + * strategy to their resources. + */ + private val SKIN_TONES_EMOJI_TO_RESOURCES = + ImmutableMap.Builder() + .put( + "🤝", + ImmutableIntArray.of( + R.drawable.handshake_skintone_shadow, + R.drawable.handshake_shadow_skintone + ) + ) + .put( + "👭", + ImmutableIntArray.of( + R.drawable.holding_women_skintone_shadow, + R.drawable.holding_women_shadow_skintone + ) + ) + .put( + "👫", + ImmutableIntArray.of( + R.drawable.holding_woman_man_skintone_shadow, + R.drawable.holding_woman_man_shadow_skintone + ) + ) + .put( + "👬", + ImmutableIntArray.of( + R.drawable.holding_men_skintone_shadow, + R.drawable.holding_men_shadow_skintone + ) + ) + .put( + "🧑‍🤝‍🧑", + ImmutableIntArray.of( + R.drawable.holding_people_skintone_shadow, + R.drawable.holding_people_shadow_skintone + ) + ) + .put( + "💏", + ImmutableIntArray.of( + R.drawable.kiss_people_skintone_shadow, + R.drawable.kiss_people_shadow_skintone + ) + ) + .put( + "👩‍❤️‍💋‍👨", + ImmutableIntArray.of( + R.drawable.kiss_woman_man_skintone_shadow, + R.drawable.kiss_woman_man_shadow_skintone + ) + ) + .put( + "👨‍❤️‍💋‍👨", + ImmutableIntArray.of( + R.drawable.kiss_men_skintone_shadow, + R.drawable.kiss_men_shadow_skintone + ) + ) + .put( + "👩‍❤️‍💋‍👩", + ImmutableIntArray.of( + R.drawable.kiss_women_skintone_shadow, + R.drawable.kiss_women_shadow_skintone + ) + ) + .put( + "💑", + ImmutableIntArray.of( + R.drawable.couple_heart_people_skintone_shadow, + R.drawable.couple_heart_people_shadow_skintone + ) + ) + .put( + "👩‍❤️‍👨", + ImmutableIntArray.of( + R.drawable.couple_heart_woman_man_skintone_shadow, + R.drawable.couple_heart_woman_man_shadow_skintone + ) + ) + .put( + "👨‍❤️‍👨", + ImmutableIntArray.of( + R.drawable.couple_heart_men_skintone_shadow, + R.drawable.couple_heart_men_shadow_skintone + ) + ) + .put( + "👩‍❤️‍👩", + ImmutableIntArray.of( + R.drawable.couple_heart_women_skintone_shadow, + R.drawable.couple_heart_women_shadow_skintone + ) + ) + .build() + } +} diff --git a/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/EmojiPickerPopupSquareDesign.kt b/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/EmojiPickerPopupSquareDesign.kt new file mode 100644 index 00000000..0472995f --- /dev/null +++ b/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/EmojiPickerPopupSquareDesign.kt @@ -0,0 +1,57 @@ +/* + * Copyright 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.rishabh.emojipicker + +import android.content.Context +import android.view.View +import android.widget.LinearLayout + +/** Emoji picker popup view with square design. */ +internal class EmojiPickerPopupSquareDesign( + override val context: Context, + override val targetEmojiView: View, + override val variants: List, + override val popupView: LinearLayout, + override val emojiViewOnClickListener: View.OnClickListener +) : EmojiPickerPopupDesign() { + init { + template = SQUARE_LAYOUT_TEMPLATE + } + + override fun getNumberOfRows(): Int { + return SQUARE_LAYOUT_TEMPLATE.size + } + + override fun getNumberOfColumns(): Int { + return SQUARE_LAYOUT_TEMPLATE[0].size + } + + companion object { + /** + * Square variant layout template without skin tone. 0 : a place holder Positive number is + * the index + 1 in the variant array + */ + private val SQUARE_LAYOUT_TEMPLATE = + arrayOf( + intArrayOf(0, 2, 3, 4, 5, 6), + intArrayOf(0, 7, 8, 9, 10, 11), + intArrayOf(0, 12, 13, 14, 15, 16), + intArrayOf(0, 17, 18, 19, 20, 21), + intArrayOf(1, 22, 23, 24, 25, 26) + ) + } +} diff --git a/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/EmojiPickerPopupView.kt b/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/EmojiPickerPopupView.kt new file mode 100644 index 00000000..a6ca815f --- /dev/null +++ b/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/EmojiPickerPopupView.kt @@ -0,0 +1,134 @@ +/* + * Copyright 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.rishabh.emojipicker + +import android.content.Context +import android.util.AttributeSet +import android.view.View +import android.widget.FrameLayout +import android.widget.LinearLayout + +/** Popup view for emoji picker to show emoji variants. */ +internal class EmojiPickerPopupView +@JvmOverloads +constructor( + context: Context, + attrs: AttributeSet?, + defStyleAttr: Int = 0, + private val targetEmojiView: View, + private val targetEmojiItem: EmojiViewItem, + private val emojiViewOnClickListener: OnClickListener +) : FrameLayout(context, attrs, defStyleAttr) { + + private val variants = targetEmojiItem.variants + private val targetEmoji = targetEmojiItem.emoji + private val popupView: LinearLayout + private val popupDesign: EmojiPickerPopupDesign + + init { + popupView = + inflate(context, R.layout.variant_popup, /* root= */ null) + .findViewById(R.id.variant_popup) + val layout = getLayout() + popupDesign = + when (layout) { + Layout.FLAT -> + EmojiPickerPopupFlatDesign( + context, + targetEmojiView, + variants, + popupView, + emojiViewOnClickListener + ) + Layout.SQUARE -> + EmojiPickerPopupSquareDesign( + context, + targetEmojiView, + variants, + popupView, + emojiViewOnClickListener + ) + Layout.SQUARE_WITH_SKIN_TONE_CIRCLE -> + EmojiPickerPopupMultiSkintoneDesign( + context, + targetEmojiView, + variants, + popupView, + emojiViewOnClickListener, + targetEmoji + ) + Layout.BIDIRECTIONAL -> + EmojiPickerPopupBidirectionalDesign( + context, + targetEmojiView, + variants, + popupView, + emojiViewOnClickListener + ) + } + popupDesign.addLayoutHeader() + popupDesign.addRowsToPopupView() + popupDesign.addLayoutFooter() + addView(popupView) + } + + fun getPopupViewWidth(): Int { + return popupDesign.getNumberOfColumns() * targetEmojiView.width + + popupView.paddingStart + + popupView.paddingEnd + } + + fun getPopupViewHeight(): Int { + return popupDesign.getNumberOfRows() * targetEmojiView.height + + popupView.paddingTop + + popupView.paddingBottom + } + + private fun getLayout(): Layout { + if (variants.size == SQUARE_LAYOUT_VARIANT_COUNT) + if (SQUARE_LAYOUT_EMOJI_NO_SKIN_TONE.contains(variants[0])) return Layout.SQUARE + else return Layout.SQUARE_WITH_SKIN_TONE_CIRCLE + else if (variants.size == BIDIRECTIONAL_VARIANTS_COUNT) return Layout.BIDIRECTIONAL + else return Layout.FLAT + } + + companion object { + private enum class Layout { + FLAT, + SQUARE, + SQUARE_WITH_SKIN_TONE_CIRCLE, + BIDIRECTIONAL + } + + /** + * The number of variants expected when using a square layout strategy. Square layouts are + * comprised of a 5x5 grid + the base variant. + */ + private const val SQUARE_LAYOUT_VARIANT_COUNT = 26 + + /** + * The number of variants expected when using a bidirectional layout strategy. Bidirectional + * layouts are comprised of bidirectional icon and a 3x6 grid with left direction emojis as + * default. After clicking the bidirectional icon, it switches to a bidirectional icon and a + * 3x6 grid with right direction emojis. + */ + private const val BIDIRECTIONAL_VARIANTS_COUNT = 36 + + // Set of emojis that use the square layout without skin tone swatches. + private val SQUARE_LAYOUT_EMOJI_NO_SKIN_TONE = setOf("👪") + } +} diff --git a/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/EmojiPickerPopupViewController.kt b/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/EmojiPickerPopupViewController.kt new file mode 100644 index 00000000..36c4d76c --- /dev/null +++ b/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/EmojiPickerPopupViewController.kt @@ -0,0 +1,70 @@ +package com.rishabh.emojipicker + + + +import android.content.Context +import android.view.Gravity +import android.view.View +import android.view.ViewGroup.LayoutParams +import android.view.WindowManager +import android.widget.PopupWindow +import android.widget.Toast +import kotlin.math.roundToInt + +/** + * Default controller class for emoji picker popup view. + * + *

Shows the popup view above the target Emoji. View under control is a {@code + * EmojiPickerPopupView}. + */ +internal class EmojiPickerPopupViewController( + private val context: Context, + private val emojiPickerPopupView: EmojiPickerPopupView, + private val clickedEmojiView: View +) { + private val popupWindow: PopupWindow = + PopupWindow( + emojiPickerPopupView, + LayoutParams.WRAP_CONTENT, + LayoutParams.WRAP_CONTENT, + /* focusable= */ false + ) + + fun show() { + popupWindow.apply { + val location = IntArray(2) + clickedEmojiView.getLocationInWindow(location) + // Make the popup view center align with the target emoji view. + val x = + location[0] + clickedEmojiView.width / 2f - + emojiPickerPopupView.getPopupViewWidth() / 2f + val y = location[1] - emojiPickerPopupView.getPopupViewHeight() + // Set background drawable so that the popup window is dismissed properly when clicking + // outside / scrolling for API < 23. + setBackgroundDrawable(context.getDrawable(R.drawable.popup_view_rounded_background)) + isOutsideTouchable = true + isTouchable = true + animationStyle = R.style.VariantPopupAnimation + elevation = + clickedEmojiView.context.resources + .getDimensionPixelSize(R.dimen.emoji_picker_popup_view_elevation) + .toFloat() + try { + showAtLocation(clickedEmojiView, Gravity.NO_GRAVITY, x.roundToInt(), y) + } catch (e: WindowManager.BadTokenException) { + Toast.makeText( + context, + "Don't use EmojiPickerView inside a Popup", + Toast.LENGTH_LONG + ) + .show() + } + } + } + + fun dismiss() { + if (popupWindow.isShowing) { + popupWindow.dismiss() + } + } +} diff --git a/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/EmojiPickerView.kt b/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/EmojiPickerView.kt new file mode 100644 index 00000000..14be7868 --- /dev/null +++ b/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/EmojiPickerView.kt @@ -0,0 +1,445 @@ + + +package com.rishabh.emojipicker + +import android.content.Context +import android.content.res.TypedArray +import android.util.AttributeSet +import android.view.View +import android.view.ViewGroup +import android.widget.FrameLayout +import androidx.core.util.Consumer +import androidx.core.view.ViewCompat +import com.rishabh.emojipicker.EmojiPickerConstants.DEFAULT_MAX_RECENT_ITEM_ROWS +import androidx.emoji2.text.EmojiCompat +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import kotlin.coroutines.EmptyCoroutineContext +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext + +/** + * The emoji picker view that provides up-to-date emojis in a vertical scrollable view with a + * clickable horizontal header. + */ +class EmojiPickerView +@JvmOverloads +constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : + FrameLayout(context, attrs, defStyleAttr) { + + internal companion object { + internal var emojiCompatLoaded: Boolean = false + } + + private var _emojiGridRows: Float? = null + /** + * The number of rows of the emoji picker. + * + * Optional field. If not set, the value will be calculated based on parent view height and + * [emojiGridColumns]. Float value indicates that the picker could display the last row + * partially, so the users get the idea that they can scroll down for more contents. + * + * @attr ref androidx.emoji2.emojipicker.R.styleable.EmojiPickerView_emojiGridRows + */ + var emojiGridRows: Float + get() = _emojiGridRows ?: -1F + set(value) { + _emojiGridRows = value.takeIf { it > 0 } + // Refresh when emojiGridRows is reset + if (isLaidOut) { + showEmojiPickerView() + } + } + + /** + * The number of columns of the emoji picker. + * + * Default value([EmojiPickerConstants.DEFAULT_BODY_COLUMNS]: 9) will be used if + * emojiGridColumns is set to non-positive value. + * + * @attr ref androidx.emoji2.emojipicker.R.styleable.EmojiPickerView_emojiGridColumns + */ + var emojiGridColumns: Int = EmojiPickerConstants.DEFAULT_BODY_COLUMNS + set(value) { + field = value.takeIf { it > 0 } ?: EmojiPickerConstants.DEFAULT_BODY_COLUMNS + // Refresh when emojiGridColumns is reset + if (isLaidOut) { + showEmojiPickerView() + } + } + + private val stickyVariantProvider = StickyVariantProvider(context) + private val scope = CoroutineScope(EmptyCoroutineContext) + + private var recentEmojiProvider: RecentEmojiProvider = DefaultRecentEmojiProvider(context) + private var recentNeedsRefreshing: Boolean = true + private val recentItems: MutableList = mutableListOf() + private lateinit var recentItemGroup: ItemGroup + + private lateinit var emojiPickerItems: EmojiPickerItems + private lateinit var bodyAdapter: EmojiPickerBodyAdapter + + private var onEmojiPickedListener: Consumer? = null + + init { + val typedArray: TypedArray = + context.obtainStyledAttributes(attrs, R.styleable.EmojiPickerView, 0, 0) + _emojiGridRows = + with(R.styleable.EmojiPickerView_emojiGridRows) { + if (typedArray.hasValue(this)) { + typedArray.getFloat(this, 0F) + } else null + } + emojiGridColumns = + typedArray.getInt( + R.styleable.EmojiPickerView_emojiGridColumns, + EmojiPickerConstants.DEFAULT_BODY_COLUMNS + ) + typedArray.recycle() + + if (EmojiCompat.isConfigured()) { + when (EmojiCompat.get().loadState) { + EmojiCompat.LOAD_STATE_SUCCEEDED -> emojiCompatLoaded = true + EmojiCompat.LOAD_STATE_LOADING, + EmojiCompat.LOAD_STATE_DEFAULT -> + EmojiCompat.get() + .registerInitCallback( + object : EmojiCompat.InitCallback() { + override fun onInitialized() { + emojiCompatLoaded = true + scope.launch(Dispatchers.IO) { + BundledEmojiListLoader.load(context) + withContext(Dispatchers.Main) { + emojiPickerItems = buildEmojiPickerItems() + bodyAdapter.notifyDataSetChanged() + } + } + } + + override fun onFailed(throwable: Throwable?) {} + } + ) + } + } + scope.launch(Dispatchers.IO) { + val load = launch { BundledEmojiListLoader.load(context) } + refreshRecent() + load.join() + + withContext(Dispatchers.Main) { showEmojiPickerView() } + } + } + + private fun createEmojiPickerBodyAdapter(): EmojiPickerBodyAdapter { + return EmojiPickerBodyAdapter( + context, + emojiGridColumns, + _emojiGridRows, + stickyVariantProvider, + emojiPickerItemsProvider = { emojiPickerItems }, + onEmojiPickedListener = { emojiViewItem -> + onEmojiPickedListener?.accept(emojiViewItem) + recentEmojiProvider.recordSelection(emojiViewItem.emoji) + recentNeedsRefreshing = true + } + ) + } + + internal fun buildEmojiPickerItems() = + EmojiPickerItems( + buildList { + add( + ItemGroup( + R.drawable.quantum_gm_ic_access_time_filled_vd_theme_24, + CategoryTitle(context.getString(R.string.emoji_category_recent)), + recentItems, + maxContentItemCount = DEFAULT_MAX_RECENT_ITEM_ROWS * emojiGridColumns, + emptyPlaceholderItem = + PlaceholderText( + context.getString(R.string.emoji_empty_recent_category) + ) + ) + .also { recentItemGroup = it } + ) + + for ((i, category) in + BundledEmojiListLoader.getCategorizedEmojiData().withIndex()) { + add( + ItemGroup( + category.headerIconId, + CategoryTitle(category.categoryName), + category.emojiDataList.mapIndexed { j, emojiData -> + EmojiViewData( + stickyVariantProvider[emojiData.emoji], + dataIndex = i + j + ) + }, + ) + ) + } + } + ) + + private fun showEmojiPickerView() { + emojiPickerItems = buildEmojiPickerItems() + + val bodyLayoutManager = + GridLayoutManager( + context, + emojiGridColumns, + LinearLayoutManager.VERTICAL, + /* reverseLayout = */ false + ) + .apply { + spanSizeLookup = + object : GridLayoutManager.SpanSizeLookup() { + override fun getSpanSize(position: Int): Int { + return when (emojiPickerItems.getBodyItem(position).itemType) { + ItemType.CATEGORY_TITLE, + ItemType.PLACEHOLDER_TEXT -> emojiGridColumns + else -> 1 + } + } + } + } + + val headerAdapter = + EmojiPickerHeaderAdapter( + context, + emojiPickerItems, + onHeaderIconClicked = { + with(emojiPickerItems.firstItemPositionByGroupIndex(it)) { + if (this == emojiPickerItems.groupRange(recentItemGroup).first) { + scope.launch { refreshRecent() } + } + bodyLayoutManager.scrollToPositionWithOffset(this, 0) + // The scroll position change will not be reflected until the next layout + // call, + // so force a new layout call here. + invalidate() + } + } + ) + + // clear view's children in case of resetting layout + super.removeAllViews() + with(inflate(context, R.layout.emoji_picker, this)) { + // set headerView + ViewCompat.requireViewById(this, R.id.emoji_picker_header).apply { + layoutManager = + object : LinearLayoutManager(context, HORIZONTAL, /* reverseLayout= */ false) { + override fun checkLayoutParams(lp: RecyclerView.LayoutParams): Boolean { + lp.width = + (width - paddingStart - paddingEnd) / emojiPickerItems.numGroups + return true + } + } + adapter = headerAdapter + } + + // set bodyView + ViewCompat.requireViewById(this, R.id.emoji_picker_body).apply { + layoutManager = bodyLayoutManager + adapter = + createEmojiPickerBodyAdapter() + .apply { setHasStableIds(true) } + .also { bodyAdapter = it } + addOnScrollListener( + object : RecyclerView.OnScrollListener() { + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { + super.onScrolled(recyclerView, dx, dy) + headerAdapter.selectedGroupIndex = + emojiPickerItems.groupIndexByItemPosition( + bodyLayoutManager.findFirstCompletelyVisibleItemPosition() + ) + if ( + recentNeedsRefreshing && + bodyLayoutManager.findFirstVisibleItemPosition() !in + emojiPickerItems.groupRange(recentItemGroup) + ) { + scope.launch { refreshRecent() } + } + } + } + ) + // Disable item insertion/deletion animation. This keeps view holder unchanged when + // item updates. + itemAnimator = null + setRecycledViewPool( + RecyclerView.RecycledViewPool().apply { + setMaxRecycledViews( + ItemType.EMOJI.ordinal, + EmojiPickerConstants.EMOJI_VIEW_POOL_SIZE + ) + } + ) + } + } + } + + internal suspend fun refreshRecent() { + if (!recentNeedsRefreshing) { + return + } + val oldGroupSize = if (::recentItemGroup.isInitialized) recentItemGroup.size else 0 + val recent = recentEmojiProvider.getRecentEmojiList() + withContext(Dispatchers.Main) { + recentItems.clear() + recentItems.addAll( + recent.map { + EmojiViewData( + it, + updateToSticky = false, + ) + } + ) + if (::emojiPickerItems.isInitialized) { + val range = emojiPickerItems.groupRange(recentItemGroup) + if (recentItemGroup.size > oldGroupSize) { + bodyAdapter.notifyItemRangeInserted( + range.first + oldGroupSize, + recentItemGroup.size - oldGroupSize + ) + } else if (recentItemGroup.size < oldGroupSize) { + bodyAdapter.notifyItemRangeRemoved( + range.first + recentItemGroup.size, + oldGroupSize - recentItemGroup.size + ) + } + bodyAdapter.notifyItemRangeChanged( + range.first, + minOf(oldGroupSize, recentItemGroup.size) + ) + recentNeedsRefreshing = false + } + } + } + + /** + * This function is used to set the custom behavior after clicking on an emoji icon. Clients + * could specify their own behavior inside this function. + */ + fun setOnEmojiPickedListener(onEmojiPickedListener: Consumer?) { + this.onEmojiPickedListener = onEmojiPickedListener + } + + fun setRecentEmojiProvider(recentEmojiProvider: RecentEmojiProvider) { + this.recentEmojiProvider = recentEmojiProvider + scope.launch { + recentNeedsRefreshing = true + refreshRecent() + } + } + + /** + * The following functions disallow clients to add view to the EmojiPickerView + * + * @param child the child view to be added + * @throws UnsupportedOperationException + */ + override fun addView(child: View?) { + if (childCount > 0) + throw UnsupportedOperationException(EmojiPickerConstants.ADD_VIEW_EXCEPTION_MESSAGE) + else super.addView(child) + } + + /** + * @param child + * @param params + * @throws UnsupportedOperationException + */ + override fun addView(child: View?, params: ViewGroup.LayoutParams?) { + if (childCount > 0) + throw UnsupportedOperationException(EmojiPickerConstants.ADD_VIEW_EXCEPTION_MESSAGE) + else super.addView(child, params) + } + + /** + * @param child + * @param index + * @throws UnsupportedOperationException + */ + override fun addView(child: View?, index: Int) { + if (childCount > 0) + throw UnsupportedOperationException(EmojiPickerConstants.ADD_VIEW_EXCEPTION_MESSAGE) + else super.addView(child, index) + } + + /** + * @param child + * @param index + * @param params + * @throws UnsupportedOperationException + */ + override fun addView(child: View?, index: Int, params: ViewGroup.LayoutParams?) { + if (childCount > 0) + throw UnsupportedOperationException(EmojiPickerConstants.ADD_VIEW_EXCEPTION_MESSAGE) + else super.addView(child, index, params) + } + + /** + * @param child + * @param width + * @param height + * @throws UnsupportedOperationException + */ + override fun addView(child: View?, width: Int, height: Int) { + if (childCount > 0) + throw UnsupportedOperationException(EmojiPickerConstants.ADD_VIEW_EXCEPTION_MESSAGE) + else super.addView(child, width, height) + } + + /** + * The following functions disallow clients to remove view from the EmojiPickerView + * + * @throws UnsupportedOperationException + */ + override fun removeAllViews() { + throw UnsupportedOperationException(EmojiPickerConstants.REMOVE_VIEW_EXCEPTION_MESSAGE) + } + + /** + * @param child + * @throws UnsupportedOperationException + */ + override fun removeView(child: View?) { + throw UnsupportedOperationException(EmojiPickerConstants.REMOVE_VIEW_EXCEPTION_MESSAGE) + } + + /** + * @param index + * @throws UnsupportedOperationException + */ + override fun removeViewAt(index: Int) { + throw UnsupportedOperationException(EmojiPickerConstants.REMOVE_VIEW_EXCEPTION_MESSAGE) + } + + /** + * @param child + * @throws UnsupportedOperationException + */ + override fun removeViewInLayout(child: View?) { + throw UnsupportedOperationException(EmojiPickerConstants.REMOVE_VIEW_EXCEPTION_MESSAGE) + } + + /** + * @param start + * @param count + * @throws UnsupportedOperationException + */ + override fun removeViews(start: Int, count: Int) { + throw UnsupportedOperationException(EmojiPickerConstants.REMOVE_VIEW_EXCEPTION_MESSAGE) + } + + /** + * @param start + * @param count + * @throws UnsupportedOperationException + */ + override fun removeViewsInLayout(start: Int, count: Int) { + throw UnsupportedOperationException(EmojiPickerConstants.REMOVE_VIEW_EXCEPTION_MESSAGE) + } +} diff --git a/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/EmojiView.kt b/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/EmojiView.kt new file mode 100644 index 00000000..835881ae --- /dev/null +++ b/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/EmojiView.kt @@ -0,0 +1,173 @@ + + +package com.rishabh.emojipicker + +import android.content.Context +import android.graphics.Bitmap +import android.graphics.Canvas +import android.graphics.Color +import android.graphics.Paint +import android.graphics.Rect +import android.os.Build +import android.text.Layout +import android.text.Spanned +import android.text.StaticLayout +import android.text.TextPaint +import android.util.AttributeSet +import android.util.TypedValue +import android.view.View +import androidx.annotation.RequiresApi +import androidx.core.graphics.applyCanvas +import androidx.emoji2.text.EmojiCompat + +/** A customized view to support drawing emojis asynchronously. */ +internal class EmojiView +@JvmOverloads +constructor( + context: Context, + attrs: AttributeSet? = null, +) : View(context, attrs) { + + companion object { + private const val EMOJI_DRAW_TEXT_SIZE_SP = 30 + } + + init { + background = context.getDrawable(R.drawable.ripple_emoji_view) + importantForAccessibility = IMPORTANT_FOR_ACCESSIBILITY_YES + } + + internal var willDrawVariantIndicator: Boolean = true + + private val textPaint = + TextPaint(Paint.ANTI_ALIAS_FLAG or Paint.FILTER_BITMAP_FLAG).apply { + textSize = + TypedValue.applyDimension( + TypedValue.COMPLEX_UNIT_SP, + EMOJI_DRAW_TEXT_SIZE_SP.toFloat(), + context.resources.displayMetrics + ) + } + + private val offscreenCanvasBitmap: Bitmap = + with(textPaint.fontMetricsInt) { + val size = bottom - top + Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888) + } + + override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { + val size = + minOf(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.getSize(heightMeasureSpec)) - + context.resources.getDimensionPixelSize(R.dimen.emoji_picker_emoji_view_padding) + setMeasuredDimension(size, size) + } + + override fun draw(canvas: Canvas) { + super.draw(canvas) + canvas.run { + save() + scale( + width.toFloat() / offscreenCanvasBitmap.width, + height.toFloat() / offscreenCanvasBitmap.height + ) + drawBitmap(offscreenCanvasBitmap, 0f, 0f, null) + restore() + } + } + + var emoji: CharSequence? = null + set(value) { + field = value + post { + if (value != null) { + if (value == this.emoji) { + drawEmoji( + if (EmojiPickerView.emojiCompatLoaded) + EmojiCompat.get().process(value) ?: value + else value, + drawVariantIndicator = + willDrawVariantIndicator && + BundledEmojiListLoader.getEmojiVariantsLookup() + .containsKey(value) + ) + contentDescription = value + } + invalidate() + } else { + offscreenCanvasBitmap.eraseColor(Color.TRANSPARENT) + } + } + } + + private fun drawEmoji(emoji: CharSequence, drawVariantIndicator: Boolean) { + offscreenCanvasBitmap.eraseColor(Color.TRANSPARENT) + offscreenCanvasBitmap.applyCanvas { + if (emoji is Spanned) { + createStaticLayout(emoji, width).draw(this) + } else { + val textWidth = textPaint.measureText(emoji, 0, emoji.length) + drawText( + emoji, + /* start = */ 0, + /* end = */ emoji.length, + /* x = */ (width - textWidth) / 2, + /* y = */ -textPaint.fontMetrics.top, + textPaint, + ) + } + if (drawVariantIndicator) { + context + .getDrawable(R.drawable.variant_availability_indicator) + ?.apply { + val canvasWidth = this@applyCanvas.width + val canvasHeight = this@applyCanvas.height + val indicatorWidth = + context.resources.getDimensionPixelSize( + R.dimen.variant_availability_indicator_width + ) + val indicatorHeight = + context.resources.getDimensionPixelSize( + R.dimen.variant_availability_indicator_height + ) + bounds = + Rect( + canvasWidth - indicatorWidth, + canvasHeight - indicatorHeight, + canvasWidth, + canvasHeight + ) + }!! + .draw(this) + } + } + } + + @RequiresApi(23) + internal object Api23Impl { + fun createStaticLayout(emoji: Spanned, textPaint: TextPaint, width: Int): StaticLayout = + StaticLayout.Builder.obtain(emoji, 0, emoji.length, textPaint, width) + .apply { + setAlignment(Layout.Alignment.ALIGN_CENTER) + setLineSpacing(/* spacingAdd= */ 0f, /* spacingMult= */ 1f) + setIncludePad(false) + } + .build() + } + + private fun createStaticLayout(emoji: Spanned, width: Int): StaticLayout { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + return Api23Impl.createStaticLayout(emoji, textPaint, width) + } else { + @Suppress("DEPRECATION") + return StaticLayout( + emoji, + textPaint, + width, + Layout.Alignment.ALIGN_CENTER, + /* spacingmult = */ 1f, + /* spacingadd = */ 0f, + /* includepad = */ false, + ) + } + } +} diff --git a/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/EmojiViewHolder.kt b/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/EmojiViewHolder.kt new file mode 100644 index 00000000..01c4c358 --- /dev/null +++ b/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/EmojiViewHolder.kt @@ -0,0 +1,81 @@ + + +package com.rishabh.emojipicker + +import android.content.Context +import android.view.View +import android.view.View.OnLongClickListener +import android.view.ViewGroup.LayoutParams +import android.view.accessibility.AccessibilityEvent +import androidx.recyclerview.widget.RecyclerView.ViewHolder + +/** A [ViewHolder] containing an emoji view and emoji data. */ +internal class EmojiViewHolder( + context: Context, + width: Int, + height: Int, + private val stickyVariantProvider: StickyVariantProvider, + private val onEmojiPickedListener: EmojiViewHolder.(EmojiViewItem) -> Unit, + private val onEmojiPickedFromPopupListener: EmojiViewHolder.(String) -> Unit +) : ViewHolder(EmojiView(context)) { + private val onEmojiLongClickListener: OnLongClickListener = + OnLongClickListener { targetEmojiView -> + showEmojiPopup(context, targetEmojiView) + } + + private val emojiView: EmojiView = + (itemView as EmojiView).apply { + layoutParams = LayoutParams(width, height) + isClickable = true + setOnClickListener { + it.sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT) + onEmojiPickedListener(emojiViewItem) + } + } + private lateinit var emojiViewItem: EmojiViewItem + private lateinit var emojiPickerPopupViewController: EmojiPickerPopupViewController + + fun bindEmoji( + emoji: String, + ) { + emojiView.emoji = emoji + emojiViewItem = makeEmojiViewItem(emoji) + + if (emojiViewItem.variants.isNotEmpty()) { + emojiView.setOnLongClickListener(onEmojiLongClickListener) + emojiView.isLongClickable = true + } else { + emojiView.setOnLongClickListener(null) + emojiView.isLongClickable = false + } + } + + private fun showEmojiPopup(context: Context, clickedEmojiView: View): Boolean { + val emojiPickerPopupView = + EmojiPickerPopupView( + context, + /* attrs= */ null, + targetEmojiView = clickedEmojiView, + targetEmojiItem = emojiViewItem, + emojiViewOnClickListener = { view -> + val emojiPickedInPopup = (view as EmojiView).emoji.toString() + onEmojiPickedFromPopupListener(emojiPickedInPopup) + onEmojiPickedListener(makeEmojiViewItem(emojiPickedInPopup)) + // variants[0] is always the base (i.e., primary) emoji + stickyVariantProvider.update(emojiViewItem.variants[0], emojiPickedInPopup) + emojiPickerPopupViewController.dismiss() + // Hover on the base emoji after popup dismissed + clickedEmojiView.sendAccessibilityEvent( + AccessibilityEvent.TYPE_VIEW_HOVER_ENTER + ) + } + ) + emojiPickerPopupViewController = + EmojiPickerPopupViewController(context, emojiPickerPopupView, clickedEmojiView) + emojiPickerPopupViewController.show() + return true + } + + private fun makeEmojiViewItem(emoji: String) = + EmojiViewItem(emoji, BundledEmojiListLoader.getEmojiVariantsLookup()[emoji] ?: listOf()) +} diff --git a/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/EmojiViewItem.kt b/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/EmojiViewItem.kt new file mode 100644 index 00000000..35ac58ae --- /dev/null +++ b/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/EmojiViewItem.kt @@ -0,0 +1,11 @@ + + +package com.rishabh.emojipicker + +/** + * [EmojiViewItem] is a class holding the displayed emoji and its emoji variants + * + * @param emoji Used to represent the displayed emoji of the [EmojiViewItem]. + * @param variants Used to represent the corresponding emoji variants of this base emoji. + */ +class EmojiViewItem(val emoji: String, val variants: List) diff --git a/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/ItemViewData.kt b/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/ItemViewData.kt new file mode 100644 index 00000000..2afefc9f --- /dev/null +++ b/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/ItemViewData.kt @@ -0,0 +1,32 @@ + + +package com.rishabh.emojipicker + +internal enum class ItemType { + CATEGORY_TITLE, + PLACEHOLDER_TEXT, + EMOJI, +} + +/** Represents an item within the body RecyclerView. */ +internal sealed class ItemViewData(val itemType: ItemType) { + val viewType = itemType.ordinal +} + +/** Title of each category. */ +internal data class CategoryTitle(val title: String) : ItemViewData(ItemType.CATEGORY_TITLE) + +/** Text to display when the category contains no items. */ +internal data class PlaceholderText(val text: String) : ItemViewData(ItemType.PLACEHOLDER_TEXT) + +/** Represents an emoji. */ +internal data class EmojiViewData( + var emoji: String, + val updateToSticky: Boolean = true, + // Needed to ensure uniqueness since we enabled stable Id. + val dataIndex: Int = 0 +) : ItemViewData(ItemType.EMOJI) + +internal object Extensions { + internal fun Int.toItemType() = ItemType.values()[this] +} diff --git a/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/RecentEmojiAsyncProvider.kt b/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/RecentEmojiAsyncProvider.kt new file mode 100644 index 00000000..5f599e72 --- /dev/null +++ b/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/RecentEmojiAsyncProvider.kt @@ -0,0 +1,41 @@ +/* + * Copyright 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.rishabh.emojipicker + +import com.google.common.util.concurrent.ListenableFuture +import kotlinx.coroutines.guava.await + +/** + * A interface equivalent to [RecentEmojiProvider] that allows java clients to override the + * [ListenableFuture] based function [getRecentEmojiListAsync] in order to provide recent emojis. + */ +interface RecentEmojiAsyncProvider { + fun recordSelection(emoji: String) + + fun getRecentEmojiListAsync(): ListenableFuture> +} + +/** An adapter for the [RecentEmojiAsyncProvider]. */ +class RecentEmojiProviderAdapter(private val recentEmojiAsyncProvider: RecentEmojiAsyncProvider) : + RecentEmojiProvider { + override fun recordSelection(emoji: String) { + recentEmojiAsyncProvider.recordSelection(emoji) + } + + override suspend fun getRecentEmojiList() = + recentEmojiAsyncProvider.getRecentEmojiListAsync().await() +} diff --git a/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/RecentEmojiProvider.kt b/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/RecentEmojiProvider.kt new file mode 100644 index 00000000..8362822f --- /dev/null +++ b/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/RecentEmojiProvider.kt @@ -0,0 +1,19 @@ + + +package com.rishabh.emojipicker + +/** An interface to provide recent emoji list. */ +interface RecentEmojiProvider { + /** + * Records an emoji into recent emoji list. This fun will be called when an emoji is selected. + * Clients could specify the behavior to record recently used emojis.(e.g. click frequency). + */ + fun recordSelection(emoji: String) + + /** + * Returns a list of recent emojis. Default behavior: The most recently used emojis will be + * displayed first. Clients could also specify the behavior such as displaying the emojis from + * high click frequency to low click frequency. + */ + suspend fun getRecentEmojiList(): List +} diff --git a/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/StickyVariantProvider.kt b/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/StickyVariantProvider.kt new file mode 100644 index 00000000..3242542c --- /dev/null +++ b/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/StickyVariantProvider.kt @@ -0,0 +1,49 @@ + + +package com.rishabh.emojipicker + +import android.content.Context +import android.content.Context.MODE_PRIVATE + +/** A class that handles user's emoji variant selection using SharedPreferences. */ +internal class StickyVariantProvider(context: Context) { + companion object { + const val PREFERENCES_FILE_NAME = "androidx.emoji2.emojipicker.preferences" + const val STICKY_VARIANT_PROVIDER_KEY = "pref_key_sticky_variant" + const val KEY_VALUE_DELIMITER = "=" + const val ENTRY_DELIMITER = "|" + } + val userUnlocked = context.getSystemService(UserManager::class.java)?.isUserUnlocked ?: true + + private val sharedPreferences =if (userUnlocked) { context.getSharedPreferences(PREFERENCES_FILE_NAME, MODE_PRIVATE) }else{null} + + + private val stickyVariantMap: MutableMap by lazy { + sharedPreferences? + .getString(STICKY_VARIANT_PROVIDER_KEY, null) + ?.split(ENTRY_DELIMITER) + ?.associate { entry -> + entry + .split(KEY_VALUE_DELIMITER, limit = 2) + .takeIf { it.size == 2 } + ?.let { it[0] to it[1] } ?: ("" to "") + } + ?.toMutableMap() ?: mutableMapOf() + } + + internal operator fun get(emoji: String): String = stickyVariantMap[emoji] ?: emoji + + internal fun update(baseEmoji: String, variantClicked: String) { + stickyVariantMap.apply { + if (baseEmoji == variantClicked) { + this.remove(baseEmoji) + } else { + this[baseEmoji] = variantClicked + } + sharedPreferences + ?.edit() + ?.putString(STICKY_VARIANT_PROVIDER_KEY, entries.joinToString(ENTRY_DELIMITER)) + ?.commit() + } + } +} diff --git a/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/utils/FileCache.kt b/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/utils/FileCache.kt new file mode 100644 index 00000000..0d97b146 --- /dev/null +++ b/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/utils/FileCache.kt @@ -0,0 +1,135 @@ + + +package com.rishabh.emojipicker.utils + +import android.content.Context +import android.content.pm.PackageManager +import android.os.Build +import android.util.Log +import androidx.annotation.GuardedBy +import androidx.annotation.RequiresApi +import androidx.annotation.VisibleForTesting +import androidx.core.content.ContextCompat +import com.rishabh.emojipicker.BundledEmojiListLoader +import com.rishabh.emojipicker.EmojiViewItem +import java.io.File +import java.io.IOException + +/** + * A class that manages cache files for the emoji picker. All cache files are stored in DE (Device + * Encryption) storage (N+), and will be invalidated if device OS version or App version is updated. + * + * Currently this class is only used by [BundledEmojiListLoader]. All renderable emojis will be + * cached by categories under /app.package.name/cache/emoji_picker/ + * /emoji.... + */ +internal class FileCache(context: Context) { + + @VisibleForTesting @GuardedBy("lock") internal val emojiPickerCacheDir: File + private val currentProperty: String + private val lock = Any() + + init { + val osVersion = "${Build.VERSION.SDK_INT}_${Build.TIME}" + val appVersion = getVersionCode(context) + currentProperty = "$osVersion.$appVersion" + emojiPickerCacheDir = + File(getDeviceProtectedStorageContext(context).cacheDir, EMOJI_PICKER_FOLDER) + if (!emojiPickerCacheDir.exists()) emojiPickerCacheDir.mkdir() + } + + /** Get cache for a given file name, or write to a new file using the [defaultValue] factory. */ + internal fun getOrPut( + key: String, + defaultValue: () -> List + ): List { + synchronized(lock) { + val targetDir = File(emojiPickerCacheDir, currentProperty) + // No matching cache folder for current property, clear stale cache directory if any + if (!targetDir.exists()) { + emojiPickerCacheDir.listFiles()?.forEach { it.deleteRecursively() } + targetDir.mkdirs() + } + + val targetFile = File(targetDir, key) + return readFrom(targetFile) ?: writeTo(targetFile, defaultValue) + } + } + + private fun readFrom(targetFile: File): List? { + if (!targetFile.isFile) return null + return targetFile + .bufferedReader() + .useLines { it.toList() } + .map { it.split(",") } + .map { EmojiViewItem(it.first(), it.drop(1)) } + } + + private fun writeTo( + targetFile: File, + defaultValue: () -> List + ): List { + val data = defaultValue.invoke() + if (targetFile.exists()) { + if (!targetFile.delete()) { + Log.wtf(TAG, "Can't delete file: $targetFile") + } + } + if (!targetFile.createNewFile()) { + throw IOException("Can't create file: $targetFile") + } + targetFile.bufferedWriter().use { out -> + for (emoji in data) { + out.write(emoji.emoji) + emoji.variants.forEach { out.write(",$it") } + out.newLine() + } + } + return data + } + + /** Returns a new [context] for accessing device protected storage. */ + private fun getDeviceProtectedStorageContext(context: Context) = + context.takeIf { ContextCompat.isDeviceProtectedStorage(it) } + ?: run { ContextCompat.createDeviceProtectedStorageContext(context) } + ?: context + + /** Gets the version code for a package. */ + @Suppress("DEPRECATION") + private fun getVersionCode(context: Context): Long = + try { + if (Build.VERSION.SDK_INT >= 33) Api33Impl.getAppVersionCode(context) + else if (Build.VERSION.SDK_INT >= 28) Api28Impl.getAppVersionCode(context) + else context.packageManager.getPackageInfo(context.packageName, 0).versionCode.toLong() + } catch (e: PackageManager.NameNotFoundException) { + // Default version to 1 + 1 + } + + companion object { + @Volatile private var instance: FileCache? = null + + internal fun getInstance(context: Context): FileCache = + instance ?: synchronized(this) { instance ?: FileCache(context).also { instance = it } } + + private const val EMOJI_PICKER_FOLDER = "emoji_picker" + private const val TAG = "emojipicker.FileCache" + } + + @RequiresApi(Build.VERSION_CODES.TIRAMISU) + internal object Api33Impl { + fun getAppVersionCode(context: Context) = + context.packageManager + .getPackageInfo(context.packageName, PackageManager.PackageInfoFlags.of(0)) + .longVersionCode + } + + @Suppress("DEPRECATION") + @RequiresApi(Build.VERSION_CODES.P) + internal object Api28Impl { + fun getAppVersionCode(context: Context) = + context.packageManager + .getPackageInfo(context.packageName, /* flags= */ 0) + .longVersionCode + } +} diff --git a/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/utils/UnicodeRenderableManager.kt b/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/utils/UnicodeRenderableManager.kt new file mode 100644 index 00000000..e2f14df7 --- /dev/null +++ b/emojipicker/app/src/main/java/androidx/emoji2/emojipicker/utils/UnicodeRenderableManager.kt @@ -0,0 +1,69 @@ + + +package com.rishabh.emojipicker.utils + +import android.os.Build +import android.text.TextPaint +import androidx.annotation.VisibleForTesting +import androidx.core.graphics.PaintCompat +import com.rishabh.emojipicker.EmojiPickerView +import androidx.emoji2.text.EmojiCompat + +/** Checks renderability of unicode characters. */ +internal object UnicodeRenderableManager { + + private const val VARIATION_SELECTOR = "\uFE0F" + + private const val YAWNING_FACE_EMOJI = "\uD83E\uDD71" + + private val paint = TextPaint() + + /** + * Some emojis were usual (non-emoji) characters. Old devices cannot render them with variation + * selector (U+FE0F) so it's worth trying to check renderability again without variation + * selector. + */ + private val CATEGORY_MOVED_EMOJIS = + listOf( // These three characters have been emoji since Unicode emoji version 4. + // version 3: https://unicode.org/Public/emoji/3.0/emoji-data.txt + // version 4: https://unicode.org/Public/emoji/4.0/emoji-data.txt + "\u2695\uFE0F", // STAFF OF AESCULAPIUS + "\u2640\uFE0F", // FEMALE SIGN + "\u2642\uFE0F", // MALE SIGN + // These three characters have been emoji since Unicode emoji version 11. + // version 5: https://unicode.org/Public/emoji/5.0/emoji-data.txt + // version 11: https://unicode.org/Public/emoji/11.0/emoji-data.txt + "\u265F\uFE0F", // BLACK_CHESS_PAWN + "\u267E\uFE0F" // PERMANENT_PAPER_SIGN + ) + + /** + * For a given emoji, check it's renderability with EmojiCompat if enabled. Otherwise, use + * [PaintCompat#hasGlyph]. + * + * Note: For older API version, codepoints {@code U+0xFE0F} are removed. + */ + internal fun isEmojiRenderable(emoji: String) = + if (EmojiPickerView.emojiCompatLoaded) + EmojiCompat.get().getEmojiMatch(emoji, Int.MAX_VALUE) == EmojiCompat.EMOJI_SUPPORTED + else getClosestRenderable(emoji) != null + + // Yawning face is added in emoji 12 which is the first version starts to support gender + // inclusive emojis. + internal fun isEmoji12Supported() = isEmojiRenderable(YAWNING_FACE_EMOJI) + + @VisibleForTesting + fun getClosestRenderable(emoji: String): String? { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) { + return emoji.replace(VARIATION_SELECTOR, "").takeIfHasGlyph() + } + return emoji.takeIfHasGlyph() + ?: run { + if (CATEGORY_MOVED_EMOJIS.contains(emoji)) + emoji.replace(VARIATION_SELECTOR, "").takeIfHasGlyph() + else null + } + } + + private fun String.takeIfHasGlyph() = takeIf { PaintCompat.hasGlyph(paint, this) } +} diff --git a/emojipicker/app/src/main/res/anim/slide_down_and_fade_out.xml b/emojipicker/app/src/main/res/anim/slide_down_and_fade_out.xml new file mode 100644 index 00000000..c25f30dd --- /dev/null +++ b/emojipicker/app/src/main/res/anim/slide_down_and_fade_out.xml @@ -0,0 +1,17 @@ + + + + + + + + \ No newline at end of file diff --git a/emojipicker/app/src/main/res/anim/slide_up_and_fade_in.xml b/emojipicker/app/src/main/res/anim/slide_up_and_fade_in.xml new file mode 100644 index 00000000..618b96e1 --- /dev/null +++ b/emojipicker/app/src/main/res/anim/slide_up_and_fade_in.xml @@ -0,0 +1,17 @@ + + + + + + + + \ No newline at end of file diff --git a/emojipicker/app/src/main/res/drawable/couple_heart_men_shadow_skintone.xml b/emojipicker/app/src/main/res/drawable/couple_heart_men_shadow_skintone.xml new file mode 100644 index 00000000..e480cbf5 --- /dev/null +++ b/emojipicker/app/src/main/res/drawable/couple_heart_men_shadow_skintone.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/app/src/main/res/drawable/couple_heart_men_skintone_shadow.xml b/emojipicker/app/src/main/res/drawable/couple_heart_men_skintone_shadow.xml new file mode 100644 index 00000000..6d54233c --- /dev/null +++ b/emojipicker/app/src/main/res/drawable/couple_heart_men_skintone_shadow.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/app/src/main/res/drawable/couple_heart_people_shadow_skintone.xml b/emojipicker/app/src/main/res/drawable/couple_heart_people_shadow_skintone.xml new file mode 100644 index 00000000..219fb0aa --- /dev/null +++ b/emojipicker/app/src/main/res/drawable/couple_heart_people_shadow_skintone.xml @@ -0,0 +1,218 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/emojipicker/app/src/main/res/drawable/couple_heart_people_skintone_shadow.xml b/emojipicker/app/src/main/res/drawable/couple_heart_people_skintone_shadow.xml new file mode 100644 index 00000000..09e95e56 --- /dev/null +++ b/emojipicker/app/src/main/res/drawable/couple_heart_people_skintone_shadow.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/app/src/main/res/drawable/couple_heart_woman_man_shadow_skintone.xml b/emojipicker/app/src/main/res/drawable/couple_heart_woman_man_shadow_skintone.xml new file mode 100644 index 00000000..1107c60c --- /dev/null +++ b/emojipicker/app/src/main/res/drawable/couple_heart_woman_man_shadow_skintone.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/app/src/main/res/drawable/couple_heart_woman_man_skintone_shadow.xml b/emojipicker/app/src/main/res/drawable/couple_heart_woman_man_skintone_shadow.xml new file mode 100644 index 00000000..1334b677 --- /dev/null +++ b/emojipicker/app/src/main/res/drawable/couple_heart_woman_man_skintone_shadow.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/app/src/main/res/drawable/couple_heart_women_shadow_skintone.xml b/emojipicker/app/src/main/res/drawable/couple_heart_women_shadow_skintone.xml new file mode 100644 index 00000000..4fe76d7d --- /dev/null +++ b/emojipicker/app/src/main/res/drawable/couple_heart_women_shadow_skintone.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/app/src/main/res/drawable/couple_heart_women_skintone_shadow.xml b/emojipicker/app/src/main/res/drawable/couple_heart_women_skintone_shadow.xml new file mode 100644 index 00000000..b8b66009 --- /dev/null +++ b/emojipicker/app/src/main/res/drawable/couple_heart_women_skintone_shadow.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/app/src/main/res/drawable/gm_filled_emoji_emotions_vd_theme_24.xml b/emojipicker/app/src/main/res/drawable/gm_filled_emoji_emotions_vd_theme_24.xml new file mode 100644 index 00000000..cfdbdab5 --- /dev/null +++ b/emojipicker/app/src/main/res/drawable/gm_filled_emoji_emotions_vd_theme_24.xml @@ -0,0 +1,12 @@ + + + + + diff --git a/emojipicker/app/src/main/res/drawable/gm_filled_emoji_events_vd_theme_24.xml b/emojipicker/app/src/main/res/drawable/gm_filled_emoji_events_vd_theme_24.xml new file mode 100644 index 00000000..f588bf36 --- /dev/null +++ b/emojipicker/app/src/main/res/drawable/gm_filled_emoji_events_vd_theme_24.xml @@ -0,0 +1,12 @@ + + + + + diff --git a/emojipicker/app/src/main/res/drawable/gm_filled_emoji_food_beverage_vd_theme_24.xml b/emojipicker/app/src/main/res/drawable/gm_filled_emoji_food_beverage_vd_theme_24.xml new file mode 100644 index 00000000..989d0fab --- /dev/null +++ b/emojipicker/app/src/main/res/drawable/gm_filled_emoji_food_beverage_vd_theme_24.xml @@ -0,0 +1,15 @@ + + + + + + diff --git a/emojipicker/app/src/main/res/drawable/gm_filled_emoji_nature_vd_theme_24.xml b/emojipicker/app/src/main/res/drawable/gm_filled_emoji_nature_vd_theme_24.xml new file mode 100644 index 00000000..c259fba2 --- /dev/null +++ b/emojipicker/app/src/main/res/drawable/gm_filled_emoji_nature_vd_theme_24.xml @@ -0,0 +1,15 @@ + + + + + + diff --git a/emojipicker/app/src/main/res/drawable/gm_filled_emoji_objects_vd_theme_24.xml b/emojipicker/app/src/main/res/drawable/gm_filled_emoji_objects_vd_theme_24.xml new file mode 100644 index 00000000..5e028ac9 --- /dev/null +++ b/emojipicker/app/src/main/res/drawable/gm_filled_emoji_objects_vd_theme_24.xml @@ -0,0 +1,12 @@ + + + + + diff --git a/emojipicker/app/src/main/res/drawable/gm_filled_emoji_people_vd_theme_24.xml b/emojipicker/app/src/main/res/drawable/gm_filled_emoji_people_vd_theme_24.xml new file mode 100644 index 00000000..bd647fe4 --- /dev/null +++ b/emojipicker/app/src/main/res/drawable/gm_filled_emoji_people_vd_theme_24.xml @@ -0,0 +1,15 @@ + + + + + + \ No newline at end of file diff --git a/emojipicker/app/src/main/res/drawable/gm_filled_emoji_symbols_vd_theme_24.xml b/emojipicker/app/src/main/res/drawable/gm_filled_emoji_symbols_vd_theme_24.xml new file mode 100644 index 00000000..571cb545 --- /dev/null +++ b/emojipicker/app/src/main/res/drawable/gm_filled_emoji_symbols_vd_theme_24.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + diff --git a/emojipicker/app/src/main/res/drawable/gm_filled_emoji_transportation_vd_theme_24.xml b/emojipicker/app/src/main/res/drawable/gm_filled_emoji_transportation_vd_theme_24.xml new file mode 100644 index 00000000..99a165e2 --- /dev/null +++ b/emojipicker/app/src/main/res/drawable/gm_filled_emoji_transportation_vd_theme_24.xml @@ -0,0 +1,27 @@ + + + + + + + + + + diff --git a/emojipicker/app/src/main/res/drawable/gm_filled_flag_vd_theme_24.xml b/emojipicker/app/src/main/res/drawable/gm_filled_flag_vd_theme_24.xml new file mode 100644 index 00000000..f3573b8a --- /dev/null +++ b/emojipicker/app/src/main/res/drawable/gm_filled_flag_vd_theme_24.xml @@ -0,0 +1,12 @@ + + + + + diff --git a/emojipicker/app/src/main/res/drawable/handshake_shadow_skintone.xml b/emojipicker/app/src/main/res/drawable/handshake_shadow_skintone.xml new file mode 100644 index 00000000..04259f35 --- /dev/null +++ b/emojipicker/app/src/main/res/drawable/handshake_shadow_skintone.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/emojipicker/app/src/main/res/drawable/handshake_skintone_shadow.xml b/emojipicker/app/src/main/res/drawable/handshake_skintone_shadow.xml new file mode 100644 index 00000000..dfe4f213 --- /dev/null +++ b/emojipicker/app/src/main/res/drawable/handshake_skintone_shadow.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/emojipicker/app/src/main/res/drawable/holding_men_shadow_skintone.xml b/emojipicker/app/src/main/res/drawable/holding_men_shadow_skintone.xml new file mode 100644 index 00000000..4b84e94a --- /dev/null +++ b/emojipicker/app/src/main/res/drawable/holding_men_shadow_skintone.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/app/src/main/res/drawable/holding_men_skintone_shadow.xml b/emojipicker/app/src/main/res/drawable/holding_men_skintone_shadow.xml new file mode 100644 index 00000000..e9def1c6 --- /dev/null +++ b/emojipicker/app/src/main/res/drawable/holding_men_skintone_shadow.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/app/src/main/res/drawable/holding_people_shadow_skintone.xml b/emojipicker/app/src/main/res/drawable/holding_people_shadow_skintone.xml new file mode 100644 index 00000000..ebbd0f4c --- /dev/null +++ b/emojipicker/app/src/main/res/drawable/holding_people_shadow_skintone.xml @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/app/src/main/res/drawable/holding_people_skintone_shadow.xml b/emojipicker/app/src/main/res/drawable/holding_people_skintone_shadow.xml new file mode 100644 index 00000000..039b6207 --- /dev/null +++ b/emojipicker/app/src/main/res/drawable/holding_people_skintone_shadow.xml @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/app/src/main/res/drawable/holding_woman_man_shadow_skintone.xml b/emojipicker/app/src/main/res/drawable/holding_woman_man_shadow_skintone.xml new file mode 100644 index 00000000..a921ec26 --- /dev/null +++ b/emojipicker/app/src/main/res/drawable/holding_woman_man_shadow_skintone.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/app/src/main/res/drawable/holding_woman_man_skintone_shadow.xml b/emojipicker/app/src/main/res/drawable/holding_woman_man_skintone_shadow.xml new file mode 100644 index 00000000..85c33276 --- /dev/null +++ b/emojipicker/app/src/main/res/drawable/holding_woman_man_skintone_shadow.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/app/src/main/res/drawable/holding_women_shadow_skintone.xml b/emojipicker/app/src/main/res/drawable/holding_women_shadow_skintone.xml new file mode 100644 index 00000000..0e918b99 --- /dev/null +++ b/emojipicker/app/src/main/res/drawable/holding_women_shadow_skintone.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/app/src/main/res/drawable/holding_women_skintone_shadow.xml b/emojipicker/app/src/main/res/drawable/holding_women_skintone_shadow.xml new file mode 100644 index 00000000..035cc21e --- /dev/null +++ b/emojipicker/app/src/main/res/drawable/holding_women_skintone_shadow.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/app/src/main/res/drawable/icon_tint_selector.xml b/emojipicker/app/src/main/res/drawable/icon_tint_selector.xml new file mode 100644 index 00000000..50a07511 --- /dev/null +++ b/emojipicker/app/src/main/res/drawable/icon_tint_selector.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/emojipicker/app/src/main/res/drawable/kiss_men_shadow_skintone.xml b/emojipicker/app/src/main/res/drawable/kiss_men_shadow_skintone.xml new file mode 100644 index 00000000..e3df38d5 --- /dev/null +++ b/emojipicker/app/src/main/res/drawable/kiss_men_shadow_skintone.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/app/src/main/res/drawable/kiss_men_skintone_shadow.xml b/emojipicker/app/src/main/res/drawable/kiss_men_skintone_shadow.xml new file mode 100644 index 00000000..2abbd884 --- /dev/null +++ b/emojipicker/app/src/main/res/drawable/kiss_men_skintone_shadow.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/app/src/main/res/drawable/kiss_people_shadow_skintone.xml b/emojipicker/app/src/main/res/drawable/kiss_people_shadow_skintone.xml new file mode 100644 index 00000000..ddaa4839 --- /dev/null +++ b/emojipicker/app/src/main/res/drawable/kiss_people_shadow_skintone.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/app/src/main/res/drawable/kiss_people_skintone_shadow.xml b/emojipicker/app/src/main/res/drawable/kiss_people_skintone_shadow.xml new file mode 100644 index 00000000..f81d8633 --- /dev/null +++ b/emojipicker/app/src/main/res/drawable/kiss_people_skintone_shadow.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/app/src/main/res/drawable/kiss_woman_man_shadow_skintone.xml b/emojipicker/app/src/main/res/drawable/kiss_woman_man_shadow_skintone.xml new file mode 100644 index 00000000..11831237 --- /dev/null +++ b/emojipicker/app/src/main/res/drawable/kiss_woman_man_shadow_skintone.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/app/src/main/res/drawable/kiss_woman_man_skintone_shadow.xml b/emojipicker/app/src/main/res/drawable/kiss_woman_man_skintone_shadow.xml new file mode 100644 index 00000000..5ded1f96 --- /dev/null +++ b/emojipicker/app/src/main/res/drawable/kiss_woman_man_skintone_shadow.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/app/src/main/res/drawable/kiss_women_shadow_skintone.xml b/emojipicker/app/src/main/res/drawable/kiss_women_shadow_skintone.xml new file mode 100644 index 00000000..555d28cd --- /dev/null +++ b/emojipicker/app/src/main/res/drawable/kiss_women_shadow_skintone.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/app/src/main/res/drawable/kiss_women_skintone_shadow.xml b/emojipicker/app/src/main/res/drawable/kiss_women_skintone_shadow.xml new file mode 100644 index 00000000..61d91624 --- /dev/null +++ b/emojipicker/app/src/main/res/drawable/kiss_women_skintone_shadow.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/app/src/main/res/drawable/popup_view_rounded_background.xml b/emojipicker/app/src/main/res/drawable/popup_view_rounded_background.xml new file mode 100644 index 00000000..7ed98b76 --- /dev/null +++ b/emojipicker/app/src/main/res/drawable/popup_view_rounded_background.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/emojipicker/app/src/main/res/drawable/quantum_gm_ic_access_time_filled_vd_theme_24.xml b/emojipicker/app/src/main/res/drawable/quantum_gm_ic_access_time_filled_vd_theme_24.xml new file mode 100644 index 00000000..57e65b17 --- /dev/null +++ b/emojipicker/app/src/main/res/drawable/quantum_gm_ic_access_time_filled_vd_theme_24.xml @@ -0,0 +1,12 @@ + + + + + diff --git a/emojipicker/app/src/main/res/drawable/ripple_emoji_view.xml b/emojipicker/app/src/main/res/drawable/ripple_emoji_view.xml new file mode 100644 index 00000000..9748a72e --- /dev/null +++ b/emojipicker/app/src/main/res/drawable/ripple_emoji_view.xml @@ -0,0 +1,11 @@ + + + + + + + + + + \ No newline at end of file diff --git a/emojipicker/app/src/main/res/drawable/ripple_image_view.xml b/emojipicker/app/src/main/res/drawable/ripple_image_view.xml new file mode 100644 index 00000000..4c0c3a46 --- /dev/null +++ b/emojipicker/app/src/main/res/drawable/ripple_image_view.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/app/src/main/res/drawable/swap_horiz_vd_theme_24.xml b/emojipicker/app/src/main/res/drawable/swap_horiz_vd_theme_24.xml new file mode 100644 index 00000000..e3684d49 --- /dev/null +++ b/emojipicker/app/src/main/res/drawable/swap_horiz_vd_theme_24.xml @@ -0,0 +1,26 @@ + + + + + diff --git a/emojipicker/app/src/main/res/drawable/underline_rounded.xml b/emojipicker/app/src/main/res/drawable/underline_rounded.xml new file mode 100644 index 00000000..6621ad5a --- /dev/null +++ b/emojipicker/app/src/main/res/drawable/underline_rounded.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/emojipicker/app/src/main/res/drawable/variant_availability_indicator.xml b/emojipicker/app/src/main/res/drawable/variant_availability_indicator.xml new file mode 100644 index 00000000..3df2ec1e --- /dev/null +++ b/emojipicker/app/src/main/res/drawable/variant_availability_indicator.xml @@ -0,0 +1,12 @@ + + + + + \ No newline at end of file diff --git a/emojipicker/app/src/main/res/layout/category_text_view.xml b/emojipicker/app/src/main/res/layout/category_text_view.xml new file mode 100644 index 00000000..f1f8ac43 --- /dev/null +++ b/emojipicker/app/src/main/res/layout/category_text_view.xml @@ -0,0 +1,21 @@ + + + + + + diff --git a/emojipicker/app/src/main/res/layout/emoji_picker.xml b/emojipicker/app/src/main/res/layout/emoji_picker.xml new file mode 100644 index 00000000..62739a18 --- /dev/null +++ b/emojipicker/app/src/main/res/layout/emoji_picker.xml @@ -0,0 +1,19 @@ + + + + + + + + diff --git a/emojipicker/app/src/main/res/layout/emoji_picker_popup_bidirectional.xml b/emojipicker/app/src/main/res/layout/emoji_picker_popup_bidirectional.xml new file mode 100644 index 00000000..be0c3df7 --- /dev/null +++ b/emojipicker/app/src/main/res/layout/emoji_picker_popup_bidirectional.xml @@ -0,0 +1,26 @@ + + + diff --git a/emojipicker/app/src/main/res/layout/emoji_picker_popup_emoji_view.xml b/emojipicker/app/src/main/res/layout/emoji_picker_popup_emoji_view.xml new file mode 100644 index 00000000..d50dd939 --- /dev/null +++ b/emojipicker/app/src/main/res/layout/emoji_picker_popup_emoji_view.xml @@ -0,0 +1,32 @@ + + + + + + diff --git a/emojipicker/app/src/main/res/layout/emoji_picker_popup_image_view.xml b/emojipicker/app/src/main/res/layout/emoji_picker_popup_image_view.xml new file mode 100644 index 00000000..da10bf12 --- /dev/null +++ b/emojipicker/app/src/main/res/layout/emoji_picker_popup_image_view.xml @@ -0,0 +1,27 @@ + + + + diff --git a/emojipicker/app/src/main/res/layout/empty_category_text_view.xml b/emojipicker/app/src/main/res/layout/empty_category_text_view.xml new file mode 100644 index 00000000..b85ec8fa --- /dev/null +++ b/emojipicker/app/src/main/res/layout/empty_category_text_view.xml @@ -0,0 +1,11 @@ + + + diff --git a/emojipicker/app/src/main/res/layout/header_icon_holder.xml b/emojipicker/app/src/main/res/layout/header_icon_holder.xml new file mode 100644 index 00000000..d878bafa --- /dev/null +++ b/emojipicker/app/src/main/res/layout/header_icon_holder.xml @@ -0,0 +1,24 @@ + + + + + + + diff --git a/emojipicker/app/src/main/res/layout/variant_popup.xml b/emojipicker/app/src/main/res/layout/variant_popup.xml new file mode 100644 index 00000000..791a98ba --- /dev/null +++ b/emojipicker/app/src/main/res/layout/variant_popup.xml @@ -0,0 +1,13 @@ + + + + \ No newline at end of file diff --git a/emojipicker/app/src/main/res/raw/emoji_category_activity.csv b/emojipicker/app/src/main/res/raw/emoji_category_activity.csv new file mode 100644 index 00000000..ff009b32 --- /dev/null +++ b/emojipicker/app/src/main/res/raw/emoji_category_activity.csv @@ -0,0 +1,115 @@ +🎉 +🎊 +🎈 +🎂 +🎀 +🎁 +🎇 +🎆 +🧨 +🧧 +🪔 +🪅 +🪩 +🎐 +🎏 +🎎 +🎑 +🎍 +🎋 +🎄 +🎃 +🎗️ +🥇 +🥈 +🥉 +🏅 +🎖️ +🏆 +📢 +⚽ +⚾ +🥎 +🏀 +🏐 +🏈 +🏉 +🥅 +🎾 +🏸 +🥍 +🏏 +🏑 +🏒 +🥌 +🛷 +🎿 +⛸️ +🛼 +🩰 +🛹 +⛳ +🎯 +🏹 +🥏 +🪃 +🪁 +🎣 +🤿 +🩱 +🎽 +🥋 +🥊 +🎱 +🏓 +🎳 +♟️ +🪀 +🧩 +🎮 +🕹️ +👾 +🔫 +🎲 +🎰 +🎴 +🀄 +🃏 +🪄 +🎩 +📷 +📸 +🖼️ +🎨 +🖌️ +🖍️ +🪡 +🧵 +🧶 +🎹 +🎷 +🎺 +🎸 +🪕 +🎻 +🪘 +🥁 +🪇 +🪈 +🪗 +🎤 +🎧 +🎚️ +🎛️ +🎙️ +📻 +📺 +📼 +📹 +📽️ +🎥 +🎞️ +🎬 +🎭 +🎫 +🎟️ diff --git a/emojipicker/app/src/main/res/raw/emoji_category_animals_nature.csv b/emojipicker/app/src/main/res/raw/emoji_category_animals_nature.csv new file mode 100644 index 00000000..40a39944 --- /dev/null +++ b/emojipicker/app/src/main/res/raw/emoji_category_animals_nature.csv @@ -0,0 +1,223 @@ +💐 +🌹 +🥀 +🌺 +🌷 +🪷 +🌸 +💮 +🏵️ +🪻 +🌻 +🌼 +🍂 +🍁 +🍄 +🌾 +🌱 +🌿 +🍃 +☘️ +🍀 +🪴 +🌵 +🌴 +🌳 +🌲 +🪵 +🪹 +🪺 +🪨 +⛰️ +🏔️ +❄️ +☃️ +⛄ +🌫️ +🌡️ +🔥 +🌋 +🏜️ +🏞️ +🏝️ +🏖️ +🌅 +🌄 +🌈 +🫧 +🌊 +🌬️ +🌀 +🌪️ +⚡ +☔ +💧 +☁️ +🌨️ +🌧️ +🌩️ +⛈️ +🌦️ +🌥️ +⛅ +🌤️ +☀️ +🌞 +🌝 +🌚 +🌜 +🌛 +⭐ +🌟 +✨ +💫 +🌙 +☄️ +🕳️ +🌠 +🌌 +🌍 +🌎 +🌏 +🪐 +🌑 +🌒 +🌓 +🌔 +🌕 +🌖 +🌗 +🌘 +🙈 +🙉 +🙊 +🐵 +🦁 +🐯 +🐱 +🐶 +🐺 +🐻 +🐻‍❄️ +🐨 +🐼 +🐹 +🐭 +🐰 +🦊 +🦝 +🐮 +🐷 +🐽 +🐗 +🦓 +🦄 +🐴 +🫎 +🐲 +🦎 +🐉 +🦖 +🦕 +🐢 +🐊 +🐍 +🐸 +🐇 +🐁 +🐀 +🐈 +🐈‍⬛ +🐩 +🐕 +🦮 +🐕‍🦺 +🐖 +🐎 +🫏 +🐄 +🐂 +🐃 +🦬 +🐏 +🐑 +🐐 +🦌 +🦙 +🦥 +🦘 +🐘 +🦣 +🦏 +🦛 +🦒 +🐆 +🐅 +🐒 +🦍 +🦧 +🐪 +🐫 +🐿️ +🦫 +🦨 +🦡 +🦔 +🦦 +🦇 +🪽 +🪶 +🐦 +🐦‍⬛ +🐓 +🐔 +🐣 +🐤 +🐥 +🦅 +🦉 +🦜 +🕊️ +🦤 +🦢 +🦆 +🪿 +🦩 +🦚 +🐦‍🔥 +🦃 +🐧 +🦭 +🦈 +🐬 +🐋 +🐳 +🐟 +🐠 +🐡 +🦐 +🦞 +🦀 +🦑 +🐙 +🪼 +🦪 +🪸 +🦂 +🕷️ +🕸️ +🐚 +🐌 +🐜 +🦗 +🪲 +🦟 +🪳 +🪰 +🐝 +🐞 +🦋 +🐛 +🪱 +🦠 +🐾 diff --git a/emojipicker/app/src/main/res/raw/emoji_category_emotions.csv b/emojipicker/app/src/main/res/raw/emoji_category_emotions.csv new file mode 100644 index 00000000..176daa67 --- /dev/null +++ b/emojipicker/app/src/main/res/raw/emoji_category_emotions.csv @@ -0,0 +1,242 @@ +😀 +😃 +😄 +😁 +😆 +😅 +😂 +🤣 +😭 +😉 +😗 +😙 +😚 +😘 +🥰 +😍 +🤩 +🥳 +🫠 +🙃 +🙂 +🥲 +🥹 +😊 +☺️ +😌 +🙂‍↕️ +🙂‍↔️ +😏 +🤤 +😋 +😛 +😝 +😜 +🤪 +🥴 +😔 +🥺 +😬 +😑 +😐 +😶 +😶‍🌫️ +🫥 +🤐 +🫡 +🤔 +🤫 +🫢 +🤭 +🥱 +🤗 +🫣 +😱 +🤨 +🧐 +😒 +🙄 +😮‍💨 +😤 +😠 +😡 +🤬 +😞 +😓 +😟 +😥 +😢 +☹️ +🙁 +🫤 +😕 +😰 +😨 +😧 +😦 +😮 +😯 +😲 +😳 +🤯 +😖 +😣 +😩 +😫 +😵 +😵‍💫 +🫨 +🥶 +🥵 +🤢 +🤮 +😴 +😪 +🤧 +🤒 +🤕 +😷 +🤥 +😇 +🤠 +🤑 +🤓 +😎 +🥸 +🤡 +😈 +👿 +👻 +💀 +☠️ +👹 +👺 +🎃 +💩 +🤖 +👽 +👾 +🌚 +🌝 +🌞 +🌛 +🌜 +🙈 +🙉 +🙊 +😺 +😸 +😹 +😻 +😼 +😽 +🙀 +😿 +😾 +💫 +⭐ +🌟 +✨ +💥 +💨 +💦 +💤 +🕳️ +🔥 +💯 +🎉 +❤️ +🧡 +💛 +💚 +🩵 +💙 +💜 +🤎 +🖤 +🩶 +🤍 +🩷 +💘 +💝 +💖 +💗 +💓 +💞 +💕 +💌 +💟 +♥️ +❣️ +❤️‍🩹 +💔 +❤️‍🔥 +💋 +🫂 +👥 +👤 +🗣️ +👣 +🧠 +🫀 +🫁 +🩸 +🦠 +🦷 +🦴 +👀 +👁️ +👄 +🫦 +👅 +👃,👃,👃🏻,👃🏼,👃🏽,👃🏾,👃🏿 +👂,👂,👂🏻,👂🏼,👂🏽,👂🏾,👂🏿 +🦻,🦻,🦻🏻,🦻🏼,🦻🏽,🦻🏾,🦻🏿 +🦶,🦶,🦶🏻,🦶🏼,🦶🏽,🦶🏾,🦶🏿 +🦵,🦵,🦵🏻,🦵🏼,🦵🏽,🦵🏾,🦵🏿 +🦿 +🦾 +💪,💪,💪🏻,💪🏼,💪🏽,💪🏾,💪🏿 +👏,👏,👏🏻,👏🏼,👏🏽,👏🏾,👏🏿 +👍,👍,👍🏻,👍🏼,👍🏽,👍🏾,👍🏿 +👎,👎,👎🏻,👎🏼,👎🏽,👎🏾,👎🏿 +🫶,🫶,🫶🏻,🫶🏼,🫶🏽,🫶🏾,🫶🏿 +🙌,🙌,🙌🏻,🙌🏼,🙌🏽,🙌🏾,🙌🏿 +👐,👐,👐🏻,👐🏼,👐🏽,👐🏾,👐🏿 +🤲,🤲,🤲🏻,🤲🏼,🤲🏽,🤲🏾,🤲🏿 +🤜,🤜,🤜🏻,🤜🏼,🤜🏽,🤜🏾,🤜🏿 +🤛,🤛,🤛🏻,🤛🏼,🤛🏽,🤛🏾,🤛🏿 +✊,✊,✊🏻,✊🏼,✊🏽,✊🏾,✊🏿 +👊,👊,👊🏻,👊🏼,👊🏽,👊🏾,👊🏿 +🫳,🫳,🫳🏻,🫳🏼,🫳🏽,🫳🏾,🫳🏿 +🫴,🫴,🫴🏻,🫴🏼,🫴🏽,🫴🏾,🫴🏿 +🫱,🫱,🫱🏻,🫱🏼,🫱🏽,🫱🏾,🫱🏿 +🫲,🫲,🫲🏻,🫲🏼,🫲🏽,🫲🏾,🫲🏿 +🫸,🫸,🫸🏻,🫸🏼,🫸🏽,🫸🏾,🫸🏿 +🫷,🫷,🫷🏻,🫷🏼,🫷🏽,🫷🏾,🫷🏿 +👋,👋,👋🏻,👋🏼,👋🏽,👋🏾,👋🏿 +🤚,🤚,🤚🏻,🤚🏼,🤚🏽,🤚🏾,🤚🏿 +🖐️,🖐️,🖐🏻,🖐🏼,🖐🏽,🖐🏾,🖐🏿 +✋,✋,✋🏻,✋🏼,✋🏽,✋🏾,✋🏿 +🖖,🖖,🖖🏻,🖖🏼,🖖🏽,🖖🏾,🖖🏿 +🤟,🤟,🤟🏻,🤟🏼,🤟🏽,🤟🏾,🤟🏿 +🤘,🤘,🤘🏻,🤘🏼,🤘🏽,🤘🏾,🤘🏿 +✌️,✌️,✌🏻,✌🏼,✌🏽,✌🏾,✌🏿 +🤞,🤞,🤞🏻,🤞🏼,🤞🏽,🤞🏾,🤞🏿 +🫰,🫰,🫰🏻,🫰🏼,🫰🏽,🫰🏾,🫰🏿 +🤙,🤙,🤙🏻,🤙🏼,🤙🏽,🤙🏾,🤙🏿 +🤌,🤌,🤌🏻,🤌🏼,🤌🏽,🤌🏾,🤌🏿 +🤏,🤏,🤏🏻,🤏🏼,🤏🏽,🤏🏾,🤏🏿 +👌,👌,👌🏻,👌🏼,👌🏽,👌🏾,👌🏿 +🫵,🫵,🫵🏻,🫵🏼,🫵🏽,🫵🏾,🫵🏿 +👉,👉,👉🏻,👉🏼,👉🏽,👉🏾,👉🏿 +👈,👈,👈🏻,👈🏼,👈🏽,👈🏾,👈🏿 +☝️,☝️,☝🏻,☝🏼,☝🏽,☝🏾,☝🏿 +👆,👆,👆🏻,👆🏼,👆🏽,👆🏾,👆🏿 +👇,👇,👇🏻,👇🏼,👇🏽,👇🏾,👇🏿 +🖕,🖕,🖕🏻,🖕🏼,🖕🏽,🖕🏾,🖕🏿 +✍️,✍️,✍🏻,✍🏼,✍🏽,✍🏾,✍🏿 +🤳,🤳,🤳🏻,🤳🏼,🤳🏽,🤳🏾,🤳🏿 +🙏,🙏,🙏🏻,🙏🏼,🙏🏽,🙏🏾,🙏🏿 +💅,💅,💅🏻,💅🏼,💅🏽,💅🏾,💅🏿 +🤝,🤝,🤝🏻,🫱🏻‍🫲🏼,🫱🏻‍🫲🏽,🫱🏻‍🫲🏾,🫱🏻‍🫲🏿,🫱🏼‍🫲🏻,🤝🏼,🫱🏼‍🫲🏽,🫱🏼‍🫲🏾,🫱🏼‍🫲🏿,🫱🏽‍🫲🏻,🫱🏽‍🫲🏼,🤝🏽,🫱🏽‍🫲🏾,🫱🏽‍🫲🏿,🫱🏾‍🫲🏻,🫱🏾‍🫲🏼,🫱🏾‍🫲🏽,🤝🏾,🫱🏾‍🫲🏿,🫱🏿‍🫲🏻,🫱🏿‍🫲🏼,🫱🏿‍🫲🏽,🫱🏿‍🫲🏾,🤝🏿 diff --git a/emojipicker/app/src/main/res/raw/emoji_category_flags.csv b/emojipicker/app/src/main/res/raw/emoji_category_flags.csv new file mode 100644 index 00000000..c8fd0c06 --- /dev/null +++ b/emojipicker/app/src/main/res/raw/emoji_category_flags.csv @@ -0,0 +1,269 @@ +🏁 +🚩 +🎌 +🏴 +🏳️ +🏳️‍🌈 +🏳️‍⚧️ +🏴‍☠️ +🇦🇨 +🇦🇩 +🇦🇪 +🇦🇫 +🇦🇬 +🇦🇮 +🇦🇱 +🇦🇲 +🇦🇴 +🇦🇶 +🇦🇷 +🇦🇸 +🇦🇹 +🇦🇺 +🇦🇼 +🇦🇽 +🇦🇿 +🇧🇦 +🇧🇧 +🇧🇩 +🇧🇪 +🇧🇫 +🇧🇬 +🇧🇭 +🇧🇮 +🇧🇯 +🇧🇱 +🇧🇲 +🇧🇳 +🇧🇴 +🇧🇶 +🇧🇷 +🇧🇸 +🇧🇹 +🇧🇻 +🇧🇼 +🇧🇾 +🇧🇿 +🇨🇦 +🇨🇨 +🇨🇩 +🇨🇫 +🇨🇬 +🇨🇭 +🇨🇮 +🇨🇰 +🇨🇱 +🇨🇲 +🇨🇳 +🇨🇴 +🇨🇵 +🇨🇷 +🇨🇺 +🇨🇻 +🇨🇼 +🇨🇽 +🇨🇾 +🇨🇿 +🇩🇪 +🇩🇬 +🇩🇯 +🇩🇰 +🇩🇲 +🇩🇴 +🇩🇿 +🇪🇦 +🇪🇨 +🇪🇪 +🇪🇬 +🇪🇭 +🇪🇷 +🇪🇸 +🇪🇹 +🇪🇺 +🇫🇮 +🇫🇯 +🇫🇰 +🇫🇲 +🇫🇴 +🇫🇷 +🇬🇦 +🇬🇧 +🇬🇩 +🇬🇪 +🇬🇫 +🇬🇬 +🇬🇭 +🇬🇮 +🇬🇱 +🇬🇲 +🇬🇳 +🇬🇵 +🇬🇶 +🇬🇷 +🇬🇸 +🇬🇹 +🇬🇺 +🇬🇼 +🇬🇾 +🇭🇰 +🇭🇲 +🇭🇳 +🇭🇷 +🇭🇹 +🇭🇺 +🇮🇨 +🇮🇩 +🇮🇪 +🇮🇱 +🇮🇲 +🇮🇳 +🇮🇴 +🇮🇶 +🇮🇷 +🇮🇸 +🇮🇹 +🇯🇪 +🇯🇲 +🇯🇴 +🇯🇵 +🇰🇪 +🇰🇬 +🇰🇭 +🇰🇮 +🇰🇲 +🇰🇳 +🇰🇵 +🇰🇷 +🇰🇼 +🇰🇾 +🇰🇿 +🇱🇦 +🇱🇧 +🇱🇨 +🇱🇮 +🇱🇰 +🇱🇷 +🇱🇸 +🇱🇹 +🇱🇺 +🇱🇻 +🇱🇾 +🇲🇦 +🇲🇨 +🇲🇩 +🇲🇪 +🇲🇫 +🇲🇬 +🇲🇭 +🇲🇰 +🇲🇱 +🇲🇲 +🇲🇳 +🇲🇴 +🇲🇵 +🇲🇶 +🇲🇷 +🇲🇸 +🇲🇹 +🇲🇺 +🇲🇻 +🇲🇼 +🇲🇽 +🇲🇾 +🇲🇿 +🇳🇦 +🇳🇨 +🇳🇪 +🇳🇫 +🇳🇬 +🇳🇮 +🇳🇱 +🇳🇴 +🇳🇵 +🇳🇷 +🇳🇺 +🇳🇿 +🇴🇲 +🇵🇦 +🇵🇪 +🇵🇫 +🇵🇬 +🇵🇭 +🇵🇰 +🇵🇱 +🇵🇲 +🇵🇳 +🇵🇷 +🇵🇸 +🇵🇹 +🇵🇼 +🇵🇾 +🇶🇦 +🇷🇪 +🇷🇴 +🇷🇸 +🇷🇺 +🇷🇼 +🇸🇦 +🇸🇧 +🇸🇨 +🇸🇩 +🇸🇪 +🇸🇬 +🇸🇭 +🇸🇮 +🇸🇯 +🇸🇰 +🇸🇱 +🇸🇲 +🇸🇳 +🇸🇴 +🇸🇷 +🇸🇸 +🇸🇹 +🇸🇻 +🇸🇽 +🇸🇾 +🇸🇿 +🇹🇦 +🇹🇨 +🇹🇩 +🇹🇫 +🇹🇬 +🇹🇭 +🇹🇯 +🇹🇰 +🇹🇱 +🇹🇲 +🇹🇳 +🇹🇴 +🇹🇷 +🇹🇹 +🇹🇻 +🇹🇼 +🇹🇿 +🇺🇦 +🇺🇬 +🇺🇲 +🇺🇳 +🇺🇸 +🇺🇾 +🇺🇿 +🇻🇦 +🇻🇨 +🇻🇪 +🇻🇬 +🇻🇮 +🇻🇳 +🇻🇺 +🇼🇫 +🇼🇸 +🇽🇰 +🇾🇪 +🇾🇹 +🇿🇦 +🇿🇲 +🇿🇼 +🏴󠁧󠁢󠁥󠁮󠁧󠁿 +🏴󠁧󠁢󠁳󠁣󠁴󠁿 +🏴󠁧󠁢󠁷󠁬󠁳󠁿 diff --git a/emojipicker/app/src/main/res/raw/emoji_category_food_drink.csv b/emojipicker/app/src/main/res/raw/emoji_category_food_drink.csv new file mode 100644 index 00000000..8a15f1e4 --- /dev/null +++ b/emojipicker/app/src/main/res/raw/emoji_category_food_drink.csv @@ -0,0 +1,131 @@ +🍓 +🍒 +🍎 +🍉 +🍑 +🍊 +🥭 +🍍 +🍌 +🍋 +🍋‍🟩 +🍈 +🍏 +🍐 +🥝 +🫒 +🫐 +🍇 +🥥 +🍅 +🌶️ +🫚 +🥕 +🧅 +🌽 +🥦 +🥒 +🥬 +🫛 +🫑 +🥑 +🍠 +🍆 +🧄 +🥔 +🍄‍🟫 +🫘 +🌰 +🥜 +🍞 +🫓 +🥐 +🥖 +🥯 +🧇 +🥞 +🍳 +🥚 +🧀 +🥓 +🥩 +🍗 +🍖 +🍔 +🌭 +🥪 +🥨 +🍟 +🍕 +🫔 +🌮 +🌯 +🥙 +🧆 +🥘 +🍝 +🥫 +🫕 +🥣 +🥗 +🍲 +🍛 +🍜 +🦪 +🦞 +🍣 +🍤 +🥡 +🍚 +🍱 +🥟 +🍢 +🍙 +🍘 +🍥 +🍡 +🥠 +🥮 +🍧 +🍨 +🍦 +🥧 +🍰 +🍮 +🎂 +🧁 +🍭 +🍬 +🍫 +🍩 +🍪 +🍯 +🧂 +🧈 +🍿 +🧊 +🫙 +🥤 +🧋 +🧃 +🥛 +🍼 +🍵 +☕ +🫖 +🧉 +🍺 +🍻 +🥂 +🍾 +🍷 +🥃 +🫗 +🍸 +🍹 +🍶 +🥢 +🍴 +🥄 +🔪 +🍽️ diff --git a/emojipicker/app/src/main/res/raw/emoji_category_objects.csv b/emojipicker/app/src/main/res/raw/emoji_category_objects.csv new file mode 100644 index 00000000..32c4a4fc --- /dev/null +++ b/emojipicker/app/src/main/res/raw/emoji_category_objects.csv @@ -0,0 +1,265 @@ +📱 +☎️ +📞 +📟 +📠 +🔌 +🔋 +🪫 +🖲️ +💽 +💾 +💿 +📀 +🖥️ +💻 +⌨️ +🖨️ +🖱️ +🪙 +💸 +💵 +💴 +💶 +💷 +💳 +💰 +🧾 +🧮 +⚖️ +🛒 +🛍️ +🕯️ +💡 +🔦 +🏮 +🧱 +🪟 +🪞 +🚪 +🪑 +🛏️ +🛋️ +🚿 +🛁 +🚽 +🧻 +🪠 +🧸 +🪆 +🧷 +🪢 +🧹 +🧴 +🧽 +🧼 +🪥 +🪒 +🪮 +🧺 +🧦 +🧤 +🧣 +👖 +👕 +🎽 +👚 +👔 +👗 +👘 +🥻 +🩱 +👙 +🩳 +🩲 +🧥 +🥼 +🦺 +⛑️ +🪖 +🎓 +🎩 +👒 +🧢 +👑 +🪭 +🎒 +👝 +👛 +👜 +💼 +🧳 +☂️ +🌂 +💍 +💎 +💄 +👠 +👟 +👞 +🥿 +🩴 +👡 +👢 +🥾 +🦯 +🕶️ +👓 +🥽 +⚗️ +🧫 +🧪 +🌡️ +💉 +💊 +🩹 +🩺 +🩻 +🧬 +🔭 +🔬 +📡 +🛰️ +🧯 +🪓 +🪜 +🪣 +🪝 +🧲 +🧰 +🗜️ +🔩 +🪛 +🪚 +🔧 +🔨 +⚒️ +🛠️ +⛏️ +⚙️ +⛓️‍💥 +🔗 +⛓️ +📎 +🖇️ +📏 +📐 +🖌️ +🖍️ +🖊️ +🖋️ +✒️ +✏️ +📝 +📖 +📚 +📒 +📔 +📕 +📓 +📗 +📘 +📙 +🔖 +🗒️ +📄 +📃 +📋 +📑 +📂 +📁 +🗂️ +🗃️ +🗄️ +📊 +📈 +📉 +📇 +🪪 +📌 +📍 +✂️ +🗑️ +📰 +🗞️ +🏷️ +📦 +📫 +📪 +📬 +📭 +📮 +✉️ +📧 +📩 +📨 +💌 +📤 +📥 +🗳️ +🕛 +🕧 +🕐 +🕜 +🕑 +🕝 +🕒 +🕞 +🕓 +🕟 +🕔 +🕠 +🕕 +🕡 +🕖 +🕢 +🕗 +🕣 +🕘 +🕤 +🕙 +🕥 +🕚 +🕦 +⏱️ +⌚ +🕰️ +⌛ +⏳ +⏲️ +⏰ +📅 +📆 +🗓️ +🪧 +🛎️ +🔔 +📯 +📢 +📣 +🔈 +🔉 +🔊 +🔍 +🔎 +🔮 +🧿 +🪬 +📿 +🏺 +⚱️ +⚰️ +🪦 +🚬 +💣 +🪤 +📜 +⚔️ +🗡️ +🛡️ +🗝️ +🔑 +🔐 +🔏 +🔒 +🔓 diff --git a/emojipicker/app/src/main/res/raw/emoji_category_people.csv b/emojipicker/app/src/main/res/raw/emoji_category_people.csv new file mode 100644 index 00000000..f6e06f6a --- /dev/null +++ b/emojipicker/app/src/main/res/raw/emoji_category_people.csv @@ -0,0 +1,151 @@ +🙇,🙇‍♀️,🙇🏻‍♀️,🙇🏼‍♀️,🙇🏽‍♀️,🙇🏾‍♀️,🙇🏿‍♀️,🙇‍♂️,🙇🏻‍♂️,🙇🏼‍♂️,🙇🏽‍♂️,🙇🏾‍♂️,🙇🏿‍♂️ +🙋,🙋‍♀️,🙋🏻‍♀️,🙋🏼‍♀️,🙋🏽‍♀️,🙋🏾‍♀️,🙋🏿‍♀️,🙋‍♂️,🙋🏻‍♂️,🙋🏼‍♂️,🙋🏽‍♂️,🙋🏾‍♂️,🙋🏿‍♂️ +💁,💁‍♀️,💁🏻‍♀️,💁🏼‍♀️,💁🏽‍♀️,💁🏾‍♀️,💁🏿‍♀️,💁‍♂️,💁🏻‍♂️,💁🏼‍♂️,💁🏽‍♂️,💁🏾‍♂️,💁🏿‍♂️ +🙆,🙆‍♀️,🙆🏻‍♀️,🙆🏼‍♀️,🙆🏽‍♀️,🙆🏾‍♀️,🙆🏿‍♀️,🙆‍♂️,🙆🏻‍♂️,🙆🏼‍♂️,🙆🏽‍♂️,🙆🏾‍♂️,🙆🏿‍♂️ +🙅,🙅‍♀️,🙅🏻‍♀️,🙅🏼‍♀️,🙅🏽‍♀️,🙅🏾‍♀️,🙅🏿‍♀️,🙅‍♂️,🙅🏻‍♂️,🙅🏼‍♂️,🙅🏽‍♂️,🙅🏾‍♂️,🙅🏿‍♂️ +🤷,🤷‍♀️,🤷🏻‍♀️,🤷🏼‍♀️,🤷🏽‍♀️,🤷🏾‍♀️,🤷🏿‍♀️,🤷‍♂️,🤷🏻‍♂️,🤷🏼‍♂️,🤷🏽‍♂️,🤷🏾‍♂️,🤷🏿‍♂️ +🤦,🤦‍♀️,🤦🏻‍♀️,🤦🏼‍♀️,🤦🏽‍♀️,🤦🏾‍♀️,🤦🏿‍♀️,🤦‍♂️,🤦🏻‍♂️,🤦🏼‍♂️,🤦🏽‍♂️,🤦🏾‍♂️,🤦🏿‍♂️ +🙍,🙍‍♀️,🙍🏻‍♀️,🙍🏼‍♀️,🙍🏽‍♀️,🙍🏾‍♀️,🙍🏿‍♀️,🙍‍♂️,🙍🏻‍♂️,🙍🏼‍♂️,🙍🏽‍♂️,🙍🏾‍♂️,🙍🏿‍♂️ +🙎,🙎‍♀️,🙎🏻‍♀️,🙎🏼‍♀️,🙎🏽‍♀️,🙎🏾‍♀️,🙎🏿‍♀️,🙎‍♂️,🙎🏻‍♂️,🙎🏼‍♂️,🙎🏽‍♂️,🙎🏾‍♂️,🙎🏿‍♂️ +🧏,🧏‍♀️,🧏🏻‍♀️,🧏🏼‍♀️,🧏🏽‍♀️,🧏🏾‍♀️,🧏🏿‍♀️,🧏‍♂️,🧏🏻‍♂️,🧏🏼‍♂️,🧏🏽‍♂️,🧏🏾‍♂️,🧏🏿‍♂️ +💆,💆‍♀️,💆🏻‍♀️,💆🏼‍♀️,💆🏽‍♀️,💆🏾‍♀️,💆🏿‍♀️,💆‍♂️,💆🏻‍♂️,💆🏼‍♂️,💆🏽‍♂️,💆🏾‍♂️,💆🏿‍♂️ +💇,💇‍♀️,💇🏻‍♀️,💇🏼‍♀️,💇🏽‍♀️,💇🏾‍♀️,💇🏿‍♀️,💇‍♂️,💇🏻‍♂️,💇🏼‍♂️,💇🏽‍♂️,💇🏾‍♂️,💇🏿‍♂️ +🧖,🧖‍♀️,🧖🏻‍♀️,🧖🏼‍♀️,🧖🏽‍♀️,🧖🏾‍♀️,🧖🏿‍♀️,🧖‍♂️,🧖🏻‍♂️,🧖🏼‍♂️,🧖🏽‍♂️,🧖🏾‍♂️,🧖🏿‍♂️ +🛀,🛀,🛀🏻,🛀🏼,🛀🏽,🛀🏾,🛀🏿 +🛌,🛌,🛌🏻,🛌🏼,🛌🏽,🛌🏾,🛌🏿 +🧘,🧘‍♀️,🧘🏻‍♀️,🧘🏼‍♀️,🧘🏽‍♀️,🧘🏾‍♀️,🧘🏿‍♀️,🧘‍♂️,🧘🏻‍♂️,🧘🏼‍♂️,🧘🏽‍♂️,🧘🏾‍♂️,🧘🏿‍♂️ +👨‍🦯,👨‍🦯,👨🏻‍🦯,👨🏼‍🦯,👨🏽‍🦯,👨🏾‍🦯,👨🏿‍🦯 +👩‍🦯,👩‍🦯,👩🏻‍🦯,👩🏼‍🦯,👩🏽‍🦯,👩🏾‍🦯,👩🏿‍🦯 +👨‍🦼,👨‍🦼,👨🏻‍🦼,👨🏼‍🦼,👨🏽‍🦼,👨🏾‍🦼,👨🏿‍🦼 +👩‍🦼,👩‍🦼,👩🏻‍🦼,👩🏼‍🦼,👩🏽‍🦼,👩🏾‍🦼,👩🏿‍🦼 +👨‍🦽,👨‍🦽,👨🏻‍🦽,👨🏼‍🦽,👨🏽‍🦽,👨🏾‍🦽,👨🏿‍🦽 +👩‍🦽,👩‍🦽,👩🏻‍🦽,👩🏼‍🦽,👩🏽‍🦽,👩🏾‍🦽,👩🏿‍🦽 +🧎,🧎‍♀️,🧎🏻‍♀️,🧎🏼‍♀️,🧎🏽‍♀️,🧎🏾‍♀️,🧎🏿‍♀️,🧎‍♂️,🧎🏻‍♂️,🧎🏼‍♂️,🧎🏽‍♂️,🧎🏾‍♂️,🧎🏿‍♂️ +🧍,🧍‍♀️,🧍🏻‍♀️,🧍🏼‍♀️,🧍🏽‍♀️,🧍🏾‍♀️,🧍🏿‍♀️,🧍‍♂️,🧍🏻‍♂️,🧍🏼‍♂️,🧍🏽‍♂️,🧍🏾‍♂️,🧍🏿‍♂️ +🚶,🚶‍♀️,🚶🏻‍♀️,🚶🏼‍♀️,🚶🏽‍♀️,🚶🏾‍♀️,🚶🏿‍♀️,🚶‍♂️,🚶🏻‍♂️,🚶🏼‍♂️,🚶🏽‍♂️,🚶🏾‍♂️,🚶🏿‍♂️ +🏃,🏃‍♀️,🏃🏻‍♀️,🏃🏼‍♀️,🏃🏽‍♀️,🏃🏾‍♀️,🏃🏿‍♀️,🏃‍♂️,🏃🏻‍♂️,🏃🏼‍♂️,🏃🏽‍♂️,🏃🏾‍♂️,🏃🏿‍♂️ +🤸,🤸‍♀️,🤸🏻‍♀️,🤸🏼‍♀️,🤸🏽‍♀️,🤸🏾‍♀️,🤸🏿‍♀️,🤸‍♂️,🤸🏻‍♂️,🤸🏼‍♂️,🤸🏽‍♂️,🤸🏾‍♂️,🤸🏿‍♂️ +🏋️,🏋️‍♀️,🏋🏻‍♀️,🏋🏼‍♀️,🏋🏽‍♀️,🏋🏾‍♀️,🏋🏿‍♀️,🏋️‍♂️,🏋🏻‍♂️,🏋🏼‍♂️,🏋🏽‍♂️,🏋🏾‍♂️,🏋🏿‍♂️ +⛹️,⛹️‍♀️,⛹🏻‍♀️,⛹🏼‍♀️,⛹🏽‍♀️,⛹🏾‍♀️,⛹🏿‍♀️,⛹️‍♂️,⛹🏻‍♂️,⛹🏼‍♂️,⛹🏽‍♂️,⛹🏾‍♂️,⛹🏿‍♂️ +🤾,🤾‍♀️,🤾🏻‍♀️,🤾🏼‍♀️,🤾🏽‍♀️,🤾🏾‍♀️,🤾🏿‍♀️,🤾‍♂️,🤾🏻‍♂️,🤾🏼‍♂️,🤾🏽‍♂️,🤾🏾‍♂️,🤾🏿‍♂️ +🚴,🚴‍♀️,🚴🏻‍♀️,🚴🏼‍♀️,🚴🏽‍♀️,🚴🏾‍♀️,🚴🏿‍♀️,🚴‍♂️,🚴🏻‍♂️,🚴🏼‍♂️,🚴🏽‍♂️,🚴🏾‍♂️,🚴🏿‍♂️ +🚵,🚵‍♀️,🚵🏻‍♀️,🚵🏼‍♀️,🚵🏽‍♀️,🚵🏾‍♀️,🚵🏿‍♀️,🚵‍♂️,🚵🏻‍♂️,🚵🏼‍♂️,🚵🏽‍♂️,🚵🏾‍♂️,🚵🏿‍♂️ +🧗,🧗‍♀️,🧗🏻‍♀️,🧗🏼‍♀️,🧗🏽‍♀️,🧗🏾‍♀️,🧗🏿‍♀️,🧗‍♂️,🧗🏻‍♂️,🧗🏼‍♂️,🧗🏽‍♂️,🧗🏾‍♂️,🧗🏿‍♂️ +🤼,🤼‍♀️,🤼‍♂️ +🤹,🤹‍♀️,🤹🏻‍♀️,🤹🏼‍♀️,🤹🏽‍♀️,🤹🏾‍♀️,🤹🏿‍♀️,🤹‍♂️,🤹🏻‍♂️,🤹🏼‍♂️,🤹🏽‍♂️,🤹🏾‍♂️,🤹🏿‍♂️ +🏌️,🏌️‍♀️,🏌🏻‍♀️,🏌🏼‍♀️,🏌🏽‍♀️,🏌🏾‍♀️,🏌🏿‍♀️,🏌️‍♂️,🏌🏻‍♂️,🏌🏼‍♂️,🏌🏽‍♂️,🏌🏾‍♂️,🏌🏿‍♂️ +🏇,🏇,🏇🏻,🏇🏼,🏇🏽,🏇🏾,🏇🏿 +🤺 +⛷️ +🏂,🏂,🏂🏻,🏂🏼,🏂🏽,🏂🏾,🏂🏿 +🪂 +🏄,🏄‍♀️,🏄🏻‍♀️,🏄🏼‍♀️,🏄🏽‍♀️,🏄🏾‍♀️,🏄🏿‍♀️,🏄‍♂️,🏄🏻‍♂️,🏄🏼‍♂️,🏄🏽‍♂️,🏄🏾‍♂️,🏄🏿‍♂️ +🚣,🚣‍♀️,🚣🏻‍♀️,🚣🏼‍♀️,🚣🏽‍♀️,🚣🏾‍♀️,🚣🏿‍♀️,🚣‍♂️,🚣🏻‍♂️,🚣🏼‍♂️,🚣🏽‍♂️,🚣🏾‍♂️,🚣🏿‍♂️ +🏊,🏊‍♀️,🏊🏻‍♀️,🏊🏼‍♀️,🏊🏽‍♀️,🏊🏾‍♀️,🏊🏿‍♀️,🏊‍♂️,🏊🏻‍♂️,🏊🏼‍♂️,🏊🏽‍♂️,🏊🏾‍♂️,🏊🏿‍♂️ +🤽,🤽‍♀️,🤽🏻‍♀️,🤽🏼‍♀️,🤽🏽‍♀️,🤽🏾‍♀️,🤽🏿‍♀️,🤽‍♂️,🤽🏻‍♂️,🤽🏼‍♂️,🤽🏽‍♂️,🤽🏾‍♂️,🤽🏿‍♂️ +🧜,🧜‍♀️,🧜🏻‍♀️,🧜🏼‍♀️,🧜🏽‍♀️,🧜🏾‍♀️,🧜🏿‍♀️,🧜‍♂️,🧜🏻‍♂️,🧜🏼‍♂️,🧜🏽‍♂️,🧜🏾‍♂️,🧜🏿‍♂️ +🧚,🧚‍♀️,🧚🏻‍♀️,🧚🏼‍♀️,🧚🏽‍♀️,🧚🏾‍♀️,🧚🏿‍♀️,🧚‍♂️,🧚🏻‍♂️,🧚🏼‍♂️,🧚🏽‍♂️,🧚🏾‍♂️,🧚🏿‍♂️ +🧞,🧞‍♀️,🧞‍♂️ +🦸,🦸‍♀️,🦸🏻‍♀️,🦸🏼‍♀️,🦸🏽‍♀️,🦸🏾‍♀️,🦸🏿‍♀️,🦸‍♂️,🦸🏻‍♂️,🦸🏼‍♂️,🦸🏽‍♂️,🦸🏾‍♂️,🦸🏿‍♂️ +🦹,🦹‍♀️,🦹🏻‍♀️,🦹🏼‍♀️,🦹🏽‍♀️,🦹🏾‍♀️,🦹🏿‍♀️,🦹‍♂️,🦹🏻‍♂️,🦹🏼‍♂️,🦹🏽‍♂️,🦹🏾‍♂️,🦹🏿‍♂️ +🧝,🧝‍♀️,🧝🏻‍♀️,🧝🏼‍♀️,🧝🏽‍♀️,🧝🏾‍♀️,🧝🏿‍♀️,🧝‍♂️,🧝🏻‍♂️,🧝🏼‍♂️,🧝🏽‍♂️,🧝🏾‍♂️,🧝🏿‍♂️ +🧙,🧙‍♀️,🧙🏻‍♀️,🧙🏼‍♀️,🧙🏽‍♀️,🧙🏾‍♀️,🧙🏿‍♀️,🧙‍♂️,🧙🏻‍♂️,🧙🏼‍♂️,🧙🏽‍♂️,🧙🏾‍♂️,🧙🏿‍♂️ +🧟,🧟‍♀️,🧟‍♂️ +🧛,🧛‍♀️,🧛🏻‍♀️,🧛🏼‍♀️,🧛🏽‍♀️,🧛🏾‍♀️,🧛🏿‍♀️,🧛‍♂️,🧛🏻‍♂️,🧛🏼‍♂️,🧛🏽‍♂️,🧛🏾‍♂️,🧛🏿‍♂️ +👼,👼,👼🏻,👼🏼,👼🏽,👼🏾,👼🏿 +🎅,🎅,🎅🏻,🎅🏼,🎅🏽,🎅🏾,🎅🏿 +🤶,🤶,🤶🏻,🤶🏼,🤶🏽,🤶🏾,🤶🏿 +💂,💂‍♀️,💂🏻‍♀️,💂🏼‍♀️,💂🏽‍♀️,💂🏾‍♀️,💂🏿‍♀️,💂‍♂️,💂🏻‍♂️,💂🏼‍♂️,💂🏽‍♂️,💂🏾‍♂️,💂🏿‍♂️ +🤴,🤴,🤴🏻,🤴🏼,🤴🏽,🤴🏾,🤴🏿 +👸,👸,👸🏻,👸🏼,👸🏽,👸🏾,👸🏿 +🤵,🤵,🤵🏻,🤵🏼,🤵🏽,🤵🏾,🤵🏿 +👰,👰,👰🏻,👰🏼,👰🏽,👰🏾,👰🏿 +👩‍🚀,👨‍🚀,👨🏻‍🚀,👨🏼‍🚀,👨🏽‍🚀,👨🏾‍🚀,👨🏿‍🚀,👩‍🚀,👩🏻‍🚀,👩🏼‍🚀,👩🏽‍🚀,👩🏾‍🚀,👩🏿‍🚀 +👷,👷‍♀️,👷🏻‍♀️,👷🏼‍♀️,👷🏽‍♀️,👷🏾‍♀️,👷🏿‍♀️,👷‍♂️,👷🏻‍♂️,👷🏼‍♂️,👷🏽‍♂️,👷🏾‍♂️,👷🏿‍♂️ +👮,👮‍♀️,👮🏻‍♀️,👮🏼‍♀️,👮🏽‍♀️,👮🏾‍♀️,👮🏿‍♀️,👮‍♂️,👮🏻‍♂️,👮🏼‍♂️,👮🏽‍♂️,👮🏾‍♂️,👮🏿‍♂️ +🕵️,🕵️‍♀️,🕵🏻‍♀️,🕵🏼‍♀️,🕵🏽‍♀️,🕵🏾‍♀️,🕵🏿‍♀️,🕵️‍♂️,🕵🏻‍♂️,🕵🏼‍♂️,🕵🏽‍♂️,🕵🏾‍♂️,🕵🏿‍♂️ +👩‍✈️,👨‍✈️,👨🏻‍✈️,👨🏼‍✈️,👨🏽‍✈️,👨🏾‍✈️,👨🏿‍✈️,👩‍✈️,👩🏻‍✈️,👩🏼‍✈️,👩🏽‍✈️,👩🏾‍✈️,👩🏿‍✈️ +👩‍🔬,👨‍🔬,👨🏻‍🔬,👨🏼‍🔬,👨🏽‍🔬,👨🏾‍🔬,👨🏿‍🔬,👩‍🔬,👩🏻‍🔬,👩🏼‍🔬,👩🏽‍🔬,👩🏾‍🔬,👩🏿‍🔬 +👩‍⚕️,👨‍⚕️,👨🏻‍⚕️,👨🏼‍⚕️,👨🏽‍⚕️,👨🏾‍⚕️,👨🏿‍⚕️,👩‍⚕️,👩🏻‍⚕️,👩🏼‍⚕️,👩🏽‍⚕️,👩🏾‍⚕️,👩🏿‍⚕️ +👩‍🔧,👨‍🔧,👨🏻‍🔧,👨🏼‍🔧,👨🏽‍🔧,👨🏾‍🔧,👨🏿‍🔧,👩‍🔧,👩🏻‍🔧,👩🏼‍🔧,👩🏽‍🔧,👩🏾‍🔧,👩🏿‍🔧 +👩‍🏭,👨‍🏭,👨🏻‍🏭,👨🏼‍🏭,👨🏽‍🏭,👨🏾‍🏭,👨🏿‍🏭,👩‍🏭,👩🏻‍🏭,👩🏼‍🏭,👩🏽‍🏭,👩🏾‍🏭,👩🏿‍🏭 +👩‍🚒,👨‍🚒,👨🏻‍🚒,👨🏼‍🚒,👨🏽‍🚒,👨🏾‍🚒,👨🏿‍🚒,👩‍🚒,👩🏻‍🚒,👩🏼‍🚒,👩🏽‍🚒,👩🏾‍🚒,👩🏿‍🚒 +👩‍🌾,👨‍🌾,👨🏻‍🌾,👨🏼‍🌾,👨🏽‍🌾,👨🏾‍🌾,👨🏿‍🌾,👩‍🌾,👩🏻‍🌾,👩🏼‍🌾,👩🏽‍🌾,👩🏾‍🌾,👩🏿‍🌾 +👩‍🏫,👨‍🏫,👨🏻‍🏫,👨🏼‍🏫,👨🏽‍🏫,👨🏾‍🏫,👨🏿‍🏫,👩‍🏫,👩🏻‍🏫,👩🏼‍🏫,👩🏽‍🏫,👩🏾‍🏫,👩🏿‍🏫 +👩‍🎓,👨‍🎓,👨🏻‍🎓,👨🏼‍🎓,👨🏽‍🎓,👨🏾‍🎓,👨🏿‍🎓,👩‍🎓,👩🏻‍🎓,👩🏼‍🎓,👩🏽‍🎓,👩🏾‍🎓,👩🏿‍🎓 +👩‍💼,👨‍💼,👨🏻‍💼,👨🏼‍💼,👨🏽‍💼,👨🏾‍💼,👨🏿‍💼,👩‍💼,👩🏻‍💼,👩🏼‍💼,👩🏽‍💼,👩🏾‍💼,👩🏿‍💼 +👩‍⚖️,👨‍⚖️,👨🏻‍⚖️,👨🏼‍⚖️,👨🏽‍⚖️,👨🏾‍⚖️,👨🏿‍⚖️,👩‍⚖️,👩🏻‍⚖️,👩🏼‍⚖️,👩🏽‍⚖️,👩🏾‍⚖️,👩🏿‍⚖️ +👩‍💻,👨‍💻,👨🏻‍💻,👨🏼‍💻,👨🏽‍💻,👨🏾‍💻,👨🏿‍💻,👩‍💻,👩🏻‍💻,👩🏼‍💻,👩🏽‍💻,👩🏾‍💻,👩🏿‍💻 +👩‍🎤,👨‍🎤,👨🏻‍🎤,👨🏼‍🎤,👨🏽‍🎤,👨🏾‍🎤,👨🏿‍🎤,👩‍🎤,👩🏻‍🎤,👩🏼‍🎤,👩🏽‍🎤,👩🏾‍🎤,👩🏿‍🎤 +👩‍🎨,👨‍🎨,👨🏻‍🎨,👨🏼‍🎨,👨🏽‍🎨,👨🏾‍🎨,👨🏿‍🎨,👩‍🎨,👩🏻‍🎨,👩🏼‍🎨,👩🏽‍🎨,👩🏾‍🎨,👩🏿‍🎨 +👩‍🍳,👨‍🍳,👨🏻‍🍳,👨🏼‍🍳,👨🏽‍🍳,👨🏾‍🍳,👨🏿‍🍳,👩‍🍳,👩🏻‍🍳,👩🏼‍🍳,👩🏽‍🍳,👩🏾‍🍳,👩🏿‍🍳 +👳,👳‍♀️,👳🏻‍♀️,👳🏼‍♀️,👳🏽‍♀️,👳🏾‍♀️,👳🏿‍♀️,👳‍♂️,👳🏻‍♂️,👳🏼‍♂️,👳🏽‍♂️,👳🏾‍♂️,👳🏿‍♂️ +🧕,🧕,🧕🏻,🧕🏼,🧕🏽,🧕🏾,🧕🏿 +👲,👲,👲🏻,👲🏼,👲🏽,👲🏾,👲🏿 +👶,👶,👶🏻,👶🏼,👶🏽,👶🏾,👶🏿 +🧒,🧒,🧒🏻,🧒🏼,🧒🏽,🧒🏾,🧒🏿 +👦,👦,👦🏻,👦🏼,👦🏽,👦🏾,👦🏿 +👧,👧,👧🏻,👧🏼,👧🏽,👧🏾,👧🏿 +🧑,🧑,🧑🏻,🧑🏼,🧑🏽,🧑🏾,🧑🏿 +👨,👨,👨🏻,👨🏼,👨🏽,👨🏾,👨🏿 +👩,👩,👩🏻,👩🏼,👩🏽,👩🏾,👩🏿 +🧓,🧓,🧓🏻,🧓🏼,🧓🏽,🧓🏾,🧓🏿 +👴,👴,👴🏻,👴🏼,👴🏽,👴🏾,👴🏿 +👵,👵,👵🏻,👵🏼,👵🏽,👵🏾,👵🏿 +👨‍🦳,👨‍🦳,👨🏻‍🦳,👨🏼‍🦳,👨🏽‍🦳,👨🏾‍🦳,👨🏿‍🦳 +👩‍🦳,👩‍🦳,👩🏻‍🦳,👩🏼‍🦳,👩🏽‍🦳,👩🏾‍🦳,👩🏿‍🦳 +👨‍🦰,👨‍🦰,👨🏻‍🦰,👨🏼‍🦰,👨🏽‍🦰,👨🏾‍🦰,👨🏿‍🦰 +👩‍🦰,👩‍🦰,👩🏻‍🦰,👩🏼‍🦰,👩🏽‍🦰,👩🏾‍🦰,👩🏿‍🦰 +👱,👱‍♀️,👱🏻‍♀️,👱🏼‍♀️,👱🏽‍♀️,👱🏾‍♀️,👱🏿‍♀️,👱‍♂️,👱🏻‍♂️,👱🏼‍♂️,👱🏽‍♂️,👱🏾‍♂️,👱🏿‍♂️ +👨‍🦱,👨‍🦱,👨🏻‍🦱,👨🏼‍🦱,👨🏽‍🦱,👨🏾‍🦱,👨🏿‍🦱 +👩‍🦱,👩‍🦱,👩🏻‍🦱,👩🏼‍🦱,👩🏽‍🦱,👩🏾‍🦱,👩🏿‍🦱 +👨‍🦲,👨‍🦲,👨🏻‍🦲,👨🏼‍🦲,👨🏽‍🦲,👨🏾‍🦲,👨🏿‍🦲 +👩‍🦲,👩‍🦲,👩🏻‍🦲,👩🏼‍🦲,👩🏽‍🦲,👩🏾‍🦲,👩🏿‍🦲 +🧔,🧔,🧔🏻,🧔🏼,🧔🏽,🧔🏾,🧔🏿 +🕴️,🕴️,🕴🏻,🕴🏼,🕴🏽,🕴🏾,🕴🏿 +💃,💃,💃🏻,💃🏼,💃🏽,💃🏾,💃🏿 +🕺,🕺,🕺🏻,🕺🏼,🕺🏽,🕺🏾,🕺🏿 +👯,👯‍♀️,👯‍♂️ +👭 +👫 +👬 +💏 +👩‍❤️‍💋‍👨 +👨‍❤️‍💋‍👨 +👩‍❤️‍💋‍👩 +💑 +👩‍❤️‍👨 +👨‍❤️‍👨 +👩‍❤️‍👩 +👪 +👨‍👩‍👦 +👨‍👩‍👧 +👨‍👩‍👧‍👦 +👨‍👩‍👦‍👦 +👨‍👩‍👧‍👧 +👨‍👨‍👦 +👨‍👨‍👧 +👨‍👨‍👧‍👦 +👨‍👨‍👦‍👦 +👨‍👨‍👧‍👧 +👩‍👩‍👦 +👩‍👩‍👧 +👩‍👩‍👧‍👦 +👩‍👩‍👦‍👦 +👩‍👩‍👧‍👧 +👨‍👦 +👨‍👦‍👦 +👨‍👧 +👨‍👧‍👦 +👨‍👧‍👧 +👩‍👦 +👩‍👦‍👦 +👩‍👧 +👩‍👧‍👦 +👩‍👧‍👧 +🤰,🤰,🤰🏻,🤰🏼,🤰🏽,🤰🏾,🤰🏿 +🤱,🤱,🤱🏻,🤱🏼,🤱🏽,🤱🏾,🤱🏿 +🗣️ +👤 +👥 +👣 diff --git a/emojipicker/app/src/main/res/raw/emoji_category_people_gender_inclusive.csv b/emojipicker/app/src/main/res/raw/emoji_category_people_gender_inclusive.csv new file mode 100644 index 00000000..ec86a370 --- /dev/null +++ b/emojipicker/app/src/main/res/raw/emoji_category_people_gender_inclusive.csv @@ -0,0 +1,110 @@ +🙇,🙇,🙇🏻,🙇🏼,🙇🏽,🙇🏾,🙇🏿,🙇‍♀️,🙇🏻‍♀️,🙇🏼‍♀️,🙇🏽‍♀️,🙇🏾‍♀️,🙇🏿‍♀️,🙇‍♂️,🙇🏻‍♂️,🙇🏼‍♂️,🙇🏽‍♂️,🙇🏾‍♂️,🙇🏿‍♂️ +🙋,🙋,🙋🏻,🙋🏼,🙋🏽,🙋🏾,🙋🏿,🙋‍♀️,🙋🏻‍♀️,🙋🏼‍♀️,🙋🏽‍♀️,🙋🏾‍♀️,🙋🏿‍♀️,🙋‍♂️,🙋🏻‍♂️,🙋🏼‍♂️,🙋🏽‍♂️,🙋🏾‍♂️,🙋🏿‍♂️ +💁,💁,💁🏻,💁🏼,💁🏽,💁🏾,💁🏿,💁‍♀️,💁🏻‍♀️,💁🏼‍♀️,💁🏽‍♀️,💁🏾‍♀️,💁🏿‍♀️,💁‍♂️,💁🏻‍♂️,💁🏼‍♂️,💁🏽‍♂️,💁🏾‍♂️,💁🏿‍♂️ +🙆,🙆,🙆🏻,🙆🏼,🙆🏽,🙆🏾,🙆🏿,🙆‍♀️,🙆🏻‍♀️,🙆🏼‍♀️,🙆🏽‍♀️,🙆🏾‍♀️,🙆🏿‍♀️,🙆‍♂️,🙆🏻‍♂️,🙆🏼‍♂️,🙆🏽‍♂️,🙆🏾‍♂️,🙆🏿‍♂️ +🙅,🙅,🙅🏻,🙅🏼,🙅🏽,🙅🏾,🙅🏿,🙅‍♀️,🙅🏻‍♀️,🙅🏼‍♀️,🙅🏽‍♀️,🙅🏾‍♀️,🙅🏿‍♀️,🙅‍♂️,🙅🏻‍♂️,🙅🏼‍♂️,🙅🏽‍♂️,🙅🏾‍♂️,🙅🏿‍♂️ +🤷,🤷,🤷🏻,🤷🏼,🤷🏽,🤷🏾,🤷🏿,🤷‍♀️,🤷🏻‍♀️,🤷🏼‍♀️,🤷🏽‍♀️,🤷🏾‍♀️,🤷🏿‍♀️,🤷‍♂️,🤷🏻‍♂️,🤷🏼‍♂️,🤷🏽‍♂️,🤷🏾‍♂️,🤷🏿‍♂️ +🤦,🤦,🤦🏻,🤦🏼,🤦🏽,🤦🏾,🤦🏿,🤦‍♀️,🤦🏻‍♀️,🤦🏼‍♀️,🤦🏽‍♀️,🤦🏾‍♀️,🤦🏿‍♀️,🤦‍♂️,🤦🏻‍♂️,🤦🏼‍♂️,🤦🏽‍♂️,🤦🏾‍♂️,🤦🏿‍♂️ +🙍,🙍,🙍🏻,🙍🏼,🙍🏽,🙍🏾,🙍🏿,🙍‍♀️,🙍🏻‍♀️,🙍🏼‍♀️,🙍🏽‍♀️,🙍🏾‍♀️,🙍🏿‍♀️,🙍‍♂️,🙍🏻‍♂️,🙍🏼‍♂️,🙍🏽‍♂️,🙍🏾‍♂️,🙍🏿‍♂️ +🙎,🙎,🙎🏻,🙎🏼,🙎🏽,🙎🏾,🙎🏿,🙎‍♀️,🙎🏻‍♀️,🙎🏼‍♀️,🙎🏽‍♀️,🙎🏾‍♀️,🙎🏿‍♀️,🙎‍♂️,🙎🏻‍♂️,🙎🏼‍♂️,🙎🏽‍♂️,🙎🏾‍♂️,🙎🏿‍♂️ +🧏,🧏,🧏🏻,🧏🏼,🧏🏽,🧏🏾,🧏🏿,🧏‍♀️,🧏🏻‍♀️,🧏🏼‍♀️,🧏🏽‍♀️,🧏🏾‍♀️,🧏🏿‍♀️,🧏‍♂️,🧏🏻‍♂️,🧏🏼‍♂️,🧏🏽‍♂️,🧏🏾‍♂️,🧏🏿‍♂️ +💆,💆,💆🏻,💆🏼,💆🏽,💆🏾,💆🏿,💆‍♀️,💆🏻‍♀️,💆🏼‍♀️,💆🏽‍♀️,💆🏾‍♀️,💆🏿‍♀️,💆‍♂️,💆🏻‍♂️,💆🏼‍♂️,💆🏽‍♂️,💆🏾‍♂️,💆🏿‍♂️ +💇,💇,💇🏻,💇🏼,💇🏽,💇🏾,💇🏿,💇‍♀️,💇🏻‍♀️,💇🏼‍♀️,💇🏽‍♀️,💇🏾‍♀️,💇🏿‍♀️,💇‍♂️,💇🏻‍♂️,💇🏼‍♂️,💇🏽‍♂️,💇🏾‍♂️,💇🏿‍♂️ +🧖,🧖,🧖🏻,🧖🏼,🧖🏽,🧖🏾,🧖🏿,🧖‍♀️,🧖🏻‍♀️,🧖🏼‍♀️,🧖🏽‍♀️,🧖🏾‍♀️,🧖🏿‍♀️,🧖‍♂️,🧖🏻‍♂️,🧖🏼‍♂️,🧖🏽‍♂️,🧖🏾‍♂️,🧖🏿‍♂️ +🛀,🛀,🛀🏻,🛀🏼,🛀🏽,🛀🏾,🛀🏿 +🛌,🛌,🛌🏻,🛌🏼,🛌🏽,🛌🏾,🛌🏿 +🧘,🧘,🧘🏻,🧘🏼,🧘🏽,🧘🏾,🧘🏿,🧘‍♀️,🧘🏻‍♀️,🧘🏼‍♀️,🧘🏽‍♀️,🧘🏾‍♀️,🧘🏿‍♀️,🧘‍♂️,🧘🏻‍♂️,🧘🏼‍♂️,🧘🏽‍♂️,🧘🏾‍♂️,🧘🏿‍♂️ +🧍,🧍,🧍🏻,🧍🏼,🧍🏽,🧍🏾,🧍🏿,🧍‍♀️,🧍🏻‍♀️,🧍🏼‍♀️,🧍🏽‍♀️,🧍🏾‍♀️,🧍🏿‍♀️,🧍‍♂️,🧍🏻‍♂️,🧍🏼‍♂️,🧍🏽‍♂️,🧍🏾‍♂️,🧍🏿‍♂️ +🤸,🤸,🤸🏻,🤸🏼,🤸🏽,🤸🏾,🤸🏿,🤸‍♀️,🤸🏻‍♀️,🤸🏼‍♀️,🤸🏽‍♀️,🤸🏾‍♀️,🤸🏿‍♀️,🤸‍♂️,🤸🏻‍♂️,🤸🏼‍♂️,🤸🏽‍♂️,🤸🏾‍♂️,🤸🏿‍♂️ +🧎,🧎,🧎🏻,🧎🏼,🧎🏽,🧎🏾,🧎🏿,🧎‍➡️,🧎🏻‍➡️,🧎🏼‍➡️,🧎🏽‍➡️,🧎🏾‍➡️,🧎🏿‍➡️,🧎‍♀️,🧎🏻‍♀️,🧎🏼‍♀️,🧎🏽‍♀️,🧎🏾‍♀️,🧎🏿‍♀️,🧎‍♀️‍➡️,🧎🏻‍♀️‍➡️,🧎🏼‍♀️‍➡️,🧎🏽‍♀️‍➡️,🧎🏾‍♀️‍➡️,🧎🏿‍♀️‍➡️,🧎‍♂️,🧎🏻‍♂️,🧎🏼‍♂️,🧎🏽‍♂️,🧎🏾‍♂️,🧎🏿‍♂️,🧎‍♂️‍➡️,🧎🏻‍♂️‍➡️,🧎🏼‍♂️‍➡️,🧎🏽‍♂️‍➡️,🧎🏾‍♂️‍➡️,🧎🏿‍♂️‍➡️ +🧑‍🦼,🧑‍🦼,🧑🏻‍🦼,🧑🏼‍🦼,🧑🏽‍🦼,🧑🏾‍🦼,🧑🏿‍🦼,🧑‍🦼‍➡️,🧑🏻‍🦼‍➡️,🧑🏼‍🦼‍➡️,🧑🏽‍🦼‍➡️,🧑🏾‍🦼‍➡️,🧑🏿‍🦼‍➡️,👩‍🦼,👩🏻‍🦼,👩🏼‍🦼,👩🏽‍🦼,👩🏾‍🦼,👩🏿‍🦼,👩‍🦼‍➡️,👩🏻‍🦼‍➡️,👩🏼‍🦼‍➡️,👩🏽‍🦼‍➡️,👩🏾‍🦼‍➡️,👩🏿‍🦼‍➡️,👨‍🦼,👨🏻‍🦼,👨🏼‍🦼,👨🏽‍🦼,👨🏾‍🦼,👨🏿‍🦼,👨‍🦼‍➡️,👨🏻‍🦼‍➡️,👨🏼‍🦼‍➡️,👨🏽‍🦼‍➡️,👨🏾‍🦼‍➡️,👨🏿‍🦼‍➡️ +🧑‍🦽,🧑‍🦽,🧑🏻‍🦽,🧑🏼‍🦽,🧑🏽‍🦽,🧑🏾‍🦽,🧑🏿‍🦽,🧑‍🦽‍➡️,🧑🏻‍🦽‍➡️,🧑🏼‍🦽‍➡️,🧑🏽‍🦽‍➡️,🧑🏾‍🦽‍➡️,🧑🏿‍🦽‍➡️,👩‍🦽,👩🏻‍🦽,👩🏼‍🦽,👩🏽‍🦽,👩🏾‍🦽,👩🏿‍🦽,👩‍🦽‍➡️,👩🏻‍🦽‍➡️,👩🏼‍🦽‍➡️,👩🏽‍🦽‍➡️,👩🏾‍🦽‍➡️,👩🏿‍🦽‍➡️,👨‍🦽,👨🏻‍🦽,👨🏼‍🦽,👨🏽‍🦽,👨🏾‍🦽,👨🏿‍🦽,👨‍🦽‍➡️,👨🏻‍🦽‍➡️,👨🏼‍🦽‍➡️,👨🏽‍🦽‍➡️,👨🏾‍🦽‍➡️,👨🏿‍🦽‍➡️ +🧑‍🦯,🧑‍🦯,🧑🏻‍🦯,🧑🏼‍🦯,🧑🏽‍🦯,🧑🏾‍🦯,🧑🏿‍🦯,🧑‍🦯‍➡️,🧑🏻‍🦯‍➡️,🧑🏼‍🦯‍➡️,🧑🏽‍🦯‍➡️,🧑🏾‍🦯‍➡️,🧑🏿‍🦯‍➡️,👩‍🦯,👩🏻‍🦯,👩🏼‍🦯,👩🏽‍🦯,👩🏾‍🦯,👩🏿‍🦯,👩‍🦯‍➡️,👩🏻‍🦯‍➡️,👩🏼‍🦯‍➡️,👩🏽‍🦯‍➡️,👩🏾‍🦯‍➡️,👩🏿‍🦯‍➡️,👨‍🦯,👨🏻‍🦯,👨🏼‍🦯,👨🏽‍🦯,👨🏾‍🦯,👨🏿‍🦯,👨‍🦯‍➡️,👨🏻‍🦯‍➡️,👨🏼‍🦯‍➡️,👨🏽‍🦯‍➡️,👨🏾‍🦯‍➡️,👨🏿‍🦯‍➡️ +🚶,🚶,🚶🏻,🚶🏼,🚶🏽,🚶🏾,🚶🏿,🚶‍➡️,🚶🏻‍➡️,🚶🏼‍➡️,🚶🏽‍➡️,🚶🏾‍➡️,🚶🏿‍➡️,🚶‍♀️,🚶🏻‍♀️,🚶🏼‍♀️,🚶🏽‍♀️,🚶🏾‍♀️,🚶🏿‍♀️,🚶‍♀️‍➡️,🚶🏻‍♀️‍➡️,🚶🏼‍♀️‍➡️,🚶🏽‍♀️‍➡️,🚶🏾‍♀️‍➡️,🚶🏿‍♀️‍➡️,🚶‍♂️,🚶🏻‍♂️,🚶🏼‍♂️,🚶🏽‍♂️,🚶🏾‍♂️,🚶🏿‍♂️,🚶‍♂️‍➡️,🚶🏻‍♂️‍➡️,🚶🏼‍♂️‍➡️,🚶🏽‍♂️‍➡️,🚶🏾‍♂️‍➡️,🚶🏿‍♂️‍➡️ +🏃,🏃,🏃🏻,🏃🏼,🏃🏽,🏃🏾,🏃🏿,🏃‍➡️,🏃🏻‍➡️,🏃🏼‍➡️,🏃🏽‍➡️,🏃🏾‍➡️,🏃🏿‍➡️,🏃‍♀️,🏃🏻‍♀️,🏃🏼‍♀️,🏃🏽‍♀️,🏃🏾‍♀️,🏃🏿‍♀️,🏃‍♀️‍➡️,🏃🏻‍♀️‍➡️,🏃🏼‍♀️‍➡️,🏃🏽‍♀️‍➡️,🏃🏾‍♀️‍➡️,🏃🏿‍♀️‍➡️,🏃‍♂️,🏃🏻‍♂️,🏃🏼‍♂️,🏃🏽‍♂️,🏃🏾‍♂️,🏃🏿‍♂️,🏃‍♂️‍➡️,🏃🏻‍♂️‍➡️,🏃🏼‍♂️‍➡️,🏃🏽‍♂️‍➡️,🏃🏾‍♂️‍➡️,🏃🏿‍♂️‍➡️ +⛹️,⛹️,⛹🏻,⛹🏼,⛹🏽,⛹🏾,⛹🏿,⛹️‍♀️,⛹🏻‍♀️,⛹🏼‍♀️,⛹🏽‍♀️,⛹🏾‍♀️,⛹🏿‍♀️,⛹️‍♂️,⛹🏻‍♂️,⛹🏼‍♂️,⛹🏽‍♂️,⛹🏾‍♂️,⛹🏿‍♂️ +🤾,🤾,🤾🏻,🤾🏼,🤾🏽,🤾🏾,🤾🏿,🤾‍♀️,🤾🏻‍♀️,🤾🏼‍♀️,🤾🏽‍♀️,🤾🏾‍♀️,🤾🏿‍♀️,🤾‍♂️,🤾🏻‍♂️,🤾🏼‍♂️,🤾🏽‍♂️,🤾🏾‍♂️,🤾🏿‍♂️ +🚴,🚴,🚴🏻,🚴🏼,🚴🏽,🚴🏾,🚴🏿,🚴‍♀️,🚴🏻‍♀️,🚴🏼‍♀️,🚴🏽‍♀️,🚴🏾‍♀️,🚴🏿‍♀️,🚴‍♂️,🚴🏻‍♂️,🚴🏼‍♂️,🚴🏽‍♂️,🚴🏾‍♂️,🚴🏿‍♂️ +🚵,🚵,🚵🏻,🚵🏼,🚵🏽,🚵🏾,🚵🏿,🚵‍♀️,🚵🏻‍♀️,🚵🏼‍♀️,🚵🏽‍♀️,🚵🏾‍♀️,🚵🏿‍♀️,🚵‍♂️,🚵🏻‍♂️,🚵🏼‍♂️,🚵🏽‍♂️,🚵🏾‍♂️,🚵🏿‍♂️ +🧗,🧗,🧗🏻,🧗🏼,🧗🏽,🧗🏾,🧗🏿,🧗‍♀️,🧗🏻‍♀️,🧗🏼‍♀️,🧗🏽‍♀️,🧗🏾‍♀️,🧗🏿‍♀️,🧗‍♂️,🧗🏻‍♂️,🧗🏼‍♂️,🧗🏽‍♂️,🧗🏾‍♂️,🧗🏿‍♂️ +🏋️,🏋️,🏋🏻,🏋🏼,🏋🏽,🏋🏾,🏋🏿,🏋️‍♀️,🏋🏻‍♀️,🏋🏼‍♀️,🏋🏽‍♀️,🏋🏾‍♀️,🏋🏿‍♀️,🏋️‍♂️,🏋🏻‍♂️,🏋🏼‍♂️,🏋🏽‍♂️,🏋🏾‍♂️,🏋🏿‍♂️ +🤼,🤼,🤼‍♀️,🤼‍♂️ +🤹,🤹,🤹🏻,🤹🏼,🤹🏽,🤹🏾,🤹🏿,🤹‍♀️,🤹🏻‍♀️,🤹🏼‍♀️,🤹🏽‍♀️,🤹🏾‍♀️,🤹🏿‍♀️,🤹‍♂️,🤹🏻‍♂️,🤹🏼‍♂️,🤹🏽‍♂️,🤹🏾‍♂️,🤹🏿‍♂️ +🏌️,🏌️,🏌🏻,🏌🏼,🏌🏽,🏌🏾,🏌🏿,🏌️‍♀️,🏌🏻‍♀️,🏌🏼‍♀️,🏌🏽‍♀️,🏌🏾‍♀️,🏌🏿‍♀️,🏌️‍♂️,🏌🏻‍♂️,🏌🏼‍♂️,🏌🏽‍♂️,🏌🏾‍♂️,🏌🏿‍♂️ +🏇,🏇,🏇🏻,🏇🏼,🏇🏽,🏇🏾,🏇🏿 +🤺 +⛷️ +🏂,🏂,🏂🏻,🏂🏼,🏂🏽,🏂🏾,🏂🏿 +🪂 +🏄,🏄,🏄🏻,🏄🏼,🏄🏽,🏄🏾,🏄🏿,🏄‍♀️,🏄🏻‍♀️,🏄🏼‍♀️,🏄🏽‍♀️,🏄🏾‍♀️,🏄🏿‍♀️,🏄‍♂️,🏄🏻‍♂️,🏄🏼‍♂️,🏄🏽‍♂️,🏄🏾‍♂️,🏄🏿‍♂️ +🚣,🚣,🚣🏻,🚣🏼,🚣🏽,🚣🏾,🚣🏿,🚣‍♀️,🚣🏻‍♀️,🚣🏼‍♀️,🚣🏽‍♀️,🚣🏾‍♀️,🚣🏿‍♀️,🚣‍♂️,🚣🏻‍♂️,🚣🏼‍♂️,🚣🏽‍♂️,🚣🏾‍♂️,🚣🏿‍♂️ +🏊,🏊,🏊🏻,🏊🏼,🏊🏽,🏊🏾,🏊🏿,🏊‍♀️,🏊🏻‍♀️,🏊🏼‍♀️,🏊🏽‍♀️,🏊🏾‍♀️,🏊🏿‍♀️,🏊‍♂️,🏊🏻‍♂️,🏊🏼‍♂️,🏊🏽‍♂️,🏊🏾‍♂️,🏊🏿‍♂️ +🤽,🤽,🤽🏻,🤽🏼,🤽🏽,🤽🏾,🤽🏿,🤽‍♀️,🤽🏻‍♀️,🤽🏼‍♀️,🤽🏽‍♀️,🤽🏾‍♀️,🤽🏿‍♀️,🤽‍♂️,🤽🏻‍♂️,🤽🏼‍♂️,🤽🏽‍♂️,🤽🏾‍♂️,🤽🏿‍♂️ +🧜,🧜,🧜🏻,🧜🏼,🧜🏽,🧜🏾,🧜🏿,🧜‍♀️,🧜🏻‍♀️,🧜🏼‍♀️,🧜🏽‍♀️,🧜🏾‍♀️,🧜🏿‍♀️,🧜‍♂️,🧜🏻‍♂️,🧜🏼‍♂️,🧜🏽‍♂️,🧜🏾‍♂️,🧜🏿‍♂️ +🧚,🧚,🧚🏻,🧚🏼,🧚🏽,🧚🏾,🧚🏿,🧚‍♀️,🧚🏻‍♀️,🧚🏼‍♀️,🧚🏽‍♀️,🧚🏾‍♀️,🧚🏿‍♀️,🧚‍♂️,🧚🏻‍♂️,🧚🏼‍♂️,🧚🏽‍♂️,🧚🏾‍♂️,🧚🏿‍♂️ +🧞,🧞,🧞‍♀️,🧞‍♂️ +🧝,🧝,🧝🏻,🧝🏼,🧝🏽,🧝🏾,🧝🏿,🧝‍♀️,🧝🏻‍♀️,🧝🏼‍♀️,🧝🏽‍♀️,🧝🏾‍♀️,🧝🏿‍♀️,🧝‍♂️,🧝🏻‍♂️,🧝🏼‍♂️,🧝🏽‍♂️,🧝🏾‍♂️,🧝🏿‍♂️ +🧙,🧙,🧙🏻,🧙🏼,🧙🏽,🧙🏾,🧙🏿,🧙‍♀️,🧙🏻‍♀️,🧙🏼‍♀️,🧙🏽‍♀️,🧙🏾‍♀️,🧙🏿‍♀️,🧙‍♂️,🧙🏻‍♂️,🧙🏼‍♂️,🧙🏽‍♂️,🧙🏾‍♂️,🧙🏿‍♂️ +🧛,🧛,🧛🏻,🧛🏼,🧛🏽,🧛🏾,🧛🏿,🧛‍♀️,🧛🏻‍♀️,🧛🏼‍♀️,🧛🏽‍♀️,🧛🏾‍♀️,🧛🏿‍♀️,🧛‍♂️,🧛🏻‍♂️,🧛🏼‍♂️,🧛🏽‍♂️,🧛🏾‍♂️,🧛🏿‍♂️ +🧟,🧟,🧟‍♀️,🧟‍♂️ +🧌 +🦸,🦸,🦸🏻,🦸🏼,🦸🏽,🦸🏾,🦸🏿,🦸‍♀️,🦸🏻‍♀️,🦸🏼‍♀️,🦸🏽‍♀️,🦸🏾‍♀️,🦸🏿‍♀️,🦸‍♂️,🦸🏻‍♂️,🦸🏼‍♂️,🦸🏽‍♂️,🦸🏾‍♂️,🦸🏿‍♂️ +🦹,🦹,🦹🏻,🦹🏼,🦹🏽,🦹🏾,🦹🏿,🦹‍♀️,🦹🏻‍♀️,🦹🏼‍♀️,🦹🏽‍♀️,🦹🏾‍♀️,🦹🏿‍♀️,🦹‍♂️,🦹🏻‍♂️,🦹🏼‍♂️,🦹🏽‍♂️,🦹🏾‍♂️,🦹🏿‍♂️ +🥷,🥷,🥷🏻,🥷🏼,🥷🏽,🥷🏾,🥷🏿 +🧑‍🎄,🧑‍🎄,🧑🏻‍🎄,🧑🏼‍🎄,🧑🏽‍🎄,🧑🏾‍🎄,🧑🏿‍🎄,🤶,🤶🏻,🤶🏼,🤶🏽,🤶🏾,🤶🏿,🎅,🎅🏻,🎅🏼,🎅🏽,🎅🏾,🎅🏿 +👼,👼,👼🏻,👼🏼,👼🏽,👼🏾,👼🏿 +💂,💂,💂🏻,💂🏼,💂🏽,💂🏾,💂🏿,💂‍♀️,💂🏻‍♀️,💂🏼‍♀️,💂🏽‍♀️,💂🏾‍♀️,💂🏿‍♀️,💂‍♂️,💂🏻‍♂️,💂🏼‍♂️,💂🏽‍♂️,💂🏾‍♂️,💂🏿‍♂️ +🫅,🫅,🫅🏻,🫅🏼,🫅🏽,🫅🏾,🫅🏿,👸,👸🏻,👸🏼,👸🏽,👸🏾,👸🏿,🤴,🤴🏻,🤴🏼,🤴🏽,🤴🏾,🤴🏿 +🤵,🤵,🤵🏻,🤵🏼,🤵🏽,🤵🏾,🤵🏿,🤵‍♀️,🤵🏻‍♀️,🤵🏼‍♀️,🤵🏽‍♀️,🤵🏾‍♀️,🤵🏿‍♀️,🤵‍♂️,🤵🏻‍♂️,🤵🏼‍♂️,🤵🏽‍♂️,🤵🏾‍♂️,🤵🏿‍♂️ +👰,👰,👰🏻,👰🏼,👰🏽,👰🏾,👰🏿,👰‍♀️,👰🏻‍♀️,👰🏼‍♀️,👰🏽‍♀️,👰🏾‍♀️,👰🏿‍♀️,👰‍♂️,👰🏻‍♂️,👰🏼‍♂️,👰🏽‍♂️,👰🏾‍♂️,👰🏿‍♂️ +🧑‍🚀,🧑‍🚀,🧑🏻‍🚀,🧑🏼‍🚀,🧑🏽‍🚀,🧑🏾‍🚀,🧑🏿‍🚀,👩‍🚀,👩🏻‍🚀,👩🏼‍🚀,👩🏽‍🚀,👩🏾‍🚀,👩🏿‍🚀,👨‍🚀,👨🏻‍🚀,👨🏼‍🚀,👨🏽‍🚀,👨🏾‍🚀,👨🏿‍🚀 +👷,👷,👷🏻,👷🏼,👷🏽,👷🏾,👷🏿,👷‍♀️,👷🏻‍♀️,👷🏼‍♀️,👷🏽‍♀️,👷🏾‍♀️,👷🏿‍♀️,👷‍♂️,👷🏻‍♂️,👷🏼‍♂️,👷🏽‍♂️,👷🏾‍♂️,👷🏿‍♂️ +👮,👮,👮🏻,👮🏼,👮🏽,👮🏾,👮🏿,👮‍♀️,👮🏻‍♀️,👮🏼‍♀️,👮🏽‍♀️,👮🏾‍♀️,👮🏿‍♀️,👮‍♂️,👮🏻‍♂️,👮🏼‍♂️,👮🏽‍♂️,👮🏾‍♂️,👮🏿‍♂️ +🕵️,🕵️,🕵🏻,🕵🏼,🕵🏽,🕵🏾,🕵🏿,🕵️‍♀️,🕵🏻‍♀️,🕵🏼‍♀️,🕵🏽‍♀️,🕵🏾‍♀️,🕵🏿‍♀️,🕵️‍♂️,🕵🏻‍♂️,🕵🏼‍♂️,🕵🏽‍♂️,🕵🏾‍♂️,🕵🏿‍♂️ +🧑‍✈️,🧑‍✈️,🧑🏻‍✈️,🧑🏼‍✈️,🧑🏽‍✈️,🧑🏾‍✈️,🧑🏿‍✈️,👩‍✈️,👩🏻‍✈️,👩🏼‍✈️,👩🏽‍✈️,👩🏾‍✈️,👩🏿‍✈️,👨‍✈️,👨🏻‍✈️,👨🏼‍✈️,👨🏽‍✈️,👨🏾‍✈️,👨🏿‍✈️ +🧑‍🔬,🧑‍🔬,🧑🏻‍🔬,🧑🏼‍🔬,🧑🏽‍🔬,🧑🏾‍🔬,🧑🏿‍🔬,👩‍🔬,👩🏻‍🔬,👩🏼‍🔬,👩🏽‍🔬,👩🏾‍🔬,👩🏿‍🔬,👨‍🔬,👨🏻‍🔬,👨🏼‍🔬,👨🏽‍🔬,👨🏾‍🔬,👨🏿‍🔬 +🧑‍⚕️,🧑‍⚕️,🧑🏻‍⚕️,🧑🏼‍⚕️,🧑🏽‍⚕️,🧑🏾‍⚕️,🧑🏿‍⚕️,👩‍⚕️,👩🏻‍⚕️,👩🏼‍⚕️,👩🏽‍⚕️,👩🏾‍⚕️,👩🏿‍⚕️,👨‍⚕️,👨🏻‍⚕️,👨🏼‍⚕️,👨🏽‍⚕️,👨🏾‍⚕️,👨🏿‍⚕️ +🧑‍🔧,🧑‍🔧,🧑🏻‍🔧,🧑🏼‍🔧,🧑🏽‍🔧,🧑🏾‍🔧,🧑🏿‍🔧,👩‍🔧,👩🏻‍🔧,👩🏼‍🔧,👩🏽‍🔧,👩🏾‍🔧,👩🏿‍🔧,👨‍🔧,👨🏻‍🔧,👨🏼‍🔧,👨🏽‍🔧,👨🏾‍🔧,👨🏿‍🔧 +🧑‍🏭,🧑‍🏭,🧑🏻‍🏭,🧑🏼‍🏭,🧑🏽‍🏭,🧑🏾‍🏭,🧑🏿‍🏭,👩‍🏭,👩🏻‍🏭,👩🏼‍🏭,👩🏽‍🏭,👩🏾‍🏭,👩🏿‍🏭,👨‍🏭,👨🏻‍🏭,👨🏼‍🏭,👨🏽‍🏭,👨🏾‍🏭,👨🏿‍🏭 +🧑‍🚒,🧑‍🚒,🧑🏻‍🚒,🧑🏼‍🚒,🧑🏽‍🚒,🧑🏾‍🚒,🧑🏿‍🚒,👩‍🚒,👩🏻‍🚒,👩🏼‍🚒,👩🏽‍🚒,👩🏾‍🚒,👩🏿‍🚒,👨‍🚒,👨🏻‍🚒,👨🏼‍🚒,👨🏽‍🚒,👨🏾‍🚒,👨🏿‍🚒 +🧑‍🌾,🧑‍🌾,🧑🏻‍🌾,🧑🏼‍🌾,🧑🏽‍🌾,🧑🏾‍🌾,🧑🏿‍🌾,👩‍🌾,👩🏻‍🌾,👩🏼‍🌾,👩🏽‍🌾,👩🏾‍🌾,👩🏿‍🌾,👨‍🌾,👨🏻‍🌾,👨🏼‍🌾,👨🏽‍🌾,👨🏾‍🌾,👨🏿‍🌾 +🧑‍🏫,🧑‍🏫,🧑🏻‍🏫,🧑🏼‍🏫,🧑🏽‍🏫,🧑🏾‍🏫,🧑🏿‍🏫,👩‍🏫,👩🏻‍🏫,👩🏼‍🏫,👩🏽‍🏫,👩🏾‍🏫,👩🏿‍🏫,👨‍🏫,👨🏻‍🏫,👨🏼‍🏫,👨🏽‍🏫,👨🏾‍🏫,👨🏿‍🏫 +🧑‍🎓,🧑‍🎓,🧑🏻‍🎓,🧑🏼‍🎓,🧑🏽‍🎓,🧑🏾‍🎓,🧑🏿‍🎓,👩‍🎓,👩🏻‍🎓,👩🏼‍🎓,👩🏽‍🎓,👩🏾‍🎓,👩🏿‍🎓,👨‍🎓,👨🏻‍🎓,👨🏼‍🎓,👨🏽‍🎓,👨🏾‍🎓,👨🏿‍🎓 +🧑‍💼,🧑‍💼,🧑🏻‍💼,🧑🏼‍💼,🧑🏽‍💼,🧑🏾‍💼,🧑🏿‍💼,👩‍💼,👩🏻‍💼,👩🏼‍💼,👩🏽‍💼,👩🏾‍💼,👩🏿‍💼,👨‍💼,👨🏻‍💼,👨🏼‍💼,👨🏽‍💼,👨🏾‍💼,👨🏿‍💼 +🧑‍⚖️,🧑‍⚖️,🧑🏻‍⚖️,🧑🏼‍⚖️,🧑🏽‍⚖️,🧑🏾‍⚖️,🧑🏿‍⚖️,👩‍⚖️,👩🏻‍⚖️,👩🏼‍⚖️,👩🏽‍⚖️,👩🏾‍⚖️,👩🏿‍⚖️,👨‍⚖️,👨🏻‍⚖️,👨🏼‍⚖️,👨🏽‍⚖️,👨🏾‍⚖️,👨🏿‍⚖️ +🧑‍💻,🧑‍💻,🧑🏻‍💻,🧑🏼‍💻,🧑🏽‍💻,🧑🏾‍💻,🧑🏿‍💻,👩‍💻,👩🏻‍💻,👩🏼‍💻,👩🏽‍💻,👩🏾‍💻,👩🏿‍💻,👨‍💻,👨🏻‍💻,👨🏼‍💻,👨🏽‍💻,👨🏾‍💻,👨🏿‍💻 +🧑‍🎤,🧑‍🎤,🧑🏻‍🎤,🧑🏼‍🎤,🧑🏽‍🎤,🧑🏾‍🎤,🧑🏿‍🎤,👩‍🎤,👩🏻‍🎤,👩🏼‍🎤,👩🏽‍🎤,👩🏾‍🎤,👩🏿‍🎤,👨‍🎤,👨🏻‍🎤,👨🏼‍🎤,👨🏽‍🎤,👨🏾‍🎤,👨🏿‍🎤 +🧑‍🎨,🧑‍🎨,🧑🏻‍🎨,🧑🏼‍🎨,🧑🏽‍🎨,🧑🏾‍🎨,🧑🏿‍🎨,👩‍🎨,👩🏻‍🎨,👩🏼‍🎨,👩🏽‍🎨,👩🏾‍🎨,👩🏿‍🎨,👨‍🎨,👨🏻‍🎨,👨🏼‍🎨,👨🏽‍🎨,👨🏾‍🎨,👨🏿‍🎨 +🧑‍🍳,🧑‍🍳,🧑🏻‍🍳,🧑🏼‍🍳,🧑🏽‍🍳,🧑🏾‍🍳,🧑🏿‍🍳,👩‍🍳,👩🏻‍🍳,👩🏼‍🍳,👩🏽‍🍳,👩🏾‍🍳,👩🏿‍🍳,👨‍🍳,👨🏻‍🍳,👨🏼‍🍳,👨🏽‍🍳,👨🏾‍🍳,👨🏿‍🍳 +👳,👳,👳🏻,👳🏼,👳🏽,👳🏾,👳🏿,👳‍♀️,👳🏻‍♀️,👳🏼‍♀️,👳🏽‍♀️,👳🏾‍♀️,👳🏿‍♀️,👳‍♂️,👳🏻‍♂️,👳🏼‍♂️,👳🏽‍♂️,👳🏾‍♂️,👳🏿‍♂️ +🧕,🧕,🧕🏻,🧕🏼,🧕🏽,🧕🏾,🧕🏿 +👲,👲,👲🏻,👲🏼,👲🏽,👲🏾,👲🏿 +👶,👶,👶🏻,👶🏼,👶🏽,👶🏾,👶🏿 +🧒,🧒,🧒🏻,🧒🏼,🧒🏽,🧒🏾,🧒🏿,👧,👧🏻,👧🏼,👧🏽,👧🏾,👧🏿,👦,👦🏻,👦🏼,👦🏽,👦🏾,👦🏿 +🧑,🧑,🧑🏻,🧑🏼,🧑🏽,🧑🏾,🧑🏿,👩,👩🏻,👩🏼,👩🏽,👩🏾,👩🏿,👨,👨🏻,👨🏼,👨🏽,👨🏾,👨🏿 +🧓,🧓,🧓🏻,🧓🏼,🧓🏽,🧓🏾,🧓🏿,👵,👵🏻,👵🏼,👵🏽,👵🏾,👵🏿,👴,👴🏻,👴🏼,👴🏽,👴🏾,👴🏿 +🧑‍🦳,🧑‍🦳,🧑🏻‍🦳,🧑🏼‍🦳,🧑🏽‍🦳,🧑🏾‍🦳,🧑🏿‍🦳,👩‍🦳,👩🏻‍🦳,👩🏼‍🦳,👩🏽‍🦳,👩🏾‍🦳,👩🏿‍🦳,👨‍🦳,👨🏻‍🦳,👨🏼‍🦳,👨🏽‍🦳,👨🏾‍🦳,👨🏿‍🦳 +🧑‍🦰,🧑‍🦰,🧑🏻‍🦰,🧑🏼‍🦰,🧑🏽‍🦰,🧑🏾‍🦰,🧑🏿‍🦰,👩‍🦰,👩🏻‍🦰,👩🏼‍🦰,👩🏽‍🦰,👩🏾‍🦰,👩🏿‍🦰,👨‍🦰,👨🏻‍🦰,👨🏼‍🦰,👨🏽‍🦰,👨🏾‍🦰,👨🏿‍🦰 +👱,👱,👱🏻,👱🏼,👱🏽,👱🏾,👱🏿,👱‍♀️,👱🏻‍♀️,👱🏼‍♀️,👱🏽‍♀️,👱🏾‍♀️,👱🏿‍♀️,👱‍♂️,👱🏻‍♂️,👱🏼‍♂️,👱🏽‍♂️,👱🏾‍♂️,👱🏿‍♂️ +🧑‍🦱,🧑‍🦱,🧑🏻‍🦱,🧑🏼‍🦱,🧑🏽‍🦱,🧑🏾‍🦱,🧑🏿‍🦱,👩‍🦱,👩🏻‍🦱,👩🏼‍🦱,👩🏽‍🦱,👩🏾‍🦱,👩🏿‍🦱,👨‍🦱,👨🏻‍🦱,👨🏼‍🦱,👨🏽‍🦱,👨🏾‍🦱,👨🏿‍🦱 +🧑‍🦲,🧑‍🦲,🧑🏻‍🦲,🧑🏼‍🦲,🧑🏽‍🦲,🧑🏾‍🦲,🧑🏿‍🦲,👩‍🦲,👩🏻‍🦲,👩🏼‍🦲,👩🏽‍🦲,👩🏾‍🦲,👩🏿‍🦲,👨‍🦲,👨🏻‍🦲,👨🏼‍🦲,👨🏽‍🦲,👨🏾‍🦲,👨🏿‍🦲 +🧔,🧔,🧔🏻,🧔🏼,🧔🏽,🧔🏾,🧔🏿,🧔‍♀️,🧔🏻‍♀️,🧔🏼‍♀️,🧔🏽‍♀️,🧔🏾‍♀️,🧔🏿‍♀️,🧔‍♂️,🧔🏻‍♂️,🧔🏼‍♂️,🧔🏽‍♂️,🧔🏾‍♂️,🧔🏿‍♂️ +🕴️,🕴️,🕴🏻,🕴🏼,🕴🏽,🕴🏾,🕴🏿 +💃,💃,💃🏻,💃🏼,💃🏽,💃🏾,💃🏿 +🕺,🕺,🕺🏻,🕺🏼,🕺🏽,🕺🏾,🕺🏿 +👯,👯,👯‍♂️,👯‍♀️ +🧑‍🤝‍🧑,🧑‍🤝‍🧑,🧑🏻‍🤝‍🧑🏻,🧑🏻‍🤝‍🧑🏼,🧑🏻‍🤝‍🧑🏽,🧑🏻‍🤝‍🧑🏾,🧑🏻‍🤝‍🧑🏿,🧑🏼‍🤝‍🧑🏻,🧑🏼‍🤝‍🧑🏼,🧑🏼‍🤝‍🧑🏽,🧑🏼‍🤝‍🧑🏾,🧑🏼‍🤝‍🧑🏿,🧑🏽‍🤝‍🧑🏻,🧑🏽‍🤝‍🧑🏼,🧑🏽‍🤝‍🧑🏽,🧑🏽‍🤝‍🧑🏾,🧑🏽‍🤝‍🧑🏿,🧑🏾‍🤝‍🧑🏻,🧑🏾‍🤝‍🧑🏼,🧑🏾‍🤝‍🧑🏽,🧑🏾‍🤝‍🧑🏾,🧑🏾‍🤝‍🧑🏿,🧑🏿‍🤝‍🧑🏻,🧑🏿‍🤝‍🧑🏼,🧑🏿‍🤝‍🧑🏽,🧑🏿‍🤝‍🧑🏾,🧑🏿‍🤝‍🧑🏿 +👭,👭,👭🏻,👩🏻‍🤝‍👩🏼,👩🏻‍🤝‍👩🏽,👩🏻‍🤝‍👩🏾,👩🏻‍🤝‍👩🏿,👩🏼‍🤝‍👩🏻,👭🏼,👩🏼‍🤝‍👩🏽,👩🏼‍🤝‍👩🏾,👩🏼‍🤝‍👩🏿,👩🏽‍🤝‍👩🏻,👩🏽‍🤝‍👩🏼,👭🏽,👩🏽‍🤝‍👩🏾,👩🏽‍🤝‍👩🏿,👩🏾‍🤝‍👩🏻,👩🏾‍🤝‍👩🏼,👩🏾‍🤝‍👩🏽,👭🏾,👩🏾‍🤝‍👩🏿,👩🏿‍🤝‍👩🏻,👩🏿‍🤝‍👩🏼,👩🏿‍🤝‍👩🏽,👩🏿‍🤝‍👩🏾,👭🏿 +👬,👬,👬🏻,👨🏻‍🤝‍👨🏼,👨🏻‍🤝‍👨🏽,👨🏻‍🤝‍👨🏾,👨🏻‍🤝‍👨🏿,👨🏼‍🤝‍👨🏻,👬🏼,👨🏼‍🤝‍👨🏽,👨🏼‍🤝‍👨🏾,👨🏼‍🤝‍👨🏿,👨🏽‍🤝‍👨🏻,👨🏽‍🤝‍👨🏼,👬🏽,👨🏽‍🤝‍👨🏾,👨🏽‍🤝‍👨🏿,👨🏾‍🤝‍👨🏻,👨🏾‍🤝‍👨🏼,👨🏾‍🤝‍👨🏽,👬🏾,👨🏾‍🤝‍👨🏿,👨🏿‍🤝‍👨🏻,👨🏿‍🤝‍👨🏼,👨🏿‍🤝‍👨🏽,👨🏿‍🤝‍👨🏾,👬🏿 +👫,👫,👫🏻,👩🏻‍🤝‍👨🏼,👩🏻‍🤝‍👨🏽,👩🏻‍🤝‍👨🏾,👩🏻‍🤝‍👨🏿,👩🏼‍🤝‍👨🏻,👫🏼,👩🏼‍🤝‍👨🏽,👩🏼‍🤝‍👨🏾,👩🏼‍🤝‍👨🏿,👩🏽‍🤝‍👨🏻,👩🏽‍🤝‍👨🏼,👫🏽,👩🏽‍🤝‍👨🏾,👩🏽‍🤝‍👨🏿,👩🏾‍🤝‍👨🏻,👩🏾‍🤝‍👨🏼,👩🏾‍🤝‍👨🏽,👫🏾,👩🏾‍🤝‍👨🏿,👩🏿‍🤝‍👨🏻,👩🏿‍🤝‍👨🏼,👩🏿‍🤝‍👨🏽,👩🏿‍🤝‍👨🏾,👫🏿 +💏,💏,💏🏻,🧑🏻‍❤️‍💋‍🧑🏼,🧑🏻‍❤️‍💋‍🧑🏽,🧑🏻‍❤️‍💋‍🧑🏾,🧑🏻‍❤️‍💋‍🧑🏿,🧑🏼‍❤️‍💋‍🧑🏻,💏🏼,🧑🏼‍❤️‍💋‍🧑🏽,🧑🏼‍❤️‍💋‍🧑🏾,🧑🏼‍❤️‍💋‍🧑🏿,🧑🏽‍❤️‍💋‍🧑🏻,🧑🏽‍❤️‍💋‍🧑🏼,💏🏽,🧑🏽‍❤️‍💋‍🧑🏾,🧑🏽‍❤️‍💋‍🧑🏿,🧑🏾‍❤️‍💋‍🧑🏻,🧑🏾‍❤️‍💋‍🧑🏼,🧑🏾‍❤️‍💋‍🧑🏽,💏🏾,🧑🏾‍❤️‍💋‍🧑🏿,🧑🏿‍❤️‍💋‍🧑🏻,🧑🏿‍❤️‍💋‍🧑🏼,🧑🏿‍❤️‍💋‍🧑🏽,🧑🏿‍❤️‍💋‍🧑🏾,💏🏿 +👩‍❤️‍💋‍👨,👩‍❤️‍💋‍👨,👩🏻‍❤️‍💋‍👨🏻,👩🏻‍❤️‍💋‍👨🏼,👩🏻‍❤️‍💋‍👨🏽,👩🏻‍❤️‍💋‍👨🏾,👩🏻‍❤️‍💋‍👨🏿,👩🏼‍❤️‍💋‍👨🏻,👩🏼‍❤️‍💋‍👨🏼,👩🏼‍❤️‍💋‍👨🏽,👩🏼‍❤️‍💋‍👨🏾,👩🏼‍❤️‍💋‍👨🏿,👩🏽‍❤️‍💋‍👨🏻,👩🏽‍❤️‍💋‍👨🏼,👩🏽‍❤️‍💋‍👨🏽,👩🏽‍❤️‍💋‍👨🏾,👩🏽‍❤️‍💋‍👨🏿,👩🏾‍❤️‍💋‍👨🏻,👩🏾‍❤️‍💋‍👨🏼,👩🏾‍❤️‍💋‍👨🏽,👩🏾‍❤️‍💋‍👨🏾,👩🏾‍❤️‍💋‍👨🏿,👩🏿‍❤️‍💋‍👨🏻,👩🏿‍❤️‍💋‍👨🏼,👩🏿‍❤️‍💋‍👨🏽,👩🏿‍❤️‍💋‍👨🏾,👩🏿‍❤️‍💋‍👨🏿 +👨‍❤️‍💋‍👨,👨‍❤️‍💋‍👨,👨🏻‍❤️‍💋‍👨🏻,👨🏻‍❤️‍💋‍👨🏼,👨🏻‍❤️‍💋‍👨🏽,👨🏻‍❤️‍💋‍👨🏾,👨🏻‍❤️‍💋‍👨🏿,👨🏼‍❤️‍💋‍👨🏻,👨🏼‍❤️‍💋‍👨🏼,👨🏼‍❤️‍💋‍👨🏽,👨🏼‍❤️‍💋‍👨🏾,👨🏼‍❤️‍💋‍👨🏿,👨🏽‍❤️‍💋‍👨🏻,👨🏽‍❤️‍💋‍👨🏼,👨🏽‍❤️‍💋‍👨🏽,👨🏽‍❤️‍💋‍👨🏾,👨🏽‍❤️‍💋‍👨🏿,👨🏾‍❤️‍💋‍👨🏻,👨🏾‍❤️‍💋‍👨🏼,👨🏾‍❤️‍💋‍👨🏽,👨🏾‍❤️‍💋‍👨🏾,👨🏾‍❤️‍💋‍👨🏿,👨🏿‍❤️‍💋‍👨🏻,👨🏿‍❤️‍💋‍👨🏼,👨🏿‍❤️‍💋‍👨🏽,👨🏿‍❤️‍💋‍👨🏾,👨🏿‍❤️‍💋‍👨🏿 +👩‍❤️‍💋‍👩,👩‍❤️‍💋‍👩,👩🏻‍❤️‍💋‍👩🏻,👩🏻‍❤️‍💋‍👩🏼,👩🏻‍❤️‍💋‍👩🏽,👩🏻‍❤️‍💋‍👩🏾,👩🏻‍❤️‍💋‍👩🏿,👩🏼‍❤️‍💋‍👩🏻,👩🏼‍❤️‍💋‍👩🏼,👩🏼‍❤️‍💋‍👩🏽,👩🏼‍❤️‍💋‍👩🏾,👩🏼‍❤️‍💋‍👩🏿,👩🏽‍❤️‍💋‍👩🏻,👩🏽‍❤️‍💋‍👩🏼,👩🏽‍❤️‍💋‍👩🏽,👩🏽‍❤️‍💋‍👩🏾,👩🏽‍❤️‍💋‍👩🏿,👩🏾‍❤️‍💋‍👩🏻,👩🏾‍❤️‍💋‍👩🏼,👩🏾‍❤️‍💋‍👩🏽,👩🏾‍❤️‍💋‍👩🏾,👩🏾‍❤️‍💋‍👩🏿,👩🏿‍❤️‍💋‍👩🏻,👩🏿‍❤️‍💋‍👩🏼,👩🏿‍❤️‍💋‍👩🏽,👩🏿‍❤️‍💋‍👩🏾,👩🏿‍❤️‍💋‍👩🏿 +💑,💑,💑🏻,🧑🏻‍❤️‍🧑🏼,🧑🏻‍❤️‍🧑🏽,🧑🏻‍❤️‍🧑🏾,🧑🏻‍❤️‍🧑🏿,🧑🏼‍❤️‍🧑🏻,💑🏼,🧑🏼‍❤️‍🧑🏽,🧑🏼‍❤️‍🧑🏾,🧑🏼‍❤️‍🧑🏿,🧑🏽‍❤️‍🧑🏻,🧑🏽‍❤️‍🧑🏼,💑🏽,🧑🏽‍❤️‍🧑🏾,🧑🏽‍❤️‍🧑🏿,🧑🏾‍❤️‍🧑🏻,🧑🏾‍❤️‍🧑🏼,🧑🏾‍❤️‍🧑🏽,💑🏾,🧑🏾‍❤️‍🧑🏿,🧑🏿‍❤️‍🧑🏻,🧑🏿‍❤️‍🧑🏼,🧑🏿‍❤️‍🧑🏽,🧑🏿‍❤️‍🧑🏾,💑🏿 +👩‍❤️‍👨,👩‍❤️‍👨,👩🏻‍❤️‍👨🏻,👩🏻‍❤️‍👨🏼,👩🏻‍❤️‍👨🏽,👩🏻‍❤️‍👨🏾,👩🏻‍❤️‍👨🏿,👩🏼‍❤️‍👨🏻,👩🏼‍❤️‍👨🏼,👩🏼‍❤️‍👨🏽,👩🏼‍❤️‍👨🏾,👩🏼‍❤️‍👨🏿,👩🏽‍❤️‍👨🏻,👩🏽‍❤️‍👨🏼,👩🏽‍❤️‍👨🏽,👩🏽‍❤️‍👨🏾,👩🏽‍❤️‍👨🏿,👩🏾‍❤️‍👨🏻,👩🏾‍❤️‍👨🏼,👩🏾‍❤️‍👨🏽,👩🏾‍❤️‍👨🏾,👩🏾‍❤️‍👨🏿,👩🏿‍❤️‍👨🏻,👩🏿‍❤️‍👨🏼,👩🏿‍❤️‍👨🏽,👩🏿‍❤️‍👨🏾,👩🏿‍❤️‍👨🏿 +👨‍❤️‍👨,👨‍❤️‍👨,👨🏻‍❤️‍👨🏻,👨🏻‍❤️‍👨🏼,👨🏻‍❤️‍👨🏽,👨🏻‍❤️‍👨🏾,👨🏻‍❤️‍👨🏿,👨🏼‍❤️‍👨🏻,👨🏼‍❤️‍👨🏼,👨🏼‍❤️‍👨🏽,👨🏼‍❤️‍👨🏾,👨🏼‍❤️‍👨🏿,👨🏽‍❤️‍👨🏻,👨🏽‍❤️‍👨🏼,👨🏽‍❤️‍👨🏽,👨🏽‍❤️‍👨🏾,👨🏽‍❤️‍👨🏿,👨🏾‍❤️‍👨🏻,👨🏾‍❤️‍👨🏼,👨🏾‍❤️‍👨🏽,👨🏾‍❤️‍👨🏾,👨🏾‍❤️‍👨🏿,👨🏿‍❤️‍👨🏻,👨🏿‍❤️‍👨🏼,👨🏿‍❤️‍👨🏽,👨🏿‍❤️‍👨🏾,👨🏿‍❤️‍👨🏿 +👩‍❤️‍👩,👩‍❤️‍👩,👩🏻‍❤️‍👩🏻,👩🏻‍❤️‍👩🏼,👩🏻‍❤️‍👩🏽,👩🏻‍❤️‍👩🏾,👩🏻‍❤️‍👩🏿,👩🏼‍❤️‍👩🏻,👩🏼‍❤️‍👩🏼,👩🏼‍❤️‍👩🏽,👩🏼‍❤️‍👩🏾,👩🏼‍❤️‍👩🏿,👩🏽‍❤️‍👩🏻,👩🏽‍❤️‍👩🏼,👩🏽‍❤️‍👩🏽,👩🏽‍❤️‍👩🏾,👩🏽‍❤️‍👩🏿,👩🏾‍❤️‍👩🏻,👩🏾‍❤️‍👩🏼,👩🏾‍❤️‍👩🏽,👩🏾‍❤️‍👩🏾,👩🏾‍❤️‍👩🏿,👩🏿‍❤️‍👩🏻,👩🏿‍❤️‍👩🏼,👩🏿‍❤️‍👩🏽,👩🏿‍❤️‍👩🏾,👩🏿‍❤️‍👩🏿 +🫄,🫄,🫄🏻,🫄🏼,🫄🏽,🫄🏾,🫄🏿,🤰,🤰🏻,🤰🏼,🤰🏽,🤰🏾,🤰🏿,🫃,🫃🏻,🫃🏼,🫃🏽,🫃🏾,🫃🏿 +🤱,🤱,🤱🏻,🤱🏼,🤱🏽,🤱🏾,🤱🏿 +🧑‍🍼,🧑‍🍼,🧑🏻‍🍼,🧑🏼‍🍼,🧑🏽‍🍼,🧑🏾‍🍼,🧑🏿‍🍼,👩‍🍼,👩🏻‍🍼,👩🏼‍🍼,👩🏽‍🍼,👩🏾‍🍼,👩🏿‍🍼,👨‍🍼,👨🏻‍🍼,👨🏼‍🍼,👨🏽‍🍼,👨🏾‍🍼,👨🏿‍🍼 diff --git a/emojipicker/app/src/main/res/raw/emoji_category_symbols.csv b/emojipicker/app/src/main/res/raw/emoji_category_symbols.csv new file mode 100644 index 00000000..d917e274 --- /dev/null +++ b/emojipicker/app/src/main/res/raw/emoji_category_symbols.csv @@ -0,0 +1,261 @@ +🔴 +🟠 +🟡 +🟢 +🔵 +🟣 +🟤 +⚫ +⚪ +🟥 +🟧 +🟨 +🟩 +🟦 +🟪 +🟫 +⬛ +⬜ +❤️ +🧡 +💛 +💚 +💙 +💜 +🤎 +🖤 +🤍 +🩷 +🩵 +🩶 +♥️ +♦️ +♣️ +♠️ +♈ +♉ +♊ +♋ +♌ +♍ +♎ +♏ +♐ +♑ +♒ +♓ +⛎ +♀️ +♂️ +⚧️ +💭 +🗯️ +💬 +🗨️ +❕ +❔ +❗ +❓ +⁉️ +‼️ +⭕ +❌ +🚫 +🚳 +🚭 +🚯 +🚱 +🚷 +📵 +🔞 +🔕 +🔇 +🅰️ +🆎 +🅱️ +🅾️ +🆑 +🆘 +🛑 +⛔ +📛 +♨️ +💢 +🔻 +🔺 +🉐 +㊙️ +㊗️ +🈴 +🈵 +🈹 +🈲 +🉑 +🈶 +🈚 +🈸 +🈺 +🈷️ +✴️ +🔶 +🔸 +🔆 +🔅 +🆚 +🎦 +📶 +🔁 +🔂 +🔀 +▶️ +⏩ +⏭️ +⏯️ +◀️ +⏪ +⏮️ +🔼 +⏫ +🔽 +⏬ +⏸️ +⏹️ +⏺️ +⏏️ +📴 +🛜 +📳 +📲 +☢️ +☣️ +⚠️ +🚸 +⚜️ +🔱 +〽️ +🔰 +✳️ +❇️ +♻️ +💱 +💲 +💹 +🈯 +❎ +✅ +✔️ +☑️ +⬆️ +↗️ +➡️ +↘️ +⬇️ +↙️ +⬅️ +↖️ +↕️ +↔️ +↩️ +↪️ +⤴️ +⤵️ +🔃 +🔄 +🔙 +🔛 +🔝 +🔚 +🔜 +🆕 +🆓 +🆙 +🆗 +🆒 +🆖 +ℹ️ +🅿️ +🈁 +🈂️ +🈳 +🔣 +🔤 +🔠 +🔡 +🔢 +#️⃣ +*️⃣ +0️⃣ +1️⃣ +2️⃣ +3️⃣ +4️⃣ +5️⃣ +6️⃣ +7️⃣ +8️⃣ +9️⃣ +🔟 +🌐 +💠 +🔷 +🔹 +🏧 +Ⓜ️ +🚾 +🚻 +🚹 +🚺 +♿ +🚼 +🛗 +🚮 +🚰 +🛂 +🛃 +🛄 +🛅 +💟 +⚛️ +🛐 +🕉️ +☸️ +☮️ +☯️ +☪️ +🪯 +✝️ +☦️ +✡️ +🔯 +🕎 +♾️ +🆔 +🧑‍🧑‍🧒 +🧑‍🧑‍🧒‍🧒 +🧑‍🧒 +🧑‍🧒‍🧒 +⚕️ +🎼 +🎵 +🎶 +✖️ +➕ +➖ +➗ +🟰 +➰ +➿ +〰️ +©️ +®️ +™️ +🔘 +🔳 +◼️ +◾ +▪️ +🔲 +◻️ +◽ +▫️ +👁️‍🗨️ diff --git a/emojipicker/app/src/main/res/raw/emoji_category_travel_places.csv b/emojipicker/app/src/main/res/raw/emoji_category_travel_places.csv new file mode 100644 index 00000000..8704e956 --- /dev/null +++ b/emojipicker/app/src/main/res/raw/emoji_category_travel_places.csv @@ -0,0 +1,122 @@ +🛑 +🚧 +🚨 +⛽ +🛢️ +🧭 +🛞 +🛟 +⚓ +🚏 +🚇 +🚥 +🚦 +🛴 +🦽 +🦼 +🩼 +🚲 +🛵 +🏍️ +🚙 +🚗 +🛻 +🚐 +🚚 +🚛 +🚜 +🏎️ +🚒 +🚑 +🚓 +🚕 +🛺 +🚌 +🚈 +🚝 +🚅 +🚄 +🚂 +🚃 +🚋 +🚎 +🚞 +🚊 +🚉 +🚍 +🚔 +🚘 +🚖 +🚆 +🚢 +🛳️ +🛥️ +🚤 +⛴️ +⛵ +🛶 +🚟 +🚠 +🚡 +🚁 +🛸 +🚀 +✈️ +🛫 +🛬 +🛩️ +🛝 +🎢 +🎡 +🎠 +🎪 +🗼 +🗽 +🗿 +🗻 +🏛️ +💈 +⛲ +⛩️ +🕍 +🕌 +🕋 +🛕 +⛪ +💒 +🏩 +🏯 +🏰 +🏗️ +🏢 +🏭 +🏬 +🏪 +🏟️ +🏦 +🏫 +🏨 +🏣 +🏤 +🏥 +🏚️ +🏠 +🏡 +🏘️ +🛖 +⛺ +🏕️ +⛱️ +🏙️ +🌆 +🌇 +🌃 +🌉 +🌁 +🛤️ +🛣️ +🗾 +🗺️ +🌐 +💺 +🧳 diff --git a/emojipicker/app/src/main/res/values-af/strings.xml b/emojipicker/app/src/main/res/values-af/strings.xml new file mode 100644 index 00000000..ef7bb7c4 --- /dev/null +++ b/emojipicker/app/src/main/res/values-af/strings.xml @@ -0,0 +1,42 @@ + + + + + "ONLANGS GEBRUIK" + "EMOSIEKONE EN EMOSIES" + "MENSE" + "DIERE EN NATUUR" + "KOS EN DRINKGOED" + "REIS EN PLEKKE" + "AKTIWITEITE EN GELEENTHEDE" + "VOORWERPE" + "SIMBOLE" + "VLAE" + "Geen emosiekone beskikbaar nie" + "Jy het nog geen emosiekone gebruik nie" + "emosiekoon-tweerigtingoorskakelaar" + "rigting waarin emosiekoon wys is gewissel" + "emosiekoonvariantkieser" + "%1$s en %2$s" + "skadu" + "ligte velkleur" + "mediumligte velkleur" + "medium velkleur" + "mediumdonker velkleur" + "donker velkleur" + diff --git a/emojipicker/app/src/main/res/values-am/strings.xml b/emojipicker/app/src/main/res/values-am/strings.xml new file mode 100644 index 00000000..5be491cc --- /dev/null +++ b/emojipicker/app/src/main/res/values-am/strings.xml @@ -0,0 +1,42 @@ + + + + + "በቅርብ ጊዜ ጥቅም ላይ የዋለ" + "ሳቂታዎች እና ስሜቶች" + "ሰዎች" + "እንስሳት እና ተፈጥሮ" + "ምግብ እና መጠጥ" + "ጉዞ እና ቦታዎች" + "እንቅስቃሴዎች እና ክስተቶች" + "ነገሮች" + "ምልክቶች" + "ባንዲራዎች" + "ምንም ስሜት ገላጭ ምስሎች አይገኙም" + "ምንም ስሜት ገላጭ ምስሎችን እስካሁን አልተጠቀሙም" + "የስሜት ገላጭ ምስል ባለሁለት አቅጣጫ መቀያየሪያ" + "የስሜት ገላጭ ምስል አቅጣጫ ተቀይሯል" + "የስሜት ገላጭ ምስል ተለዋዋጭ መራጭ" + "%1$s እና %2$s" + "ጥላ" + "ነጣ ያለ የቆዳ ቀለም" + "መካከለኛ ነጣ ያለ የቆዳ ቀለም" + "መካከለኛ የቆዳ ቀለም" + "መካከለኛ ጠቆር ያለ የቆዳ ቀለም" + "ጠቆር ያለ የቆዳ ቀለም" + diff --git a/emojipicker/app/src/main/res/values-ar/strings.xml b/emojipicker/app/src/main/res/values-ar/strings.xml new file mode 100644 index 00000000..4d42ff9e --- /dev/null +++ b/emojipicker/app/src/main/res/values-ar/strings.xml @@ -0,0 +1,42 @@ + + + + + "المستخدمة حديثًا" + "الوجوه المبتسمة والرموز التعبيرية" + "الأشخاص" + "الحيوانات والطبيعة" + "المأكولات والمشروبات" + "السفر والأماكن" + "الأنشطة والأحداث" + "عناصر متنوعة" + "الرموز" + "الأعلام" + "لا تتوفر أي رموز تعبيرية." + "لم تستخدم أي رموز تعبيرية حتى الآن." + "مفتاح ثنائي الاتجاه للرموز التعبيرية" + "تم تغيير اتجاه الإيموجي" + "أداة اختيار الرموز التعبيرية" + "‏%1$s و%2$s" + "الظل" + "بشرة فاتحة" + "بشرة فاتحة متوسّطة" + "بشرة متوسّطة" + "بشرة داكنة متوسّطة" + "بشرة داكنة" + diff --git a/emojipicker/app/src/main/res/values-as/strings.xml b/emojipicker/app/src/main/res/values-as/strings.xml new file mode 100644 index 00000000..6ca5f5b7 --- /dev/null +++ b/emojipicker/app/src/main/res/values-as/strings.xml @@ -0,0 +1,42 @@ + + + + + "অলপতে ব্যৱহৃত" + "স্মাইলী আৰু আৱেগ" + "মানুহ" + "পশু আৰু প্ৰকৃতি" + "খাদ্য আৰু পানীয়" + "ভ্ৰমণ আৰু স্থান" + "কাৰ্যকলাপ আৰু অনুষ্ঠান" + "বস্তু" + "চিহ্ন" + "পতাকা" + "কোনো ইম’জি উপলব্ধ নহয়" + "আপুনি এতিয়ালৈকে কোনো ইম’জি ব্যৱহাৰ কৰা নাই" + "ইম’জি বাইডাইৰেকশ্বনেল ছুইচ্চাৰ" + "দিক্-নিৰ্দেশনা প্ৰদৰ্শন কৰা ইম’জি সলনি কৰা হৈছে" + "ইম’জিৰ প্ৰকাৰ বাছনি কৰোঁতা" + "%1$s আৰু %2$s" + "ছাঁ" + "পাতলীয়া ছালৰ ৰং" + "মধ্যমীয়া পাতল ছালৰ ৰং" + "মিঠাবৰণীয়া ছালৰ ৰং" + "মধ্যমীয়া গাঢ় ছালৰ ৰং" + "গাঢ় ছালৰ ৰং" + diff --git a/emojipicker/app/src/main/res/values-az/strings.xml b/emojipicker/app/src/main/res/values-az/strings.xml new file mode 100644 index 00000000..c4c52857 --- /dev/null +++ b/emojipicker/app/src/main/res/values-az/strings.xml @@ -0,0 +1,42 @@ + + + + + "SON İSTİFADƏ EDİLƏN" + "SMAYLİK VƏ EMOSİYALAR" + "ADAMLAR" + "HEYVANLAR VƏ TƏBİƏT" + "QİDA VƏ İÇKİ" + "SƏYAHƏT VƏ MƏKANLAR" + "FƏALİYYƏTLƏR VƏ TƏDBİRLƏR" + "OBYEKTLƏR" + "SİMVOLLAR" + "BAYRAQLAR" + "Əlçatan emoji yoxdur" + "Hələ heç bir emojidən istifadə etməməsiniz" + "ikitərəfli emoji dəyişdirici" + "emoji istiqaməti dəyişdirildi" + "emoji variant seçicisi" + "%1$s və %2$s" + "kölgə" + "açıq dəri rəngi" + "orta açıq dəri rəngi" + "orta dəri rəngi" + "orta tünd dəri rəngi" + "tünd dəri rəngi" + diff --git a/emojipicker/app/src/main/res/values-b+sr+Latn/strings.xml b/emojipicker/app/src/main/res/values-b+sr+Latn/strings.xml new file mode 100644 index 00000000..8feb2961 --- /dev/null +++ b/emojipicker/app/src/main/res/values-b+sr+Latn/strings.xml @@ -0,0 +1,42 @@ + + + + + "NEDAVNO KORIŠĆENO" + "SMAJLIJI I EMOCIJE" + "LJUDI" + "ŽIVOTINJE I PRIRODA" + "HRANA I PIĆE" + "PUTOVANJA I MESTA" + "AKTIVNOSTI I DOGAĐAJI" + "OBJEKTI" + "SIMBOLI" + "ZASTAVE" + "Emodžiji nisu dostupni" + "Još niste koristili emodžije" + "dvosmerni prebacivač emodžija" + "smer emodžija je promenjen" + "birač varijanti emodžija" + "%1$s i %2$s" + "senka" + "koža svetle puti" + "koža srednjesvetle puti" + "koža srednje puti" + "koža srednjetamne puti" + "koža tamne puti" + diff --git a/emojipicker/app/src/main/res/values-be/strings.xml b/emojipicker/app/src/main/res/values-be/strings.xml new file mode 100644 index 00000000..67dc3c2e --- /dev/null +++ b/emojipicker/app/src/main/res/values-be/strings.xml @@ -0,0 +1,42 @@ + + + + + "НЯДАЎНА ВЫКАРЫСТАНЫЯ" + "СМАЙЛІКІ І ЭМОЦЫІ" + "ЛЮДЗІ" + "ЖЫВЁЛЫ І ПРЫРОДА" + "ЕЖА І НАПОІ" + "ПАДАРОЖЖЫ І МЕСЦЫ" + "ДЗЕЯННІ І ПАДЗЕІ" + "АБ\'ЕКТЫ" + "СІМВАЛЫ" + "СЦЯГІ" + "Няма даступных эмодзі" + "Вы пакуль не выкарыстоўвалі эмодзі" + "пераключальнік кірунку для эмодзі" + "кірунак арыентацыі эмодзі зменены" + "інструмент выбару варыянтаў эмодзі" + "%1$s і %2$s" + "цень" + "светлы колер скуры" + "умерана светлы колер скуры" + "нейтральны колер скуры" + "умерана цёмны колер скуры" + "цёмны колер скуры" + diff --git a/emojipicker/app/src/main/res/values-bg/strings.xml b/emojipicker/app/src/main/res/values-bg/strings.xml new file mode 100644 index 00000000..929d7676 --- /dev/null +++ b/emojipicker/app/src/main/res/values-bg/strings.xml @@ -0,0 +1,42 @@ + + + + + "НАСКОРО ИЗПОЛЗВАНИ" + "ЕМОТИКОНИ И ЕМОЦИИ" + "ХОРА" + "ЖИВОТНИ И ПРИРОДА" + "ХРАНИ И НАПИТКИ" + "ПЪТУВАНИЯ И МЕСТА" + "АКТИВНОСТИ И СЪБИТИЯ" + "ПРЕДМЕТИ" + "СИМВОЛИ" + "ЗНАМЕНА" + "Няма налични емоджи" + "Все още не сте използвали емоджита" + "двупосочен превключвател на емоджи" + "посоката на емоджи бе променена" + "инструмент за избор на варианти за емоджи" + "%1$s и %2$s" + "сянка" + "светъл цвят на кожата" + "средно светъл цвят на кожата" + "междинен цвят на кожата" + "средно тъмен цвят на кожата" + "тъмен цвят на кожата" + diff --git a/emojipicker/app/src/main/res/values-bn/strings.xml b/emojipicker/app/src/main/res/values-bn/strings.xml new file mode 100644 index 00000000..55a691f2 --- /dev/null +++ b/emojipicker/app/src/main/res/values-bn/strings.xml @@ -0,0 +1,42 @@ + + + + + "সম্প্রতি ব্যবহার করা হয়েছে" + "স্মাইলি ও আবেগ" + "ব্যক্তি" + "প্রাণী ও প্রকৃতি" + "খাদ্য ও পানীয়" + "ভ্রমণ ও জায়গা" + "অ্যাক্টিভিটি ও ইভেন্ট" + "অবজেক্ট" + "প্রতীক" + "ফ্ল্যাগ" + "কোনও ইমোজি উপলভ্য নেই" + "আপনি এখনও কোনও ইমোজি ব্যবহার করেননি" + "ইমোজি দ্বিমুখী সুইচার" + "ইমোজির দিক পরিবর্তন হয়েছে" + "ইমোজি ভেরিয়েন্ট বাছাইকারী" + "%1$s এবং %2$s" + "ছায়া" + "হাল্কা স্কিন টোন" + "মাঝারি-হাল্কা স্কিন টোন" + "মাঝারি স্কিন টোন" + "মাঝারি-গাঢ় স্কিন টোন" + "গাঢ় স্কিন টোন" + diff --git a/emojipicker/app/src/main/res/values-bs/strings.xml b/emojipicker/app/src/main/res/values-bs/strings.xml new file mode 100644 index 00000000..401f6c82 --- /dev/null +++ b/emojipicker/app/src/main/res/values-bs/strings.xml @@ -0,0 +1,42 @@ + + + + + "NEDAVNO KORIŠTENO" + "SMAJLIJI I EMOCIJE" + "OSOBE" + "ŽIVOTINJE I PRIRODA" + "HRANA I PIĆE" + "PUTOVANJA I MJESTA" + "AKTIVNOSTI I DOGAĐAJI" + "PREDMETI" + "SIMBOLI" + "ZASTAVE" + "Emoji sličice nisu dostupne" + "Još niste koristili nijednu emoji sličicu" + "dvosmjerni prebacivač emodžija" + "emodži gleda u smjeru postavke prekidača" + "birač varijanti emodžija" + "%1$s i %2$s" + "sjenka" + "svijetla boja kože" + "srednje svijetla boja kože" + "srednja boja kože" + "srednje tamna boja kože" + "tamna boja kože" + diff --git a/emojipicker/app/src/main/res/values-ca/strings.xml b/emojipicker/app/src/main/res/values-ca/strings.xml new file mode 100644 index 00000000..09e2bc9a --- /dev/null +++ b/emojipicker/app/src/main/res/values-ca/strings.xml @@ -0,0 +1,42 @@ + + + + + "UTILITZATS FA POC" + "EMOTICONES I EMOCIONS" + "PERSONES" + "ANIMALS I NATURALESA" + "MENJAR I BEGUDA" + "VIATGES I LLOCS" + "ACTIVITATS I ESDEVENIMENTS" + "OBJECTES" + "SÍMBOLS" + "BANDERES" + "No hi ha cap emoji disponible" + "Encara no has fet servir cap emoji" + "selector bidireccional d\'emojis" + "s\'ha canviat la direcció de l\'emoji" + "selector de variants d\'emojis" + "%1$s i %2$s" + "ombra" + "to de pell clar" + "to de pell mitjà-clar" + "to de pell mitjà" + "to de pell mitjà-fosc" + "to de pell fosc" + diff --git a/emojipicker/app/src/main/res/values-cs/strings.xml b/emojipicker/app/src/main/res/values-cs/strings.xml new file mode 100644 index 00000000..8d7e0f50 --- /dev/null +++ b/emojipicker/app/src/main/res/values-cs/strings.xml @@ -0,0 +1,42 @@ + + + + + "NEDÁVNO POUŽITÉ" + "SMAJLÍCI A EMOCE" + "LIDÉ" + "ZVÍŘATA A PŘÍRODA" + "JÍDLO A PITÍ" + "CESTOVÁNÍ A MÍSTA" + "AKTIVITY A UDÁLOSTI" + "OBJEKTY" + "SYMBOLY" + "VLAJKY" + "Nejsou k dispozici žádné smajlíky" + "Zatím jste žádná emodži nepoužili" + "dvousměrný přepínač smajlíků" + "směr pohledu smajlíků přepnut" + "výběr variant emodži" + "%1$s a %2$s" + "stín" + "světlý tón pleti" + "středně světlý tón pleti" + "střední tón pleti" + "středně tmavý tón pleti" + "tmavý tón pleti" + diff --git a/emojipicker/app/src/main/res/values-da/strings.xml b/emojipicker/app/src/main/res/values-da/strings.xml new file mode 100644 index 00000000..e9eb67b9 --- /dev/null +++ b/emojipicker/app/src/main/res/values-da/strings.xml @@ -0,0 +1,42 @@ + + + + + "BRUGT FOR NYLIG" + "SMILEYS OG HUMØRIKONER" + "PERSONER" + "DYR OG NATUR" + "MAD OG DRIKKE" + "REJSER OG STEDER" + "AKTIVITETER OG BEGIVENHEDER" + "TING" + "SYMBOLER" + "FLAG" + "Der er ingen tilgængelige emojis" + "Du har ikke brugt nogen emojis endnu" + "tovejsskifter til emojis" + "emojien vender en anden retning" + "vælger for emojivariant" + "%1$s og %2$s" + "skygge" + "lys hudfarve" + "mellemlys hudfarve" + "medium hudfarve" + "mellemmørk hudfarve" + "mørk hudfarve" + diff --git a/emojipicker/app/src/main/res/values-de/strings.xml b/emojipicker/app/src/main/res/values-de/strings.xml new file mode 100644 index 00000000..6e72ab75 --- /dev/null +++ b/emojipicker/app/src/main/res/values-de/strings.xml @@ -0,0 +1,42 @@ + + + + + "ZULETZT VERWENDET" + "SMILEYS UND EMOTIONEN" + "PERSONEN" + "TIERE UND NATUR" + "ESSEN UND TRINKEN" + "REISEN UND ORTE" + "AKTIVITÄTEN UND EVENTS" + "OBJEKTE" + "SYMBOLE" + "FLAGGEN" + "Keine Emojis verfügbar" + "Du hast noch keine Emojis verwendet" + "Bidirektionale Emoji-Auswahl" + "Emoji-Richtung geändert" + "Emojivarianten-Auswahl" + "%1$s und %2$s" + "Hautton" + "Heller Hautton" + "Mittelheller Hautton" + "Mittlerer Hautton" + "Mitteldunkler Hautton" + "Dunkler Hautton" + diff --git a/emojipicker/app/src/main/res/values-el/strings.xml b/emojipicker/app/src/main/res/values-el/strings.xml new file mode 100644 index 00000000..4a59ed67 --- /dev/null +++ b/emojipicker/app/src/main/res/values-el/strings.xml @@ -0,0 +1,42 @@ + + + + + "ΧΡΗΣΙΜΟΠΟΙΗΘΗΚΑΝ ΠΡΟΣΦΑΤΑ" + "ΕΙΚΟΝΙΔΙΑ SMILEY ΚΑΙ ΣΥΝΑΙΣΘΗΜΑΤΑ" + "ΑΤΟΜΑ" + "ΖΩΑ ΚΑΙ ΦΥΣΗ" + "ΦΑΓΗΤΟ ΚΑΙ ΠΟΤΟ" + "ΤΑΞΙΔΙΑ ΚΑΙ ΜΕΡΗ" + "ΔΡΑΣΤΗΡΙΟΤΗΤΕΣ ΚΑΙ ΣΥΜΒΑΝΤΑ" + "ΑΝΤΙΚΕΙΜΕΝΑ" + "ΣΥΜΒΟΛΑ" + "ΣΗΜΑΙΕΣ" + "Δεν υπάρχουν διαθέσιμα emoji" + "Δεν έχετε χρησιμοποιήσει κανένα emoji ακόμα" + "αμφίδρομο στοιχείο εναλλαγής emoji" + "έγινε εναλλαγή της κατεύθυνσης που είναι στραμμένο το emoji" + "επιλογέας παραλλαγής emoji" + "%1$s και %2$s" + "σκιά" + "ανοιχτός τόνος επιδερμίδας" + "μεσαίος προς ανοιχτός τόνος επιδερμίδας" + "μεσαίος τόνος επιδερμίδας" + "μεσαίος προς σκούρος τόνος επιδερμίδας" + "σκούρος τόνος επιδερμίδας" + diff --git a/emojipicker/app/src/main/res/values-en-rAU/strings.xml b/emojipicker/app/src/main/res/values-en-rAU/strings.xml new file mode 100644 index 00000000..0b651f51 --- /dev/null +++ b/emojipicker/app/src/main/res/values-en-rAU/strings.xml @@ -0,0 +1,42 @@ + + + + + "RECENTLY USED" + "SMILEYS AND EMOTIONS" + "PEOPLE" + "ANIMALS AND NATURE" + "FOOD AND DRINK" + "TRAVEL AND PLACES" + "ACTIVITIES AND EVENTS" + "OBJECTS" + "SYMBOLS" + "FLAGS" + "No emojis available" + "You haven\'t used any emoji yet" + "emoji bidirectional switcher" + "emoji facing direction switched" + "emoji variant selector" + "%1$s and %2$s" + "shadow" + "light skin tone" + "medium-light skin tone" + "medium skin tone" + "medium-dark skin tone" + "dark skin tone" + diff --git a/emojipicker/app/src/main/res/values-en-rCA/strings.xml b/emojipicker/app/src/main/res/values-en-rCA/strings.xml new file mode 100644 index 00000000..d056590c --- /dev/null +++ b/emojipicker/app/src/main/res/values-en-rCA/strings.xml @@ -0,0 +1,42 @@ + + + + + "RECENTLY USED" + "SMILEYS AND EMOTIONS" + "PEOPLE" + "ANIMALS AND NATURE" + "FOOD AND DRINK" + "TRAVEL AND PLACES" + "ACTIVITIES AND EVENTS" + "OBJECTS" + "SYMBOLS" + "FLAGS" + "No emojis available" + "You haven\'t used any emojis yet" + "emoji bidirectional switcher" + "emoji facing direction switched" + "emoji variant selector" + "%1$s and %2$s" + "shadow" + "light skin tone" + "medium light skin tone" + "medium skin tone" + "medium dark skin tone" + "dark skin tone" + diff --git a/emojipicker/app/src/main/res/values-en-rGB/strings.xml b/emojipicker/app/src/main/res/values-en-rGB/strings.xml new file mode 100644 index 00000000..0b651f51 --- /dev/null +++ b/emojipicker/app/src/main/res/values-en-rGB/strings.xml @@ -0,0 +1,42 @@ + + + + + "RECENTLY USED" + "SMILEYS AND EMOTIONS" + "PEOPLE" + "ANIMALS AND NATURE" + "FOOD AND DRINK" + "TRAVEL AND PLACES" + "ACTIVITIES AND EVENTS" + "OBJECTS" + "SYMBOLS" + "FLAGS" + "No emojis available" + "You haven\'t used any emoji yet" + "emoji bidirectional switcher" + "emoji facing direction switched" + "emoji variant selector" + "%1$s and %2$s" + "shadow" + "light skin tone" + "medium-light skin tone" + "medium skin tone" + "medium-dark skin tone" + "dark skin tone" + diff --git a/emojipicker/app/src/main/res/values-en-rIN/strings.xml b/emojipicker/app/src/main/res/values-en-rIN/strings.xml new file mode 100644 index 00000000..0b651f51 --- /dev/null +++ b/emojipicker/app/src/main/res/values-en-rIN/strings.xml @@ -0,0 +1,42 @@ + + + + + "RECENTLY USED" + "SMILEYS AND EMOTIONS" + "PEOPLE" + "ANIMALS AND NATURE" + "FOOD AND DRINK" + "TRAVEL AND PLACES" + "ACTIVITIES AND EVENTS" + "OBJECTS" + "SYMBOLS" + "FLAGS" + "No emojis available" + "You haven\'t used any emoji yet" + "emoji bidirectional switcher" + "emoji facing direction switched" + "emoji variant selector" + "%1$s and %2$s" + "shadow" + "light skin tone" + "medium-light skin tone" + "medium skin tone" + "medium-dark skin tone" + "dark skin tone" + diff --git a/emojipicker/app/src/main/res/values-en-rXC/strings.xml b/emojipicker/app/src/main/res/values-en-rXC/strings.xml new file mode 100644 index 00000000..3e02185f --- /dev/null +++ b/emojipicker/app/src/main/res/values-en-rXC/strings.xml @@ -0,0 +1,42 @@ + + + + + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‎‎‏‏‏‏‎‏‏‎‏‎‎‎‏‏‎‏‎‏‎‏‏‏‏‏‎‏‏‎‏‏‎‏‏‏‎‏‎‏‏‏‏‎‎‏‏‎‎‏‎‎‏‏‏‎RECENTLY USED‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‏‏‏‎‎‏‏‎‎‏‎‏‏‎‏‏‎‎‏‏‏‎‎‎‏‏‏‎‏‏‏‏‏‎‏‏‎‎‏‎‏‎‏‏‎‏‎‎‏‏‏‎‎‎‎‎‏‎SMILEYS AND EMOTIONS‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‏‎‎‏‎‏‎‎‏‎‏‎‎‎‏‏‎‏‏‏‎‏‎‏‏‎‏‏‏‏‏‎‎‎‏‏‎‏‎‏‎‏‏‏‏‎‏‎‏‎‏‏‎‎‎‏‎PEOPLE‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‎‎‏‏‎‎‏‏‏‎‏‎‏‎‏‎‎‏‏‏‎‏‏‏‎‏‎‎‏‏‏‎‎‏‎‏‏‏‏‏‏‎‎‏‎‎‏‎‎‏‎‎‏‎‏‎‏‎ANIMALS AND NATURE‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‎‏‎‎‎‎‎‏‏‏‎‏‎‎‎‎‏‎‎‎‏‏‎‎‏‎‏‎‏‎‏‎‎‏‎‎‏‎‏‎‎‏‏‏‏‎‎‎‎‏‏‏‎‏‎‏‏‎FOOD AND DRINK‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‎‎‏‏‏‏‏‎‏‎‏‎‎‎‏‏‎‏‏‎‏‎‎‏‎‎‏‎‎‎‏‎‎‎‎‏‎‎‎‏‏‎‏‏‏‏‎‎‎‏‏‎‎‎‎‎‎‎TRAVEL AND PLACES‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‎‏‏‎‎‏‏‎‎‏‏‏‎‏‎‏‏‎‎‏‎‏‏‎‎‏‎‏‏‏‏‏‏‎‏‏‎‏‏‎‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‎ACTIVITIES AND EVENTS‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‎‏‎‏‏‏‏‎‏‎‏‎‎‎‏‏‏‏‏‎‎‎‏‏‎‎‎‏‏‎‎‎‎‏‏‎‏‎‏‏‎‎‏‎‎‏‏‎‎‏‏‏‎‎‎‏‏‎OBJECTS‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‎‎‎‎‏‎‏‎‎‎‎‏‎‏‏‎‏‎‏‎‏‏‏‏‏‏‏‏‎‎‎‎‎‏‏‎‏‏‏‎‎‎‎‏‏‎‎‎‎‎‎‎‏‏‎‏‏‎SYMBOLS‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‏‏‏‎‏‎‏‏‏‏‏‎‎‏‏‏‎‎‏‎‏‏‎‏‏‎‎‎‎‎‏‎‎‏‎‏‏‎‎‎‏‏‏‏‏‏‏‎‎‏‏‏‎‎‏‏‏‎FLAGS‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‎‎‎‎‎‎‎‎‏‎‎‎‎‏‏‎‏‎‏‏‎‏‎‏‏‎‎‎‎‎‎‎‏‎‏‎‏‎‎‏‏‎‎‎‎‎‏‎‏‎‎‏‎‏‎‎‎‏‎No emojis available‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‎‏‎‎‏‎‎‎‏‎‎‎‎‏‏‎‏‏‎‎‏‏‏‎‎‎‎‏‎‎‎‏‏‏‏‏‎‏‎‎‎‎‏‏‎‎‎‏‎‏‎‏‎‏‏‎‎‎‎You haven\'t used any emojis yet‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‎‏‎‎‏‎‎‎‎‎‎‏‎‎‎‎‎‏‏‏‎‏‎‎‏‏‏‏‎‏‎‏‏‏‎‏‎‎‏‎‏‎‎‎‎‏‎‏‎‎‎‏‏‏‏‎‏‎emoji bidirectional switcher‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‎‎‎‏‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‎‎‏‎‏‎‎‏‎‏‎‏‏‏‏‏‎‏‏‎‏‏‏‏‏‏‎‎‎‎‎‏‏‎emoji facing direction switched‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‎‎‎‎‏‏‏‎‏‏‎‎‎‏‎‏‎‏‏‏‏‎‏‎‏‎‏‏‎‏‎‎‎‏‎‎‏‎‎‏‎‎‎‏‏‎‏‎‏‎‎‏‏‎‎‎‎‎‎emoji variant selector‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‎‏‎‎‏‎‎‎‏‎‎‏‎‏‏‏‎‎‏‎‎‏‎‏‏‏‏‏‏‎‎‎‏‏‎‎‏‎‎‏‎‏‎‎‎‏‎‏‏‏‏‎‏‎‎‎‏‎%1$s and %2$s‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‎‎‏‏‎‏‏‎‎‎‏‏‏‎‎‎‏‏‏‏‏‏‏‎‎‎‏‏‎‏‎‎‏‎‏‎‎‏‏‏‏‎‎‎‎‏‏‏‎‏‎‏‏‎‎‎‎‎shadow‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‏‎‏‎‎‏‏‎‏‎‎‏‎‎‏‏‎‏‏‏‎‏‎‏‎‏‎‎‏‎‏‏‎‏‎‎‎‎‎‏‎‎‏‏‎‎‎‏‏‏‏‎‎‏‎‎‎‏‎light skin tone‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‏‎‎‎‏‎‎‏‎‎‏‏‏‎‎‎‎‎‏‏‏‏‏‏‎‎‏‏‎‏‏‎‎‎‎‎‏‏‎‎‏‎‏‎‏‏‎‏‏‎‏‏‎‏‎‏‎‎medium light skin tone‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‏‏‎‎‏‏‎‏‏‎‏‎‎‏‎‏‏‏‏‎‏‎‎‎‎‎‎‏‎‏‎‏‏‎‎‏‏‎‏‏‏‎‎‎‏‎‎‎‎‎‏‏‎medium skin tone‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‎‎‏‎‏‎‏‎‎‏‏‏‎‎‏‎‎‎‎‎‎‎‏‏‏‏‏‎‎‏‎‎‎‎‏‏‏‎‎‎‏‎‏‏‏‏‎‏‎‏‎‏‎‏‏‎‏‎medium dark skin tone‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‎‏‎‎‎‏‏‎‎‏‎‏‎‏‎‎‎‎‏‎‏‎‏‏‎‎‎‎‏‎‎‎‏‏‎‎‎‎‎‎‏‏‏‎‎‏‏‎‎‏‏‏‏‎‏‏‏‎‎dark skin tone‎‏‎‎‏‎" + diff --git a/emojipicker/app/src/main/res/values-es-rUS/strings.xml b/emojipicker/app/src/main/res/values-es-rUS/strings.xml new file mode 100644 index 00000000..e9001edf --- /dev/null +++ b/emojipicker/app/src/main/res/values-es-rUS/strings.xml @@ -0,0 +1,42 @@ + + + + + "USADOS RECIENTEMENTE" + "EMOTICONES Y EMOCIONES" + "PERSONAS" + "ANIMALES Y NATURALEZA" + "COMIDAS Y BEBIDAS" + "VIAJES Y LUGARES" + "ACTIVIDADES Y EVENTOS" + "OBJETOS" + "SÍMBOLOS" + "BANDERAS" + "No hay ningún emoji disponible" + "Todavía no usaste ningún emoji" + "selector bidireccional de emojis" + "se cambió la dirección del emoji" + "selector de variantes de emojis" + "%1$s y %2$s" + "sombra" + "tono de piel claro" + "tono de piel medio claro" + "tono de piel intermedio" + "tono de piel medio oscuro" + "tono de piel oscuro" + diff --git a/emojipicker/app/src/main/res/values-es/strings.xml b/emojipicker/app/src/main/res/values-es/strings.xml new file mode 100644 index 00000000..d2aed368 --- /dev/null +++ b/emojipicker/app/src/main/res/values-es/strings.xml @@ -0,0 +1,42 @@ + + + + + "USADOS RECIENTEMENTE" + "EMOTICONOS Y EMOCIONES" + "PERSONAS" + "ANIMALES Y NATURALEZA" + "COMIDA Y BEBIDA" + "VIAJES Y SITIOS" + "ACTIVIDADES Y EVENTOS" + "OBJETOS" + "SÍMBOLOS" + "BANDERAS" + "No hay emojis disponibles" + "Aún no has usado ningún emoji" + "cambio bidireccional de emojis" + "dirección a la que se orienta el emoji cambiada" + "selector de variantes de emojis" + "%1$s y %2$s" + "sombra" + "tono de piel claro" + "tono de piel medio claro" + "tono de piel medio" + "tono de piel medio oscuro" + "tono de piel oscuro" + diff --git a/emojipicker/app/src/main/res/values-et/strings.xml b/emojipicker/app/src/main/res/values-et/strings.xml new file mode 100644 index 00000000..8b3d05aa --- /dev/null +++ b/emojipicker/app/src/main/res/values-et/strings.xml @@ -0,0 +1,42 @@ + + + + + "HILJUTI KASUTATUD" + "NÄOIKOONID JA EMOTSIOONID" + "INIMESED" + "LOOMAD JA LOODUS" + "SÖÖK JA JOOK" + "REISIMINE JA KOHAD" + "TEGEVUSED JA SÜNDMUSED" + "OBJEKTID" + "SÜMBOLID" + "LIPUD" + "Ühtegi emotikoni pole saadaval" + "Te pole veel ühtegi emotikoni kasutanud" + "emotikoni kahesuunaline lüliti" + "emotikoni suunda vahetati" + "emotikoni variandi valija" + "%1$s ja %2$s" + "vari" + "hele nahatoon" + "keskmiselt hele nahatoon" + "keskmine nahatoon" + "keskmiselt tume nahatoon" + "tume nahatoon" + diff --git a/emojipicker/app/src/main/res/values-eu/strings.xml b/emojipicker/app/src/main/res/values-eu/strings.xml new file mode 100644 index 00000000..9c550ca9 --- /dev/null +++ b/emojipicker/app/src/main/res/values-eu/strings.xml @@ -0,0 +1,42 @@ + + + + + "ERABILITAKO AZKENAK" + "AURPEGIERAK ETA ALDARTEAK" + "JENDEA" + "ANIMALIAK ETA NATURA" + "JAN-EDANAK" + "BIDAIAK ETA TOKIAK" + "JARDUERAK ETA GERTAERAK" + "OBJEKTUAK" + "IKURRAK" + "BANDERAK" + "Ez dago emotikonorik erabilgarri" + "Ez duzu erabili emojirik oraingoz" + "noranzko biko emoji-aldatzailea" + "emojiaren norabidea aldatu da" + "emojien aldaeren hautatzailea" + "%1$s eta %2$s" + "itzala" + "azalaren tonu argia" + "azalaren tonu argixka" + "azalaren tarteko tonua" + "azalaren tonu ilunxkoa" + "azalaren tonu iluna" + diff --git a/emojipicker/app/src/main/res/values-fa/strings.xml b/emojipicker/app/src/main/res/values-fa/strings.xml new file mode 100644 index 00000000..5930a4f0 --- /dev/null +++ b/emojipicker/app/src/main/res/values-fa/strings.xml @@ -0,0 +1,42 @@ + + + + + "اخیراً استفاده‌شده" + "شکلک‌ها و احساسات" + "افراد" + "حیوانات و طبیعت" + "غذا و نوشیدنی" + "سفر و مکان‌ها" + "فعالیت‌ها و رویدادها" + "اشیاء" + "نشان‌ها" + "پرچم‌ها" + "اموجی دردسترس نیست" + "هنوز از هیچ اموجی‌ای استفاده نکرده‌اید" + "تغییردهنده دوسویه اموجی" + "جهت چهره اموجی تغییر کرد" + "گزینشگر متغیر اموجی" + "‏%1$s و %2$s" + "سایه" + "رنگ‌مایه پوست روشن" + "رنگ‌مایه پوست ملایم روشن" + "رنگ‌مایه پوست ملایم" + "رنگ‌مایه پوست ملایم تیره" + "رنگ‌مایه پوست تیره" + diff --git a/emojipicker/app/src/main/res/values-fi/strings.xml b/emojipicker/app/src/main/res/values-fi/strings.xml new file mode 100644 index 00000000..bb6ccb58 --- /dev/null +++ b/emojipicker/app/src/main/res/values-fi/strings.xml @@ -0,0 +1,42 @@ + + + + + "VIIMEKSI KÄYTETYT" + "HYMIÖT JA TUNNETILAT" + "IHMISET" + "ELÄIMET JA LUONTO" + "RUOKA JA JUOMA" + "MATKAILU JA PAIKAT" + "AKTIVITEETIT JA TAPAHTUMAT" + "ESINEET" + "SYMBOLIT" + "LIPUT" + "Ei emojeita saatavilla" + "Et ole vielä käyttänyt emojeita" + "emoji kaksisuuntainen vaihtaja" + "emojin osoitussuunta vaihdettu" + "emojivalitsin" + "%1$s ja %2$s" + "varjostus" + "vaalea ihonväri" + "melko vaalea ihonväri" + "keskimääräinen ihonväri" + "melko tumma ihonväri" + "tumma ihonväri" + diff --git a/emojipicker/app/src/main/res/values-fr-rCA/strings.xml b/emojipicker/app/src/main/res/values-fr-rCA/strings.xml new file mode 100644 index 00000000..334f18f5 --- /dev/null +++ b/emojipicker/app/src/main/res/values-fr-rCA/strings.xml @@ -0,0 +1,42 @@ + + + + + "UTILISÉS RÉCEMMENT" + "ÉMOTICÔNES ET ÉMOTIONS" + "PERSONNES" + "ANIMAUX ET NATURE" + "ALIMENTS ET BOISSONS" + "VOYAGES ET LIEUX" + "ACTIVITÉS ET ÉVÉNEMENTS" + "OBJETS" + "SYMBOLES" + "DRAPEAUX" + "Aucun émoji proposé" + "Vous n\'avez encore utilisé aucun émoji" + "sélecteur bidirectionnel d\'émoji" + "Émoji tourné dans la direction inverse" + "sélecteur de variantes d\'émoji" + "%1$s et %2$s" + "ombre" + "teint clair" + "teint moyennement clair" + "teint moyen" + "teint moyennement foncé" + "teint foncé" + diff --git a/emojipicker/app/src/main/res/values-fr/strings.xml b/emojipicker/app/src/main/res/values-fr/strings.xml new file mode 100644 index 00000000..66f9f4d8 --- /dev/null +++ b/emojipicker/app/src/main/res/values-fr/strings.xml @@ -0,0 +1,42 @@ + + + + + "UTILISÉS RÉCEMMENT" + "ÉMOTICÔNES ET ÉMOTIONS" + "PERSONNES" + "ANIMAUX ET NATURE" + "ALIMENTATION ET BOISSONS" + "VOYAGES ET LIEUX" + "ACTIVITÉS ET ÉVÉNEMENTS" + "OBJETS" + "SYMBOLES" + "DRAPEAUX" + "Aucun emoji disponible" + "Vous n\'avez pas encore utilisé d\'emoji" + "sélecteur d\'emoji bidirectionnel" + "sens de l\'orientation de l\'emoji inversé" + "sélecteur de variante d\'emoji" + "%1$s et %2$s" + "ombre" + "teint clair" + "teint intermédiaire à clair" + "teint intermédiaire" + "teint intermédiaire à foncé" + "teint foncé" + diff --git a/emojipicker/app/src/main/res/values-gl/strings.xml b/emojipicker/app/src/main/res/values-gl/strings.xml new file mode 100644 index 00000000..f8715c36 --- /dev/null +++ b/emojipicker/app/src/main/res/values-gl/strings.xml @@ -0,0 +1,42 @@ + + + + + "USADOS HAI POUCO" + "ICONAS XESTUAIS E EMOTICONAS" + "PERSOAS" + "ANIMAIS E NATUREZA" + "COMIDA E BEBIDA" + "VIAXES E LUGARES" + "ACTIVIDADES E EVENTOS" + "OBXECTOS" + "SÍMBOLOS" + "BANDEIRAS" + "Non hai ningún emoji dispoñible" + "Aínda non utilizaches ningún emoji" + "selector bidireccional de emojis" + "dirección do emoji cambiada" + "selector de variantes de emojis" + "%1$s e %2$s" + "sombra" + "ton de pel claro" + "ton de pel lixeiramente claro" + "ton de pel medio" + "ton de pel lixeiramente escuro" + "ton de pel escuro" + diff --git a/emojipicker/app/src/main/res/values-gu/strings.xml b/emojipicker/app/src/main/res/values-gu/strings.xml new file mode 100644 index 00000000..dad9fd38 --- /dev/null +++ b/emojipicker/app/src/main/res/values-gu/strings.xml @@ -0,0 +1,42 @@ + + + + + "તાજેતરમાં વપરાયેલું" + "સ્માઇલી અને મનોભાવો" + "લોકો" + "પ્રાણીઓ અને પ્રકૃતિ" + "ભોજન અને પીણાં" + "મુસાફરી અને સ્થળો" + "પ્રવૃત્તિઓ અને ઇવેન્ટ" + "ઑબ્જેક્ટ" + "પ્રતીકો" + "ઝંડા" + "કોઈ ઇમોજી ઉપલબ્ધ નથી" + "તમે હજી સુધી કોઈ ઇમોજીનો ઉપયોગ કર્યો નથી" + "બે દિશામાં સ્વિચ થઈ શકતું ઇમોજી સ્વિચર" + "ઇમોજીની દિશા બદલવામાં આવી" + "ઇમોજીનો પ્રકાર પસંદગીકર્તા" + "%1$s અને %2$s" + "શૅડો" + "ત્વચાનો હળવો ટોન" + "ત્વચાનો મધ્યમ હળવો ટોન" + "ત્વચાનો મધ્યમ ટોન" + "ત્વચાનો મધ્યમ ઘેરો ટોન" + "ત્વચાનો ઘેરો ટોન" + diff --git a/emojipicker/app/src/main/res/values-hi/strings.xml b/emojipicker/app/src/main/res/values-hi/strings.xml new file mode 100644 index 00000000..81cd653a --- /dev/null +++ b/emojipicker/app/src/main/res/values-hi/strings.xml @@ -0,0 +1,42 @@ + + + + + "हाल ही में इस्तेमाल किए गए" + "स्माइली और भावनाएं" + "लोग" + "जानवर और प्रकृति" + "खाने-पीने की चीज़ें" + "यात्रा और जगहें" + "गतिविधियां और इवेंट" + "ऑब्जेक्ट" + "सिंबल" + "झंडे" + "कोई इमोजी उपलब्ध नहीं है" + "आपने अब तक किसी भी इमोजी का इस्तेमाल नहीं किया है" + "दोनों तरफ़ ले जा सकने वाले स्विचर का इमोजी" + "इमोजी को फ़्लिप किया गया" + "इमोजी के वैरिएंट चुनने का टूल" + "%1$s और %2$s" + "शैडो" + "हल्के रंग की त्वचा" + "थोड़े हल्के रंग की त्वचा" + "सामान्य रंग की त्वचा" + "थोड़े गहरे रंग की त्वचा" + "गहरे रंग की त्वचा" + diff --git a/emojipicker/app/src/main/res/values-hr/strings.xml b/emojipicker/app/src/main/res/values-hr/strings.xml new file mode 100644 index 00000000..481b4867 --- /dev/null +++ b/emojipicker/app/src/main/res/values-hr/strings.xml @@ -0,0 +1,42 @@ + + + + + "NEDAVNO KORIŠTENO" + "SMAJLIĆI I EMOCIJE" + "OSOBE" + "ŽIVOTINJE I PRIRODA" + "HRANA I PIĆE" + "PUTOVANJA I MJESTA" + "AKTIVNOSTI I DOGAĐAJI" + "OBJEKTI" + "SIMBOLI" + "ZASTAVE" + "Nije dostupan nijedan emoji" + "Još niste upotrijebili emojije" + "dvosmjerni izmjenjivač emojija" + "promijenjen je smjer emojija" + "alat za odabir varijante emojija" + "%1$s i %2$s" + "sjena" + "svijetla boja kože" + "srednje svijetla boja kože" + "srednja boja kože" + "srednje tamna boja kože" + "tamna boja kože" + diff --git a/emojipicker/app/src/main/res/values-hu/strings.xml b/emojipicker/app/src/main/res/values-hu/strings.xml new file mode 100644 index 00000000..d048746c --- /dev/null +++ b/emojipicker/app/src/main/res/values-hu/strings.xml @@ -0,0 +1,42 @@ + + + + + "LEGUTÓBB HASZNÁLT" + "HANGULATJELEK ÉS HANGULATOK" + "SZEMÉLYEK" + "ÁLLATOK ÉS TERMÉSZET" + "ÉTEL ÉS ITAL" + "UTAZÁS ÉS HELYEK" + "TEVÉKENYSÉGEK ÉS ESEMÉNYEK" + "TÁRGYAK" + "SZIMBÓLUMOK" + "ZÁSZLÓK" + "Nincsenek rendelkezésre álló emojik" + "Még nem használt emojikat" + "kétirányú emojiváltó" + "módosítva lett, hogy merre nézzen az emoji" + "emojiváltozat-választó" + "%1$s és %2$s" + "árnyék" + "világos bőrtónus" + "közepesen világos bőrtónus" + "közepes bőrtónus" + "közepesen sötét bőrtónus" + "sötét bőrtónus" + diff --git a/emojipicker/app/src/main/res/values-hy/strings.xml b/emojipicker/app/src/main/res/values-hy/strings.xml new file mode 100644 index 00000000..be551dec --- /dev/null +++ b/emojipicker/app/src/main/res/values-hy/strings.xml @@ -0,0 +1,42 @@ + + + + + "ՎԵՐՋԵՐՍ ՕԳՏԱԳՈՐԾՎԱԾ" + "ԶՄԱՅԼԻԿՆԵՐ ԵՎ ՀՈՒԶԱՊԱՏԿԵՐԱԿՆԵՐ" + "ՄԱՐԴԻԿ" + "ԿԵՆԴԱՆԻՆԵՐ ԵՎ ԲՆՈՒԹՅՈՒՆ" + "ՍՆՈՒՆԴ ԵՎ ԽՄԻՉՔ" + "ՃԱՄՓՈՐԴՈՒԹՅՈՒՆ ԵՎ ՏԵՍԱՐԺԱՆ ՎԱՅՐԵՐ" + "ԺԱՄԱՆՑ ԵՎ ՄԻՋՈՑԱՌՈՒՄՆԵՐ" + "ԱՌԱՐԿԱՆԵՐ" + "ՆՇԱՆՆԵՐ" + "ԴՐՈՇՆԵՐ" + "Հասանելի էմոջիներ չկան" + "Դուք դեռ չեք օգտագործել էմոջիներ" + "էմոջիների երկկողմանի փոխանջատիչ" + "էմոջիի դեմքի ուղղությունը փոխվեց" + "էմոջիների տարբերակի ընտրիչ" + "%1$s և %2$s" + "ստվեր" + "մաշկի բաց երանգ" + "մաշկի չափավոր բաց երանգ" + "մաշկի չեզոք երանգ" + "մաշկի չափավոր մուգ երանգ" + "մաշկի մուգ երանգ" + diff --git a/emojipicker/app/src/main/res/values-in/strings.xml b/emojipicker/app/src/main/res/values-in/strings.xml new file mode 100644 index 00000000..09703b72 --- /dev/null +++ b/emojipicker/app/src/main/res/values-in/strings.xml @@ -0,0 +1,42 @@ + + + + + "TERAKHIR DIGUNAKAN" + "SMILEY DAN EMOTIKON" + "ORANG" + "HEWAN DAN ALAM" + "MAKANAN DAN MINUMAN" + "WISATA DAN TEMPAT" + "AKTIVITAS DAN ACARA" + "OBJEK" + "SIMBOL" + "BENDERA" + "Tidak ada emoji yang tersedia" + "Anda belum menggunakan emoji apa pun" + "pengalih dua arah emoji" + "arah hadap emoji dialihkan" + "pemilih varian emoji" + "%1$s dan %2$s" + "bayangan" + "warna kulit cerah" + "warna kulit kuning langsat" + "warna kulit sawo matang" + "warna kulit cokelat" + "warna kulit gelap" + diff --git a/emojipicker/app/src/main/res/values-is/strings.xml b/emojipicker/app/src/main/res/values-is/strings.xml new file mode 100644 index 00000000..691d3c62 --- /dev/null +++ b/emojipicker/app/src/main/res/values-is/strings.xml @@ -0,0 +1,42 @@ + + + + + "NOTAÐ NÝLEGA" + "BROSKARLAR OG TILFINNINGAR" + "FÓLK" + "DÝR OG NÁTTÚRA" + "MATUR OG DRYKKUR" + "FERÐALÖG OG STAÐIR" + "VIRKNI OG VIÐBURÐIR" + "HLUTIR" + "TÁKN" + "FÁNAR" + "Engin emoji-tákn í boði" + "Þú hefur ekki notað nein emoji enn" + "emoji-val í báðar áttir" + "Áttinni sem emoji snýr að hefur verið breytt" + "val emoji-afbrigðis" + "%1$s og %2$s" + "skuggi" + "ljós húðlitur" + "meðalljós húðlitur" + "húðlitur í meðallagi" + "meðaldökkur húðlitur" + "dökkur húðlitur" + diff --git a/emojipicker/app/src/main/res/values-it/strings.xml b/emojipicker/app/src/main/res/values-it/strings.xml new file mode 100644 index 00000000..6ff2bf9c --- /dev/null +++ b/emojipicker/app/src/main/res/values-it/strings.xml @@ -0,0 +1,42 @@ + + + + + "USATE DI RECENTE" + "SMILE ED EMOZIONI" + "PERSONE" + "ANIMALI E NATURA" + "CIBO E BEVANDE" + "VIAGGI E LUOGHI" + "ATTIVITÀ ED EVENTI" + "OGGETTI" + "SIMBOLI" + "BANDIERE" + "Nessuna emoji disponibile" + "Non hai ancora usato alcuna emoji" + "selettore bidirezionale di emoji" + "emoji sottosopra" + "selettore variante emoji" + "%1$s e %2$s" + "ombra" + "carnagione chiara" + "carnagione medio-chiara" + "carnagione media" + "carnagione medio-scura" + "carnagione scura" + diff --git a/emojipicker/app/src/main/res/values-iw/strings.xml b/emojipicker/app/src/main/res/values-iw/strings.xml new file mode 100644 index 00000000..7a8eae8a --- /dev/null +++ b/emojipicker/app/src/main/res/values-iw/strings.xml @@ -0,0 +1,42 @@ + + + + + "בשימוש לאחרונה" + "סמיילי ואמוטיקונים" + "אנשים" + "בעלי חיים וטבע" + "מזון ומשקאות" + "נסיעות ומקומות" + "פעילויות ואירועים" + "אובייקטים" + "סמלים" + "דגלים" + "אין סמלי אמוג\'י זמינים" + "עדיין לא השתמשת באף אמוג\'י" + "לחצן דו-כיווני למעבר לאמוג\'י" + "מתג נגישות להחלפת הכיוון של האמוג\'י" + "בורר של סוגי אמוג\'י" + "‏%1$s ו-%2$s" + "צל" + "גוון עור בהיר" + "גוון עור בינוני-בהיר" + "גוון עור בינוני" + "גוון עור בינוני-כהה" + "גוון עור כהה" + diff --git a/emojipicker/app/src/main/res/values-ja/strings.xml b/emojipicker/app/src/main/res/values-ja/strings.xml new file mode 100644 index 00000000..395ee6d7 --- /dev/null +++ b/emojipicker/app/src/main/res/values-ja/strings.xml @@ -0,0 +1,42 @@ + + + + + "最近使用した絵文字" + "顔文字、気分" + "人物" + "動物、自然" + "食べ物、飲み物" + "移動、場所" + "活動、イベント" + "アイテム" + "記号" + "旗" + "使用できる絵文字がありません" + "まだ絵文字を使用していません" + "絵文字の双方向切り替え" + "絵文字の向きを切り替えました" + "絵文字バリエーション セレクタ" + "%1$s、%2$s" + "シャドウ" + "明るい肌の色" + "やや明るい肌の色" + "中間の明るさの肌の色" + "やや濃い肌の色" + "濃い肌の色" + diff --git a/emojipicker/app/src/main/res/values-ka/strings.xml b/emojipicker/app/src/main/res/values-ka/strings.xml new file mode 100644 index 00000000..5d23faa2 --- /dev/null +++ b/emojipicker/app/src/main/res/values-ka/strings.xml @@ -0,0 +1,42 @@ + + + + + "ბოლო დროს გამოყენებული" + "სიცილაკები და ემოციები" + "ადამიანები" + "ცხოველები და ბუნება" + "საჭმელი და სასმელი" + "მოგზაურობა და ადგილები" + "აქტივობები და მოვლენები" + "ობიექტები" + "სიმბოლოები" + "დროშები" + "Emoji-ები მიუწვდომელია" + "Emoji-ებით ჯერ არ გისარგებლიათ" + "emoji-ს ორმიმართულებიანი გადამრთველი" + "emoji-ის მიმართულება შეცვლილია" + "emoji-ს ვარიანტის ამომრჩევი" + "%1$s და %2$s" + "ჩრდილი" + "კანის ღია ტონი" + "კანის ღია საშუალო ტონი" + "კანის საშუალო ტონი" + "კანის მუქი საშუალო ტონი" + "კანის მუქი ტონი" + diff --git a/emojipicker/app/src/main/res/values-kk/strings.xml b/emojipicker/app/src/main/res/values-kk/strings.xml new file mode 100644 index 00000000..cd6a8c57 --- /dev/null +++ b/emojipicker/app/src/main/res/values-kk/strings.xml @@ -0,0 +1,42 @@ + + + + + "СОҢҒЫ ҚОЛДАНЫЛҒАНДАР" + "СМАЙЛДАР МЕН ЭМОЦИЯЛАР" + "АДАМДАР" + "ЖАНУАРЛАР ЖӘНЕ ТАБИҒАТ" + "ТАМАҚ ПЕН СУСЫН" + "САЯХАТ ЖӘНЕ ОРЫНДАР" + "ӘРЕКЕТТЕР МЕН ІС-ШАРАЛАР" + "НЫСАНДАР" + "ТАҢБАЛАР" + "ЖАЛАУШАЛАР" + "Эмоджи жоқ" + "Әлі ешқандай эмоджи пайдаланылған жоқ." + "екіжақты эмоджи ауыстырғыш" + "эмоджи бағыты ауыстырылды" + "эмоджи нұсқаларын таңдау құралы" + "%1$s және %2$s" + "көлеңке" + "терінің ақшыл реңі" + "терінің орташа ақшыл реңі" + "терінің орташа реңі" + "терінің орташа қараторы реңі" + "терінің қараторы реңі" + diff --git a/emojipicker/app/src/main/res/values-km/strings.xml b/emojipicker/app/src/main/res/values-km/strings.xml new file mode 100644 index 00000000..0b4dffc2 --- /dev/null +++ b/emojipicker/app/src/main/res/values-km/strings.xml @@ -0,0 +1,42 @@ + + + + + "បាន​ប្រើ​ថ្មីៗ​នេះ" + "រូប​ទឹក​មុខ និងអារម្មណ៍" + "មនុស្ស" + "សត្វ និងធម្មជាតិ" + "អាហារ និងភេសជ្ជៈ" + "ការធ្វើដំណើរ និងទីកន្លែង" + "សកម្មភាព និងព្រឹត្តិការណ៍" + "វត្ថុ" + "និមិត្តសញ្ញា" + "ទង់" + "មិនមាន​រូប​អារម្មណ៍ទេ" + "អ្នក​មិនទាន់​បានប្រើរូប​អារម្មណ៍​ណាមួយ​នៅឡើយទេ" + "មុខងារប្ដូរទ្វេទិសនៃរូប​អារម្មណ៍" + "បានប្ដូរទិសដៅបែររបស់រូប​អារម្មណ៍" + "ផ្ទាំងជ្រើសរើសជម្រើសរូប​អារម្មណ៍" + "%1$s និង %2$s" + "ស្រមោល" + "សម្បុរស្បែក​ស" + "សម្បុរស្បែក​សល្មម" + "សម្បុរ​ស្បែក​ល្មម" + "សម្បុរ​ស្បែកខ្មៅល្មម" + "សម្បុរ​ស្បែក​ខ្មៅ" + diff --git a/emojipicker/app/src/main/res/values-kn/strings.xml b/emojipicker/app/src/main/res/values-kn/strings.xml new file mode 100644 index 00000000..b05a64c2 --- /dev/null +++ b/emojipicker/app/src/main/res/values-kn/strings.xml @@ -0,0 +1,42 @@ + + + + + "ಇತ್ತೀಚೆಗೆ ಬಳಸಿರುವುದು" + "ಸ್ಮೈಲಿಗಳು ಮತ್ತು ಭಾವನೆಗಳು" + "ಜನರು" + "ಪ್ರಾಣಿಗಳು ಮತ್ತು ಪ್ರಕೃತಿ" + "ಆಹಾರ ಮತ್ತು ಪಾನೀಯ" + "ಪ್ರಯಾಣ ಮತ್ತು ಸ್ಥಳಗಳು" + "ಚಟುವಟಿಕೆಗಳು ಮತ್ತು ಈವೆಂಟ್‌ಗಳು" + "ವಸ್ತುಗಳು" + "ಸಂಕೇತಗಳು" + "ಫ್ಲ್ಯಾಗ್‌ಗಳು" + "ಯಾವುದೇ ಎಮೊಜಿಗಳು ಲಭ್ಯವಿಲ್ಲ" + "ನೀವು ಇನ್ನೂ ಯಾವುದೇ ಎಮೋಜಿಗಳನ್ನು ಬಳಸಿಲ್ಲ" + "ಎಮೋಜಿ ಬೈಡೈರೆಕ್ಷನಲ್ ಸ್ವಿಚರ್" + "ಎಮೋಜಿ ಎದುರಿಸುತ್ತಿರುವ ದಿಕ್ಕನ್ನು ಬದಲಾಯಿಸಲಾಗಿದೆ" + "ಎಮೋಜಿ ವೇರಿಯಂಟ್ ಸೆಲೆಕ್ಟರ್" + "%1$s ಮತ್ತು %2$s" + "ನೆರಳು" + "ಲೈಟ್ ಸ್ಕಿನ್ ಟೋನ್" + "ಮೀಡಿಯಮ್ ಲೈಟ್ ಸ್ಕಿನ್ ಟೋನ್" + "ಮೀಡಿಯಮ್ ಸ್ಕಿನ್ ಟೋನ್" + "ಮೀಡಿಯಮ್ ಡಾರ್ಕ್ ಸ್ಕಿನ್ ಟೋನ್" + "ಡಾರ್ಕ್ ಸ್ಕಿನ್ ಟೋನ್" + diff --git a/emojipicker/app/src/main/res/values-ko/strings.xml b/emojipicker/app/src/main/res/values-ko/strings.xml new file mode 100644 index 00000000..22cace83 --- /dev/null +++ b/emojipicker/app/src/main/res/values-ko/strings.xml @@ -0,0 +1,42 @@ + + + + + "최근 사용" + "이모티콘 및 감정" + "사람" + "동물 및 자연" + "식음료" + "여행 및 장소" + "활동 및 이벤트" + "사물" + "기호" + "깃발" + "사용 가능한 그림 이모티콘 없음" + "아직 사용한 이모티콘이 없습니다." + "그림 이모티콘 양방향 전환기" + "이모티콘 방향 전환됨" + "그림 이모티콘 옵션 선택기" + "%1$s 및 %2$s" + "그림자" + "밝은 피부색" + "약간 밝은 피부색" + "중간 피부색" + "약간 어두운 피부색" + "어두운 피부색" + diff --git a/emojipicker/app/src/main/res/values-ky/strings.xml b/emojipicker/app/src/main/res/values-ky/strings.xml new file mode 100644 index 00000000..aa345469 --- /dev/null +++ b/emojipicker/app/src/main/res/values-ky/strings.xml @@ -0,0 +1,42 @@ + + + + + "АКЫРКЫ КОЛДОНУЛГАНДАР" + "БЫЙТЫКЧАЛАР ЖАНА ЭМОЦИЯЛАР" + "АДАМДАР" + "ЖАНЫБАРЛАР ЖАНА ЖАРАТЫЛЫШ" + "АЗЫК-ТҮЛҮК ЖАНА СУУСУНДУКТАР" + "САЯКАТ ЖАНА ЖЕРЛЕР" + "ИШ-АРАКЕТТЕР ЖАНА ИШ-ЧАРАЛАР" + "ОБЪЕКТТЕР" + "СИМВОЛДОР" + "ЖЕЛЕКТЕР" + "Жеткиликтүү быйтыкчалар жок" + "Бир да быйтыкча колдоно элексиз" + "эки тараптуу быйтыкча которгуч" + "быйтыкчанын багыты которулду" + "быйтыкча тандагыч" + "%1$s жана %2$s" + "көлөкө" + "ачык түстүү тери" + "агыраак түстүү тери" + "орточо түстүү тери" + "орточо кара тору түстүү тери" + "кара тору түстүү тери" + diff --git a/emojipicker/app/src/main/res/values-lo/strings.xml b/emojipicker/app/src/main/res/values-lo/strings.xml new file mode 100644 index 00000000..174400e0 --- /dev/null +++ b/emojipicker/app/src/main/res/values-lo/strings.xml @@ -0,0 +1,42 @@ + + + + + "ໃຊ້ຫຼ້າສຸດ" + "ໜ້າຍິ້ມ ແລະ ຄວາມຮູ້ສຶກ" + "ຜູ້ຄົນ" + "ສັດ ແລະ ທຳມະຊາດ" + "ອາຫານ ແລະ ເຄື່ອງດື່ມ" + "ການເດີນທາງ ແລະ ສະຖານທີ່" + "ການເຄື່ອນໄຫວ ແລະ ກິດຈະກຳ" + "ວັດຖຸ" + "ສັນຍາລັກ" + "ທຸງ" + "ບໍ່ມີອີໂມຈິໃຫ້ນຳໃຊ້" + "ທ່ານຍັງບໍ່ໄດ້ໃຊ້ອີໂມຈິໃດເທື່ອ" + "ຕົວສະຫຼັບອີໂມຈິແບບ 2 ທິດທາງ" + "ປ່ຽນທິດທາງການຫັນໜ້າຂອງອີໂມຈິແລ້ວ" + "ຕົວເລືອກຕົວແປອີໂມຈິ" + "%1$s ແລະ %2$s" + "ເງົາ" + "ສະກິນໂທນແຈ້ງ" + "ສະກິນໂທນແຈ້ງປານກາງ" + "ສະກິນໂທນປານກາງ" + "ສະກິນໂທນມືດປານກາງ" + "ສະກິນໂທນມືດ" + diff --git a/emojipicker/app/src/main/res/values-lt/strings.xml b/emojipicker/app/src/main/res/values-lt/strings.xml new file mode 100644 index 00000000..72390ae4 --- /dev/null +++ b/emojipicker/app/src/main/res/values-lt/strings.xml @@ -0,0 +1,42 @@ + + + + + "NESENIAI NAUDOTI" + "JAUSTUKAI IR EMOCIJOS" + "ŽMONĖS" + "GYVŪNAI IR GAMTA" + "MAISTAS IR GĖRIMAI" + "KELIONĖS IR VIETOS" + "VEIKLA IR ĮVYKIAI" + "OBJEKTAI" + "SIMBOLIAI" + "VĖLIAVOS" + "Nėra jokių pasiekiamų jaustukų" + "Dar nenaudojote jokių jaustukų" + "dvikryptis jaustukų perjungikli" + "perjungta jaustukų nuoroda" + "jaustuko varianto parinkiklis" + "%1$s ir %2$s" + "šešėlis" + "šviesi odos spalva" + "vidutiniškai šviesi odos spalva" + "nei tamsi, nei šviesi odos spalva" + "vidutiniškai tamsi odos spalva" + "tamsi odos spalva" + diff --git a/emojipicker/app/src/main/res/values-lv/strings.xml b/emojipicker/app/src/main/res/values-lv/strings.xml new file mode 100644 index 00000000..0fe66ac7 --- /dev/null +++ b/emojipicker/app/src/main/res/values-lv/strings.xml @@ -0,0 +1,42 @@ + + + + + "NESEN LIETOTAS" + "SMAIDIŅI UN EMOCIJAS" + "PERSONAS" + "DZĪVNIEKI UN DABA" + "ĒDIENI UN DZĒRIENI" + "CEĻOJUMI UN VIETAS" + "PASĀKUMI UN NOTIKUMI" + "OBJEKTI" + "SIMBOLI" + "KAROGI" + "Nav pieejamu emocijzīmju" + "Jūs vēl neesat izmantojis nevienu emocijzīmi" + "emocijzīmju divvirzienu pārslēdzējs" + "mainīts emocijzīmes virziens" + "emocijzīmes varianta atlasītājs" + "%1$s un %2$s" + "ēna" + "gaišs ādas tonis" + "vidēji gaišs ādas tonis" + "vidējs ādas tonis" + "vidēji tumšs ādas tonis" + "tumšs ādas tonis" + diff --git a/emojipicker/app/src/main/res/values-mk/strings.xml b/emojipicker/app/src/main/res/values-mk/strings.xml new file mode 100644 index 00000000..b7ceab0f --- /dev/null +++ b/emojipicker/app/src/main/res/values-mk/strings.xml @@ -0,0 +1,42 @@ + + + + + "НЕОДАМНА КОРИСТЕНИ" + "СМЕШКОВЦИ И ЕМОЦИИ" + "ЛУЃЕ" + "ЖИВОТНИ И ПРИРОДА" + "ХРАНА И ПИЈАЛАЦИ" + "ПАТУВАЊЕ И МЕСТА" + "АКТИВНОСТИ И НАСТАНИ" + "ОБЈЕКТИ" + "СИМБОЛИ" + "ЗНАМИЊА" + "Нема достапни емоџија" + "Сѐ уште не сте користеле емоџија" + "двонасочен менувач на емоџија" + "насоката во којашто е свртено емоџито е сменета" + "избирач на варијанти на емоџија" + "%1$s и %2$s" + "сенка" + "светол тон на кожата" + "средно светол тон на кожата" + "среден тон на кожата" + "средно темен тон на кожата" + "темен тон на кожата" + diff --git a/emojipicker/app/src/main/res/values-ml/strings.xml b/emojipicker/app/src/main/res/values-ml/strings.xml new file mode 100644 index 00000000..60b98570 --- /dev/null +++ b/emojipicker/app/src/main/res/values-ml/strings.xml @@ -0,0 +1,42 @@ + + + + + "അടുത്തിടെ ഉപയോഗിച്ചവ" + "സ്മൈലികളും ഇമോഷനുകളും" + "ആളുകൾ" + "മൃഗങ്ങളും പ്രകൃതിയും" + "ഭക്ഷണപാനീയങ്ങൾ" + "യാത്രയും സ്ഥലങ്ങളും" + "ആക്‌റ്റിവിറ്റികളും ഇവന്റുകളും" + "വസ്‌തുക്കൾ" + "ചിഹ്നങ്ങൾ" + "പതാകകൾ" + "ഇമോജികളൊന്നും ലഭ്യമല്ല" + "നിങ്ങൾ ഇതുവരെ ഇമോജികളൊന്നും ഉപയോഗിച്ചിട്ടില്ല" + "ഇമോജി ദ്വിദിശ സ്വിച്ചർ" + "ഇമോജിയുടെ ദിശ മാറ്റി" + "ഇമോജി വേരിയന്റ് സെലക്‌ടർ" + "%1$s, %2$s" + "ഷാഡോ" + "ലൈറ്റ് സ്‌കിൻ ടോൺ" + "മീഡിയം ലൈറ്റ് സ്‌കിൻ ടോൺ" + "മീഡിയം സ്‌കിൻ ടോൺ" + "മീഡിയം ഡാർക്ക് സ്‌കിൻ ടോൺ" + "ഡാർക്ക് സ്‌കിൻ ടോൺ" + diff --git a/emojipicker/app/src/main/res/values-mn/strings.xml b/emojipicker/app/src/main/res/values-mn/strings.xml new file mode 100644 index 00000000..6b07ea5a --- /dev/null +++ b/emojipicker/app/src/main/res/values-mn/strings.xml @@ -0,0 +1,42 @@ + + + + + "САЯХАН АШИГЛАСАН" + "ИНЭЭМСЭГЛЭЛ БОЛОН СЭТГЭЛ ХӨДЛӨЛ" + "ХҮМҮҮС" + "АМЬТАД БА БАЙГАЛЬ" + "ХООЛ БОЛОН УУХ ЗҮЙЛ" + "АЯЛАЛ БОЛОН ГАЗРУУД" + "ҮЙЛ АЖИЛЛАГАА БОЛОН АРГА ХЭМЖЭЭ" + "ОБЪЕКТ" + "ТЭМДЭГ" + "ТУГ" + "Боломжтой эможи алга" + "Та ямар нэгэн эможи ашиглаагүй байна" + "эможигийн хоёр чиглэлтэй сэлгүүр" + "эможигийн харж буй чиглэлийг сэлгэсэн" + "эможигийн хувилбар сонгогч" + "%1$s болон %2$s" + "сүүдэр" + "цайвар арьсны өнгө" + "дунд зэргийн цайвар арьсны өнгө" + "дунд зэргийн арьсны өнгө" + "дунд зэргийн бараан арьсны өнгө" + "бараан арьсны өнгө" + diff --git a/emojipicker/app/src/main/res/values-mr/strings.xml b/emojipicker/app/src/main/res/values-mr/strings.xml new file mode 100644 index 00000000..316b2c48 --- /dev/null +++ b/emojipicker/app/src/main/res/values-mr/strings.xml @@ -0,0 +1,42 @@ + + + + + "अलीकडे वापरलेला" + "स्मायली आणि भावना" + "लोक" + "प्राणी आणि निसर्ग" + "खाद्यपदार्थ आणि पेय" + "प्रवास आणि ठिकाणे" + "ॲक्टिव्हिटी आणि इव्हेंट" + "ऑब्जेक्ट" + "चिन्हे" + "ध्वज" + "कोणतेही इमोजी उपलब्ध नाहीत" + "तुम्ही अद्याप कोणतेही इमोजी वापरलेले नाहीत" + "इमोजीचा द्विदिश स्विचर" + "दिशा दाखवणारा इमोजी स्विच केला" + "इमोजी व्हेरीयंट सिलेक्टर" + "%1$s आणि %2$s" + "शॅडो" + "उजळ रंगाची त्वचा" + "मध्यम उजळ रंगाची त्वचा" + "मध्यम रंगाची त्वचा" + "मध्यम गडद रंगाची त्वचा" + "गडद रंगाची त्वचा" + diff --git a/emojipicker/app/src/main/res/values-ms/strings.xml b/emojipicker/app/src/main/res/values-ms/strings.xml new file mode 100644 index 00000000..d5ecef2d --- /dev/null +++ b/emojipicker/app/src/main/res/values-ms/strings.xml @@ -0,0 +1,42 @@ + + + + + "DIGUNAKAN BARU-BARU INI" + "SMILEY DAN EMOSI" + "ORANG" + "HAIWAN DAN ALAM SEMULA JADI" + "MAKANAN DAN MINUMAN" + "PERJALANAN DAN TEMPAT" + "AKTIVITI DAN ACARA" + "OBJEK" + "SIMBOL" + "BENDERA" + "Tiada emoji tersedia" + "Anda belum menggunakan mana-mana emoji lagi" + "penukar dwiarah emoji" + "emoji menghadap arah ditukar" + "pemilih varian emoji" + "%1$s dan %2$s" + "bebayang" + "ton kulit cerah" + "ton kulit sederhana cerah" + "ton kulit sederhana" + "ton kulit sederhana gelap" + "ton kulit gelap" + diff --git a/emojipicker/app/src/main/res/values-my/strings.xml b/emojipicker/app/src/main/res/values-my/strings.xml new file mode 100644 index 00000000..99fb7ff2 --- /dev/null +++ b/emojipicker/app/src/main/res/values-my/strings.xml @@ -0,0 +1,42 @@ + + + + + "မကြာသေးမီက သုံးထားသည်များ" + "စမိုင်းလီနှင့် ခံစားချက်များ" + "လူများ" + "တိရစ္ဆာန်များနှင့် သဘာဝ" + "အစားအသောက်" + "ခရီးသွားခြင်းနှင့် အရပ်ဒေသများ" + "လုပ်ဆောင်ချက်နှင့် အစီအစဉ်များ" + "အရာဝတ္ထုများ" + "သင်္ကေတများ" + "အလံများ" + "အီမိုဂျီ မရနိုင်ပါ" + "အီမိုဂျီ အသုံးမပြုသေးပါ" + "အီမိုဂျီ လမ်းကြောင်းနှစ်ခုပြောင်းစနစ်" + "အီမိုဂျီလှည့်သောဘက်ကို ပြောင်းထားသည်" + "အီမိုဂျီမူကွဲ ရွေးချယ်စနစ်" + "%1$s နှင့် %2$s" + "အရိပ်" + "ဖြူသည့် အသားအရောင်" + "အနည်းငယ်ဖြူသည့် အသားအရောင်" + "အလယ်အလတ် အသားအရောင်" + "အနည်းငယ်ညိုသည့် အသားအရောင်" + "ညိုသည့် အသားအရောင်" + diff --git a/emojipicker/app/src/main/res/values-nb/strings.xml b/emojipicker/app/src/main/res/values-nb/strings.xml new file mode 100644 index 00000000..368ef416 --- /dev/null +++ b/emojipicker/app/src/main/res/values-nb/strings.xml @@ -0,0 +1,42 @@ + + + + + "NYLIG BRUKT" + "SMILEFJES OG UTTRYKKSIKONER" + "PERSONER" + "DYR OG NATUR" + "MAT OG DRIKKE" + "REISE OG STEDER" + "AKTIVITETER OG ARRANGEMENTER" + "GJENSTANDER" + "SYMBOLER" + "FLAGG" + "Ingen emojier er tilgjengelige" + "Du har ikke brukt noen emojier ennå" + "toveisvelger for emoji" + "emojiretningen er slått på" + "velger for emojivariant" + "%1$s og %2$s" + "skygge" + "lys hudtone" + "middels lys hudtone" + "middels hudtone" + "middels mørk hudtone" + "mørk hudtone" + diff --git a/emojipicker/app/src/main/res/values-ne/strings.xml b/emojipicker/app/src/main/res/values-ne/strings.xml new file mode 100644 index 00000000..50a489be --- /dev/null +++ b/emojipicker/app/src/main/res/values-ne/strings.xml @@ -0,0 +1,42 @@ + + + + + "हालसालै प्रयोग गरिएको" + "स्माइली र भावनाहरू" + "मान्छेहरू" + "पशु र प्रकृति" + "खाद्य तथा पेय पदार्थ" + "यात्रा र ठाउँहरू" + "क्रियाकलाप तथा कार्यक्रमहरू" + "वस्तुहरू" + "चिन्हहरू" + "झन्डाहरू" + "कुनै पनि इमोजी उपलब्ध छैन" + "तपाईंले हालसम्म कुनै पनि इमोजी प्रयोग गर्नुभएको छैन" + "दुवै दिशामा लैजान सकिने स्विचरको इमोजी" + "इमोजी फर्केको दिशा बदलियो" + "इमोजी भेरियन्ट सेलेक्टर" + "%1$s र %2$s" + "छाया" + "छालाको फिक्का रङ" + "छालाको मध्यम फिक्का रङ" + "छालाको मध्यम रङ" + "छालाको मध्यम गाढा रङ" + "छालाको गाढा रङ" + diff --git a/emojipicker/app/src/main/res/values-nl/strings.xml b/emojipicker/app/src/main/res/values-nl/strings.xml new file mode 100644 index 00000000..12d8b405 --- /dev/null +++ b/emojipicker/app/src/main/res/values-nl/strings.xml @@ -0,0 +1,42 @@ + + + + + "ONLANGS GEBRUIKT" + "SMILEYS EN EMOTIES" + "MENSEN" + "DIEREN EN NATUUR" + "ETEN EN DRINKEN" + "REIZEN EN PLAATSEN" + "ACTIVITEITEN EN EVENEMENTEN" + "OBJECTEN" + "SYMBOLEN" + "VLAGGEN" + "Geen emoji\'s beschikbaar" + "Je hebt nog geen emoji\'s gebruikt" + "bidirectionele emoji-schakelaar" + "richting van emoji omgewisseld" + "emoji-variantkiezer" + "%1$s en %2$s" + "schaduw" + "lichte huidskleur" + "middellichte huidskleur" + "medium huidskleur" + "middeldonkere huidskleur" + "donkere huidskleur" + diff --git a/emojipicker/app/src/main/res/values-or/strings.xml b/emojipicker/app/src/main/res/values-or/strings.xml new file mode 100644 index 00000000..30ffd391 --- /dev/null +++ b/emojipicker/app/src/main/res/values-or/strings.xml @@ -0,0 +1,42 @@ + + + + + "ବର୍ତ୍ତମାନ ବ୍ୟବହାର କରାଯାଇଛି" + "ସ୍ମାଇଲି ଓ ଆବେଗଗୁଡ଼ିକ" + "ଲୋକମାନେ" + "ଜୀବଜନ୍ତୁ ଓ ପ୍ରକୃତି" + "ଖାଦ୍ୟ ଓ ପାନୀୟ" + "ଟ୍ରାଭେଲ ଓ ସ୍ଥାନଗୁଡ଼ିକ" + "କାର୍ଯ୍ୟକଳାପ ଓ ଇଭେଣ୍ଟଗୁଡ଼ିକ" + "ଅବଜେକ୍ଟଗୁଡ଼ିକ" + "ଚିହ୍ନଗୁଡ଼ିକ" + "ଫ୍ଲାଗଗୁଡ଼ିକ" + "କୌଣସି ଇମୋଜି ଉପଲବ୍ଧ ନାହିଁ" + "ଆପଣ ଏପର୍ଯ୍ୟନ୍ତ କୌଣସି ଇମୋଜି ବ୍ୟବହାର କରିନାହାଁନ୍ତି" + "ଇମୋଜିର ବାଇଡାଇରେକ୍ସନାଲ ସୁଇଚର" + "ଇମୋଜି ଫେସିଂ ଦିଗନିର୍ଦ୍ଦେଶ ସୁଇଚ କରାଯାଇଛି" + "ଇମୋଜି ଭାରିଏଣ୍ଟ ଚୟନକାରୀ" + "%1$s ଏବଂ %2$s" + "ସେଡୋ" + "ଲାଇଟ ସ୍କିନ ଟୋନ" + "ମଧ୍ୟମ ଲାଇଟ ସ୍କିନ ଟୋନ" + "ମଧ୍ୟମ ସ୍କିନ ଟୋନ" + "ମଧ୍ୟମ ଡାର୍କ ସ୍କିନ ଟୋନ" + "ଡାର୍କ ସ୍କିନ ଟୋନ" + diff --git a/emojipicker/app/src/main/res/values-pa/strings.xml b/emojipicker/app/src/main/res/values-pa/strings.xml new file mode 100644 index 00000000..85db6c7f --- /dev/null +++ b/emojipicker/app/src/main/res/values-pa/strings.xml @@ -0,0 +1,42 @@ + + + + + "ਹਾਲ ਹੀ ਵਿੱਚ ਵਰਤਿਆ ਗਿਆ" + "ਸਮਾਈਲੀ ਅਤੇ ਜਜ਼ਬਾਤ" + "ਲੋਕ" + "ਜਾਨਵਰ ਅਤੇ ਕੁਦਰਤ" + "ਖਾਣਾ ਅਤੇ ਪੀਣਾ" + "ਯਾਤਰਾ ਅਤੇ ਥਾਵਾਂ" + "ਸਰਗਰਮੀਆਂ ਅਤੇ ਇਵੈਂਟ" + "ਵਸਤੂਆਂ" + "ਚਿੰਨ੍ਹ" + "ਝੰਡੇ" + "ਕੋਈ ਇਮੋਜੀ ਉਪਲਬਧ ਨਹੀਂ ਹੈ" + "ਤੁਸੀਂ ਹਾਲੇ ਤੱਕ ਕਿਸੇ ਵੀ ਇਮੋਜੀ ਦੀ ਵਰਤੋਂ ਨਹੀਂ ਕੀਤੀ ਹੈ" + "ਇਮੋਜੀ ਬਾਇਡਾਇਰੈਕਸ਼ਨਲ ਸਵਿੱਚਰ" + "ਇਮੋਜੀ ਦੀ ਦਿਸ਼ਾ ਬਦਲ ਦਿੱਤੀ ਗਈ" + "ਇਮੋਜੀ ਕਿਸਮ ਚੋਣਕਾਰ" + "%1$s ਅਤੇ %2$s" + "ਸ਼ੈਡੋ" + "ਚਮੜੀ ਦਾ ਹਲਕਾ ਰੰਗ" + "ਚਮੜੀ ਦਾ ਦਰਮਿਆਨਾ ਹਲਕਾ ਰੰਗ" + "ਚਮੜੀ ਦਾ ਦਰਮਿਆਨਾ ਰੰਗ" + "ਚਮੜੀ ਦਾ ਦਰਮਿਆਨਾ ਗੂੜ੍ਹਾ ਰੰਗ" + "ਚਮੜੀ ਦਾ ਗੂੜ੍ਹਾ ਰੰਗ" + diff --git a/emojipicker/app/src/main/res/values-pl/strings.xml b/emojipicker/app/src/main/res/values-pl/strings.xml new file mode 100644 index 00000000..3ed8bd34 --- /dev/null +++ b/emojipicker/app/src/main/res/values-pl/strings.xml @@ -0,0 +1,42 @@ + + + + + "OSTATNIO UŻYWANE" + "EMOTIKONY" + "UCZESTNICY" + "ZWIERZĘTA I PRZYRODA" + "JEDZENIE I NAPOJE" + "PODRÓŻE I MIEJSCA" + "DZIAŁANIA I ZDARZENIA" + "PRZEDMIOTY" + "SYMBOLE" + "FLAGI" + "Brak dostępnych emotikonów" + "Żadne emotikony nie zostały jeszcze użyte" + "dwukierunkowy przełącznik emotikonów" + "zmieniono kierunek emotikonów" + "selektor wariantu emotikona" + "%1$s i %2$s" + "cień" + "jasny odcień skóry" + "średnio jasny odcień skóry" + "pośredni odcień skóry" + "średnio ciemny odcień skóry" + "ciemny odcień skóry" + diff --git a/emojipicker/app/src/main/res/values-pt-rBR/strings.xml b/emojipicker/app/src/main/res/values-pt-rBR/strings.xml new file mode 100644 index 00000000..5883fcb3 --- /dev/null +++ b/emojipicker/app/src/main/res/values-pt-rBR/strings.xml @@ -0,0 +1,42 @@ + + + + + "USADOS RECENTEMENTE" + "CARINHAS E EMOTICONS" + "PESSOAS" + "ANIMAIS E NATUREZA" + "COMIDAS E BEBIDAS" + "VIAGENS E LUGARES" + "ATIVIDADES E EVENTOS" + "OBJETOS" + "SÍMBOLOS" + "BANDEIRAS" + "Não há emojis disponíveis" + "Você ainda não usou emojis" + "seletor bidirecional de emojis" + "emoji virado para a direção trocada" + "seletor de variante do emoji" + "%1$s e %2$s" + "sombra" + "tom de pele claro" + "tom de pele médio-claro" + "tom de pele médio" + "tom de pele médio-escuro" + "tom de pele escuro" + diff --git a/emojipicker/app/src/main/res/values-pt-rPT/strings.xml b/emojipicker/app/src/main/res/values-pt-rPT/strings.xml new file mode 100644 index 00000000..2ef06acc --- /dev/null +++ b/emojipicker/app/src/main/res/values-pt-rPT/strings.xml @@ -0,0 +1,42 @@ + + + + + "USADOS RECENTEMENTE" + "EMOTICONS E ÍCONES EXPRESSIVOS" + "PESSOAS" + "ANIMAIS E NATUREZA" + "ALIMENTOS E BEBIDAS" + "VIAGENS E LOCAIS" + "ATIVIDADES E EVENTOS" + "OBJETOS" + "SÍMBOLOS" + "BANDEIRAS" + "Nenhum emoji disponível" + "Ainda não utilizou emojis" + "comutador bidirecional de emojis" + "direção voltada para o emoji alterada" + "seletor de variantes de emojis" + "%1$s e %2$s" + "sombra" + "tom de pele claro" + "tom de pele claro médio" + "tom de pele médio" + "tom de pele escuro médio" + "tom de pele escuro" + diff --git a/emojipicker/app/src/main/res/values-pt/strings.xml b/emojipicker/app/src/main/res/values-pt/strings.xml new file mode 100644 index 00000000..5883fcb3 --- /dev/null +++ b/emojipicker/app/src/main/res/values-pt/strings.xml @@ -0,0 +1,42 @@ + + + + + "USADOS RECENTEMENTE" + "CARINHAS E EMOTICONS" + "PESSOAS" + "ANIMAIS E NATUREZA" + "COMIDAS E BEBIDAS" + "VIAGENS E LUGARES" + "ATIVIDADES E EVENTOS" + "OBJETOS" + "SÍMBOLOS" + "BANDEIRAS" + "Não há emojis disponíveis" + "Você ainda não usou emojis" + "seletor bidirecional de emojis" + "emoji virado para a direção trocada" + "seletor de variante do emoji" + "%1$s e %2$s" + "sombra" + "tom de pele claro" + "tom de pele médio-claro" + "tom de pele médio" + "tom de pele médio-escuro" + "tom de pele escuro" + diff --git a/emojipicker/app/src/main/res/values-ro/strings.xml b/emojipicker/app/src/main/res/values-ro/strings.xml new file mode 100644 index 00000000..45fad5a7 --- /dev/null +++ b/emojipicker/app/src/main/res/values-ro/strings.xml @@ -0,0 +1,42 @@ + + + + + "FOLOSITE RECENT" + "EMOTICOANE ȘI EMOȚII" + "PERSOANE" + "ANIMALE ȘI NATURĂ" + "MÂNCARE ȘI BĂUTURĂ" + "CĂLĂTORII ȘI LOCAȚII" + "ACTIVITĂȚI ȘI EVENIMENTE" + "OBIECTE" + "SIMBOLURI" + "STEAGURI" + "Nu sunt disponibile emoji-uri" + "Încă nu ai folosit emoji" + "comutator bidirecțional de emojiuri" + "direcția de orientare a emojiului comutată" + "selector de variante de emoji" + "%1$s și %2$s" + "umbră" + "nuanță deschisă a pielii" + "nuanță deschisă medie a pielii" + "nuanță medie a pielii" + "nuanță închisă medie a pielii" + "nuanță închisă a pielii" + diff --git a/emojipicker/app/src/main/res/values-ru/strings.xml b/emojipicker/app/src/main/res/values-ru/strings.xml new file mode 100644 index 00000000..ecf42faa --- /dev/null +++ b/emojipicker/app/src/main/res/values-ru/strings.xml @@ -0,0 +1,42 @@ + + + + + "НЕДАВНИЕ" + "СМАЙЛИКИ И ЭМОЦИИ" + "ЛЮДИ" + "ПРИРОДА И ЖИВОТНЫЕ" + "ЕДА И НАПИТКИ" + "ПУТЕШЕСТВИЯ" + "ДЕЙСТВИЯ И СОБЫТИЯ" + "ОБЪЕКТЫ" + "СИМВОЛЫ" + "ФЛАГИ" + "Нет доступных эмодзи" + "Вы ещё не использовали эмодзи" + "Двухсторонний переключатель эмодзи" + "изменен поворот лица эмодзи" + "выбор вариантов эмодзи" + "%1$s и %2$s" + "теневой" + "светлый оттенок кожи" + "умеренно светлый оттенок кожи" + "нейтральный оттенок кожи" + "умеренно темный оттенок кожи" + "темный оттенок кожи" + diff --git a/emojipicker/app/src/main/res/values-si/strings.xml b/emojipicker/app/src/main/res/values-si/strings.xml new file mode 100644 index 00000000..2ecdc77b --- /dev/null +++ b/emojipicker/app/src/main/res/values-si/strings.xml @@ -0,0 +1,42 @@ + + + + + "මෑතදී භාවිත කළ" + "සිනාසීම් සහ චිත්තවේග" + "පුද්ගලයින්" + "සතුන් හා ස්වභාවධර්මය" + "ආහාර පාන" + "සංචාර හා ස්ථාන" + "ක්‍රියාකාරකම් සහ සිදුවීම්" + "වස්තු" + "සංකේත" + "ධජ" + "ඉමොජි කිසිවක් නොලැබේ" + "ඔබ තවමත් කිසිදු ඉමෝජියක් භාවිතා කර නැත" + "ද්විත්ව දිශා ඉමොජි මාරුකරණය" + "ඉමොජි මුහුණ දෙන දිශාව මාරු විය" + "ඉමොජි ප්‍රභේද තෝරකය" + "%1$s සහ %2$s" + "සෙවනැල්ල" + "ලා සමේ වර්ණය" + "මධ්‍යම ලා සම් වර්ණය" + "මධ්‍යම සම් වර්ණය" + "මධ්‍යම අඳුරු සම් වර්ණය" + "අඳුරු සම් වර්ණය" + diff --git a/emojipicker/app/src/main/res/values-sk/strings.xml b/emojipicker/app/src/main/res/values-sk/strings.xml new file mode 100644 index 00000000..11ed0eea --- /dev/null +++ b/emojipicker/app/src/main/res/values-sk/strings.xml @@ -0,0 +1,42 @@ + + + + + "NEDÁVNO POUŽITÉ" + "SMAJLÍKY A EMÓCIE" + "ĽUDIA" + "ZVIERATÁ A PRÍRODA" + "JEDLO A NÁPOJE" + "CESTOVANIE A MIESTA" + "AKTIVITY A UDALOSTI" + "PREDMETY" + "SYMBOLY" + "VLAJKY" + "Nie sú k dispozícii žiadne emodži" + "Zatiaľ ste nepoužili žiadne emodži" + "obojsmerný prepínač emodži" + "smer otočenia emodži bol prepnutý" + "selektor variantu emodži" + "%1$s a %2$s" + "tieň" + "svetlý odtieň pokožky" + "stredne svetlý odtieň pokožky" + "stredný odtieň pokožky" + "stredne tmavý odtieň pokožky" + "tmavý odtieň pokožky" + diff --git a/emojipicker/app/src/main/res/values-sl/strings.xml b/emojipicker/app/src/main/res/values-sl/strings.xml new file mode 100644 index 00000000..f345226d --- /dev/null +++ b/emojipicker/app/src/main/res/values-sl/strings.xml @@ -0,0 +1,42 @@ + + + + + "NEDAVNO UPORABLJENI" + "ČUSTVENI SIMBOLI IN ČUSTVA" + "OSEBE" + "ŽIVALI IN NARAVA" + "HRANA IN PIJAČA" + "POTOVANJE IN MESTA" + "DEJAVNOSTI IN DOGODKI" + "PREDMETI" + "SIMBOLI" + "ZASTAVE" + "Ni emodžijev" + "Uporabili niste še nobenega emodžija." + "dvosmerni preklopnik emodžijev" + "preklopljena usmerjenost emodžija" + "Izbirnik različice emodžija" + "%1$s in %2$s" + "senčenje" + "svetel odtenek kože" + "srednje svetel odtenek kože" + "srednji odtenek kože" + "srednje temen odtenek kože" + "temen odtenek kože" + diff --git a/emojipicker/app/src/main/res/values-sq/strings.xml b/emojipicker/app/src/main/res/values-sq/strings.xml new file mode 100644 index 00000000..f30f751e --- /dev/null +++ b/emojipicker/app/src/main/res/values-sq/strings.xml @@ -0,0 +1,42 @@ + + + + + "PËRDORUR SË FUNDI" + "BUZËQESHJE DHE EMOCIONE" + "NJERËZ" + "KAFSHË DHE NATYRË" + "USHQIME DHE PIJE" + "UDHËTIME DHE VENDE" + "AKTIVITETE DHE NGJARJE" + "OBJEKTE" + "SIMBOLE" + "FLAMUJ" + "Nuk ofrohen emoji" + "Nuk ke përdorur ende asnjë emoji" + "ndërruesi me dy drejtime për emoji-t" + "drejtimi i emoji-t u ndryshua" + "përzgjedhësi i variantit të emoji-t" + "%1$s dhe %2$s" + "hije" + "ton lëkure i zbehtë" + "ton lëkure mesatarisht i zbehtë" + "ton lëkure mesatar" + "ton lëkure mesatarisht i errët" + "ton lëkure i errët" + diff --git a/emojipicker/app/src/main/res/values-sr/strings.xml b/emojipicker/app/src/main/res/values-sr/strings.xml new file mode 100644 index 00000000..67d3619f --- /dev/null +++ b/emojipicker/app/src/main/res/values-sr/strings.xml @@ -0,0 +1,42 @@ + + + + + "НЕДАВНО КОРИШЋЕНО" + "СМАЈЛИЈИ И ЕМОЦИЈЕ" + "ЉУДИ" + "ЖИВОТИЊЕ И ПРИРОДА" + "ХРАНА И ПИЋЕ" + "ПУТОВАЊА И МЕСТА" + "АКТИВНОСТИ И ДОГАЂАЈИ" + "ОБЈЕКТИ" + "СИМБОЛИ" + "ЗАСТАВЕ" + "Емоџији нису доступни" + "Још нисте користили емоџије" + "двосмерни пребацивач емоџија" + "смер емоџија је промењен" + "бирач варијанти емоџија" + "%1$s и %2$s" + "сенка" + "кожа светле пути" + "кожа средњесветле пути" + "кожа средње пути" + "кожа средњетамне пути" + "кожа тамне пути" + diff --git a/emojipicker/app/src/main/res/values-sv/strings.xml b/emojipicker/app/src/main/res/values-sv/strings.xml new file mode 100644 index 00000000..dede0672 --- /dev/null +++ b/emojipicker/app/src/main/res/values-sv/strings.xml @@ -0,0 +1,42 @@ + + + + + "NYLIGEN ANVÄNDA" + "KÄNSLOIKONER OCH KÄNSLOR" + "PERSONER" + "DJUR OCH NATUR" + "MAT OCH DRYCK" + "RESOR OCH PLATSER" + "AKTIVITETER OCH HÄNDELSER" + "FÖREMÅL" + "SYMBOLER" + "FLAGGOR" + "Inga emojier tillgängliga" + "Du har ännu inte använt emojis" + "dubbelriktad emojiväxlare" + "emojins riktning har bytts" + "Väljare av emoji-varianter" + "%1$s och %2$s" + "skugga" + "ljus hudfärg" + "medelljus hudfärg" + "medelmörk hudfärg" + "mellanmörk hudfärg" + "mörk hudfärg" + diff --git a/emojipicker/app/src/main/res/values-sw/strings.xml b/emojipicker/app/src/main/res/values-sw/strings.xml new file mode 100644 index 00000000..3f7e24b0 --- /dev/null +++ b/emojipicker/app/src/main/res/values-sw/strings.xml @@ -0,0 +1,42 @@ + + + + + "ZILIZOTUMIKA HIVI MAJUZI" + "VICHESHI NA HISIA" + "WATU" + "WANYAMA NA MAZINGIRA" + "VYAKULA NA VINYWAJI" + "SAFARI NA MAENEO" + "SHUGHULI NA MATUKIO" + "VITU" + "ALAMA" + "BENDERA" + "Hakuna emoji zinazopatikana" + "Bado hujatumia emoji zozote" + "kibadilishaji cha emoji cha pande mbili" + "imebadilisha upande ambao emoji inaangalia" + "kiteuzi cha kibadala cha emoji" + "%1$s na %2$s" + "kivuli" + "ngozi ya rangi nyeupe" + "ngozi ya rangi nyeupe kiasi" + "ngozi ya rangi ya maji ya kunde" + "ngozi ya rangi nyeusi kiasi" + "ngozi ya rangi nyeusi" + diff --git a/emojipicker/app/src/main/res/values-ta/strings.xml b/emojipicker/app/src/main/res/values-ta/strings.xml new file mode 100644 index 00000000..5954c77f --- /dev/null +++ b/emojipicker/app/src/main/res/values-ta/strings.xml @@ -0,0 +1,42 @@ + + + + + "சமீபத்தில் பயன்படுத்தியவை" + "ஸ்மைலிகளும் எமோடிகான்களும்" + "நபர்" + "விலங்குகளும் இயற்கையும்" + "உணவும் பானமும்" + "பயணமும் இடங்களும்" + "செயல்பாடுகளும் நிகழ்வுகளும்" + "பொருட்கள்" + "சின்னங்கள்" + "கொடிகள்" + "ஈமோஜிகள் எதுவுமில்லை" + "இதுவரை ஈமோஜி எதையும் நீங்கள் பயன்படுத்தவில்லை" + "ஈமோஜி இருபக்க மாற்றி" + "ஈமோஜி காட்டப்படும் திசை மாற்றப்பட்டது" + "ஈமோஜி வகைத் தேர்வி" + "%1$s மற்றும் %2$s" + "நிழல்" + "வெள்ளை நிறம்" + "கொஞ்சம் வெள்ளை நிறம்" + "மாநிறம்" + "கொஞ்சம் கருநிறம்" + "கருநிறம்" + diff --git a/emojipicker/app/src/main/res/values-te/strings.xml b/emojipicker/app/src/main/res/values-te/strings.xml new file mode 100644 index 00000000..db21e73a --- /dev/null +++ b/emojipicker/app/src/main/res/values-te/strings.xml @@ -0,0 +1,42 @@ + + + + + "ఇటీవల ఉపయోగించినవి" + "స్మైలీలు, ఎమోషన్‌లు" + "వ్యక్తులు" + "జంతువులు, ప్రకృతి" + "ఆహారం, పానీయం" + "ప్రయాణం, స్థలాలు" + "యాక్టివిటీలు, ఈవెంట్‌లు" + "ఆబ్జెక్ట్‌లు" + "గుర్తులు" + "ఫ్లాగ్‌లు" + "ఎమోజీలు ఏవీ అందుబాటులో లేవు" + "మీరు ఇంకా ఎమోజీలు ఏవీ ఉపయోగించలేదు" + "ఎమోజీ ద్విదిశాత్మక స్విచ్చర్" + "ఎమోజీ దిశ మార్చబడింది" + "ఎమోజి రకాన్ని ఎంపిక చేసే సాధనం" + "%1$s, %2$s" + "షాడో" + "లైట్ స్కిన్ రంగు" + "చామనఛాయ లైట్ స్కిన్ రంగు" + "చామనఛాయ స్కిన్ రంగు" + "చామనఛాయ డార్క్ స్కిన్ రంగు" + "డార్క్ స్కిన్ రంగు" + diff --git a/emojipicker/app/src/main/res/values-th/strings.xml b/emojipicker/app/src/main/res/values-th/strings.xml new file mode 100644 index 00000000..74d28694 --- /dev/null +++ b/emojipicker/app/src/main/res/values-th/strings.xml @@ -0,0 +1,42 @@ + + + + + "ใช้ล่าสุด" + "หน้ายิ้มและอารมณ์" + "ผู้คน" + "สัตว์และธรรมชาติ" + "อาหารและเครื่องดื่ม" + "การเดินทางและสถานที่" + "กิจกรรมและเหตุการณ์" + "วัตถุ" + "สัญลักษณ์" + "ธง" + "ไม่มีอีโมจิ" + "คุณยังไม่ได้ใช้อีโมจิเลย" + "ตัวสลับอีโมจิแบบ 2 ทาง" + "เปลี่ยนทิศทางการหันหน้าของอีโมจิแล้ว" + "ตัวเลือกตัวแปรอีโมจิ" + "%1$s และ %2$s" + "เงา" + "โทนผิวสีอ่อน" + "โทนผิวสีอ่อนปานกลาง" + "โทนผิวสีปานกลาง" + "โทนผิวสีเข้มปานกลาง" + "โทนผิวสีเข้ม" + diff --git a/emojipicker/app/src/main/res/values-tl/strings.xml b/emojipicker/app/src/main/res/values-tl/strings.xml new file mode 100644 index 00000000..2a14fba7 --- /dev/null +++ b/emojipicker/app/src/main/res/values-tl/strings.xml @@ -0,0 +1,42 @@ + + + + + "KAMAKAILANG GINAMIT" + "MGA SMILEY AT MGA EMOSYON" + "MGA TAO" + "MGA HAYOP AT KALIKASAN" + "PAGKAIN AT INUMIN" + "PAGLALAKBAY AT MGA LUGAR" + "MGA AKTIBIDAD AT EVENT" + "MGA BAGAY" + "MGA SIMBOLO" + "MGA BANDILA" + "Walang available na emoji" + "Hindi ka pa gumamit ng anumang emoji" + "bidirectional na switcher ng emoji" + "pinalitan ang direksyon kung saan nakaharap ang emoji" + "selector ng variant ng emoji" + "%1$s at %2$s" + "shadow" + "maputing kulay ng balat" + "katamtamang maputing kulay ng balat" + "katamtamang kulay ng balat" + "katamtamang maitim na kulay ng balat" + "maitim na kulay ng balat" + diff --git a/emojipicker/app/src/main/res/values-tr/strings.xml b/emojipicker/app/src/main/res/values-tr/strings.xml new file mode 100644 index 00000000..f0d13cdd --- /dev/null +++ b/emojipicker/app/src/main/res/values-tr/strings.xml @@ -0,0 +1,42 @@ + + + + + "SON KULLANILANLAR" + "SMILEY\'LER VE İFADELER" + "İNSANLAR" + "HAYVANLAR VE DOĞA" + "YİYECEK VE İÇECEK" + "SEYAHAT VE YERLER" + "AKTİVİTELER VE ETKİNLİKLER" + "NESNELER" + "SEMBOLLER" + "BAYRAKLAR" + "Kullanılabilir emoji yok" + "Henüz emoji kullanmadınız" + "çift yönlü emoji değiştirici" + "emoji yönü değiştirildi" + "emoji varyant seçici" + "%1$s ve %2$s" + "gölge" + "açık ten rengi" + "orta-açık ten rengi" + "orta ten rengi" + "orta-koyu ten rengi" + "koyu ten rengi" + diff --git a/emojipicker/app/src/main/res/values-uk/strings.xml b/emojipicker/app/src/main/res/values-uk/strings.xml new file mode 100644 index 00000000..46e9e3dc --- /dev/null +++ b/emojipicker/app/src/main/res/values-uk/strings.xml @@ -0,0 +1,42 @@ + + + + + "НЕЩОДАВНО ВИКОРИСТАНІ" + "СМАЙЛИКИ Й ЕМОЦІЇ" + "ЛЮДИ" + "ТВАРИНИ Й ПРИРОДА" + "ЇЖА Й НАПОЇ" + "ПОДОРОЖІ Й МІСЦЯ" + "АКТИВНІСТЬ І ПОДІЇ" + "ОБ’ЄКТИ" + "СИМВОЛИ" + "ПРАПОРИ" + "Немає смайлів" + "Ви ще не використовували смайли" + "двосторонній перемикач смайлів" + "змінено напрям обличчя смайлів" + "засіб вибору варіанта смайла" + "%1$s і %2$s" + "тінь" + "світлий відтінок шкіри" + "помірно світлий відтінок шкіри" + "помірний відтінок шкіри" + "помірно темний відтінок шкіри" + "темний відтінок шкіри" + diff --git a/emojipicker/app/src/main/res/values-ur/strings.xml b/emojipicker/app/src/main/res/values-ur/strings.xml new file mode 100644 index 00000000..68fa937d --- /dev/null +++ b/emojipicker/app/src/main/res/values-ur/strings.xml @@ -0,0 +1,42 @@ + + + + + "حال ہی میں استعمال کردہ" + "اسمائلیز اور جذبات" + "لوگ" + "جانور اور قدرت" + "خوراک اور مشروب" + "سفر اور جگہیں" + "سرگرمیاں اور ایونٹس" + "آبجیکٹس" + "علامات" + "جھنڈے" + "کوئی بھی ایموجی دستیاب نہیں ہے" + "آپ نے ابھی تک کوئی بھی ایموجی استعمال نہیں کی ہے" + "دو طرفہ سوئچر ایموجی" + "ایموجی کا سمتِ رخ سوئچ کر دیا گیا" + "ایموجی کی قسم کا منتخب کنندہ" + "‏‎%1$s اور ‎%2$s" + "پرچھائیں" + "جلد کا ہلکا ٹون" + "جلد کا متوسط ہلکا ٹون" + "جلد کا متوسط ٹون" + "جلد کا متوسط گہرا ٹون" + "جلد کا گہرا ٹون" + diff --git a/emojipicker/app/src/main/res/values-uz/strings.xml b/emojipicker/app/src/main/res/values-uz/strings.xml new file mode 100644 index 00000000..6610ffd5 --- /dev/null +++ b/emojipicker/app/src/main/res/values-uz/strings.xml @@ -0,0 +1,42 @@ + + + + + "YAQINDA ISHLATILGAN" + "KULGICH VA EMOJILAR" + "ODAMLAR" + "HAYVONLAR VA TABIAT" + "TAOM VA ICHIMLIKLAR" + "SAYOHAT VA JOYLAR" + "HODISA VA TADBIRLAR" + "BUYUMLAR" + "BELGILAR" + "BAYROQCHALAR" + "Hech qanday emoji mavjud emas" + "Hanuz birorta emoji ishlatmagansiz" + "ikki tomonlama emoji almashtirgich" + "emoji yuzlanish tomoni almashdi" + "emoji variant tanlagich" + "%1$s va %2$s" + "soya" + "och rang tusli" + "oʻrtacha och rang tusli" + "neytral rang tusli" + "oʻrtacha toʻq rang tusli" + "toʻq rang tusli" + diff --git a/emojipicker/app/src/main/res/values-vi/strings.xml b/emojipicker/app/src/main/res/values-vi/strings.xml new file mode 100644 index 00000000..9e1eac8e --- /dev/null +++ b/emojipicker/app/src/main/res/values-vi/strings.xml @@ -0,0 +1,42 @@ + + + + + "MỚI DÙNG GẦN ĐÂY" + "MẶT CƯỜI VÀ BIỂU TƯỢNG CẢM XÚC" + "MỌI NGƯỜI" + "ĐỘNG VẬT VÀ THIÊN NHIÊN" + "THỰC PHẨM VÀ ĐỒ UỐNG" + "DU LỊCH VÀ ĐỊA ĐIỂM" + "HOẠT ĐỘNG VÀ SỰ KIỆN" + "ĐỒ VẬT" + "BIỂU TƯỢNG" + "CỜ" + "Không có biểu tượng cảm xúc nào" + "Bạn chưa sử dụng biểu tượng cảm xúc nào" + "trình chuyển đổi hai chiều biểu tượng cảm xúc" + "đã chuyển hướng mặt của biểu tượng cảm xúc" + "bộ chọn biến thể biểu tượng cảm xúc" + "%1$s và %2$s" + "bóng" + "tông màu da sáng" + "tông màu da sáng trung bình" + "tông màu da trung bình" + "tông màu da tối trung bình" + "tông màu da tối" + diff --git a/emojipicker/app/src/main/res/values-zh-rCN/strings.xml b/emojipicker/app/src/main/res/values-zh-rCN/strings.xml new file mode 100644 index 00000000..453eb005 --- /dev/null +++ b/emojipicker/app/src/main/res/values-zh-rCN/strings.xml @@ -0,0 +1,42 @@ + + + + + "最近使用过" + "表情符号" + "人物" + "动物和自然" + "食品和饮料" + "旅游和地点" + "活动和庆典" + "物体" + "符号" + "旗帜" + "没有可用的表情符号" + "您尚未使用过任何表情符号" + "表情符号双向切换器" + "已切换表情符号朝向" + "表情符号变体选择器" + "%1$s和%2$s" + "阴影" + "浅肤色" + "中等偏浅肤色" + "中等肤色" + "中等偏深肤色" + "深肤色" + diff --git a/emojipicker/app/src/main/res/values-zh-rHK/strings.xml b/emojipicker/app/src/main/res/values-zh-rHK/strings.xml new file mode 100644 index 00000000..21b7318f --- /dev/null +++ b/emojipicker/app/src/main/res/values-zh-rHK/strings.xml @@ -0,0 +1,42 @@ + + + + + "最近使用過" + "表情符號" + "人物" + "動物和大自然" + "飲食" + "旅遊和地點" + "活動和事件" + "物件" + "符號" + "旗幟" + "沒有可用的 Emoji" + "你尚未使用任何 Emoji" + "Emoji 雙向切換工具" + "轉咗 Emoji 方向" + "Emoji 變化版本選取器" + "%1$s和%2$s" + "陰影" + "淺膚色" + "偏淺膚色" + "中等膚色" + "偏深膚色" + "深膚色" + diff --git a/emojipicker/app/src/main/res/values-zh-rTW/strings.xml b/emojipicker/app/src/main/res/values-zh-rTW/strings.xml new file mode 100644 index 00000000..546e9de2 --- /dev/null +++ b/emojipicker/app/src/main/res/values-zh-rTW/strings.xml @@ -0,0 +1,42 @@ + + + + + "最近使用過" + "表情符號" + "人物" + "動物與大自然" + "飲食" + "旅行與地點" + "活動與事件" + "物品" + "符號" + "旗幟" + "沒有可用的表情符號" + "你尚未使用任何表情符號" + "表情符號雙向切換器" + "已切換表情符號方向" + "表情符號變化版本選取器" + "%1$s和%2$s" + "陰影" + "淺膚色" + "偏淺膚色" + "中等膚色" + "偏深膚色" + "深膚色" + diff --git a/emojipicker/app/src/main/res/values-zu/strings.xml b/emojipicker/app/src/main/res/values-zu/strings.xml new file mode 100644 index 00000000..3918f298 --- /dev/null +++ b/emojipicker/app/src/main/res/values-zu/strings.xml @@ -0,0 +1,42 @@ + + + + + "EZISANDA KUSETSHENZISWA" + "AMASMAYILI NEMIZWA" + "ABANTU" + "IZILWANE NENDALO" + "UKUDLA NESIPHUZO" + "UKUVAKASHA NEZINDAWO" + "IMISEBENZI NEMICIMBI" + "IZINTO" + "AMASIMBULI" + "AMAFULEGI" + "Awekho ama-emoji atholakalayo" + "Awukasebenzisi noma yimaphi ama-emoji okwamanje" + "isishintshi se-emoji ye-bidirectional" + "isikhombisi-ndlela esibheke ku-emoji sishintshiwe" + "isikhethi esihlukile se-emoji" + "Okuthi %1$s nokuthi %2$s" + "isithunzi" + "ibala lesikhumba elikhanyayo" + "ibala lesikhumba elikhanya ngokumaphakathi" + "ibala lesikhumba eliphakathi nendawo" + "ibala lesikhumba elinsundu ngokumaphakathi" + "ibala lesikhumba elimnyama" + diff --git a/emojipicker/app/src/main/res/values/arrays.xml b/emojipicker/app/src/main/res/values/arrays.xml new file mode 100644 index 00000000..8c132896 --- /dev/null +++ b/emojipicker/app/src/main/res/values/arrays.xml @@ -0,0 +1,54 @@ + + + + + + @raw/emoji_category_emotions + @raw/emoji_category_people + @raw/emoji_category_animals_nature + @raw/emoji_category_food_drink + @raw/emoji_category_travel_places + @raw/emoji_category_activity + @raw/emoji_category_objects + @raw/emoji_category_symbols + @raw/emoji_category_flags + + + + + @raw/emoji_category_emotions + + @raw/emoji_category_animals_nature + @raw/emoji_category_food_drink + @raw/emoji_category_travel_places + @raw/emoji_category_activity + @raw/emoji_category_objects + @raw/emoji_category_symbols + @raw/emoji_category_flags + + + + @drawable/gm_filled_emoji_emotions_vd_theme_24 + @drawable/gm_filled_emoji_people_vd_theme_24 + @drawable/gm_filled_emoji_nature_vd_theme_24 + @drawable/gm_filled_emoji_food_beverage_vd_theme_24 + @drawable/gm_filled_emoji_transportation_vd_theme_24 + @drawable/gm_filled_emoji_events_vd_theme_24 + @drawable/gm_filled_emoji_objects_vd_theme_24 + @drawable/gm_filled_emoji_symbols_vd_theme_24 + @drawable/gm_filled_flag_vd_theme_24 + + + + @string/emoji_category_emotions + @string/emoji_category_people + @string/emoji_category_animals_nature + @string/emoji_category_food_drink + @string/emoji_category_travel_places + @string/emoji_category_activity + @string/emoji_category_objects + @string/emoji_category_symbols + @string/emoji_category_flags + + \ No newline at end of file diff --git a/emojipicker/app/src/main/res/values/attrs.xml b/emojipicker/app/src/main/res/values/attrs.xml new file mode 100644 index 00000000..c84e3d86 --- /dev/null +++ b/emojipicker/app/src/main/res/values/attrs.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/app/src/main/res/values/colors.xml b/emojipicker/app/src/main/res/values/colors.xml new file mode 100644 index 00000000..62ab68f2 --- /dev/null +++ b/emojipicker/app/src/main/res/values/colors.xml @@ -0,0 +1,12 @@ + + + + + #edbd82 + #ba8f63 + #91674d + #875334 + #4a2f27 + + #ffffff + diff --git a/emojipicker/app/src/main/res/values/dimens.xml b/emojipicker/app/src/main/res/values/dimens.xml new file mode 100644 index 00000000..fb44ef4d --- /dev/null +++ b/emojipicker/app/src/main/res/values/dimens.xml @@ -0,0 +1,24 @@ + + + + + 39dp + 46dp + 20dp + 20dp + 28dp + 2dp + 42dp + 5dp + 5dp + 5dp + 10dp + 10dp + 10dp + 8dp + 30dp + 6dp + 24dp + 4dp + 2dp + \ No newline at end of file diff --git a/emojipicker/app/src/main/res/values/strings.xml b/emojipicker/app/src/main/res/values/strings.xml new file mode 100644 index 00000000..ddfd2110 --- /dev/null +++ b/emojipicker/app/src/main/res/values/strings.xml @@ -0,0 +1,61 @@ + + + + + RECENTLY USED + + SMILEYS AND EMOTIONS + + PEOPLE + + ANIMALS AND NATURE + + FOOD AND DRINK + + TRAVEL AND PLACES + + ACTIVITIES AND EVENTS + + OBJECTS + + SYMBOLS + + FLAGS + + + No emojis available + + You haven\'t used any emojis yet + + + emoji bidirectional switcher + + + emoji facing direction switched + + + emoji variant selector + + + %1$s and %2$s + + + shadow + + + light skin tone + + + medium light skin tone + + + medium skin tone + + + medium dark skin tone + + + dark skin tone + diff --git a/emojipicker/app/src/main/res/values/styles.xml b/emojipicker/app/src/main/res/values/styles.xml new file mode 100644 index 00000000..7f7fd86a --- /dev/null +++ b/emojipicker/app/src/main/res/values/styles.xml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + diff --git a/emojipicker/app/src/test/java/com/rishabh/emojipicker/ExampleUnitTest.kt b/emojipicker/app/src/test/java/com/rishabh/emojipicker/ExampleUnitTest.kt new file mode 100644 index 00000000..a2585b6e --- /dev/null +++ b/emojipicker/app/src/test/java/com/rishabh/emojipicker/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package com.rishabh.emojipicker + +import org.junit.Test + +import org.junit.Assert.* + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} \ No newline at end of file diff --git a/emojipicker/build.gradle.kts b/emojipicker/build.gradle.kts new file mode 100644 index 00000000..62ace1da --- /dev/null +++ b/emojipicker/build.gradle.kts @@ -0,0 +1,61 @@ +plugins { + alias(libs.plugins.library) + alias(libs.plugins.kotlinAndroid) +} + +android { + namespace = "com.rishabh.emojipicker" + compileSdk = 36 + + defaultConfig { + minSdk = 24 + targetSdk = 36 + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + isMinifyEnabled = false + + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = "1.8" + } +} + +dependencies { +// implementation(project(":ApiFirebaseRoomCommonImplementaion")) + + + implementation(libs.androidx.core.ktx) + implementation(libs.androidx.appcompat) + implementation(libs.material) + implementation(libs.androidx.emoji2) + implementation(libs.firebase.crashlytics.buildtools) + testImplementation(libs.junit) + androidTestImplementation(libs.androidx.test.ext.junit) + androidTestImplementation(libs.espresso.core) + implementation(libs.kotlinx.coroutines.android) + implementation (libs.kotlinx.coroutines.play.services) + api(libs.androidx.core) + + // Implementations + implementation(libs.kotlin.stdlib) + implementation(libs.kotlinx.coroutines.guava) + + + androidTestImplementation(libs.test.core) + androidTestImplementation(libs.androidx.runner) + androidTestImplementation(libs.androidx.rules) + + +} diff --git a/emojipicker/consumer-rules.pro b/emojipicker/consumer-rules.pro new file mode 100644 index 00000000..e69de29b diff --git a/emojipicker/gradle.properties b/emojipicker/gradle.properties new file mode 100644 index 00000000..3c5031eb --- /dev/null +++ b/emojipicker/gradle.properties @@ -0,0 +1,23 @@ +# Project-wide Gradle settings. +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true +# AndroidX package structure to make it clearer which packages are bundled with the +# Android operating system, and which are packaged with your app's APK +# https://developer.android.com/topic/libraries/support-library/androidx-rn +android.useAndroidX=true +# Kotlin code style for this project: "official" or "obsolete": +kotlin.code.style=official +# Enables namespacing of each library's R class so that its R class includes only the +# resources declared in the library itself and none from the library's dependencies, +# thereby reducing the size of the R class for that library +android.nonTransitiveRClass=true \ No newline at end of file diff --git a/emojipicker/gradle/libs.versions.toml b/emojipicker/gradle/libs.versions.toml new file mode 100644 index 00000000..6b5c555d --- /dev/null +++ b/emojipicker/gradle/libs.versions.toml @@ -0,0 +1,26 @@ +[versions] +kotlinStdlib = "1.9.20" +kotlinCoroutinesAndroid = "1.9.0-alpha01" +kotlinCoroutinesGuava = "1.4.0-rc01" +espressoContrib = "1.7.0-rc01" +espressoCore = "1.1.0-alpha04" +testCore = "2.3.0-alpha01" +testExtJunit = "1.1.0-alpha02" +testRunner = "1.3.0-alpha02" +testRules = "1.3.0-alpha05" + +[libraries] +#AndroidX +#kotlinStdlib = { module = "androidx.kotlinStdlib", version.ref = "1.10.0-alpha01" } +#kotlinCoroutinesAndroid = { module = "androidx.kotlinCoroutinesAndroid", version.ref = "1.9.0-alpha01" } +#kotlinCoroutinesGuava = { module = "androidx.kotlinCoroutinesGuava", version.ref = "1.4.0-rc01" } +#espressoCore = { module = "androidx.espressoCore", version.ref = "1.1.0-alpha04" } +#testCore = { module = "androidx.testCore", version.ref = "2.3.0-alpha01" } +#testExtJunit = { module = "androidx.testExtJunit", version.ref = "1.1.0-alpha02" } +#testRunner = { module = "androidx.testRunner", version.ref = "1.3.0-alpha02" } +#testRules = { module = "androidx.testRules", version.ref = "1.3.0-alpha05" } + +[bundles] +#espressoContrib = { module = "androidx.bundles.espressoContrib", version.ref = "1.7.0-rc01" } + + diff --git a/emojipicker/gradle/wrapper/gradle-wrapper.jar b/emojipicker/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 00000000..e708b1c0 Binary files /dev/null and b/emojipicker/gradle/wrapper/gradle-wrapper.jar differ diff --git a/emojipicker/gradle/wrapper/gradle-wrapper.properties b/emojipicker/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..c6a783c5 --- /dev/null +++ b/emojipicker/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Sat Jun 01 17:24:43 IST 2024 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/emojipicker/gradlew b/emojipicker/gradlew new file mode 100644 index 00000000..4f906e0c --- /dev/null +++ b/emojipicker/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/emojipicker/gradlew.bat b/emojipicker/gradlew.bat new file mode 100644 index 00000000..107acd32 --- /dev/null +++ b/emojipicker/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/emojipicker/proguard-rules.pro b/emojipicker/proguard-rules.pro new file mode 100644 index 00000000..cdc313f0 --- /dev/null +++ b/emojipicker/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/emojipicker/src/androidTest/java/com/rishabh/emojipicker/ExampleInstrumentedTest.kt b/emojipicker/src/androidTest/java/com/rishabh/emojipicker/ExampleInstrumentedTest.kt new file mode 100644 index 00000000..4f45e2e1 --- /dev/null +++ b/emojipicker/src/androidTest/java/com/rishabh/emojipicker/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.rishabh.emojipicker + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.rishabh.emojipicker.test", appContext.packageName) + } +} \ No newline at end of file diff --git a/emojipicker/src/main/AndroidManifest.xml b/emojipicker/src/main/AndroidManifest.xml new file mode 100644 index 00000000..92dab776 --- /dev/null +++ b/emojipicker/src/main/AndroidManifest.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/emojipicker/src/main/androidx/emoji2/androidx-emoji2-emoji2-emojipicker-documentation.md b/emojipicker/src/main/androidx/emoji2/androidx-emoji2-emoji2-emojipicker-documentation.md new file mode 100644 index 00000000..fc1b9355 --- /dev/null +++ b/emojipicker/src/main/androidx/emoji2/androidx-emoji2-emoji2-emojipicker-documentation.md @@ -0,0 +1,8 @@ +# Module root + +androidx.emoji2 emoji2-emojipicker + +# package reeshabh.emojipicker + +This library provides the latest emoji support and emoji picker UI including +skin-tone variants and emoji compat support. diff --git a/emojipicker/src/main/java/androidx/emoji2/emojipicker/BundledEmojiListLoader.kt b/emojipicker/src/main/java/androidx/emoji2/emojipicker/BundledEmojiListLoader.kt new file mode 100644 index 00000000..a5849c6c --- /dev/null +++ b/emojipicker/src/main/java/androidx/emoji2/emojipicker/BundledEmojiListLoader.kt @@ -0,0 +1,145 @@ + + +package com.rishabh.emojipicker + +import android.content.Context +import android.content.res.TypedArray +import android.util.Log +import androidx.annotation.DrawableRes +import androidx.core.content.res.use +import com.rishabh.emojipicker.utils.UnicodeRenderableManager +import com.rishabh.emojipicker.utils.FileCache + +import kotlinx.coroutines.async +import kotlinx.coroutines.awaitAll +import kotlinx.coroutines.coroutineScope + +/** + * A data loader that loads the following objects either from file based caches or from resources. + * + * categorizedEmojiData: a list that holds bundled emoji separated by category, filtered by + * renderability check. This is the data source for EmojiPickerView. + * + * emojiVariantsLookup: a map of emoji variants in bundled emoji, keyed by the base emoji. This + * allows faster variants lookup. + * + * primaryEmojiLookup: a map of base emoji to its variants in bundled emoji. This allows faster + * variants lookup. + */ + object BundledEmojiListLoader { + private var categorizedEmojiData: List? = null + private var emojiVariantsLookup: Map>? = null + + internal suspend fun load(context: Context) { + val categoryNames = context.resources.getStringArray(R.array.category_names) + val categoryHeaderIconIds = + context.resources.obtainTypedArray(R.array.emoji_categories_icons).use { typedArray -> + IntArray(typedArray.length()) { + typedArray.getResourceId(it, 0) + } + } + + /*may be have issue in the old android version- the part i comment it out*/ + val resources = +// if (UnicodeRenderableManager.isEmoji12Supported()) +// R.array.emoji_by_category_raw_resources_gender_inclusive +// else + R.array.emoji_by_category_raw_resources + val emojiFileCache = FileCache.getInstance(context) + + categorizedEmojiData = + context.resources.obtainTypedArray(resources).use { ta -> + loadEmoji(ta, categoryHeaderIconIds, categoryNames, emojiFileCache, context) + } + emojiVariantsLookup = + categorizedEmojiData!! + .flatMap { it.emojiDataList } + .filter { it.variants.isNotEmpty() } + .flatMap { it.variants.map { variant -> EmojiViewItem(it.emoji, it.description, it.variants) } } + .associate { it.emoji to it.variants } + .also { + emojiVariantsLookup = it } + } + + fun getCategorizedEmojiData() = + categorizedEmojiData + ?: throw IllegalStateException("BundledEmojiListLoader.load is not called or complete") + + fun getEmojiVariantsLookup() = + emojiVariantsLookup + ?: throw IllegalStateException("BundledEmojiListLoader.load is not called or complete") + + private suspend fun loadEmoji( + ta: TypedArray, + @DrawableRes categoryHeaderIconIds: IntArray, + categoryNames: Array, + emojiFileCache: FileCache, + context: Context + ): List = coroutineScope { + (0 until ta.length()) + .map {intvalue-> + async { + emojiFileCache + .getOrPut(getCacheFileName(intvalue)) { + loadSingleCategory(context, ta.getResourceId(intvalue, 0)) + }.let { + + EmojiDataCategory(categoryHeaderIconIds[intvalue], categoryNames[intvalue], it) + } + } + } + .awaitAll() + } + + private fun loadSingleCategory( + context: Context, + csvResId: Int, + ): List = + context.resources + .openRawResource(csvResId) + .bufferedReader() + .useLines { it.toList() } + .map { + filterRenderableEmojis(it.split(",")) + } + .filter { + it.isNotEmpty() } + .map { + val emoji = it.getOrNull(0) ?: "" + val description = it.getOrNull(1) ?:"" + + + EmojiViewItem(emoji, description,it.drop(2)) } + + private fun getCacheFileName(categoryIndex: Int) = + StringBuilder() + .append("emoji.v1.") + .append(if (EmojiPickerView.emojiCompatLoaded) 1 else 0) + .append(".") + .append(categoryIndex) + .append(".") + .append(if (UnicodeRenderableManager.isEmoji12Supported()) 1 else 0) + .toString() + + /** + * To eliminate 'Tofu' (the fallback glyph when an emoji is not renderable), check the + * renderability of emojis and keep only when they are renderable on the current device. + */ + private fun filterRenderableEmojis(emojiList: List) :List{ + if(UnicodeRenderableManager.isEmojiRenderable(emojiList.first())){ + for(varient in emojiList.drop(2)){ + if(UnicodeRenderableManager.isEmojiRenderable((varient).toString())){ + return emojiList + } + } + return emojiList + + } + return listOf() + } + data class EmojiDataCategory( + @DrawableRes val headerIconId: Int, + val categoryName: String, + val emojiDataList: List + ) +} diff --git a/emojipicker/src/main/java/androidx/emoji2/emojipicker/DefaultRecentEmojiProvider.kt b/emojipicker/src/main/java/androidx/emoji2/emojipicker/DefaultRecentEmojiProvider.kt new file mode 100644 index 00000000..f525b5dd --- /dev/null +++ b/emojipicker/src/main/java/androidx/emoji2/emojipicker/DefaultRecentEmojiProvider.kt @@ -0,0 +1,40 @@ +package com.rishabh.emojipicker + +import android.content.Context +import android.content.Context.MODE_PRIVATE + +/** + * Provides recently shared emoji. This is the default recent emoji list provider. Clients could + * specify the provider by their own. + */ +internal class DefaultRecentEmojiProvider(context: Context) : RecentEmojiProvider { + + companion object { + private const val PREF_KEY_RECENT_EMOJI = "pref_key_recent_emoji" + private const val RECENT_EMOJI_LIST_FILE_NAME = "androidx.emoji2.emojipicker.preferences" + private const val SPLIT_CHAR = "," + } + + private val sharedPreferences = + context.getSharedPreferences(RECENT_EMOJI_LIST_FILE_NAME, MODE_PRIVATE) + private val recentEmojiList: MutableList = + sharedPreferences.getString(PREF_KEY_RECENT_EMOJI, null)?.split(SPLIT_CHAR)?.toMutableList() + ?: mutableListOf() + + override suspend fun getRecentEmojiList(): List { + return recentEmojiList + } + + override fun recordSelection(emoji: String) { + recentEmojiList.remove(emoji) + recentEmojiList.add(0, emoji) + saveToPreferences() + } + + private fun saveToPreferences() { + sharedPreferences + .edit() + .putString(PREF_KEY_RECENT_EMOJI, recentEmojiList.joinToString(SPLIT_CHAR)) + .commit() + } +} diff --git a/emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerBodyAdapter.kt b/emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerBodyAdapter.kt new file mode 100644 index 00000000..582456ce --- /dev/null +++ b/emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerBodyAdapter.kt @@ -0,0 +1,168 @@ + + +package com.rishabh.emojipicker + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.view.ViewGroup.LayoutParams +import android.widget.TextView +import androidx.annotation.LayoutRes +import androidx.annotation.UiThread +import androidx.core.view.ViewCompat + +import androidx.recyclerview.widget.RecyclerView.Adapter +import androidx.recyclerview.widget.RecyclerView.ViewHolder +import com.rishabh.emojipicker.Extensions.toItemType + +/** RecyclerView adapter for emoji body. */ +class EmojiPickerBodyAdapter( + private val context: Context, + private val emojiGridColumns: Int, + private val emojiGridRows: Float?, + private val stickyVariantProvider: StickyVariantProvider, + private val emojiPickerItemsProvider: () -> EmojiPickerItems, + private val onEmojiPickedListener: EmojiPickerBodyAdapter.(EmojiViewItem) -> Unit, + var hideTitleAndEmptyHint:Boolean = false +) : Adapter() { + private val layoutInflater: LayoutInflater = LayoutInflater.from(context) + private var emojiCellWidth: Int? = null + private var emojiCellHeight: Int? = null + var dynamicTextColor: Int? = null + + + + @UiThread + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + emojiCellWidth = emojiCellWidth ?: (getParentWidth(parent) / emojiGridColumns) + emojiCellHeight = + emojiCellHeight + ?: emojiGridRows?.let { getEmojiCellTotalHeight(parent) / it }?.toInt() + ?: emojiCellWidth + if(hideTitleAndEmptyHint){ + + } + + return when (viewType.toItemType()) { + ItemType.CATEGORY_TITLE -> createSimpleHolder(R.layout.category_text_view, parent) + + ItemType.PLACEHOLDER_TEXT -> + createSimpleHolder(R.layout.empty_category_text_view, parent) { + minimumHeight = emojiCellHeight!! + } + + ItemType.EMOJI -> { + EmojiViewHolder( + context, + emojiCellWidth!!, + emojiCellHeight!!, + stickyVariantProvider, + onEmojiPickedListener = { emojiViewItem -> + onEmojiPickedListener(emojiViewItem) + }, + onEmojiPickedFromPopupListener = { emoji -> + var baseEmoji = "" + BundledEmojiListLoader.getEmojiVariantsLookup().forEach { key,value-> + value.forEach { + if(it==emoji){ + baseEmoji = key + } + } + } + emojiPickerItemsProvider().forEachIndexed { index, itemViewData -> + if ( + itemViewData is EmojiViewData && + BundledEmojiListLoader.getEmojiVariantsLookup()[ + itemViewData.emoji] + ?.get(0) == baseEmoji && + itemViewData.updateToSticky + ) { + itemViewData.emoji = emoji + notifyItemChanged(index) + } + } + } + ) + } + } + } + + override fun onBindViewHolder(viewHolder: ViewHolder, position: Int) { + val item = emojiPickerItemsProvider().getBodyItem(position) + + if(hideTitleAndEmptyHint){ + when (getItemViewType(position).toItemType()) { + ItemType.CATEGORY_TITLE -> {} + ItemType.PLACEHOLDER_TEXT -> {} + + ItemType.EMOJI -> { + (viewHolder as EmojiViewHolder).bindEmoji((item as EmojiViewData).emoji) + } + } + }else{ + when (getItemViewType(position).toItemType()) { + ItemType.CATEGORY_TITLE -> { + ViewCompat.requireViewById(viewHolder.itemView, R.id.category_name).text = + (item as CategoryTitle).title + ViewCompat.requireViewById(viewHolder.itemView, R.id.category_name) + .setTextColor(dynamicTextColor!!) + } + ItemType.EMOJI -> { + (viewHolder as EmojiViewHolder).bindEmoji((item as EmojiViewData).emoji) + } + ItemType.PLACEHOLDER_TEXT -> { + ViewCompat.requireViewById( + viewHolder.itemView, + R.id.emoji_picker_empty_category_view + ).text = (item as PlaceholderText).text + + ViewCompat.requireViewById( + viewHolder.itemView, + R.id.emoji_picker_empty_category_view + ) .setTextColor(dynamicTextColor!!) + } + } + } + + } + + fun updateTextColor(newColor: Int) { + dynamicTextColor = newColor + notifyDataSetChanged() + } + + override fun getItemId(position: Int): Long = + emojiPickerItemsProvider().getBodyItem(position).hashCode().toLong() + + override fun getItemCount(): Int { + return emojiPickerItemsProvider().size + } + + override fun getItemViewType(position: Int): Int { + return emojiPickerItemsProvider().getBodyItem(position).viewType + } + + private fun getParentWidth(parent: ViewGroup): Int { + return parent.measuredWidth - parent.paddingLeft - parent.paddingRight + } + + private fun getEmojiCellTotalHeight(parent: ViewGroup) = + parent.measuredHeight - + context.resources.getDimensionPixelSize(R.dimen.emoji_picker_category_name_height) * 2 - + context.resources.getDimensionPixelSize(R.dimen.emoji_picker_category_name_padding_top) + + private fun createSimpleHolder( + @LayoutRes layoutId: Int, + parent: ViewGroup, + init: (View.() -> Unit)? = null, + ) = + object : + ViewHolder( + layoutInflater.inflate(layoutId, parent, /* attachToRoot= */ false).also { + it.layoutParams = LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT) + init?.invoke(it) + + } + ) {} +} diff --git a/emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerConstants.kt b/emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerConstants.kt new file mode 100644 index 00000000..e7e8d2a4 --- /dev/null +++ b/emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerConstants.kt @@ -0,0 +1,21 @@ + + +package com.rishabh.emojipicker + +/** A utility class to hold various constants used by the Emoji Picker library. */ +internal object EmojiPickerConstants { + + // The default number of body columns. + const val DEFAULT_BODY_COLUMNS = 9 + + // The default number of rows of recent items held. + const val DEFAULT_MAX_RECENT_ITEM_ROWS = 3 + + // The max pool size of the Emoji ItemType in RecyclerViewPool. + const val EMOJI_VIEW_POOL_SIZE = 100 + + const val ADD_VIEW_EXCEPTION_MESSAGE = "Adding views to the EmojiPickerView is unsupported" + + const val REMOVE_VIEW_EXCEPTION_MESSAGE = + "Removing views from the EmojiPickerView is unsupported" +} diff --git a/emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerHeaderAdapter.kt b/emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerHeaderAdapter.kt new file mode 100644 index 00000000..de5ed9aa --- /dev/null +++ b/emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerHeaderAdapter.kt @@ -0,0 +1,78 @@ + + +package com.rishabh.emojipicker + +import android.content.Context +import android.graphics.ColorFilter +import android.graphics.PorterDuff +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.view.accessibility.AccessibilityEvent +import android.widget.ImageView +import androidx.core.view.ViewCompat +import androidx.recyclerview.widget.RecyclerView.Adapter +import androidx.recyclerview.widget.RecyclerView.ViewHolder + +/** RecyclerView adapter for emoji header. */ +class EmojiPickerHeaderAdapter( + context: Context, + private val emojiPickerItems: EmojiPickerItems, + private val onHeaderIconClicked: (Int) -> Unit, +) : Adapter() { + private val layoutInflater: LayoutInflater = LayoutInflater.from(context) + + var selectedGroupIndex: Int = 0 + set(value) { + if (value == field) return + notifyItemChanged(field) + notifyItemChanged(value) + field = value + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + return object : + ViewHolder( + layoutInflater.inflate( + R.layout.header_icon_holder, + parent, + /* attachToRoot = */ false + ) + ) {} + } + var dynamicTextColor: Int? = null + override fun onBindViewHolder(viewHolder: ViewHolder, i: Int) { + val isItemSelected = i == selectedGroupIndex + val headerIcon = + ViewCompat.requireViewById( + viewHolder.itemView, + R.id.emoji_picker_header_icon + ) + .apply { + setImageDrawable(context.getDrawable(emojiPickerItems.getHeaderIconId(i))) + setColorFilter(dynamicTextColor!!, PorterDuff.Mode.SRC_IN) + isSelected = isItemSelected + contentDescription = emojiPickerItems.getHeaderIconDescription(i) + } + + viewHolder.itemView.setOnClickListener { + onHeaderIconClicked(i) + selectedGroupIndex = i + } + if (isItemSelected) { + headerIcon.post { + headerIcon.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_HOVER_ENTER) + } + } + + ViewCompat.requireViewById(viewHolder.itemView, R.id.emoji_picker_header_underline) + .apply { + visibility = if (isItemSelected) View.VISIBLE else View.GONE + isSelected = isItemSelected + } + } + + override fun getItemCount(): Int { + return emojiPickerItems.numGroups + } +} diff --git a/emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerItems.kt b/emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerItems.kt new file mode 100644 index 00000000..a226c079 --- /dev/null +++ b/emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerItems.kt @@ -0,0 +1,114 @@ + + +package com.rishabh.emojipicker + +import androidx.annotation.DrawableRes +import androidx.annotation.IntRange + +/** + * A group of items in RecyclerView for emoji picker body. [titleItem] comes first. [listOfAllEmojiInAGroup] + * comes after [titleItem]. [emptyPlaceholderItem] will be served after [titleItem] only if + * [listOfAllEmojiInAGroup] is empty. [maxContentItemCount], if provided, will truncate [listOfAllEmojiInAGroup] to + * certain size. + * + * [categoryIconId] is the corresponding category icon in emoji picker header. + */ +class ItemGroup( + @DrawableRes internal val categoryIconId: Int, + internal val titleItem: CategoryTitle, + private val listOfAllEmojiInAGroup: List, + private val maxContentItemCount: Int? = null, + private val emptyPlaceholderItem: PlaceholderText? = null +) { + + val size: Int + get() { + var totalSize = 1 // Start with the title item + + // Check for empty content items and adjust size accordingly + if (listOfAllEmojiInAGroup.isEmpty()) { + totalSize += if (emptyPlaceholderItem!= null) 1 else 0 + } else { + // Adjust size based on maxContentItemCount if applicable + if (maxContentItemCount!= null && listOfAllEmojiInAGroup.size > maxContentItemCount) { + totalSize = maxContentItemCount + } else { + totalSize += listOfAllEmojiInAGroup.size // Add the actual number of content items + } + } + + return totalSize + } + + operator fun get(index: Int): ItemViewData { + if (index == 0) return titleItem + val contentIndex = index - 1 + if (contentIndex < listOfAllEmojiInAGroup.size) return listOfAllEmojiInAGroup[contentIndex] + if (contentIndex == 0 && emptyPlaceholderItem != null) return emptyPlaceholderItem + throw IndexOutOfBoundsException() + } + + fun getAll(): List = IntRange(0, size - 1).map { get(it) } +} + +/** A view of concatenated list of [ItemGroup]. */ +class EmojiPickerItems(private val groups: List ) : Iterable { + val size: Int + get() = groups.sumOf { it.size } + + + + fun getBodyItem(@IntRange(from = 0) absolutePosition: Int): ItemViewData { + var localPosition = absolutePosition + for (group in groups) { + + if (localPosition < group.size) return group[localPosition] + else localPosition -= group.size + } + throw IndexOutOfBoundsException() + } + + + fun getRecentListIfExist(): ItemGroup{ + + return if (groups[0].titleItem.title == "RECENTLY USED") { + groups[0] + } else { + groups[1] + } + + } + + val numGroups: Int + get() = groups.size + + @DrawableRes + fun getHeaderIconId(@IntRange(from = 0) index: Int): Int = groups[index].categoryIconId + + fun getHeaderIconDescription(@IntRange(from = 0) index: Int): String = + groups[index].titleItem.title + + fun groupIndexByItemPosition(@IntRange(from = 0) absolutePosition: Int): Int { + var localPosition = absolutePosition + var index = 0 + for (group in groups) { + if (localPosition < group.size) return index + else { + localPosition -= group.size + index++ + } + } + throw IndexOutOfBoundsException() + } + + fun firstItemPositionByGroupIndex(@IntRange(from = 0) groupIndex: Int): Int = + groups.take(groupIndex).sumOf { it.size } + + fun groupRange(group: ItemGroup): kotlin.ranges.IntRange { + check(groups.contains(group)) + val index = groups.indexOf(group) + return firstItemPositionByGroupIndex(index).let { it until it + group.size } + } + + override fun iterator(): Iterator = groups.flatMap { it.getAll() }.iterator() +} diff --git a/emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerPopupBidirectionalDesign.kt b/emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerPopupBidirectionalDesign.kt new file mode 100644 index 00000000..1829233f --- /dev/null +++ b/emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerPopupBidirectionalDesign.kt @@ -0,0 +1,110 @@ +/* + * Copyright 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.rishabh.emojipicker + +import android.content.Context +import android.view.Gravity +import android.view.View +import android.view.ViewGroup +import android.widget.FrameLayout +import android.widget.LinearLayout +import androidx.appcompat.widget.AppCompatImageView + +/** Emoji picker popup view with bidirectional UI design to switch emoji to face left or right. */ +internal class EmojiPickerPopupBidirectionalDesign( + override val context: Context, + override val targetEmojiView: View, + override val variants: List, + override val popupView: LinearLayout, + override val emojiViewOnClickListener: View.OnClickListener +) : EmojiPickerPopupDesign() { + private var emojiFacingLeft = true + + init { + updateTemplate() + } + + override fun addLayoutHeader() { + val row = + LinearLayout(context).apply { + orientation = LinearLayout.HORIZONTAL + gravity = Gravity.CENTER + layoutParams = + LinearLayout.LayoutParams( + FrameLayout.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.WRAP_CONTENT + ) + } + FrameLayout.inflate(context, R.layout.emoji_picker_popup_bidirectional, row) + .findViewById(R.id.emoji_picker_popup_bidirectional_icon) + .apply { + layoutParams = + LinearLayout.LayoutParams(targetEmojiView.width, targetEmojiView.height) + } + popupView.addView(row) + val imageView = + row.findViewById(R.id.emoji_picker_popup_bidirectional_icon) + imageView.setOnClickListener { + emojiFacingLeft = !emojiFacingLeft + updateTemplate() + popupView.removeViews(/* start= */ 1, getActualNumberOfRows()) + addRowsToPopupView() + imageView.announceForAccessibility( + context.getString(R.string.emoji_bidirectional_switcher_clicked_desc) + ) + } + } + + override fun getNumberOfRows(): Int { + // Adding one row for the bidirectional switcher. + return variants.size / 2 / BIDIRECTIONAL_COLUMN_COUNT + 1 + } + + override fun getNumberOfColumns(): Int { + return BIDIRECTIONAL_COLUMN_COUNT + } + + private fun getActualNumberOfRows(): Int { + // Removing one extra row of the bidirectional switcher. + return getNumberOfRows() - 1 + } + + private fun updateTemplate() { + template = + if (emojiFacingLeft) + arrayOf((variants.indices.filter { it % 12 < 6 }.map { it + 1 }).toIntArray()) + else arrayOf((variants.indices.filter { it % 12 >= 6 }.map { it + 1 }).toIntArray()) + + val row = getActualNumberOfRows() + val column = getNumberOfColumns() + val overrideTemplate = Array(row) { IntArray(column) } + var index = 0 + for (i in 0 until row) { + for (j in 0 until column) { + if (index < template[0].size) { + overrideTemplate[i][j] = template[0][index] + index++ + } + } + } + template = overrideTemplate + } + + companion object { + private const val BIDIRECTIONAL_COLUMN_COUNT = 6 + } +} diff --git a/emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerPopupDesign.kt b/emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerPopupDesign.kt new file mode 100644 index 00000000..e55f53df --- /dev/null +++ b/emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerPopupDesign.kt @@ -0,0 +1,89 @@ +/* + * Copyright 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.rishabh.emojipicker + +import android.content.Context +import android.view.View +import android.view.ViewGroup +import android.view.accessibility.AccessibilityEvent +import android.widget.FrameLayout +import android.widget.LinearLayout + +/** Emoji picker popup view UI design. Each UI design needs to inherit this abstract class. */ +internal abstract class EmojiPickerPopupDesign { + abstract val context: Context + abstract val targetEmojiView: View + abstract val variants: List + abstract val popupView: LinearLayout + abstract val emojiViewOnClickListener: View.OnClickListener + lateinit var template: Array + + open fun addLayoutHeader() { + // no-ops + } + + open fun addRowsToPopupView() { + for (row in template) { + val rowLayout = + LinearLayout(context).apply { + orientation = LinearLayout.HORIZONTAL + layoutParams = + LinearLayout.LayoutParams( + FrameLayout.LayoutParams.WRAP_CONTENT, + FrameLayout.LayoutParams.WRAP_CONTENT + ) + } + for (item in row) { + val cell = + if (item == 0) { + EmojiView(context) + } else { + EmojiView(context).apply { + willDrawVariantIndicator = false + emoji = variants[item - 1] + setOnClickListener(emojiViewOnClickListener) + if (item == 1) { + // Hover on the first emoji in the popup + popupView.post { + sendAccessibilityEvent( + AccessibilityEvent.TYPE_VIEW_HOVER_ENTER + ) + } + } + } + } + .apply { + layoutParams = + ViewGroup.LayoutParams( + targetEmojiView.width, + targetEmojiView.height + ) + } + rowLayout.addView(cell) + } + popupView.addView(rowLayout) + } + } + + open fun addLayoutFooter() { + // no-ops + } + + abstract fun getNumberOfRows(): Int + + abstract fun getNumberOfColumns(): Int +} diff --git a/emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerPopupFlatDesign.kt b/emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerPopupFlatDesign.kt new file mode 100644 index 00000000..4b511256 --- /dev/null +++ b/emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerPopupFlatDesign.kt @@ -0,0 +1,60 @@ +/* + * Copyright 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.rishabh.emojipicker + +import android.content.Context +import android.view.View +import android.widget.LinearLayout + +/** Emoji picker popup view with flat design to list emojis. */ +internal class EmojiPickerPopupFlatDesign( + override val context: Context, + override val targetEmojiView: View, + override val variants: List, + override val popupView: LinearLayout, + override val emojiViewOnClickListener: View.OnClickListener +) : EmojiPickerPopupDesign() { + init { + template = arrayOf(variants.indices.map { it + 1 }.toIntArray()) + var row = getNumberOfRows() + var column = getNumberOfColumns() + val overrideTemplate = Array(row) { IntArray(column) } + var index = 0 + for (i in 0 until row) { + for (j in 0 until column) { + if (index < template[0].size) { + overrideTemplate[i][j] = template[0][index] + index++ + } + } + } + template = overrideTemplate + } + + override fun getNumberOfRows(): Int { + val column = getNumberOfColumns() + return variants.size / column + if (variants.size % column == 0) 0 else 1 + } + + override fun getNumberOfColumns(): Int { + return minOf(FLAT_COLUMN_MAX_COUNT, template[0].size) + } + + companion object { + private const val FLAT_COLUMN_MAX_COUNT = 6 + } +} diff --git a/emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerPopupMultiSkintoneDesign.kt b/emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerPopupMultiSkintoneDesign.kt new file mode 100644 index 00000000..2dab8179 --- /dev/null +++ b/emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerPopupMultiSkintoneDesign.kt @@ -0,0 +1,401 @@ +/* + * Copyright 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.rishabh.emojipicker + +import android.content.Context +import android.content.res.ColorStateList +import android.graphics.Color +import android.graphics.drawable.Drawable +import android.util.Log +import android.view.ContextThemeWrapper +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.FrameLayout +import android.widget.ImageView +import android.widget.LinearLayout +import androidx.annotation.StringRes +import androidx.core.content.res.ResourcesCompat +import com.google.firebase.crashlytics.buildtools.reloc.com.google.common.collect.ImmutableMap +import com.google.firebase.crashlytics.buildtools.reloc.com.google.common.primitives.ImmutableIntArray + + +/** Emoji picker popup with multi-skintone selection panel. */ +internal class EmojiPickerPopupMultiSkintoneDesign( + override val context: Context, + override val targetEmojiView: View, + override val variants: List, + override val popupView: LinearLayout, + override val emojiViewOnClickListener: View.OnClickListener, + targetEmoji: String +) : EmojiPickerPopupDesign() { + + private val inflater = LayoutInflater.from(context) + private val resultRow = + LinearLayout(context).apply { + orientation = LinearLayout.HORIZONTAL + layoutParams = + LinearLayout.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT + ) + } + + private var selectedLeftSkintone = -1 + private var selectedRightSkintone = -1 + + init { + val triggerVariantIndex: Int = variants.indexOf(targetEmoji) + if (triggerVariantIndex > 0) { + selectedLeftSkintone = (triggerVariantIndex - 1) / getNumberOfColumns() + selectedRightSkintone = + triggerVariantIndex - selectedLeftSkintone * getNumberOfColumns() - 1 + } + } + + override fun addRowsToPopupView() { + for (row in 0 until getActualNumberOfRows()) { + val rowLayout = + LinearLayout(context).apply { + orientation = LinearLayout.HORIZONTAL + layoutParams = + LinearLayout.LayoutParams( + FrameLayout.LayoutParams.WRAP_CONTENT, + FrameLayout.LayoutParams.WRAP_CONTENT + ) + } + for (column in 0 until getNumberOfColumns()) { + inflater.inflate(R.layout.emoji_picker_popup_image_view, rowLayout) + val imageView = rowLayout.getChildAt(column) as ImageView + imageView.apply { + layoutParams = + LinearLayout.LayoutParams(targetEmojiView.width, targetEmojiView.height) + isClickable = true + contentDescription = getImageContentDescription(context, row, column) + if ( + (hasLeftSkintone() && row == 0 && selectedLeftSkintone == column) || + (hasRightSkintone() && row == 1 && selectedRightSkintone == column) + ) { + isSelected = true + isClickable = false + } + setImageDrawable(getDrawableRes(context, row, column)) + setOnClickListener { + var unSelectedView: View? = null + if (row == 0) { + if (hasLeftSkintone()) { + unSelectedView = rowLayout.getChildAt(selectedLeftSkintone) + } + selectedLeftSkintone = column + } else { + if (hasRightSkintone()) { + unSelectedView = rowLayout.getChildAt(selectedRightSkintone) + } + selectedRightSkintone = column + } + if (unSelectedView != null) { + unSelectedView.isSelected = false + unSelectedView.isClickable = true + } + isClickable = false + isSelected = true + processResultView() + } + } + } + popupView.addView(rowLayout) + } + } + + private fun processResultView() { + val childCount = resultRow.childCount + if (childCount < 1 || childCount > 2) { + Log.e(TAG, "processResultEmojiForRectangleLayout(): unexpected emoji result row size") + return + } + // Remove the result emoji if it's already available. It will be available after the row is + // inflated the first time. + if (childCount == 2) { + resultRow.removeViewAt(1) + } + if (hasLeftSkintone() && hasRightSkintone()) { + inflater.inflate(R.layout.emoji_picker_popup_emoji_view, resultRow) + val layout = resultRow.getChildAt(1) as LinearLayout + layout.findViewById(R.id.emoji_picker_popup_emoji_view).apply { + willDrawVariantIndicator = false + isClickable = true + emoji = + variants[ + selectedLeftSkintone * getNumberOfColumns() + selectedRightSkintone + 1] + setOnClickListener(emojiViewOnClickListener) + layoutParams = + LinearLayout.LayoutParams(targetEmojiView.width, targetEmojiView.height) + } + layout.findViewById(R.id.emoji_picker_popup_emoji_view_wrapper).apply { + layoutParams = + LinearLayout.LayoutParams( + targetEmojiView.width * getNumberOfColumns() / 2, + targetEmojiView.height + ) + } + } else if (hasLeftSkintone()) { + drawImageView( + /* row= */ 0, + /*column=*/ selectedLeftSkintone, + /* applyGrayTint= */ false + ) + } else if (hasRightSkintone()) { + drawImageView( + /* row= */ 1, + /*column=*/ selectedRightSkintone, + /* applyGrayTint= */ false + ) + } else { + drawImageView(/* row= */ 0, /* column= */ 0, /* applyGrayTint= */ true) + } + } + + private fun drawImageView(row: Int, column: Int, applyGrayTint: Boolean) { + inflater + .inflate(R.layout.emoji_picker_popup_image_view, resultRow) + .findViewById(R.id.emoji_picker_popup_image_view) + .apply { + layoutParams = LinearLayout.LayoutParams(0, targetEmojiView.height, 1f) + setImageDrawable(getDrawableRes(context, row, column)) + if (applyGrayTint) { + imageTintList = ColorStateList.valueOf(Color.GRAY) + } + + var contentDescriptionRow = selectedLeftSkintone + var contentDescriptionColumn = selectedRightSkintone + if (hasLeftSkintone()) { + contentDescriptionRow = 0 + contentDescriptionColumn = selectedLeftSkintone + } else if (hasRightSkintone()) { + contentDescriptionRow = 1 + contentDescriptionColumn = selectedRightSkintone + } + contentDescription = + getImageContentDescription( + context, + contentDescriptionRow, + contentDescriptionColumn + ) + } + } + + override fun addLayoutFooter() { + inflater.inflate(R.layout.emoji_picker_popup_emoji_view, resultRow) + val layout = resultRow.getChildAt(0) as LinearLayout + layout.findViewById(R.id.emoji_picker_popup_emoji_view).apply { + willDrawVariantIndicator = false + emoji = variants[0] + layoutParams = LinearLayout.LayoutParams(targetEmojiView.width, targetEmojiView.height) + isClickable = true + setOnClickListener(emojiViewOnClickListener) + } + layout.findViewById(R.id.emoji_picker_popup_emoji_view_wrapper).apply { + layoutParams = + LinearLayout.LayoutParams( + targetEmojiView.width * getNumberOfColumns() / 2, + targetEmojiView.height + ) + } + processResultView() + popupView.addView(resultRow) + } + + override fun getNumberOfRows(): Int { + // Add one extra row for the neutral skin tone combination + return LAYOUT_ROWS + 1 + } + + override fun getNumberOfColumns(): Int { + return LAYOUT_COLUMNS + } + + private fun getActualNumberOfRows(): Int { + return LAYOUT_ROWS + } + + private fun hasLeftSkintone(): Boolean { + return selectedLeftSkintone != -1 + } + + private fun hasRightSkintone(): Boolean { + return selectedRightSkintone != -1 + } + + private fun getDrawableRes(context: Context, row: Int, column: Int): Drawable? { + val resArray: ImmutableIntArray? = SKIN_TONES_EMOJI_TO_RESOURCES[variants[0]] + if (resArray != null) { + val contextThemeWrapper = ContextThemeWrapper(context, VARIANT_STYLES[column]) + return ResourcesCompat.getDrawable( + context.resources, + resArray[row], + contextThemeWrapper.getTheme() + ) + } + return null + } + + private fun getImageContentDescription(context: Context, row: Int, column: Int): String { + return context.getString( + R.string.emoji_variant_content_desc_template, + context.getString(getSkintoneStringRes(/* isLeft= */ true, row, column)), + context.getString(getSkintoneStringRes(/* isLeft= */ false, row, column)) + ) + } + + @StringRes + private fun getSkintoneStringRes(isLeft: Boolean, row: Int, column: Int): Int { + // When there is no column, the selected position -1 will be passed in as column. + if (column == -1) { + return R.string.emoji_skin_tone_shadow_content_desc + } + return if (isLeft) { + if (row == 0) SKIN_TONE_CONTENT_DESC_RES_IDS[column] + else R.string.emoji_skin_tone_shadow_content_desc + } else { + if (row == 0) R.string.emoji_skin_tone_shadow_content_desc + else SKIN_TONE_CONTENT_DESC_RES_IDS[column] + } + } + + companion object { + private const val TAG = "MultiSkintoneDesign" + private const val LAYOUT_ROWS = 2 + private const val LAYOUT_COLUMNS = 5 + + private val SKIN_TONE_CONTENT_DESC_RES_IDS = + ImmutableIntArray.of( + R.string.emoji_skin_tone_light_content_desc, + R.string.emoji_skin_tone_medium_light_content_desc, + R.string.emoji_skin_tone_medium_content_desc, + R.string.emoji_skin_tone_medium_dark_content_desc, + R.string.emoji_skin_tone_dark_content_desc + ) + + private val VARIANT_STYLES = + ImmutableIntArray.of( + R.style.EmojiSkintoneSelectorLight, + R.style.EmojiSkintoneSelectorMediumLight, + R.style.EmojiSkintoneSelectorMedium, + R.style.EmojiSkintoneSelectorMediumDark, + R.style.EmojiSkintoneSelectorDark + ) + + /** + * Map from emoji that use the square layout strategy with skin tone swatches or rectangle + * strategy to their resources. + */ + private val SKIN_TONES_EMOJI_TO_RESOURCES = + ImmutableMap.Builder() + .put( + "🤝", + ImmutableIntArray.of( + R.drawable.handshake_skintone_shadow, + R.drawable.handshake_shadow_skintone + ) + ) + .put( + "👭", + ImmutableIntArray.of( + R.drawable.holding_women_skintone_shadow, + R.drawable.holding_women_shadow_skintone + ) + ) + .put( + "👫", + ImmutableIntArray.of( + R.drawable.holding_woman_man_skintone_shadow, + R.drawable.holding_woman_man_shadow_skintone + ) + ) + .put( + "👬", + ImmutableIntArray.of( + R.drawable.holding_men_skintone_shadow, + R.drawable.holding_men_shadow_skintone + ) + ) + .put( + "🧑‍🤝‍🧑", + ImmutableIntArray.of( + R.drawable.holding_people_skintone_shadow, + R.drawable.holding_people_shadow_skintone + ) + ) + .put( + "💏", + ImmutableIntArray.of( + R.drawable.kiss_people_skintone_shadow, + R.drawable.kiss_people_shadow_skintone + ) + ) + .put( + "👩‍❤️‍💋‍👨", + ImmutableIntArray.of( + R.drawable.kiss_woman_man_skintone_shadow, + R.drawable.kiss_woman_man_shadow_skintone + ) + ) + .put( + "👨‍❤️‍💋‍👨", + ImmutableIntArray.of( + R.drawable.kiss_men_skintone_shadow, + R.drawable.kiss_men_shadow_skintone + ) + ) + .put( + "👩‍❤️‍💋‍👩", + ImmutableIntArray.of( + R.drawable.kiss_women_skintone_shadow, + R.drawable.kiss_women_shadow_skintone + ) + ) + .put( + "💑", + ImmutableIntArray.of( + R.drawable.couple_heart_people_skintone_shadow, + R.drawable.couple_heart_people_shadow_skintone + ) + ) + .put( + "👩‍❤️‍👨", + ImmutableIntArray.of( + R.drawable.couple_heart_woman_man_skintone_shadow, + R.drawable.couple_heart_woman_man_shadow_skintone + ) + ) + .put( + "👨‍❤️‍👨", + ImmutableIntArray.of( + R.drawable.couple_heart_men_skintone_shadow, + R.drawable.couple_heart_men_shadow_skintone + ) + ) + .put( + "👩‍❤️‍👩", + ImmutableIntArray.of( + R.drawable.couple_heart_women_skintone_shadow, + R.drawable.couple_heart_women_shadow_skintone + ) + ) + .build() + } +} diff --git a/emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerPopupSquareDesign.kt b/emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerPopupSquareDesign.kt new file mode 100644 index 00000000..0472995f --- /dev/null +++ b/emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerPopupSquareDesign.kt @@ -0,0 +1,57 @@ +/* + * Copyright 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.rishabh.emojipicker + +import android.content.Context +import android.view.View +import android.widget.LinearLayout + +/** Emoji picker popup view with square design. */ +internal class EmojiPickerPopupSquareDesign( + override val context: Context, + override val targetEmojiView: View, + override val variants: List, + override val popupView: LinearLayout, + override val emojiViewOnClickListener: View.OnClickListener +) : EmojiPickerPopupDesign() { + init { + template = SQUARE_LAYOUT_TEMPLATE + } + + override fun getNumberOfRows(): Int { + return SQUARE_LAYOUT_TEMPLATE.size + } + + override fun getNumberOfColumns(): Int { + return SQUARE_LAYOUT_TEMPLATE[0].size + } + + companion object { + /** + * Square variant layout template without skin tone. 0 : a place holder Positive number is + * the index + 1 in the variant array + */ + private val SQUARE_LAYOUT_TEMPLATE = + arrayOf( + intArrayOf(0, 2, 3, 4, 5, 6), + intArrayOf(0, 7, 8, 9, 10, 11), + intArrayOf(0, 12, 13, 14, 15, 16), + intArrayOf(0, 17, 18, 19, 20, 21), + intArrayOf(1, 22, 23, 24, 25, 26) + ) + } +} diff --git a/emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerPopupView.kt b/emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerPopupView.kt new file mode 100644 index 00000000..a6ca815f --- /dev/null +++ b/emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerPopupView.kt @@ -0,0 +1,134 @@ +/* + * Copyright 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.rishabh.emojipicker + +import android.content.Context +import android.util.AttributeSet +import android.view.View +import android.widget.FrameLayout +import android.widget.LinearLayout + +/** Popup view for emoji picker to show emoji variants. */ +internal class EmojiPickerPopupView +@JvmOverloads +constructor( + context: Context, + attrs: AttributeSet?, + defStyleAttr: Int = 0, + private val targetEmojiView: View, + private val targetEmojiItem: EmojiViewItem, + private val emojiViewOnClickListener: OnClickListener +) : FrameLayout(context, attrs, defStyleAttr) { + + private val variants = targetEmojiItem.variants + private val targetEmoji = targetEmojiItem.emoji + private val popupView: LinearLayout + private val popupDesign: EmojiPickerPopupDesign + + init { + popupView = + inflate(context, R.layout.variant_popup, /* root= */ null) + .findViewById(R.id.variant_popup) + val layout = getLayout() + popupDesign = + when (layout) { + Layout.FLAT -> + EmojiPickerPopupFlatDesign( + context, + targetEmojiView, + variants, + popupView, + emojiViewOnClickListener + ) + Layout.SQUARE -> + EmojiPickerPopupSquareDesign( + context, + targetEmojiView, + variants, + popupView, + emojiViewOnClickListener + ) + Layout.SQUARE_WITH_SKIN_TONE_CIRCLE -> + EmojiPickerPopupMultiSkintoneDesign( + context, + targetEmojiView, + variants, + popupView, + emojiViewOnClickListener, + targetEmoji + ) + Layout.BIDIRECTIONAL -> + EmojiPickerPopupBidirectionalDesign( + context, + targetEmojiView, + variants, + popupView, + emojiViewOnClickListener + ) + } + popupDesign.addLayoutHeader() + popupDesign.addRowsToPopupView() + popupDesign.addLayoutFooter() + addView(popupView) + } + + fun getPopupViewWidth(): Int { + return popupDesign.getNumberOfColumns() * targetEmojiView.width + + popupView.paddingStart + + popupView.paddingEnd + } + + fun getPopupViewHeight(): Int { + return popupDesign.getNumberOfRows() * targetEmojiView.height + + popupView.paddingTop + + popupView.paddingBottom + } + + private fun getLayout(): Layout { + if (variants.size == SQUARE_LAYOUT_VARIANT_COUNT) + if (SQUARE_LAYOUT_EMOJI_NO_SKIN_TONE.contains(variants[0])) return Layout.SQUARE + else return Layout.SQUARE_WITH_SKIN_TONE_CIRCLE + else if (variants.size == BIDIRECTIONAL_VARIANTS_COUNT) return Layout.BIDIRECTIONAL + else return Layout.FLAT + } + + companion object { + private enum class Layout { + FLAT, + SQUARE, + SQUARE_WITH_SKIN_TONE_CIRCLE, + BIDIRECTIONAL + } + + /** + * The number of variants expected when using a square layout strategy. Square layouts are + * comprised of a 5x5 grid + the base variant. + */ + private const val SQUARE_LAYOUT_VARIANT_COUNT = 26 + + /** + * The number of variants expected when using a bidirectional layout strategy. Bidirectional + * layouts are comprised of bidirectional icon and a 3x6 grid with left direction emojis as + * default. After clicking the bidirectional icon, it switches to a bidirectional icon and a + * 3x6 grid with right direction emojis. + */ + private const val BIDIRECTIONAL_VARIANTS_COUNT = 36 + + // Set of emojis that use the square layout without skin tone swatches. + private val SQUARE_LAYOUT_EMOJI_NO_SKIN_TONE = setOf("👪") + } +} diff --git a/emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerPopupViewController.kt b/emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerPopupViewController.kt new file mode 100644 index 00000000..36c4d76c --- /dev/null +++ b/emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerPopupViewController.kt @@ -0,0 +1,70 @@ +package com.rishabh.emojipicker + + + +import android.content.Context +import android.view.Gravity +import android.view.View +import android.view.ViewGroup.LayoutParams +import android.view.WindowManager +import android.widget.PopupWindow +import android.widget.Toast +import kotlin.math.roundToInt + +/** + * Default controller class for emoji picker popup view. + * + *

Shows the popup view above the target Emoji. View under control is a {@code + * EmojiPickerPopupView}. + */ +internal class EmojiPickerPopupViewController( + private val context: Context, + private val emojiPickerPopupView: EmojiPickerPopupView, + private val clickedEmojiView: View +) { + private val popupWindow: PopupWindow = + PopupWindow( + emojiPickerPopupView, + LayoutParams.WRAP_CONTENT, + LayoutParams.WRAP_CONTENT, + /* focusable= */ false + ) + + fun show() { + popupWindow.apply { + val location = IntArray(2) + clickedEmojiView.getLocationInWindow(location) + // Make the popup view center align with the target emoji view. + val x = + location[0] + clickedEmojiView.width / 2f - + emojiPickerPopupView.getPopupViewWidth() / 2f + val y = location[1] - emojiPickerPopupView.getPopupViewHeight() + // Set background drawable so that the popup window is dismissed properly when clicking + // outside / scrolling for API < 23. + setBackgroundDrawable(context.getDrawable(R.drawable.popup_view_rounded_background)) + isOutsideTouchable = true + isTouchable = true + animationStyle = R.style.VariantPopupAnimation + elevation = + clickedEmojiView.context.resources + .getDimensionPixelSize(R.dimen.emoji_picker_popup_view_elevation) + .toFloat() + try { + showAtLocation(clickedEmojiView, Gravity.NO_GRAVITY, x.roundToInt(), y) + } catch (e: WindowManager.BadTokenException) { + Toast.makeText( + context, + "Don't use EmojiPickerView inside a Popup", + Toast.LENGTH_LONG + ) + .show() + } + } + } + + fun dismiss() { + if (popupWindow.isShowing) { + popupWindow.dismiss() + } + } +} diff --git a/emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerView.kt b/emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerView.kt new file mode 100644 index 00000000..fa59803e --- /dev/null +++ b/emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiPickerView.kt @@ -0,0 +1,568 @@ + + +package com.rishabh.emojipicker + +import android.app.KeyguardManager +import android.content.Context +import android.content.res.TypedArray +import android.util.AttributeSet +import android.view.View +import android.view.ViewGroup +import android.widget.FrameLayout +import androidx.core.util.Consumer +import androidx.core.view.ViewCompat +import androidx.emoji2.text.EmojiCompat +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +//import com.rishabh.apiandfirebasejsonfile.MyInterfaces.EmojiPickedFromSuggestion +import com.rishabh.emojipicker.EmojiPickerConstants.DEFAULT_MAX_RECENT_ITEM_ROWS +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import kotlin.coroutines.EmptyCoroutineContext + +interface EmojiPickedFromSuggestion { + fun pickedEmoji(emoji:String) +} +/** + * The emoji picker view that provides up-to-date emojis in a vertical scrollable view with a + * clickable horizontal header. + */ +class EmojiPickerView +@JvmOverloads +constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : FrameLayout(context, attrs, defStyleAttr) { + + internal companion object { + internal var emojiCompatLoaded: Boolean = false + } + var emojiPickedFromSuggestion:EmojiPickedFromSuggestion?=null + + private var _emojiGridRows: Float? = null + /** + * The number of rows of the emoji picker. + * + * Optional field. If not set, the value will be calculated based on parent view height and + * [emojiGridColumns]. Float value indicates that the picker could display the last row + * partially, so the users get the idea that they can scroll down for more contents. + * + * @attr ref androidx.emoji2.emojipicker.R.styleable.EmojiPickerView_emojiGridRows + */ + var emojiGridRows: Float + get() = _emojiGridRows ?: -1F + set(value) { + _emojiGridRows = value.takeIf { it > 0 } + // Refresh when emojiGridRows is reset + if (isLaidOut) { + showEmojiPickerView() + } + } + + private var _usedInSearchResult:Boolean = false + /*it is used to show the all the emoji and their categories if it's false else- only show emoji that is match with the description text */ + var usedInSearchResult:Boolean + get() = _usedInSearchResult + set(value) { + _usedInSearchResult = value + } + + /** + * The number of columns of the emoji picker. + * + * Default value([EmojiPickerConstants.DEFAULT_BODY_COLUMNS]: 9) will be used if + * emojiGridColumns is set to non-positive value. + * + * @attr ref androidx.emoji2.emojipicker.R.styleable.EmojiPickerView_emojiGridColumns + */ + var emojiGridColumns: Int = EmojiPickerConstants.DEFAULT_BODY_COLUMNS + set(value) { + field = value.takeIf { it > 0 } ?: EmojiPickerConstants.DEFAULT_BODY_COLUMNS + // Refresh when emojiGridColumns is reset + if (isLaidOut) { + showEmojiPickerView() + } + } + + private val stickyVariantProvider = StickyVariantProvider(context) + private val scope = CoroutineScope(EmptyCoroutineContext) + + private var recentEmojiProvider: RecentEmojiProvider? = null + private var recentNeedsRefreshing: Boolean = true + private val recentItems: MutableList = mutableListOf() + private lateinit var recentItemGroup: ItemGroup + + lateinit var emojiPickerItems: EmojiPickerItems + lateinit var bodyAdapter: EmojiPickerBodyAdapter + lateinit var headerAdapter: EmojiPickerHeaderAdapter + + + private var onEmojiPickedListener: Consumer? = null + + init { + val isLocked = isDeviceLocked(context) + + if (!isLocked) { + try { + recentEmojiProvider = DefaultRecentEmojiProvider(context) + } catch (e: Exception) { + // If SharedPreferences access fails for any reason, set to null + recentEmojiProvider = null + } + } + + val typedArray: TypedArray = context.obtainStyledAttributes(attrs, R.styleable.EmojiPickerView, 0, 0) + _emojiGridRows = with(R.styleable.EmojiPickerView_emojiGridRows) { + if (typedArray.hasValue(this)) { + typedArray.getFloat(this, 0F) + } else null + } + emojiGridColumns = typedArray.getInt( + R.styleable.EmojiPickerView_emojiGridColumns, EmojiPickerConstants.DEFAULT_BODY_COLUMNS + ) + + usedInSearchResult = + typedArray.getBoolean(R.styleable.EmojiPickerView_usedInSearchResult, false) + typedArray.recycle() + + + + + } + + fun build(color:Int,emojiesLoaded:()->Unit){ + + + + if (EmojiCompat.isConfigured()) { + when (EmojiCompat.get().loadState) { + EmojiCompat.LOAD_STATE_SUCCEEDED -> emojiCompatLoaded = true + EmojiCompat.LOAD_STATE_LOADING, + EmojiCompat.LOAD_STATE_DEFAULT -> + EmojiCompat.get().registerInitCallback(object : EmojiCompat.InitCallback() { + override fun onInitialized() { + emojiCompatLoaded = true + scope.launch(Dispatchers.IO) { + BundledEmojiListLoader.load(context) + withContext(Dispatchers.Main) { + emojiPickerItems = buildEmojiPickerItems() + bodyAdapter.dynamicTextColor = color + bodyAdapter.notifyDataSetChanged() + emojiesLoaded() + } + } + } + + override fun onFailed(throwable: Throwable?) {} + } + ) + } + } + + scope.launch(Dispatchers.IO) { + val load = launch { BundledEmojiListLoader.load(context) } + refreshRecent() + load.join() + + withContext(Dispatchers.Main) { showEmojiPickerView() + headerAdapter.dynamicTextColor = color + bodyAdapter.updateTextColor(color) + emojiesLoaded()} + } + } + fun isDeviceLocked(context: Context): Boolean { + return try { + val keyguardManager = context.getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager + keyguardManager.isDeviceLocked || keyguardManager.isKeyguardLocked + } catch (e: Exception) { + // If we can't determine lock state, assume it's locked to be safe + true + } + } + fun createEmojiPickerBodyAdapter(): EmojiPickerBodyAdapter { + return EmojiPickerBodyAdapter( + context, + emojiGridColumns, + _emojiGridRows, + stickyVariantProvider, + emojiPickerItemsProvider = { emojiPickerItems }, + onEmojiPickedListener = { emojiViewItem -> + emojiPickedFromSuggestion?.pickedEmoji(emojiViewItem.emoji) + emojiViewItem.emoji + onEmojiPickedListener?.accept(emojiViewItem) + recentEmojiProvider?.recordSelection(emojiViewItem.emoji) + recentNeedsRefreshing = true + } + ) + } + + /*here is emoji is get from the bundle and send to recycler view*/ + fun buildEmojiPickerItems(onlyRecentEmojies: Boolean = false, description: String?=null ) :EmojiPickerItems{ + + if(!usedInSearchResult){ + return EmojiPickerItems( + buildList { + add( + ItemGroup( + R.drawable.quantum_gm_ic_access_time_filled_vd_theme_24, + CategoryTitle(context.getString(R.string.emoji_category_recent)), + recentItems, + maxContentItemCount = DEFAULT_MAX_RECENT_ITEM_ROWS * emojiGridColumns, + emptyPlaceholderItem = + PlaceholderText( + context.getString(R.string.emoji_empty_recent_category) + ) + ) + .also { recentItemGroup = it } + ) + + for ((i, category) in + BundledEmojiListLoader.getCategorizedEmojiData().withIndex()) { + add( + ItemGroup( + category.headerIconId, + CategoryTitle(category.categoryName), + category.emojiDataList.mapIndexed { j, emojiData -> + + EmojiViewData( + stickyVariantProvider[emojiData.emoji], + dataIndex = i + j + ) + }, + ) + ) + } + } + ) + }else{ + if(onlyRecentEmojies && description==null ){ + return EmojiPickerItems( + buildList { + add(ItemGroup( + R.drawable.quantum_gm_ic_access_time_filled_vd_theme_24, + CategoryTitle(context.getString(R.string.emoji_category_recent)), + recentItems, + maxContentItemCount = DEFAULT_MAX_RECENT_ITEM_ROWS * emojiGridColumns, + emptyPlaceholderItem = + PlaceholderText( + context.getString(R.string.emoji_empty_recent_category) + ) + ) +// .also { recentItemGroup = it } + ) + + } + ) + } + else if(!onlyRecentEmojies && description!=null){ + + return EmojiPickerItems( + buildList { + val listOfEmojiData = mutableListOf() + var categoryHeaderIconId:Int = 0 + var categoryName:String = "" + + for ((i, category) in BundledEmojiListLoader.getCategorizedEmojiData().withIndex()) { + for((j,emojiData) in category.emojiDataList.withIndex()){ + + if(emojiData.description.contains(description)){ + if(listOfEmojiData.size<17){ + categoryHeaderIconId = category.headerIconId + listOfEmojiData.add(EmojiViewData(stickyVariantProvider[emojiData.emoji], dataIndex = i + j)) + } + + } + } + } + add(ItemGroup(categoryHeaderIconId, + CategoryTitle(categoryName),listOfEmojiData) + ) + }) + }else { return EmojiPickerItems(listOf()) } + + } + + } + + + + + + /** + * Gets the recent emoji provider used by this picker. + */ + fun getRecentEmojiProvider(): RecentEmojiProvider? { + return recentEmojiProvider + } + + + + /** + * Forces a refresh of recent emojis from the provider. + */ + suspend fun forceRefreshRecent() { + recentNeedsRefreshing = true + refreshRecent() + } + + + + + + private fun showEmojiPickerView() { + emojiPickerItems = buildEmojiPickerItems() + + val bodyLayoutManager = + GridLayoutManager(context, emojiGridColumns, LinearLayoutManager.VERTICAL,/* reverseLayout = */ false).apply { + spanSizeLookup = + object : GridLayoutManager.SpanSizeLookup() { + override fun getSpanSize(position: Int): Int { + return when (emojiPickerItems.getBodyItem(position).itemType) { + ItemType.CATEGORY_TITLE, + ItemType.PLACEHOLDER_TEXT -> emojiGridColumns + else -> 1 + } + } + } + } + headerAdapter = + EmojiPickerHeaderAdapter(context, emojiPickerItems, onHeaderIconClicked = + { with(emojiPickerItems.firstItemPositionByGroupIndex(it)) { + if (this == emojiPickerItems.groupRange(recentItemGroup).first) { + scope.launch { refreshRecent() } + } + bodyLayoutManager.scrollToPositionWithOffset(this, 0) + // The scroll position change will not be reflected until the next layout + // call, + // so force a new layout call here. + invalidate() + } + } + ) + + + + // clear view's children in case of resetting layout + super.removeAllViews() + with(inflate(context, R.layout.emoji_picker, this)) { + // set headerView + ViewCompat.requireViewById(this, R.id.emoji_picker_header).apply { + if(usedInSearchResult){ + visibility = GONE + } + + layoutManager = object : LinearLayoutManager(context, HORIZONTAL, /* reverseLayout= */ false) { + override fun checkLayoutParams(lp: RecyclerView.LayoutParams): Boolean { + lp.width = (width - paddingStart - paddingEnd) / emojiPickerItems.numGroups + return true + } + } + adapter = headerAdapter + } + + // set bodyView + ViewCompat.requireViewById(this, R.id.emoji_picker_body).apply { + + layoutManager = bodyLayoutManager + adapter = createEmojiPickerBodyAdapter() + .apply { setHasStableIds(true) } + .also { bodyAdapter = it } + + if(!usedInSearchResult){ + addOnScrollListener(object : RecyclerView.OnScrollListener() { + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { + super.onScrolled(recyclerView, dx, dy) + headerAdapter.selectedGroupIndex = emojiPickerItems.groupIndexByItemPosition( + bodyLayoutManager.findFirstCompletelyVisibleItemPosition() + ) + if (recentNeedsRefreshing && + bodyLayoutManager.findFirstVisibleItemPosition() !in emojiPickerItems.groupRange(recentItemGroup) + ) { + scope.launch { refreshRecent() } + } + } + } + ) + } + + // Disable item insertion/deletion animation. This keeps view holder unchanged when + // item updates. + itemAnimator = null + setRecycledViewPool( + RecyclerView.RecycledViewPool().apply { + setMaxRecycledViews( + ItemType.EMOJI.ordinal, + EmojiPickerConstants.EMOJI_VIEW_POOL_SIZE + ) + } + ) + } + } + } + + internal suspend fun refreshRecent() { + if (!recentNeedsRefreshing || recentEmojiProvider == null) { + return + } + val oldGroupSize = if (::recentItemGroup.isInitialized) recentItemGroup.size else 0 + val recent = recentEmojiProvider?.getRecentEmojiList() + withContext(Dispatchers.Main) { + recentItems.clear() + if (recent != null) { + recentItems.addAll(recent.map { + EmojiViewData( + it, + updateToSticky = false, + ) + }) + } + if (::emojiPickerItems.isInitialized) { + if(:: recentItemGroup.isInitialized){ + val range = emojiPickerItems.groupRange(recentItemGroup) + if (recentItemGroup.size > oldGroupSize) { + bodyAdapter.notifyItemRangeInserted( + range.first + oldGroupSize, + recentItemGroup.size - oldGroupSize + ) + } else if (recentItemGroup.size < oldGroupSize) { + bodyAdapter.notifyItemRangeRemoved( + range.first + recentItemGroup.size, + oldGroupSize - recentItemGroup.size + ) + } + bodyAdapter.notifyItemRangeChanged( + range.first, + minOf(oldGroupSize, recentItemGroup.size) + ) + recentNeedsRefreshing = false + } + + } + } + } + + /** + * This function is used to set the custom behavior after clicking on an emoji icon. Clients + * could specify their own behavior inside this function. + */ + fun setOnEmojiPickedListener(onEmojiPickedListener: Consumer?) { + this.onEmojiPickedListener = onEmojiPickedListener + } + + fun setRecentEmojiProvider(recentEmojiProvider: RecentEmojiProvider) { + this.recentEmojiProvider = recentEmojiProvider + scope.launch { + recentNeedsRefreshing = true + refreshRecent() + } + } + + /** + * The following functions disallow clients to add view to the EmojiPickerView + * + * @param child the child view to be added + * @throws UnsupportedOperationException + */ + override fun addView(child: View?) { + if (childCount > 0) + throw UnsupportedOperationException(EmojiPickerConstants.ADD_VIEW_EXCEPTION_MESSAGE) + else super.addView(child) + } + + /** + * @param child + * @param params + * @throws UnsupportedOperationException + */ +// override fun addView(child: View?, params: LayoutParams?) { +// if (childCount > 0) +// throw UnsupportedOperationException(EmojiPickerConstants.ADD_VIEW_EXCEPTION_MESSAGE) +// else super.addView(child, params) +// } + + /** + * @param child + * @param index + * @throws UnsupportedOperationException + */ + override fun addView(child: View?, index: Int) { + if (childCount > 0) + throw UnsupportedOperationException(EmojiPickerConstants.ADD_VIEW_EXCEPTION_MESSAGE) + else super.addView(child, index) + } + + /** + * @param child + * @param index + * @param params + * @throws UnsupportedOperationException + */ +// override fun addView(child: View?, index: Int, params: LayoutParams?) { +// if (childCount > 0) +// throw UnsupportedOperationException(EmojiPickerConstants.ADD_VIEW_EXCEPTION_MESSAGE) +// else super.addView(child, index, params) +// } + + /** + * @param child + * @param width + * @param height + * @throws UnsupportedOperationException + */ + override fun addView(child: View?, width: Int, height: Int) { + if (childCount > 0) + throw UnsupportedOperationException(EmojiPickerConstants.ADD_VIEW_EXCEPTION_MESSAGE) + else super.addView(child, width, height) + } + + /** + * The following functions disallow clients to remove view from the EmojiPickerView + * + * @throws UnsupportedOperationException + */ + override fun removeAllViews() { + throw UnsupportedOperationException(EmojiPickerConstants.REMOVE_VIEW_EXCEPTION_MESSAGE) + } + + /** + * @param child + * @throws UnsupportedOperationException + */ + override fun removeView(child: View?) { + throw UnsupportedOperationException(EmojiPickerConstants.REMOVE_VIEW_EXCEPTION_MESSAGE) + } + + /** + * @param index + * @throws UnsupportedOperationException + */ + override fun removeViewAt(index: Int) { + throw UnsupportedOperationException(EmojiPickerConstants.REMOVE_VIEW_EXCEPTION_MESSAGE) + } + + /** + * @param child + * @throws UnsupportedOperationException + */ + override fun removeViewInLayout(child: View?) { + throw UnsupportedOperationException(EmojiPickerConstants.REMOVE_VIEW_EXCEPTION_MESSAGE) + } + + /** + * @param start + * @param count + * @throws UnsupportedOperationException + */ + override fun removeViews(start: Int, count: Int) { + throw UnsupportedOperationException(EmojiPickerConstants.REMOVE_VIEW_EXCEPTION_MESSAGE) + } + + /** + * @param start + * @param count + * @throws UnsupportedOperationException + */ + override fun removeViewsInLayout(start: Int, count: Int) { + throw UnsupportedOperationException(EmojiPickerConstants.REMOVE_VIEW_EXCEPTION_MESSAGE) + } +} diff --git a/emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiView.kt b/emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiView.kt new file mode 100644 index 00000000..107921f4 --- /dev/null +++ b/emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiView.kt @@ -0,0 +1,174 @@ + + +package com.rishabh.emojipicker + +import android.content.Context +import android.graphics.Bitmap +import android.graphics.Canvas +import android.graphics.Color +import android.graphics.Paint +import android.graphics.Rect +import android.os.Build +import android.text.Layout +import android.text.Spanned +import android.text.StaticLayout +import android.text.TextPaint +import android.util.AttributeSet +import android.util.TypedValue +import android.view.View +import androidx.annotation.RequiresApi +import androidx.core.graphics.applyCanvas +import androidx.emoji2.text.EmojiCompat + +/** A customized view to support drawing emojis asynchronously. */ +internal class EmojiView +@JvmOverloads +constructor( + context: Context, + attrs: AttributeSet? = null, +) : View(context, attrs) { + + companion object { + private const val EMOJI_DRAW_TEXT_SIZE_SP = 30 + } + + init { + background = context.getDrawable(R.drawable.ripple_emoji_view) + importantForAccessibility = IMPORTANT_FOR_ACCESSIBILITY_YES + } + + internal var willDrawVariantIndicator: Boolean = true + + private val textPaint = + TextPaint(Paint.ANTI_ALIAS_FLAG or Paint.FILTER_BITMAP_FLAG).apply { + textSize = + TypedValue.applyDimension( + TypedValue.COMPLEX_UNIT_SP, + EMOJI_DRAW_TEXT_SIZE_SP.toFloat(), + context.resources.displayMetrics + ) + } + + private val offscreenCanvasBitmap: Bitmap = + with(textPaint.fontMetricsInt) { + val size = bottom - top + Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888) + } + + override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { + val size = + minOf(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.getSize(heightMeasureSpec)) - + context.resources.getDimensionPixelSize(R.dimen.emoji_picker_emoji_view_padding) + setMeasuredDimension(size, size) + } + + override fun draw(canvas: Canvas) { + super.draw(canvas) + canvas.run { + save() + scale( + width.toFloat() / offscreenCanvasBitmap.width, + height.toFloat() / offscreenCanvasBitmap.height + ) + drawBitmap(offscreenCanvasBitmap, 0f, 0f, null) + restore() + } + } + + var emoji: CharSequence? = null + set(value) { + field = value + post { + if (value != null) { + if (value == this.emoji) { + drawEmoji( + if (EmojiPickerView.emojiCompatLoaded) + EmojiCompat.get().process(value) ?: value + else value, + drawVariantIndicator = + willDrawVariantIndicator && + BundledEmojiListLoader.getEmojiVariantsLookup() + .containsKey(value) + ) + contentDescription = value + } + invalidate() + } else { + offscreenCanvasBitmap.eraseColor(Color.TRANSPARENT) + } + } + } + + private fun drawEmoji(emoji: CharSequence, drawVariantIndicator: Boolean) { + offscreenCanvasBitmap.eraseColor(Color.TRANSPARENT) + offscreenCanvasBitmap.applyCanvas { + if (emoji is Spanned) { + createStaticLayout(emoji, width).draw(this) + } else { + val textWidth = textPaint.measureText(emoji, 0, emoji.length) + drawText( + emoji, + /* start = */ 0, + /* end = */ emoji.length, + /* x = */ (width - textWidth) / 2, + /* y = */ -textPaint.fontMetrics.top, + textPaint, + ) + } + if (drawVariantIndicator) { + + context + .getDrawable(R.drawable.variant_availability_indicator) + ?.apply { + val canvasWidth = this@applyCanvas.width + val canvasHeight = this@applyCanvas.height + val indicatorWidth = + context.resources.getDimensionPixelSize( + R.dimen.variant_availability_indicator_width + ) + val indicatorHeight = + context.resources.getDimensionPixelSize( + R.dimen.variant_availability_indicator_height + ) + bounds = + Rect( + canvasWidth - indicatorWidth, + canvasHeight - indicatorHeight, + canvasWidth, + canvasHeight + ) + }!! + .draw(this) + } + } + } + + @RequiresApi(23) + internal object Api23Impl { + fun createStaticLayout(emoji: Spanned, textPaint: TextPaint, width: Int): StaticLayout = + StaticLayout.Builder.obtain(emoji, 0, emoji.length, textPaint, width) + .apply { + setAlignment(Layout.Alignment.ALIGN_CENTER) + setLineSpacing(/* spacingAdd= */ 0f, /* spacingMult= */ 1f) + setIncludePad(false) + } + .build() + } + + private fun createStaticLayout(emoji: Spanned, width: Int): StaticLayout { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + return Api23Impl.createStaticLayout(emoji, textPaint, width) + } else { + @Suppress("DEPRECATION") + return StaticLayout( + emoji, + textPaint, + width, + Layout.Alignment.ALIGN_CENTER, + /* spacingmult = */ 1f, + /* spacingadd = */ 0f, + /* includepad = */ false, + ) + } + } +} diff --git a/emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiViewHolder.kt b/emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiViewHolder.kt new file mode 100644 index 00000000..95462b38 --- /dev/null +++ b/emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiViewHolder.kt @@ -0,0 +1,87 @@ + + +package com.rishabh.emojipicker + +import android.content.Context +import android.view.View +import android.view.View.OnLongClickListener +import android.view.ViewGroup.LayoutParams +import android.view.accessibility.AccessibilityEvent +import androidx.recyclerview.widget.RecyclerView.ViewHolder + +/** A [ViewHolder] containing an emoji view and emoji data. */ +internal class EmojiViewHolder( + context: Context, + width: Int, + height: Int, + private val stickyVariantProvider: StickyVariantProvider, + private val onEmojiPickedListener: EmojiViewHolder.(EmojiViewItem) -> Unit, + private val onEmojiPickedFromPopupListener: EmojiViewHolder.(String) -> Unit +) : ViewHolder(EmojiView(context)) { + + + private val onEmojiLongClickListener: OnLongClickListener = + OnLongClickListener { targetEmojiView -> + + showEmojiPopup(context, targetEmojiView) + } + + private val emojiView: EmojiView = + (itemView as EmojiView).apply { + layoutParams = LayoutParams(width, height) + isClickable = true + setOnClickListener { + it.sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT) + onEmojiPickedListener(emojiViewItem) + } + } + private lateinit var emojiViewItem: EmojiViewItem + private lateinit var emojiPickerPopupViewController: EmojiPickerPopupViewController + + fun bindEmoji( + emoji: String, + ) { + emojiView.emoji = emoji + emojiViewItem = makeEmojiViewItem(emoji) + + if (emojiViewItem.variants.isNotEmpty()) { + emojiView.setOnLongClickListener(onEmojiLongClickListener) + emojiView.isLongClickable = true + } else { + + emojiView.setOnLongClickListener(null) + emojiView.isLongClickable = false + } + } + + private fun showEmojiPopup(context: Context, clickedEmojiView: View): Boolean { + val emojiPickerPopupView = + EmojiPickerPopupView( + context, + /* attrs= */ null, + targetEmojiView = clickedEmojiView, + targetEmojiItem = emojiViewItem, + emojiViewOnClickListener = { view -> + val emojiPickedInPopup = (view as EmojiView).emoji.toString() + onEmojiPickedFromPopupListener(emojiPickedInPopup) + onEmojiPickedListener(makeEmojiViewItem(emojiPickedInPopup)) + // variants[0] is always the base (i.e., primary) emoji + stickyVariantProvider.update(emojiViewItem.variants[0], emojiPickedInPopup) + emojiPickerPopupViewController.dismiss() + // Hover on the base emoji after popup dismissed + clickedEmojiView.sendAccessibilityEvent( + AccessibilityEvent.TYPE_VIEW_HOVER_ENTER + ) + } + ) + emojiPickerPopupViewController = + EmojiPickerPopupViewController(context, emojiPickerPopupView, clickedEmojiView) + emojiPickerPopupViewController.show() + return true + } + + private fun makeEmojiViewItem(emoji: String) = + + + EmojiViewItem(emoji, "",BundledEmojiListLoader.getEmojiVariantsLookup()[emoji] ?: listOf()) +} diff --git a/emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiViewItem.kt b/emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiViewItem.kt new file mode 100644 index 00000000..07a1d78f --- /dev/null +++ b/emojipicker/src/main/java/androidx/emoji2/emojipicker/EmojiViewItem.kt @@ -0,0 +1,11 @@ + + +package com.rishabh.emojipicker + +/** + * [EmojiViewItem] is a class holding the displayed emoji and its emoji variants + * + * @param emoji Used to represent the displayed emoji of the [EmojiViewItem]. + * @param variants Used to represent the corresponding emoji variants of this base emoji. + */ +class EmojiViewItem(val emoji: String, val description: String,val variants: List) diff --git a/emojipicker/src/main/java/androidx/emoji2/emojipicker/ItemViewData.kt b/emojipicker/src/main/java/androidx/emoji2/emojipicker/ItemViewData.kt new file mode 100644 index 00000000..d025a992 --- /dev/null +++ b/emojipicker/src/main/java/androidx/emoji2/emojipicker/ItemViewData.kt @@ -0,0 +1,32 @@ + + +package com.rishabh.emojipicker + +enum class ItemType { + CATEGORY_TITLE, + PLACEHOLDER_TEXT, + EMOJI, +} + +/** Represents an item within the body RecyclerView. */ +sealed class ItemViewData(val itemType: ItemType) { + val viewType = itemType.ordinal +} + +/** Title of each category. */ +data class CategoryTitle(val title: String) : ItemViewData(ItemType.CATEGORY_TITLE) + +/** Text to display when the category contains no items. */ +data class PlaceholderText(val text: String) : ItemViewData(ItemType.PLACEHOLDER_TEXT) + +/** Represents an emoji. */ +data class EmojiViewData( + var emoji: String, + val updateToSticky: Boolean = true, + // Needed to ensure uniqueness since we enabled stable Id. + val dataIndex: Int = 0 +) : ItemViewData(ItemType.EMOJI) + +internal object Extensions { + internal fun Int.toItemType() = ItemType.values()[this] +} diff --git a/emojipicker/src/main/java/androidx/emoji2/emojipicker/RecentEmojiAsyncProvider.kt b/emojipicker/src/main/java/androidx/emoji2/emojipicker/RecentEmojiAsyncProvider.kt new file mode 100644 index 00000000..5f599e72 --- /dev/null +++ b/emojipicker/src/main/java/androidx/emoji2/emojipicker/RecentEmojiAsyncProvider.kt @@ -0,0 +1,41 @@ +/* + * Copyright 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.rishabh.emojipicker + +import com.google.common.util.concurrent.ListenableFuture +import kotlinx.coroutines.guava.await + +/** + * A interface equivalent to [RecentEmojiProvider] that allows java clients to override the + * [ListenableFuture] based function [getRecentEmojiListAsync] in order to provide recent emojis. + */ +interface RecentEmojiAsyncProvider { + fun recordSelection(emoji: String) + + fun getRecentEmojiListAsync(): ListenableFuture> +} + +/** An adapter for the [RecentEmojiAsyncProvider]. */ +class RecentEmojiProviderAdapter(private val recentEmojiAsyncProvider: RecentEmojiAsyncProvider) : + RecentEmojiProvider { + override fun recordSelection(emoji: String) { + recentEmojiAsyncProvider.recordSelection(emoji) + } + + override suspend fun getRecentEmojiList() = + recentEmojiAsyncProvider.getRecentEmojiListAsync().await() +} diff --git a/emojipicker/src/main/java/androidx/emoji2/emojipicker/RecentEmojiProvider.kt b/emojipicker/src/main/java/androidx/emoji2/emojipicker/RecentEmojiProvider.kt new file mode 100644 index 00000000..8362822f --- /dev/null +++ b/emojipicker/src/main/java/androidx/emoji2/emojipicker/RecentEmojiProvider.kt @@ -0,0 +1,19 @@ + + +package com.rishabh.emojipicker + +/** An interface to provide recent emoji list. */ +interface RecentEmojiProvider { + /** + * Records an emoji into recent emoji list. This fun will be called when an emoji is selected. + * Clients could specify the behavior to record recently used emojis.(e.g. click frequency). + */ + fun recordSelection(emoji: String) + + /** + * Returns a list of recent emojis. Default behavior: The most recently used emojis will be + * displayed first. Clients could also specify the behavior such as displaying the emojis from + * high click frequency to low click frequency. + */ + suspend fun getRecentEmojiList(): List +} diff --git a/emojipicker/src/main/java/androidx/emoji2/emojipicker/StickyVariantProvider.kt b/emojipicker/src/main/java/androidx/emoji2/emojipicker/StickyVariantProvider.kt new file mode 100644 index 00000000..724d7a37 --- /dev/null +++ b/emojipicker/src/main/java/androidx/emoji2/emojipicker/StickyVariantProvider.kt @@ -0,0 +1,56 @@ + + +package com.rishabh.emojipicker + +import android.content.Context +import android.content.Context.MODE_PRIVATE +import android.os.UserManager + +/** A class that handles user's emoji variant selection using SharedPreferences. + * or basically it saves emoji varient and changethe base emoji to that emoji varient next time */ +class StickyVariantProvider(context: Context) { + companion object { + const val PREFERENCES_FILE_NAME = "androidx.emoji2.emojipicker.preferences" + const val STICKY_VARIANT_PROVIDER_KEY = "pref_key_sticky_variant" + const val KEY_VALUE_DELIMITER = "=" + const val ENTRY_DELIMITER = "|" + } + val userUnlocked = context.getSystemService(UserManager::class.java)?.isUserUnlocked ?: false + + private val sharedPreferences = if(userUnlocked){ + context.getSharedPreferences(PREFERENCES_FILE_NAME, MODE_PRIVATE) + }else{null} + + private val stickyVariantMap: MutableMap by lazy { + sharedPreferences + ?.getString(STICKY_VARIANT_PROVIDER_KEY, null) + ?.split(ENTRY_DELIMITER) + ?.associate { entry -> + entry + .split(KEY_VALUE_DELIMITER, limit = 2) + .takeIf { it.size == 2 } + ?.let { it[0] to it[1] } ?: ("" to "") + } + ?.toMutableMap() ?: mutableMapOf() + } + + + + + + internal operator fun get(emoji: String): String = stickyVariantMap[emoji] ?: emoji + + internal fun update(baseEmoji: String, variantClicked: String) { + stickyVariantMap.apply { + if (baseEmoji == variantClicked) { + this.remove(baseEmoji) + } else { + this[baseEmoji] = variantClicked + } + sharedPreferences + ?.edit() + ?.putString(STICKY_VARIANT_PROVIDER_KEY, entries.joinToString(ENTRY_DELIMITER)) + ?.commit() + } + } +} diff --git a/emojipicker/src/main/java/androidx/emoji2/emojipicker/utils/FileCache.kt b/emojipicker/src/main/java/androidx/emoji2/emojipicker/utils/FileCache.kt new file mode 100644 index 00000000..b5965d47 --- /dev/null +++ b/emojipicker/src/main/java/androidx/emoji2/emojipicker/utils/FileCache.kt @@ -0,0 +1,150 @@ + + +package com.rishabh.emojipicker.utils + +import android.content.Context +import android.content.pm.PackageManager +import android.os.Build +import android.util.Log +import androidx.annotation.GuardedBy +import androidx.annotation.RequiresApi +import androidx.annotation.VisibleForTesting +import androidx.core.content.ContextCompat +import com.rishabh.emojipicker.BundledEmojiListLoader +import com.rishabh.emojipicker.EmojiViewItem +import java.io.File +import java.io.IOException + +/** + * A class that manages cache files for the emoji picker. All cache files are stored in DE (Device + * Encryption) storage (N+), and will be invalidated if device OS version or App version is updated. + * + * Currently this class is only used by [BundledEmojiListLoader]. All renderable emojis will be + * cached by categories under /app.package.name/cache/emoji_picker/ + * /emoji.... + */ +internal class FileCache(context: Context) { + + @VisibleForTesting @GuardedBy("lock") internal val emojiPickerCacheDir: File + private val currentProperty: String + private val lock = Any() + + init { + val osVersion = "${Build.VERSION.SDK_INT}_${Build.TIME}" + val appVersion = getVersionCode(context) + currentProperty = "$osVersion.$appVersion" + emojiPickerCacheDir = + File(getDeviceProtectedStorageContext(context).cacheDir, EMOJI_PICKER_FOLDER) + if (!emojiPickerCacheDir.exists()) emojiPickerCacheDir.mkdir() + } + + /** Get cache for a given file name, or write to a new file using the [defaultValue] factory. */ + internal fun getOrPut( + key: String, + defaultValue: () -> List + ): List { + synchronized(lock) { + val targetDir = File(emojiPickerCacheDir, currentProperty) + + + // No matching cache folder for current property, clear stale cache directory if any + if (!targetDir.exists()) { + emojiPickerCacheDir.listFiles()?.forEach { it.deleteRecursively() } + targetDir.mkdirs() + } + + val targetFile = File(targetDir, key) + return readFrom(targetFile) ?: writeTo(targetFile, defaultValue) + } + } + + private fun readFrom(targetFile: File): List? { + if (!targetFile.isFile) return null + return targetFile + .bufferedReader() + .useLines { + + it.toList() } + .map { + + it.split(",") } + .map { + + val emoji = it.getOrNull(0) ?: "" + val description = it.getOrNull(1) ?:"" + + + EmojiViewItem(emoji, description,it.drop(2) ) + } + } + + private fun writeTo( + targetFile: File, + defaultValue: () -> List + ): List { + val data = defaultValue.invoke() + if (targetFile.exists()) { + if (!targetFile.delete()) { + Log.wtf(TAG, "Can't delete file: $targetFile") + } + } + if (!targetFile.createNewFile()) { + throw IOException("Can't create file: $targetFile") + } + targetFile.bufferedWriter().use { out -> + for (emoji in data) { + out.write(emoji.emoji) + out.write(",${emoji.description}") + + emoji.variants.forEach { out.write(",$it") } + out.newLine() + } + } + return data + } + + /** Returns a new [context] for accessing device protected storage. */ + private fun getDeviceProtectedStorageContext(context: Context) = + context.takeIf { ContextCompat.isDeviceProtectedStorage(it) } + ?: run { ContextCompat.createDeviceProtectedStorageContext(context) } + ?: context + + /** Gets the version code for a package. */ + @Suppress("DEPRECATION") + private fun getVersionCode(context: Context): Long = + try { + if (Build.VERSION.SDK_INT >= 33) Api33Impl.getAppVersionCode(context) + else if (Build.VERSION.SDK_INT >= 28) Api28Impl.getAppVersionCode(context) + else context.packageManager.getPackageInfo(context.packageName, 0).versionCode.toLong() + } catch (e: PackageManager.NameNotFoundException) { + // Default version to 1 + 1 + } + + companion object { + @Volatile private var instance: FileCache? = null + + internal fun getInstance(context: Context): FileCache = + instance ?: synchronized(this) { instance ?: FileCache(context).also { instance = it } } + + private const val EMOJI_PICKER_FOLDER = "emoji_picker" + private const val TAG = "emojipicker.FileCache" + } + + @RequiresApi(Build.VERSION_CODES.TIRAMISU) + internal object Api33Impl { + fun getAppVersionCode(context: Context) = + context.packageManager + .getPackageInfo(context.packageName, PackageManager.PackageInfoFlags.of(0)) + .longVersionCode + } + + @Suppress("DEPRECATION") + @RequiresApi(Build.VERSION_CODES.P) + internal object Api28Impl { + fun getAppVersionCode(context: Context) = + context.packageManager + .getPackageInfo(context.packageName, /* flags= */ 0) + .longVersionCode + } +} diff --git a/emojipicker/src/main/java/androidx/emoji2/emojipicker/utils/UnicodeRenderableManager.kt b/emojipicker/src/main/java/androidx/emoji2/emojipicker/utils/UnicodeRenderableManager.kt new file mode 100644 index 00000000..e2f14df7 --- /dev/null +++ b/emojipicker/src/main/java/androidx/emoji2/emojipicker/utils/UnicodeRenderableManager.kt @@ -0,0 +1,69 @@ + + +package com.rishabh.emojipicker.utils + +import android.os.Build +import android.text.TextPaint +import androidx.annotation.VisibleForTesting +import androidx.core.graphics.PaintCompat +import com.rishabh.emojipicker.EmojiPickerView +import androidx.emoji2.text.EmojiCompat + +/** Checks renderability of unicode characters. */ +internal object UnicodeRenderableManager { + + private const val VARIATION_SELECTOR = "\uFE0F" + + private const val YAWNING_FACE_EMOJI = "\uD83E\uDD71" + + private val paint = TextPaint() + + /** + * Some emojis were usual (non-emoji) characters. Old devices cannot render them with variation + * selector (U+FE0F) so it's worth trying to check renderability again without variation + * selector. + */ + private val CATEGORY_MOVED_EMOJIS = + listOf( // These three characters have been emoji since Unicode emoji version 4. + // version 3: https://unicode.org/Public/emoji/3.0/emoji-data.txt + // version 4: https://unicode.org/Public/emoji/4.0/emoji-data.txt + "\u2695\uFE0F", // STAFF OF AESCULAPIUS + "\u2640\uFE0F", // FEMALE SIGN + "\u2642\uFE0F", // MALE SIGN + // These three characters have been emoji since Unicode emoji version 11. + // version 5: https://unicode.org/Public/emoji/5.0/emoji-data.txt + // version 11: https://unicode.org/Public/emoji/11.0/emoji-data.txt + "\u265F\uFE0F", // BLACK_CHESS_PAWN + "\u267E\uFE0F" // PERMANENT_PAPER_SIGN + ) + + /** + * For a given emoji, check it's renderability with EmojiCompat if enabled. Otherwise, use + * [PaintCompat#hasGlyph]. + * + * Note: For older API version, codepoints {@code U+0xFE0F} are removed. + */ + internal fun isEmojiRenderable(emoji: String) = + if (EmojiPickerView.emojiCompatLoaded) + EmojiCompat.get().getEmojiMatch(emoji, Int.MAX_VALUE) == EmojiCompat.EMOJI_SUPPORTED + else getClosestRenderable(emoji) != null + + // Yawning face is added in emoji 12 which is the first version starts to support gender + // inclusive emojis. + internal fun isEmoji12Supported() = isEmojiRenderable(YAWNING_FACE_EMOJI) + + @VisibleForTesting + fun getClosestRenderable(emoji: String): String? { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) { + return emoji.replace(VARIATION_SELECTOR, "").takeIfHasGlyph() + } + return emoji.takeIfHasGlyph() + ?: run { + if (CATEGORY_MOVED_EMOJIS.contains(emoji)) + emoji.replace(VARIATION_SELECTOR, "").takeIfHasGlyph() + else null + } + } + + private fun String.takeIfHasGlyph() = takeIf { PaintCompat.hasGlyph(paint, this) } +} diff --git a/emojipicker/src/main/res/anim/slide_down_and_fade_out.xml b/emojipicker/src/main/res/anim/slide_down_and_fade_out.xml new file mode 100644 index 00000000..c25f30dd --- /dev/null +++ b/emojipicker/src/main/res/anim/slide_down_and_fade_out.xml @@ -0,0 +1,17 @@ + + + + + + + + \ No newline at end of file diff --git a/emojipicker/src/main/res/anim/slide_up_and_fade_in.xml b/emojipicker/src/main/res/anim/slide_up_and_fade_in.xml new file mode 100644 index 00000000..618b96e1 --- /dev/null +++ b/emojipicker/src/main/res/anim/slide_up_and_fade_in.xml @@ -0,0 +1,17 @@ + + + + + + + + \ No newline at end of file diff --git a/emojipicker/src/main/res/drawable/couple_heart_men_shadow_skintone.xml b/emojipicker/src/main/res/drawable/couple_heart_men_shadow_skintone.xml new file mode 100644 index 00000000..e480cbf5 --- /dev/null +++ b/emojipicker/src/main/res/drawable/couple_heart_men_shadow_skintone.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/src/main/res/drawable/couple_heart_men_skintone_shadow.xml b/emojipicker/src/main/res/drawable/couple_heart_men_skintone_shadow.xml new file mode 100644 index 00000000..6d54233c --- /dev/null +++ b/emojipicker/src/main/res/drawable/couple_heart_men_skintone_shadow.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/src/main/res/drawable/couple_heart_people_shadow_skintone.xml b/emojipicker/src/main/res/drawable/couple_heart_people_shadow_skintone.xml new file mode 100644 index 00000000..219fb0aa --- /dev/null +++ b/emojipicker/src/main/res/drawable/couple_heart_people_shadow_skintone.xml @@ -0,0 +1,218 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/emojipicker/src/main/res/drawable/couple_heart_people_skintone_shadow.xml b/emojipicker/src/main/res/drawable/couple_heart_people_skintone_shadow.xml new file mode 100644 index 00000000..09e95e56 --- /dev/null +++ b/emojipicker/src/main/res/drawable/couple_heart_people_skintone_shadow.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/src/main/res/drawable/couple_heart_woman_man_shadow_skintone.xml b/emojipicker/src/main/res/drawable/couple_heart_woman_man_shadow_skintone.xml new file mode 100644 index 00000000..1107c60c --- /dev/null +++ b/emojipicker/src/main/res/drawable/couple_heart_woman_man_shadow_skintone.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/src/main/res/drawable/couple_heart_woman_man_skintone_shadow.xml b/emojipicker/src/main/res/drawable/couple_heart_woman_man_skintone_shadow.xml new file mode 100644 index 00000000..1334b677 --- /dev/null +++ b/emojipicker/src/main/res/drawable/couple_heart_woman_man_skintone_shadow.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/src/main/res/drawable/couple_heart_women_shadow_skintone.xml b/emojipicker/src/main/res/drawable/couple_heart_women_shadow_skintone.xml new file mode 100644 index 00000000..4fe76d7d --- /dev/null +++ b/emojipicker/src/main/res/drawable/couple_heart_women_shadow_skintone.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/src/main/res/drawable/couple_heart_women_skintone_shadow.xml b/emojipicker/src/main/res/drawable/couple_heart_women_skintone_shadow.xml new file mode 100644 index 00000000..b8b66009 --- /dev/null +++ b/emojipicker/src/main/res/drawable/couple_heart_women_skintone_shadow.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/src/main/res/drawable/gm_filled_emoji_emotions_vd_theme_24.xml b/emojipicker/src/main/res/drawable/gm_filled_emoji_emotions_vd_theme_24.xml new file mode 100644 index 00000000..cfdbdab5 --- /dev/null +++ b/emojipicker/src/main/res/drawable/gm_filled_emoji_emotions_vd_theme_24.xml @@ -0,0 +1,12 @@ + + + + + diff --git a/emojipicker/src/main/res/drawable/gm_filled_emoji_events_vd_theme_24.xml b/emojipicker/src/main/res/drawable/gm_filled_emoji_events_vd_theme_24.xml new file mode 100644 index 00000000..f588bf36 --- /dev/null +++ b/emojipicker/src/main/res/drawable/gm_filled_emoji_events_vd_theme_24.xml @@ -0,0 +1,12 @@ + + + + + diff --git a/emojipicker/src/main/res/drawable/gm_filled_emoji_food_beverage_vd_theme_24.xml b/emojipicker/src/main/res/drawable/gm_filled_emoji_food_beverage_vd_theme_24.xml new file mode 100644 index 00000000..989d0fab --- /dev/null +++ b/emojipicker/src/main/res/drawable/gm_filled_emoji_food_beverage_vd_theme_24.xml @@ -0,0 +1,15 @@ + + + + + + diff --git a/emojipicker/src/main/res/drawable/gm_filled_emoji_nature_vd_theme_24.xml b/emojipicker/src/main/res/drawable/gm_filled_emoji_nature_vd_theme_24.xml new file mode 100644 index 00000000..c259fba2 --- /dev/null +++ b/emojipicker/src/main/res/drawable/gm_filled_emoji_nature_vd_theme_24.xml @@ -0,0 +1,15 @@ + + + + + + diff --git a/emojipicker/src/main/res/drawable/gm_filled_emoji_objects_vd_theme_24.xml b/emojipicker/src/main/res/drawable/gm_filled_emoji_objects_vd_theme_24.xml new file mode 100644 index 00000000..5e028ac9 --- /dev/null +++ b/emojipicker/src/main/res/drawable/gm_filled_emoji_objects_vd_theme_24.xml @@ -0,0 +1,12 @@ + + + + + diff --git a/emojipicker/src/main/res/drawable/gm_filled_emoji_people_vd_theme_24.xml b/emojipicker/src/main/res/drawable/gm_filled_emoji_people_vd_theme_24.xml new file mode 100644 index 00000000..bd647fe4 --- /dev/null +++ b/emojipicker/src/main/res/drawable/gm_filled_emoji_people_vd_theme_24.xml @@ -0,0 +1,15 @@ + + + + + + \ No newline at end of file diff --git a/emojipicker/src/main/res/drawable/gm_filled_emoji_symbols_vd_theme_24.xml b/emojipicker/src/main/res/drawable/gm_filled_emoji_symbols_vd_theme_24.xml new file mode 100644 index 00000000..571cb545 --- /dev/null +++ b/emojipicker/src/main/res/drawable/gm_filled_emoji_symbols_vd_theme_24.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + diff --git a/emojipicker/src/main/res/drawable/gm_filled_emoji_transportation_vd_theme_24.xml b/emojipicker/src/main/res/drawable/gm_filled_emoji_transportation_vd_theme_24.xml new file mode 100644 index 00000000..99a165e2 --- /dev/null +++ b/emojipicker/src/main/res/drawable/gm_filled_emoji_transportation_vd_theme_24.xml @@ -0,0 +1,27 @@ + + + + + + + + + + diff --git a/emojipicker/src/main/res/drawable/gm_filled_flag_vd_theme_24.xml b/emojipicker/src/main/res/drawable/gm_filled_flag_vd_theme_24.xml new file mode 100644 index 00000000..f3573b8a --- /dev/null +++ b/emojipicker/src/main/res/drawable/gm_filled_flag_vd_theme_24.xml @@ -0,0 +1,12 @@ + + + + + diff --git a/emojipicker/src/main/res/drawable/handshake_shadow_skintone.xml b/emojipicker/src/main/res/drawable/handshake_shadow_skintone.xml new file mode 100644 index 00000000..04259f35 --- /dev/null +++ b/emojipicker/src/main/res/drawable/handshake_shadow_skintone.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/emojipicker/src/main/res/drawable/handshake_skintone_shadow.xml b/emojipicker/src/main/res/drawable/handshake_skintone_shadow.xml new file mode 100644 index 00000000..dfe4f213 --- /dev/null +++ b/emojipicker/src/main/res/drawable/handshake_skintone_shadow.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/emojipicker/src/main/res/drawable/holding_men_shadow_skintone.xml b/emojipicker/src/main/res/drawable/holding_men_shadow_skintone.xml new file mode 100644 index 00000000..4b84e94a --- /dev/null +++ b/emojipicker/src/main/res/drawable/holding_men_shadow_skintone.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/src/main/res/drawable/holding_men_skintone_shadow.xml b/emojipicker/src/main/res/drawable/holding_men_skintone_shadow.xml new file mode 100644 index 00000000..e9def1c6 --- /dev/null +++ b/emojipicker/src/main/res/drawable/holding_men_skintone_shadow.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/src/main/res/drawable/holding_people_shadow_skintone.xml b/emojipicker/src/main/res/drawable/holding_people_shadow_skintone.xml new file mode 100644 index 00000000..ebbd0f4c --- /dev/null +++ b/emojipicker/src/main/res/drawable/holding_people_shadow_skintone.xml @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/src/main/res/drawable/holding_people_skintone_shadow.xml b/emojipicker/src/main/res/drawable/holding_people_skintone_shadow.xml new file mode 100644 index 00000000..039b6207 --- /dev/null +++ b/emojipicker/src/main/res/drawable/holding_people_skintone_shadow.xml @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/src/main/res/drawable/holding_woman_man_shadow_skintone.xml b/emojipicker/src/main/res/drawable/holding_woman_man_shadow_skintone.xml new file mode 100644 index 00000000..a921ec26 --- /dev/null +++ b/emojipicker/src/main/res/drawable/holding_woman_man_shadow_skintone.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/src/main/res/drawable/holding_woman_man_skintone_shadow.xml b/emojipicker/src/main/res/drawable/holding_woman_man_skintone_shadow.xml new file mode 100644 index 00000000..85c33276 --- /dev/null +++ b/emojipicker/src/main/res/drawable/holding_woman_man_skintone_shadow.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/src/main/res/drawable/holding_women_shadow_skintone.xml b/emojipicker/src/main/res/drawable/holding_women_shadow_skintone.xml new file mode 100644 index 00000000..0e918b99 --- /dev/null +++ b/emojipicker/src/main/res/drawable/holding_women_shadow_skintone.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/src/main/res/drawable/holding_women_skintone_shadow.xml b/emojipicker/src/main/res/drawable/holding_women_skintone_shadow.xml new file mode 100644 index 00000000..035cc21e --- /dev/null +++ b/emojipicker/src/main/res/drawable/holding_women_skintone_shadow.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/src/main/res/drawable/icon_tint_selector.xml b/emojipicker/src/main/res/drawable/icon_tint_selector.xml new file mode 100644 index 00000000..50a07511 --- /dev/null +++ b/emojipicker/src/main/res/drawable/icon_tint_selector.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/emojipicker/src/main/res/drawable/kiss_men_shadow_skintone.xml b/emojipicker/src/main/res/drawable/kiss_men_shadow_skintone.xml new file mode 100644 index 00000000..e3df38d5 --- /dev/null +++ b/emojipicker/src/main/res/drawable/kiss_men_shadow_skintone.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/src/main/res/drawable/kiss_men_skintone_shadow.xml b/emojipicker/src/main/res/drawable/kiss_men_skintone_shadow.xml new file mode 100644 index 00000000..2abbd884 --- /dev/null +++ b/emojipicker/src/main/res/drawable/kiss_men_skintone_shadow.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/src/main/res/drawable/kiss_people_shadow_skintone.xml b/emojipicker/src/main/res/drawable/kiss_people_shadow_skintone.xml new file mode 100644 index 00000000..ddaa4839 --- /dev/null +++ b/emojipicker/src/main/res/drawable/kiss_people_shadow_skintone.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/src/main/res/drawable/kiss_people_skintone_shadow.xml b/emojipicker/src/main/res/drawable/kiss_people_skintone_shadow.xml new file mode 100644 index 00000000..f81d8633 --- /dev/null +++ b/emojipicker/src/main/res/drawable/kiss_people_skintone_shadow.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/src/main/res/drawable/kiss_woman_man_shadow_skintone.xml b/emojipicker/src/main/res/drawable/kiss_woman_man_shadow_skintone.xml new file mode 100644 index 00000000..11831237 --- /dev/null +++ b/emojipicker/src/main/res/drawable/kiss_woman_man_shadow_skintone.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/src/main/res/drawable/kiss_woman_man_skintone_shadow.xml b/emojipicker/src/main/res/drawable/kiss_woman_man_skintone_shadow.xml new file mode 100644 index 00000000..5ded1f96 --- /dev/null +++ b/emojipicker/src/main/res/drawable/kiss_woman_man_skintone_shadow.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/src/main/res/drawable/kiss_women_shadow_skintone.xml b/emojipicker/src/main/res/drawable/kiss_women_shadow_skintone.xml new file mode 100644 index 00000000..555d28cd --- /dev/null +++ b/emojipicker/src/main/res/drawable/kiss_women_shadow_skintone.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/src/main/res/drawable/kiss_women_skintone_shadow.xml b/emojipicker/src/main/res/drawable/kiss_women_skintone_shadow.xml new file mode 100644 index 00000000..61d91624 --- /dev/null +++ b/emojipicker/src/main/res/drawable/kiss_women_skintone_shadow.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/src/main/res/drawable/popup_view_rounded_background.xml b/emojipicker/src/main/res/drawable/popup_view_rounded_background.xml new file mode 100644 index 00000000..7ed98b76 --- /dev/null +++ b/emojipicker/src/main/res/drawable/popup_view_rounded_background.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/emojipicker/src/main/res/drawable/quantum_gm_ic_access_time_filled_vd_theme_24.xml b/emojipicker/src/main/res/drawable/quantum_gm_ic_access_time_filled_vd_theme_24.xml new file mode 100644 index 00000000..57e65b17 --- /dev/null +++ b/emojipicker/src/main/res/drawable/quantum_gm_ic_access_time_filled_vd_theme_24.xml @@ -0,0 +1,12 @@ + + + + + diff --git a/emojipicker/src/main/res/drawable/ripple_emoji_view.xml b/emojipicker/src/main/res/drawable/ripple_emoji_view.xml new file mode 100644 index 00000000..9748a72e --- /dev/null +++ b/emojipicker/src/main/res/drawable/ripple_emoji_view.xml @@ -0,0 +1,11 @@ + + + + + + + + + + \ No newline at end of file diff --git a/emojipicker/src/main/res/drawable/ripple_image_view.xml b/emojipicker/src/main/res/drawable/ripple_image_view.xml new file mode 100644 index 00000000..4c0c3a46 --- /dev/null +++ b/emojipicker/src/main/res/drawable/ripple_image_view.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/src/main/res/drawable/swap_horiz_vd_theme_24.xml b/emojipicker/src/main/res/drawable/swap_horiz_vd_theme_24.xml new file mode 100644 index 00000000..e3684d49 --- /dev/null +++ b/emojipicker/src/main/res/drawable/swap_horiz_vd_theme_24.xml @@ -0,0 +1,26 @@ + + + + + diff --git a/emojipicker/src/main/res/drawable/underline_rounded.xml b/emojipicker/src/main/res/drawable/underline_rounded.xml new file mode 100644 index 00000000..6621ad5a --- /dev/null +++ b/emojipicker/src/main/res/drawable/underline_rounded.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/emojipicker/src/main/res/drawable/variant_availability_indicator.xml b/emojipicker/src/main/res/drawable/variant_availability_indicator.xml new file mode 100644 index 00000000..3df2ec1e --- /dev/null +++ b/emojipicker/src/main/res/drawable/variant_availability_indicator.xml @@ -0,0 +1,12 @@ + + + + + \ No newline at end of file diff --git a/emojipicker/src/main/res/layout/category_text_view.xml b/emojipicker/src/main/res/layout/category_text_view.xml new file mode 100644 index 00000000..f1f8ac43 --- /dev/null +++ b/emojipicker/src/main/res/layout/category_text_view.xml @@ -0,0 +1,21 @@ + + + + + + diff --git a/emojipicker/src/main/res/layout/emoji_picker.xml b/emojipicker/src/main/res/layout/emoji_picker.xml new file mode 100644 index 00000000..1cfe7907 --- /dev/null +++ b/emojipicker/src/main/res/layout/emoji_picker.xml @@ -0,0 +1,20 @@ + + + + + + + + diff --git a/emojipicker/src/main/res/layout/emoji_picker_popup_bidirectional.xml b/emojipicker/src/main/res/layout/emoji_picker_popup_bidirectional.xml new file mode 100644 index 00000000..be0c3df7 --- /dev/null +++ b/emojipicker/src/main/res/layout/emoji_picker_popup_bidirectional.xml @@ -0,0 +1,26 @@ + + + diff --git a/emojipicker/src/main/res/layout/emoji_picker_popup_emoji_view.xml b/emojipicker/src/main/res/layout/emoji_picker_popup_emoji_view.xml new file mode 100644 index 00000000..d50dd939 --- /dev/null +++ b/emojipicker/src/main/res/layout/emoji_picker_popup_emoji_view.xml @@ -0,0 +1,32 @@ + + + + + + diff --git a/emojipicker/src/main/res/layout/emoji_picker_popup_image_view.xml b/emojipicker/src/main/res/layout/emoji_picker_popup_image_view.xml new file mode 100644 index 00000000..da10bf12 --- /dev/null +++ b/emojipicker/src/main/res/layout/emoji_picker_popup_image_view.xml @@ -0,0 +1,27 @@ + + + + diff --git a/emojipicker/src/main/res/layout/empty_category_text_view.xml b/emojipicker/src/main/res/layout/empty_category_text_view.xml new file mode 100644 index 00000000..b85ec8fa --- /dev/null +++ b/emojipicker/src/main/res/layout/empty_category_text_view.xml @@ -0,0 +1,11 @@ + + + diff --git a/emojipicker/src/main/res/layout/header_icon_holder.xml b/emojipicker/src/main/res/layout/header_icon_holder.xml new file mode 100644 index 00000000..f74359b6 --- /dev/null +++ b/emojipicker/src/main/res/layout/header_icon_holder.xml @@ -0,0 +1,25 @@ + + + + + + + diff --git a/emojipicker/src/main/res/layout/variant_popup.xml b/emojipicker/src/main/res/layout/variant_popup.xml new file mode 100644 index 00000000..791a98ba --- /dev/null +++ b/emojipicker/src/main/res/layout/variant_popup.xml @@ -0,0 +1,13 @@ + + + + \ No newline at end of file diff --git a/emojipicker/src/main/res/raw/emoji_category_activity.csv b/emojipicker/src/main/res/raw/emoji_category_activity.csv new file mode 100644 index 00000000..512d3ae6 --- /dev/null +++ b/emojipicker/src/main/res/raw/emoji_category_activity.csv @@ -0,0 +1,85 @@ +🎃,jack-o-lantern spooky season halloween vibes trick or treat autumn fall +🎄,Christmas tree christmas vibes holiday season santa festive xmas +🎆,fireworks new years 4th of july celebration lit bang +🎇,sparkler shiny glitter celebration festive light it up +🧨,firecracker explosive dynamite tnt big bang celebrate +✨,sparkles aesthetic glitter magic main character energy slay +🎈,balloon birthday party celebration congrats pop +🎉,party popper lets party celebration congrats good news surprise +🎊,confetti ball party time celebration you won congrats festive +🎋,tanabata tree star festival wish tree japanese festival summer celebration +🎍,pine decoration kadomatsu new year decoration japanese tradition good luck bamboo +🎎,Japanese dolls hinamatsuri doll festival girl's day emperor and empress tradition +🎏,carp streamer koinobori children's day boy's day japanese tradition wind sock +🎐,wind chime summer vibes relaxing zen gentle breeze soothing sound +🎑,moon viewing ceremony tsukimi harvest moon autumn festival full moon japanese tradition +🧧,red envelope lucky money chinese new year gift hóngbāo good fortune +🎀,ribbon coquette aesthetic cute girly bow +🎁,wrapped gift present surprise birthday gift whats in the box unboxing +🎗️,reminder ribbon support awareness cause in memory of solidarity +🎟️,admission tickets get tickets entry pass event access showtime buy now +🎫,ticket movie ticket concert ticket entry pass get in +🎖️,military medal veteran hero honor service military award +🏆,trophy winner champion first place goat W +🏅,sports medal award winner achievement recognition competing +🥇,1st place medal gold medal number one champion winner first place +🥈,2nd place medal silver medal second place runner up almost good job +🥉,3rd place medal bronze medal third place good effort on the podium at least you tried +⚽,soccer ball football world cup FIFA goal futbol +⚾,baseball homerun MLB world series batter up pitch +🥎,softball fastpitch slowpitch softball game underhand diamond +🏀,basketball hoops NBA ballin dunk three pointer +🏐,volleyball beach volleyball spike serve set bump +🏈,american football NFL super bowl touchdown gridiron tailgate +🏉,rugby football scrum try rugby league rugby union oval ball +🎾,tennis Wimbledon US Open serve ace match point +🥏,flying disc frisbee ultimate frisbee disc golf throw catch +🎳,bowling strike spare bowling alley gutter ball turkey +🏏,cricket game wicket howzat batsman bowler ashes +🏑,field hockey stick and ball pitch penalty corner dribble scoop +🏒,ice hockey NHL puck slapshot power play stanley cup +🥍,lacrosse lax cradle shoot check lacrosse stick +🏓,ping pong table tennis paddle rally spin serve +🏸,badminton shuttlecock racket net smash birdie +🥊,boxing glove boxing knockout TKO fight night put em up +🥋,martial arts uniform karate judo taekwondo black belt dojo +🥅,goal net goal score goalkeeper save netted +⛳,flag in hole golf fore hole in one putt PGA tour +⛸️,ice skate figure skating ice rink winter fun gliding axel jump +🎣,fishing pole fishing gone fishing catch of the day angling reel it in +🤿,diving mask scuba diving snorkeling underwater ocean life deep sea +🎽,running shirt marathon track and field jogging 5k run runner +🎿,skis skiing snow day winter sport slopes downhill +🛷,sled sledding snow day winter fun toboggan downhill +🥌,curling stone winter olympics sweep bonspiel on the button hurry hard +🎯,bullseye on target nailed it perfect direct hit goals +🪀,yo-yo trick walk the dog around the world classic toy playtime +🪁,kite go fly a kite windy day up up and away childhood outdoors +🔫,water pistol water gun squirt gun pew pew summer fun play fight +🎱,pool 8 ball billiards pool eight ball trick shot behind the 8 ball +🔮,crystal ball fortune teller magic future mystic what do you see +🪄,magic wand abracadabra magic trick wizard hocus pocus spell +🎮,video game gaming fortnite esports controller gamer life +🕹️,joystick arcade retro gaming old school classic games 80s vibe +🎰,slot machine jackpot vegas gambling casino winner winner +🎲,game die roll the dice chance luck board games D&D +🧩,puzzle piece missing piece fits perfectly brain teaser jigsaw figuring it out +🧸,teddy bear cute wholesome stuffed animal comfort childhood toy +🪅,piñata piñata candy party smash celebration +🪩,mirror ball disco ball party time dance floor groovy studio 54 +🪆,nesting dolls matryoshka russian doll stacking dolls traditional toy secret inside +♠️,spade suit cards poker ace of spades playing cards card game +♥️,heart suit cards love poker playing cards card game +♦️,diamond suit cards riches poker playing cards card game +♣️,club suit cards luck poker playing cards card game +♟️,chess pawn chess strategy checkmate opening move underrated +🃏,joker wild card prankster unpredictable chaos clown +🀄,mahjong red dragon mahjong tile game red dragon strategy chinese game +🎴,flower playing cards hanafuda japanese card game go-stop sakura matching game +🎭,performing arts drama theater kid acting two faced moody +🖼️,framed picture art masterpiece aesthetic picture frame gallery +🎨,artist palette artsy creative painting artist doodle +🧵,thread spilling the tea story time connected timeline plot twist +🪡,sewing needle sewing mending DIY fashion stitching crafty +🧶,yarn knitting crochet cozy vibes crafty DIY +🪢,knot tied up complicated relationship status getting hitched all tied up diff --git a/emojipicker/src/main/res/raw/emoji_category_animals_nature.csv b/emojipicker/src/main/res/raw/emoji_category_animals_nature.csv new file mode 100644 index 00000000..23cb6e8c --- /dev/null +++ b/emojipicker/src/main/res/raw/emoji_category_animals_nature.csv @@ -0,0 +1,152 @@ +🐵,monkey face cheeky monkey silly goofy playful primate +🐒,monkey swinging jungle bananas curious playful animal +🦍,gorilla beast mode strong powerful king kong harambe +🦧,orangutan chill vibes wise ginger ape jungle primate +🐶,dog face doggo good boy pupper what the dog doin woof +🐕,dog mans best friend loyal pet dog lover furbaby +🦮,guide dog helping dog goodest boy hero assistant dog working dog +🐕‍🦺,service dog essential worker support animal hero dog helper companion +🐩,poodle fancy dog fluffy bougie cute pet curly hair +🐺,wolf lone wolf wolfpack alpha fierce howl +🦊,fox sly foxy clever quick what does the fox say +🦝,raccoon trash panda sneaky bandit cute nocturnal +🐱,cat face kitty catto feline meow cat person +🐈,cat chonky cat void cat purrito fluffy pspsps +🐈‍⬛,black cat void spooky season bad luck witchy vibes halloween cat +🦁,lion king main character energy fierce leo leader +🐯,tiger face tiger king fierce stripes powerful wild cat +🐅,tiger big cat jungle predator beautiful endangered +🐆,leopard fast spots safari fierce predator +🐴,horse face neigh yeehaw energy stallion wild horses majestic +🫎,moose majestic antlers Canada vibes big animal forest +🫏,donkey stubborn funny shrek heehaw hard working +🐎,horse horsepower giddy up derby equestrian free spirit +🦄,unicorn magical rare unique fantasy mythical creature +🦓,zebra stripes unique safari different stand out +🦌,deer gentle doe eyes Bambi forest animal graceful +🦬,bison buffalo majestic powerful herd American prairie +🐮,cow face moo farm life cute gentle wholesome +🐂,ox strong taurus hardworking beast of burden powerful +🐃,water buffalo strong powerful farm animal Asia resilient +🐄,cow heffer dairy farm animal countryside grass puppy +🐷,pig face oink piggy cute muddy Peppa +🐖,pig bacon farm truffle hunter smart animal Wilbur +🐗,boar wild pig aggressive tusks forest dweller Pumbaa +🐽,pig nose boop oink snout piggy cute nose +🐏,ram aries headbutt horns mountain animal stubborn +🐑,ewe fluffy sheep counting sheep wool gentle +🐐,goat GOAT greatest of all time legend kidding farm animal +🐪,camel hump day desert thirsty resilient dromedary +🐫,two-hump camel double hump day desert animal bactrian survivor caravan +🦙,llama no drama llama fluffy spitting cute andes +🦒,giraffe tall long neck safari gentle giant graceful +🐘,elephant never forgets gentle giant memory big ears majestic +🦣,mammoth extinct ice age woolly mammoth ancient beast prehistoric +🦏,rhinoceros rhino unicorn rhino endangered powerful horns +🦛,hippopotamus hippo hungry hungry hippo river horse dangerous water animal +🐭,mouse face squeak cheese tiny quiet computer mouse +🐁,mouse little guy lab rat timid small rodent +🐀,rat ratatouille snitch city life smart misunderstood +🐹,hamster hamster wheel cute fluffy tiny pet cheeks +🐰,rabbit face bunny easter bunny hopping cute what's up doc +🐇,rabbit fast fluffy tail Peter Rabbit carrot lover gentle +🐿️,chipmunk nutty fast stripes Alvin cute rodent +🦫,beaver busy beaver dam builder eager beaver buck teeth Canada +🦔,hedgehog sonic spiky cute roll up defensive +🦇,bat batman spooky nocturnal vampire flying mammal +🐻,bear teddy bear bear hug grizzly strong papa bear +🐻‍❄️,polar bear ice bear arctic endangered coca cola bear climate change +🐨,koala sleepy eucalyptus cute chill drop bear +🐼,panda trash panda's cousin lazy bamboo lover cute endangered +🦥,sloth slow mo lazy day chill vibes hanging out sleepy +🦦,otter significant otter playful cute holds hands water animal +🦨,skunk stinky Pepe Le Pew warning stripes smelly defensive +🦘,kangaroo aussie hopping pouch joey down under +🦡,badger badger badger badger don't care persistent fierce honey badger +🐾,paw prints paws pet lover furry friend animal tracks who was here +🦃,turkey thanksgiving gobble gobble cold turkey fowl dinner +🐔,chicken chicken out cluck farm bird poultry what a chicken +🐓,rooster cock-a-doodle-doo wake up call cocky farm alarm proud +🐣,hatching chick new beginnings just hatched baby easter cute +🐤,baby chick cute tweety bird easter small cheep +🐥,front-facing baby chick cute baby adorable little one new life innocent +🐦,bird tweet freedom fly high bird's eye view early bird +🐧,penguin tuxedo bird cute waddle antarctica social +🕊️,dove peace hope love gentle spirit +🦅,eagle freedom Murica majestic predator sharp eyes +🦆,duck quack duck face rubber ducky waddle get down +🦢,swan graceful elegant beautiful swan song loyal +🦉,owl night owl wise hoot who good grades +🦤,dodo extinct dumb goofy gone forever rare +🪶,feather light gentle tickle bird feather writing quill +🦩,flamingo fabulous pink standing on one leg tropical fancy +🦚,peacock show off proud beautiful feathers flexing elegant +🦜,parrot copycat talking bird colorful cracker pirate's friend +🪽,wing fly away freedom angel wings take flight on wings of love +🐦‍⬛,black bird crow raven ominous goth vibes smart bird +🪿,goose honk untitled goose game silly goose chaos aggressive +🐸,frog kermit sipping tea froggy chair it's wednesday my dudes ribbit Pepe +🐊,crocodile alligator see you later alligator dangerous swamp reptile +🐢,turtle slow and steady ninja turtle save the turtles patient shell +🦎,lizard chillin reptile sunbathing gecko camouflage +🐍,snake danger noodle hisss slytherin sneaky backstabber +🐲,dragon face mythical beast powerful legendary fierce fantasy +🐉,dragon game of thrones fantasy powerful creature myth legend +🦕,sauropod long neck dinosaur gentle giant jurassic prehistoric +🦖,T-Rex rawr king of dinosaurs jurassic park fierce tiny arms +🐳,spouting whale whale of a time big ocean majestic save the whales +🐋,whale big spender ocean giant deep blue gentle marine mammal +🐬,dolphin intelligent playful ocean friend squeak flipper +🦭,seal sea doggo cute chonky sea lion balancing act +🐟,fish something's fishy swimming ocean life seafood aquarium +🐠,tropical fish finding nemo colorful reef aquarium exotic +🐡,blowfish pufferfish spiky don't touch defensive poisonous +🦈,shark baby shark dangerous jaws predator ocean king +🐙,octopus multi-tasking hugs tentacles intelligent kraken +🐚,spiral shell beach vibes seashell ocean treasure listen to the ocean pretty +🪸,coral coral reef ocean life endangered colorful underwater garden +🪼,jellyfish floaty sting beautiful but dangerous squishy ocean blob +🐌,snail slow poke taking my time snail mail patient slimy +🦋,butterfly glow up transformation social butterfly delicate beautiful +🐛,bug caterpillar glow up pending creepy crawly insect metamorphosis +🐜,ant hardworking team player tiny but strong picnic pest ant farm +🐝,honeybee bee kind busy bee queen bee save the bees sweet as honey +🪲,beetle buggin out scarab insect creepy crawly exoskeleton +🐞,lady beetle ladybug good luck cute bug garden friend polka dots +🦗,cricket awkward silence chirping lucky cricket insect sound Jiminy Cricket +🪳,cockroach indestructible pest gross survivor roach +🕷️,spider spiderman creepy web slinger eight legs nope +🕸️,spider web caught in a lie spooky halloween decor intricate trap +🦂,scorpion scorpio stinger dangerous desert venomous +🦟,mosquito annoying itchy pest summer nights buzz off +🪰,fly annoying shoo fly pest buzzing fly on the wall +🪱,worm bookworm earworm slimy bait early bird gets the worm +🦠,microbe germs virus going viral bacteria microscopic +💐,bouquet for you romantic gesture flowers congratulations get well soon +🌸,cherry blossom sakura aesthetic spring vibes beautiful Japan +💮,white flower pure elegant simple beauty RIP condolences +🪷,lotus zen spiritual beautiful calm enlightenment +🏵️,rosette award winner prize ribbon fancy decoration +🌹,rose romantic love bachelor beautiful thorns +🥀,wilted flower heartbreak sad dying inside end of an era faded love +🌺,hibiscus tropical vibes hawaii beautiful flower exotic island life +🌻,sunflower happy sunshine good vibes positive energy tall +🌼,blossom spring fresh start cute flowering pretty +🌷,tulip spring time flowers elegant Netherlands colorful +🪻,hyacinth spring fragrant pretty flower purple garden +🌱,seedling new growth baby plant starting small glow up pending eco-friendly +🪴,potted plant plant parent green thumb indoor garden aesthetic decor +🌲,evergreen tree winter christmas tree nature forest pine +🌳,deciduous tree nature outdoors family tree shade seasons changing +🌴,palm tree vacation mode tropical beach vibes summer island life +🌵,cactus prickly survivor desert vibes don't touch resilient +🌾,sheaf of rice carbs harvest staple food fields grain +🌿,herb natural green cooking plant mom calming +☘️,shamrock St. Patrick's Day Ireland lucky three leaf clover green +🍀,four leaf clover good luck lucky charm rare find wishing you luck fortunate +🍁,maple leaf autumn fall vibes Canada crunchy leaves cozy season +🍂,fallen leaf autumn aesthetic cozy season change crispy leaf fall +🍃,leaf fluttering in wind chill vibes relaxing nature gentle breeze go with the flow +🪹,empty nest kids grown up lonely freedom new chapter quiet house +🪺,nest with eggs expecting new beginnings family waiting potential +🍄,mushroom cottagecore trippy fungi super mario magical forest diff --git a/emojipicker/src/main/res/raw/emoji_category_emotions.csv b/emojipicker/src/main/res/raw/emoji_category_emotions.csv new file mode 100644 index 00000000..64ebff50 --- /dev/null +++ b/emojipicker/src/main/res/raw/emoji_category_emotions.csv @@ -0,0 +1,166 @@ +😀,grinning face happy good vibes slay positive cheerful +😃,grinning face with big eyes excited omg so happy big smile joyful +😄,grinning face with smiling eyes beaming so happy lol happy tears gleeful +😁,beaming face with smiling eyes cheese grin happy face joy excited +😆,grinning squinting face lmao hilarious cracking up funny laughing hard +😅,grinning face with sweat phew that was close nervous laugh awkward anxious +🤣,rolling on the floor laughing I'm dead so funny dying ROFL can't stop laughing +😂,face with tears of joy crying laughing LMAO so true hilarious relatable +🙂,slightly smiling face okay sure meh it is what it is passive aggressive +🙃,upside-down face sarcasm oh well this is fine bruh moment ironic +🫠,melting face overwhelmed I'm dying cringe embarrassed it's too much +😉,winking face rizz iykyk heyyy cheeky flirty +😊,smiling face with smiling eyes blushing wholesome cute thank you content +😇,smiling face with halo innocent pure good vibes blessed angelic +🥰,smiling face with hearts in love simping adore you so cute obsessed +😍,smiling face with heart-eyes down bad love this heart eyes crush amazing +🤩,star-struck wow omg mind blown impressed amazing +😘,face blowing a kiss mwah ily sending love for you smooches +😗,kissing face pucker up kiss love affection sweet +☺️,smiling face shy happy pleased sweet bashful +😚,kissing face with closed eyes love you sweet dreams gentle kiss affectionate warm +😙,kissing face with smiling eyes happy kiss sweet wholesome affection lovely +🥲,smiling face with tear happy tears coping this is fine emotional proud but sad +😋,face savoring food yummy delicious bussin' tasty foodie +😛,face with tongue silly goofy joking playful blep +😜,winking face with tongue just kidding crazy wild playful teasing +🤪,zany face goofy weirdo unhinged silly crazy +😝,squinting face with tongue ew yuck gross silly playful +🤑,money-mouth face making bank rich flexing money moves bag secured +🤗,smiling face with open hands hugs support thank you you're welcome care +🤭,face with hand over mouth oops uh oh gossip spill the tea secret +🫢,face with open eyes and hand over mouth no way shocked gasp oh my god wow +🫣,face with peeking eye can't look cringe curious spying peeking +🤫,shushing face secret shhh be quiet don't tell anyone lips sealed +🤔,thinking face sus hmmm let me think side eye pondering +🫡,saluting face yes sir I understand on it respect heard +🤐,zipper-mouth face my lips are sealed no comment I'm not saying anything secretive quiet +🤨,face with raised eyebrow sus really? bombastic side eye doubt the audacity +😐,neutral face mid bruh unimpressed straight face whatever +😑,expressionless face done with this over it annoyed are you serious not amused +😶,face without mouth speechless no words stunned blank at a loss for words +🫥,dotted line face ghosted disappearing introvert invisible fading away +😶‍🌫️,face in clouds head in the clouds daydreaming confused lost spaced out +😏,smirking face sassy flirty I know something smug cheeky +😒,unamused face side eye whatever annoyed bored not impressed +🙄,face with rolling eyes oh brother are you kidding me annoying seriously lame +😬,grimacing face yikes awkward oops cringe nervous +😮‍💨,face exhaling relief phew disappointed sigh tired letting go +🤥,lying face cap liar not true fake news sus +🫨,shaking face shook earthquake vibrating shocked trembling +😌,relieved face phew thank goodness at peace calm satisfied +😔,pensive face sad in my feels thinking disappointed contemplative +😪,sleepy face tired I need a nap sleepyhead exhausted snot bubble +🤤,drooling face bussin' delicious so hot simping thirsty +😴,sleeping face goodnight tired exhausted nap time zzz +😷,face with medical mask sick quarantine stay safe covid mask on +🤒,face with thermometer feeling sick fever unwell under the weather sick day +🤕,face with head-bandage ouch injury bonk headache in pain +🤢,nauseated face I'm gonna be sick gross that's disgusting ew feeling queasy +🤮,face vomiting barfing puking that's sick throwing up disgusted +🤧,sneezing face achoo allergies bless you feeling sick cold +🥵,hot face it's hot thirsty sweating so fine attractive +🥶,cold face freezing it's cold brrr icy shivering +🥴,woozy face drunk tipsy confused dizzy partied too hard +😵,face with crossed-out eyes dead knocked out shocked can't believe it overwhelmed +😵‍💫,face with spiral eyes confused dizzy woah hypnotized mind-boggled +🤯,exploding head mind blown no way I'm shocked that's crazy unbelievable +🤠,cowboy hat face yeehaw howdy country giddy up western +🥳,partying face celebrate let's party happy birthday congrats turn up +🥸,disguised face incognito secret agent hiding anonymous who is that +😎,smiling face with sunglasses cool vibes deal with it slay boss +🤓,nerd face geek smart actually well actually studious +🧐,face with monocle inspecting hmmm let me see fancy sophisticated +😕,confused face huh? I'm confused what do you mean puzzled uncertain +🫤,face with diagonal mouth meh undecided skeptical not sure conflicted +😟,worried face concerned anxious oh no nervous stressed +🙁,slightly frowning face sad bummed disappointed oh well unhappy +☹️,frowning face very sad upset unhappy depressed heartbroken +😮,face with open mouth wow omg shocked surprised no way +😯,hushed face oh really? surprised speechless whoa +😲,astonished face gasp omfg shook can't believe it stunned +😳,flushed face embarrassed blushing shy oops caught +🥺,pleading face pretty please puppy eyes for me? simping don't be mean +🥹,face holding back tears so proud wholesome happy tears emotional the feels +😦,frowning face with open mouth oh no what happened concerned shocked sad dismayed +😧,anguished face devastated heartbroken in pain suffering distraught +😨,fearful face scared yikes oh god terrified anxious +😰,anxious face with sweat nervous stressed out panicking sweating scared +😥,sad but relieved face phew close call that was scary disappointed but okay bittersweet +😢,crying face sad tears heartbroken upset in my feels +😭,loudly crying face crying deadass tears sobbing bawling I can't +😱,face screaming in fear ahhh omg scream terrified horror +😖,confounded face stressed frustrated ugh struggling overwhelmed +😣,persevering face hang in there you can do it struggle is real pushing through determined +😞,disappointed face bummer that sucks let down sad unhappy +😓,downcast face with sweat stressed hard work phew anxious relieved +😩,weary face I'm so tired ugh over it exhausted I can't anymore +😫,tired face so done completely exhausted drained worn out fatigued +🥱,yawning face bored so tired need coffee sleepy uninterested +😤,face with steam from nose angry frustrated so mad triumph hmph +😡,enraged face furious so angry pissed off livid seeing red +😠,angry face mad grumpy annoyed not happy frustrated +🤬,face with symbols on mouth cursing swearing so mad fuming enraged +😈,smiling face with horns villain era naughty mischievous evil plan sassy +👿,angry face with horns evil monster demon time angry devil hating +💀,skull dead dead skull I'm dead LMAO so funny it killed me +☠️,skull and crossbones danger warning toxic pirate deadly +💩,pile of poo crap that's shit messy oops bad situation +🤡,clown face you're a clown fool silly joker cringe +👹,ogre monster demon scary angry folklore +👺,goblin mischief trickster goblin mode angry Japanese monster +👻,ghost ghosting spooky boo disappeared scary +👽,alien weirdo outer space ufo extraterrestrial strange +👾,alien monster retro gaming space invaders pixelated nerd 8-bit +🤖,robot bot AI futuristic cyborg no emotion +😺,grinning cat happy cat kitty meow cute smiling cat +😸,grinning cat with smiling eyes happy kitty cute cat so happy cheerful cat feline friend +😹,cat with tears of joy laughing cat funny cat cat lmao hilarious kitty cat meme +😻,smiling cat with heart-eyes love cat cat crush adore kitty in love with cat cute overload +😼,cat with wry smile sassy cat smirking cat mischievous kitty cat smirk cunning +😽,kissing cat kiss cat kiss mwah kitty love you cat smooches feline affection +🙀,weary cat shocked cat omg cat surprised kitty scared cat what happened +😿,crying cat sad cat poor kitty heartbroken cat tears upset feline +😾,pouting cat angry cat mad kitty grumpy cat annoyed feline hiss +🙈,see-no-evil monkey cringe can't watch awkward embarrassed oops +🙉,hear-no-evil monkey not listening lalala ignoring tune out selective hearing +🙊,speak-no-evil monkey no comment my lips are sealed secret can't say shh +💌,love letter secret admirer confession crush ily note +💘,heart with arrow cupid in love love struck shot through the heart matchmaker +💝,heart with ribbon gift of love for you special someone present surprise +💖,sparkling heart love it adore so cute magical sparkles +💗,growing heart my love for you is growing heart expanding more love bigger love feeling it +💓,beating heart my heart is racing love excitement thump thump butterflies +💞,revolving hearts in love couple goals shipping it me and you love you +💕,two hearts besties love couple together soulmates +💟,heart decoration love cute design heart symbol stylish lovely +❣️,heart exclamation I love this! emphasis for real big love important +💔,broken heart heartbreak sad it's over hurting dumped +❤️‍🔥,heart on fire passionate love on fire so hot intense burning desire +❤️‍🩹,mending heart healing getting over it self care moving on recovery +❤️,red heart love ily classic heart sending love sincere +🩷,pink heart cute love friendship sweet girly soft +🧡,orange heart friendship support warmth good vibes caring +💛,yellow heart best friends friendship happy sunshine platonic love +💚,green heart jealousy friendship eco friendly matcha nature +💙,blue heart trust loyalty sad deep love calm +🩵,light blue heart gentle love calm peaceful sky soft +💜,purple heart bts army love support royalty luxury +🤎,brown heart poc love support chocolate cozy earthy +🖤,black heart goth dark humor edgy sadness mourning +🩶,grey heart neutral calm subtle moody sophisticated +🤍,white heart pure love peace angelic heavenly sincere +💋,kiss mark xoxo lipstick stain smooch sealed with a kiss flirty +💯,hundred points keep it 100 facts no cap for real absolutely +💢,anger symbol angry frustrated annoyed mad pissed +💥,collision bam pow mind blown explosion boom +💫,dizzy woozy seeing stars magical sparkly trippy +💦,sweat droplets thirsty hot working hard nervous splash +💨,dashing away I'm out ghosting leaving got to go zoom +🕳️,hole empty void disappearing act deep thoughts trap +💬,speech balloon text message comment chatting typing talking +👁️‍🗨️,eye in speech bubble I saw that witnessing the tea is hot watching spilling secrets +🗨️,left speech bubble conversation dialogue quote chat speaking +🗯️,right anger bubble shouting angry comment yelling mad ranting +💭,thought balloon thinking daydreaming idea hmmm wondering +💤,ZZZ sleeping tired bored nothing to say asleep goodnight diff --git a/emojipicker/src/main/res/raw/emoji_category_flags.csv b/emojipicker/src/main/res/raw/emoji_category_flags.csv new file mode 100644 index 00000000..1d46e509 --- /dev/null +++ b/emojipicker/src/main/res/raw/emoji_category_flags.csv @@ -0,0 +1,269 @@ +🏁,chequered flag finish line winner race over done checkered flag +🚩,triangular flag red flag warning dealbreaker major yikes nope +🎌,crossed flags Japan Japanese culture challenge versus competition +🏴,black flag rebellion anarchy pirate life goth flag no surrender +🏳️,white flag I surrender giving up truce peace defeated +🏳️‍🌈,rainbow flag gay pride LGBTQ+ gay pride love is love queer +🏳️‍⚧️,transgender flag trans pride protect trans kids trans rights transgender affirmation +🏴‍☠️,pirate flag jolly roger pirate life arrr sea of thieves one piece +🇦🇨,flag: Ascension Island ascencion atlantic island uk territory remote volcanic +🇦🇩,flag: Andorra andorran pyrenees europe microstate skiing +🇦🇪,flag: United Arab Emirates uae dubai abu dhabi middle east luxury +🇦🇫,flag: Afghanistan afghan kabul central asia resilient pashto +🇦🇬,flag: Antigua & Barbuda antiguan barbudan caribbean beach life island vibes +🇦🇮,flag: Anguilla anguillan caribbean beaches luxury travel island getaway +🇦🇱,flag: Albania albanian tirana balkan eagle beautiful nature +🇦🇲,flag: Armenia armenian yerevan caucasus ancient history diaspora +🇦🇴,flag: Angola angolan luanda africa oil portuguese speaking +🇦🇶,flag: Antarctica penguins south pole ice cold research station +🇦🇷,flag: Argentina argentine messi buenos aires tango patagonia +🇦🇸,flag: American Samoa samoan polynesia us territory pacific island tropical +🇦🇹,flag: Austria austrian vienna alps classical music mozart +🇦🇺,flag: Australia aussie down under sydney kangaroos outback +🇦🇼,flag: Aruba aruban caribbean one happy island beaches vacation +🇦🇽,flag: Åland Islands aland finland swedish speaking archipelago baltic sea +🇦🇿,flag: Azerbaijan azerbaijani baku land of fire caucasus oil rich +🇧🇦,flag: Bosnia & Herzegovina bosnian sarajevo balkans history bridges +🇧🇧,flag: Barbados bajan rihanna caribbean beautiful beaches rum +🇧🇩,flag: Bangladesh bangladeshi dhaka south asia bengali textiles +🇧🇪,flag: Belgium belgian brussels waffles chocolate EU headquarters +🇧🇫,flag: Burkina Faso burkinabe ouagadougou west africa sahel mossi +🇧🇬,flag: Bulgaria bulgarian sofia balkans roses cyrillic alphabet +🇧🇭,flag: Bahrain bahraini manama middle east pearl diving island kingdom +🇧🇮,flag: Burundi burundian gitega east africa great lakes coffee +🇧🇯,flag: Benin beninese porto-novo west africa voodoo dahomey +🇧🇱,flag: St. Barthélemy st barts caribbean luxury celebrity hotspot french island +🇧🇲,flag: Bermuda bermudian bermuda triangle pink sand beaches shorts atlantic island +🇧🇳,flag: Brunei bruneian southeast asia oil sultanate borneo wealthy nation +🇧🇴,flag: Bolivia bolivian la paz salt flats andes indigenous culture +🇧🇶,flag: Caribbean Netherlands bonaire sint eustatius saba dutch caribbean special municipality +🇧🇷,flag: Brazil brazilian rio de janeiro carnival soccer amazon rainforest +🇧🇸,flag: Bahamas bahamian nassau caribbean pristine beaches paradise +🇧🇹,flag: Bhutan bhutanese himalayas gross national happiness dragon kingdom peaceful +🇧🇻,flag: Bouvet Island uninhabited subantarctic norwegian territory remote volcanic island +🇧🇼,flag: Botswana botswanan gaborone southern africa safari okavango delta +🇧🇾,flag: Belarus belarusian minsk eastern europe white russia potatoes +🇧🇿,flag: Belize belizean great blue hole central america caribbean coast mayan ruins +🇨🇦,flag: Canada canadian maple syrup hockey poutine eh +🇨🇨,flag: Cocos (Keeling) Islands cocos islands australian territory indian ocean remote atoll tropical paradise +🇨🇩,flag: Congo - Kinshasa congolese drc central africa kinshasa congo river +🇨🇫,flag: Central African Republic car bangui central africa landlocked diverse wildlife +🇨🇬,flag: Congo - Brazzaville congolese brazzaville republic of the congo central africa oil +🇨🇭,flag: Switzerland swiss alps chocolate watches neutrality +🇨🇮,flag: Côte d’Ivoire ivorian ivory coast west africa cocoa abidjan +🇨🇰,flag: Cook Islands cook islander polynesia rarotonga paradise pacific vacation +🇨🇱,flag: Chile chilean santiago andes patagonia long country +🇨🇲,flag: Cameroon cameroonian yaoundé central africa indomitable lions diverse culture +🇨🇳,flag: China chinese beijing great wall manufacturing mandarin +🇨🇴,flag: Colombia colombian bogotá coffee shakira vibrant culture +🇨🇵,flag: Clipperton Island uninhabited pacific french territory remote atoll scientific research +🇨🇷,flag: Costa Rica costa rican pura vida central america ecotourism rainforest +🇨🇺,flag: Cuba cuban havana cigars classic cars salsa +🇨🇻,flag: Cape Verde cape verdean praia atlantic islands african archipelago morna music +🇨🇼,flag: Curaçao curacaoan blue curaçao dutch caribbean colorful architecture beaches +🇨🇽,flag: Christmas Island christmas islander australian territory indian ocean red crabs unique wildlife +🇨🇾,flag: Cyprus cypriot mediterranean island nation halloumi ancient ruins +🇨🇿,flag: Czechia czech prague central europe beer bohemian +🇩🇪,flag: Germany german berlin beer bratwurst autobahn +🇩🇬,flag: Diego Garcia military base indian ocean british territory strategic location restricted access +🇩🇯,flag: Djibouti djiboutian horn of africa red sea strategic port hot climate +🇩🇰,flag: Denmark danish copenhagen hygge vikings lego +🇩🇲,flag: Dominica dominican nature isle caribbean rainforests boiling lake +🇩🇴,flag: Dominican Republic dominican punta cana baseball merengue caribbean vacation +🇩🇿,flag: Algeria algerian algiers north africa sahara desert berber culture +🇪🇦,flag: Ceuta & Melilla spanish exclave north africa mediterranean border spanish territory +🇪🇨,flag: Ecuador ecuadorian quito galapagos islands andes equator +🇪🇪,flag: Estonia estonian tallinn baltic e-residency tech hub +🇪🇬,flag: Egypt egyptian cairo pyramids pharaohs nile river +🇪🇭,flag: Western Sahara sahrawi disputed territory north africa sahara desert polisario front +🇪🇷,flag: Eritrea eritrean asmara horn of africa red sea italian architecture +🇪🇸,flag: Spain spanish madrid barcelona flamenco tapas +🇪🇹,flag: Ethiopia ethiopian addis ababa coffee origin ancient kingdom horn of africa +🇪🇺,flag: European Union eu brussels europe unity euro +🇫🇮,flag: Finland finnish helsinki sauna northern lights happiest country +🇫🇯,flag: Fiji fijian pacific paradise rugby bula tropical islands +🇫🇰,flag: Falkland Islands falklander south atlantic british territory penguins remote +🇫🇲,flag: Micronesia micronesian pacific islands palikir tropical diving +🇫🇴,flag: Faroe Islands faroese north atlantic dramatic landscapes puffins sheep +🇫🇷,flag: France french paris eiffel tower croissants bonjour +🇬🇦,flag: Gabon gabonese libreville central africa rainforests oil producer +🇬🇧,flag: United Kingdom uk british london tea queen +🇬🇩,flag: Grenada grenadian spice isle caribbean nutmeg beautiful beaches +🇬🇪,flag: Georgia georgian tbilisi caucasus wine cradle of wine +🇬🇫,flag: French Guiana guianese south america french territory space center amazon +🇬🇬,flag: Guernsey guernsey channel islands british crown dependency finance coastline +🇬🇭,flag: Ghana ghanaian accra west africa gold coast azonto dance +🇬🇮,flag: Gibraltar gibraltarian the rock british territory monkeys strait of gibraltar +🇬🇱,flag: Greenland greenlandic nuuk arctic icebergs inuit culture +🇬🇲,flag: Gambia gambian banjul west africa smiling coast river gambia +🇬🇳,flag: Guinea guinean conakry west africa bauxite rich resources +🇬🇵,flag: Guadeloupe guadeloupean caribbean french overseas region butterfly island beaches +🇬🇶,flag: Equatorial Guinea equatoguinean malabo central africa oil rich spanish speaking +🇬🇷,flag: Greece greek athens ancient history mythology beautiful islands +🇬🇸,flag: South Georgia & South Sandwich Islands remote south atlantic wildlife haven penguins british territory +🇬🇹,flag: Guatemala guatemalan guatemala city mayan ruins lake atitlan colorful culture +🇬🇺,flag: Guam guamanian us territory pacific where america's day begins chamorro culture +🇬🇼,flag: Guinea-Bissau bissau-guinean west africa cashews portuguese-creole biodiversity +🇬🇾,flag: Guyana guyanese georgetown south america land of many waters kaieteur falls +🇭🇰,flag: Hong Kong SAR China hongkonger dim sum skyline cantonese financial hub +🇭🇲,flag: Heard & McDonald Islands uninhabited antarctic australian territory volcanic remote +🇭🇳,flag: Honduras honduran tegucigalpa central america mayan ruins banana republic +🇭🇷,flag: Croatia croatian zagreb adriatic sea game of thrones beautiful coast +🇭🇹,flag: Haiti haitian port-au-prince caribbean creole resilient nation +🇭🇺,flag: Hungary hungarian budapest goulash danube river paprika +🇮🇨,flag: Canary Islands canarian spanish islands tenerife volcanic landscapes year-round sun +🇮🇩,flag: Indonesia indonesian jakarta bali southeast asia thousands of islands +🇮🇪,flag: Ireland irish dublin st. patrick's day Guinness luck of the irish +🇮🇱,flag: Israel israeli jerusalem tel aviv middle east tech startup nation +🇮🇲,flag: Isle of Man manx british crown dependency tt races cats with no tails celtic +🇮🇳,flag: India indian new delhi bollywood curry taj mahal +🇮🇴,flag: British Indian Ocean Territory chagos archipelago uk territory military base restricted indian ocean +🇮🇶,flag: Iraq iraqi baghdad mesopotamia middle east ancient history +🇮🇷,flag: Iran iranian tehran persia rich history middle east +🇮🇸,flag: Iceland icelandic reykjavik northern lights volcanoes land of fire and ice +🇮🇹,flag: Italy italian rome pizza pasta colosseum +🇯🇪,flag: Jersey jersey channel islands british crown dependency finance jersey cow +🇯🇲,flag: Jamaica jamaican kingston reggae bob marley jerk chicken +🇯🇴,flag: Jordan jordanian amman petra dead sea middle eastern hospitality +🇯🇵,flag: Japan japanese tokyo anime sushi cherry blossoms +🇰🇪,flag: Kenya kenyan nairobi safari marathon runners east africa +🇰🇬,flag: Kyrgyzstan kyrgyz bishkek central asia mountains nomadic culture +🇰🇭,flag: Cambodia cambodian phnom penh angkor wat southeast asia khmer +🇰🇮,flag: Kiribati i-kiribati pacific island nation climate change risk atolls beautiful lagoons +🇰🇲,flag: Comoros comoran moroni indian ocean island nation volcanic islands +🇰🇳,flag: St. Kitts & Nevis kittitian nevisian caribbean two islands one paradise sugar cane history +🇰🇵,flag: North Korea dprk pyongyang supreme leader juche isolated nation +🇰🇷,flag: South Korea korean seoul k-pop kimchi samsung +🇰🇼,flag: Kuwait kuwaiti kuwait city middle east oil rich desert nation +🇰🇾,flag: Cayman Islands caymanian caribbean tax haven beautiful beaches stingray city +🇰🇿,flag: Kazakhstan kazakh nur-sultan central asia largest landlocked country borat +🇱🇦,flag: Laos laotian vientiane southeast asia mekong river laid-back vibe +🇱🇧,flag: Lebanon lebanese beirut middle east amazing food resilient culture +🇱🇨,flag: St. Lucia st lucian castries caribbean pitons honeymoon destination +🇱🇮,flag: Liechtenstein liechtensteiner vaduz alpine microstate wealthy between switzerland and austria +🇱🇰,flag: Sri Lanka sri lankan colombo tea plantations beautiful beaches south asia +🇱🇷,flag: Liberia liberian monrovia west africa first african republic resilient +🇱🇸,flag: Lesotho basotho maseru mountain kingdom landlocked by south africa blankets +🇱🇹,flag: Lithuania lithuanian vilnius baltic basketball amber +🇱🇺,flag: Luxembourg luxembourger europe wealthy small country grand duchy +🇱🇻,flag: Latvia latvian riga baltic beautiful forests art nouveau architecture +🇱🇾,flag: Libya libyan tripoli north africa sahara desert ancient roman ruins +🇲🇦,flag: Morocco moroccan rabat marrakech tagine beautiful riads +🇲🇨,flag: Monaco monégasque monte carlo luxury grand prix principality +🇲🇩,flag: Moldova moldovan chisinau eastern europe wine country landlocked +🇲🇪,flag: Montenegro montenegrin podgorica balkans beautiful coastline mountains +🇲🇫,flag: St. Martin saint martin caribbean dual-nation island french side beaches +🇲🇬,flag: Madagascar malagasy antananarivo lemurs unique wildlife island nation +🇲🇭,flag: Marshall Islands marshallese majuro pacific atolls threatened by sea level rise +🇲🇰,flag: North Macedonia macedonian skopje balkans ancient history lake ohrid +🇲🇱,flag: Mali malian bamako west africa timbuktu dogon country +🇲🇲,flag: Myanmar (Burma) myanma naypyidaw southeast asia pagodas burmese +🇲🇳,flag: Mongolia mongolian ulaanbaatar genghis khan Gobi desert nomadic lifestyle +🇲🇴,flag: Macao SAR China macanese vegas of china egg tarts portuguese influence gambling +🇲🇵,flag: Northern Mariana Islands saipan us commonwealth pacific tropical paradise history +🇲🇶,flag: Martinique martinican caribbean french island mount pelée creole culture +🇲🇷,flag: Mauritania mauritanian nouakchott west africa sahara desert iron ore train +🇲🇸,flag: Montserrat montserratian soufrière hills volcano caribbean emerald isle british territory +🇲🇹,flag: Malta maltese valletta mediterranean knights of malta beautiful architecture +🇲🇺,flag: Mauritius mauritian port louis indian ocean paradise island dodo bird +🇲🇻,flag: Maldives maldivian malé paradise overwater bungalows honeymoon destination +🇲🇼,flag: Malawi malawian lilongwe warm heart of africa lake malawi friendly people +🇲🇽,flag: Mexico mexican mexico city tacos sombreros fiesta +🇲🇾,flag: Malaysia malaysian kuala lumpur petronas towers truly asia diverse culture +🇲🇿,flag: Mozambique mozambican maputo southeast africa beautiful coastline prawns +🇳🇦,flag: Namibia namibian windhoek southern africa Namib desert sand dunes +🇳🇨,flag: New Caledonia new caledonian nouméa french territory pacific nickel rich +🇳🇪,flag: Niger nigerien niamey west africa sahara desert landlocked +🇳🇫,flag: Norfolk Island norfolk islander australian territory pacific history pine trees +🇳🇬,flag: Nigeria nigerian abuja nollywood jollof rice afrobeat +🇳🇮,flag: Nicaragua nicaraguan managua central america lakes and volcanoes gallo pinto +🇳🇱,flag: Netherlands dutch amsterdam tulips windmills canals +🇳🇴,flag: Norway norwegian oslo fjords vikings northern lights +🇳🇵,flag: Nepal nepalese kathmandu mount everest himalayas birthplace of buddha +🇳🇷,flag: Nauru nauruan smallest island nation pacific phosphate mining history remote +🇳🇺,flag: Niue niuean pacific island rock of polynesia small population coral atoll +🇳🇿,flag: New Zealand kiwi aotearoa lord of the rings hobbiton all blacks +🇴🇲,flag: Oman omani muscat middle east beautiful wadis frankincense +🇵🇦,flag: Panama panamanian panama city panama canal central america crossroads of the world +🇵🇪,flag: Peru peruvian lima machu picchu llamas inca empire +🇵🇫,flag: French Polynesia tahiti bora bora pacific paradise overwater bungalows french territory +🇵🇬,flag: Papua New Guinea papua new guinean port moresby diverse cultures birds of paradise remote +🇵🇭,flag: Philippines filipino manila beautiful beaches adobo friendly people +🇵🇰,flag: Pakistan pakistani islamabad south asia rich history beautiful mountains +🇵🇱,flag: Poland polish warsaw pierogi rich history resilient nation +🇵🇲,flag: St. Pierre & Miquelon french territory north america european vibe colorful houses near canada +🇵🇳,flag: Pitcairn Islands pitcairn british territory pacific mutiny on the bounty remote +🇵🇷,flag: Puerto Rico puerto rican san juan bad bunny mofongo us territory +🇵🇸,flag: Palestinian Territories palestinian ramallah middle east free palestine rich culture +🇵🇹,flag: Portugal portuguese lisbon ronaldo pastéis de nata beautiful coast +🇵🇼,flag: Palau palauan pacific rock islands pristine diving jellyfish lake +🇵🇾,flag: Paraguay paraguayan asunción south america tereré landlocked +🇶🇦,flag: Qatar qatari doha middle east world cup 2022 wealthy nation +🇷🇪,flag: Réunion réunionnais french island indian ocean active volcano diverse landscapes +🇷🇴,flag: Romania romanian bucharest dracula transylvania beautiful castles +🇷🇸,flag: Serbia serbian belgrade balkans tesla vibrant nightlife +🇷🇺,flag: Russia russian moscow vodka bears largest country +🇷🇼,flag: Rwanda rwandan kigali land of a thousand hills gorillas remarkable recovery +🇸🇦,flag: Saudi Arabia saudi riyadh mecca oil desert kingdom +🇸🇧,flag: Solomon Islands solomon islander honiara pacific world war ii history diving +🇸🇨,flag: Seychelles seychellois victoria indian ocean paradise beautiful beaches granite islands +🇸🇩,flag: Sudan sudanese khartoum north africa nile river ancient pyramids +🇸🇪,flag: Sweden swedish stockholm ikea ABBA meatballs +🇸🇬,flag: Singapore singaporean garden city amazing food merlion strict laws +🇸🇭,flag: St. Helena st helenian british territory remote atlantic island napoleon's exile airport +🇸🇮,flag: Slovenia slovenian ljubljana beautiful nature lake bled hidden gem of europe +🇸🇯,flag: Svalbard & Jan Mayen svalbard arctic polar bears northernmost town norwegian archipelago +🇸🇰,flag: Slovakia slovak bratislava central europe tatra mountains beautiful castles +🇸🇱,flag: Sierra Leone sierra leonean freetown west africa diamonds resilient people +🇸🇲,flag: San Marino sammarinese oldest republic microstate surrounded by italy mount titano +🇸🇳,flag: Senegal senegalese dakar west africa teranga (hospitality) jollof rice debate +🇸🇴,flag: Somalia somali mogadishu horn of africa resilient coastline +🇸🇷,flag: Suriname surinamese paramaribo south america diverse culture rainforest +🇸🇸,flag: South Sudan south sudanese juba east-central africa newest country rich in oil +🇸🇹,flag: São Tomé & Príncipe são toméan african island nation chocolate coffee paradise +🇸🇻,flag: El Salvador salvadoran san salvador central america pupusas volcanoes +🇸🇽,flag: Sint Maarten sint maarten dutch side caribbean maho beach planes shared island +🇸🇾,flag: Syria syrian damascus middle east ancient civilization resilient people +🇸🇿,flag: Eswatini swazi mbabane southern africa monarchy beautiful landscapes +🇹🇦,flag: Tristan da Cunha most remote inhabited island british territory south atlantic volcano small community +🇹🇨,flag: Turks & Caicos Islands turks and caicos beautiful by nature caribbean luxury travel pristine beaches +🇹🇩,flag: Chad chadian n'djamena central africa sahara desert lake chad +🇹🇫,flag: French Southern Territories uninhabited antarctic french territory scientific research remote +🇹🇬,flag: Togo togolese lomé west africa voodoo market friendly people +🇹🇭,flag: Thailand thai bangkok pad thai beautiful temples land of smiles +🇹🇯,flag: Tajikistan tajik dushanbe central asia pamir mountains persian culture +🇹🇰,flag: Tokelau tokelauan new zealand territory remote atolls pacific solar powered +🇹🇱,flag: Timor-Leste timorese dili southeast asia newest asian country coffee +🇹🇲,flag: Turkmenistan turkmen ashgabat central asia gates of hell neutral country +🇹🇳,flag: Tunisia tunisian tunis north africa star wars filming location beautiful beaches +🇹🇴,flag: Tonga tongan nukuʻalofa friendly islands pacific rugby passion +🇹🇷,flag: Turkey turkish ankara istanbul kebabs turkish delight +🇹🇹,flag: Trinidad & Tobago trinidadian tobagonian caribbean carnival soca music +🇹🇻,flag: Tuvalu tuvaluan funafuti pacific island nation sinking island climate change +🇹🇼,flag: Taiwan taiwanese taipei bubble tea night markets tech powerhouse +🇹🇿,flag: Tanzania tanzanian dodoma serengeti mount kilimanjaro safari +🇺🇦,flag: Ukraine ukrainian kyiv sunflower stand with ukraine brave +🇺🇬,flag: Uganda ugandan kampala pearl of africa gorillas source of the nile +🇺🇲,flag: U.S. Outlying Islands uninhabited pacific islands us territories remote nature reserves +🇺🇳,flag: United Nations un new york geneva peace global cooperation +🇺🇸,flag: United States usa american murica freedom bald eagle +🇺🇾,flag: Uruguay uruguayan montevideo south america mate first world cup winner +🇺🇿,flag: Uzbekistan uzbek tashkent central asia silk road beautiful mosques +🇻🇦,flag: Vatican City vatican smallest country pope holy see rome +🇻🇨,flag: St. Vincent & Grenadines vincy kingstown caribbean beautiful islands sailing +🇻🇪,flag: Venezuela venezuelan caracas south america arepas beautiful nature +🇻🇬,flag: British Virgin Islands bvi road town caribbean sailing capital beautiful beaches +🇻🇮,flag: U.S. Virgin Islands usvi charlotte amalie american caribbean beautiful beaches st croix +🇻🇳,flag: Vietnam vietnamese hanoi pho southeast asia beautiful landscapes +🇻🇺,flag: Vanuatu ni-vanuatu port vila pacific volcanoes bungee jumping origin +🇼🇫,flag: Wallis & Futuna wallisian futunan french territory polynesia remote islands +🇼🇸,flag: Samoa samoan apia polynesia rugby beautiful culture +🇽🇰,flag: Kosovo kosovan pristina balkans newly independent vibrant youth +🇾🇪,flag: Yemen yemeni sana'a middle east ancient history rich culture +🇾🇹,flag: Mayotte mahoran french department indian ocean comoros archipelago lagoon +🇿🇦,flag: South Africa south african pretoria rainbow nation nelson mandela vuvuzela +🇿🇲,flag: Zambia zambian lusaka southern africa victoria falls wildlife safari +🇿🇼,flag: Zimbabwe zimbabwean harare southern africa great zimbabwe victoria falls +🏴󠁧󠁢󠁥󠁮󠁧󠁿,flag: England english london it's coming home tea and crumpets premier league +🏴󠁧󠁢󠁳󠁣󠁴󠁿,flag: Scotland scottish edinburgh highlands bagpipes nessie +🏴󠁧󠁢󠁷󠁬󠁳󠁿,flag: Wales welsh cardiff dragons castles rugby diff --git a/emojipicker/src/main/res/raw/emoji_category_food_drink.csv b/emojipicker/src/main/res/raw/emoji_category_food_drink.csv new file mode 100644 index 00000000..9e010432 --- /dev/null +++ b/emojipicker/src/main/res/raw/emoji_category_food_drink.csv @@ -0,0 +1,133 @@ +🍇,grapes fruit snack juicy healthy eating wine starter pack they did surgery on a grape +🍈,melon honeydew cantaloupe juicy fresh summer fruit +🍉,watermelon watermelon sugar high summer vibes refreshing juicy seedless +🍊,tangerine orange citrus vitamin c juicy sweet +🍋,lemon sour when life gives you lemons zesty citrus refreshing +🍌,banana minions potassium go bananas for scale fruit +🍍,pineapple pineapple on pizza debate tropical Spongebob's house sweet ananas +🥭,mango tropical fruit juicy sweet mango sticky rice exotic +🍎,red apple an apple a day teacher's pet healthy crisp iphone +🍏,green apple sour apple granny smith crispy healthy snack tart +🍐,pear underrated fruit juicy healthy sweet fiber +🍑,peach peachy call me by your name juicy booty sweet +🍒,cherries cherry on top pop the cherry sweet tart fruit twins +🍓,strawberry strawberry fields forever aesthetic cute summer fruit sweet treat +🫐,blueberries antioxidants superfood healthy small but mighty pancakes +🥝,kiwi fruit fuzzy tropical green inside sweet and sour New Zealand +🍅,tomato fruit or vegetable sauce starter ketchup origin rotten tomatoes fresh +🫒,olive olive theory martini mediterranean diet olive oil salty +🥥,coconut coconut girl aesthetic tropical vibes hydrating put the lime in the coconut hard shell +🥑,avocado avo toast basic guac healthy fats brunch vibes +🍆,eggplant sus aubergine vegetable parmesan thicc +🥔,potato couch potato spud tater fries in the making versatile +🥕,carrot what's up doc healthy eyesight crunchy veggie snack good for you +🌽,ear of corn corn kid it has the juice corny summer bbq on the cob +🌶️,hot pepper spicy hot stuff caliente too hot to handle can you take the heat +🫑,bell pepper not spicy crunchy colorful stuffed peppers healthy +🥒,cucumber cool as a cucumber pickles in training spa water refreshing crunchy +🥬,leafy green lettuce kale salad healthy greens eat your veggies +🥦,broccoli little trees healthy eat your greens steamed nutritious +🧄,garlic vampire repellent flavor bomb stinky but good italian cooking essential +🧅,onion makes you cry layers ogres are like onions flavor base aromatic +🥜,peanuts nutty peanut butter allergies goober snack time +🫘,beans spill the beans musical fruit protein legumes what kind +🌰,chestnut roasting on an open fire nutty fall vibes holiday treat hard shell +🫚,ginger root ginger shot spicy healthy tea ingredient flavorful +🫛,pea pod two peas in a pod cute green veggie sweet peas +🍞,bread let's get this bread daily bread carbs toast gluten +🥐,croissant quaso french pastry buttery flaky breakfast goals +🥖,baguette bread oui oui french bread long bread crunchy perfect sandwich +🫓,flatbread naan pita wrap versatile bread dip it +🥨,pretzel salty snack twisted soft pretzel beer garden yum +🥯,bagel everything bagel schmear breakfast new york style carbs +🥞,pancakes stack 'em high syrup breakfast fluffy brunch +🧇,waffle blue waffle leggo my eggo Leslie Knope's favorite syrup pockets crispy +🧀,cheese wedge say cheese cheese pull cheesy charcuterie board tasty +🍖,meat on bone dino food caveman style protein nom nom get in my belly +🍗,poultry leg chicken leg turkey leg drumstick fried chicken finger lickin good +🥩,cut of meat steak night medium rare carnivore protein goals grill marks +🥓,bacon everything's better with bacon crispy sizzle breakfast mmm bacon +🍔,hamburger cheeseburger krabby patty burger time foodie let's eat +🍟,french fries fries before guys salty side dish fast food would you like fries with that +🍕,pizza za pizza night slice slice baby cheese pull pep talk +🌭,hot dog glizzy hot dog water bbq staple fourth of july ballpark food +🥪,sandwich sammie lunch time what's inside subway hoagie +🌮,taco taco tuesday let's taco bout it mexican food crunchy fiesta +🌯,burrito burrito bowl chipotle life food baby wrapped up delicious +🫔,tamale steamed masa holiday food mexican tradition unwrapping goodness +🥙,stuffed flatbread pita pocket gyro kebab mediterranean food delicious filling +🧆,falafel vegetarian chickpeas middle eastern food tasty balls healthy option +🥚,egg eggcellent what came first protein sunny side up scrambled +🍳,cooking this is your brain on drugs let him cook what's cooking in the kitchen frying pan +🥘,shallow pan of food paella family style big meal sharing is caring one pot meal +🍲,pot of food stew soup hot pot comfort food simmering +🫕,fondue cheese dip chocolate fountain sharing retro party dipping fun +🥣,bowl with spoon cereal killer soup's on oatmeal breakfast comfort food +🥗,green salad healthy choice eat your greens side salad fresh dressing on the side +🍿,popcorn movie night spill the tea salty snack crunchy here for the drama +🧈,butter buttery smooth on toast baking essential everything's better with butter fat +🧂,salt salty add flavor seasoning spill the salt too much +🥫,canned food pantry staple andy warhol spam long shelf life emergency food +🍱,bento box cute lunch japanese meal organized food lunch goals variety +🍘,rice cracker senbei japanese snack crunchy light snack savory +🍙,rice ball onigiri jelly filled donut japanese snack portable meal seaweed +🍚,cooked rice staple food asian cuisine steamed perfectly cooked white rice +🍛,curry rice spicy comfort food indian food japanese curry flavorful +🍜,steaming bowl ramen noodles naruto's favorite hot soup slurp +🍝,spaghetti lady and the tramp pasta night italian food moms spaghetti twirl it +🍠,roasted sweet potato healthy carbs fall vibes sweet tasty baked +🍢,oden japanese winter food hot pot skewer comfort food dashi broth variety +🍣,sushi sushi roll raw fish wasabi soy sauce japanese cuisine +🍤,fried shrimp tempura popcorn shrimp seafood crunchy appetizer +🍥,fish cake with swirl naruto ramen topping kamaboko japanese food cute design +🥮,moon cake mid-autumn festival chinese pastry lotus paste sweet holiday treat +🍡,dango japanese sweet mochi on a stick cute dessert sweet dumplings tea time +🥟,dumpling dumpling gang bao dim sum potsticker delicious filling +🥠,fortune cookie wise words dessert unfortunate fortune chinese takeout what's my fortune +🥡,takeout box leftovers chinese food delivery movie night in lazy dinner +🦀,crab crab rave mr krabs crustacean seafood boil beachy +🦞,lobster bougie seafood fancy dinner rock lobster expensive buttery +🦐,shrimp shrimp on the barbie small but tasty seafood cocktail shrimp peel and eat +🦑,squid squidward calamari squid game tentacles ink +🦪,oyster aphrodisiac pearl inside raw bar seafood delicacy slurp +🍦,soft ice cream ice cream cone soft serve summer treat swirl melty +🍧,shaved ice snow cone kakigori refreshing summer dessert colorful syrup +🍨,ice cream sundae scoops dessert we all scream for ice cream sweet treat +🍩,doughnut donut sprinkles glazed coffee's best friend sweet circle +🍪,cookie cookie monster tough cookie baking chocolate chip snack +🎂,birthday cake happy birthday make a wish celebration party time slice of cake +🍰,shortcake piece of cake dessert sweet fancy pastry tea party +🧁,cupcake cute cake mini cake baking frosting sweet treat +🥧,pie sweetie pie cutie pie thanksgiving dessert apple pie slice of heaven +🍫,chocolate bar chocoholic sweet treat candy bar gotta have it break me off a piece +🍬,candy sweet tooth like a kid in a candy store sugar rush treat sweets +🍭,lollipop sweet sucker candy colorful sugar how many licks +🍮,custard flan pudding jiggly dessert sweet creamy +🍯,honey pot winnie the pooh sweetie honey natural sweetener sticky +🍼,baby bottle cry baby newborn milk baby needs infant +🥛,glass of milk got milk calcium strong bones cookies' best friend dairy +☕,hot beverage spill the tea coffee break cozy vibes morning ritual caffeine fix +🫖,teapot tea time I'm a little teapot kermit sipping gossip hot water +🍵,teacup without handle matcha green tea zen calm vibes japanese tea ceremony +🍶,sake japanese rice wine kanpai hot or cold drink up cheers +🍾,bottle with popping cork celebration champagne new years eve pop the bubbly congrats +🍷,wine glass wine mom wine o'clock classy red or white cheers +🍸,cocktail glass martini shaken not stirred happy hour fancy drink cheers +🍹,tropical drink vacation mode piña colada on the beach fruity summer drink +🍺,beer mug cheers cold one happy hour weekend vibes beer o'clock +🍻,clinking beer mugs cheers to that good times with the boys celebrating bottoms up +🥂,clinking glasses cheers celebration toast congratulations fancy +🥃,tumbler glass whiskey on the rocks nightcap strong drink sipping +🫗,pouring liquid pour one out hydrating fill 'er up thirsty splash +🥤,cup with straw soda pop fast food drink slurp refreshment to-go cup +🧋,bubble tea boba tapioca pearls milk tea trendy drink chewy +🧃,beverage box juice box childhood memories capri sun thirst quencher sweet drink +🧉,mate south american tea yerba mate sharing is caring caffeine kick social drink +🧊,ice ice ice baby chill cool down on the rocks frozen water +🥢,chopsticks asian cuisine tricky to use sushi night noodle helper eating utensils +🍽️,fork and knife with plate dinner time let's eat bon appetit cutlery table setting +🍴,fork and knife utensils time to eat foodie restaurant cutlery +🥄,spoon spooning cereal soup scoop utensil +🔪,kitchen knife psycho chef's knife chopping sharp cooking tool +🫙,jar jar of dirt canning preserves storage mason jar +🏺,amphora ancient pottery greek vase historical artifact clay pot museum piece diff --git a/emojipicker/src/main/res/raw/emoji_category_objects.csv b/emojipicker/src/main/res/raw/emoji_category_objects.csv new file mode 100644 index 00000000..b1a95628 --- /dev/null +++ b/emojipicker/src/main/res/raw/emoji_category_objects.csv @@ -0,0 +1,261 @@ +👓,glasses nerd emoji four eyes actually smart geeky +🕶️,sunglasses cool shades deal with it summer vibes slay +🥽,goggles safety first lab drip swimming eye protection science experiment +🥼,lab coat scientist STEM research smart fit chemistry +🦺,safety vest high-vis construction drip safety first workwear be seen +👔,necktie business formal office wear professional boss +👕,t-shirt drip merch outfit casual fit basic tee +👖,jeans denim drip fit check mom jeans y2k fashion +🧣,scarf cozy season fall aesthetic winter vibes accessory warm +🧤,gloves winter fit warm hands cold weather gear no fingerprints mittens +🧥,coat winter is coming outerwear drip jacket cozy +🧦,socks funky socks cozy one is always missing no shoes feet warmers +👗,dress fit check prom dress main character energy slay formal wear +👘,kimono japanese aesthetic traditional wear robe life elegant cultural attire +🥻,sari desi vibes indian wedding bollywood traditional dress elegant +🩱,one-piece swimsuit beach day pool party summer fit hot girl summer swimming +🩲,briefs undies tighty whities underwear basics comfy +🩳,shorts summer uniform leg day short shorts comfy fit casual +👙,bikini hot girl summer beach body tan lines poolside itsy bitsy +👚,woman’s clothes blouse fit check ootd cute top fashion +🪭,folding hand fan shady spilling the tea dramatic flair extra staying cool +👛,purse coin purse essentials small bag cute money holder +👜,handbag designer bag what's in my bag carryall tote fashion accessory +👝,clutch bag evening out fancy no straps essentials only formal bag +🛍️,shopping bags retail therapy shopping haul shopaholic treat yourself new stuff +🎒,backpack school supplies traveling hiking gear student life carry on +🩴,thong sandal flip flops chanclas beach shoes summer footwear casual +👞,man’s shoe dress shoes formal classy business casual leather +👟,running shoe sneakers kicks fresh drip gym shoes comfy +🥾,hiking boot adventure time outdoorsy trail life get outside sturdy +🥿,flat shoe ballet flats comfy shoes no heels casual cute easy on the feet +👠,high-heeled shoe slay queen power move stilettos feeling fancy that girl aesthetic +👡,woman’s sandal summer shoes pedicure ready open toe strappy heeled sandal +🩰,ballet shoes balletcore coquette dancer en pointe graceful +👢,woman’s boot fall fashion cowboy boots thigh highs new boot goofin boots with the fur +🪮,hair pick afro power natural hair care big hair don't care volume black pride +👑,crown queen king main character royalty you dropped this +👒,woman’s hat kentucky derby garden party sun hat extra fancy lady +🎩,top hat classy dapper monopoly man magician old school fancy +🎓,graduation cap graduated class of 2025 finally done on to the next mortarboard +🧢,billed cap no cap baseball hat casual bad hair day hat +🪖,military helmet army soldier combat gear protection veteran +⛑️,rescue worker’s helmet first responder hero safety first help is on the way construction worker +📿,prayer beads spiritual vibes meditation good energy zen manifesting +💄,lipstick makeup tutorial get ready with me pucker up slay beauty guru +💍,ring engaged put a ring on it wedding bling proposal commitment +💎,gem stone diamond hands rich bling bling precious shiny +🔇,muted speaker you're on mute shhh silent mode no volume be quiet +🔈,speaker low volume chill vibes lofi beats keep it down asmr quiet time +🔉,speaker medium volume just right listening sound on normal volume audio +🔊,speaker high volume bass boosted turn up party music loud blasting +📢,loudspeaker announcement PSA attention please listen up public service announcement +📣,megaphone protest activism making a statement shout it out rally +📯,postal horn old timey announcement fanfare historical horn +🔔,bell notification subscribe reminder school's out ding ding ding +🔕,bell with slash notifications off do not disturb unsubscribed silent mode peace and quiet +🎼,musical score sheet music classical music symphony reading music musician +🎵,musical note new track now playing song vibe music +🎶,musical notes jamming out playlist good vibes dancing melody +🎙️,studio microphone podcast recording asmr voiceover broadcasting on air +🎚️,level slider settings adjust volume equalizer fine tuning sound mixing +🎛️,control knobs dj life producer sound board making beats tweaking settings +🎤,microphone karaoke night open mic sing your heart out drop the mic on stage +🎧,headphone noise cancelling listening to music gaming headset podcast time in my own world +📻,radio vintage vibes on the air tuning in old school radio broadcast +🎷,saxophone jazz club smooth jazz sexy sax man blues instrumental +🪗,accordion polka time folk music squeezebox traditional instrument unique sound +🎸,guitar anyway here's wonderwall rockstar acoustic session electric guitar shredding +🎹,musical keyboard piano man making beats synth playing keys musician +🎺,trumpet doot doot brass band fanfare jazz solo loud +🎻,violin world's smallest violin sad music orchestra classical elegant +🪕,banjo country roads folk music bluegrass paddle faster strumming +🥁,drum drumroll please badum tss percussion beat rock out +🪘,long drum congas bongos world music rhythm section percussion +🪇,maracas fiesta shake it latin music rhythm instrument party time +🪈,flute band kid lizzo woodwind piccolo classical +📱,mobile phone scrolling texting on my phone screenager doomscrolling +📲,mobile phone with arrow sending text new phone who dis downloading uploading contact +☎️,telephone landline call me maybe old school phone vintage tech rotary +📞,telephone receiver incoming call answer the phone on hold hotline call center +📟,pager beeper 90s kid old school tech emergency contact doctor on call +📠,fax machine ancient technology office relic dial up sound obsolete send a fax +🔋,battery fully charged 100 percent full of energy ready to go power up +🪫,low battery need a charger running on fumes 1 percent anxiety dying +🔌,electric plug charger power cord need an outlet plug it in electricity +💻,laptop work from home study session coding late night grinding macbook +🖥️,desktop computer gaming rig pc master race command center office setup big screen +🖨️,printer paper jam low on ink printing money office problems hard copy +⌨️,keyboard keyboard warrior mechanical keyboard asmr typing clack clack workstation +🖱️,computer mouse click and drag scrolling gaming mouse right click cursor +🖲️,trackball retro tech ergonomic mouse old school computer alternative mouse ball mouse +💽,computer disk minidisc 90s tech retro storage data disk old media +💾,floppy disk save icon retro tech ancient artifact 3.5 inch old school data +💿,optical disk cd mixtape 2000s throwback burn cd physical media +📀,dvd movie night blockbuster vibes dvd collection bonus features physical media +🧮,abacus ancient calculator old school math counting beads manual math tool +🎥,movie camera filmmaking cinema on set lights camera action director +🎞️,film frames film aesthetic analog vintage footage movie reel 35mm +📽️,film projector classic movie night old hollywood reel to reel cinema history projectionist +🎬,clapper board and action take one movie magic on set filmmaking +📺,television netflix and chill binge watching what's on tv streaming the big screen +📷,camera say cheese photo op capture the moment photographer making memories +📸,camera with flash paparazzi gotcha say cheese flash photography blinding lights +📹,video camera vlogging recording home movie camcorder filming +📼,videocassette vhs tape be kind rewind 90s movies blockbuster retro media +🔍,magnifying glass tilted left zoom in inspecting look closer research details +🔎,magnifying glass tilted right searching investigating spill the tea find it detective mode +🕯️,candle cozy aesthetic romantic vibes scented candle power outage ambiance +💡,light bulb bright idea eureka lightbulb moment genius innovation +🔦,flashlight torch spooky stories power cut in the dark light the way +🏮,red paper lantern lunar new year chinese culture festive decor asian aesthetic celebration +🪔,diya lamp diwali festival of lights indian tradition light over darkness celebration +📔,notebook with decorative cover journaling dear diary cute notebook bullet journal writing things down +📕,closed book the end read it story time's over bookworm library +📖,open book reading studying bookworm chapter one story time +📗,green book guidebook manual how to information reference +📘,blue book facebook study guide information manual learning +📙,orange book novel reading story fiction literature +📚,books booktok library studying knowledge book haul +📓,notebook taking notes journal school work doodling to do list +📒,ledger accounting finances keeping records budgeting making cents +📃,page with curl document reading script turning the page old paper +📜,scroll ancient wisdom declaration historical document old school royal decree +📄,page facing up document file paperwork reading essay +📰,newspaper the tea current events headlines read all about it breaking news +🗞️,rolled-up newspaper good boy fetch old news paper route extra extra +📑,bookmark tabs organized research studyblr color coded important info +🔖,bookmark saving my spot to be continued reading break placeholder book lover +🏷️,label price tag name tag on sale branding identify +💰,money bag secure the bag rich af making bank cash prize big spender +🪙,coin crypto bro spare change make a wish heads or tails money +💴,yen banknote anime money travel to japan foreign currency cash JPY +💵,dollar banknote making it rain cash money get that bread benjamins show me the money +💶,euro banknote traveling to europe foreign currency cash money EUR +💷,pound banknote brexit bucks uk travel british currency quid GBP +💸,money with wings broke where did my money go spending spree bye paycheck impulse buy +💳,credit card adulting tap to pay debt in my plastic era swipe swipe +🧾,receipt cvs receipt proof of purchase tax write off it's long budgeting +💹,chart increasing with yen stonks to the moon investing profit crypto gains +✉️,envelope snail mail you've got mail sending a letter pen pal special delivery +📧,e-mail in my email era per my last email inbox work email digital mail +📨,incoming envelope new message dm slide you've got mail notification inbox +📩,envelope with arrow message sent whoosh yeet delivered sent +📤,outbox tray sending uploading in the queue waiting to send outgoing +📥,inbox tray inbox zero download new mail dms are open you've got mail +📦,package amazon delivery unboxing haul special delivery mail day shein package +📫,closed mailbox with raised flag mail's here check your mail snail mail delivery post has arrived got mail +📪,closed mailbox with lowered flag no mail today empty mail has been collected waiting disappointed +📬,open mailbox with raised flag you've got mail letters incoming check it mail time +📭,open mailbox with lowered flag all empty no letters for me sad times still waiting nothing +📮,postbox sending love mail drop post office snail mail letterbox +🗳️,ballot box with ballot vote election day your voice matters civic duty rock the vote +✏️,pencil artist writer doodling school supplies erasable +✒️,black nib calligraphy fancy writing ink pen vintage quill +🖋️,fountain pen classy writer aesthetic ink sophisticated signature pen +🖊️,pen taking notes signing writer click pen permanent +🖌️,paintbrush artist check painting creative process masterpiece artsy +🖍️,crayon coloring book childhood nostalgia arts and crafts eat the rich marine +📝,memo to do list reminder quick note don't forget study notes +💼,briefcase boss mode work life professional business trip corporate +📁,file folder get organized paperwork work files study materials documents +📂,open file folder looking for files accessing documents research mode browsing data +🗂️,card index dividers super organized color coded filing system tabs data management +📅,calendar save the date scheduling what's the plan appointment event planning +📆,tear-off calendar new day new me daily reminder countdown one day at a time retro calendar +🗒️,spiral notepad note taking journaling to do list spiral bound school +🗓️,spiral calendar planner staying organized appointments schedule deadlines +📇,card index rolodex retro office contact list old school contacts analog data +📈,chart increasing stonks go up to the moon bull market profit good investment +📉,chart decreasing not stonks diamond hands bear market big loss it's going down +📊,bar chart data viz stats analytics presentation business report +📋,clipboard checklist survey getting things done official list to-do +📌,pushpin pinned comment important reminder bulletin board tack note +📍,round pushpin location dropped you are here map marker destination on the map +📎,paperclip attachment office assistant clippy vibes link keep it together +🖇️,linked paperclips teamwork besties ride or die connected strong bond +📏,straight ruler measure up rule follower straight edge inches and cm drawing lines +📐,triangular ruler geometry class math nerd set square angles precision +✂️,scissors snip snip cut toxic people off arts and crafts DIY trim +🗃️,card file box archive old records data storage library science deep dive +🗄️,file cabinet office life bureaucracy paperwork storage classified +🗑️,wastebasket trash delete yeet garbage can throw it away +🔒,locked private account no entry secure access denied locked down +🔓,unlocked public account access granted open welcome free to enter +🔏,locked with pen e-signature secure document signed sealed delivered encrypted official business +🔐,locked with key secret revealed key to success private unlock me escape room +🔑,key major key alert the key is secret to success answer unlock potential +🗝️,old key vintage antique skeleton key secret garden mystery +🔨,hammer getting hammered smash build something fix it tool time +🪓,axe chopping wood lumberjack aesthetic axe to grind breakup sharp +⛏️,pick minecraft mining for diamonds hard work digging deep pickaxe +⚒️,hammer and pick under construction hard labor working man tools crafting +🛠️,hammer and wrench diy project fixing it handyman repairs tool kit +🗡️,dagger backstabber sneaky watch your back assassin sharp +⚔️,crossed swords battle let's fight versus challenge accepted duel +💣,bomb bombshell the bomb dot com truth bomb about to explode fire +🪃,boomerang karma's a boomerang it'll come back to you what goes around aussie throwback +🏹,bow and arrow cupid's arrow hitting the target archery katniss everdeen hawkeye +🛡️,shield protect at all costs defense mode guard up blocking the haters shield wall +🪚,carpentry saw woodworking DIY cutting ties sharp construction +🔧,wrench tool mechanic fix it tighten up adjustable +🪛,screwdriver diy assemble furniture fix it tool kit righty tighty +🔩,nut and bolt the basics hardware teamwork essentials put it together +⚙️,gear settings in the works processing mechanics how it works +🗜️,clamp under pressure holding on tight vice grip secure no escape +⚖️,balance scale justice libra season weighing my options equality karma +🦯,white cane visually impaired blind mobility aid independence guide +🔗,link link in bio connection hyperlink chain stay connected +⛓️,chains feeling trapped no escape heavy edgy aesthetic unbreakable +🪝,hook hooked on a feeling gotcha catchy tune captain hook bait +🧰,toolbox fixer upper diy king handyman all the tools ready to work +🧲,magnet attraction manifesting magnetic personality pulling them in opposites attract +🪜,ladder climbing the ladder of success leveling up social climbing step by step moving up +⚗️,alembic potion making alchemy chemistry class old school science distilling +🧪,test tube science experiment lab results chemistry mad scientist research +🧫,petri dish growing culture biology lab science experiment microbiology +🧬,dna it's in my DNA ancestry genetics life's code heredity +🔬,microscope let's look closer tiny details science lab research biology +🔭,telescope stargazing looking for signs space nerd astronomy discovery +📡,satellite antenna signal communication 5g connecting broadcast +💉,syringe vaxxed and waxed shot girl summer getting the vaccine needle medicine +🩸,drop of blood period problems blood donation bloody true crime vampire vibes +💊,pill take a chill pill red pill or blue pill daily meds vitamin healthcare +🩹,adhesive bandage band-aid healing era boo boo quick fix get well soon +🩼,crutch needing support injury recovering leaning on someone help +🩺,stethoscope doctor's orders listening to your heart med school healthcare worker checkup +🩻,x-ray i see right through you broken bone medical imaging what's inside skeleton +🚪,door new opportunities exit strategy choose your path close the door entrance +🛗,elevator going up level up lift stuck moving on up +🪞,mirror mirror selfie self reflection check yourself aesthetic looking good +🪟,window window of opportunity daydreaming view letting light in perspective +🛏️,bed i'd rather be in bed sleepyhead cozy vibes sweet dreams nap time +🛋️,couch and lamp netflix and chill movie night lazy day living room vibes comfy +🪑,chair take a seat waiting room musical chairs the hot seat spill the tea +🚽,toilet porcelain throne bathroom break nature calls gotta go restroom +🪠,plunger in a sticky situation help clogged bathroom emergency problem solver +🚿,shower shower thoughts rinse off the drama singing in the shower get clean refresh +🛁,bathtub self care sunday bath bomb bubble bath relax and unwind spa night +🪤,mouse trap it's a trap gotcha bait and switch tricked cat and mouse game +🪒,razor close shave that was close smooth clean cut self care +🧴,lotion bottle skincare routine moisturize self care smooth skin beauty product +🧷,safety pin holding it together by a thread punk aesthetic diy fashion quick fix secure +🧹,broom clean sweep sweeping the competition witchy vibes clean up your act chores +🧺,basket laundry day picnic aesthetic don't put all your eggs in one storage cute +🧻,roll of paper toilet paper the great shortage of 2020 essentials tp bathroom +🪣,bucket bucket list kick the bucket chore time fill it up water bucket challenge +🧼,soap wash your hands clean freak drop the soap stay clean fresh +🫧,bubbles bubbly personality cute aesthetic pop carefree fun +🪥,toothbrush dental hygiene morning routine fresh breath smile care brush up +🧽,sponge spongebob squarepants absorbent soaking it all in cleaning day porous +🧯,fire extinguisher put out the fire emergency too hot to handle safety first problem solver +🛒,shopping cart add to cart retail therapy grocery run pushing through consumerism +🚬,cigarette depressed smoking bad habit stressed out unhealthy nicotine fix +⚰️,coffin dead inside i'm dying rip me game over funeral +🪦,headstone rip graveyard shift spooky season in loving memory gone too soon +⚱️,funeral urn ashes to ashes cremation memorial in remembrance final resting place +🧿,nazar amulet evil eye protection good vibes only ward off negativity turkish eye amulet +🪬,hamsa protection from evil good fortune hand of fatima spiritual symbol blessing +🗿,moai sigma face chad no emotion stoic bruh +🪧,placard protest sign make a statement rally picket line activism +🪪,identification card id drivers license let me see some id 21 identity diff --git a/emojipicker/src/main/res/raw/emoji_category_people.csv b/emojipicker/src/main/res/raw/emoji_category_people.csv new file mode 100644 index 00000000..e2ff4dd2 --- /dev/null +++ b/emojipicker/src/main/res/raw/emoji_category_people.csv @@ -0,0 +1,317 @@ +👋,waving hand hello slap hey what's up yo bye slapping,👋🏻,👋🏻,👋🏼,👋🏻,👋🏼,👋🏽,👋🏻,👋🏼,👋🏽,👋🏾,👋🏻,👋🏼,👋🏽,👋🏾,👋🏿 +🤚,raised back of hand talk to the hand stop high five hold up wait,🤚🏻,🤚🏻,🤚🏼,🤚🏻,🤚🏼,🤚🏽,🤚🏻,🤚🏼,🤚🏽,🤚🏾,🤚🏻,🤚🏼,🤚🏽,🤚🏾,🤚🏿 +🖐️,hand with fingers splayed high five stop talk to the hand five fingers wait,🖐🏻,🖐🏻,🖐🏼,🖐🏻,🖐🏼,🖐🏽,🖐🏻,🖐🏼,🖐🏽,🖐🏾,🖐🏻,🖐🏼,🖐🏽,🖐🏾,🖐🏿 +✋,raised hand high five stop talk to the hand ask a question volunteer,✋🏻,✋🏻,✋🏼,✋🏻,✋🏼,✋🏽,✋🏻,✋🏼,✋🏽,✋🏾,✋🏻,✋🏼,✋🏽,🤚🏾,🤚🏿 +🖖,vulcan salute live long and prosper spock star trek nerd sci-fi,🖖🏻,🖖🏻,🖖🏼,🖖🏻,🖖🏼,🖖🏽,🖖🏻,🖖🏼,🖖🏽,🖖🏾,🖖🏻,🖖🏼,🖖🏽,🖖🏾,🖖🏿 +🫱,rightwards hand here you go let's shake on it deal pass it reaching out,🫱🏻,🫱🏻,🫱🏼,🫱🏻,🫱🏼,🫱🏽,🫱🏻,🫱🏼,🫱🏽,🫱🏾,🫱🏻,🫱🏼,🫱🏽,🫱🏾,🫱🏿 +🫲,leftwards hand take it come here gimme reaching left hand,🫲🏻,🫲🏻,🫲🏼,🫲🏻,🫲🏼,🫲🏽,🫲🏻,🫲🏼,🫲🏽,🫲🏾,🫲🏻,🫲🏼,🫲🏽,🫲🏾,🫲🏿 +🫳,palm down hand drop it let it go smack down oops clumsy,🫳🏻,🫳🏻,🫳🏼,🫳🏻,🫳🏼,🫳🏽,🫳🏻,🫳🏼,🫳🏽,🫳🏾,🫳🏻,🫳🏼,🫳🏽,🫳🏾,🫳🏿 +🫴,palm up hand gimme what receiving can I have palm up,🫴🏻,🫴🏻,🫴🏼,🫴🏻,🫴🏼,🫴🏽,🫴🏻,🫴🏼,🫴🏽,🫴🏾,🫴🏻,🫴🏼,🫴🏽,🫴🏾,🫴🏿 +🫷,leftwards pushing hand push back get away leave me alone not today boundaries,🫷🏻,🫷🏻,🫷🏼,🫷🏻,🫷🏼,🫷🏽,🫷🏻,🫷🏼,🫷🏽,🫷🏾,🫷🏻,🫷🏼,🫷🏽,🫷🏾,🫷🏿 +🫸,rightwards pushing hand pushing forward move it let's go onward force,🫸🏻,🫸🏻,🫸🏼,🫸🏻,🫸🏼,🫸🏽,🫸🏻,🫸🏼,🫸🏽,🫸🏾,🫸🏻,🫸🏼,🫸🏽,🫸🏾,🫸🏿 +👌,OK hand best bet perfect chef's kiss A-OK no notes,👌🏻,👌🏻,👌🏼,👌🏻,👌🏼,👌🏽,👌🏻,👌🏼,👌🏽,👌🏾,👌🏻,👌🏼,👌🏽,👌🏾,👌🏿 +🤌,pinched fingers quality italian gesture what do you want capiche perfection mamma mia,🤌🏻,🤌🏻,🤌🏼,🤌🏻,🤌🏼,🤌🏽,🤌🏻,🤌🏼,🤌🏽,🤌🏾,🤌🏻,🤌🏼,🤌🏽,🤌🏾,🤌🏿 +🤏,pinching hand just a little bit smol tiny so close a pinch,🤏🏻,🤏🏻,🤏🏼,🤏🏻,🤏🏼,🤏🏽,🤏🏻,🤏🏼,🤏🏽,🤏🏾,🤏🏻,🤏🏼,🤏🏽,🤏🏾,🤏🏿 +✌️,victory hand peace out deuces good vibes we out victory,✌🏻,✌🏻,✌🏼,✌🏻,✌🏼,✌🏽,✌🏻,✌🏼,✌🏽,✌🏾,✌🏻,✌🏼,✌🏽,✌🏾,✌🏿 +🤞,crossed fingers fingers crossed manifesting good luck hope so please,🤞🏻,🤞🏻,🤞🏼,🤞🏻,🤞🏼,🤞🏽,🤞🏻,🤞🏼,🤞🏽,🤞🏾,🤞🏻,🤞🏼,🤞🏽,🤞🏾,🤞🏿 +🫰,hand with index finger and thumb crossed finger heart k-pop saranghae love money,🫰🏻,🫰🏻,🫰🏼,🫰🏻,🫰🏼,🫰🏽,🫰🏻,🫰🏼,🫰🏽,🫰🏾,🫰🏻,🫰🏼,🫰🏽,🫰🏾,🫰🏿 +🤟,love-you gesture i love you ily rock on asl love gesture,🤟🏻,🤟🏻,🤟🏼,🤟🏻,🤟🏼,🤟🏽,🤟🏻,🤟🏼,🤟🏽,🤟🏾,🤟🏻,🤟🏼,🤟🏽,🤟🏾,🤟🏿 +🤘,sign of the horns rock on metal slay party hard heck yeah,🤘🏻,🤘🏻,🤘🏼,🤘🏻,🤘🏼,🤘🏽,🤘🏻,🤘🏼,🤘🏽,🤘🏾,🤘🏻,🤘🏼,🤘🏽,🤘🏾,🤘🏿 +🤙,call me hand shaka hang loose call me sup rad,🤙🏻,🤙🏻,🤙🏼,🤙🏻,🤙🏼,🤙🏽,🤙🏻,🤙🏼,🤙🏽,🤙🏾,🤙🏻,🤙🏼,🤙🏽,🤙🏾,🤙🏿 +👈,backhand index pointing left this look left check it out facts i'm with them,👈🏻,👈🏻,👈🏼,👈🏻,👈🏼,👈🏽,👈🏻,👈🏼,👈🏽,👈🏾,👈🏻,👈🏼,👈🏽,👈🏾,👈🏿 +👉,backhand index pointing right this look right check it out facts them,👉🏻,👉🏻,👉🏼,👉🏻,👉🏼,👉🏽,👉🏻,👉🏼,👉🏽,👉🏾,👉🏻,👉🏼,👉🏽,👉🏾,👉🏿 +👆,backhand index pointing up this i agree preach what they said scroll up,👆🏻,👆🏻,👆🏼,👆🏻,👆🏼,👆🏽,👆🏻,👆🏼,👆🏽,👆🏾,👆🏻,👆🏼,👆🏽,👆🏾,👆🏿 +🖕,middle finger fuck off bird flip off eff you leave me alone idgaf,🖕🏻,🖕🏻,🖕🏼,🖕🏻,🖕🏼,🖕🏽,🖕🏻,🖕🏼,🖕🏽,🖕🏾,🖕🏻,🖕🏼,🖕🏽,🖕🏾,🖕🏿 +👇,backhand index pointing down this scroll down link in bio the tea see below,👇🏻,👇🏻,👇🏼,👇🏻,👇🏼,👇🏽,👇🏻,👇🏼,👇🏽,👇🏾,👇🏻,👇🏼,👇🏽,👇🏾,👇🏿 +☝️,index pointing up number one i have a point actually hold on one sec,☝🏻,☝🏻,☝🏼,☝🏻,☝🏼,☝🏽,☝🏻,☝🏼,☝🏽,☝🏾,☝🏻,☝🏼,☝🏽,☝🏾,☝🏿 +🫵,index pointing at the viewer you you no you i choose you uno reverse get real,🫵🏻,🫵🏻,🫵🏼,🫵🏻,🫵🏼,🫵🏽,🫵🏻,🫵🏼,🫵🏽,🫵🏾,🫵🏻,🫵🏼,🫵🏽,🫵🏾,🫵🏿 +👍,thumbs up all the best bet sounds good cool for sure like,👍🏻,👍🏻,👍🏼,👍🏻,👍🏼,👍🏽,👍🏻,👍🏼,👍🏽,👍🏾,👍🏻,👍🏼,👍🏽,👍🏾,👍🏿 +👎,thumbs down nah hard pass dislike lame boo,👎🏻,👎🏻,👎🏼,👎🏻,👎🏼,👎🏽,👎🏻,👎🏼,👎🏽,👎🏾,👎🏻,👎🏼,👎🏽,👎🏾,👎🏿 +✊,raised fist solidarity power BLM resist protest,✊🏻,✊🏻,✊🏼,✊🏻,✊🏼,✊🏽,✊🏻,✊🏼,✊🏽,✊🏾,✊🏻,✊🏼,✊🏽,✊🏾,✊🏿 +👊,oncoming fist fist bump bro fist respect let's go pound it,👊🏻,👊🏻,👊🏼,👊🏻,👊🏼,👊🏽,👊🏻,👊🏼,👊🏽,👊🏾,👊🏻,👊🏼,👊🏽,👊🏾,👊🏿 +🤛,left-facing fist fist bump left punch coming at ya combo respect,🤛🏻,🤛🏻,🤛🏼,🤛🏻,🤛🏼,🤛🏽,🤛🏻,🤛🏼,🤛🏽,🤛🏾,🤛🏻,🤛🏼,🤛🏽,🤛🏾,🤛🏿 +🤜,right-facing fist fist bump right punch let's do this respect teamwork,🤜🏻,🤜🏻,🤜🏼,🤜🏻,🤜🏼,🤜🏽,🤜🏻,🤜🏼,🤜🏽,🤜🏾,🤜🏻,🤜🏼,🤜🏽,🤜🏾,🤜🏿 +👏,clapping hands periodt slay round of applause facts yass,👏🏻,👏🏻,👏🏼,👏🏻,👏🏼,👏🏽,👏🏻,👏🏼,👏🏽,👏🏾,👏🏻,👏🏼,👏🏽,👏🏾,👏🏿 +🙌,raising hands praise blessed celebrate hallelujah we made it,🙌🏻,🙌🏻,🙌🏼,🙌🏻,🙌🏼,🙌🏽,🙌🏻,🙌🏼,🙌🏽,🙌🏾,🙌🏻,🙌🏼,🙌🏽,🙌🏾,🙌🏿 +🫶,heart hands love this support wholesome my heart thank you,🫶🏻,🫶🏻,🫶🏼,🫶🏻,🫶🏼,🫶🏽,🫶🏻,🫶🏼,🫶🏽,🫶🏾,🫶🏻,🫶🏼,🫶🏽,🫶🏾,🫶🏿 +👐,open hands jazz hands it is what it is whatever open arms hugs,👐🏻,👐🏻,👐🏼,👐🏻,👐🏼,👐🏽,👐🏻,👐🏼,👐🏽,👐🏾,👐🏻,👐🏼,👐🏽,👐🏾,👐🏿 +🤲,palms up together praying receiving blessings dua give charity,🤲🏻,🤲🏻,🤲🏼,🤲🏻,🤲🏼,🤲🏽,🤲🏻,🤲🏼,🤲🏽,🤲🏾,🤲🏻,🤲🏼,🤲🏽,🤲🏾,🤲🏿 +🤝,handshake deal agreement shook on it let's work together respect,🤝🏻,🤝🏻,🤝🏼,🤝🏻,🤝🏼,🤝🏽,🤝🏻,🤝🏼,🤝🏽,🤝🏾 +🙏,folded hands praying manifesting please thank you namaste,🙏🏻,🙏🏻,🙏🏼,🙏🏻,🙏🏼,🙏🏽,🙏🏻,🙏🏼,🙏🏽,🙏🏾,🙏🏻,🙏🏼,🙏🏽,🙏🏾,🙏🏿 +✍️,writing hand taking notes writing this down dear diary studyblr facts,✍🏻,✍🏻,✍🏼,✍🏻,✍🏼,✍🏽,✍🏻,✍🏼,✍🏽,✍🏾,✍🏻,✍🏼,✍🏽,✍🏾,✍🏿 +💅,nail polish slay sassy feeling myself drama spilling the tea,💅🏻,💅🏻,💅🏼,💅🏻,💅🏼,💅🏽,💅🏻,💅🏼,💅🏽,💅🏾,💅🏻,💅🏼,💅🏽,💅🏾,💅🏿 +🤳,selfie selfie time feeling cute golden hour but first a selfie main character,🤳🏻,🤳🏻,🤳🏼,🤳🏻,🤳🏼,🤳🏽,🤳🏻,🤳🏼,🤳🏽,🤳🏾,🤳🏻,🤳🏼,🤳🏽,🤳🏾,🤳🏿 +💪,flexed biceps strong gym rat gains no pain no gain power,💪🏻,💪🏻,💪🏼,💪🏻,💪🏼,💪🏽,💪🏻,💪🏼,💪🏽,💪🏾,💪🏻,💪🏼,💪🏽,💪🏾,💪🏿 +🦾,mechanical arm cyborg arm bionic winter soldier future tech upgrade +🦿,mechanical leg cyborg leg bionic upgrade future tech fast +🦵,leg leg day thicc serving legs kicks don't skip,🦵🏻,🦵🏻,🦵🏼,🦵🏻,🦵🏼,🦵🏽,🦵🏻,🦵🏼,🦵🏽,🦵🏾,🦵🏻,🦵🏼,🦵🏽,🦵🏾,🦵🏿 +🦶,foot for free? feet pics down bad footsies grounded,🦶🏻,🦶🏻,🦶🏼,🦶🏻,🦶🏼,🦶🏽,🦶🏻,🦶🏼,🦶🏽,🦶🏾,🦶🏻,🦶🏼,🦶🏽,🦶🏾,🦶🏿 +👂,ear i'm listening spill the tea all ears eavesdropping say what,👂🏻,👂🏻,👂🏼,👂🏻,👂🏼,👂🏽,👂🏻,👂🏼,👂🏽,👂🏾,👂🏻,👂🏼,👂🏽,👂🏾,👂🏿 +🦻,ear with hearing aid hard of hearing what? accessibility louder please hearing aid,🦻🏻,🦻🏻,🦻🏼,🦻🏻,🦻🏼,🦻🏽,🦻🏻,🦻🏼,🦻🏽,🦻🏾,🦻🏻,🦻🏼,🦻🏽,🦻🏾,🦻🏿 +👃,nose that smells nosy stinky something fishy sniffing,👃🏻,👃🏻,👃🏼,👃🏻,👃🏼,👃🏽,👃🏻,👃🏼,👃🏽,👃🏾,👃🏻,👃🏼,👃🏽,👃🏾,👃🏿 +🧠,brain big brain move galaxy brain smart af mind blown 5head +🫀,anatomical heart my heart literally love biology beating fast +🫁,lungs breathe take a breath anxious calm down biology +🦷,tooth smile pearly whites braces dental toothy grin +🦴,bone spooky bare bones anatomy skeleton crew no meat +👀,eyes look watching lurking the tea spill it i see you +👁️,eye illuminati confirmed third eye open judging you i'm watching side eye +👅,tongue taste silly goofy tastes good licking blep +👄,mouth speak gossip spill the tea juicy say less lips are sealed +🫦,biting lip horny rizz god down bad flirty tempting seductive +👶,baby baby face smol newbie innocent cute,👶🏻,👶🏻,👶🏼,👶🏻,👶🏼,👶🏽,👶🏻,👶🏼,👶🏽,👶🏾,👶🏻,👶🏼,👶🏽,👶🏾,👶🏿 +🧒,child kiddo little one youngster childish playtime,🧒🏻,🧒🏻,🧒🏼,🧒🏻,🧒🏼,🧒🏽,🧒🏻,🧒🏼,🧒🏽,🧒🏾,🧒🏻,🧒🏼,🧒🏽,🧒🏾,🧒🏿 +👦,boy little dude bro young king boyish he,👦🏻,👦🏻,👦🏼,👦🏻,👦🏼,👦🏽,👦🏻,👦🏼,👦🏽,👦🏾,👦🏻,👦🏼,👦🏽,👦🏾,👦🏿 +👧,girl little queen sis girly cutie she,👧🏻,👧🏻,👧🏼,👧🏻,👧🏼,👧🏽,👧🏻,👧🏼,👧🏽,👧🏾,👧🏻,👧🏼,👧🏽,👧🏾,👧🏿 +🧑,person person they/them individual human just vibing,🧑🏻,🧑🏻,🧑🏼,🧑🏻,🧑🏼,🧑🏽,🧑🏻,🧑🏼,🧑🏽,🧑🏾,🧑🏻,🧑🏼,🧑🏽,🧑🏾,🧑🏿 +👨,man man dude bro sir he/him,👨🏻,👨🏻,👨🏼,👨🏻,👨🏼,👨🏽,👨🏻,👨🏼,👨🏽,👨🏾,👨🏻,👨🏼,👨🏽,👨🏾,👨🏿 +👩,woman woman queen sis girlboss she/her,👩🏻,👩🏻,👩🏼,👩🏻,👩🏼,👩🏽,👩🏻,👩🏼,👩🏽,👩🏾,👩🏻,👩🏼,👩🏽,👩🏾,👩🏿 +🧔,person: beard the grind hustle work mode making that bread career goals,🧔🏻,🧔🏻,🧔🏼,🧔🏻,🧔🏼,🧔🏽,🧔🏻,🧔🏼,🧔🏽,🧔🏾,🧔🏻,🧔🏼,🧔🏽,🧔🏾,🧔🏿 +🧔‍♂️,man: beard the grind hustle work mode making that bread career goals,🧔🏻‍♂️,🧔🏻‍♂️,🧔🏼‍♂️,🧔🏻‍♂️,🧔🏼‍♂️,🧔🏽‍♂️,🧔🏻‍♂️,🧔🏼‍♂️,🧔🏽‍♂️,🧔🏾‍♂️,🧔🏻‍♂️,🧔🏼‍♂️,🧔🏽‍♂️,🧔🏾‍♂️,🧔🏿‍♂️ +🧔‍♀️,woman: beard the grind hustle work mode making that bread career goals,🧔🏻‍♀️,🧔🏻‍♀️,🧔🏼‍♀️,🧔🏻‍♀️,🧔🏼‍♀️,🧔🏽‍♀️,🧔🏻‍♀️,🧔🏼‍♀️,🧔🏽‍♀️,🧔🏾‍♀️,🧔🏻‍♀️,🧔🏼‍♀️,🧔🏽‍♀️,🧔🏾‍♀️,🧔🏿‍♀️ +🧓,older person boomer ok boomer elder old school wise,🧓🏻,🧓🏻,🧓🏼,🧓🏻,🧓🏼,🧓🏽,🧓🏻,🧓🏼,🧓🏽,🧓🏾,🧓🏻,🧓🏼,🧓🏽,🧓🏾,🧓🏿 +👴,old man grandpa old man boomer vibes zaddy old timer,👴🏻,👴🏻,👴🏼,👴🏻,👴🏼,👴🏽,👴🏻,👴🏼,👴🏽,👴🏾,👴🏻,👴🏼,👴🏽,👴🏾,👴🏿 +👵,old woman grandma nana old lady gilf golden girl,👵🏻,👵🏻,👵🏼,👵🏻,👵🏼,👵🏽,👵🏻,👵🏼,👵🏽,👵🏾,👵🏻,👵🏼,👵🏽,👵🏾,👵🏿 +🙍,person frowning sad vibes bummed disappointed in my feels pain,🙍🏻,🙍🏻,🙍🏼,🙍🏻,🙍🏼,🙍🏽,🙍🏻,🙍🏼,🙍🏽,🙍🏾,🙍🏻,🙍🏼,🙍🏽,🙍🏾,🙍🏿 +🙍‍♂️,man frowning sad vibes bummed disappointed in my feels pain,🙍🏻‍♂️,🙍🏻‍♂️,🙍🏼‍♂️,🙍🏻‍♂️,🙍🏼‍♂️,🙍🏽‍♂️,🙍🏻‍♂️,🙍🏼‍♂️,🙍🏽‍♂️,🙍🏾‍♂️,🙍🏻‍♂️,🙍🏼‍♂️,🙍🏽‍♂️,🙍🏾‍♂️,🙍🏿‍♂️ +🙍‍♀️,woman frowning sad vibes bummed disappointed in my feels pain,🙍🏻‍♀️,🙍🏻‍♀️,🙍🏼‍♀️,🙍🏻‍♀️,🙍🏼‍♀️,🙍🏽‍♀️,🙍🏻‍♀️,🙍🏼‍♀️,🙍🏽‍♀️,🙍🏾‍♀️,🙍🏻‍♀️,🙍🏼‍♀️,🙍🏽‍♀️,🙍🏾‍♀️,🙍🏿‍♀️ +🙎,person pouting salty pouty annoyed mad grumpy,🙎🏻,🙎🏻,🙎🏼,🙎🏻,🙎🏼,🙎🏽,🙎🏻,🙎🏼,🙎🏽,🙎🏾,🙎🏻,🙎🏼,🙎🏽,🙎🏾,🙎🏿 +🙎‍♂️,man pouting salty pouty annoyed mad grumpy,🙎🏻‍♂️,🙎🏻‍♂️,🙎🏼‍♂️,🙎🏻‍♂️,🙎🏼‍♂️,🙎🏽‍♂️,🙎🏻‍♂️,🙎🏼‍♂️,🙎🏽‍♂️,🙎🏾‍♂️,🙎🏻‍♂️,🙎🏼‍♂️,🙎🏽‍♂️,🙎🏾‍♂️,🙎🏿‍♂️ +🙎‍♀️,woman pouting salty pouty annoyed mad grumpy,🙎🏻‍♀️,🙎🏻‍♀️,🙎🏼‍♀️,🙎🏻‍♀️,🙎🏼‍♀️,🙎🏽‍♀️,🙎🏻‍♀️,🙎🏼‍♀️,🙎🏽‍♀️,🙎🏾‍♀️,🙎🏻‍♀️,🙎🏼‍♀️,🙎🏽‍♀️,🙎🏾‍♀️,🙎🏿‍♀️ +🙅,person gesturing NO hard pass nope ain't happening it's a no denied,🙅🏻,🙅🏻,🙅🏼,🙅🏻,🙅🏼,🙅🏽,🙅🏻,🙅🏼,🙅🏽,🙅🏾,🙅🏻,🙅🏼,🙅🏽,🙅🏾,🙅🏿 +🙅‍♂️,man gesturing NO hard pass nope ain't happening it's a no denied,🙅🏻‍♂️,🙅🏻‍♂️,🙅🏼‍♂️,🙅🏻‍♂️,🙅🏼‍♂️,🙅🏽‍♂️,🙅🏻‍♂️,🙅🏼‍♂️,🙅🏽‍♂️,🙅🏾‍♂️,🙅🏻‍♂️,🙅🏼‍♂️,🙅🏽‍♂️,🙅🏾‍♂️,🙅🏿‍♂️ +🙅‍♀️,woman gesturing NO hard pass nope ain't happening it's a no denied,🙅🏻‍♀️,🙅🏻‍♀️,🙅🏼‍♀️,🙅🏻‍♀️,🙅🏼‍♀️,🙅🏽‍♀️,🙅🏻‍♀️,🙅🏼‍♀️,🙅🏽‍♀️,🙅🏾‍♀️,🙅🏻‍♀️,🙅🏼‍♀️,🙅🏽‍♀️,🙅🏾‍♀️,🙅🏿‍♀️ +🙆,person gesturing OK yass bet for sure sounds good let's do it,🙆🏻,🙆🏻,🙆🏼,🙆🏻,🙆🏼,🙆🏽,🙆🏻,🙆🏼,🙆🏽,🙆🏾,🙆🏻,🙆🏼,🙆🏽,🙆🏾,🙆🏿 +🙆‍♂️,man gesturing OK yass bet for sure sounds good let's do it,🙆🏻‍♂️,🙆🏻‍♂️,🙆🏼‍♂️,🙆🏻‍♂️,🙆🏼‍♂️,🙆🏽‍♂️,🙆🏻‍♂️,🙆🏼‍♂️,🙆🏽‍♂️,🙆🏾‍♂️,🙆🏻‍♂️,🙆🏼‍♂️,🙆🏽‍♂️,🙆🏾‍♂️,🙆🏿‍♂️ +🙆‍♀️,woman gesturing OK yass bet for sure sounds good let's do it,🙆🏻‍♀️,🙆🏻‍♀️,🙆🏼‍♀️,🙆🏻‍♀️,🙆🏼‍♀️,🙆🏽‍♀️,🙆🏻‍♀️,🙆🏼‍♀️,🙆🏽‍♀️,🙆🏾‍♀️,🙆🏻‍♀️,🙆🏼‍♀️,🙆🏽‍♀️,🙆🏾‍♀️,🙆🏿‍♀️ +💁,person tipping hand sassy obviously duh as if serving looks,💁🏻,💁🏻,💁🏼,💁🏻,💁🏼,💁🏽,💁🏻,💁🏼,💁🏽,💁🏾,💁🏻,💁🏼,💁🏽,💁🏾,💁🏿 +💁‍♂️,man tipping hand sassy obviously duh as if serving looks,💁🏻‍♂️,💁🏻‍♂️,💁🏼‍♂️,💁🏻‍♂️,💁🏼‍♂️,🙍🏽‍♂️,🙍🏻‍♂️,🙍🏼‍♂️,🙍🏽‍♂️,🙍🏾‍♂️,🙍🏻‍♂️,🙍🏼‍♂️,🙍🏽‍♂️,🙍🏾‍♂️,🙍🏿‍♂️ +💁‍♀️,woman tipping hand sassy obviously duh as if serving looks,💁🏻‍♀️,💁🏻‍♀️,💁🏼‍♀️,💁🏻‍♀️,💁🏼‍♀️,💁🏽‍♀️,💁🏻‍♀️,💁🏼‍♀️,💁🏽‍♀️,💁🏾‍♀️,💁🏻‍♀️,💁🏼‍♀️,💁🏽‍♀️,💁🏾‍♀️,💁🏿‍♀️ +🙋,person raising hand pick me i have a question here present me me me,🙋🏻,🙋🏻,🙋🏼,🙋🏻,🙋🏼,🙋🏽,🙋🏻,🙋🏼,🙋🏽,🙋🏾,🙋🏻,🙋🏼,🙋🏽,🙋🏾,🙋🏿 +🙋‍♂️,man raising hand pick me i have a question here present me me me,🙋🏻‍♂️,🙋🏻‍♂️,🙋🏼‍♂️,🙋🏻‍♂️,🙋🏼‍♂️,🙋🏽‍♂️,🙋🏻‍♂️,🙋🏼‍♂️,🙋🏽‍♂️,🙋🏾‍♂️,🙋🏻‍♂️,🙋🏼‍♂️,🙋🏽‍♂️,🙋🏾‍♂️,🙋🏿‍♂️ +🙋‍♀️,woman raising hand pick me i have a question here present me me me,🙋🏻‍♀️,🙋🏻‍♀️,🙋🏼‍♀️,🙋🏻‍♀️,🙋🏼‍♀️,🙋🏽‍♀️,🙋🏻‍♀️,🙋🏼‍♀️,🙋🏽‍♀️,🙋🏾‍♀️,🙋🏻‍♀️,🙋🏼‍♀️,🙋🏽‍♀️,🙋🏾‍♀️,🙋🏿‍♀️ +🧏,deaf person deaf can't hear you what? sign language accessibility,🧏🏻,🧏🏻,🧏🏼,🧏🏻,🧏🏼,🧏🏽,🧏🏻,🧏🏼,🧏🏽,🧏🏾,🧏🏻,🧏🏼,🧏🏽,🧏🏾,🧏🏿 +🧏‍♂️,deaf man deaf can't hear you what? sign language accessibility,🧏🏻‍♂️,🧏🏻‍♂️,🧏🏼‍♂️,🧏🏻‍♂️,🧏🏼‍♂️,🧏🏽‍♂️,🧏🏻‍♂️,🧏🏼‍♂️,🧏🏽‍♂️,🧏🏾‍♂️,🧏🏻‍♂️,🧏🏼‍♂️,🧏🏽‍♂️,🧏🏾‍♂️,🧏🏿‍♂️ +🧏‍♀️,deaf woman deaf can't hear you what? sign language accessibility,🧏🏻‍♀️,🧏🏻‍♀️,🧏🏼‍♀️,🧏🏻‍♀️,🧏🏼‍♀️,🧏🏽‍♀️,🧏🏻‍♀️,🧏🏼‍♀️,🧏🏽‍♀️,🧏🏾‍♀️,🧏🏻‍♀️,🧏🏼‍♀️,🧏🏽‍♀️,🧏🏾‍♀️,🧏🏿‍♀️ +🙇,person bowing respect thank you sorry bowing down we're not worthy,🙇🏻,🙇🏻,🙇🏼,🙇🏻,🙇🏼,🙇🏽,🙇🏻,🙇🏼,🙇🏽,🙇🏾,🙇🏻,🙇🏼,🙇🏽,🙇🏾,🙇🏿 +🙇‍♂️,man bowing respect thank you sorry bowing down we're not worthy,🙇🏻‍♂️,🙇🏻‍♂️,🙇🏼‍♂️,🙇🏻‍♂️,🙇🏼‍♂️,🙇🏽‍♂️,🙇🏻‍♂️,🙇🏼‍♂️,🙇🏽‍♂️,🙇🏾‍♂️,🙇🏻‍♂️,🙇🏼‍♂️,🙇🏽‍♂️,🙇🏾‍♂️,🙇🏿‍♂️ +🙇‍♀️,woman bowing respect thank you sorry bowing down we're not worthy,🙇🏻‍♀️,🙇🏻‍♀️,🙇🏼‍♀️,🙇🏻‍♀️,🙇🏼‍♀️,🙇🏽‍♀️,🙇🏻‍♀️,🙇🏼‍♀️,🙇🏽‍♀️,🙇🏾‍♀️,🙇🏻‍♀️,🙇🏼‍♀️,🙇🏽‍♀️,🙇🏾‍♀️,🙇🏿‍♀️ +🤦,person facepalming facepalm smh bruh moment i can't disappointed,🤦🏻,🤦🏻,🤦🏼,🤦🏻,🤦🏼,🤦🏽,🤦🏻,🤦🏼,🤦🏽,🤦🏾,🤦🏻,🤦🏼,🤦🏽,🤦🏾,🤦🏿 +🤦‍♂️,man facepalming facepalm smh bruh moment i can't disappointed,🤦🏻‍♂️,🤦🏻‍♂️,🤦🏼‍♂️,🤦🏻‍♂️,🤦🏼‍♂️,🤦🏽‍♂️,🤦🏻‍♂️,🤦🏼‍♂️,🤦🏽‍♂️,🤦🏾‍♂️,🤦🏻‍♂️,🤦🏼‍♂️,🤦🏽‍♂️,🤦🏾‍♂️,🤦🏿‍♂️ +🤦‍♀️,woman facepalming facepalm smh bruh moment i can't disappointed,🤦🏻‍♀️,🤦🏻‍♀️,🤦🏼‍♀️,🤦🏻‍♀️,🤦🏼‍♀️,🤦🏽‍♀️,🤦🏻‍♀️,🤦🏼‍♀️,🤦🏽‍♀️,🤦🏾‍♀️,🤦🏻‍♀️,🤦🏼‍♀️,🤦🏽‍♀️,🤦🏾‍♀️,🤦🏿‍♀️ +🤷,person shrugging idk it is what it is shrug beats me oh well,🤷🏻,🤷🏻,🤷🏼,🤷🏻,🤷🏼,🤷🏽,🤷🏻,🤷🏼,🤷🏽,🤷🏾,🤷🏻,🤷🏼,🤷🏽,🤷🏾,🤷🏿 +🤷‍♂️,man shrugging idk it is what it is shrug beats me oh well,🤷🏻‍♂️,🤷🏻‍♂️,🤷🏼‍♂️,🤷🏻‍♂️,🤷🏼‍♂️,🤷🏽‍♂️,🤷🏻‍♂️,🤷🏼‍♂️,🤷🏽‍♂️,🤷🏾‍♂️,🤷🏻‍♂️,🤷🏼‍♂️,🤷🏽‍♂️,🤷🏾‍♂️,🤷🏿‍♂️ +🤷‍♀️,woman shrugging idk it is what it is shrug beats me oh well,🤷🏻‍♀️,🤷🏻‍♀️,🤷🏼‍♀️,🤷🏻‍♀️,🤷🏼‍♀️,🤷🏽‍♀️,🤷🏻‍♀️,🤷🏼‍♀️,🤷🏽‍♀️,🤷🏾‍♀️,🤷🏻‍♀️,🤷🏼‍♀️,🤷🏽‍♀️,🤷🏾‍♀️,🤷🏿‍♀️ +🧑‍⚕️,health worker the grind hustle work mode making that bread career goals,🧑🏻‍⚕️,🧑🏻‍⚕️,🧑🏼‍⚕️,🧑🏻‍⚕️,🧑🏼‍⚕️,🧑🏽‍⚕️,🧑🏻‍⚕️,🧑🏼‍⚕️,🧑🏽‍⚕️,🧑🏾‍⚕️,🧑🏻‍⚕️,🧑🏼‍⚕️,🧑🏽‍⚕️,🧑🏾‍⚕️,🧑🏿‍⚕️ +👨‍⚕️,man health worker the grind hustle work mode making that bread career goals,👨🏻‍⚕️,👨🏻‍⚕️,👨🏼‍⚕️,👨🏻‍⚕️,👨🏼‍⚕️,👨🏽‍⚕️,👨🏻‍⚕️,👨🏼‍⚕️,👨🏽‍⚕️,👨🏾‍⚕️,👨🏻‍⚕️,👨🏼‍⚕️,👨🏽‍⚕️,👨🏾‍⚕️,👨🏿‍⚕️ +👩‍⚕️,woman health worker the grind hustle work mode making that bread career goals,👩🏻‍⚕️,👩🏻‍⚕️,👩🏼‍⚕️,👩🏻‍⚕️,👩🏼‍⚕️,👩🏽‍⚕️,👩🏻‍⚕️,👩🏼‍⚕️,👩🏽‍⚕️,👩🏾‍⚕️,👩🏻‍⚕️,👩🏼‍⚕️,👩🏽‍⚕️,👩🏾‍⚕️,👩🏿‍⚕️ +🧑‍🎓,student student life graduation class of 2025 big brain time finals,🧑🏻‍🎓,🧑🏻‍🎓,🧑🏼‍🎓,🧑🏻‍🎓,🧑🏼‍🎓,🧑🏽‍🎓,🧑🏻‍🎓,🧑🏼‍🎓,🧑🏽‍🎓,🧑🏾‍🎓,🧑🏻‍🎓,🧑🏼‍🎓,🧑🏽‍🎓,🧑🏾‍🎓,🧑🏿‍🎓 +👨‍🎓,man student student life graduation class of 2025 big brain time finals,👨🏻‍🎓,👨🏻‍🎓,👨🏼‍🎓,👨🏻‍🎓,👨🏼‍🎓,👨🏽‍🎓,👨🏻‍🎓,👨🏼‍🎓,👨🏽‍🎓,👨🏾‍🎓,👨🏻‍🎓,👨🏼‍🎓,👨🏽‍🎓,👨🏾‍🎓,👨🏿‍🎓 +👩‍🎓,woman student student life graduation class of 2025 big brain time finals,👩🏻‍🎓,👩🏻‍🎓,👩🏼‍🎓,👩🏻‍🎓,👩🏼‍🎓,👩🏽‍🎓,👩🏻‍🎓,👩🏼‍🎓,👩🏽‍🎓,👩🏾‍🎓,👩🏻‍🎓,👩🏼‍🎓,👩🏽‍🎓,👩🏾‍🎓,👩🏿‍🎓 +🧑‍🏫,teacher school teach professor know it all assignment due,🧑🏻‍🏫,🧑🏻‍🏫,🧑🏼‍🏫,🧑🏻‍🏫,🧑🏼‍🏫,🧑🏽‍🏫,🧑🏻‍🏫,🧑🏼‍🏫,🧑🏽‍🏫,🧑🏾‍🏫,🧑🏻‍🏫,🧑🏼‍🏫,🧑🏽‍🏫,🧑🏾‍🏫,🧑🏿‍🏫 +👨‍🏫,man teacher school teach professor know it all assignment due,👨🏻‍🏫,👨🏻‍🏫,👨🏼‍🏫,👨🏻‍🏫,👨🏼‍🏫,👨🏽‍🏫,👨🏻‍🏫,👨🏼‍🏫,👨🏽‍🏫,👨🏾‍🏫,👨🏻‍🏫,👨🏼‍🏫,👨🏽‍🏫,👨🏾‍🏫,👨🏿‍🏫 +👩‍🏫,woman teacher school teach professor know it all assignment due,👩🏻‍🏫,👩🏻‍🏫,👩🏼‍🏫,👩🏻‍🏫,👩🏼‍🏫,👩🏽‍🏫,👩🏻‍🏫,👩🏼‍🏫,👩🏽‍🏫,👩🏾‍🏫,👩🏻‍🏫,👩🏼‍🏫,👩🏽‍🏫,👩🏾‍🏫,👩🏿‍🏫 +🧑‍⚖️,judge judge judy order in the court law and order guilty judging you,🧑🏻‍⚖️,🧑🏻‍⚖️,🧑🏼‍⚖️,🧑🏻‍⚖️,🧑🏼‍⚖️,🧑🏽‍⚖️,🧑🏻‍⚖️,🧑🏼‍⚖️,🧑🏽‍⚖️,🧑🏾‍⚖️,🧑🏻‍⚖️,🧑🏼‍⚖️,🧑🏽‍⚖️,🧑🏾‍⚖️,🧑🏿‍⚖️ +👨‍⚖️,man judge judge judy order in the court law and order guilty judging you,👨🏻‍⚖️,👨🏻‍⚖️,👨🏼‍⚖️,👨🏻‍⚖️,👨🏼‍⚖️,👨🏽‍⚖️,👨🏻‍⚖️,👨🏼‍⚖️,👨🏽‍⚖️,👨🏾‍⚖️,👨🏻‍⚖️,👨🏼‍⚖️,👨🏽‍⚖️,👨🏾‍⚖️,👨🏿‍⚖️ +👩‍⚖️,woman judge judge judy order in the court law and order guilty judging you,👩🏻‍⚖️,👩🏻‍⚖️,👩🏼‍⚖️,👩🏻‍⚖️,👩🏼‍⚖️,👩🏽‍⚖️,👩🏻‍⚖️,👩🏼‍⚖️,👩🏽‍⚖️,👩🏾‍⚖️,👩🏻‍⚖️,👩🏼‍⚖️,👩🏽‍⚖️,👩🏾‍⚖️,👩🏿‍⚖️ +🧑‍🌾,farmer farm life cottagecore yeehaw country vibes it ain't much but it's honest work,🧑🏻‍🌾,🧑🏻‍🌾,🧑🏼‍🌾,🧑🏻‍🌾,🧑🏼‍🌾,🧑🏽‍🌾,🧑🏻‍🌾,🧑🏼‍🌾,🧑🏽‍🌾,🧑🏾‍🌾,🧑🏻‍🌾,🧑🏼‍🌾,🧑🏽‍🌾,🧑🏾‍🌾,🧑🏿‍🌾 +👨‍🌾,man farmer farm life cottagecore yeehaw country vibes it ain't much but it's honest work,👨🏻‍🌾,👨🏻‍🌾,👨🏼‍🌾,👨🏻‍🌾,👨🏼‍🌾,👨🏽‍🌾,👨🏻‍🌾,👨🏼‍🌾,👨🏽‍🌾,👨🏾‍🌾,👨🏻‍🌾,👨🏼‍🌾,👨🏽‍🌾,👨🏾‍🌾,👨🏿‍🌾 +👩‍🌾,woman farmer farm life cottagecore yeehaw country vibes it ain't much but it's honest work,👩🏻‍🌾,👩🏻‍🌾,👩🏼‍🌾,👩🏻‍🌾,👩🏼‍🌾,👩🏽‍🌾,👩🏻‍🌾,👩🏼‍🌾,👩🏽‍🏽‍🌾,👩🏾‍🌾,👩🏻‍🌾,👩🏼‍🌾,👩🏽‍🌾,👩🏾‍🌾,👩🏿‍🌾 +🧑‍🍳,cook let him cook chef's kiss bussin' foodie masterchef,🧑🏻‍🍳,🧑🏻‍🍳,🧑🏼‍🍳,🧑🏻‍🍳,🧑🏼‍🍳,🧑🏽‍🍳,🧑🏻‍🍳,🧑🏼‍🍳,🧑🏽‍🍳,🧑🏾‍🍳,🧑🏻‍🍳,🧑🏼‍🍳,🧑🏽‍🍳,🧑🏾‍🍳,🧑🏿‍🍳 +👨‍🍳,man cook let him cook chef's kiss bussin' foodie masterchef,👨🏻‍🍳,👨🏻‍🍳,👨🏼‍🍳,👨🏻‍🍳,👨🏼‍🍳,👨🏽‍🍳,👨🏻‍🍳,👨🏼‍🍳,👨🏽‍🍳,👨🏾‍🍳,👨🏻‍🍳,👨🏼‍🍳,👨🏽‍🍳,👨🏾‍🍳,👨🏿‍🍳 +👩‍🍳,woman cook let her cook chef's kiss bussin' foodie masterchef,👩🏻‍🍳,👩🏻‍🍳,👩🏼‍🍳,👩🏻‍🍳,👩🏼‍🍳,👩🏽‍🍳,👩🏻‍🍳,👩🏼‍🍳,👩🏽‍🍳,👩🏾‍🍳,👩🏻‍🍳,👩🏼‍🍳,👩🏽‍🍳,👩🏾‍🍳,👩🏿‍🍳 +🧑‍🔧,mechanic fix it bob the builder handy mechanic diy,🧑🏻‍🔧,🧑🏻‍🔧,🧑🏼‍🔧,🧑🏻‍🔧,🧑🏼‍🔧,🧑🏽‍🔧,🧑🏻‍🔧,🧑🏼‍🔧,🧑🏽‍🔧,🧑🏾‍🔧,🧑🏻‍🔧,🧑🏼‍🔧,🧑🏽‍🔧,🧑🏾‍🔧,🧑🏿‍🔧 +👨‍🔧,man mechanic fix it bob the builder handy mechanic diy,👨🏻‍🔧,👨🏻‍🔧,👨🏼‍🔧,👨🏻‍🔧,👨🏼‍🔧,👨🏽‍🔧,👨🏻‍🔧,👨🏼‍🔧,👨🏽‍🔧,👨🏾‍🔧,👨🏻‍🔧,👨🏼‍🔧,👨🏽‍🔧,👨🏾‍🔧,👨🏿‍🔧 +👩‍🔧,woman mechanic fix it bob the builder handy mechanic diy,👩🏻‍🔧,👩🏻‍🔧,👩🏼‍🔧,👩🏻‍🔧,👩🏼‍🔧,👩🏽‍🔧,👩🏻‍🔧,👩🏼‍🔧,👩🏽‍🔧,👩🏾‍🔧,👩🏻‍🔧,👩🏼‍🔧,👩🏽‍🔧,👩🏾‍🔧,👩🏿‍🔧 +🧑‍🏭,factory worker the grind blue collar hard work industry working class,🧑🏻‍🏭,🧑🏻‍🏭,🧑🏼‍🏭,🧑🏻‍🏭,🧑🏼‍🏭,🧑🏽‍🏭,🧑🏻‍🏭,🧑🏼‍🏭,🧑🏽‍🏭,🧑🏾‍🏭,🧑🏻‍🏭,🧑🏼‍🏭,🧑🏽‍🏭,🧑🏾‍🏭,🧑🏿‍🏭 +👨‍🏭,man factory worker the grind blue collar hard work industry working class,👨🏻‍🏭,👨🏻‍🏭,👨🏼‍🏭,👨🏻‍🏭,👨🏼‍🏭,👨🏽‍🏭,👨🏻‍🏭,👨🏼‍🏭,👨🏽‍🏭,👨🏾‍🏭,👨🏻‍🏭,👨🏼‍🏭,👨🏽‍🏭,👨🏾‍🏭,👨🏿‍🏭 +👩‍🏭,woman factory worker the grind blue collar hard work industry working class,👩🏻‍🏭,👩🏻‍🏭,👩🏼‍🏭,👩🏻‍🏭,👩🏼‍🏭,👩🏽‍🏭,👩🏻‍🏭,👩🏼‍🏭,👩🏽‍🏭,👩🏾‍🏭,👩🏻‍🏭,👩🏼‍🏭,👩🏽‍🏭,👩🏾‍🏭,👩🏿‍🏭 +🧑‍💼,office worker 9 to 5 corporate life the office business professional,🧑🏻‍💼,🧑🏻‍💼,🧑🏼‍💼,🧑🏻‍💼,🧑🏼‍💼,🧑🏽‍💼,🧑🏻‍💼,🧑🏼‍💼,🧑🏽‍💼,🧑🏾‍💼,🧑🏻‍💼,🧑🏼‍💼,🧑🏽‍💼,🧑🏾‍💼,🧑🏿‍💼 +👨‍💼,man office worker 9 to 5 corporate life the office business professional,👨🏻‍💼,👨🏻‍💼,👨🏼‍💼,👨🏻‍💼,👨🏼‍💼,👨🏽‍💼,👨🏻‍💼,👨🏼‍💼,👨🏽‍💼,👨🏾‍💼,👨🏻‍💼,👨🏼‍💼,👨🏽‍💼,👨🏾‍💼,👨🏿‍💼 +👩‍💼,woman office worker girlboss corporate life the office business professional,👩🏻‍💼,👩🏻‍💼,👩🏼‍💼,👩🏻‍💼,👩🏼‍💼,👩🏽‍💼,👩🏻‍💼,👩🏼‍💼,👩🏽‍💼,👩🏾‍💼,👩🏻‍💼,👩🏼‍💼,👩🏽‍💼,👩🏾‍💼,👩🏿‍💼 +🧑‍🔬,scientist science bill nye beaker chemistry lab coat,🧑🏻‍🔬,🧑🏻‍🔬,🧑🏼‍🔬,🧑🏻‍🔬,🧑🏼‍🔬,🧑🏽‍🔬,🧑🏻‍🔬,🧑🏼‍🔬,🧑🏽‍🔬,🧑🏾‍🔬,🧑🏻‍🔬,🧑🏼‍🔬,🧑🏽‍🏽‍🔬,🧑🏾‍🔬,🧑🏿‍🔬 +👨‍🔬,man scientist science bill nye beaker chemistry lab coat,👨🏻‍🔬,👨🏻‍🔬,👨🏼‍🔬,👨🏻‍🔬,👨🏼‍🔬,👨🏽‍🔬,👨🏻‍🔬,👨🏼‍🔬,👨🏽‍🔬,👨🏾‍🔬,👨🏻‍🔬,👨🏼‍🔬,👨🏽‍🔬,👨🏾‍🔬,👨🏿‍🔬 +👩‍🔬,woman scientist science bill nye beaker chemistry lab coat,👩🏻‍🔬,👩🏻‍🔬,👩🏼‍🔬,👩🏻‍🔬,👩🏼‍🔬,👩🏽‍🔬,👩🏻‍🔬,👩🏼‍🔬,👩🏽‍🔬,👩🏾‍🔬,👩🏻‍🔬,👩🏼‍🔬,👩🏽‍🔬,👩🏾‍🔬,👩🏿‍🔬 +🧑‍💻,technologist coding tech bro programmer developer hacker,🧑🏻‍💻,🧑🏻‍💻,🧑🏼‍💻,🧑🏻‍💻,🧑🏼‍💻,🧑🏽‍💻,🧑🏻‍💻,🧑🏼‍💻,🧑🏽‍💻,🧑🏾‍💻,🧑🏻‍💻,🧑🏼‍💻,🧑🏽‍💻,🧑🏾‍💻,🧑🏿‍💻 +👨‍💻,man technologist coding tech bro programmer developer hacker,👨🏻‍💻,👨🏻‍💻,👨🏼‍💻,👨🏻‍💻,👨🏼‍💻,👨🏽‍💻,👨🏻‍💻,👨🏼‍💻,👨🏽‍🏽‍💻,👨🏾‍💻,👨🏻‍💻,👨🏼‍💻,👨🏽‍💻,👨🏾‍💻,👨🏿‍💻 +👩‍💻,woman technologist coding tech sis programmer developer hacker,👩🏻‍💻,👩🏻‍💻,👩🏼‍💻,👩🏻‍💻,👩🏼‍💻,👩🏽‍💻,👩🏻‍💻,👩🏼‍💻,👩🏽‍💻,👩🏾‍💻,👩🏻‍💻,👩🏼‍💻,👩🏽‍💻,👩🏾‍💻,👩🏿‍💻 +🧑‍🎤,singer rockstar main character on stage performing popstar,🧑🏻‍🎤,🧑🏻‍🎤,🧑🏼‍🎤,🧑🏻‍🎤,🧑🏼‍🎤,🧑🏽‍🎤,🧑🏻‍🎤,🧑🏼‍🎤,🧑🏽‍🏽‍🎤,🧑🏾‍🎤,🧑🏻‍🎤,🧑🏼‍🎤,🧑🏽‍🎤,🧑🏾‍🎤,🧑🏿‍🎤 +👨‍🎤,man singer rockstar main character on stage performing popstar,👨🏻‍🎤,👨🏻‍🎤,👨🏼‍🎤,👨🏻‍🎤,👨🏼‍🎤,👨🏽‍🎤,👨🏻‍🎤,👨🏼‍🎤,👨🏽‍🎤,👨🏾‍🎤,👨🏻‍🎤,👨🏼‍🎤,👨🏽‍🎤,👨🏾‍🎤,👨🏿‍🎤 +👩‍🎤,woman singer rockstar main character on stage performing popstar,👩🏻‍🎤,👩🏻‍🎤,👩🏼‍🎤,👩🏻‍🎤,👩🏼‍🎤,👩🏽‍🏽‍🎤,👩🏻‍🎤,👩🏼‍🎤,👩🏽‍🎤,👩🏾‍🎤,👩🏻‍🎤,👩🏼‍🎤,👩🏽‍🎤,👩🏾‍🎤,👩🏿‍🎤 +🧑‍🎨,artist artsy creative painting masterpiece bob ross,🧑🏻‍🎨,🧑🏻‍🎨,🧑🏼‍🎨,🧑🏻‍🎨,🧑🏼‍🎨,🧑🏽‍🎨,🧑🏻‍🎨,🧑🏼‍🎨,🧑🏽‍🎨,🧑🏾‍🎨,🧑🏻‍🎨,🧑🏼‍🎨,🧑🏽‍🎨,🧑🏾‍🎨,🧑🏿‍🎨 +👨‍🎨,man artist artsy creative painting masterpiece bob ross,👨🏻‍🎨,👨🏻‍🎨,👨🏼‍🎨,👨🏻‍🎨,👨🏼‍🎨,👨🏽‍🎨,👨🏻‍🎨,👨🏼‍🎨,👨🏽‍🏽‍🎨,👨🏾‍🎨,👨🏻‍🎨,👨🏼‍🎨,👨🏽‍🎨,👨🏾‍🎨,👨🏿‍🎨 +👩‍🎨,woman artist artsy creative painting masterpiece bob ross,👩🏻‍🎨,👩🏻‍🎨,👩🏼‍🎨,👩🏻‍🎨,👩🏼‍🎨,👩🏽‍🎨,👩🏻‍🎨,👩🏼‍🎨,👩🏽‍🏽‍🎨,👩🏾‍🎨,👩🏻‍🎨,👩🏼‍🎨,👩🏽‍🎨,👩🏾‍🎨,👩🏿‍🎨 +🧑‍✈️,pilot flying high top gun maverick pilot captain,🧑🏻‍✈️,🧑🏻‍✈️,🧑🏼‍✈️,🧑🏻‍✈️,🧑🏼‍✈️,🧑🏽‍✈️,🧑🏻‍✈️,🧑🏼‍✈️,🧑🏽‍✈️,🧑🏾‍✈️,🧑🏻‍✈️,🧑🏼‍✈️,🧑🏽‍✈️,🧑🏾‍✈️,🧑🏿‍✈️ +👨‍✈️,man pilot flying high top gun maverick pilot captain,👨🏻‍✈️,👨🏻‍✈️,👨🏼‍✈️,👨🏻‍✈️,👨🏼‍✈️,👨🏽‍✈️,👨🏻‍✈️,👨🏼‍✈️,👨🏽‍🏽‍✈️,👨🏾‍✈️,👨🏻‍✈️,👨🏼‍✈️,👨🏽‍✈️,👨🏾‍✈️,👨🏿‍✈️ +👩‍✈️,woman pilot flying high top gun maverick pilot captain,👩🏻‍✈️,👩🏻‍✈️,👩🏼‍✈️,👩🏻‍✈️,👩🏼‍✈️,👩🏽‍✈️,👩🏻‍✈️,👩🏼‍✈️,👩🏽‍🏽‍✈️,👩🏾‍✈️,👩🏻‍✈️,👩🏼‍✈️,👩🏽‍✈️,👩🏾‍✈️,👩🏿‍✈️ +🧑‍🚀,astronaut to the moon among us space interstellar astronaut,🧑🏻‍🚀,🧑🏻‍🚀,🧑🏼‍🚀,🧑🏻‍🚀,🧑🏼‍🚀,🧑🏽‍🚀,🧑🏻‍🚀,🧑🏼‍🚀,🧑🏽‍🚀,🧑🏾‍🚀,🧑🏻‍🚀,🧑🏼‍🚀,🧑🏽‍🚀,🧑🏾‍🚀,🧑🏿‍🚀 +👨‍🚀,man astronaut to the moon among us space interstellar astronaut,👨🏻‍🚀,👨🏻‍🚀,👨🏼‍🚀,👨🏻‍🚀,👨🏼‍🚀,👨🏽‍🚀,👨🏻‍🚀,👨🏼‍🚀,👨🏽‍🏽‍🚀,👨🏾‍🚀,👨🏻‍🚀,👨🏼‍🚀,👨🏽‍🚀,👨🏾‍🚀,👨🏿‍🚀 +👩‍🚀,woman astronaut to the moon among us space interstellar astronaut,👩🏻‍🚀,👩🏻‍🚀,👩🏼‍🚀,👩🏻‍🚀,👩🏼‍🚀,👩🏽‍🚀,👩🏻‍🚀,👩🏼‍🚀,👩🏽‍🏽‍🚀,👩🏾‍🚀,👩🏻‍🚀,👩🏼‍🚀,👩🏽‍🚀,👩🏾‍🚀,👩🏿‍🚀 +🧑‍🚒,firefighter hero on fire hot stuff firefighter rescue,🧑🏻‍🚒,🧑🏻‍🚒,🧑🏼‍🚒,🧑🏻‍🚒,🧑🏼‍🚒,🧑🏽‍🚒,🧑🏻‍🚒,🧑🏼‍🚒,🧑🏽‍🚀,🧑🏾‍🚒,🧑🏻‍🚒,🧑🏼‍🚒,🧑🏽‍🚀,🧑🏾‍🚒,🧑🏿‍🚒 +👨‍🚒,man firefighter hero on fire hot stuff firefighter rescue,👨🏻‍🚒,👨🏻‍🚒,👨🏼‍🚒,👨🏻‍🚒,👨🏼‍🚒,👨🏽‍🚒,👨🏻‍🚒,👨🏼‍🚒,👨🏽‍🏽‍🚒,👨🏾‍🚒,👨🏻‍🚒,👨🏼‍🚒,👨🏽‍🚒,👨🏾‍🚒,👨🏿‍🚒 +👩‍🚒,woman firefighter hero on fire hot stuff firefighter rescue,👩🏻‍🚒,👩🏻‍🚒,👩🏼‍🚒,👩🏻‍🚒,👩🏼‍🚒,👩🏽‍🏽‍🚒,👩🏻‍🚒,👩🏼‍🚒,👩🏽‍🚒,👩🏾‍🚒,👩🏻‍🚒,👩🏼‍🚒,👩🏽‍🚒,👩🏾‍🚒,👩🏿‍🚒 +👮,police officer cops feds ACAB 5-0 police,👮🏻,👮🏻,👮🏼,👮🏻,👮🏼,👮🏽,👮🏻,👮🏼,👮🏽,👮🏾,👮🏻,👮🏼,👮🏽,👮🏾,👮🏿 +👮‍♂️,man police officer cops feds ACAB 5-0 police,👮🏻‍♂️,👮🏻‍♂️,👮🏼‍♂️,👮🏻‍♂️,👮🏼‍♂️,👮🏽‍♂️,👮🏻‍♂️,👮🏼‍♂️,👮🏽‍♂️,👮🏾‍♂️,👮🏻‍♂️,👮🏼‍♂️,👮🏽‍♂️,👮🏾‍♂️,👮🏿‍♂️ +👮‍♀️,woman police officer cops feds ACAB 5-0 police,👮🏻‍♀️,👮🏻‍♀️,👮🏼‍♀️,👮🏻‍♀️,👮🏼‍♀️,👮🏽‍♀️,👮🏻‍♀️,👮🏼‍♀️,👮🏽‍♀️,👮🏾‍♀️,👮🏻‍♀️,👮🏼‍♀️,👮🏽‍♀️,👮🏾‍♀️,👮🏿‍♀️ +🕵️,detective spilling the tea on the case sus investigating private eye,🕵🏻,🕵🏻,🕵🏼,🕵🏻,🕵🏼,🕵🏽,🕵🏻,🕵🏼,🕵🏽,🕵🏾,🕵🏻,🕵🏼,🕵🏽,🕵🏾,🕵🏿 +🕵️‍♂️,man detective spilling the tea on the case sus investigating private eye,🕵🏻‍♂️,🕵🏻‍♂️,🕵🏼‍♂️,🕵🏻‍♂️,🕵🏼‍♂️,🕵🏽‍♂️,🕵🏻‍♂️,🕵🏼‍♂️,🕵🏽‍♂️,🕵🏾‍♂️,🕵🏻‍♂️,🕵🏼‍♂️,🕵🏽‍♂️,🕵🏾‍♂️,🕵🏿‍♂️ +🕵️‍♀️,woman detective spilling the tea on the case sus investigating private eye,🕵🏻‍♀️,🕵🏻‍♀️,🕵🏼‍♀️,🕵🏻‍♀️,🕵🏼‍♀️,🕵🏽‍♀️,🕵🏻‍♀️,🕵🏼‍♀️,🕵🏽‍♀️,🕵🏾‍♀️,🕵🏻‍♀️,🕵🏼‍♀️,🕵🏽‍♀️,🕵🏾‍♀️,🕵🏿‍♀️ +💂,guard on watch royal guard stoic protecting the grind,💂🏻,💂🏻,💂🏼,💂🏻,💂🏼,💂🏽,💂🏻,💂🏼,💂🏽,💂🏾,💂🏻,💂🏼,💂🏽,💂🏾,💂🏿 +💂‍♂️,man guard on watch royal guard stoic protecting the grind,💂🏻‍♂️,💂🏻‍♂️,💂🏼‍♂️,💂🏻‍♂️,💂🏼‍♂️,💂🏽‍♂️,💂🏻‍♂️,💂🏼‍♂️,💂🏽‍♂️,💂🏾‍♂️,💂🏻‍♂️,💂🏼‍♂️,💂🏽‍♂️,💂🏾‍♂️,💂🏿‍♂️ +💂‍♀️,woman guard on watch royal guard stoic protecting the grind,💂🏻‍♀️,💂🏻‍♀️,💂🏼‍♀️,💂🏻‍♀️,💂🏼‍♀️,💂🏽‍♀️,💂🏻‍♀️,💂🏼‍♀️,💂🏽‍♀️,💂🏾‍♀️,💂🏻‍♀️,💂🏼‍♀️,💂🏽‍♀️,💂🏾‍♀️,💂🏿‍♀️ +🥷,ninja stealth mode sneaky shadow silent assassin,🥷🏻,🥷🏻,🥷🏼,🥷🏻,🥷🏼,🥷🏽,🥷🏻,🥷🏼,🥷🏽,🥷🏾,🥷🏻,🥷🏼,🥷🏽,🥷🏾,🥷🏿 +👷,construction worker hard hat area the grind building workin hard blue collar,👷🏻,👷🏻,👷🏼,👷🏻,👷🏼,👷🏽,👷🏻,👷🏼,👷🏽,👷🏾,👷🏻,👷🏼,👷🏽,👷🏾,👷🏿 +👷‍♂️,man construction worker hard hat area the grind building workin hard blue collar,👷🏻‍♂️,👷🏻‍♂️,👷🏼‍♂️,👷🏻‍♂️,👷🏼‍♂️,👷🏽‍♂️,👷🏻‍♂️,👷🏼‍♂️,👷🏽‍♂️,👷🏾‍♂️,👷🏻‍♂️,👷🏼‍♂️,👷🏽‍♂️,👷🏾‍♂️,👷🏿‍♂️ +👷‍♀️,woman construction worker hard hat area the grind building workin hard blue collar,👷🏻‍♀️,👷🏻‍♀️,👷🏼‍♀️,👷🏻‍♀️,👷🏼‍♀️,👷🏽‍♀️,👷🏻‍♀️,👷🏼‍♀️,👷🏽‍♀️,👷🏾‍♀️,👷🏻‍♀️,👷🏼‍♀️,👷🏽‍♀️,👷🏾‍♀️,👷🏿‍♀️ +🫅,person with crown royalty king queen monarch main character,🫅🏻,🫅🏻,🫅🏼,🫅🏻,🫅🏼,🫅🏽,🫅🏻,🫅🏼,🫅🏽,🫅🏾,🫅🏻,🫅🏼,🫅🏽,🫅🏾,🫅🏿 +🤴,prince prince charming king royalty main character spoiled,🤴🏻,🤴🏻,🤴🏼,🤴🏻,🤴🏼,🤴🏽,🤴🏻,🤴🏼,🤴🏽,🤴🏾,🤴🏻,🤴🏼,🤴🏽,🤴🏾,🤴🏿 +👸,princess princess diaries queen main character energy royalty disney princess,👸🏻,👸🏻,👸🏼,👸🏻,👸🏼,👸🏽,👸🏻,👸🏼,👸🏽,👸🏾,👸🏻,👸🏼,👸🏽,👸🏾,👸🏿 +👳,person wearing turban turban sikh desi cultural respect,👳🏻,👳🏻,👳🏼,👳🏻,👳🏼,👳🏽,👳🏻,👳🏼,👳🏽,👳🏾,👳🏻,👳🏼,👳🏽,👳🏾,👳🏿 +👳‍♂️,man wearing turban turban sikh desi cultural respect,👳🏻‍♂️,👳🏻‍♂️,👳🏼‍♂️,👳🏻‍♂️,👳🏼‍♂️,👳🏽‍♂️,👳🏻‍♂️,👳🏼‍♂️,👳🏽‍♂️,👳🏾‍♂️,👳🏻‍♂️,👳🏼‍♂️,👳🏽‍♂️,👳🏾‍♂️,👳🏿‍♂️ +👳‍♀️,woman wearing turban turban sikh desi cultural respect,👳🏻‍♀️,👳🏻‍♀️,👳🏼‍♀️,👳🏻‍♀️,👳🏼‍♀️,👳🏽‍♀️,👳🏻‍♀️,👳🏼‍♀️,👳🏽‍♀️,👳🏾‍♀️,👳🏻‍♀️,👳🏼‍♀️,👳🏽‍♀️,👳🏾‍♀️,👳🏿‍♀️ +👲,person with skullcap skullcap chinese man traditional asian wise,👲🏻,👲🏻,👲🏼,👲🏻,👲🏼,👲🏽,👲🏻,👲🏼,👲🏽,👲🏾,👲🏻,👲🏼,👲🏽,👲🏾,👲🏿 +🧕,woman with headscarf hijabi muslimah modest fashion queen headscarf,🧕🏻,🧕🏻,🧕🏼,🧕🏻,🧕🏼,🧕🏽,🧕🏻,🧕🏼,🧕🏽,🧕🏾,🧕🏻,🧕🏼,🧕🏽,🧕🏾,🧕🏿 +🤵,person in tuxedo tuxedo fancy black tie dapper prom night,🤵🏻,🤵🏻,🤵🏼,🤵🏻,🤵🏼,🤵🏽,🤵🏻,🤵🏼,🤵🏽,🤵🏾,🤵🏻,🤵🏼,🤵🏽,🤵🏾,🤵🏿 +🤵‍♂️,man in tuxedo tuxedo fancy black tie dapper prom night,🤵🏻‍♂️,🤵🏻‍♂️,🤵🏼‍♂️,🤵🏻‍♂️,🤵🏼‍♂️,🤵🏽‍♂️,🤵🏻‍♂️,🤵🏼‍♂️,🤵🏽‍♂️,🤵🏾‍♂️,🤵🏻‍♂️,🤵🏼‍♂️,🤵🏽‍♂️,🤵🏾‍♂️,🤵🏿‍♂️ +🤵‍♀️,woman in tuxedo tuxedo fancy black tie dapper prom night,🤵🏻‍♀️,🤵🏻‍♀️,🤵🏼‍♀️,🤵🏻‍♀️,🤵🏼‍♀️,🤵🏽‍♀️,🤵🏻‍♀️,🤵🏼‍♀️,🤵🏽‍♀️,🤵🏾‍♀️,🤵🏻‍♀️,🤵🏼‍♀️,🤵🏽‍♀️,🤵🏾‍♀️,🤵🏿‍♀️ +👰,person with veil bride wedding day saying yes bridezilla getting married,👰🏻,👰🏻,👰🏼,👰🏻,👰🏼,👰🏽,👰🏻,👰🏼,👰🏽,👰🏾,👰🏻,👰🏼,👰🏽,👰🏾,👰🏿 +👰‍♂️,man with veil groom wedding day saying yes getting married husband,👰🏻‍♂️,👰🏻‍♂️,👰🏼‍♂️,👰🏻‍♂️,👰🏼‍♂️,👰🏽‍♂️,👰🏻‍♂️,👰🏼‍♂️,👰🏽‍♂️,👰🏾‍♂️,👰🏻‍♂️,👰🏼‍♂️,👰🏽‍♂️,👰🏾‍♂️,👰🏿‍♂️ +👰‍♀️,woman with veil bride wedding day saying yes bridezilla getting married,👰🏻‍♀️,👰🏻‍♀️,👰🏼‍♀️,👰🏻‍♀️,👰🏼‍♀️,👰🏽‍♀️,👰🏻‍♀️,👰🏼‍♀️,👰🏽‍♀️,👰🏾‍♀️,👰🏻‍♀️,👰🏼‍♀️,👰🏽‍♀️,👰🏾‍♀️,👰🏿‍♀️ +🤰,pregnant woman pregnant baby on board expecting glowing food baby,🤰🏻,🤰🏻,🤰🏼,🤰🏻,🤰🏼,🤰🏽,🤰🏻,🤰🏼,🤰🏽,🤰🏾,🤰🏻,🤰🏼,🤰🏽,🤰🏾,🤰🏿 +🫃,pregnant man pregnant man seahorse dad expecting baby bump trans dad,🫃🏻,🫃🏻,🫃🏼,🫃🏻,🫃🏼,🫃🏽,🫃🏻,🫃🏼,🫃🏽,🫃🏾,🫃🏻,🫃🏼,🫃🏽,🫃🏾,🫃🏿 +🫄,pregnant person pregnant person expecting parent baby loading bun in the oven gender neutral,🫄🏻,🫄🏻,🫄🏼,🫄🏻,🫄🏼,🫄🏽,🫄🏻,🫄🏼,🫄🏽,🫄🏾,🫄🏻,🫄🏼,🫄🏽,🫄🏾,🫄🏿 +🤱,breast-feeding breastfeeding new mom mom life nursing liquid gold,🤱🏻,🤱🏻,🤱🏼,🤱🏻,🤱🏼,🤱🏽,🤱🏻,🤱🏼,🤱🏽,🤱🏾,🤱🏻,🤱🏼,🤱🏽,🤱🏾,🤱🏿 +👩‍🍼,woman feeding baby new mom mom life bottle feeding caring motherhood,👩🏻‍🍼,👩🏻‍🍼,👩🏼‍🍼,👩🏻‍🍼,👩🏼‍🍼,👩🏽‍🍼,👩🏻‍🍼,👩🏼‍🍼,👩🏽‍🍼,👩🏾‍🍼,👩🏻‍🍼,👩🏼‍🍼,👩🏽‍🍼,👩🏾‍🍼,👩🏿‍🍼 +👨‍🍼,man feeding baby new dad dad life bottle feeding caring fatherhood,👨🏻‍🍼,👨🏻‍🍼,👨🏼‍🍼,👨🏻‍🍼,👨🏼‍🍼,👨🏽‍🍼,👨🏻‍🍼,👨🏼‍🍼,👨🏽‍🍼,👨🏾‍🍼,👨🏻‍🍼,👨🏼‍🍼,👨🏽‍🍼,👨🏾‍🍼,👨🏿‍🍼 +🧑‍🍼,person feeding baby new parent parent life bottle feeding caring parenthood,🧑🏻‍🍼,🧑🏻‍🍼,🧑🏼‍🍼,🧑🏻‍🍼,🧑🏼‍🍼,🧑🏽‍🍼,🧑🏻‍🍼,🧑🏼‍🍼,🧑🏽‍🍼,🧑🏾‍🍼,🧑🏻‍🍼,🧑🏼‍🍼,🧑🏽‍🍼,🧑🏾‍🍼,🧑🏿‍🍼 +👼,baby angel angel cherub innocent blessed heaven sent,👼🏻,👼🏻,👼🏼,👼🏻,👼🏼,👼🏽,👼🏻,👼🏼,👼🏽,👼🏾,👼🏻,👼🏼,👼🏽,👼🏾,👼🏿 +🎅,Santa Claus santa christmas vibes holiday season naughty or nice sleigh,🎅🏻,🎅🏻,🎅🏼,🎅🏻,🎅🏼,🎅🏽,🎅🏻,🎅🏼,🎅🏽,🎅🏾,🎅🏻,🎅🏼,🎅🏽,🎅🏾,🎅🏿 +🤶,Mrs. Claus mrs claus christmas queen holiday baking festive north pole,🤶🏻,🤶🏻,🤶🏼,🤶🏻,🤶🏼,🤶🏽,🤶🏻,🤶🏼,🤶🏽,🤶🏾,🤶🏻,🤶🏼,🤶🏽,🤶🏾,🤶🏿 +🧑‍🎄,mx claus mx claus gender neutral santa holiday spirit festive christmas time,🧑🏻‍🎄,🧑🏻‍🎄,🧑🏼‍🎄,🧑🏻‍🎄,🧑🏼‍🎄,🧑🏽‍🎄,🧑🏻‍🎄,🧑🏼‍🎄,🧑🏽‍🎄,🧑🏾‍🎄,🧑🏻‍🎄,🧑🏼‍🎄,🧑🏽‍🎄,🧑🏾‍🎄,🧑🏿‍🎄 +🦸,superhero superhero main character marvel dc saving the day,🦸🏻,🦸🏻,🦸🏼,🦸🏻,🦸🏼,🦸🏽,🦸🏻,🦸🏼,🦸🏽,🦸🏾,🦸🏻,🦸🏼,🦸🏽,🦸🏾,🦸🏿 +🦸‍♂️,man superhero superhero main character marvel dc saving the day,🦸🏻‍♂️,🦸🏻‍♂️,🦸🏼‍♂️,🦸🏻‍♂️,🦸🏼‍♂️,🦸🏽‍♂️,🦸🏻‍♂️,🦸🏼‍♂️,🦸🏽‍♂️,🦸🏾‍♂️,🦸🏻‍♂️,🦸🏼‍♂️,🦸🏽‍♂️,🦸🏾‍♂️,🦸🏿‍♂️ +🦸‍♀️,woman superhero superheroine main character marvel dc saving the day,🦸🏻‍♀️,🦸🏻‍♀️,🦸🏼‍♀️,🦸🏻‍♀️,🦸🏼‍♀️,🦸🏽‍♀️,🦸🏻‍♀️,🦸🏼‍♀️,🦸🏽‍♀️,🦸🏾‍♀️,🦸🏻‍♀️,🦸🏼‍♀️,🦸🏽‍♀️,🦸🏾‍♀️,🦸🏿‍♀️ +🦹,supervillain supervillain villain era joker chaos anti-hero,🦹🏻,🦹🏻,🦹🏼,🦹🏻,🦹🏼,🦹🏽,🦹🏻,🦹🏼,🦹🏽,🦹🏾,🦹🏻,🦹🏼,🦹🏽,🦹🏾,🦹🏿 +🦹‍♂️,man supervillain supervillain villain era joker chaos anti-hero,🦹🏻‍♂️,🦹🏻‍♂️,🦹🏼‍♂️,🦹🏻‍♂️,🦹🏼‍♂️,🦹🏽‍♂️,🦹🏻‍♂️,🦹🏼‍♂️,🦹🏽‍♂️,🦹🏾‍♂️,🦹🏻‍♂️,🦹🏼‍♂️,🦹🏽‍♂️,🦹🏾‍♂️,🦹🏿‍♂️ +🦹‍♀️,woman supervillain supervillainess villain era joker chaos anti-hero,🦹🏻‍♀️,🦹🏻‍♀️,🦹🏼‍♀️,🦹🏻‍♀️,🦹🏼‍♀️,🦹🏽‍♀️,🦹🏻‍♀️,🦹🏼‍♀️,🦹🏽‍♀️,🦹🏾‍♀️,🦹🏻‍♀️,🦹🏼‍♀️,🦹🏽‍♀️,🦹🏾‍♀️,🦹🏿‍♀️ +🧙,mage wizard harry potter magic dnd spellcaster,🧙🏻,🧙🏻,🧙🏼,🧙🏻,🧙🏼,🧙🏽,🧙🏻,🧙🏼,🧙🏽,🧙🏾,🧙🏻,🧙🏼,🧙🏽,🧙🏾,🧙🏿 +🧙‍♂️,man mage wizard harry potter magic dnd spellcaster,🧙🏻‍♂️,🧙🏻‍♂️,🧙🏼‍♂️,🧙🏻‍♂️,🧙🏼‍♂️,🧙🏽‍♂️,🧙🏻‍♂️,🧙🏼‍♂️,🧙🏽‍♂️,🧙🏾‍♂️,🧙🏻‍♂️,🧙🏼‍♂️,🧙🏽‍♂️,🧙🏾‍♂️,🧙🏿‍♂️ +🧙‍♀️,woman mage witch sabrina magic dnd spellcaster,🧙🏻‍♀️,🧙🏻‍♀️,🧙🏼‍♀️,🧙🏻‍♀️,🧙🏼‍♀️,🧙🏽‍♀️,🧙🏻‍♀️,🧙🏼‍♀️,🧙🏽‍♀️,🧙🏾‍♀️,🧙🏻‍♀️,🧙🏼‍♀️,🧙🏽‍♀️,🧙🏾‍♀️,🧙🏿‍♀️ +🧚,fairy fairycore cottagecore magical tinkerbell ethereal,🧚🏻,🧚🏻,🧚🏼,🧚🏻,🧚🏼,🧚🏽,🧚🏻,🧚🏼,🧚🏽,🧚🏾,🧚🏻,🧚🏼,🧚🏽,🧚🏾,🧚🏿 +🧚‍♂️,man fairy fairycore cottagecore magical ethereal fantasy,🧚🏻‍♂️,🧚🏻‍♂️,🧚🏼‍♂️,🧚🏻‍♂️,🧚🏼‍♂️,🧚🏽‍♂️,🧚🏻‍♂️,🧚🏼‍♂️,🧚🏽‍♂️,🧚🏾‍♂️,🧚🏻‍♂️,🧚🏼‍♂️,🧚🏽‍♂️,🧚🏾‍♂️,🧚🏿‍♂️ +🧚‍♀️,woman fairy fairycore cottagecore magical tinkerbell ethereal,🧚🏻‍♀️,🧚🏻‍♀️,🧚🏼‍♀️,🧚🏻‍♀️,🧚🏼‍♀️,🧚🏽‍♀️,🧚🏻‍♀️,🧚🏼‍♀️,🧚🏽‍♀️,🧚🏾‍♀️,🧚🏻‍♀️,🧚🏼‍♀️,🧚🏽‍♀️,🧚🏾‍♀️,🧚🏿‍♀️ +🧛,vampire vampire twilight dracula goth thirsty,🧛🏻,🧛🏻,🧛🏼,🧛🏻,🧛🏼,🧛🏽,🧛🏻,🧛🏼,🧛🏽,🧛🏾,🧛🏻,🧛🏼,🧛🏽,🧛🏾,🧛🏿 +🧛‍♂️,man vampire vampire twilight dracula goth thirsty,🧛🏻‍♂️,🧛🏻‍♂️,🧛🏼‍♂️,🧛🏻‍♂️,🧛🏼‍♂️,🧛🏽‍♂️,🧛🏻‍♂️,🧛🏼‍♂️,🧛🏽‍♂️,🧛🏾‍♂️,🧛🏻‍♂️,🧛🏼‍♂️,🧛🏽‍♂️,🧛🏾‍♂️,🧛🏿‍♂️ +🧛‍♀️,woman vampire vampire twilight dracula goth thirsty,🧛🏻‍♀️,🧛🏻‍♀️,🧛🏼‍♀️,🧛🏻‍♀️,🧛🏼‍♀️,🧛🏽‍♀️,🧛🏻‍♀️,🧛🏼‍♀️,🧛🏽‍♀️,🧛🏾‍♀️,🧛🏻‍♀️,🧛🏼‍♀️,🧛🏽‍♀️,🧛🏾‍♀️,🧛🏿‍♀️ +🧜,merperson merperson siren the little mermaid ocean vibes ariel,🧜🏻,🧜🏻,🧜🏼,🧜🏻,🧜🏼,🧜🏽,🧜🏻,🧜🏼,🧜🏽,🧜🏾,🧜🏻,🧜🏼,🧜🏽,🧜🏾,🧜🏿 +🧜‍♂️,merman merman aquaman king triton ocean vibes fantasy,🧜🏻‍♂️,🧜🏻‍♂️,🧜🏼‍♂️,🧜🏻‍♂️,🧜🏼‍♂️,🧜🏽‍♂️,🧜🏻‍♂️,🧜🏼‍♂️,🧜🏽‍♂️,🧜🏾‍♂️,🧜🏻‍♂️,🧜🏼‍♂️,🧜🏽‍♂️,🧜🏾‍♂️,🧜🏿‍♂️ +🧜‍♀️,mermaid mermaid siren the little mermaid ocean vibes ariel,🧜🏻‍♀️,🧜🏻‍♀️,🧜🏼‍♀️,🧜🏻‍♀️,🧜🏼‍♀️,🧜🏽‍♀️,🧜🏻‍♀️,🧜🏼‍♀️,🧜🏽‍♀️,🧜🏾‍♀️,🧜🏻‍♀️,🧜🏼‍♀️,🧜🏽‍♀️,🧜🏾‍♀️,🧜🏿‍♀️ +🧝,elf elf lord of the rings fantasy legolas magical,🧝🏻,🧝🏻,🧝🏼,🧝🏻,🧝🏼,🧝🏽,🧝🏻,🧝🏼,🧝🏽,🧝🏾,🧝🏻,🧝🏼,🧝🏽,🧝🏾,🧝🏿 +🧝‍♂️,man elf elf lord of the rings fantasy legolas magical,🧝🏻‍♂️,🧝🏻‍♂️,🧝🏼‍♂️,🧝🏻‍♂️,🧝🏼‍♂️,🧝🏽‍♂️,🧝🏻‍♂️,🧝🏼‍♂️,🧝🏽‍♂️,🧝🏾‍♂️,🧝🏻‍♂️,🧝🏼‍♂️,🧝🏽‍♂️,🧝🏾‍♂️,🧝🏿‍♂️ +🧝‍♀️,woman elf elf lord of the rings fantasy galadriel magical,🧝🏻‍♀️,🧝🏻‍♀️,🧝🏼‍♀️,🧝🏻‍♀️,🧝🏼‍♀️,🧝🏽‍♀️,🧝🏻‍♀️,🧝🏼‍♀️,🧝🏽‍♀️,🧝🏾‍♀️,🧝🏻‍♀️,🧝🏼‍♀️,🧝🏽‍♀️,🧝🏾‍♀️,🧝🏿‍♀️ +🧞,genie genie wish granted aladdin magical three wishes +🧞‍♂️,man genie man genie wish granted aladdin magical three wishes +🧞‍♀️,woman genie woman genie wish granted aladdin magical three wishes +🧟,zombie zombie dead inside apocalypse the walking dead no thoughts head empty +🧟‍♂️,man zombie man zombie dead inside apocalypse the walking dead no thoughts head empty +🧟‍♀️,woman zombie woman zombie dead inside apocalypse the walking dead no thoughts head empty +🧌,troll internet troll don't feed the trolls hater goblin mode +💆,person getting massage self care day spa day treat yourself relax massage,💆🏻,💆🏻,💆🏼,💆🏻,💆🏼,💆🏽,💆🏻,💆🏼,💆🏽,💆🏾,💆🏻,💆🏼,💆🏽,💆🏾,💆🏿 +💆‍♂️,man getting massage self care day spa day treat yourself relax massage,💆🏻‍♂️,💆🏻‍♂️,💆🏼‍♂️,💆🏻‍♂️,💆🏼‍♂️,💆🏽‍♂️,💆🏻‍♂️,💆🏼‍♂️,💆🏽‍♂️,💆🏾‍♂️,💆🏻‍♂️,💆🏼‍♂️,💆🏽‍♂️,💆🏾‍♂️,💆🏿‍♂️ +💆‍♀️,woman getting massage self care day spa day treat yourself relax massage,💆🏻‍♀️,💆🏻‍♀️,💆🏼‍♀️,💆🏻‍♀️,💆🏼‍♀️,💆🏽‍♀️,💆🏻‍♀️,💆🏼‍♀️,💆🏽‍♀️,💆🏾‍♀️,💆🏻‍♀️,💆🏼‍♀️,💆🏽‍♀️,💆🏾‍♀️,💆🏿‍♀️ +💇,person getting haircut new hair new me glow up haircut fresh cut,💇🏻,💇🏻,💇🏼,💇🏻,💇🏼,💇🏽,💇🏻,💇🏼,💇🏽,💇🏾,💇🏻,💇🏼,💇🏽,💇🏾,💇🏿 +💇‍♂️,man getting haircut new hair new me glow up haircut fresh cut,💇🏻‍♂️,💇🏻‍♂️,💇🏼‍♂️,💇🏻‍♂️,💇🏼‍♂️,💇🏽‍♂️,💇🏻‍♂️,💇🏼‍♂️,💇🏽‍♂️,💇🏾‍♂️,💇🏻‍♂️,💇🏼‍♂️,💇🏽‍♂️,💇🏾‍♂️,💇🏿‍♂️ +💇‍♀️,woman getting haircut new hair new me glow up haircut fresh cut,💇🏻‍♀️,💇🏻‍♀️,💇🏼‍♀️,💇🏻‍♀️,💇🏼‍♀️,💇🏽‍♀️,💇🏻‍♀️,💇🏼‍♀️,💇🏽‍♀️,💇🏾‍♀️,💇🏻‍♀️,💇🏼‍♀️,💇🏽‍♀️,💇🏾‍♀️,💇🏿‍♀️ +🚶,person walking hot girl walk on my way leaving steps,🚶🏻,🚶🏻,🚶🏼,🚶🏻,🚶🏼,🚶🏽,🚶🏻,🚶🏼,🚶🏽,🚶🏾,🚶🏻,🚶🏼,🚶🏽,🚶🏾,🚶🏿 +🚶‍♂️,man walking on my way leaving taking a stroll steps,🚶🏻‍♂️,🚶🏻‍♂️,🚶🏼‍♂️,🚶🏻‍♂️,🚶🏼‍♂️,🚶🏽‍♂️,🚶🏻‍♂️,🚶🏼‍♂️,🚶🏽‍♂️,🚶🏾‍♂️,🚶🏻‍♂️,🚶🏼‍♂️,🚶🏽‍♂️,🚶🏾‍♂️,🚶🏿‍♂️ +🚶‍♀️,woman walking hot girl walk on my way leaving steps,🚶🏻‍♀️,🚶🏻‍♀️,🚶🏼‍♀️,🚶🏻‍♀️,🚶🏼‍♀️,🚶🏽‍♀️,🚶🏻‍♀️,🚶🏼‍♀️,🚶🏽‍♀️,🚶🏾‍♀️,🚶🏻‍♀️,🚶🏼‍♀️,🚶🏽‍♀️,🚶🏾‍♀️,🚶🏿‍♀️ +🧍,person standing awkward just standing here waiting patiently npc,🧍🏻,🧍🏻,🧍🏼,🧍🏻,🧍🏼,🧍🏽,🧍🏻,🧍🏼,🧍🏽,🧍🏾,🧍🏻,🧍🏼,🧍🏽,🧍🏾,🧍🏿 +🧍‍♂️,man standing awkward just standing here waiting patiently npc,🧍🏻‍♂️,🧍🏻‍♂️,🧍🏼‍♂️,🧍🏻‍♂️,🧍🏼‍♂️,🧍🏽‍♂️,🧍🏻‍♂️,🧍🏼‍♂️,🧍🏽‍♂️,🧍🏾‍♂️,🧍🏻‍♂️,🧍🏼‍♂️,🧍🏽‍♂️,🧍🏾‍♂️,🧍🏿‍♂️ +🧍‍♀️,woman standing awkward just standing here waiting patiently npc,🧍🏻‍♀️,🧍🏻‍♀️,🧍🏼‍♀️,🧍🏻‍♀️,🧍🏼‍♀️,🧍🏽‍♀️,🧍🏻‍♀️,🧍🏼‍♀️,🧍🏽‍♀️,🧍🏾‍♀️,🧍🏻‍♀️,🧍🏼‍♀️,🧍🏽‍♀️,🧍🏾‍♀️,🧍🏿‍♀️ +🧎,person kneeling on my knees begging simping down bad,🧎🏻,🧎🏻,🧎🏼,🧎🏻,🧎🏼,🧎🏽,🧎🏻,🧎🏼,🧎🏽,🧎🏾,🧎🏻,🧎🏼,🧎🏽,🧎🏾,🧎🏿 +🧎‍♂️,man kneeling on my knees begging simping down bad,🧎🏻‍♂️,🧎🏻‍♂️,🧎🏼‍♂️,🧎🏻‍♂️,🧎🏼‍♂️,🧎🏽‍♂️,🧎🏻‍♂️,🧎🏼‍♂️,🧎🏽‍♂️,🧎🏾‍♂️,🧎🏻‍♂️,🧎🏼‍♂️,🧎🏽‍♂️,🧎🏾‍♂️,🧎🏿‍♂️ +🧎‍♀️,woman kneeling on my knees begging simping down bad,🧎🏻‍♀️,🧎🏻‍♀️,🧎🏼‍♀️,🧎🏻‍♀️,🧎🏼‍♀️,🧎🏽‍♀️,🧎🏻‍♀️,🧎🏼‍♀️,🧎🏽‍♀️,🧎🏾‍♀️,🧎🏻‍♀️,🧎🏼‍♀️,🧎🏽‍♀️,🧎🏾‍♀️,🧎🏿‍♀️ +🧑‍🦯,person with white cane visually impaired blind person accessibility independence,🧑🏻‍🦯,🧑🏻‍🦯,🧑🏼‍🦯,🧑🏻‍🦯,🧑🏼‍🦯,🧑🏽‍🦯,🧑🏻‍🦯,🧑🏼‍🦯,🧑🏽‍🦯,🧑🏾‍🦯,🧑🏻‍🦯,🧑🏼‍🦯,🧑🏽‍🦯,🧑🏾‍🦯,🧑🏿‍🦯 +👨‍🦯,man with white cane visually impaired blind man accessibility independence,👨🏻‍🦯,👨🏻‍🦯,👨🏼‍🦯,👨🏻‍🦯,👨🏼‍🦯,👨🏽‍🦯,👨🏻‍🦯,👨🏼‍🦯,👨🏽‍🦯,👨🏾‍🦯,👨🏻‍🦯,👨🏼‍🦯,👨🏽‍🦯,👨🏾‍🦯,👨🏿‍🦯 +👩‍🦯,woman with white cane visually impaired blind woman accessibility independence,👩🏻‍🦯,👩🏻‍🦯,👩🏼‍🦯,👩🏻‍🦯,👩🏼‍🦯,👩🏽‍🦯,👩🏻‍🦯,👩🏼‍🦯,👩🏽‍🦯,👩🏾‍🦯,👩🏻‍🦯,👩🏼‍🦯,👩🏽‍🦯,👩🏾‍🦯,👩🏿‍🦯 +🧑‍🦼,person in motorized wheelchair wheelchair user accessibility mobility aid disability pride,🧑🏻‍🦼,🧑🏻‍🦼,🧑🏼‍🦼,🧑🏻‍🦼,🧑🏼‍🦼,🧑🏽‍🦼,🧑🏻‍🦼,🧑🏼‍🦼,🧑🏽‍🦼,🧑🏾‍🦼,🧑🏻‍🦼,🧑🏼‍🦼,🧑🏽‍🦼,🧑🏾‍🦼,🧑🏿‍🦼 +👨‍🦼,man in motorized wheelchair wheelchair user accessibility mobility aid disability pride,👨🏻‍🦼,👨🏻‍🦼,👨🏼‍🦼,👨🏻‍🦼,👨🏼‍🦼,👨🏽‍🦼,👨🏻‍🦼,👨🏼‍🦼,👨🏽‍🦼,👨🏾‍🦼,👨🏻‍🦼,👨🏼‍🦼,👨🏽‍🦼,👨🏾‍🦼,👨🏿‍🦼 +👩‍🦼,woman in motorized wheelchair wheelchair user accessibility mobility aid disability pride,👩🏻‍🦼,👩🏻‍🦼,👩🏼‍🦼,👩🏻‍🦼,👩🏼‍🦼,👩🏽‍🦼,👩🏻‍🦼,👩🏼‍🦼,👩🏽‍🦼,👩🏾‍🦼,👩🏻‍🦼,👩🏼‍🦼,👩🏽‍🦼,👩🏾‍🦼,👩🏿‍🦼 +🧑‍🦽,person in manual wheelchair wheelchair user accessibility mobility aid disability pride,🧑🏻‍🦽,🧑🏻‍🦽,🧑🏼‍🦽,🧑🏻‍🦽,🧑🏼‍🦽,🧑🏽‍🦽,🧑🏻‍🦽,🧑🏼‍🦽,🧑🏽‍🦽,🧑🏾‍🦽,🧑🏻‍🦽,🧑🏼‍🦽,🧑🏽‍🦽,🧑🏾‍🦽,🧑🏿‍🦽 +👨‍🦽,man in manual wheelchair wheelchair user accessibility mobility aid disability pride,👨🏻‍🦽,👨🏻‍🦽,👨🏼‍🦽,👨🏻‍🦽,👨🏼‍🦽,👨🏽‍🦽,👨🏻‍🦽,👨🏼‍🦽,👨🏽‍🦽,👨🏾‍🦽,👨🏻‍🦽,👨🏼‍🦽,👨🏽‍🦽,👨🏾‍🦽,👨🏿‍🦽 +👩‍🦽,woman in manual wheelchair wheelchair user accessibility mobility aid disability pride,👩🏻‍🦽,👩🏻‍🦽,👩🏼‍🦽,👩🏻‍🦽,👩🏼‍🦽,👩🏽‍🦽,👩🏻‍🦽,👩🏼‍🦽,👩🏽‍🦽,👩🏾‍🦽,👩🏻‍🦽,👩🏼‍🦽,👩🏽‍🦽,👩🏾‍🦽,👩🏿‍🦽 +🏃,person running running away from my problems gotta go fast cardio,🏃🏻,🏃🏻,🏃🏼,🏃🏻,🏃🏼,🏃🏽,🏃🏻,🏃🏼,🏃🏽,🏃🏾,🏃🏻,🏃🏼,🏃🏽,🏃🏾,🏃🏿 +🏃‍♂️,man running running away from my problems gotta go fast cardio,🏃🏻‍♂️,🏃🏻‍♂️,🏃🏼‍♂️,🏃🏻‍♂️,🏃🏼‍♂️,🏃🏽‍♂️,🏃🏻‍♂️,🏃🏼‍♂️,🏃🏽‍♂️,🏃🏾‍♂️,🏃🏻‍♂️,🏃🏼‍♂️,🏃🏽‍♂️,🏃🏾‍♂️,🏃🏿‍♂️ +🏃‍♀️,woman running running away from my problems gotta go fast cardio,🏃🏻‍♀️,🏃🏻‍♀️,🏃🏼‍♀️,🏃🏻‍♀️,🏃🏼‍♀️,🏃🏽‍♀️,🏃🏻‍♀️,🏃🏼‍♀️,🏃🏽‍♀️,🏃🏾‍♀️,🏃🏻‍♀️,🏃🏼‍♀️,🏃🏽‍♀️,🏃🏾‍♀️,🏃🏿‍♀️ +💃,woman dancing dancing queen feeling myself party time flamenco,💃🏻,💃🏻,💃🏼,💃🏻,💃🏼,💃🏽,💃🏻,💃🏼,💃🏽,💃🏾,💃🏻,💃🏼,💃🏽,💃🏾,💃🏿 +🕺,man dancing saturday night fever disco vibes groovy getting down,🕺🏻,🕺🏻,🕺🏼,🕺🏻,🕺🏼,🕺🏽,🕺🏻,🕺🏼,🕺🏽,🕺🏾,🕺🏻,🕺🏼,🕺🏽,🕺🏾,🕺🏿 +🕴️,person in suit levitating business man levitating mysterious floating making moves,🕴🏻,🕴🏻,🕴🏼,🕴🏻,🕴🏼,🕴🏽,🕴🏻,🕴🏼,🕴🏽,🕴🏾,🕴🏻,🕴🏼,🕴🏽,🕴🏾,🕴🏿 +👯,people with bunny ears twinning besties matching outfits playboy bunny +👯‍♂️,men with bunny ears twinning besties matching outfits playboy bunny +👯‍♀️,women with bunny ears twinning besties matching outfits playboy bunny +🧖,person in steamy room sauna time spa day self care sweating it out,🧖🏻,🧖🏻,🧖🏼,🧖🏻,🧖🏼,🧖🏽,🧖🏻,🧖🏼,🧖🏽,🧖🏾,🧖🏻,🧖🏼,🧖🏽,🧖🏾,🧖🏿 +🧖‍♂️,man in steamy room sauna time spa day self care sweating it out,🧖🏻‍♂️,🧖🏻‍♂️,🧖🏼‍♂️,🧖🏻‍♂️,🧖🏼‍♂️,🧖🏽‍♂️,🧖🏻‍♂️,🧖🏼‍♂️,🧖🏽‍♂️,🧖🏾‍♂️,🧖🏻‍♂️,🧖🏼‍♂️,🧖🏽‍♂️,🧖🏾‍♂️,🧖🏿‍♂️ +🧖‍♀️,woman in steamy room sauna time spa day self care sweating it out,🧖🏻‍♀️,🧖🏻‍♀️,🧖🏼‍♀️,🧖🏻‍♀️,🧖🏼‍♀️,🧖🏽‍♀️,🧖🏻‍♀️,🧖🏼‍♀️,🧖🏽‍♀️,🧖🏾‍♀️,🧖🏻‍♀️,🧖🏼‍♀️,🧖🏽‍♀️,🧖🏾‍♀️,🧖🏿‍♀️ +🧗,person climbing rock climbing adventurer risk taker on the edge,🧗🏻,🧗🏻,🧗🏼,🧗🏻,🧗🏼,🧗🏽,🧗🏻,🧗🏼,🧗🏽,🧗🏾,🧗🏻,🧗🏼,🧗🏽,🧗🏾,🧗🏿 +🧗‍♂️,man climbing rock climbing adventurer risk taker on the edge,🧗🏻‍♂️,🧗🏻‍♂️,🧗🏼‍♂️,🧗🏻‍♂️,🧗🏼‍♂️,🧗🏽‍♂️,🧗🏻‍♂️,🧗🏼‍♂️,🧗🏽‍♂️,🧗🏾‍♂️,🧗🏻‍♂️,🧗🏼‍♂️,🧗🏽‍♂️,🧗🏾‍♂️,🧗🏿‍♂️ +🧗‍♀️,woman climbing rock climbing adventurer risk taker on the edge,🧗🏻‍♀️,🧗🏻‍♀️,🧗🏼‍♀️,🧗🏻‍♀️,🧗🏼‍♀️,🧗🏽‍♀️,🧗🏻‍♀️,🧗🏼‍♀️,🧗🏽‍♀️,🧗🏾‍♀️,🧗🏻‍♀️,🧗🏼‍♀️,🧗🏽‍♀️,🧗🏾‍♀️,🧗🏿‍♀️ +🤺,person fencing fencing en garde sword fight fancy sport +🏇,horse racing horse racing kentucky derby betting fast horse,🏇🏻,🏇🏻,🏇🏼,🏇🏻,🏇🏼,🏇🏽,🏇🏻,🏇🏼,🏇🏽,🏇🏾,🏇🏻,🏇🏼,🏇🏽,🏇🏾,🏇🏿 +⛷️,skier skiing winter sport snow day hitting the slopes +🏂,snowboarder snowboarding shredding gnar winter fun cool tricks,🏂🏻,🏂🏻,🏂🏼,🏂🏻,🏂🏼,🏂🏽,🏂🏻,🏂🏼,🏂🏽,🏂🏾,🏂🏻,🏂🏼,🏂🏽,🏂🏾,🏂🏿 +🏌️,person golfing golfing fore masters tournament country club,🏌🏻,🏌🏻,🏌🏼,🏌🏻,🏌🏼,🏌🏽,🏌🏻,🏌🏼,🏌🏽,🏌🏾,🏌🏻,🏌🏼,🏌🏽,🏌🏾,🏌🏿 +🏌️‍♂️,man golfing golfing fore masters tournament country club,🏌🏻‍♂️,🏌🏻‍♂️,🏌🏼‍♂️,🏌🏻‍♂️,🏌🏼‍♂️,🏌🏽‍♂️,🏌🏻‍♂️,🏌🏼‍♂️,🏌🏽‍♂️,🏌🏾‍♂️,🏌🏻‍♂️,🏌🏼‍♂️,🏌🏽‍♂️,🏌🏾‍♂️,🏌🏿‍♂️ +🏌️‍♀️,woman golfing golfing fore masters tournament country club,🏌🏻‍♀️,🏌🏻‍♀️,🏌🏼‍♀️,🏌🏻‍♀️,🏌🏼‍♀️,🏌🏽‍♀️,🏌🏻‍♀️,🏌🏼‍♀️,🏌🏽‍♀️,🏌🏾‍♀️,🏌🏻‍♀️,🏌🏼‍♀️,🏌🏽‍♀️,🏌🏾‍♀️,🏌🏿‍♀️ +🏄,person surfing surfing catching waves surfer dude beach vibes,🏄🏻,🏄🏻,🏄🏼,🏄🏻,🏄🏼,🏄🏽,🏄🏻,🏄🏼,🏄🏽,🏄🏾,🏄🏻,🏄🏼,🏄🏽,🏄🏾,🏄🏿 +🏄‍♂️,man surfing surfing catching waves surfer dude beach vibes,🏄🏻‍♂️,🏄🏻‍♂️,🏄🏼‍♂️,🏄🏻‍♂️,🏄🏼‍♂️,🏄🏽‍♂️,🏄🏻‍♂️,🏄🏼‍♂️,🏄🏽‍♂️,🏄🏾‍♂️,🏄🏻‍♂️,🏄🏼‍♂️,🏄🏽‍♂️,🏄🏾‍♂️,🏄🏿‍♂️ +🏄‍♀️,woman surfing surfing catching waves surfer girl beach vibes,🏄🏻‍♀️,🏄🏻‍♀️,🏄🏼‍♀️,🏄🏻‍♀️,🏄🏼‍♀️,🏄🏽‍♀️,🏄🏻‍♀️,🏄🏼‍♀️,🏄🏽‍♀️,🏄🏾‍♀️,🏄🏻‍♀️,🏄🏼‍♀️,🏄🏽‍♀️,🏄🏾‍♀️,🏄🏿‍♀️ +🚣,person rowing boat rowing crew team boat race teamwork,🚣🏻,🚣🏻,🚣🏼,🚣🏻,🚣🏼,🚣🏽,🚣🏻,🚣🏼,🚣🏽,🚣🏾,🚣🏻,🚣🏼,🚣🏽,🚣🏾,🚣🏿 +🚣‍♂️,man rowing boat rowing crew team boat race teamwork,🚣🏻‍♂️,🚣🏻‍♂️,🚣🏼‍♂️,🚣🏻‍♂️,🚣🏼‍♂️,🚣🏽‍♂️,🚣🏻‍♂️,🚣🏼‍♂️,🚣🏽‍♂️,🚣🏾‍♂️,🚣🏻‍♂️,🚣🏼‍♂️,🚣🏽‍♂️,🚣🏾‍♂️,🚣🏿‍♂️ +🚣‍♀️,woman rowing boat rowing crew team boat race teamwork,🚣🏻‍♀️,🚣🏻‍♀️,🚣🏼‍♀️,🚣🏻‍♀️,🚣🏼‍♀️,🚣🏽‍♀️,🚣🏻‍♀️,🚣🏼‍♀️,🚣🏽‍♀️,🤦🏾‍♀️,🚣🏻‍♀️,🚣🏼‍♀️,🚣🏽‍♀️,🚣🏾‍♀️,🚣🏿‍♀️ +🏊,person swimming swimming just keep swimming laps pool day,🏊🏻,🏊🏻,🏊🏼,🏊🏻,🏊🏼,🏊🏽,🏊🏻,🏊🏼,🏊🏽,🏊🏾,🏊🏻,🏊🏼,🏊🏽,🏊🏾,🏊🏿 +🏊‍♂️,man swimming swimming just keep swimming laps pool day,🏊🏻‍♂️,🏊🏻‍♂️,🏊🏼‍♂️,🏊🏻‍♂️,🏊🏼‍♂️,🏊🏽‍♂️,🏊🏻‍♂️,🏊🏼‍♂️,🏊🏽‍♂️,🏊🏾‍♂️,🏊🏻‍♂️,🏊🏼‍♂️,🏊🏽‍♂️,🏊🏾‍♂️,🏊🏿‍♂️ +🏊‍♀️,woman swimming swimming just keep swimming laps pool day,🏊🏻‍♀️,🏊🏻‍♀️,🏊🏼‍♀️,🏊🏻‍♀️,🏊🏼‍♀️,🏊🏽‍♀️,🏊🏻‍♀️,🏊🏼‍♀️,🏊🏽‍♀️,🏊🏾‍♀️,🏊🏻‍♀️,🏊🏼‍♀️,🏊🏽‍♀️,🏊🏾‍♀️,🏊🏿‍♀️ +⛹️,person bouncing ball ballin' shooting hoops basketball dribbling,⛹🏻,⛹🏻,⛹🏼,⛹🏻,⛹🏼,⛹🏽,⛹🏻,⛹🏼,⛹🏽,⛹🏾,⛹🏻,⛹🏼,⛹🏽,⛹🏾,⛹🏿 +⛹️‍♂️,man bouncing ball ballin' shooting hoops basketball dribbling,⛹🏻‍♂️,⛹🏻‍♂️,⛹🏼‍♂️,⛹🏻‍♂️,⛹🏼‍♂️,⛹🏽‍♂️,⛹🏻‍♂️,⛹🏼‍♂️,⛹🏽‍♂️,⛹🏾‍♂️,⛹🏻‍♂️,⛹🏼‍♂️,⛹🏽‍♂️,⛹🏾‍♂️,⛹🏿‍♂️ +⛹️‍♀️,woman bouncing ball ballin' shooting hoops basketball dribbling,⛹🏻‍♀️,⛹🏻‍♀️,⛹🏼‍♀️,⛹🏻‍♀️,⛹🏼‍♀️,⛹🏽‍♀️,⛹🏻‍♀️,⛹🏼‍♀️,⛹🏽‍♀️,⛹🏾‍♀️,⛹🏻‍♀️,⛹🏼‍♀️,⛹🏽‍♀️,⛹🏾‍♀️,⛹🏿‍♀️ +🏋️,person lifting weights gym rat lifting heavy beast mode gains,🏋🏻,🏋🏻,🏋🏼,🏋🏻,🏋🏼,🏋🏽,🏋🏻,🏋🏼,🏋🏽,🏋🏾,🏋🏻,🏋🏼,🏋🏽,🏋🏾,🏋🏿 +🏋️‍♂️,man lifting weights gym rat lifting heavy beast mode gains,🏋🏻‍♂️,🏋🏻‍♂️,🏋🏼‍♂️,🏋🏻‍♂️,🏋🏼‍♂️,🏋🏽‍♂️,🏋🏻‍♂️,🏋🏼‍♂️,🏋🏽‍♂️,🏋🏾‍♂️,🏋🏻‍♂️,🏋🏼‍♂️,🏋🏽‍♂️,🏋🏾‍♂️,🏋🏿‍♂️ +🏋️‍♀️,woman lifting weights gym rat lifting heavy beast mode gains,🏋🏻‍♀️,🏋🏻‍♀️,🏋🏼‍♀️,🏋🏻‍♀️,🏋🏼‍♀️,🏋🏽‍♀️,🏋🏻‍♀️,🏋🏼‍♀️,🏋🏽‍♀️,🏋🏾‍♀️,🏋🏻‍♀️,🏋🏼‍♀️,🏋🏽‍♀️,🏋🏾‍♀️,🏋🏿‍♀️ +🚴,person biking biking cycling tour de france on my bike,🚴🏻,🚴🏻,🚴🏼,🚴🏻,🚴🏼,🚴🏽,🚴🏻,🚴🏼,🚴🏽,🚴🏾,🚴🏻,🚴🏼,🚴🏽,🚴🏾,🚴🏿 +🚴‍♂️,man biking biking cycling tour de france on my bike,🚴🏻‍♂️,🚴🏻‍♂️,🚴🏼‍♂️,🚴🏻‍♂️,🚴🏼‍♂️,🚴🏽‍♂️,🚴🏻‍♂️,🚴🏼‍♂️,🚴🏽‍♂️,🚴🏾‍♂️,🚴🏻‍♂️,🚴🏼‍♂️,🚴🏽‍♂️,🚴🏾‍♂️,🚴🏿‍♂️ +🚴‍♀️,woman biking biking cycling tour de france on my bike,🚴🏻‍♀️,🚴🏻‍♀️,🚴🏼‍♀️,🚴🏻‍♀️,🚴🏼‍♀️,🚴🏽‍♀️,🚴🏻‍♀️,🚴🏼‍♀️,🚴🏽‍♀️,🚴🏾‍♀️,🚴🏻‍♀️,🚴🏼‍♀️,🚴🏽‍♀️,🚴🏾‍♀️,🚴🏿‍♀️ +🚵,person mountain biking mountain biking trail ride adventure outdoors,🚵🏻,🚵🏻,🚵🏼,🚵🏻,🚵🏼,🚵🏽,🚵🏻,🚵🏼,🚵🏽,🚵🏾,🚵🏻,🚵🏼,🚵🏽,🚵🏾,🚵🏿 +🚵‍♂️,man mountain biking mountain biking trail ride adventure outdoors,🚵🏻‍♂️,🚵🏻‍♂️,🚵🏼‍♂️,🚵🏻‍♂️,🚵🏼‍♂️,🚵🏽‍♂️,🚵🏻‍♂️,🚵🏼‍♂️,🚵🏽‍♂️,🚵🏾‍♂️,🚵🏻‍♂️,🚵🏼‍♂️,🚵🏽‍♂️,🚵🏾‍♂️,🚵🏿‍♂️ +🚵‍♀️,woman mountain biking mountain biking trail ride adventure outdoors,🚵🏻‍♀️,🚵🏻‍♀️,🚵🏼‍♀️,🚵🏻‍♀️,🚵🏼‍♀️,🚵🏽‍♀️,🚵🏻‍♀️,🚵🏼‍♀️,🚵🏽‍♀️,🚵🏾‍♀️,🚵🏻‍♀️,🚵🏼‍♀️,🚵🏽‍♀️,🚵🏾‍♀️,🚵🏿‍♀️ +🤸,person cartwheeling gymnastics flexible tumbling cartwheel yay,🤸🏻,🤸🏻,🤸🏼,🤸🏻,🤸🏼,🤸🏽,🤸🏻,🤸🏼,🤸🏽,🤸🏾,🤸🏻,🤸🏼,🤸🏽,🤸🏾,🤸🏿 +🤸‍♂️,man cartwheeling gymnastics flexible tumbling cartwheel yay,🤸🏻‍♂️,🤸🏻‍♂️,🤸🏼‍♂️,🤸🏻‍♂️,🤸🏼‍♂️,🤸🏽‍♂️,🤸🏻‍♂️,🤸🏼‍♂️,🤸🏽‍♂️,🤸🏾‍♂️,🤸🏻‍♂️,🤸🏼‍♂️,🤸🏽‍♂️,🤸🏾‍♂️,🤸🏿‍♂️ +🤸‍♀️,woman cartwheeling gymnastics flexible tumbling cartwheel yay,🤸🏻‍♀️,🤸🏻‍♀️,🤸🏼‍♀️,🤸🏻‍♀️,🤸🏼‍♀️,🤸🏽‍♀️,🤸🏻‍♀️,🤸🏼‍♀️,🤸🏽‍♀️,🤸🏾‍♀️,🤸🏻‍♀️,🤸🏼‍♀️,🤸🏽‍♀️,🤸🏾‍♀️,🤸🏿‍♀️ +🤼,people wrestling wwe wrestling smackdown grappling fighting +🤼‍♂️,men wrestling wwe wrestling smackdown grappling fighting +🤼‍♀️,women wrestling wwe wrestling smackdown grappling fighting +🤽,person playing water polo water polo swimming pool sports team game,🤽🏻,🤽🏻,🤽🏼,🤽🏻,🤽🏼,🤽🏽,🤽🏻,🤽🏼,🤽🏽,🤽🏾,🤽🏻,🤽🏼,🤽🏽,🤽🏾,🤽🏿 +🤽‍♂️,man playing water polo water polo swimming pool sports team game,🤽🏻‍♂️,🤽🏻‍♂️,🤽🏼‍♂️,🤽🏻‍♂️,🤽🏼‍♂️,🤽🏽‍♂️,🤽🏻‍♂️,🤽🏼‍♂️,🤽🏽‍♂️,🤽🏾‍♂️,🤽🏻‍♂️,🤽🏼‍♂️,🤽🏽‍♂️,🤽🏾‍♂️,🤽🏿‍♂️ +🤽‍♀️,woman playing water polo water polo swimming pool sports team game,🤽🏻‍♀️,🤽🏻‍♀️,🤽🏼‍♀️,🤽🏻‍♀️,🤽🏼‍♀️,🤽🏽‍♀️,🤽🏻‍♀️,🤽🏼‍♀️,🤽🏽‍♀️,🤽🏾‍♀️,🤽🏻‍♀️,🤽🏼‍♀️,🤽🏽‍♀️,🤽🏾‍♀️,🤽🏿‍♀️ +🤾,person playing handball handball team sport throwing goal,🤾🏻,🤾🏻,🤾🏼,🤾🏻,🤾🏼,🤾🏽,🤾🏻,🤾🏼,🤾🏽,🤾🏾,🤾🏻,🤾🏼,🤾🏽,🤾🏾,🤾🏿 +🤾‍♂️,man playing handball handball team sport throwing goal,🤾🏻‍♂️,🤾🏻‍♂️,🤾🏼‍♂️,🤾🏻‍♂️,🤾🏼‍♂️,🤾🏽‍♂️,🤾🏻‍♂️,🤾🏼‍♂️,🤾🏽‍♂️,🤾🏾‍♂️,🤾🏻‍♂️,🤾🏼‍♂️,🤾🏽‍♂️,🤾🏾‍♂️,🤾🏿‍♂️ +🤾‍♀️,woman playing handball handball team sport throwing goal,🤾🏻‍♀️,🤾🏻‍♀️,🤾🏼‍♀️,🤾🏻‍♀️,🤾🏼‍♀️,🤾🏽‍♀️,🤾🏻‍♀️,🤾🏼‍♀️,🤾🏽‍♀️,🤾🏾‍♀️,🤾🏻‍♀️,🤾🏼‍♀️,🤾🏽‍♀️,🤾🏾‍♀️,🤾🏿‍♀️ +🤹,person juggling juggling multi-tasking keeping it all in the air talent,🤹🏻,🤹🏻,🤹🏼,🤹🏻,🤹🏼,🤹🏽,🤹🏻,🤹🏼,🤹🏽,🤹🏾,🤹🏻,🤹🏼,🤹🏽,🤹🏾,🤹🏿 +🤹‍♂️,man juggling juggling multi-tasking keeping it all in the air talent,🤹🏻‍♂️,🤹🏻‍♂️,🤹🏼‍♂️,🤹🏻‍♂️,🤹🏼‍♂️,🤹🏽‍♂️,🤹🏻‍♂️,🤹🏼‍♂️,🤹🏽‍♂️,🤹🏾‍♂️,🤹🏻‍♂️,🤹🏼‍♂️,🤹🏽‍♂️,🤹🏾‍♂️,🤹🏿‍♂️ +🤹‍♀️,woman juggling juggling multi-tasking keeping it all in the air talent,🤹🏻‍♀️,🤹🏻‍♀️,🤹🏼‍♀️,🤹🏻‍♀️,🤹🏼‍♀️,🤹🏽‍♀️,🤹🏻‍♀️,🤹🏼‍♀️,🤹🏽‍♀️,🤹🏾‍♀️,🤹🏻‍♀️,🤹🏼‍♀️,🤹🏽‍♀️,🤹🏾‍♀️,🤹🏿‍♀️ +🧘,person in lotus position yoga zen meditating chill vibes namaste,🧘🏻,🧘🏻,🧘🏼,🧘🏻,🧘🏼,🧘🏽,🧘🏻,🧘🏼,🧘🏽,🧘🏾,🧘🏻,🧘🏼,🧘🏽,🧘🏾,🧘🏿 +🧘‍♂️,man in lotus position yoga zen meditating chill vibes namaste,🧘🏻‍♂️,🧘🏻‍♂️,🧘🏼‍♂️,🧘🏻‍♂️,🧘🏼‍♂️,🧘🏽‍♂️,🧘🏻‍♂️,🧘🏼‍♂️,🧘🏽‍♂️,🧘🏾‍♂️,🧘🏻‍♂️,🧘🏼‍♂️,🧘🏽‍♂️,🧘🏾‍♂️,🧘🏿‍♂️ +🧘‍♀️,woman in lotus position yoga zen meditating chill vibes namaste,🧘🏻‍♀️,🧘🏻‍♀️,🧘🏼‍♀️,🧘🏻‍♀️,🧘🏼‍♀️,🧘🏽‍♀️,🧘🏻‍♀️,🧘🏼‍♀️,🧘🏽‍♀️,🧘🏾‍♀️,🧘🏻‍♀️,🧘🏼‍♀️,🧘🏽‍♀️,🧘🏾‍♀️,🧘🏿‍♀️ +🛀,person taking bath bath time self care relax bubble bath,🛀🏻,🛀🏻,🛀🏼,🛀🏻,🛀🏼,🛀🏽,🛀🏻,🛀🏼,🛀🏽,🛀🏾,🛀🏻,🛀🏼,🛀🏽,🛀🏾,🛀🏿 +🛌,person in bed nap time sleepyhead going to bed i'd rather be,🛌🏻,🛌🏻,🛌🏼,🛌🏻,🛌🏼,🛌🏽,🛌🏻,🛌🏼,🛌🏽,🛌🏾,🛌🏻,🛌🏼,🛌🏽,🛌🏾,🛌🏿 +🧑‍🤝‍🧑,people holding hands besties ride or die couple goals holding hands,🧑🏻‍🤝‍🧑🏻,🧑🏻‍🤝‍🧑🏻,🧑🏻‍🤝‍🧑🏼,🧑🏻‍🤝‍🧑🏻,🧑🏻‍🤝‍🧑🏼,🧑🏻‍🤝‍🧑🏽,🧑🏻‍🤝‍🧑🏻,🧑🏻‍🤝‍🧑🏼,🧑🏻‍🤝‍🧑🏽,🧑🏻‍🤝‍🧑🏾,🧑🏻‍🤝‍🧑🏻,🧑🏼‍🤝‍🧑🏻,🧑🏼‍🤝‍🧑🏼,🧑🏼‍🤝‍🧑🏽,🧑🏼‍🤝‍🧑🏾,🧑🏼‍🤝‍🧑🏿 +👭,women holding hands besties girlfriends couple goals holding hands wlw,👭🏻,👭🏻,👩🏻‍🤝‍👩🏼,👭🏻,👩🏻‍🤝‍👩🏼,👩🏻‍🤝‍👩🏽,👭🏻,👩🏻‍🤝‍👩🏼,👩🏻‍🤝‍👩🏽,👩🏻‍🤝‍👩🏾,👭🏻,👩🏼‍🤝‍👩🏻,👩🏼‍🤝‍👩🏼,👩🏼‍🤝‍👩🏽,👩🏼‍🤝‍👩🏾,👩🏼‍🤝‍👩🏿 +👫,woman and man holding hands couple goals cute couple holding hands straight,👫🏻,👫🏻,👩🏻‍🤝‍👨🏼,👫🏻,👩🏻‍🤝‍👨🏼,👩🏻‍🤝‍👨🏽,👫🏻,👩🏻‍🤝‍👨🏼,👩🏻‍🤝‍👨🏽,👩🏻‍🤝‍👨🏾,👫🏻,👩🏼‍🤝‍👨🏻,👩🏼‍🤝‍👨🏼,👩🏼‍🤝‍👨🏽,👩🏼‍🤝‍👨🏾,👩🏼‍🤝‍👨🏿 +👬,men holding hands besties boyfriends couple goals holding hands mlm,👬🏻,👬🏻,👨🏻‍🤝‍👨🏼,👬🏻,👨🏻‍🤝‍👨🏼,👨🏻‍🤝‍👨🏽,👬🏻,👨🏻‍🤝‍👨🏼,👨🏻‍🤝‍👨🏽,👨🏻‍🤝‍👨🏾,👬🏻,👨🏼‍🤝‍👨🏻,👨🏼‍🤝‍👨🏼,👨🏼‍🤝‍👨🏽,👨🏼‍🤝‍👨🏾,👨🏼‍🤝‍👨🏿 +💏,kiss kissing making out smooches pda love,💏🏻,💏🏻,💏🏼,💏🏻,💏🏼,💏🏽,💏🏻,💏🏼,💏🏽,💏🏾,💏🏻,💏🏼,💏🏽,💏🏾,💏🏿 +💑,couple with heart couple in love relationship goals soulmate together,💑🏻,💑🏻,💑🏼,💑🏻,💑🏼,💑🏽,💑🏻,💑🏼,💑🏽,💑🏾,💑🏻,💑🏼,💑🏽,💑🏾,💑🏿 +👪,family family time wholesome family goals parenthood,👨‍👩‍👦,👨‍👩‍👦,👨‍👩‍👧,👨‍👩‍👧‍👦,👨‍👩‍👦‍👦,👨‍👩‍👧‍👧,👨‍👨‍👦,👨‍👨‍👧,👨‍👨‍👧‍👦,👨‍👨‍👦‍👦,👨‍👨‍👧‍👧,👩‍👩‍👦,👩‍👩‍👧,👩‍👩‍👧‍👦,👩‍👩‍👦‍👦,👩‍👩‍👧‍👧 +🗣️,speaking head spitting facts ranting big news listen up +👤,bust in silhouette anonymous profile pic incognito mysterious stranger +👥,busts in silhouette the squad group chat clique team +🫂,people hugging hugs comfort support here for you sending love +👣,footprints hot girl walk steps journey following in footsteps diff --git a/emojipicker/src/main/res/raw/emoji_category_symbols.csv b/emojipicker/src/main/res/raw/emoji_category_symbols.csv new file mode 100644 index 00000000..87165e22 --- /dev/null +++ b/emojipicker/src/main/res/raw/emoji_category_symbols.csv @@ -0,0 +1,210 @@ +🏧,ATM sign cash machine get money broke withdraw cash out +🚮,litter in bin sign clean up do your part keep it clean don't litter trash can +🚰,potable water drinking water stay hydrated h2o safe to drink water fountain +♿,wheelchair symbol accessibility disability pride handicap accessible wheelchair user inclusive +🚹,men’s room men's restroom bathroom boys room toilet gotta go +🚺,women’s room women's restroom bathroom ladies room toilet gotta go +🚻,restroom bathroom toilet washroom unisex public toilet +🚼,baby symbol baby changing station new parent diaper change got a baby family friendly +🚾,water closet toilet bathroom restroom WC loo +🛂,passport control airport security border control travel vacation customs +🛃,customs airport security border patrol declaration traveling smuggling +🛄,baggage claim airport luggage traveling lost baggage where's my stuff +🛅,left luggage luggage storage travel hack bag drop holding bags airport services +⚠️,warning red flag proceed with caution be careful sketchy warning sign +🚸,children crossing slow down school zone watch out for kids careful driving pedestrian crossing +⛔,no entry do not enter access denied wrong way restricted area stop +🚫,prohibited not allowed forbidden it's a no restricted banned +🚳,no bicycles no bikes allowed dismount walk your bike restricted path cyclists +🚭,no smoking no smoking zone vaping included put it out healthy lungs smoke free +🚯,no littering keep our planet clean trash goes in the bin don't be a litterbug eco-friendly clean environment +🚱,non-potable water do not drink unsafe water not for drinking contaminated use with caution +🚷,no pedestrians no walking use sidewalk danger restricted access cars only +📵,no mobile phones no phone zone unplug digital detox be present put it away +🔞,no one under eighteen 18+ adults only mature content restricted id check +☢️,radioactive nuclear toxic fallout danger zone hazardous +☣️,biohazard zombie outbreak pandemic toxic danger quarantine +⬆️,up arrow level up this scroll up increase going up +↗️,up-right arrow stonks growth going up diagonal on the rise +➡️,right arrow next swipe right this way proceed move it +↘️,down-right arrow not stonks decrease going down on the decline oops +⬇️,down arrow scroll down download this link below decrease +↙️,down-left arrow also not stonks big decrease uh oh going down fast sharp decline +⬅️,left arrow previous swipe left go back this way back +↖️,up-left arrow increase again recovering look up diagonal up improvement +↕️,up-down arrow indecisive what's the move up or down fluctuating choices +↔️,left-right arrow which way choices options left or right decision time +↩️,right arrow curving left u-turn go back change of plans nevermind take it back +↪️,left arrow curving right on second thought change direction new plan forward next step +⤴️,right arrow curving up level up let's go moving on up progress next stage +⤵️,right arrow curving down dip down but not out slight decrease going down step down +🔃,clockwise vertical arrows refresh loading syncing again processing +🔄,counterclockwise arrows button do-over try again uno reverse refresh page start over +🔙,BACK arrow take me back rewind i miss it nostalgia go back +🔚,END arrow it's over the end fin that's all folks game over +🔛,ON! arrow it's on let's go game time activated enabled +🔜,SOON arrow coming soon can't wait almost there hype stay tuned +🔝,TOP arrow top tier slay number one A+ the best +🛐,place of worship praying church mosque temple blessed +⚛️,atom symbol science nerd big bang theory physics atomic +🕉️,om zen meditation yoga spiritual peaceful +✡️,star of David jewish hanukkah synagogue mazel tov israel +☸️,wheel of dharma buddhism dharma eightfold path enlightenment reincarnation +☯️,yin yang balance harmony duality good and evil perfectly balanced +✝️,latin cross jesus christianity church faith bless up +☦️,orthodox cross orthodox christianity eastern orthodox faith church religious symbol +☪️,star and crescent islam muslim ramadan mosque eid mubarak +☮️,peace symbol peace and love good vibes only make love not war hippie chill +🕎,menorah hanukkah jewish holiday festival of lights dreidel channukah +🔯,dotted six-pointed star spiritual mystical esoteric occult symbol +🪯,khanda sikhism sikh symbol waheguru punjabi gurdwara +♈,Aries aries gang fire sign ram zodiac astrology +♉,Taurus taurus season earth sign bull zodiac astrology +♊,Gemini gemini energy air sign twins zodiac astrology +♋,Cancer cancer szn water sign crab zodiac astrology +♌,Leo leo energy fire sign lion zodiac astrology +♍,Virgo virgo vibes earth sign maiden zodiac astrology +♎,Libra libra season air sign scales zodiac astrology +♏,Scorpio scorpio energy water sign scorpion zodiac astrology +♐,Sagittarius sagittarius vibes fire sign archer zodiac astrology +♑,Capricorn capricorn season earth sign sea-goat zodiac astrology +♒,Aquarius aquarius energy air sign water-bearer zodiac astrology +♓,Pisces pisces season water sign fish zodiac astrology +⛎,Ophiuchus 13th zodiac serpent-bearer new zodiac astrology controversial +🔀,shuffle tracks button mix it up random playlist spotify shuffle surprise me on shuffle +🔁,repeat button on repeat again and again obsessed with this song replay loop +🔂,repeat single button stuck on this one favorite song just this one loop one replay single +▶️,play button press play let's go start youtube music +⏩,fast-forward button skip ahead get to the good part tl;dr move it along fast forward +⏭️,next track button next song skip on to the next new track next +⏯️,play or pause button play pause take a break hold on continue stop and go +◀️,reverse button go back previous rewind let's see that again back up +⏪,fast reverse button rewind fast go way back missed it fast rewind backtrack +⏮️,last track button previous song go back one last track the one before previous +🔼,upwards button scroll up go up increase higher level up +⏫,fast up button scroll faster all the way up to the top zoom up quick scroll +🔽,downwards button scroll down go down decrease lower see below +⏬,fast down button scroll to bottom all the way down fast scroll quick down end of page +⏸️,pause button hold up wait a minute take a break pause intermission +⏹️,stop button stop that's enough end it cut it's over +⏺️,record button recording now live on air rolling capture this +⏏️,eject button get me out of here yeet eject leave exit +🎦,cinema movie night at the movies film popcorn time feature presentation +🔅,dim button lower brightness too bright chill lighting mood lighting dimmer +🔆,bright button turn up the brightness so bright sunny light mode brighter +📶,antenna bars signal strength full bars wifi connection reception 5g +🛜,wireless wifi internet connection hotspot stay connected online +📳,vibration mode on vibrate silent but deadly buzz buzz notification phone mode +📴,mobile phone off do not disturb unplugged offline no service powered off +♀️,female sign girl power venus woman she/her feminine +♂️,male sign boy power mars man he/him masculine +⚧️,transgender symbol trans rights trans pride protect trans lives gender identity transgender +✖️,multiply times multiplication and collab x marks the spot +➕,plus and addition more positive add +➖,minus less subtraction negative take away remove +➗,divide division split share separate half +🟰,heavy equals sign equals same makes is total +♾️,infinity forever to infinity and beyond endless love no limit +‼️,double exclamation mark omg for real big news urgent attention +⁉️,exclamation question mark what the heck seriously? are you kidding for real? huh +❓,red question mark question huh what confused curious +❔,white question mark question mark curiosity wondering ask what if +❕,white exclamation mark wow omg surprise yay exciting +❗,red exclamation mark important alert breaking news emergency urgent +〰️,wavy dash approximately ish vibe wavy squiggle +💱,currency exchange travel money foreign exchange money swap fx exchange rate +💲,heavy dollar sign money talks cash rich making bank dollar sign +⚕️,medical symbol doctor nurse healthcare medicine rod of asclepius +♻️,recycling symbol save the planet recycle go green sustainable eco-friendly +⚜️,fleur-de-lis fancy new orleans saints royal french symbol +🔱,trident emblem aquaman poseidon maserati weapon sea god +📛,name badge hello my name is nametag introduction who are you badge +🔰,Japanese symbol for beginner newbie noob just starting beginner learning +⭕,hollow red circle correct you got it circle this focus here target +✅,check mark button done approved yes verified task complete +☑️,check box with check checked off completed to-do list got it yes +✔️,check mark correct fact check true you're right yup +❌,cross mark incorrect wrong nope denied canceled +❎,cross mark button no decline cancel wrong answer fail +➰,curly loop loop de loop swirly doodle fancy decorative +➿,double curly loop voicemail missed call phone tag curly fancy loop +〽️,part alternation mark japanese music symbol karaoke sing along music note song part +✳️,eight-spoked asterisk sparkle shiny special note important asterisk +✴️,eight-pointed star boom pow sparkle magic starburst +❇️,sparkle shiny clean new glitter magic +©️,copyright all rights reserved don't steal my work intellectual property credit the creator +®️,registered official brand trademark registered legit authentic +™️,trade mark brand unofficial tm my thing not registered +🔠,input latin uppercase all caps yelling caps lock uppercase letters +🔡,input latin lowercase no caps chill typing lowercase letters abc +🔢,input numbers 123 math digits count numbers +🔣,input symbols &%$ symbols special characters password punctuation +🔤,input latin letters alphabet abc's typing words letters +🅰️,A button (blood type) type A blood type A+ A- medical +🆎,AB button (blood type) type AB blood type AB+ AB- medical +🅱️,B button (blood type) type B blood type B+ B- medical +🆑,CL button clear delete erase start over reset +🆒,COOL button cool story bro that's cool chill awesome rad +🆓,FREE button free stuff giveaway no cost on the house freebie +ℹ️,information for your info the more you know details info FYI +🆔,ID button show me your ID identification license who are you id card +Ⓜ️,circled M metro subway underground public transport train +🆕,NEW button new post update fresh content what's new brand new +🆖,NG button no good fail not working bad take try again +🅾️,O button (blood type) type O blood type O+ O- universal donor +🆗,OK button okay bet sounds good alright got it +🅿️,P button parking park here lot full valet car park +🆘,SOS button help me emergency in trouble send help mayday +🆙,UP! button what's up level up let's go upgrade up +🆚,VS button versus battle 1v1 fight challenge +🈁,Japanese “here” button here kokodesu i'm here location you are here +🈂️,Japanese “service charge” button service charge tip gratuity extra fee sa +🈷️,Japanese “monthly amount” button monthly fee subscription tsuki per month rent +🈶,Japanese “not free of charge” button paid yuryo not free costs money chargeable +🈯,Japanese “reserved” button reserved booked taken saved seat shitei +🉐,Japanese “bargain” button deal sale bargain toku good deal +🈹,Japanese “discount” button discount on sale cheaper waribiki coupon +🈚,Japanese “free of charge” button free muryo no charge gratis on the house +🈲,Japanese “prohibited” button prohibited kinshi forbidden not allowed banned +🉑,Japanese “acceptable” button acceptable kano okay can do permissible +🈸,Japanese “application” button apply now application moshikomi sign up form +🈴,Japanese “passing grade” button passed goukaku you passed good job A+ +🈳,Japanese “vacancy” button vacancy aki room available empty we have space +㊗️,Japanese “congratulations” button congrats shuku celebration you did it well done +㊙️,Japanese “secret” button secret himitsu top secret classified spill the tea +🈺,Japanese “open for business” button open eigyou we are open come in business hours +🈵,Japanese “no vacancy” button full man no rooms sold out fully booked +🔴,red circle recording live now red dot stop danger +🟠,orange circle warning caution stand by almost orange +🟡,yellow circle be aware caution slow down yellow light yellow +🟢,green circle go online available green light good to go +🔵,blue circle blue dot info verified sad blue +🟣,purple circle purple royalty luxury posh fancy +🟤,brown circle brown chocolate earthy wood neutral +⚫,black circle black dot void darkness black hole end +⚪,white circle white dot blank empty pure new beginning +🟥,red square stop button red danger warning alert +🟧,orange square orange caution bright vibrant energetic +🟨,yellow square yellow happy sunshine caution bright +🟩,green square green go nature eco-friendly correct +🟦,blue square blue calm sad tech corporate +🟪,purple square purple luxury creative magic royalty +🟫,brown square brown earthy chocolate stable boring +⬛,black large square black square dark mode void censored redacted +⬜,white large square white square light mode blank canvas empty pure +◼️,black medium square black square bullet point dark simple box +◻️,white medium square white square checkbox light simple box +◾,black medium-small square small black square bullet dot minimal dark +◽,white medium-small square small white square checkbox dot minimal light +▪️,black small square tiny black square dot bullet point minimalist dark +▫️,white small square tiny white square dot bullet point minimalist light +🔶,large orange diamond orange diamond warning important caution gem +🔷,large blue diamond blue diamond crypto gem important cool +🔸,small orange diamond small orange diamond bullet point less important note gem +🔹,small blue diamond small blue diamond bullet point note info gem +🔺,red triangle pointed up upvote increase play button important warning +🔻,red triangle pointed down downvote decrease warning caution look down +💠,diamond with a dot fancy sparkly gem special pretty +🔘,radio button select this option choice click me button +🔳,white square button button press me ui element click simple +🔲,black square button button press me ui element click dark mode diff --git a/emojipicker/src/main/res/raw/emoji_category_travel_places.csv b/emojipicker/src/main/res/raw/emoji_category_travel_places.csv new file mode 100644 index 00000000..b20459a0 --- /dev/null +++ b/emojipicker/src/main/res/raw/emoji_category_travel_places.csv @@ -0,0 +1,218 @@ +🌍,globe showing Europe-Africa motherland world travel international earth +🌎,globe showing Americas the americas world travel international earth +🌏,globe showing Asia-Australia down under east asia world travel international +🌐,globe with meridians internet www global network connection worldwide +🗺️,world map adventure awaits travel plans where to next explore wanderlust +🗾,map of Japan anime land tokyo travel asia otaku +🧭,compass find your way true north direction explorer adventure +🏔️,snow-capped mountain winter wonderland skiing snowboarding adventure cold +⛰️,mountain hiking adventure nature outdoors climb explore +🌋,volcano the floor is lava eruption danger hot hot hot disaster +🗻,mount fuji japan iconic landmark travel fujisan beautiful view +🏕️,camping outdoors s'mores campfire tent nature vibes adventure +🏖️,beach with umbrella vacation mode hot girl summer beach day chilling relaxing +🏜️,desert dry hot sahara dune desolate sandy +🏝️,desert island castaway survivor paradise lost alone tropical +🏞️,national park get outside nature lover hiking trail beautiful scenery preservation +🏟️,stadium game day sports concert arena big event crowd +🏛️,classical building dark academia history museum government art ancient +🏗️,building construction under construction work in progress development building new things crane +🧱,brick wall thicc solid building material laying bricks +🪨,rock dwayne the rock johnson solid sturdy nature geology +🪵,wood log cabin vibes cozy nature lumberjack morning wood +🛖,hut simple life rustic village primitive shelter small house +🏘️,houses suburbia neighborhood community cookie cutter living +🏚️,derelict house haunted house spooky abandoned fixer upper creepy +🏠,house home sweet home staycation address new house crib +🏡,house with garden cottagecore dream home suburb life cozy yard +🏢,office building corporate life 9 to 5 the office hustle city life +🏣,Japanese post office japan mail post office send a letter package +🏤,post office snail mail sending letters package delivery mailbox post +🏥,hospital get well soon doctor's office emergency room healthcare sick +🏦,bank making money secure the bag broke rich finances +🏨,hotel vacation travel check in room service getaway holiday +🏩,love hotel sneaky link cuffing season hookup no tell hotel rendezvous +🏪,convenience store 7-eleven late night snack run bodegacore junk food slurpee +🏫,school back to school no more pencils school's out homework education teacher +🏬,department store shopping spree retail therapy mall day treat yourself window shopping +🏭,factory industrial revolution working class pollution manufacturing industry +🏯,Japanese castle shogun samurai history japan travel fortress +🏰,castle fairytale princess disney royalty medieval fortress +💒,wedding getting married i do bride and groom tying the knot celebration +🗼,Tokyo tower japan travel city landmark eiffel tower dupe tokyo +🗽,Statue of Liberty new york city usa freedom america landmark nyc +⛪,church sunday service wedding funeral faith building religion amen +🕌,mosque islam ramadan prayer eid jummah muslim +🛕,hindu temple mandir diwali hinduism prayer worship puja +🕍,synagogue judaism shabbat hanukkah torah prayer jewish +⛩️,shinto shrine japan torii gate kami spirits worship shinto +🕋,kaaba mecca islam hajj pilgrimage qibla muslim +⛲,fountain make a wish water feature park relaxing pretty wishing well +⛺,tent camping outdoors festival glamping roughing it campsite +🌁,foggy san francisco golden gate bridge misty low visibility weather fog +🌃,night with stars city lights stargazing late night vibes aesthetic skyline +🏙️,cityscape big city life concrete jungle downtown urban metropolis +🌄,sunrise over mountains golden hour morning hike beautiful view early bird adventure +🌅,sunrise good morning new day fresh start beautiful sky beach dawn +🌆,cityscape at dusk sunset vibes golden hour city lights evening skyline +🌇,sunset golden hour beautiful ending chasing sunsets beach vibes aesthetic +🌉,bridge at night city lights skyline beautiful view romantic spot architecture bridge +♨️,hot springs onsen japan spa day relax unwind hot tub +🎠,carousel horse amusement park childhood memories merry go round fun fair carnival +🛝,playground slide childhood fun park slide playground weee +🎡,ferris wheel coachella amusement park carnival date night view from the top festival +🎢,roller coaster theme park adrenaline junkie thrill ride scream fun six flags +💈,barber pole fresh cut haircut fade trim barbershop new do +🎪,circus tent clown show big top the greatest showman entertainment circus clown +🚂,locomotive thomas the tank engine all aboard train vintage choo choo steam engine +🚃,railway car train travel passenger public transport commute coach +🚄,high-speed train bullet train fast travel efficient public transport modern +🚅,bullet train shinkansen japan fast efficient modern travel +🚆,train public transport commute travel on the rails subway amtrak +🚇,metro subway underground tube public transport city life mta +🚈,light rail tram streetcar public transport city commute above ground trolley +🚉,station train station platform waiting for the train next stop commute grand central +🚊,tram streetcar city transport public trolley commute cable car +🚝,monorail disney world future tech elevated train public transport simpsons +🚞,mountain railway scenic route beautiful view mountain travel train cog railway +🚋,tram car trolley city tour public transport vintage ride streetcar +🚌,bus public transport commute school bus the wheels on the bus city travel greyhound +🚍,oncoming bus watch out traffic commute public transport road danger +🚎,trolleybus electric bus public transport eco-friendly city travel trolley +🚐,minibus shuttle van group travel small bus airport transfer van life +🚑,ambulance emergency help 911 hospital first responder siren +🚒,fire engine fire truck emergency hero firefighter rescue siren +🚓,police car cops 5-0 chase sirens law enforcement police +🚔,oncoming police car feds are here sirens flashing lights busted pulled over +🚕,taxi cab uber lyft ride share getting a ride hail a cab +🚖,oncoming taxi cab's here your ride has arrived on my way taxi pickup +🚗,automobile car road trip driving vroom vroom new car vehicle +🚘,oncoming automobile watch out traffic driving road trip zoom head on +🚙,sport utility vehicle suv family car road trip adventure jeep 4x4 +🛻,pickup truck country vibes truck life hauling ford chevy cybertruck +🚚,delivery truck amazon prime package delivery mail truck moving truck ups +🚛,articulated lorry semi truck big rig trucker convoy long haul 18-wheeler +🚜,tractor farm life country yeehaw agriculture harvesting john deere +🏎️,racing car fast and furious need for speed formula 1 race day nascar +🏍️,motorcycle biker harley davidson riding free hog life sturgis +🛵,motor scooter vespa city travel cute ride italy vibes moped scootin +🦽,manual wheelchair accessibility disability pride mobility aid independence pushing forward +🦼,motorized wheelchair accessibility mobility scooter disability pride freedom power chair +🛺,auto rickshaw tuk-tuk asia travel city ride cheap taxi three-wheeler +🚲,bicycle biking cycling eco friendly exercise healthy lifestyle tour de france +🛴,kick scooter scooter life city travel last mile bird lime e-scooter +🛹,skateboard sk8r boi tony hawk ollie kickflip shredding skate park +🛼,roller skate roller disco groovy 70s vibes skating roller derby quad skates +🚏,bus stop waiting for the bus commute public transport bus route shelter +🛣️,motorway highway road trip life is a highway open road freeway interstate +🛤️,railway track train tracks on the wrong side of the tracks journey adventure railroad +🛢️,oil drum oil prices gas prices fossil fuels industry pollution barrel +⛽,fuel pump gas station filling up expensive gas road trip pit stop petrol +🛞,wheel new wheels tire car part reinvention of the wheel rims +🚨,police car light wee woo wee woo siren emergency alert breaking news flashing +🚥,horizontal traffic light red light green light stop and go traffic signal intersection driving +🚦,vertical traffic light red yellow green stop go traffic signal rules driving +🛑,stop sign stop it get some help enough collaboration and listen halt octagon +🚧,construction under construction work in progress delays ahead men at work road work +⚓,anchor navy nautical sailor you're my anchor grounded stable +🛟,ring buoy life saver help rescue SOS in trouble sinking lifeguard +⛵,sailboat sailing yachting smooth sailing on the water relaxing boat +🛶,canoe paddling lake life river trip adventure outdoors kayak +🚤,speedboat fast boat lake day fun on the water wakeboarding motorboat +🛳️,passenger ship cruise ship vacation bon voyage all aboard floating hotel ocean liner +⛴️,ferry boat travel commute water taxi island hopping ferry boat +🛥️,motor boat yacht luxury living rich af boat life fancy megayacht +🚢,ship i'm on a boat titanic shipping cargo container ship sea travel +✈️,airplane travel mode vacation wanderlust flying jet lag airport +🛩️,small airplane private jet cessna propeller plane local flight charter +🛫,airplane departure takeoff wheels up bye see ya later adventure begins bon voyage +🛬,airplane arrival landing touchdown welcome home back from vacation arrivals +🪂,parachute skydiving adrenaline rush free falling extreme sports safe landing paratrooper +💺,seat take a seat window or aisle airplane seat reserved buckle up +🚁,helicopter chopper get to the choppa private ride aerial view rescue helo +🚟,suspension railway unique transport elevated train wuppertal germany cool railway +🚠,mountain cableway ski lift gondola mountain view scenic ride alps cable car +🚡,aerial tramway cable car scenic view city view tourist attraction high up gondola +🛰️,satellite space technology communication GPS starlink orbit spy +🚀,rocket to the moon stonks diamond hands spacex blast off nasa +🛸,flying saucer ufo aliens i want to believe area 51 x-files Roswell +🛎️,bellhop bell room service hotel lobby concierge tip me front desk +🧳,luggage packing for vacation travel baggage suitcase carry-on checked bag +⌛,hourglass done time's up game over deadline met it's finished too late +⏳,hourglass not done loading patience please wait almost there time is running out +⌚,watch apple watch what time is it wristwatch accessory rolex +⏰,alarm clock wake up snooze button early morning deadline reminder good morning +⏱️,stopwatch timer race speedrun counting down fast lap time +⏲️,timer clock kitchen timer countdown cooking baking deadline egg timer +🕰️,mantelpiece clock vintage old school grandfather clock antique time cuckoo +🕛,twelve o’clock midnight noon high noon time for lunch 12:00 +🕧,twelve-thirty 12:30 half past twelve time lunch break midday +🕐,one o’clock 1:00 time meeting appointment one +🕜,one-thirty 1:30 half past one time appointment one thirty +🕑,two o’clock 2:00 time appointment schedule two +🕝,two-thirty 2:30 half past two time coffee break two thirty +🕒,three o’clock 3:00 time school's out tea time three +🕞,three-thirty 3:30 half past three time snack time three thirty +🕓,four o’clock 4:00 time happy hour approaching four afternoon +🕟,four-thirty 4:30 half past four time getting close to quittin time four thirty +🕔,five o’clock 5:00 happy hour quitting time clock out five +🕠,five-thirty 5:30 half past five time heading home five thirty +🕕,six o’clock 6:00 dinner time evening six supper +🕡,six-thirty 6:30 half past six time evening six thirty +🕖,seven o’clock 7:00 evening prime time tv seven dinnertime +🕢,seven-thirty 7:30 half past seven time winding down seven thirty +🕗,eight o’clock 8:00 night time movie night homework eight +🕣,eight-thirty 8:30 half past eight time late evening eight thirty +🕘,nine o’clock 9:00 bedtime party time nine night +🕤,nine-thirty 9:30 half past nine time getting late nine thirty +🕙,ten o’clock 10:00 late night final thoughts bedtime ten +🕥,ten-thirty 10:30 half past ten time almost midnight ten thirty +🕚,eleven o’clock 11:00 witching hour almost midnight late eleven +🕦,eleven-thirty 11:30 half past eleven time so late eleven thirty +🌑,new moon dark moon manifesting new beginnings spooky astrology +🌒,waxing crescent moon growing moon setting intentions new phase energy astrology +🌓,first quarter moon half moon taking action decision time balance astrology +🌔,waxing gibbous moon almost full refining plans patience nearly there astrology +🌕,full moon full moon energy werewolf spooky szn releasing letting go +🌖,waning gibbous moon releasing gratitude sharing giving back astrology +🌗,last quarter moon half moon letting go forgiving releasing baggage astrology +🌘,waning crescent moon surrender rest recharge empty before new moon +🌙,crescent moon sailor moon sweet dreams sleepy time night night goodnight +🌚,new moon face creepy awkward stare shade side eye judging +🌛,first quarter moon face side eye cheeky sly knowing look smug +🌜,last quarter moon face knowing look sly cheeky wise old moon smug +🌡️,thermometer it's getting hot in here fever sick temperature check climate change hot +☀️,sun good morning sunshine hot girl summer sunny day happy bright +🌝,full moon face awkward smile creepy wholesome friendly moon man he he +🌞,sun with face good morning happy day positive vibes cheerful sunny smiling +🪐,ringed planet saturn space aesthetic astronomy cosmic vibes outer space +⭐,star you're a star gold star good job five stars rate +🌟,glowing star sparkle magic special shiny you're amazing superstar +🌠,shooting star make a wish the more you know magic once in a lifetime meteor +🌌,milky way galaxy space stars universe cosmic wonder stunning +☁️,cloud cloudy day daydreaming head in the clouds soft fluffy +⛅,sun behind cloud partly cloudy good weather mixed emotions okay day weather +⛈️,cloud with lightning and rain thunderstorm drama incoming bad weather stormy downpour +🌤️,sun behind small cloud nice weather mostly sunny good day pleasant partly sunny +🌥️,sun behind large cloud overcast cloudy weather meh gloomy gray +🌦️,sun behind rain cloud sunshower scattered showers unpredictable weather april showers drizzle +🌧️,cloud with rain rainy day cozy vibes netflix and chill sad weather raining +🌨️,cloud with snow snowing winter wonderland let it snow cold weather blizzard +🌩️,cloud with lightning thunder lightning stormy weather you should... now! electric +🌪️,tornado disaster chaos drama alert twisting weather cyclone +🌫️,fog foggy weather low visibility mysterious spooky silent hill mist +🌬️,wind face windy day cold front blowing away my problems whoosh breezy +🌀,cyclone hurricane typhoon dizzy spinning chaos messy +🌈,rainbow pride lgbtq+ hope after the rain colorful love is love +🌂,closed umbrella no rain today prepared just in case weather dry +☂️,umbrella rihanna rain protection stay dry weather parasol +☔,umbrella with rain drops rainy day stay dry cozy weather protection raining +⛱️,umbrella on ground beach day relaxing shade vacation sun protection parasol +⚡,high voltage lightning bolt harry potter power energy shock flash +❄️,snowflake winter cold snow special unique frozen ice +☃️,snowman winter fun do you want to build a-snowman frosty cold snow day +⛄,snowman without snow winter is coming almost winter cold vibes snowman not yet +☄️,comet shooting star disaster movie space rock cosmic event meteorite +🔥,fire it's lit fire hot on fire lit af slay +💧,droplet drip water tear sweat thirsty stay hydrated +🌊,water wave ocean beach surfing wavy new wave drowning diff --git a/emojipicker/src/main/res/values-af/strings.xml b/emojipicker/src/main/res/values-af/strings.xml new file mode 100644 index 00000000..ef7bb7c4 --- /dev/null +++ b/emojipicker/src/main/res/values-af/strings.xml @@ -0,0 +1,42 @@ + + + + + "ONLANGS GEBRUIK" + "EMOSIEKONE EN EMOSIES" + "MENSE" + "DIERE EN NATUUR" + "KOS EN DRINKGOED" + "REIS EN PLEKKE" + "AKTIWITEITE EN GELEENTHEDE" + "VOORWERPE" + "SIMBOLE" + "VLAE" + "Geen emosiekone beskikbaar nie" + "Jy het nog geen emosiekone gebruik nie" + "emosiekoon-tweerigtingoorskakelaar" + "rigting waarin emosiekoon wys is gewissel" + "emosiekoonvariantkieser" + "%1$s en %2$s" + "skadu" + "ligte velkleur" + "mediumligte velkleur" + "medium velkleur" + "mediumdonker velkleur" + "donker velkleur" + diff --git a/emojipicker/src/main/res/values-am/strings.xml b/emojipicker/src/main/res/values-am/strings.xml new file mode 100644 index 00000000..5be491cc --- /dev/null +++ b/emojipicker/src/main/res/values-am/strings.xml @@ -0,0 +1,42 @@ + + + + + "በቅርብ ጊዜ ጥቅም ላይ የዋለ" + "ሳቂታዎች እና ስሜቶች" + "ሰዎች" + "እንስሳት እና ተፈጥሮ" + "ምግብ እና መጠጥ" + "ጉዞ እና ቦታዎች" + "እንቅስቃሴዎች እና ክስተቶች" + "ነገሮች" + "ምልክቶች" + "ባንዲራዎች" + "ምንም ስሜት ገላጭ ምስሎች አይገኙም" + "ምንም ስሜት ገላጭ ምስሎችን እስካሁን አልተጠቀሙም" + "የስሜት ገላጭ ምስል ባለሁለት አቅጣጫ መቀያየሪያ" + "የስሜት ገላጭ ምስል አቅጣጫ ተቀይሯል" + "የስሜት ገላጭ ምስል ተለዋዋጭ መራጭ" + "%1$s እና %2$s" + "ጥላ" + "ነጣ ያለ የቆዳ ቀለም" + "መካከለኛ ነጣ ያለ የቆዳ ቀለም" + "መካከለኛ የቆዳ ቀለም" + "መካከለኛ ጠቆር ያለ የቆዳ ቀለም" + "ጠቆር ያለ የቆዳ ቀለም" + diff --git a/emojipicker/src/main/res/values-ar/strings.xml b/emojipicker/src/main/res/values-ar/strings.xml new file mode 100644 index 00000000..4d42ff9e --- /dev/null +++ b/emojipicker/src/main/res/values-ar/strings.xml @@ -0,0 +1,42 @@ + + + + + "المستخدمة حديثًا" + "الوجوه المبتسمة والرموز التعبيرية" + "الأشخاص" + "الحيوانات والطبيعة" + "المأكولات والمشروبات" + "السفر والأماكن" + "الأنشطة والأحداث" + "عناصر متنوعة" + "الرموز" + "الأعلام" + "لا تتوفر أي رموز تعبيرية." + "لم تستخدم أي رموز تعبيرية حتى الآن." + "مفتاح ثنائي الاتجاه للرموز التعبيرية" + "تم تغيير اتجاه الإيموجي" + "أداة اختيار الرموز التعبيرية" + "‏%1$s و%2$s" + "الظل" + "بشرة فاتحة" + "بشرة فاتحة متوسّطة" + "بشرة متوسّطة" + "بشرة داكنة متوسّطة" + "بشرة داكنة" + diff --git a/emojipicker/src/main/res/values-as/strings.xml b/emojipicker/src/main/res/values-as/strings.xml new file mode 100644 index 00000000..6ca5f5b7 --- /dev/null +++ b/emojipicker/src/main/res/values-as/strings.xml @@ -0,0 +1,42 @@ + + + + + "অলপতে ব্যৱহৃত" + "স্মাইলী আৰু আৱেগ" + "মানুহ" + "পশু আৰু প্ৰকৃতি" + "খাদ্য আৰু পানীয়" + "ভ্ৰমণ আৰু স্থান" + "কাৰ্যকলাপ আৰু অনুষ্ঠান" + "বস্তু" + "চিহ্ন" + "পতাকা" + "কোনো ইম’জি উপলব্ধ নহয়" + "আপুনি এতিয়ালৈকে কোনো ইম’জি ব্যৱহাৰ কৰা নাই" + "ইম’জি বাইডাইৰেকশ্বনেল ছুইচ্চাৰ" + "দিক্-নিৰ্দেশনা প্ৰদৰ্শন কৰা ইম’জি সলনি কৰা হৈছে" + "ইম’জিৰ প্ৰকাৰ বাছনি কৰোঁতা" + "%1$s আৰু %2$s" + "ছাঁ" + "পাতলীয়া ছালৰ ৰং" + "মধ্যমীয়া পাতল ছালৰ ৰং" + "মিঠাবৰণীয়া ছালৰ ৰং" + "মধ্যমীয়া গাঢ় ছালৰ ৰং" + "গাঢ় ছালৰ ৰং" + diff --git a/emojipicker/src/main/res/values-az/strings.xml b/emojipicker/src/main/res/values-az/strings.xml new file mode 100644 index 00000000..c4c52857 --- /dev/null +++ b/emojipicker/src/main/res/values-az/strings.xml @@ -0,0 +1,42 @@ + + + + + "SON İSTİFADƏ EDİLƏN" + "SMAYLİK VƏ EMOSİYALAR" + "ADAMLAR" + "HEYVANLAR VƏ TƏBİƏT" + "QİDA VƏ İÇKİ" + "SƏYAHƏT VƏ MƏKANLAR" + "FƏALİYYƏTLƏR VƏ TƏDBİRLƏR" + "OBYEKTLƏR" + "SİMVOLLAR" + "BAYRAQLAR" + "Əlçatan emoji yoxdur" + "Hələ heç bir emojidən istifadə etməməsiniz" + "ikitərəfli emoji dəyişdirici" + "emoji istiqaməti dəyişdirildi" + "emoji variant seçicisi" + "%1$s və %2$s" + "kölgə" + "açıq dəri rəngi" + "orta açıq dəri rəngi" + "orta dəri rəngi" + "orta tünd dəri rəngi" + "tünd dəri rəngi" + diff --git a/emojipicker/src/main/res/values-b+sr+Latn/strings.xml b/emojipicker/src/main/res/values-b+sr+Latn/strings.xml new file mode 100644 index 00000000..8feb2961 --- /dev/null +++ b/emojipicker/src/main/res/values-b+sr+Latn/strings.xml @@ -0,0 +1,42 @@ + + + + + "NEDAVNO KORIŠĆENO" + "SMAJLIJI I EMOCIJE" + "LJUDI" + "ŽIVOTINJE I PRIRODA" + "HRANA I PIĆE" + "PUTOVANJA I MESTA" + "AKTIVNOSTI I DOGAĐAJI" + "OBJEKTI" + "SIMBOLI" + "ZASTAVE" + "Emodžiji nisu dostupni" + "Još niste koristili emodžije" + "dvosmerni prebacivač emodžija" + "smer emodžija je promenjen" + "birač varijanti emodžija" + "%1$s i %2$s" + "senka" + "koža svetle puti" + "koža srednjesvetle puti" + "koža srednje puti" + "koža srednjetamne puti" + "koža tamne puti" + diff --git a/emojipicker/src/main/res/values-be/strings.xml b/emojipicker/src/main/res/values-be/strings.xml new file mode 100644 index 00000000..67dc3c2e --- /dev/null +++ b/emojipicker/src/main/res/values-be/strings.xml @@ -0,0 +1,42 @@ + + + + + "НЯДАЎНА ВЫКАРЫСТАНЫЯ" + "СМАЙЛІКІ І ЭМОЦЫІ" + "ЛЮДЗІ" + "ЖЫВЁЛЫ І ПРЫРОДА" + "ЕЖА І НАПОІ" + "ПАДАРОЖЖЫ І МЕСЦЫ" + "ДЗЕЯННІ І ПАДЗЕІ" + "АБ\'ЕКТЫ" + "СІМВАЛЫ" + "СЦЯГІ" + "Няма даступных эмодзі" + "Вы пакуль не выкарыстоўвалі эмодзі" + "пераключальнік кірунку для эмодзі" + "кірунак арыентацыі эмодзі зменены" + "інструмент выбару варыянтаў эмодзі" + "%1$s і %2$s" + "цень" + "светлы колер скуры" + "умерана светлы колер скуры" + "нейтральны колер скуры" + "умерана цёмны колер скуры" + "цёмны колер скуры" + diff --git a/emojipicker/src/main/res/values-bg/strings.xml b/emojipicker/src/main/res/values-bg/strings.xml new file mode 100644 index 00000000..929d7676 --- /dev/null +++ b/emojipicker/src/main/res/values-bg/strings.xml @@ -0,0 +1,42 @@ + + + + + "НАСКОРО ИЗПОЛЗВАНИ" + "ЕМОТИКОНИ И ЕМОЦИИ" + "ХОРА" + "ЖИВОТНИ И ПРИРОДА" + "ХРАНИ И НАПИТКИ" + "ПЪТУВАНИЯ И МЕСТА" + "АКТИВНОСТИ И СЪБИТИЯ" + "ПРЕДМЕТИ" + "СИМВОЛИ" + "ЗНАМЕНА" + "Няма налични емоджи" + "Все още не сте използвали емоджита" + "двупосочен превключвател на емоджи" + "посоката на емоджи бе променена" + "инструмент за избор на варианти за емоджи" + "%1$s и %2$s" + "сянка" + "светъл цвят на кожата" + "средно светъл цвят на кожата" + "междинен цвят на кожата" + "средно тъмен цвят на кожата" + "тъмен цвят на кожата" + diff --git a/emojipicker/src/main/res/values-bn/strings.xml b/emojipicker/src/main/res/values-bn/strings.xml new file mode 100644 index 00000000..55a691f2 --- /dev/null +++ b/emojipicker/src/main/res/values-bn/strings.xml @@ -0,0 +1,42 @@ + + + + + "সম্প্রতি ব্যবহার করা হয়েছে" + "স্মাইলি ও আবেগ" + "ব্যক্তি" + "প্রাণী ও প্রকৃতি" + "খাদ্য ও পানীয়" + "ভ্রমণ ও জায়গা" + "অ্যাক্টিভিটি ও ইভেন্ট" + "অবজেক্ট" + "প্রতীক" + "ফ্ল্যাগ" + "কোনও ইমোজি উপলভ্য নেই" + "আপনি এখনও কোনও ইমোজি ব্যবহার করেননি" + "ইমোজি দ্বিমুখী সুইচার" + "ইমোজির দিক পরিবর্তন হয়েছে" + "ইমোজি ভেরিয়েন্ট বাছাইকারী" + "%1$s এবং %2$s" + "ছায়া" + "হাল্কা স্কিন টোন" + "মাঝারি-হাল্কা স্কিন টোন" + "মাঝারি স্কিন টোন" + "মাঝারি-গাঢ় স্কিন টোন" + "গাঢ় স্কিন টোন" + diff --git a/emojipicker/src/main/res/values-bs/strings.xml b/emojipicker/src/main/res/values-bs/strings.xml new file mode 100644 index 00000000..401f6c82 --- /dev/null +++ b/emojipicker/src/main/res/values-bs/strings.xml @@ -0,0 +1,42 @@ + + + + + "NEDAVNO KORIŠTENO" + "SMAJLIJI I EMOCIJE" + "OSOBE" + "ŽIVOTINJE I PRIRODA" + "HRANA I PIĆE" + "PUTOVANJA I MJESTA" + "AKTIVNOSTI I DOGAĐAJI" + "PREDMETI" + "SIMBOLI" + "ZASTAVE" + "Emoji sličice nisu dostupne" + "Još niste koristili nijednu emoji sličicu" + "dvosmjerni prebacivač emodžija" + "emodži gleda u smjeru postavke prekidača" + "birač varijanti emodžija" + "%1$s i %2$s" + "sjenka" + "svijetla boja kože" + "srednje svijetla boja kože" + "srednja boja kože" + "srednje tamna boja kože" + "tamna boja kože" + diff --git a/emojipicker/src/main/res/values-ca/strings.xml b/emojipicker/src/main/res/values-ca/strings.xml new file mode 100644 index 00000000..09e2bc9a --- /dev/null +++ b/emojipicker/src/main/res/values-ca/strings.xml @@ -0,0 +1,42 @@ + + + + + "UTILITZATS FA POC" + "EMOTICONES I EMOCIONS" + "PERSONES" + "ANIMALS I NATURALESA" + "MENJAR I BEGUDA" + "VIATGES I LLOCS" + "ACTIVITATS I ESDEVENIMENTS" + "OBJECTES" + "SÍMBOLS" + "BANDERES" + "No hi ha cap emoji disponible" + "Encara no has fet servir cap emoji" + "selector bidireccional d\'emojis" + "s\'ha canviat la direcció de l\'emoji" + "selector de variants d\'emojis" + "%1$s i %2$s" + "ombra" + "to de pell clar" + "to de pell mitjà-clar" + "to de pell mitjà" + "to de pell mitjà-fosc" + "to de pell fosc" + diff --git a/emojipicker/src/main/res/values-cs/strings.xml b/emojipicker/src/main/res/values-cs/strings.xml new file mode 100644 index 00000000..8d7e0f50 --- /dev/null +++ b/emojipicker/src/main/res/values-cs/strings.xml @@ -0,0 +1,42 @@ + + + + + "NEDÁVNO POUŽITÉ" + "SMAJLÍCI A EMOCE" + "LIDÉ" + "ZVÍŘATA A PŘÍRODA" + "JÍDLO A PITÍ" + "CESTOVÁNÍ A MÍSTA" + "AKTIVITY A UDÁLOSTI" + "OBJEKTY" + "SYMBOLY" + "VLAJKY" + "Nejsou k dispozici žádné smajlíky" + "Zatím jste žádná emodži nepoužili" + "dvousměrný přepínač smajlíků" + "směr pohledu smajlíků přepnut" + "výběr variant emodži" + "%1$s a %2$s" + "stín" + "světlý tón pleti" + "středně světlý tón pleti" + "střední tón pleti" + "středně tmavý tón pleti" + "tmavý tón pleti" + diff --git a/emojipicker/src/main/res/values-da/strings.xml b/emojipicker/src/main/res/values-da/strings.xml new file mode 100644 index 00000000..e9eb67b9 --- /dev/null +++ b/emojipicker/src/main/res/values-da/strings.xml @@ -0,0 +1,42 @@ + + + + + "BRUGT FOR NYLIG" + "SMILEYS OG HUMØRIKONER" + "PERSONER" + "DYR OG NATUR" + "MAD OG DRIKKE" + "REJSER OG STEDER" + "AKTIVITETER OG BEGIVENHEDER" + "TING" + "SYMBOLER" + "FLAG" + "Der er ingen tilgængelige emojis" + "Du har ikke brugt nogen emojis endnu" + "tovejsskifter til emojis" + "emojien vender en anden retning" + "vælger for emojivariant" + "%1$s og %2$s" + "skygge" + "lys hudfarve" + "mellemlys hudfarve" + "medium hudfarve" + "mellemmørk hudfarve" + "mørk hudfarve" + diff --git a/emojipicker/src/main/res/values-de/strings.xml b/emojipicker/src/main/res/values-de/strings.xml new file mode 100644 index 00000000..6e72ab75 --- /dev/null +++ b/emojipicker/src/main/res/values-de/strings.xml @@ -0,0 +1,42 @@ + + + + + "ZULETZT VERWENDET" + "SMILEYS UND EMOTIONEN" + "PERSONEN" + "TIERE UND NATUR" + "ESSEN UND TRINKEN" + "REISEN UND ORTE" + "AKTIVITÄTEN UND EVENTS" + "OBJEKTE" + "SYMBOLE" + "FLAGGEN" + "Keine Emojis verfügbar" + "Du hast noch keine Emojis verwendet" + "Bidirektionale Emoji-Auswahl" + "Emoji-Richtung geändert" + "Emojivarianten-Auswahl" + "%1$s und %2$s" + "Hautton" + "Heller Hautton" + "Mittelheller Hautton" + "Mittlerer Hautton" + "Mitteldunkler Hautton" + "Dunkler Hautton" + diff --git a/emojipicker/src/main/res/values-el/strings.xml b/emojipicker/src/main/res/values-el/strings.xml new file mode 100644 index 00000000..4a59ed67 --- /dev/null +++ b/emojipicker/src/main/res/values-el/strings.xml @@ -0,0 +1,42 @@ + + + + + "ΧΡΗΣΙΜΟΠΟΙΗΘΗΚΑΝ ΠΡΟΣΦΑΤΑ" + "ΕΙΚΟΝΙΔΙΑ SMILEY ΚΑΙ ΣΥΝΑΙΣΘΗΜΑΤΑ" + "ΑΤΟΜΑ" + "ΖΩΑ ΚΑΙ ΦΥΣΗ" + "ΦΑΓΗΤΟ ΚΑΙ ΠΟΤΟ" + "ΤΑΞΙΔΙΑ ΚΑΙ ΜΕΡΗ" + "ΔΡΑΣΤΗΡΙΟΤΗΤΕΣ ΚΑΙ ΣΥΜΒΑΝΤΑ" + "ΑΝΤΙΚΕΙΜΕΝΑ" + "ΣΥΜΒΟΛΑ" + "ΣΗΜΑΙΕΣ" + "Δεν υπάρχουν διαθέσιμα emoji" + "Δεν έχετε χρησιμοποιήσει κανένα emoji ακόμα" + "αμφίδρομο στοιχείο εναλλαγής emoji" + "έγινε εναλλαγή της κατεύθυνσης που είναι στραμμένο το emoji" + "επιλογέας παραλλαγής emoji" + "%1$s και %2$s" + "σκιά" + "ανοιχτός τόνος επιδερμίδας" + "μεσαίος προς ανοιχτός τόνος επιδερμίδας" + "μεσαίος τόνος επιδερμίδας" + "μεσαίος προς σκούρος τόνος επιδερμίδας" + "σκούρος τόνος επιδερμίδας" + diff --git a/emojipicker/src/main/res/values-en-rAU/strings.xml b/emojipicker/src/main/res/values-en-rAU/strings.xml new file mode 100644 index 00000000..0b651f51 --- /dev/null +++ b/emojipicker/src/main/res/values-en-rAU/strings.xml @@ -0,0 +1,42 @@ + + + + + "RECENTLY USED" + "SMILEYS AND EMOTIONS" + "PEOPLE" + "ANIMALS AND NATURE" + "FOOD AND DRINK" + "TRAVEL AND PLACES" + "ACTIVITIES AND EVENTS" + "OBJECTS" + "SYMBOLS" + "FLAGS" + "No emojis available" + "You haven\'t used any emoji yet" + "emoji bidirectional switcher" + "emoji facing direction switched" + "emoji variant selector" + "%1$s and %2$s" + "shadow" + "light skin tone" + "medium-light skin tone" + "medium skin tone" + "medium-dark skin tone" + "dark skin tone" + diff --git a/emojipicker/src/main/res/values-en-rCA/strings.xml b/emojipicker/src/main/res/values-en-rCA/strings.xml new file mode 100644 index 00000000..d056590c --- /dev/null +++ b/emojipicker/src/main/res/values-en-rCA/strings.xml @@ -0,0 +1,42 @@ + + + + + "RECENTLY USED" + "SMILEYS AND EMOTIONS" + "PEOPLE" + "ANIMALS AND NATURE" + "FOOD AND DRINK" + "TRAVEL AND PLACES" + "ACTIVITIES AND EVENTS" + "OBJECTS" + "SYMBOLS" + "FLAGS" + "No emojis available" + "You haven\'t used any emojis yet" + "emoji bidirectional switcher" + "emoji facing direction switched" + "emoji variant selector" + "%1$s and %2$s" + "shadow" + "light skin tone" + "medium light skin tone" + "medium skin tone" + "medium dark skin tone" + "dark skin tone" + diff --git a/emojipicker/src/main/res/values-en-rGB/strings.xml b/emojipicker/src/main/res/values-en-rGB/strings.xml new file mode 100644 index 00000000..0b651f51 --- /dev/null +++ b/emojipicker/src/main/res/values-en-rGB/strings.xml @@ -0,0 +1,42 @@ + + + + + "RECENTLY USED" + "SMILEYS AND EMOTIONS" + "PEOPLE" + "ANIMALS AND NATURE" + "FOOD AND DRINK" + "TRAVEL AND PLACES" + "ACTIVITIES AND EVENTS" + "OBJECTS" + "SYMBOLS" + "FLAGS" + "No emojis available" + "You haven\'t used any emoji yet" + "emoji bidirectional switcher" + "emoji facing direction switched" + "emoji variant selector" + "%1$s and %2$s" + "shadow" + "light skin tone" + "medium-light skin tone" + "medium skin tone" + "medium-dark skin tone" + "dark skin tone" + diff --git a/emojipicker/src/main/res/values-en-rIN/strings.xml b/emojipicker/src/main/res/values-en-rIN/strings.xml new file mode 100644 index 00000000..0b651f51 --- /dev/null +++ b/emojipicker/src/main/res/values-en-rIN/strings.xml @@ -0,0 +1,42 @@ + + + + + "RECENTLY USED" + "SMILEYS AND EMOTIONS" + "PEOPLE" + "ANIMALS AND NATURE" + "FOOD AND DRINK" + "TRAVEL AND PLACES" + "ACTIVITIES AND EVENTS" + "OBJECTS" + "SYMBOLS" + "FLAGS" + "No emojis available" + "You haven\'t used any emoji yet" + "emoji bidirectional switcher" + "emoji facing direction switched" + "emoji variant selector" + "%1$s and %2$s" + "shadow" + "light skin tone" + "medium-light skin tone" + "medium skin tone" + "medium-dark skin tone" + "dark skin tone" + diff --git a/emojipicker/src/main/res/values-en-rXC/strings.xml b/emojipicker/src/main/res/values-en-rXC/strings.xml new file mode 100644 index 00000000..3e02185f --- /dev/null +++ b/emojipicker/src/main/res/values-en-rXC/strings.xml @@ -0,0 +1,42 @@ + + + + + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‏‎‎‎‏‏‏‏‎‏‏‎‏‎‎‎‏‏‎‏‎‏‎‏‏‏‏‏‎‏‏‎‏‏‎‏‏‏‎‏‎‏‏‏‏‎‎‏‏‎‎‏‎‎‏‏‏‎RECENTLY USED‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‏‏‏‎‎‏‏‎‎‏‎‏‏‎‏‏‎‎‏‏‏‎‎‎‏‏‏‎‏‏‏‏‏‎‏‏‎‎‏‎‏‎‏‏‎‏‎‎‏‏‏‎‎‎‎‎‏‎SMILEYS AND EMOTIONS‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‏‎‎‏‎‏‎‎‏‎‏‎‎‎‏‏‎‏‏‏‎‏‎‏‏‎‏‏‏‏‏‎‎‎‏‏‎‏‎‏‎‏‏‏‏‎‏‎‏‎‏‏‎‎‎‏‎PEOPLE‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‎‎‏‏‎‎‏‏‏‎‏‎‏‎‏‎‎‏‏‏‎‏‏‏‎‏‎‎‏‏‏‎‎‏‎‏‏‏‏‏‏‎‎‏‎‎‏‎‎‏‎‎‏‎‏‎‏‎ANIMALS AND NATURE‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‎‏‎‎‎‎‎‏‏‏‎‏‎‎‎‎‏‎‎‎‏‏‎‎‏‎‏‎‏‎‏‎‎‏‎‎‏‎‏‎‎‏‏‏‏‎‎‎‎‏‏‏‎‏‎‏‏‎FOOD AND DRINK‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‎‎‏‏‏‏‏‎‏‎‏‎‎‎‏‏‎‏‏‎‏‎‎‏‎‎‏‎‎‎‏‎‎‎‎‏‎‎‎‏‏‎‏‏‏‏‎‎‎‏‏‎‎‎‎‎‎‎TRAVEL AND PLACES‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‎‏‏‎‎‏‏‎‎‏‏‏‎‏‎‏‏‎‎‏‎‏‏‎‎‏‎‏‏‏‏‏‏‎‏‏‎‏‏‎‏‎‎‎‎‎‎‏‏‎‏‎‏‏‏‏‏‎ACTIVITIES AND EVENTS‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‎‏‎‏‏‏‏‎‏‎‏‎‎‎‏‏‏‏‏‎‎‎‏‏‎‎‎‏‏‎‎‎‎‏‏‎‏‎‏‏‎‎‏‎‎‏‏‎‎‏‏‏‎‎‎‏‏‎OBJECTS‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‎‎‎‎‏‎‏‎‎‎‎‏‎‏‏‎‏‎‏‎‏‏‏‏‏‏‏‏‎‎‎‎‎‏‏‎‏‏‏‎‎‎‎‏‏‎‎‎‎‎‎‎‏‏‎‏‏‎SYMBOLS‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‏‏‏‎‏‎‏‏‏‏‏‎‎‏‏‏‎‎‏‎‏‏‎‏‏‎‎‎‎‎‏‎‎‏‎‏‏‎‎‎‏‏‏‏‏‏‏‎‎‏‏‏‎‎‏‏‏‎FLAGS‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‎‎‎‎‎‎‎‎‏‎‎‎‎‏‏‎‏‎‏‏‎‏‎‏‏‎‎‎‎‎‎‎‏‎‏‎‏‎‎‏‏‎‎‎‎‎‏‎‏‎‎‏‎‏‎‎‎‏‎No emojis available‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‎‏‎‎‏‎‎‎‏‎‎‎‎‏‏‎‏‏‎‎‏‏‏‎‎‎‎‏‎‎‎‏‏‏‏‏‎‏‎‎‎‎‏‏‎‎‎‏‎‏‎‏‎‏‏‎‎‎‎You haven\'t used any emojis yet‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‎‏‎‎‏‎‎‎‎‎‎‏‎‎‎‎‎‏‏‏‎‏‎‎‏‏‏‏‎‏‎‏‏‏‎‏‎‎‏‎‏‎‎‎‎‏‎‏‎‎‎‏‏‏‏‎‏‎emoji bidirectional switcher‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‎‎‎‏‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‎‎‏‎‏‎‎‏‎‏‎‏‏‏‏‏‎‏‏‎‏‏‏‏‏‏‎‎‎‎‎‏‏‎emoji facing direction switched‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‎‎‎‎‏‏‏‎‏‏‎‎‎‏‎‏‎‏‏‏‏‎‏‎‏‎‏‏‎‏‎‎‎‏‎‎‏‎‎‏‎‎‎‏‏‎‏‎‏‎‎‏‏‎‎‎‎‎‎emoji variant selector‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‎‏‎‎‏‎‎‎‏‎‎‏‎‏‏‏‎‎‏‎‎‏‎‏‏‏‏‏‏‎‎‎‏‏‎‎‏‎‎‏‎‏‎‎‎‏‎‏‏‏‏‎‏‎‎‎‏‎%1$s and %2$s‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‎‎‏‏‎‏‏‎‎‎‏‏‏‎‎‎‏‏‏‏‏‏‏‎‎‎‏‏‎‏‎‎‏‎‏‎‎‏‏‏‏‎‎‎‎‏‏‏‎‏‎‏‏‎‎‎‎‎shadow‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‏‎‏‎‎‏‏‎‏‎‎‏‎‎‏‏‎‏‏‏‎‏‎‏‎‏‎‎‏‎‏‏‎‏‎‎‎‎‎‏‎‎‏‏‎‎‎‏‏‏‏‎‎‏‎‎‎‏‎light skin tone‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‏‎‎‎‏‎‎‏‎‎‏‏‏‎‎‎‎‎‏‏‏‏‏‏‎‎‏‏‎‏‏‎‎‎‎‎‏‏‎‎‏‎‏‎‏‏‎‏‏‎‏‏‎‏‎‏‎‎medium light skin tone‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‏‏‎‎‏‏‎‏‏‎‏‎‎‏‎‏‏‏‏‎‏‎‎‎‎‎‎‏‎‏‎‏‏‎‎‏‏‎‏‏‏‎‎‎‏‎‎‎‎‎‏‏‎medium skin tone‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‎‎‏‎‏‎‏‎‎‏‏‏‎‎‏‎‎‎‎‎‎‎‏‏‏‏‏‎‎‏‎‎‎‎‏‏‏‎‎‎‏‎‏‏‏‏‎‏‎‏‎‏‎‏‏‎‏‎medium dark skin tone‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‎‏‎‎‎‏‏‎‎‏‎‏‎‏‎‎‎‎‏‎‏‎‏‏‎‎‎‎‏‎‎‎‏‏‎‎‎‎‎‎‏‏‏‎‎‏‏‎‎‏‏‏‏‎‏‏‏‎‎dark skin tone‎‏‎‎‏‎" + diff --git a/emojipicker/src/main/res/values-es-rUS/strings.xml b/emojipicker/src/main/res/values-es-rUS/strings.xml new file mode 100644 index 00000000..e9001edf --- /dev/null +++ b/emojipicker/src/main/res/values-es-rUS/strings.xml @@ -0,0 +1,42 @@ + + + + + "USADOS RECIENTEMENTE" + "EMOTICONES Y EMOCIONES" + "PERSONAS" + "ANIMALES Y NATURALEZA" + "COMIDAS Y BEBIDAS" + "VIAJES Y LUGARES" + "ACTIVIDADES Y EVENTOS" + "OBJETOS" + "SÍMBOLOS" + "BANDERAS" + "No hay ningún emoji disponible" + "Todavía no usaste ningún emoji" + "selector bidireccional de emojis" + "se cambió la dirección del emoji" + "selector de variantes de emojis" + "%1$s y %2$s" + "sombra" + "tono de piel claro" + "tono de piel medio claro" + "tono de piel intermedio" + "tono de piel medio oscuro" + "tono de piel oscuro" + diff --git a/emojipicker/src/main/res/values-es/strings.xml b/emojipicker/src/main/res/values-es/strings.xml new file mode 100644 index 00000000..d2aed368 --- /dev/null +++ b/emojipicker/src/main/res/values-es/strings.xml @@ -0,0 +1,42 @@ + + + + + "USADOS RECIENTEMENTE" + "EMOTICONOS Y EMOCIONES" + "PERSONAS" + "ANIMALES Y NATURALEZA" + "COMIDA Y BEBIDA" + "VIAJES Y SITIOS" + "ACTIVIDADES Y EVENTOS" + "OBJETOS" + "SÍMBOLOS" + "BANDERAS" + "No hay emojis disponibles" + "Aún no has usado ningún emoji" + "cambio bidireccional de emojis" + "dirección a la que se orienta el emoji cambiada" + "selector de variantes de emojis" + "%1$s y %2$s" + "sombra" + "tono de piel claro" + "tono de piel medio claro" + "tono de piel medio" + "tono de piel medio oscuro" + "tono de piel oscuro" + diff --git a/emojipicker/src/main/res/values-et/strings.xml b/emojipicker/src/main/res/values-et/strings.xml new file mode 100644 index 00000000..8b3d05aa --- /dev/null +++ b/emojipicker/src/main/res/values-et/strings.xml @@ -0,0 +1,42 @@ + + + + + "HILJUTI KASUTATUD" + "NÄOIKOONID JA EMOTSIOONID" + "INIMESED" + "LOOMAD JA LOODUS" + "SÖÖK JA JOOK" + "REISIMINE JA KOHAD" + "TEGEVUSED JA SÜNDMUSED" + "OBJEKTID" + "SÜMBOLID" + "LIPUD" + "Ühtegi emotikoni pole saadaval" + "Te pole veel ühtegi emotikoni kasutanud" + "emotikoni kahesuunaline lüliti" + "emotikoni suunda vahetati" + "emotikoni variandi valija" + "%1$s ja %2$s" + "vari" + "hele nahatoon" + "keskmiselt hele nahatoon" + "keskmine nahatoon" + "keskmiselt tume nahatoon" + "tume nahatoon" + diff --git a/emojipicker/src/main/res/values-eu/strings.xml b/emojipicker/src/main/res/values-eu/strings.xml new file mode 100644 index 00000000..9c550ca9 --- /dev/null +++ b/emojipicker/src/main/res/values-eu/strings.xml @@ -0,0 +1,42 @@ + + + + + "ERABILITAKO AZKENAK" + "AURPEGIERAK ETA ALDARTEAK" + "JENDEA" + "ANIMALIAK ETA NATURA" + "JAN-EDANAK" + "BIDAIAK ETA TOKIAK" + "JARDUERAK ETA GERTAERAK" + "OBJEKTUAK" + "IKURRAK" + "BANDERAK" + "Ez dago emotikonorik erabilgarri" + "Ez duzu erabili emojirik oraingoz" + "noranzko biko emoji-aldatzailea" + "emojiaren norabidea aldatu da" + "emojien aldaeren hautatzailea" + "%1$s eta %2$s" + "itzala" + "azalaren tonu argia" + "azalaren tonu argixka" + "azalaren tarteko tonua" + "azalaren tonu ilunxkoa" + "azalaren tonu iluna" + diff --git a/emojipicker/src/main/res/values-fa/strings.xml b/emojipicker/src/main/res/values-fa/strings.xml new file mode 100644 index 00000000..5930a4f0 --- /dev/null +++ b/emojipicker/src/main/res/values-fa/strings.xml @@ -0,0 +1,42 @@ + + + + + "اخیراً استفاده‌شده" + "شکلک‌ها و احساسات" + "افراد" + "حیوانات و طبیعت" + "غذا و نوشیدنی" + "سفر و مکان‌ها" + "فعالیت‌ها و رویدادها" + "اشیاء" + "نشان‌ها" + "پرچم‌ها" + "اموجی دردسترس نیست" + "هنوز از هیچ اموجی‌ای استفاده نکرده‌اید" + "تغییردهنده دوسویه اموجی" + "جهت چهره اموجی تغییر کرد" + "گزینشگر متغیر اموجی" + "‏%1$s و %2$s" + "سایه" + "رنگ‌مایه پوست روشن" + "رنگ‌مایه پوست ملایم روشن" + "رنگ‌مایه پوست ملایم" + "رنگ‌مایه پوست ملایم تیره" + "رنگ‌مایه پوست تیره" + diff --git a/emojipicker/src/main/res/values-fi/strings.xml b/emojipicker/src/main/res/values-fi/strings.xml new file mode 100644 index 00000000..bb6ccb58 --- /dev/null +++ b/emojipicker/src/main/res/values-fi/strings.xml @@ -0,0 +1,42 @@ + + + + + "VIIMEKSI KÄYTETYT" + "HYMIÖT JA TUNNETILAT" + "IHMISET" + "ELÄIMET JA LUONTO" + "RUOKA JA JUOMA" + "MATKAILU JA PAIKAT" + "AKTIVITEETIT JA TAPAHTUMAT" + "ESINEET" + "SYMBOLIT" + "LIPUT" + "Ei emojeita saatavilla" + "Et ole vielä käyttänyt emojeita" + "emoji kaksisuuntainen vaihtaja" + "emojin osoitussuunta vaihdettu" + "emojivalitsin" + "%1$s ja %2$s" + "varjostus" + "vaalea ihonväri" + "melko vaalea ihonväri" + "keskimääräinen ihonväri" + "melko tumma ihonväri" + "tumma ihonväri" + diff --git a/emojipicker/src/main/res/values-fr-rCA/strings.xml b/emojipicker/src/main/res/values-fr-rCA/strings.xml new file mode 100644 index 00000000..334f18f5 --- /dev/null +++ b/emojipicker/src/main/res/values-fr-rCA/strings.xml @@ -0,0 +1,42 @@ + + + + + "UTILISÉS RÉCEMMENT" + "ÉMOTICÔNES ET ÉMOTIONS" + "PERSONNES" + "ANIMAUX ET NATURE" + "ALIMENTS ET BOISSONS" + "VOYAGES ET LIEUX" + "ACTIVITÉS ET ÉVÉNEMENTS" + "OBJETS" + "SYMBOLES" + "DRAPEAUX" + "Aucun émoji proposé" + "Vous n\'avez encore utilisé aucun émoji" + "sélecteur bidirectionnel d\'émoji" + "Émoji tourné dans la direction inverse" + "sélecteur de variantes d\'émoji" + "%1$s et %2$s" + "ombre" + "teint clair" + "teint moyennement clair" + "teint moyen" + "teint moyennement foncé" + "teint foncé" + diff --git a/emojipicker/src/main/res/values-fr/strings.xml b/emojipicker/src/main/res/values-fr/strings.xml new file mode 100644 index 00000000..66f9f4d8 --- /dev/null +++ b/emojipicker/src/main/res/values-fr/strings.xml @@ -0,0 +1,42 @@ + + + + + "UTILISÉS RÉCEMMENT" + "ÉMOTICÔNES ET ÉMOTIONS" + "PERSONNES" + "ANIMAUX ET NATURE" + "ALIMENTATION ET BOISSONS" + "VOYAGES ET LIEUX" + "ACTIVITÉS ET ÉVÉNEMENTS" + "OBJETS" + "SYMBOLES" + "DRAPEAUX" + "Aucun emoji disponible" + "Vous n\'avez pas encore utilisé d\'emoji" + "sélecteur d\'emoji bidirectionnel" + "sens de l\'orientation de l\'emoji inversé" + "sélecteur de variante d\'emoji" + "%1$s et %2$s" + "ombre" + "teint clair" + "teint intermédiaire à clair" + "teint intermédiaire" + "teint intermédiaire à foncé" + "teint foncé" + diff --git a/emojipicker/src/main/res/values-gl/strings.xml b/emojipicker/src/main/res/values-gl/strings.xml new file mode 100644 index 00000000..f8715c36 --- /dev/null +++ b/emojipicker/src/main/res/values-gl/strings.xml @@ -0,0 +1,42 @@ + + + + + "USADOS HAI POUCO" + "ICONAS XESTUAIS E EMOTICONAS" + "PERSOAS" + "ANIMAIS E NATUREZA" + "COMIDA E BEBIDA" + "VIAXES E LUGARES" + "ACTIVIDADES E EVENTOS" + "OBXECTOS" + "SÍMBOLOS" + "BANDEIRAS" + "Non hai ningún emoji dispoñible" + "Aínda non utilizaches ningún emoji" + "selector bidireccional de emojis" + "dirección do emoji cambiada" + "selector de variantes de emojis" + "%1$s e %2$s" + "sombra" + "ton de pel claro" + "ton de pel lixeiramente claro" + "ton de pel medio" + "ton de pel lixeiramente escuro" + "ton de pel escuro" + diff --git a/emojipicker/src/main/res/values-gu/strings.xml b/emojipicker/src/main/res/values-gu/strings.xml new file mode 100644 index 00000000..dad9fd38 --- /dev/null +++ b/emojipicker/src/main/res/values-gu/strings.xml @@ -0,0 +1,42 @@ + + + + + "તાજેતરમાં વપરાયેલું" + "સ્માઇલી અને મનોભાવો" + "લોકો" + "પ્રાણીઓ અને પ્રકૃતિ" + "ભોજન અને પીણાં" + "મુસાફરી અને સ્થળો" + "પ્રવૃત્તિઓ અને ઇવેન્ટ" + "ઑબ્જેક્ટ" + "પ્રતીકો" + "ઝંડા" + "કોઈ ઇમોજી ઉપલબ્ધ નથી" + "તમે હજી સુધી કોઈ ઇમોજીનો ઉપયોગ કર્યો નથી" + "બે દિશામાં સ્વિચ થઈ શકતું ઇમોજી સ્વિચર" + "ઇમોજીની દિશા બદલવામાં આવી" + "ઇમોજીનો પ્રકાર પસંદગીકર્તા" + "%1$s અને %2$s" + "શૅડો" + "ત્વચાનો હળવો ટોન" + "ત્વચાનો મધ્યમ હળવો ટોન" + "ત્વચાનો મધ્યમ ટોન" + "ત્વચાનો મધ્યમ ઘેરો ટોન" + "ત્વચાનો ઘેરો ટોન" + diff --git a/emojipicker/src/main/res/values-hi/strings.xml b/emojipicker/src/main/res/values-hi/strings.xml new file mode 100644 index 00000000..81cd653a --- /dev/null +++ b/emojipicker/src/main/res/values-hi/strings.xml @@ -0,0 +1,42 @@ + + + + + "हाल ही में इस्तेमाल किए गए" + "स्माइली और भावनाएं" + "लोग" + "जानवर और प्रकृति" + "खाने-पीने की चीज़ें" + "यात्रा और जगहें" + "गतिविधियां और इवेंट" + "ऑब्जेक्ट" + "सिंबल" + "झंडे" + "कोई इमोजी उपलब्ध नहीं है" + "आपने अब तक किसी भी इमोजी का इस्तेमाल नहीं किया है" + "दोनों तरफ़ ले जा सकने वाले स्विचर का इमोजी" + "इमोजी को फ़्लिप किया गया" + "इमोजी के वैरिएंट चुनने का टूल" + "%1$s और %2$s" + "शैडो" + "हल्के रंग की त्वचा" + "थोड़े हल्के रंग की त्वचा" + "सामान्य रंग की त्वचा" + "थोड़े गहरे रंग की त्वचा" + "गहरे रंग की त्वचा" + diff --git a/emojipicker/src/main/res/values-hr/strings.xml b/emojipicker/src/main/res/values-hr/strings.xml new file mode 100644 index 00000000..481b4867 --- /dev/null +++ b/emojipicker/src/main/res/values-hr/strings.xml @@ -0,0 +1,42 @@ + + + + + "NEDAVNO KORIŠTENO" + "SMAJLIĆI I EMOCIJE" + "OSOBE" + "ŽIVOTINJE I PRIRODA" + "HRANA I PIĆE" + "PUTOVANJA I MJESTA" + "AKTIVNOSTI I DOGAĐAJI" + "OBJEKTI" + "SIMBOLI" + "ZASTAVE" + "Nije dostupan nijedan emoji" + "Još niste upotrijebili emojije" + "dvosmjerni izmjenjivač emojija" + "promijenjen je smjer emojija" + "alat za odabir varijante emojija" + "%1$s i %2$s" + "sjena" + "svijetla boja kože" + "srednje svijetla boja kože" + "srednja boja kože" + "srednje tamna boja kože" + "tamna boja kože" + diff --git a/emojipicker/src/main/res/values-hu/strings.xml b/emojipicker/src/main/res/values-hu/strings.xml new file mode 100644 index 00000000..d048746c --- /dev/null +++ b/emojipicker/src/main/res/values-hu/strings.xml @@ -0,0 +1,42 @@ + + + + + "LEGUTÓBB HASZNÁLT" + "HANGULATJELEK ÉS HANGULATOK" + "SZEMÉLYEK" + "ÁLLATOK ÉS TERMÉSZET" + "ÉTEL ÉS ITAL" + "UTAZÁS ÉS HELYEK" + "TEVÉKENYSÉGEK ÉS ESEMÉNYEK" + "TÁRGYAK" + "SZIMBÓLUMOK" + "ZÁSZLÓK" + "Nincsenek rendelkezésre álló emojik" + "Még nem használt emojikat" + "kétirányú emojiváltó" + "módosítva lett, hogy merre nézzen az emoji" + "emojiváltozat-választó" + "%1$s és %2$s" + "árnyék" + "világos bőrtónus" + "közepesen világos bőrtónus" + "közepes bőrtónus" + "közepesen sötét bőrtónus" + "sötét bőrtónus" + diff --git a/emojipicker/src/main/res/values-hy/strings.xml b/emojipicker/src/main/res/values-hy/strings.xml new file mode 100644 index 00000000..be551dec --- /dev/null +++ b/emojipicker/src/main/res/values-hy/strings.xml @@ -0,0 +1,42 @@ + + + + + "ՎԵՐՋԵՐՍ ՕԳՏԱԳՈՐԾՎԱԾ" + "ԶՄԱՅԼԻԿՆԵՐ ԵՎ ՀՈՒԶԱՊԱՏԿԵՐԱԿՆԵՐ" + "ՄԱՐԴԻԿ" + "ԿԵՆԴԱՆԻՆԵՐ ԵՎ ԲՆՈՒԹՅՈՒՆ" + "ՍՆՈՒՆԴ ԵՎ ԽՄԻՉՔ" + "ՃԱՄՓՈՐԴՈՒԹՅՈՒՆ ԵՎ ՏԵՍԱՐԺԱՆ ՎԱՅՐԵՐ" + "ԺԱՄԱՆՑ ԵՎ ՄԻՋՈՑԱՌՈՒՄՆԵՐ" + "ԱՌԱՐԿԱՆԵՐ" + "ՆՇԱՆՆԵՐ" + "ԴՐՈՇՆԵՐ" + "Հասանելի էմոջիներ չկան" + "Դուք դեռ չեք օգտագործել էմոջիներ" + "էմոջիների երկկողմանի փոխանջատիչ" + "էմոջիի դեմքի ուղղությունը փոխվեց" + "էմոջիների տարբերակի ընտրիչ" + "%1$s և %2$s" + "ստվեր" + "մաշկի բաց երանգ" + "մաշկի չափավոր բաց երանգ" + "մաշկի չեզոք երանգ" + "մաշկի չափավոր մուգ երանգ" + "մաշկի մուգ երանգ" + diff --git a/emojipicker/src/main/res/values-in/strings.xml b/emojipicker/src/main/res/values-in/strings.xml new file mode 100644 index 00000000..09703b72 --- /dev/null +++ b/emojipicker/src/main/res/values-in/strings.xml @@ -0,0 +1,42 @@ + + + + + "TERAKHIR DIGUNAKAN" + "SMILEY DAN EMOTIKON" + "ORANG" + "HEWAN DAN ALAM" + "MAKANAN DAN MINUMAN" + "WISATA DAN TEMPAT" + "AKTIVITAS DAN ACARA" + "OBJEK" + "SIMBOL" + "BENDERA" + "Tidak ada emoji yang tersedia" + "Anda belum menggunakan emoji apa pun" + "pengalih dua arah emoji" + "arah hadap emoji dialihkan" + "pemilih varian emoji" + "%1$s dan %2$s" + "bayangan" + "warna kulit cerah" + "warna kulit kuning langsat" + "warna kulit sawo matang" + "warna kulit cokelat" + "warna kulit gelap" + diff --git a/emojipicker/src/main/res/values-is/strings.xml b/emojipicker/src/main/res/values-is/strings.xml new file mode 100644 index 00000000..691d3c62 --- /dev/null +++ b/emojipicker/src/main/res/values-is/strings.xml @@ -0,0 +1,42 @@ + + + + + "NOTAÐ NÝLEGA" + "BROSKARLAR OG TILFINNINGAR" + "FÓLK" + "DÝR OG NÁTTÚRA" + "MATUR OG DRYKKUR" + "FERÐALÖG OG STAÐIR" + "VIRKNI OG VIÐBURÐIR" + "HLUTIR" + "TÁKN" + "FÁNAR" + "Engin emoji-tákn í boði" + "Þú hefur ekki notað nein emoji enn" + "emoji-val í báðar áttir" + "Áttinni sem emoji snýr að hefur verið breytt" + "val emoji-afbrigðis" + "%1$s og %2$s" + "skuggi" + "ljós húðlitur" + "meðalljós húðlitur" + "húðlitur í meðallagi" + "meðaldökkur húðlitur" + "dökkur húðlitur" + diff --git a/emojipicker/src/main/res/values-it/strings.xml b/emojipicker/src/main/res/values-it/strings.xml new file mode 100644 index 00000000..6ff2bf9c --- /dev/null +++ b/emojipicker/src/main/res/values-it/strings.xml @@ -0,0 +1,42 @@ + + + + + "USATE DI RECENTE" + "SMILE ED EMOZIONI" + "PERSONE" + "ANIMALI E NATURA" + "CIBO E BEVANDE" + "VIAGGI E LUOGHI" + "ATTIVITÀ ED EVENTI" + "OGGETTI" + "SIMBOLI" + "BANDIERE" + "Nessuna emoji disponibile" + "Non hai ancora usato alcuna emoji" + "selettore bidirezionale di emoji" + "emoji sottosopra" + "selettore variante emoji" + "%1$s e %2$s" + "ombra" + "carnagione chiara" + "carnagione medio-chiara" + "carnagione media" + "carnagione medio-scura" + "carnagione scura" + diff --git a/emojipicker/src/main/res/values-iw/strings.xml b/emojipicker/src/main/res/values-iw/strings.xml new file mode 100644 index 00000000..7a8eae8a --- /dev/null +++ b/emojipicker/src/main/res/values-iw/strings.xml @@ -0,0 +1,42 @@ + + + + + "בשימוש לאחרונה" + "סמיילי ואמוטיקונים" + "אנשים" + "בעלי חיים וטבע" + "מזון ומשקאות" + "נסיעות ומקומות" + "פעילויות ואירועים" + "אובייקטים" + "סמלים" + "דגלים" + "אין סמלי אמוג\'י זמינים" + "עדיין לא השתמשת באף אמוג\'י" + "לחצן דו-כיווני למעבר לאמוג\'י" + "מתג נגישות להחלפת הכיוון של האמוג\'י" + "בורר של סוגי אמוג\'י" + "‏%1$s ו-%2$s" + "צל" + "גוון עור בהיר" + "גוון עור בינוני-בהיר" + "גוון עור בינוני" + "גוון עור בינוני-כהה" + "גוון עור כהה" + diff --git a/emojipicker/src/main/res/values-ja/strings.xml b/emojipicker/src/main/res/values-ja/strings.xml new file mode 100644 index 00000000..395ee6d7 --- /dev/null +++ b/emojipicker/src/main/res/values-ja/strings.xml @@ -0,0 +1,42 @@ + + + + + "最近使用した絵文字" + "顔文字、気分" + "人物" + "動物、自然" + "食べ物、飲み物" + "移動、場所" + "活動、イベント" + "アイテム" + "記号" + "旗" + "使用できる絵文字がありません" + "まだ絵文字を使用していません" + "絵文字の双方向切り替え" + "絵文字の向きを切り替えました" + "絵文字バリエーション セレクタ" + "%1$s、%2$s" + "シャドウ" + "明るい肌の色" + "やや明るい肌の色" + "中間の明るさの肌の色" + "やや濃い肌の色" + "濃い肌の色" + diff --git a/emojipicker/src/main/res/values-ka/strings.xml b/emojipicker/src/main/res/values-ka/strings.xml new file mode 100644 index 00000000..5d23faa2 --- /dev/null +++ b/emojipicker/src/main/res/values-ka/strings.xml @@ -0,0 +1,42 @@ + + + + + "ბოლო დროს გამოყენებული" + "სიცილაკები და ემოციები" + "ადამიანები" + "ცხოველები და ბუნება" + "საჭმელი და სასმელი" + "მოგზაურობა და ადგილები" + "აქტივობები და მოვლენები" + "ობიექტები" + "სიმბოლოები" + "დროშები" + "Emoji-ები მიუწვდომელია" + "Emoji-ებით ჯერ არ გისარგებლიათ" + "emoji-ს ორმიმართულებიანი გადამრთველი" + "emoji-ის მიმართულება შეცვლილია" + "emoji-ს ვარიანტის ამომრჩევი" + "%1$s და %2$s" + "ჩრდილი" + "კანის ღია ტონი" + "კანის ღია საშუალო ტონი" + "კანის საშუალო ტონი" + "კანის მუქი საშუალო ტონი" + "კანის მუქი ტონი" + diff --git a/emojipicker/src/main/res/values-kk/strings.xml b/emojipicker/src/main/res/values-kk/strings.xml new file mode 100644 index 00000000..cd6a8c57 --- /dev/null +++ b/emojipicker/src/main/res/values-kk/strings.xml @@ -0,0 +1,42 @@ + + + + + "СОҢҒЫ ҚОЛДАНЫЛҒАНДАР" + "СМАЙЛДАР МЕН ЭМОЦИЯЛАР" + "АДАМДАР" + "ЖАНУАРЛАР ЖӘНЕ ТАБИҒАТ" + "ТАМАҚ ПЕН СУСЫН" + "САЯХАТ ЖӘНЕ ОРЫНДАР" + "ӘРЕКЕТТЕР МЕН ІС-ШАРАЛАР" + "НЫСАНДАР" + "ТАҢБАЛАР" + "ЖАЛАУШАЛАР" + "Эмоджи жоқ" + "Әлі ешқандай эмоджи пайдаланылған жоқ." + "екіжақты эмоджи ауыстырғыш" + "эмоджи бағыты ауыстырылды" + "эмоджи нұсқаларын таңдау құралы" + "%1$s және %2$s" + "көлеңке" + "терінің ақшыл реңі" + "терінің орташа ақшыл реңі" + "терінің орташа реңі" + "терінің орташа қараторы реңі" + "терінің қараторы реңі" + diff --git a/emojipicker/src/main/res/values-km/strings.xml b/emojipicker/src/main/res/values-km/strings.xml new file mode 100644 index 00000000..0b4dffc2 --- /dev/null +++ b/emojipicker/src/main/res/values-km/strings.xml @@ -0,0 +1,42 @@ + + + + + "បាន​ប្រើ​ថ្មីៗ​នេះ" + "រូប​ទឹក​មុខ និងអារម្មណ៍" + "មនុស្ស" + "សត្វ និងធម្មជាតិ" + "អាហារ និងភេសជ្ជៈ" + "ការធ្វើដំណើរ និងទីកន្លែង" + "សកម្មភាព និងព្រឹត្តិការណ៍" + "វត្ថុ" + "និមិត្តសញ្ញា" + "ទង់" + "មិនមាន​រូប​អារម្មណ៍ទេ" + "អ្នក​មិនទាន់​បានប្រើរូប​អារម្មណ៍​ណាមួយ​នៅឡើយទេ" + "មុខងារប្ដូរទ្វេទិសនៃរូប​អារម្មណ៍" + "បានប្ដូរទិសដៅបែររបស់រូប​អារម្មណ៍" + "ផ្ទាំងជ្រើសរើសជម្រើសរូប​អារម្មណ៍" + "%1$s និង %2$s" + "ស្រមោល" + "សម្បុរស្បែក​ស" + "សម្បុរស្បែក​សល្មម" + "សម្បុរ​ស្បែក​ល្មម" + "សម្បុរ​ស្បែកខ្មៅល្មម" + "សម្បុរ​ស្បែក​ខ្មៅ" + diff --git a/emojipicker/src/main/res/values-kn/strings.xml b/emojipicker/src/main/res/values-kn/strings.xml new file mode 100644 index 00000000..b05a64c2 --- /dev/null +++ b/emojipicker/src/main/res/values-kn/strings.xml @@ -0,0 +1,42 @@ + + + + + "ಇತ್ತೀಚೆಗೆ ಬಳಸಿರುವುದು" + "ಸ್ಮೈಲಿಗಳು ಮತ್ತು ಭಾವನೆಗಳು" + "ಜನರು" + "ಪ್ರಾಣಿಗಳು ಮತ್ತು ಪ್ರಕೃತಿ" + "ಆಹಾರ ಮತ್ತು ಪಾನೀಯ" + "ಪ್ರಯಾಣ ಮತ್ತು ಸ್ಥಳಗಳು" + "ಚಟುವಟಿಕೆಗಳು ಮತ್ತು ಈವೆಂಟ್‌ಗಳು" + "ವಸ್ತುಗಳು" + "ಸಂಕೇತಗಳು" + "ಫ್ಲ್ಯಾಗ್‌ಗಳು" + "ಯಾವುದೇ ಎಮೊಜಿಗಳು ಲಭ್ಯವಿಲ್ಲ" + "ನೀವು ಇನ್ನೂ ಯಾವುದೇ ಎಮೋಜಿಗಳನ್ನು ಬಳಸಿಲ್ಲ" + "ಎಮೋಜಿ ಬೈಡೈರೆಕ್ಷನಲ್ ಸ್ವಿಚರ್" + "ಎಮೋಜಿ ಎದುರಿಸುತ್ತಿರುವ ದಿಕ್ಕನ್ನು ಬದಲಾಯಿಸಲಾಗಿದೆ" + "ಎಮೋಜಿ ವೇರಿಯಂಟ್ ಸೆಲೆಕ್ಟರ್" + "%1$s ಮತ್ತು %2$s" + "ನೆರಳು" + "ಲೈಟ್ ಸ್ಕಿನ್ ಟೋನ್" + "ಮೀಡಿಯಮ್ ಲೈಟ್ ಸ್ಕಿನ್ ಟೋನ್" + "ಮೀಡಿಯಮ್ ಸ್ಕಿನ್ ಟೋನ್" + "ಮೀಡಿಯಮ್ ಡಾರ್ಕ್ ಸ್ಕಿನ್ ಟೋನ್" + "ಡಾರ್ಕ್ ಸ್ಕಿನ್ ಟೋನ್" + diff --git a/emojipicker/src/main/res/values-ko/strings.xml b/emojipicker/src/main/res/values-ko/strings.xml new file mode 100644 index 00000000..22cace83 --- /dev/null +++ b/emojipicker/src/main/res/values-ko/strings.xml @@ -0,0 +1,42 @@ + + + + + "최근 사용" + "이모티콘 및 감정" + "사람" + "동물 및 자연" + "식음료" + "여행 및 장소" + "활동 및 이벤트" + "사물" + "기호" + "깃발" + "사용 가능한 그림 이모티콘 없음" + "아직 사용한 이모티콘이 없습니다." + "그림 이모티콘 양방향 전환기" + "이모티콘 방향 전환됨" + "그림 이모티콘 옵션 선택기" + "%1$s 및 %2$s" + "그림자" + "밝은 피부색" + "약간 밝은 피부색" + "중간 피부색" + "약간 어두운 피부색" + "어두운 피부색" + diff --git a/emojipicker/src/main/res/values-ky/strings.xml b/emojipicker/src/main/res/values-ky/strings.xml new file mode 100644 index 00000000..aa345469 --- /dev/null +++ b/emojipicker/src/main/res/values-ky/strings.xml @@ -0,0 +1,42 @@ + + + + + "АКЫРКЫ КОЛДОНУЛГАНДАР" + "БЫЙТЫКЧАЛАР ЖАНА ЭМОЦИЯЛАР" + "АДАМДАР" + "ЖАНЫБАРЛАР ЖАНА ЖАРАТЫЛЫШ" + "АЗЫК-ТҮЛҮК ЖАНА СУУСУНДУКТАР" + "САЯКАТ ЖАНА ЖЕРЛЕР" + "ИШ-АРАКЕТТЕР ЖАНА ИШ-ЧАРАЛАР" + "ОБЪЕКТТЕР" + "СИМВОЛДОР" + "ЖЕЛЕКТЕР" + "Жеткиликтүү быйтыкчалар жок" + "Бир да быйтыкча колдоно элексиз" + "эки тараптуу быйтыкча которгуч" + "быйтыкчанын багыты которулду" + "быйтыкча тандагыч" + "%1$s жана %2$s" + "көлөкө" + "ачык түстүү тери" + "агыраак түстүү тери" + "орточо түстүү тери" + "орточо кара тору түстүү тери" + "кара тору түстүү тери" + diff --git a/emojipicker/src/main/res/values-lo/strings.xml b/emojipicker/src/main/res/values-lo/strings.xml new file mode 100644 index 00000000..174400e0 --- /dev/null +++ b/emojipicker/src/main/res/values-lo/strings.xml @@ -0,0 +1,42 @@ + + + + + "ໃຊ້ຫຼ້າສຸດ" + "ໜ້າຍິ້ມ ແລະ ຄວາມຮູ້ສຶກ" + "ຜູ້ຄົນ" + "ສັດ ແລະ ທຳມະຊາດ" + "ອາຫານ ແລະ ເຄື່ອງດື່ມ" + "ການເດີນທາງ ແລະ ສະຖານທີ່" + "ການເຄື່ອນໄຫວ ແລະ ກິດຈະກຳ" + "ວັດຖຸ" + "ສັນຍາລັກ" + "ທຸງ" + "ບໍ່ມີອີໂມຈິໃຫ້ນຳໃຊ້" + "ທ່ານຍັງບໍ່ໄດ້ໃຊ້ອີໂມຈິໃດເທື່ອ" + "ຕົວສະຫຼັບອີໂມຈິແບບ 2 ທິດທາງ" + "ປ່ຽນທິດທາງການຫັນໜ້າຂອງອີໂມຈິແລ້ວ" + "ຕົວເລືອກຕົວແປອີໂມຈິ" + "%1$s ແລະ %2$s" + "ເງົາ" + "ສະກິນໂທນແຈ້ງ" + "ສະກິນໂທນແຈ້ງປານກາງ" + "ສະກິນໂທນປານກາງ" + "ສະກິນໂທນມືດປານກາງ" + "ສະກິນໂທນມືດ" + diff --git a/emojipicker/src/main/res/values-lt/strings.xml b/emojipicker/src/main/res/values-lt/strings.xml new file mode 100644 index 00000000..72390ae4 --- /dev/null +++ b/emojipicker/src/main/res/values-lt/strings.xml @@ -0,0 +1,42 @@ + + + + + "NESENIAI NAUDOTI" + "JAUSTUKAI IR EMOCIJOS" + "ŽMONĖS" + "GYVŪNAI IR GAMTA" + "MAISTAS IR GĖRIMAI" + "KELIONĖS IR VIETOS" + "VEIKLA IR ĮVYKIAI" + "OBJEKTAI" + "SIMBOLIAI" + "VĖLIAVOS" + "Nėra jokių pasiekiamų jaustukų" + "Dar nenaudojote jokių jaustukų" + "dvikryptis jaustukų perjungikli" + "perjungta jaustukų nuoroda" + "jaustuko varianto parinkiklis" + "%1$s ir %2$s" + "šešėlis" + "šviesi odos spalva" + "vidutiniškai šviesi odos spalva" + "nei tamsi, nei šviesi odos spalva" + "vidutiniškai tamsi odos spalva" + "tamsi odos spalva" + diff --git a/emojipicker/src/main/res/values-lv/strings.xml b/emojipicker/src/main/res/values-lv/strings.xml new file mode 100644 index 00000000..0fe66ac7 --- /dev/null +++ b/emojipicker/src/main/res/values-lv/strings.xml @@ -0,0 +1,42 @@ + + + + + "NESEN LIETOTAS" + "SMAIDIŅI UN EMOCIJAS" + "PERSONAS" + "DZĪVNIEKI UN DABA" + "ĒDIENI UN DZĒRIENI" + "CEĻOJUMI UN VIETAS" + "PASĀKUMI UN NOTIKUMI" + "OBJEKTI" + "SIMBOLI" + "KAROGI" + "Nav pieejamu emocijzīmju" + "Jūs vēl neesat izmantojis nevienu emocijzīmi" + "emocijzīmju divvirzienu pārslēdzējs" + "mainīts emocijzīmes virziens" + "emocijzīmes varianta atlasītājs" + "%1$s un %2$s" + "ēna" + "gaišs ādas tonis" + "vidēji gaišs ādas tonis" + "vidējs ādas tonis" + "vidēji tumšs ādas tonis" + "tumšs ādas tonis" + diff --git a/emojipicker/src/main/res/values-mk/strings.xml b/emojipicker/src/main/res/values-mk/strings.xml new file mode 100644 index 00000000..b7ceab0f --- /dev/null +++ b/emojipicker/src/main/res/values-mk/strings.xml @@ -0,0 +1,42 @@ + + + + + "НЕОДАМНА КОРИСТЕНИ" + "СМЕШКОВЦИ И ЕМОЦИИ" + "ЛУЃЕ" + "ЖИВОТНИ И ПРИРОДА" + "ХРАНА И ПИЈАЛАЦИ" + "ПАТУВАЊЕ И МЕСТА" + "АКТИВНОСТИ И НАСТАНИ" + "ОБЈЕКТИ" + "СИМБОЛИ" + "ЗНАМИЊА" + "Нема достапни емоџија" + "Сѐ уште не сте користеле емоџија" + "двонасочен менувач на емоџија" + "насоката во којашто е свртено емоџито е сменета" + "избирач на варијанти на емоџија" + "%1$s и %2$s" + "сенка" + "светол тон на кожата" + "средно светол тон на кожата" + "среден тон на кожата" + "средно темен тон на кожата" + "темен тон на кожата" + diff --git a/emojipicker/src/main/res/values-ml/strings.xml b/emojipicker/src/main/res/values-ml/strings.xml new file mode 100644 index 00000000..60b98570 --- /dev/null +++ b/emojipicker/src/main/res/values-ml/strings.xml @@ -0,0 +1,42 @@ + + + + + "അടുത്തിടെ ഉപയോഗിച്ചവ" + "സ്മൈലികളും ഇമോഷനുകളും" + "ആളുകൾ" + "മൃഗങ്ങളും പ്രകൃതിയും" + "ഭക്ഷണപാനീയങ്ങൾ" + "യാത്രയും സ്ഥലങ്ങളും" + "ആക്‌റ്റിവിറ്റികളും ഇവന്റുകളും" + "വസ്‌തുക്കൾ" + "ചിഹ്നങ്ങൾ" + "പതാകകൾ" + "ഇമോജികളൊന്നും ലഭ്യമല്ല" + "നിങ്ങൾ ഇതുവരെ ഇമോജികളൊന്നും ഉപയോഗിച്ചിട്ടില്ല" + "ഇമോജി ദ്വിദിശ സ്വിച്ചർ" + "ഇമോജിയുടെ ദിശ മാറ്റി" + "ഇമോജി വേരിയന്റ് സെലക്‌ടർ" + "%1$s, %2$s" + "ഷാഡോ" + "ലൈറ്റ് സ്‌കിൻ ടോൺ" + "മീഡിയം ലൈറ്റ് സ്‌കിൻ ടോൺ" + "മീഡിയം സ്‌കിൻ ടോൺ" + "മീഡിയം ഡാർക്ക് സ്‌കിൻ ടോൺ" + "ഡാർക്ക് സ്‌കിൻ ടോൺ" + diff --git a/emojipicker/src/main/res/values-mn/strings.xml b/emojipicker/src/main/res/values-mn/strings.xml new file mode 100644 index 00000000..6b07ea5a --- /dev/null +++ b/emojipicker/src/main/res/values-mn/strings.xml @@ -0,0 +1,42 @@ + + + + + "САЯХАН АШИГЛАСАН" + "ИНЭЭМСЭГЛЭЛ БОЛОН СЭТГЭЛ ХӨДЛӨЛ" + "ХҮМҮҮС" + "АМЬТАД БА БАЙГАЛЬ" + "ХООЛ БОЛОН УУХ ЗҮЙЛ" + "АЯЛАЛ БОЛОН ГАЗРУУД" + "ҮЙЛ АЖИЛЛАГАА БОЛОН АРГА ХЭМЖЭЭ" + "ОБЪЕКТ" + "ТЭМДЭГ" + "ТУГ" + "Боломжтой эможи алга" + "Та ямар нэгэн эможи ашиглаагүй байна" + "эможигийн хоёр чиглэлтэй сэлгүүр" + "эможигийн харж буй чиглэлийг сэлгэсэн" + "эможигийн хувилбар сонгогч" + "%1$s болон %2$s" + "сүүдэр" + "цайвар арьсны өнгө" + "дунд зэргийн цайвар арьсны өнгө" + "дунд зэргийн арьсны өнгө" + "дунд зэргийн бараан арьсны өнгө" + "бараан арьсны өнгө" + diff --git a/emojipicker/src/main/res/values-mr/strings.xml b/emojipicker/src/main/res/values-mr/strings.xml new file mode 100644 index 00000000..316b2c48 --- /dev/null +++ b/emojipicker/src/main/res/values-mr/strings.xml @@ -0,0 +1,42 @@ + + + + + "अलीकडे वापरलेला" + "स्मायली आणि भावना" + "लोक" + "प्राणी आणि निसर्ग" + "खाद्यपदार्थ आणि पेय" + "प्रवास आणि ठिकाणे" + "ॲक्टिव्हिटी आणि इव्हेंट" + "ऑब्जेक्ट" + "चिन्हे" + "ध्वज" + "कोणतेही इमोजी उपलब्ध नाहीत" + "तुम्ही अद्याप कोणतेही इमोजी वापरलेले नाहीत" + "इमोजीचा द्विदिश स्विचर" + "दिशा दाखवणारा इमोजी स्विच केला" + "इमोजी व्हेरीयंट सिलेक्टर" + "%1$s आणि %2$s" + "शॅडो" + "उजळ रंगाची त्वचा" + "मध्यम उजळ रंगाची त्वचा" + "मध्यम रंगाची त्वचा" + "मध्यम गडद रंगाची त्वचा" + "गडद रंगाची त्वचा" + diff --git a/emojipicker/src/main/res/values-ms/strings.xml b/emojipicker/src/main/res/values-ms/strings.xml new file mode 100644 index 00000000..d5ecef2d --- /dev/null +++ b/emojipicker/src/main/res/values-ms/strings.xml @@ -0,0 +1,42 @@ + + + + + "DIGUNAKAN BARU-BARU INI" + "SMILEY DAN EMOSI" + "ORANG" + "HAIWAN DAN ALAM SEMULA JADI" + "MAKANAN DAN MINUMAN" + "PERJALANAN DAN TEMPAT" + "AKTIVITI DAN ACARA" + "OBJEK" + "SIMBOL" + "BENDERA" + "Tiada emoji tersedia" + "Anda belum menggunakan mana-mana emoji lagi" + "penukar dwiarah emoji" + "emoji menghadap arah ditukar" + "pemilih varian emoji" + "%1$s dan %2$s" + "bebayang" + "ton kulit cerah" + "ton kulit sederhana cerah" + "ton kulit sederhana" + "ton kulit sederhana gelap" + "ton kulit gelap" + diff --git a/emojipicker/src/main/res/values-my/strings.xml b/emojipicker/src/main/res/values-my/strings.xml new file mode 100644 index 00000000..99fb7ff2 --- /dev/null +++ b/emojipicker/src/main/res/values-my/strings.xml @@ -0,0 +1,42 @@ + + + + + "မကြာသေးမီက သုံးထားသည်များ" + "စမိုင်းလီနှင့် ခံစားချက်များ" + "လူများ" + "တိရစ္ဆာန်များနှင့် သဘာဝ" + "အစားအသောက်" + "ခရီးသွားခြင်းနှင့် အရပ်ဒေသများ" + "လုပ်ဆောင်ချက်နှင့် အစီအစဉ်များ" + "အရာဝတ္ထုများ" + "သင်္ကေတများ" + "အလံများ" + "အီမိုဂျီ မရနိုင်ပါ" + "အီမိုဂျီ အသုံးမပြုသေးပါ" + "အီမိုဂျီ လမ်းကြောင်းနှစ်ခုပြောင်းစနစ်" + "အီမိုဂျီလှည့်သောဘက်ကို ပြောင်းထားသည်" + "အီမိုဂျီမူကွဲ ရွေးချယ်စနစ်" + "%1$s နှင့် %2$s" + "အရိပ်" + "ဖြူသည့် အသားအရောင်" + "အနည်းငယ်ဖြူသည့် အသားအရောင်" + "အလယ်အလတ် အသားအရောင်" + "အနည်းငယ်ညိုသည့် အသားအရောင်" + "ညိုသည့် အသားအရောင်" + diff --git a/emojipicker/src/main/res/values-nb/strings.xml b/emojipicker/src/main/res/values-nb/strings.xml new file mode 100644 index 00000000..368ef416 --- /dev/null +++ b/emojipicker/src/main/res/values-nb/strings.xml @@ -0,0 +1,42 @@ + + + + + "NYLIG BRUKT" + "SMILEFJES OG UTTRYKKSIKONER" + "PERSONER" + "DYR OG NATUR" + "MAT OG DRIKKE" + "REISE OG STEDER" + "AKTIVITETER OG ARRANGEMENTER" + "GJENSTANDER" + "SYMBOLER" + "FLAGG" + "Ingen emojier er tilgjengelige" + "Du har ikke brukt noen emojier ennå" + "toveisvelger for emoji" + "emojiretningen er slått på" + "velger for emojivariant" + "%1$s og %2$s" + "skygge" + "lys hudtone" + "middels lys hudtone" + "middels hudtone" + "middels mørk hudtone" + "mørk hudtone" + diff --git a/emojipicker/src/main/res/values-ne/strings.xml b/emojipicker/src/main/res/values-ne/strings.xml new file mode 100644 index 00000000..50a489be --- /dev/null +++ b/emojipicker/src/main/res/values-ne/strings.xml @@ -0,0 +1,42 @@ + + + + + "हालसालै प्रयोग गरिएको" + "स्माइली र भावनाहरू" + "मान्छेहरू" + "पशु र प्रकृति" + "खाद्य तथा पेय पदार्थ" + "यात्रा र ठाउँहरू" + "क्रियाकलाप तथा कार्यक्रमहरू" + "वस्तुहरू" + "चिन्हहरू" + "झन्डाहरू" + "कुनै पनि इमोजी उपलब्ध छैन" + "तपाईंले हालसम्म कुनै पनि इमोजी प्रयोग गर्नुभएको छैन" + "दुवै दिशामा लैजान सकिने स्विचरको इमोजी" + "इमोजी फर्केको दिशा बदलियो" + "इमोजी भेरियन्ट सेलेक्टर" + "%1$s र %2$s" + "छाया" + "छालाको फिक्का रङ" + "छालाको मध्यम फिक्का रङ" + "छालाको मध्यम रङ" + "छालाको मध्यम गाढा रङ" + "छालाको गाढा रङ" + diff --git a/emojipicker/src/main/res/values-nl/strings.xml b/emojipicker/src/main/res/values-nl/strings.xml new file mode 100644 index 00000000..12d8b405 --- /dev/null +++ b/emojipicker/src/main/res/values-nl/strings.xml @@ -0,0 +1,42 @@ + + + + + "ONLANGS GEBRUIKT" + "SMILEYS EN EMOTIES" + "MENSEN" + "DIEREN EN NATUUR" + "ETEN EN DRINKEN" + "REIZEN EN PLAATSEN" + "ACTIVITEITEN EN EVENEMENTEN" + "OBJECTEN" + "SYMBOLEN" + "VLAGGEN" + "Geen emoji\'s beschikbaar" + "Je hebt nog geen emoji\'s gebruikt" + "bidirectionele emoji-schakelaar" + "richting van emoji omgewisseld" + "emoji-variantkiezer" + "%1$s en %2$s" + "schaduw" + "lichte huidskleur" + "middellichte huidskleur" + "medium huidskleur" + "middeldonkere huidskleur" + "donkere huidskleur" + diff --git a/emojipicker/src/main/res/values-or/strings.xml b/emojipicker/src/main/res/values-or/strings.xml new file mode 100644 index 00000000..30ffd391 --- /dev/null +++ b/emojipicker/src/main/res/values-or/strings.xml @@ -0,0 +1,42 @@ + + + + + "ବର୍ତ୍ତମାନ ବ୍ୟବହାର କରାଯାଇଛି" + "ସ୍ମାଇଲି ଓ ଆବେଗଗୁଡ଼ିକ" + "ଲୋକମାନେ" + "ଜୀବଜନ୍ତୁ ଓ ପ୍ରକୃତି" + "ଖାଦ୍ୟ ଓ ପାନୀୟ" + "ଟ୍ରାଭେଲ ଓ ସ୍ଥାନଗୁଡ଼ିକ" + "କାର୍ଯ୍ୟକଳାପ ଓ ଇଭେଣ୍ଟଗୁଡ଼ିକ" + "ଅବଜେକ୍ଟଗୁଡ଼ିକ" + "ଚିହ୍ନଗୁଡ଼ିକ" + "ଫ୍ଲାଗଗୁଡ଼ିକ" + "କୌଣସି ଇମୋଜି ଉପଲବ୍ଧ ନାହିଁ" + "ଆପଣ ଏପର୍ଯ୍ୟନ୍ତ କୌଣସି ଇମୋଜି ବ୍ୟବହାର କରିନାହାଁନ୍ତି" + "ଇମୋଜିର ବାଇଡାଇରେକ୍ସନାଲ ସୁଇଚର" + "ଇମୋଜି ଫେସିଂ ଦିଗନିର୍ଦ୍ଦେଶ ସୁଇଚ କରାଯାଇଛି" + "ଇମୋଜି ଭାରିଏଣ୍ଟ ଚୟନକାରୀ" + "%1$s ଏବଂ %2$s" + "ସେଡୋ" + "ଲାଇଟ ସ୍କିନ ଟୋନ" + "ମଧ୍ୟମ ଲାଇଟ ସ୍କିନ ଟୋନ" + "ମଧ୍ୟମ ସ୍କିନ ଟୋନ" + "ମଧ୍ୟମ ଡାର୍କ ସ୍କିନ ଟୋନ" + "ଡାର୍କ ସ୍କିନ ଟୋନ" + diff --git a/emojipicker/src/main/res/values-pa/strings.xml b/emojipicker/src/main/res/values-pa/strings.xml new file mode 100644 index 00000000..85db6c7f --- /dev/null +++ b/emojipicker/src/main/res/values-pa/strings.xml @@ -0,0 +1,42 @@ + + + + + "ਹਾਲ ਹੀ ਵਿੱਚ ਵਰਤਿਆ ਗਿਆ" + "ਸਮਾਈਲੀ ਅਤੇ ਜਜ਼ਬਾਤ" + "ਲੋਕ" + "ਜਾਨਵਰ ਅਤੇ ਕੁਦਰਤ" + "ਖਾਣਾ ਅਤੇ ਪੀਣਾ" + "ਯਾਤਰਾ ਅਤੇ ਥਾਵਾਂ" + "ਸਰਗਰਮੀਆਂ ਅਤੇ ਇਵੈਂਟ" + "ਵਸਤੂਆਂ" + "ਚਿੰਨ੍ਹ" + "ਝੰਡੇ" + "ਕੋਈ ਇਮੋਜੀ ਉਪਲਬਧ ਨਹੀਂ ਹੈ" + "ਤੁਸੀਂ ਹਾਲੇ ਤੱਕ ਕਿਸੇ ਵੀ ਇਮੋਜੀ ਦੀ ਵਰਤੋਂ ਨਹੀਂ ਕੀਤੀ ਹੈ" + "ਇਮੋਜੀ ਬਾਇਡਾਇਰੈਕਸ਼ਨਲ ਸਵਿੱਚਰ" + "ਇਮੋਜੀ ਦੀ ਦਿਸ਼ਾ ਬਦਲ ਦਿੱਤੀ ਗਈ" + "ਇਮੋਜੀ ਕਿਸਮ ਚੋਣਕਾਰ" + "%1$s ਅਤੇ %2$s" + "ਸ਼ੈਡੋ" + "ਚਮੜੀ ਦਾ ਹਲਕਾ ਰੰਗ" + "ਚਮੜੀ ਦਾ ਦਰਮਿਆਨਾ ਹਲਕਾ ਰੰਗ" + "ਚਮੜੀ ਦਾ ਦਰਮਿਆਨਾ ਰੰਗ" + "ਚਮੜੀ ਦਾ ਦਰਮਿਆਨਾ ਗੂੜ੍ਹਾ ਰੰਗ" + "ਚਮੜੀ ਦਾ ਗੂੜ੍ਹਾ ਰੰਗ" + diff --git a/emojipicker/src/main/res/values-pl/strings.xml b/emojipicker/src/main/res/values-pl/strings.xml new file mode 100644 index 00000000..3ed8bd34 --- /dev/null +++ b/emojipicker/src/main/res/values-pl/strings.xml @@ -0,0 +1,42 @@ + + + + + "OSTATNIO UŻYWANE" + "EMOTIKONY" + "UCZESTNICY" + "ZWIERZĘTA I PRZYRODA" + "JEDZENIE I NAPOJE" + "PODRÓŻE I MIEJSCA" + "DZIAŁANIA I ZDARZENIA" + "PRZEDMIOTY" + "SYMBOLE" + "FLAGI" + "Brak dostępnych emotikonów" + "Żadne emotikony nie zostały jeszcze użyte" + "dwukierunkowy przełącznik emotikonów" + "zmieniono kierunek emotikonów" + "selektor wariantu emotikona" + "%1$s i %2$s" + "cień" + "jasny odcień skóry" + "średnio jasny odcień skóry" + "pośredni odcień skóry" + "średnio ciemny odcień skóry" + "ciemny odcień skóry" + diff --git a/emojipicker/src/main/res/values-pt-rBR/strings.xml b/emojipicker/src/main/res/values-pt-rBR/strings.xml new file mode 100644 index 00000000..5883fcb3 --- /dev/null +++ b/emojipicker/src/main/res/values-pt-rBR/strings.xml @@ -0,0 +1,42 @@ + + + + + "USADOS RECENTEMENTE" + "CARINHAS E EMOTICONS" + "PESSOAS" + "ANIMAIS E NATUREZA" + "COMIDAS E BEBIDAS" + "VIAGENS E LUGARES" + "ATIVIDADES E EVENTOS" + "OBJETOS" + "SÍMBOLOS" + "BANDEIRAS" + "Não há emojis disponíveis" + "Você ainda não usou emojis" + "seletor bidirecional de emojis" + "emoji virado para a direção trocada" + "seletor de variante do emoji" + "%1$s e %2$s" + "sombra" + "tom de pele claro" + "tom de pele médio-claro" + "tom de pele médio" + "tom de pele médio-escuro" + "tom de pele escuro" + diff --git a/emojipicker/src/main/res/values-pt-rPT/strings.xml b/emojipicker/src/main/res/values-pt-rPT/strings.xml new file mode 100644 index 00000000..2ef06acc --- /dev/null +++ b/emojipicker/src/main/res/values-pt-rPT/strings.xml @@ -0,0 +1,42 @@ + + + + + "USADOS RECENTEMENTE" + "EMOTICONS E ÍCONES EXPRESSIVOS" + "PESSOAS" + "ANIMAIS E NATUREZA" + "ALIMENTOS E BEBIDAS" + "VIAGENS E LOCAIS" + "ATIVIDADES E EVENTOS" + "OBJETOS" + "SÍMBOLOS" + "BANDEIRAS" + "Nenhum emoji disponível" + "Ainda não utilizou emojis" + "comutador bidirecional de emojis" + "direção voltada para o emoji alterada" + "seletor de variantes de emojis" + "%1$s e %2$s" + "sombra" + "tom de pele claro" + "tom de pele claro médio" + "tom de pele médio" + "tom de pele escuro médio" + "tom de pele escuro" + diff --git a/emojipicker/src/main/res/values-pt/strings.xml b/emojipicker/src/main/res/values-pt/strings.xml new file mode 100644 index 00000000..5883fcb3 --- /dev/null +++ b/emojipicker/src/main/res/values-pt/strings.xml @@ -0,0 +1,42 @@ + + + + + "USADOS RECENTEMENTE" + "CARINHAS E EMOTICONS" + "PESSOAS" + "ANIMAIS E NATUREZA" + "COMIDAS E BEBIDAS" + "VIAGENS E LUGARES" + "ATIVIDADES E EVENTOS" + "OBJETOS" + "SÍMBOLOS" + "BANDEIRAS" + "Não há emojis disponíveis" + "Você ainda não usou emojis" + "seletor bidirecional de emojis" + "emoji virado para a direção trocada" + "seletor de variante do emoji" + "%1$s e %2$s" + "sombra" + "tom de pele claro" + "tom de pele médio-claro" + "tom de pele médio" + "tom de pele médio-escuro" + "tom de pele escuro" + diff --git a/emojipicker/src/main/res/values-ro/strings.xml b/emojipicker/src/main/res/values-ro/strings.xml new file mode 100644 index 00000000..45fad5a7 --- /dev/null +++ b/emojipicker/src/main/res/values-ro/strings.xml @@ -0,0 +1,42 @@ + + + + + "FOLOSITE RECENT" + "EMOTICOANE ȘI EMOȚII" + "PERSOANE" + "ANIMALE ȘI NATURĂ" + "MÂNCARE ȘI BĂUTURĂ" + "CĂLĂTORII ȘI LOCAȚII" + "ACTIVITĂȚI ȘI EVENIMENTE" + "OBIECTE" + "SIMBOLURI" + "STEAGURI" + "Nu sunt disponibile emoji-uri" + "Încă nu ai folosit emoji" + "comutator bidirecțional de emojiuri" + "direcția de orientare a emojiului comutată" + "selector de variante de emoji" + "%1$s și %2$s" + "umbră" + "nuanță deschisă a pielii" + "nuanță deschisă medie a pielii" + "nuanță medie a pielii" + "nuanță închisă medie a pielii" + "nuanță închisă a pielii" + diff --git a/emojipicker/src/main/res/values-ru/strings.xml b/emojipicker/src/main/res/values-ru/strings.xml new file mode 100644 index 00000000..ecf42faa --- /dev/null +++ b/emojipicker/src/main/res/values-ru/strings.xml @@ -0,0 +1,42 @@ + + + + + "НЕДАВНИЕ" + "СМАЙЛИКИ И ЭМОЦИИ" + "ЛЮДИ" + "ПРИРОДА И ЖИВОТНЫЕ" + "ЕДА И НАПИТКИ" + "ПУТЕШЕСТВИЯ" + "ДЕЙСТВИЯ И СОБЫТИЯ" + "ОБЪЕКТЫ" + "СИМВОЛЫ" + "ФЛАГИ" + "Нет доступных эмодзи" + "Вы ещё не использовали эмодзи" + "Двухсторонний переключатель эмодзи" + "изменен поворот лица эмодзи" + "выбор вариантов эмодзи" + "%1$s и %2$s" + "теневой" + "светлый оттенок кожи" + "умеренно светлый оттенок кожи" + "нейтральный оттенок кожи" + "умеренно темный оттенок кожи" + "темный оттенок кожи" + diff --git a/emojipicker/src/main/res/values-si/strings.xml b/emojipicker/src/main/res/values-si/strings.xml new file mode 100644 index 00000000..2ecdc77b --- /dev/null +++ b/emojipicker/src/main/res/values-si/strings.xml @@ -0,0 +1,42 @@ + + + + + "මෑතදී භාවිත කළ" + "සිනාසීම් සහ චිත්තවේග" + "පුද්ගලයින්" + "සතුන් හා ස්වභාවධර්මය" + "ආහාර පාන" + "සංචාර හා ස්ථාන" + "ක්‍රියාකාරකම් සහ සිදුවීම්" + "වස්තු" + "සංකේත" + "ධජ" + "ඉමොජි කිසිවක් නොලැබේ" + "ඔබ තවමත් කිසිදු ඉමෝජියක් භාවිතා කර නැත" + "ද්විත්ව දිශා ඉමොජි මාරුකරණය" + "ඉමොජි මුහුණ දෙන දිශාව මාරු විය" + "ඉමොජි ප්‍රභේද තෝරකය" + "%1$s සහ %2$s" + "සෙවනැල්ල" + "ලා සමේ වර්ණය" + "මධ්‍යම ලා සම් වර්ණය" + "මධ්‍යම සම් වර්ණය" + "මධ්‍යම අඳුරු සම් වර්ණය" + "අඳුරු සම් වර්ණය" + diff --git a/emojipicker/src/main/res/values-sk/strings.xml b/emojipicker/src/main/res/values-sk/strings.xml new file mode 100644 index 00000000..11ed0eea --- /dev/null +++ b/emojipicker/src/main/res/values-sk/strings.xml @@ -0,0 +1,42 @@ + + + + + "NEDÁVNO POUŽITÉ" + "SMAJLÍKY A EMÓCIE" + "ĽUDIA" + "ZVIERATÁ A PRÍRODA" + "JEDLO A NÁPOJE" + "CESTOVANIE A MIESTA" + "AKTIVITY A UDALOSTI" + "PREDMETY" + "SYMBOLY" + "VLAJKY" + "Nie sú k dispozícii žiadne emodži" + "Zatiaľ ste nepoužili žiadne emodži" + "obojsmerný prepínač emodži" + "smer otočenia emodži bol prepnutý" + "selektor variantu emodži" + "%1$s a %2$s" + "tieň" + "svetlý odtieň pokožky" + "stredne svetlý odtieň pokožky" + "stredný odtieň pokožky" + "stredne tmavý odtieň pokožky" + "tmavý odtieň pokožky" + diff --git a/emojipicker/src/main/res/values-sl/strings.xml b/emojipicker/src/main/res/values-sl/strings.xml new file mode 100644 index 00000000..f345226d --- /dev/null +++ b/emojipicker/src/main/res/values-sl/strings.xml @@ -0,0 +1,42 @@ + + + + + "NEDAVNO UPORABLJENI" + "ČUSTVENI SIMBOLI IN ČUSTVA" + "OSEBE" + "ŽIVALI IN NARAVA" + "HRANA IN PIJAČA" + "POTOVANJE IN MESTA" + "DEJAVNOSTI IN DOGODKI" + "PREDMETI" + "SIMBOLI" + "ZASTAVE" + "Ni emodžijev" + "Uporabili niste še nobenega emodžija." + "dvosmerni preklopnik emodžijev" + "preklopljena usmerjenost emodžija" + "Izbirnik različice emodžija" + "%1$s in %2$s" + "senčenje" + "svetel odtenek kože" + "srednje svetel odtenek kože" + "srednji odtenek kože" + "srednje temen odtenek kože" + "temen odtenek kože" + diff --git a/emojipicker/src/main/res/values-sq/strings.xml b/emojipicker/src/main/res/values-sq/strings.xml new file mode 100644 index 00000000..f30f751e --- /dev/null +++ b/emojipicker/src/main/res/values-sq/strings.xml @@ -0,0 +1,42 @@ + + + + + "PËRDORUR SË FUNDI" + "BUZËQESHJE DHE EMOCIONE" + "NJERËZ" + "KAFSHË DHE NATYRË" + "USHQIME DHE PIJE" + "UDHËTIME DHE VENDE" + "AKTIVITETE DHE NGJARJE" + "OBJEKTE" + "SIMBOLE" + "FLAMUJ" + "Nuk ofrohen emoji" + "Nuk ke përdorur ende asnjë emoji" + "ndërruesi me dy drejtime për emoji-t" + "drejtimi i emoji-t u ndryshua" + "përzgjedhësi i variantit të emoji-t" + "%1$s dhe %2$s" + "hije" + "ton lëkure i zbehtë" + "ton lëkure mesatarisht i zbehtë" + "ton lëkure mesatar" + "ton lëkure mesatarisht i errët" + "ton lëkure i errët" + diff --git a/emojipicker/src/main/res/values-sr/strings.xml b/emojipicker/src/main/res/values-sr/strings.xml new file mode 100644 index 00000000..67d3619f --- /dev/null +++ b/emojipicker/src/main/res/values-sr/strings.xml @@ -0,0 +1,42 @@ + + + + + "НЕДАВНО КОРИШЋЕНО" + "СМАЈЛИЈИ И ЕМОЦИЈЕ" + "ЉУДИ" + "ЖИВОТИЊЕ И ПРИРОДА" + "ХРАНА И ПИЋЕ" + "ПУТОВАЊА И МЕСТА" + "АКТИВНОСТИ И ДОГАЂАЈИ" + "ОБЈЕКТИ" + "СИМБОЛИ" + "ЗАСТАВЕ" + "Емоџији нису доступни" + "Још нисте користили емоџије" + "двосмерни пребацивач емоџија" + "смер емоџија је промењен" + "бирач варијанти емоџија" + "%1$s и %2$s" + "сенка" + "кожа светле пути" + "кожа средњесветле пути" + "кожа средње пути" + "кожа средњетамне пути" + "кожа тамне пути" + diff --git a/emojipicker/src/main/res/values-sv/strings.xml b/emojipicker/src/main/res/values-sv/strings.xml new file mode 100644 index 00000000..dede0672 --- /dev/null +++ b/emojipicker/src/main/res/values-sv/strings.xml @@ -0,0 +1,42 @@ + + + + + "NYLIGEN ANVÄNDA" + "KÄNSLOIKONER OCH KÄNSLOR" + "PERSONER" + "DJUR OCH NATUR" + "MAT OCH DRYCK" + "RESOR OCH PLATSER" + "AKTIVITETER OCH HÄNDELSER" + "FÖREMÅL" + "SYMBOLER" + "FLAGGOR" + "Inga emojier tillgängliga" + "Du har ännu inte använt emojis" + "dubbelriktad emojiväxlare" + "emojins riktning har bytts" + "Väljare av emoji-varianter" + "%1$s och %2$s" + "skugga" + "ljus hudfärg" + "medelljus hudfärg" + "medelmörk hudfärg" + "mellanmörk hudfärg" + "mörk hudfärg" + diff --git a/emojipicker/src/main/res/values-sw/strings.xml b/emojipicker/src/main/res/values-sw/strings.xml new file mode 100644 index 00000000..3f7e24b0 --- /dev/null +++ b/emojipicker/src/main/res/values-sw/strings.xml @@ -0,0 +1,42 @@ + + + + + "ZILIZOTUMIKA HIVI MAJUZI" + "VICHESHI NA HISIA" + "WATU" + "WANYAMA NA MAZINGIRA" + "VYAKULA NA VINYWAJI" + "SAFARI NA MAENEO" + "SHUGHULI NA MATUKIO" + "VITU" + "ALAMA" + "BENDERA" + "Hakuna emoji zinazopatikana" + "Bado hujatumia emoji zozote" + "kibadilishaji cha emoji cha pande mbili" + "imebadilisha upande ambao emoji inaangalia" + "kiteuzi cha kibadala cha emoji" + "%1$s na %2$s" + "kivuli" + "ngozi ya rangi nyeupe" + "ngozi ya rangi nyeupe kiasi" + "ngozi ya rangi ya maji ya kunde" + "ngozi ya rangi nyeusi kiasi" + "ngozi ya rangi nyeusi" + diff --git a/emojipicker/src/main/res/values-ta/strings.xml b/emojipicker/src/main/res/values-ta/strings.xml new file mode 100644 index 00000000..5954c77f --- /dev/null +++ b/emojipicker/src/main/res/values-ta/strings.xml @@ -0,0 +1,42 @@ + + + + + "சமீபத்தில் பயன்படுத்தியவை" + "ஸ்மைலிகளும் எமோடிகான்களும்" + "நபர்" + "விலங்குகளும் இயற்கையும்" + "உணவும் பானமும்" + "பயணமும் இடங்களும்" + "செயல்பாடுகளும் நிகழ்வுகளும்" + "பொருட்கள்" + "சின்னங்கள்" + "கொடிகள்" + "ஈமோஜிகள் எதுவுமில்லை" + "இதுவரை ஈமோஜி எதையும் நீங்கள் பயன்படுத்தவில்லை" + "ஈமோஜி இருபக்க மாற்றி" + "ஈமோஜி காட்டப்படும் திசை மாற்றப்பட்டது" + "ஈமோஜி வகைத் தேர்வி" + "%1$s மற்றும் %2$s" + "நிழல்" + "வெள்ளை நிறம்" + "கொஞ்சம் வெள்ளை நிறம்" + "மாநிறம்" + "கொஞ்சம் கருநிறம்" + "கருநிறம்" + diff --git a/emojipicker/src/main/res/values-te/strings.xml b/emojipicker/src/main/res/values-te/strings.xml new file mode 100644 index 00000000..db21e73a --- /dev/null +++ b/emojipicker/src/main/res/values-te/strings.xml @@ -0,0 +1,42 @@ + + + + + "ఇటీవల ఉపయోగించినవి" + "స్మైలీలు, ఎమోషన్‌లు" + "వ్యక్తులు" + "జంతువులు, ప్రకృతి" + "ఆహారం, పానీయం" + "ప్రయాణం, స్థలాలు" + "యాక్టివిటీలు, ఈవెంట్‌లు" + "ఆబ్జెక్ట్‌లు" + "గుర్తులు" + "ఫ్లాగ్‌లు" + "ఎమోజీలు ఏవీ అందుబాటులో లేవు" + "మీరు ఇంకా ఎమోజీలు ఏవీ ఉపయోగించలేదు" + "ఎమోజీ ద్విదిశాత్మక స్విచ్చర్" + "ఎమోజీ దిశ మార్చబడింది" + "ఎమోజి రకాన్ని ఎంపిక చేసే సాధనం" + "%1$s, %2$s" + "షాడో" + "లైట్ స్కిన్ రంగు" + "చామనఛాయ లైట్ స్కిన్ రంగు" + "చామనఛాయ స్కిన్ రంగు" + "చామనఛాయ డార్క్ స్కిన్ రంగు" + "డార్క్ స్కిన్ రంగు" + diff --git a/emojipicker/src/main/res/values-th/strings.xml b/emojipicker/src/main/res/values-th/strings.xml new file mode 100644 index 00000000..74d28694 --- /dev/null +++ b/emojipicker/src/main/res/values-th/strings.xml @@ -0,0 +1,42 @@ + + + + + "ใช้ล่าสุด" + "หน้ายิ้มและอารมณ์" + "ผู้คน" + "สัตว์และธรรมชาติ" + "อาหารและเครื่องดื่ม" + "การเดินทางและสถานที่" + "กิจกรรมและเหตุการณ์" + "วัตถุ" + "สัญลักษณ์" + "ธง" + "ไม่มีอีโมจิ" + "คุณยังไม่ได้ใช้อีโมจิเลย" + "ตัวสลับอีโมจิแบบ 2 ทาง" + "เปลี่ยนทิศทางการหันหน้าของอีโมจิแล้ว" + "ตัวเลือกตัวแปรอีโมจิ" + "%1$s และ %2$s" + "เงา" + "โทนผิวสีอ่อน" + "โทนผิวสีอ่อนปานกลาง" + "โทนผิวสีปานกลาง" + "โทนผิวสีเข้มปานกลาง" + "โทนผิวสีเข้ม" + diff --git a/emojipicker/src/main/res/values-tl/strings.xml b/emojipicker/src/main/res/values-tl/strings.xml new file mode 100644 index 00000000..2a14fba7 --- /dev/null +++ b/emojipicker/src/main/res/values-tl/strings.xml @@ -0,0 +1,42 @@ + + + + + "KAMAKAILANG GINAMIT" + "MGA SMILEY AT MGA EMOSYON" + "MGA TAO" + "MGA HAYOP AT KALIKASAN" + "PAGKAIN AT INUMIN" + "PAGLALAKBAY AT MGA LUGAR" + "MGA AKTIBIDAD AT EVENT" + "MGA BAGAY" + "MGA SIMBOLO" + "MGA BANDILA" + "Walang available na emoji" + "Hindi ka pa gumamit ng anumang emoji" + "bidirectional na switcher ng emoji" + "pinalitan ang direksyon kung saan nakaharap ang emoji" + "selector ng variant ng emoji" + "%1$s at %2$s" + "shadow" + "maputing kulay ng balat" + "katamtamang maputing kulay ng balat" + "katamtamang kulay ng balat" + "katamtamang maitim na kulay ng balat" + "maitim na kulay ng balat" + diff --git a/emojipicker/src/main/res/values-tr/strings.xml b/emojipicker/src/main/res/values-tr/strings.xml new file mode 100644 index 00000000..f0d13cdd --- /dev/null +++ b/emojipicker/src/main/res/values-tr/strings.xml @@ -0,0 +1,42 @@ + + + + + "SON KULLANILANLAR" + "SMILEY\'LER VE İFADELER" + "İNSANLAR" + "HAYVANLAR VE DOĞA" + "YİYECEK VE İÇECEK" + "SEYAHAT VE YERLER" + "AKTİVİTELER VE ETKİNLİKLER" + "NESNELER" + "SEMBOLLER" + "BAYRAKLAR" + "Kullanılabilir emoji yok" + "Henüz emoji kullanmadınız" + "çift yönlü emoji değiştirici" + "emoji yönü değiştirildi" + "emoji varyant seçici" + "%1$s ve %2$s" + "gölge" + "açık ten rengi" + "orta-açık ten rengi" + "orta ten rengi" + "orta-koyu ten rengi" + "koyu ten rengi" + diff --git a/emojipicker/src/main/res/values-uk/strings.xml b/emojipicker/src/main/res/values-uk/strings.xml new file mode 100644 index 00000000..46e9e3dc --- /dev/null +++ b/emojipicker/src/main/res/values-uk/strings.xml @@ -0,0 +1,42 @@ + + + + + "НЕЩОДАВНО ВИКОРИСТАНІ" + "СМАЙЛИКИ Й ЕМОЦІЇ" + "ЛЮДИ" + "ТВАРИНИ Й ПРИРОДА" + "ЇЖА Й НАПОЇ" + "ПОДОРОЖІ Й МІСЦЯ" + "АКТИВНІСТЬ І ПОДІЇ" + "ОБ’ЄКТИ" + "СИМВОЛИ" + "ПРАПОРИ" + "Немає смайлів" + "Ви ще не використовували смайли" + "двосторонній перемикач смайлів" + "змінено напрям обличчя смайлів" + "засіб вибору варіанта смайла" + "%1$s і %2$s" + "тінь" + "світлий відтінок шкіри" + "помірно світлий відтінок шкіри" + "помірний відтінок шкіри" + "помірно темний відтінок шкіри" + "темний відтінок шкіри" + diff --git a/emojipicker/src/main/res/values-ur/strings.xml b/emojipicker/src/main/res/values-ur/strings.xml new file mode 100644 index 00000000..68fa937d --- /dev/null +++ b/emojipicker/src/main/res/values-ur/strings.xml @@ -0,0 +1,42 @@ + + + + + "حال ہی میں استعمال کردہ" + "اسمائلیز اور جذبات" + "لوگ" + "جانور اور قدرت" + "خوراک اور مشروب" + "سفر اور جگہیں" + "سرگرمیاں اور ایونٹس" + "آبجیکٹس" + "علامات" + "جھنڈے" + "کوئی بھی ایموجی دستیاب نہیں ہے" + "آپ نے ابھی تک کوئی بھی ایموجی استعمال نہیں کی ہے" + "دو طرفہ سوئچر ایموجی" + "ایموجی کا سمتِ رخ سوئچ کر دیا گیا" + "ایموجی کی قسم کا منتخب کنندہ" + "‏‎%1$s اور ‎%2$s" + "پرچھائیں" + "جلد کا ہلکا ٹون" + "جلد کا متوسط ہلکا ٹون" + "جلد کا متوسط ٹون" + "جلد کا متوسط گہرا ٹون" + "جلد کا گہرا ٹون" + diff --git a/emojipicker/src/main/res/values-uz/strings.xml b/emojipicker/src/main/res/values-uz/strings.xml new file mode 100644 index 00000000..6610ffd5 --- /dev/null +++ b/emojipicker/src/main/res/values-uz/strings.xml @@ -0,0 +1,42 @@ + + + + + "YAQINDA ISHLATILGAN" + "KULGICH VA EMOJILAR" + "ODAMLAR" + "HAYVONLAR VA TABIAT" + "TAOM VA ICHIMLIKLAR" + "SAYOHAT VA JOYLAR" + "HODISA VA TADBIRLAR" + "BUYUMLAR" + "BELGILAR" + "BAYROQCHALAR" + "Hech qanday emoji mavjud emas" + "Hanuz birorta emoji ishlatmagansiz" + "ikki tomonlama emoji almashtirgich" + "emoji yuzlanish tomoni almashdi" + "emoji variant tanlagich" + "%1$s va %2$s" + "soya" + "och rang tusli" + "oʻrtacha och rang tusli" + "neytral rang tusli" + "oʻrtacha toʻq rang tusli" + "toʻq rang tusli" + diff --git a/emojipicker/src/main/res/values-vi/strings.xml b/emojipicker/src/main/res/values-vi/strings.xml new file mode 100644 index 00000000..9e1eac8e --- /dev/null +++ b/emojipicker/src/main/res/values-vi/strings.xml @@ -0,0 +1,42 @@ + + + + + "MỚI DÙNG GẦN ĐÂY" + "MẶT CƯỜI VÀ BIỂU TƯỢNG CẢM XÚC" + "MỌI NGƯỜI" + "ĐỘNG VẬT VÀ THIÊN NHIÊN" + "THỰC PHẨM VÀ ĐỒ UỐNG" + "DU LỊCH VÀ ĐỊA ĐIỂM" + "HOẠT ĐỘNG VÀ SỰ KIỆN" + "ĐỒ VẬT" + "BIỂU TƯỢNG" + "CỜ" + "Không có biểu tượng cảm xúc nào" + "Bạn chưa sử dụng biểu tượng cảm xúc nào" + "trình chuyển đổi hai chiều biểu tượng cảm xúc" + "đã chuyển hướng mặt của biểu tượng cảm xúc" + "bộ chọn biến thể biểu tượng cảm xúc" + "%1$s và %2$s" + "bóng" + "tông màu da sáng" + "tông màu da sáng trung bình" + "tông màu da trung bình" + "tông màu da tối trung bình" + "tông màu da tối" + diff --git a/emojipicker/src/main/res/values-zh-rCN/strings.xml b/emojipicker/src/main/res/values-zh-rCN/strings.xml new file mode 100644 index 00000000..453eb005 --- /dev/null +++ b/emojipicker/src/main/res/values-zh-rCN/strings.xml @@ -0,0 +1,42 @@ + + + + + "最近使用过" + "表情符号" + "人物" + "动物和自然" + "食品和饮料" + "旅游和地点" + "活动和庆典" + "物体" + "符号" + "旗帜" + "没有可用的表情符号" + "您尚未使用过任何表情符号" + "表情符号双向切换器" + "已切换表情符号朝向" + "表情符号变体选择器" + "%1$s和%2$s" + "阴影" + "浅肤色" + "中等偏浅肤色" + "中等肤色" + "中等偏深肤色" + "深肤色" + diff --git a/emojipicker/src/main/res/values-zh-rHK/strings.xml b/emojipicker/src/main/res/values-zh-rHK/strings.xml new file mode 100644 index 00000000..21b7318f --- /dev/null +++ b/emojipicker/src/main/res/values-zh-rHK/strings.xml @@ -0,0 +1,42 @@ + + + + + "最近使用過" + "表情符號" + "人物" + "動物和大自然" + "飲食" + "旅遊和地點" + "活動和事件" + "物件" + "符號" + "旗幟" + "沒有可用的 Emoji" + "你尚未使用任何 Emoji" + "Emoji 雙向切換工具" + "轉咗 Emoji 方向" + "Emoji 變化版本選取器" + "%1$s和%2$s" + "陰影" + "淺膚色" + "偏淺膚色" + "中等膚色" + "偏深膚色" + "深膚色" + diff --git a/emojipicker/src/main/res/values-zh-rTW/strings.xml b/emojipicker/src/main/res/values-zh-rTW/strings.xml new file mode 100644 index 00000000..546e9de2 --- /dev/null +++ b/emojipicker/src/main/res/values-zh-rTW/strings.xml @@ -0,0 +1,42 @@ + + + + + "最近使用過" + "表情符號" + "人物" + "動物與大自然" + "飲食" + "旅行與地點" + "活動與事件" + "物品" + "符號" + "旗幟" + "沒有可用的表情符號" + "你尚未使用任何表情符號" + "表情符號雙向切換器" + "已切換表情符號方向" + "表情符號變化版本選取器" + "%1$s和%2$s" + "陰影" + "淺膚色" + "偏淺膚色" + "中等膚色" + "偏深膚色" + "深膚色" + diff --git a/emojipicker/src/main/res/values-zu/strings.xml b/emojipicker/src/main/res/values-zu/strings.xml new file mode 100644 index 00000000..3918f298 --- /dev/null +++ b/emojipicker/src/main/res/values-zu/strings.xml @@ -0,0 +1,42 @@ + + + + + "EZISANDA KUSETSHENZISWA" + "AMASMAYILI NEMIZWA" + "ABANTU" + "IZILWANE NENDALO" + "UKUDLA NESIPHUZO" + "UKUVAKASHA NEZINDAWO" + "IMISEBENZI NEMICIMBI" + "IZINTO" + "AMASIMBULI" + "AMAFULEGI" + "Awekho ama-emoji atholakalayo" + "Awukasebenzisi noma yimaphi ama-emoji okwamanje" + "isishintshi se-emoji ye-bidirectional" + "isikhombisi-ndlela esibheke ku-emoji sishintshiwe" + "isikhethi esihlukile se-emoji" + "Okuthi %1$s nokuthi %2$s" + "isithunzi" + "ibala lesikhumba elikhanyayo" + "ibala lesikhumba elikhanya ngokumaphakathi" + "ibala lesikhumba eliphakathi nendawo" + "ibala lesikhumba elinsundu ngokumaphakathi" + "ibala lesikhumba elimnyama" + diff --git a/emojipicker/src/main/res/values/arrays.xml b/emojipicker/src/main/res/values/arrays.xml new file mode 100644 index 00000000..8c132896 --- /dev/null +++ b/emojipicker/src/main/res/values/arrays.xml @@ -0,0 +1,54 @@ + + + + + + @raw/emoji_category_emotions + @raw/emoji_category_people + @raw/emoji_category_animals_nature + @raw/emoji_category_food_drink + @raw/emoji_category_travel_places + @raw/emoji_category_activity + @raw/emoji_category_objects + @raw/emoji_category_symbols + @raw/emoji_category_flags + + + + + @raw/emoji_category_emotions + + @raw/emoji_category_animals_nature + @raw/emoji_category_food_drink + @raw/emoji_category_travel_places + @raw/emoji_category_activity + @raw/emoji_category_objects + @raw/emoji_category_symbols + @raw/emoji_category_flags + + + + @drawable/gm_filled_emoji_emotions_vd_theme_24 + @drawable/gm_filled_emoji_people_vd_theme_24 + @drawable/gm_filled_emoji_nature_vd_theme_24 + @drawable/gm_filled_emoji_food_beverage_vd_theme_24 + @drawable/gm_filled_emoji_transportation_vd_theme_24 + @drawable/gm_filled_emoji_events_vd_theme_24 + @drawable/gm_filled_emoji_objects_vd_theme_24 + @drawable/gm_filled_emoji_symbols_vd_theme_24 + @drawable/gm_filled_flag_vd_theme_24 + + + + @string/emoji_category_emotions + @string/emoji_category_people + @string/emoji_category_animals_nature + @string/emoji_category_food_drink + @string/emoji_category_travel_places + @string/emoji_category_activity + @string/emoji_category_objects + @string/emoji_category_symbols + @string/emoji_category_flags + + \ No newline at end of file diff --git a/emojipicker/src/main/res/values/attrs.xml b/emojipicker/src/main/res/values/attrs.xml new file mode 100644 index 00000000..8804c3eb --- /dev/null +++ b/emojipicker/src/main/res/values/attrs.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/emojipicker/src/main/res/values/colors.xml b/emojipicker/src/main/res/values/colors.xml new file mode 100644 index 00000000..62ab68f2 --- /dev/null +++ b/emojipicker/src/main/res/values/colors.xml @@ -0,0 +1,12 @@ + + + + + #edbd82 + #ba8f63 + #91674d + #875334 + #4a2f27 + + #ffffff + diff --git a/emojipicker/src/main/res/values/dimens.xml b/emojipicker/src/main/res/values/dimens.xml new file mode 100644 index 00000000..fb44ef4d --- /dev/null +++ b/emojipicker/src/main/res/values/dimens.xml @@ -0,0 +1,24 @@ + + + + + 39dp + 46dp + 20dp + 20dp + 28dp + 2dp + 42dp + 5dp + 5dp + 5dp + 10dp + 10dp + 10dp + 8dp + 30dp + 6dp + 24dp + 4dp + 2dp + \ No newline at end of file diff --git a/emojipicker/src/main/res/values/strings.xml b/emojipicker/src/main/res/values/strings.xml new file mode 100644 index 00000000..ddfd2110 --- /dev/null +++ b/emojipicker/src/main/res/values/strings.xml @@ -0,0 +1,61 @@ + + + + + RECENTLY USED + + SMILEYS AND EMOTIONS + + PEOPLE + + ANIMALS AND NATURE + + FOOD AND DRINK + + TRAVEL AND PLACES + + ACTIVITIES AND EVENTS + + OBJECTS + + SYMBOLS + + FLAGS + + + No emojis available + + You haven\'t used any emojis yet + + + emoji bidirectional switcher + + + emoji facing direction switched + + + emoji variant selector + + + %1$s and %2$s + + + shadow + + + light skin tone + + + medium light skin tone + + + medium skin tone + + + medium dark skin tone + + + dark skin tone + diff --git a/emojipicker/src/main/res/values/styles.xml b/emojipicker/src/main/res/values/styles.xml new file mode 100644 index 00000000..7f7fd86a --- /dev/null +++ b/emojipicker/src/main/res/values/styles.xml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + diff --git a/emojipicker/src/test/java/com/rishabh/emojipicker/ExampleUnitTest.kt b/emojipicker/src/test/java/com/rishabh/emojipicker/ExampleUnitTest.kt new file mode 100644 index 00000000..a2585b6e --- /dev/null +++ b/emojipicker/src/test/java/com/rishabh/emojipicker/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package com.rishabh.emojipicker + +import org.junit.Test + +import org.junit.Assert.* + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index c70c8b3e..32553a10 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -14,13 +14,33 @@ room = "2.8.3" #Fossify commons = "5.7.3" #Gradle -gradlePlugins-agp = "8.11.1" +gradlePlugins-agp = "8.13.1" #build app-build-compileSDKVersion = "36" app-build-targetSDK = "36" app-build-minimumSDK = "26" app-build-javaVersion = "VERSION_17" app-build-kotlinJVMTarget = "17" + +#Androidx And EmojiPicker +androidx-coreKtx = "1.12.0" +androidx-appcompat = "1.6.1" +emoji2 = "1.6.0" +junit = "4.13.2" +androidx-test-ext-junit = "1.1.5" +espresso-core = "3.5.1" +kotlinxCoroutinesAndroid = "1.7.3" +kotlinxCoroutinesPlayServices = "1.7.3" +kotlinxCoroutinesGuava = "1.7.3" +coreKtx = "1.15.0" +coreVersion = "1.6.1" +runner = "1.6.2" +rules = "1.6.1" +material = "1.11.0" +firebaseCrashlyticsBuildtools = "3.0.3" + + + [libraries] #AndroidX androidx-autofill = { module = "androidx.autofill:autofill", version.ref = "androidx-autofill" } @@ -33,13 +53,40 @@ androidx-room-compiler = { module = "androidx.room:room-compiler", version.ref = compose-detekt = { module = "io.nlopez.compose.rules:detekt", version.ref = "detektCompose" } #Fossify fossify-commons = { module = "org.fossify:commons", version.ref = "commons" } + +#emoji picker +androidx-core-ktx = { module = "androidx.core:core-ktx", version.ref = "androidx-coreKtx" } +androidx-appcompat = { module = "androidx.appcompat:appcompat", version.ref = "androidx-appcompat" } +material = { group = "com.google.android.material", name = "material", version.ref = "material" } +androidx-emoji2 = { module = "androidx.emoji2:emoji2", version.ref = "emoji2" } +junit = { group = "junit", name = "junit", version.ref = "junit" } +androidx-test-ext-junit = { group = "androidx.test.ext", name = "junit", version.ref = "androidx-test-ext-junit" } +espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espresso-core" } +kotlinx-coroutines-android = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-android", version.ref = "kotlinxCoroutinesAndroid" } +androidx-core = { module = "androidx.core:core", version.ref = "coreKtx" } +kotlin-stdlib = { module = "org.jetbrains.kotlin:kotlin-stdlib", version.ref = "kotlin" } +kotlinx-coroutines-guava = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-guava", version.ref = "kotlinxCoroutinesGuava" } +test-core = { module = "androidx.test:core", version.ref = "coreVersion" } +androidx-runner = { module = "androidx.test:runner", version.ref = "runner" } +androidx-rules = { module = "androidx.test:rules", version.ref = "rules" } +firebase-crashlytics-buildtools = { module = "com.google.firebase:firebase-crashlytics-buildtools", version.ref = "firebaseCrashlyticsBuildtools" } +kotlinx-coroutines-play-services = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-play-services", version.ref = "kotlinxCoroutinesPlayServices" } + + + [bundles] room = [ "androidx-room-ktx", "androidx-room-runtime", ] + + + + + [plugins] android = { id = "com.android.application", version.ref = "gradlePlugins-agp" } kotlinAndroid = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } detekt = { id = "io.gitlab.arturbosch.detekt", version.ref = "detekt" } +library = { id = "com.android.library", version.ref = "gradlePlugins-agp" } diff --git a/settings.gradle.kts b/settings.gradle.kts index 94d40dbf..543e0281 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -15,3 +15,4 @@ dependencyResolutionManagement { } } include(":app") +include(":emojipicker")