EmojiCompat


@AnyThread
public class EmojiCompat


Main class to keep Android devices up to date with the newest emojis by adding EmojiSpans to a given CharSequence.

By default, EmojiCompat is initialized by EmojiCompatInitializer, which performs deferred font loading to avoid potential app startup delays. The default behavior is to load the font shortly after the first Activity resumes. EmojiCompatInitializer will configure EmojiCompat to use the system emoji font provider via DefaultEmojiCompatConfig and always creates a new background thread for font loading. EmojiCompat will only allow one instance to be initialized and any calls to init after the first one will have no effect. As a result, configuration options may not be provided when using EmojiCompatInitializer. To provide a custom configuration, disable EmojiCompatInitializer in the manifest with:
    <provider
        android:name="androidx.startup.InitializationProvider"
        android:authorities="${applicationId}.androidx-startup"
        android:exported="false"
        tools:node="merge">
        <meta-data android:name="androidx.emoji2.text.EmojiCompatInitializer"
                  tools:node="remove" />
    </provider>
When not using EmojiCompatInitializer, EmojiCompat must to be initialized manually using init. It is recommended to make the initialization as early as possible in your app, such as from onCreate. init is fast and may be called from the main thread on the path to displaying the first activity. However, loading the emoji font takes significant resources on a background thread, so it is suggested to use LOAD_STRATEGY_MANUAL in all manual configurations to defer font loading until after the first screen displays. Font loading may be started by calling load}. See the implementation EmojiCompatInitializer for ideas when building a manual configuration. After initialization the get function can be used to get the configured instance and the process function can be used to update a CharSequence with emoji EmojiSpans.
CharSequence processedSequence = EmojiCompat.get().process("some string")
During loading information about emojis is not available. Before the EmojiCompat instance has finished loading, calls to functions such as process will throw an exception. It is safe to call process when getLoadState returns LOAD_STATE_SUCCEEDED. To register a callback when loading completes use InitCallback.

Summary

Nested types

public abstract class EmojiCompat.Config

Configuration class for EmojiCompat.

public interface EmojiCompat.GlyphChecker

Interface to check if a given emoji exists on the system.

public abstract class EmojiCompat.InitCallback

Listener class for the initialization of the EmojiCompat.

Interface to load emoji metadata.

Callback to inform EmojiCompat about the state of the metadata load.

public interface EmojiCompat.SpanFactory

Factory class that creates the EmojiSpans.

Constants

static final String
EDITOR_INFO_METAVERSION_KEY = "android.support.text.emoji.emojiCompat_metadataVersion"

Key in extras that represents the emoji metadata version used by the widget.

static final String
EDITOR_INFO_REPLACE_ALL_KEY = "android.support.text.emoji.emojiCompat_replaceAll"

Key in extras that represents setReplaceAll configuration parameter.

static final int

Result of getEmojiMatch that means the full codepoint sequence is not known to emojicompat, but at least one subsequence is an emoji that is known at this metadata level.

static final int

Result of getEmojiMatch that means this codepoint can be drawn by an EmojiSpan at this metadata level.

static final int

Result of getEmojiMatch that means no part of this codepoint sequence will ever generate an EmojiSpan at the requested metadata level.

static final int

EmojiCompat instance is constructed, however the initialization did not start yet.

static final int

An unrecoverable error occurred during initialization of EmojiCompat.

static final int

EmojiCompat is initializing.

static final int

EmojiCompat successfully initialized.

static final int

EmojiCompat will start loading metadata when init is called.

static final int

EmojiCompat will wait for load to be called by developer in order to start loading metadata.

static final int

Replace strategy to add EmojiSpans for all emoji that were found.

static final int

Replace strategy that uses the value given in EmojiCompat.Config.

static final int

Replace strategy to add EmojiSpans only for emoji that do not exist in the system.

Public methods

static @NonNull EmojiCompat
get()

Return singleton EmojiCompat instance.

@NonNull String

Returns signature for the currently loaded emoji assets.

int
getEmojiEnd(
    @NonNull CharSequence charSequence,
    @IntRange(from = 0) int offset
)

see getEmojiStart.

int
getEmojiMatch(
    @NonNull CharSequence sequence,
    @IntRange(from = 0) int metadataVersion
)

Attempts to lookup the entire sequence at the specified metadata version and returns what the runtime match behavior would be.

int
getEmojiStart(
    @NonNull CharSequence charSequence,
    @IntRange(from = 0) int offset
)

Together with getEmojiEnd, if the character at offset is part of an emoji, returns the index range of that emoji, start index inclusively/end index exclusively so that charSequence.subSequence(start, end) will return that emoji.

int

Returns loading state of the EmojiCompat instance.

static boolean
handleDeleteSurroundingText(
    @NonNull InputConnection inputConnection,
    @NonNull Editable editable,
    @IntRange(from = 0) int beforeLength,
    @IntRange(from = 0) int afterLength,
    boolean inCodePoints
)

Handles deleteSurroundingText commands from InputConnection and tries to delete an EmojiSpan from an Editable.

static boolean
handleOnKeyDown(
    @NonNull Editable editable,
    int keyCode,
    @NonNull KeyEvent event
)

Handles onKeyDown commands from a KeyListener and if keyCode is one of KEYCODE_DEL or KEYCODE_FORWARD_DEL it tries to delete an EmojiSpan from an Editable.

boolean

This method is deprecated.

use getEmojiMatch which returns more accurate lookup information.

boolean
hasEmojiGlyph(
    @NonNull CharSequence sequence,
    @IntRange(from = 0) int metadataVersion
)

This method is deprecated.

use getEmojiMatch which returns more accurate lookup information.

static @NonNull EmojiCompat

Initialize the singleton instance with a configuration.

static @Nullable EmojiCompat
init(@NonNull Context context)

Initialize the singleton instance with the default system-provided configuration.

static boolean

Return true if EmojiCompat has been configured by a successful call to init.

void

When setMetadataLoadStrategy is set to LOAD_STRATEGY_MANUAL, this function starts loading the metadata.

@Nullable CharSequence
process(@Nullable CharSequence charSequence)

Checks a given CharSequence for emojis, and adds EmojiSpans if any emojis are found.

@Nullable CharSequence
process(
    @Nullable CharSequence charSequence,
    @IntRange(from = 0) int start,
    @IntRange(from = 0) int end
)

Checks a given CharSequence for emojis, and adds EmojiSpans if any emojis are found.

@Nullable CharSequence
process(
    @Nullable CharSequence charSequence,
    @IntRange(from = 0) int start,
    @IntRange(from = 0) int end,
    @IntRange(from = 0) int maxEmojiCount
)

Checks a given CharSequence for emojis, and adds EmojiSpans if any emojis are found.

@Nullable CharSequence
process(
    @Nullable CharSequence charSequence,
    @IntRange(from = 0) int start,
    @IntRange(from = 0) int end,
    @IntRange(from = 0) int maxEmojiCount,
    int replaceStrategy
)

Checks a given CharSequence for emojis, and adds EmojiSpans if any emojis are found.

void

Registers an initialization callback.

void
registerInitCallback(
    @NonNull Executor executor,
    @NonNull EmojiCompat.InitCallback initCallback
)

Registers an initialization callback.

void

Unregisters a callback that was added before.

void

Updates the EditorInfo attributes in order to communicate information to Keyboards.

Constants

EDITOR_INFO_METAVERSION_KEY

Added in 1.0.0
public static final String EDITOR_INFO_METAVERSION_KEY = "android.support.text.emoji.emojiCompat_metadataVersion"

Key in extras that represents the emoji metadata version used by the widget. The existence of the value means that the widget is using EmojiCompat.

If exists, the value for the key is an int and can be used to query EmojiCompat to see whether the widget has the ability to display a certain emoji using hasEmojiGlyph.

EDITOR_INFO_REPLACE_ALL_KEY

Added in 1.0.0
public static final String EDITOR_INFO_REPLACE_ALL_KEY = "android.support.text.emoji.emojiCompat_replaceAll"

Key in extras that represents setReplaceAll configuration parameter. The key is added only if EmojiCompat is used by the widget. If exists, the value is a boolean.

EMOJI_FALLBACK

Added in 1.1.0
public static final int EMOJI_FALLBACK = 2

Result of getEmojiMatch that means the full codepoint sequence is not known to emojicompat, but at least one subsequence is an emoji that is known at this metadata level. Keyboards may decide that this emoji is not supported by the application when this result is returned, with no further processing. This return value implies: - EmojiCompat will decompose this ZWJ sequence into multiple glyphs when replaceAll=true - EmojiCompat MAY defer to platform when replaceAll=false - System emoji font may or may not support this emoji - This application MAY render this emoji This return value is only ever returned for ZWJ sequences. To understand this result consider when it may be returned for the multi-skin-tone handshake introduced in emoji 14.

    U+1FAF1 // unknown @ requested metadata level
    U+1F3FB // metadata level 1
    U+200D  // not displayed (ZWJ)
    U+1FAF2 // unknown @ requested metadata level
    U+1F3FD // metadata level 1
In this codepoint sequence, U+1F3FB and U+1F3FD are known from metadata level 1. When an application is using a metadata level that doesn't understand this ZWJ and provides REPLACE_STRATEGY_ALL true, the color emoji are matched and replaced with EmojiSpan. The system emoji font, even if it supports this ZWJ sequence, is never queried and the added EmojiSpans force fallback rendering for the ZWJ sequence. The glyph will only display correctly for this application if ALL of the following requirements are met: - REPLACE_STRATEGY_ALL is false - hasGlyph returns true for each emoji subsequence known at this metadata level - hasGlyph returns true for the full sequence Given this return value for the multi-skin-tone handshake above, if REPLACE_STRATEGY_ALL is false then the emoji will display if the entire emoji sequence is matched by hasGlyph because U+1F3FB and U+1F3FD are both in the system emoji font. Keyboards that wish to determine if the glyph will display correctly by the application in response to this return value should consider building an internal lookup for new ZWJ sequences instead of repeatedly calling hasGlyph for each emoji subsequence.

EMOJI_SUPPORTED

Added in 1.1.0
public static final int EMOJI_SUPPORTED = 1

Result of getEmojiMatch that means this codepoint can be drawn by an EmojiSpan at this metadata level. No further checks are required by keyboards for this result. The emoji is always supported by this application. This return value implies: - EmojiCompat can draw this emoji - System emoji font may or may not support this emoji - This application WILL render this emoji This result implies that EmojiCompat can successfully display this emoji. The system emoji font is not checked by this method, and this result may be returned even if the platform also supports the emoji sequence. If the application passes REPLACE_STRATEGY_ALL of true, then an EmojiSpan will always be generated for this emoji. If the application passes REPLACE_STRATEGY_ALL of false, then an EmojiSpan will only be generated if hasGlyph returns false for this emoji.

EMOJI_UNSUPPORTED

Added in 1.1.0
public static final int EMOJI_UNSUPPORTED = 0

Result of getEmojiMatch that means no part of this codepoint sequence will ever generate an EmojiSpan at the requested metadata level. This return value implies: - EmojiCompat will always defer to system emoji font - System emoji font may or may not support this emoji - This application MAY render this emoji This can be used by keyboards to learn that EmojiCompat does not support this codepoint sequence at this metadata version. The system emoji font is not checked by this method, and this result will be returned even if the system emoji font supports the emoji. This may happen if the application is using an older version of the emoji compat font than the system emoji font. Keyboards may optionally determine that the system emoji font will support the emoji, for example by building a internal lookup table or calling hasGlyph to query the system emoji font. Keyboards may use a lookup table to optimize this check, however they should be aware that OEMs may add or remove emoji from the system emoji font. Keyboards may finally decide: - If the system emoji font DOES NOT support the emoji, then the emoji IS NOT supported by this application. - If the system emoji font DOES support the emoji, then the emoji IS supported by this application. - If system emoji font is support is UNKNOWN, then assume the emoji IS NOT supported by this application.

LOAD_STATE_DEFAULT

Added in 1.0.0
public static final int LOAD_STATE_DEFAULT = 3

EmojiCompat instance is constructed, however the initialization did not start yet.

See also
getLoadState

LOAD_STATE_FAILED

Added in 1.0.0
public static final int LOAD_STATE_FAILED = 2

An unrecoverable error occurred during initialization of EmojiCompat. Calls to functions such as process will fail.

See also
getLoadState

LOAD_STATE_LOADING

Added in 1.0.0
public static final int LOAD_STATE_LOADING = 0

EmojiCompat is initializing.

See also
getLoadState

LOAD_STATE_SUCCEEDED

Added in 1.0.0
public static final int LOAD_STATE_SUCCEEDED = 1

EmojiCompat successfully initialized.

See also
getLoadState

LOAD_STRATEGY_DEFAULT

Added in 1.0.0
public static final int LOAD_STRATEGY_DEFAULT = 0

EmojiCompat will start loading metadata when init is called.

LOAD_STRATEGY_MANUAL

Added in 1.0.0
public static final int LOAD_STRATEGY_MANUAL = 1

EmojiCompat will wait for load to be called by developer in order to start loading metadata.

REPLACE_STRATEGY_ALL

Added in 1.0.0
public static final int REPLACE_STRATEGY_ALL = 1

Replace strategy to add EmojiSpans for all emoji that were found.

See also
process

REPLACE_STRATEGY_DEFAULT

Added in 1.0.0
public static final int REPLACE_STRATEGY_DEFAULT = 0

Replace strategy that uses the value given in EmojiCompat.Config.

See also
process

REPLACE_STRATEGY_NON_EXISTENT

Added in 1.0.0
public static final int REPLACE_STRATEGY_NON_EXISTENT = 2

Replace strategy to add EmojiSpans only for emoji that do not exist in the system.

Public methods

get

Added in 1.0.0
public static @NonNull EmojiCompat get()

Return singleton EmojiCompat instance. Should be called after init is called to initialize the singleton instance.

Returns
@NonNull EmojiCompat

EmojiCompat instance

Throws
java.lang.IllegalStateException

if called before init

getAssetSignature

Added in 1.0.0
public @NonNull String getAssetSignature()

Returns signature for the currently loaded emoji assets. The signature is a SHA that is constructed using emoji assets. Can be used to detect if currently loaded asset is different then previous executions. When used on devices running API 18 or below, returns empty string.

Throws
java.lang.IllegalStateException

if not initialized yet

getEmojiEnd

Added in 1.3.0
public int getEmojiEnd(
    @NonNull CharSequence charSequence,
    @IntRange(from = 0) int offset
)

see getEmojiStart.

getEmojiMatch

Added in 1.1.0
public int getEmojiMatch(
    @NonNull CharSequence sequence,
    @IntRange(from = 0) int metadataVersion
)

Attempts to lookup the entire sequence at the specified metadata version and returns what the runtime match behavior would be. To be used by keyboards to show or hide emoji in response to specific metadata support.

Parameters
@NonNull CharSequence sequence

CharSequence representing an emoji

@IntRange(from = 0) int metadataVersion

the metada version to check against, should be greater than or equal to 0,

Returns
int

A match result, or decomposes if replaceAll would cause partial subsequence matches.

getEmojiStart

Added in 1.3.0
public int getEmojiStart(
    @NonNull CharSequence charSequence,
    @IntRange(from = 0) int offset
)

Together with getEmojiEnd, if the character at offset is part of an emoji, returns the index range of that emoji, start index inclusively/end index exclusively so that charSequence.subSequence(start, end) will return that emoji. E.g., getEmojiStart/End("AB😀", 1) will return (-1,-1) since 'B' is not part an emoji; getEmojiStart/End("AB😀", 3) will return [2,4), note that "😀" contains 2 Chars. Returns -1 otherwise.

Parameters
@NonNull CharSequence charSequence

the whole sequence

@IntRange(from = 0) int offset

index of the emoji to look up

Returns
int

the start index inclusively/end index exclusively

getLoadState

Added in 1.0.0
public int getLoadState()

Returns loading state of the EmojiCompat instance. When used on devices running API 18 or below always returns LOAD_STATE_SUCCEEDED.