Kompatibilitas Emoji

Support library EmojiCompat bertujuan untuk menjaga perangkat Android tetap terupdate dengan emoji terbaru. Tindakan tersebut mencegah aplikasi Anda menampilkan karakter emoji yang hilang dalam bentuk ☐, yang menunjukkan bahwa perangkat Anda tidak memiliki font untuk menampilkan teks tersebut. Dengan menggunakan support library EmojiCompat, pengguna aplikasi Anda tidak perlu menunggu update Android OS untuk mendapatkan emoji terbaru.

Perangkat yang menampilkan emoji
Gambar 1. Perbandingan emoji

Lihat referensi terkait berikut:

Bagaimana cara kerja EmojiCompat?

Support library EmojiCompat menyediakan class untuk mengimplementasikan dukungan emoji kompatibilitas mundur di perangkat yang menjalankan Android 4.4 (API level 19) dan yang lebih tinggi. Anda dapat mengonfigurasi EmojiCompat dengan font yang di-bundle atau yang dapat didownload. Untuk informasi selengkapnya tentang konfigurasi, lihat bagian berikut:

EmojiCompat mengidentifikasi emoji untuk CharSequence yang diberikan, mengganti emoji dengan EmojiSpans, jika diperlukan, dan merender glyph emoji. Gambar 2 menunjukkan prosesnya.

Proses EmojiCompat
Gambar 2. Proses EmojiCompat

Konfigurasi font yang dapat didownload

Konfigurasi font yang dapat didownload menggunakan fitur support library Downloadable Fonts untuk mendownload font emoji. Support library juga mengupdate metadata emoji yang spesifikasi Unicode-nya perlu dijaga oleh support library EmojiCompat agar tetap terupdate.

Menambahkan dependensi support library

Untuk menggunakan support library EmojiCompat, Anda perlu mengubah dependensi classpath project aplikasi dalam lingkungan pengembangan Anda.

Untuk menambahkan Support Library ke project aplikasi Anda:

  1. Buka file build.gradle aplikasi Anda.
  2. Tambahkan support library ke bagian dependencies.
    dependencies {
        ...
        implementation "com.android.support:support-emoji:28.0.0"
    }
    

Melakukan inisialisasi konfigurasi font yang dapat didownload

Anda perlu menginisialisasi EmojiCompat untuk memuat metadata dan typeface. Karena proses inisialisasi memerlukan waktu, proses ini berjalan pada thread latar belakang.

Untuk menginisialisasi EmojiCompat dengan konfigurasi font yang dapat didownload, lakukan langkah-langkah berikut:

  1. Buat instance class FontRequest dan sediakan otoritas penyedia font, paket penyedia font, kueri font, dan daftar kumpulan hash untuk sertifikat. Untuk informasi selengkapnya tentang FontRequest, lihat bagian Menggunakan Font yang Dapat Didownload secara terprogram di dokumentasi Font yang Dapat Didownload.
  2. Buat instance FontRequestEmojiCompatConfig dan berikan instance Context dan FontRequest.
  3. Inisialisasi EmojiCompat dengan memanggil metode init() dan meneruskan instance FontRequestEmojiCompatConfig.
  4. Kotlin

        class MyApplication : Application() {
    
            override fun onCreate() {
                super.onCreate()
                val fontRequest = FontRequest(
                        "com.example.fontprovider",
                        "com.example",
                        "emoji compat Font Query",
                        CERTIFICATES
                )
                val config = FontRequestEmojiCompatConfig(this, fontRequest)
                EmojiCompat.init(config)
            }
        }
        

    Java

        public class MyApplication extends Application {
          @Override
           public void onCreate() {
             super.onCreate();
             FontRequest fontRequest = new FontRequest(
               "com.example.fontprovider",
               "com.example",
               "emoji compat Font Query",
               CERTIFICATES);
             EmojiCompat.Config config = new FontRequestEmojiCompatConfig(this, fontRequest);
             EmojiCompat.init(config);
           }
        }
        
  5. Gunakan widget EmojiCompat dalam XML tata letak. Jika Anda menggunakan AppCompat, lihat bagian Menggunakan widget EmojiCompat dengan AppCompat.
  6.     <android.support.text.emoji.widget.EmojiTextView
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"/>
    
        <android.support.text.emoji.widget.EmojiEditText
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"/>
    
        <android.support.text.emoji.widget.EmojiButton
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"/>
        

Untuk informasi selengkapnya tentang cara mengonfigurasi EmojiCompat dengan konfigurasi font yang dapat didownload, buka aplikasi contoh Kompatibilitas Emoji Java | Kotlin.

Komponen library

Komponen library dalam proses EmojiCompat
Gambar 3. Komponen library di proses EmojiCompat
Widget: EmojiEditText, EmojiTextView, EmojiButton
Implementasikan widget default untuk menggunakan EmojiCompat dengan TextView, EditText, dan Button.
EmojiCompat
Surface publik utama untuk support library. Melakukan semua panggilan eksternal dan berkoordinasi dengan bagian sistem lain.
EmojiCompat.Config
Mengonfigurasi instance singleton agar dibuat.
EmojiSpan
Subclass ReplacementSpan yang menggantikan karakter (urutan) dan merender glyph.
EmojiCompat Font
EmojiCompat menggunakan font untuk menampilkan emoji. Font ini adalah versi modifikasi dari font Android Emoji. Font diubah seperti berikut:
  • Untuk memberikan kompatibilitas mundur guna menampilkan emoji, semua karakter emoji diwakili dengan satu titik kode Unicode dalam Supplemental Private Use Area-A Unicode yang dimulai dari U+F0001.
  • Metadata emoji tambahan dimasukkan dalam format biner ke dalam font dan diuraikan pada waktu proses oleh EmojiCompat. Data tersebut disematkan dalam tabel meta font, dengan tag pribadi Emji.

Opsi konfigurasi

Anda dapat menggunakan instance EmojiCompat untuk mengubah perilaku EmojiCompat. Anda dapat menggunakan metode berikut dari class dasar untuk menetapkan konfigurasi:

Kotlin

    val config = FontRequestEmojiCompatConfig(...)
            .setReplaceAll(true)
            .setEmojiSpanIndicatorEnabled(true)
            .setEmojiSpanIndicatorColor(Color.GREEN)
            .registerInitCallback(object: EmojiCompat.InitCallback() {
                ...
            })
    

Java

    EmojiCompat.Config config = new FontRequestEmojiCompatConfig(...)
           .setReplaceAll(true)
           .setEmojiSpanIndicatorEnabled(true)
           .setEmojiSpanIndicatorColor(Color.GREEN)
           .registerInitCallback(new InitCallback() {...})

    

Menambahkan pemroses inisialisasi

Class EmojiCompat dan EmojiCompat menyediakan metode registerInitCallback() dan unregisterInitCallback() untuk mendaftarkan callback inisialisasi. Untuk menggunakan metode ini, buat instance dari class EmojiCompat.InitCallback. Panggil metode ini dan teruskan instance class EmojiCompat.InitCallback. Saat proses inisialisasi support library EmojiCompat berhasil, class EmojiCompat akan memanggil metode onInitialized(). Jika library gagal menginisialisasi, class EmojiCompat akan memanggil metode onFailed().

Untuk memeriksa status inisialisasi pada semua titik, panggil metode getLoadState(). Metode akan menampilkan salah satu nilai berikut: LOAD_STATE_LOADING, LOAD_STATE_SUCCEEDED, atau LOAD_STATE_FAILED.

Menggunakan EmojiCompat dengan widget AppCompat

Jika Anda menggunakan AppCompat widgets, Anda dapat menggunakan widget EmojiCompat yang diperluas dari .

  1. Tambahkan support library ke bagian dependensi.
  2.     dependencies {
              implementation "com.android.support:support-emoji-appcompat:$version"
        }
        
  3. Gunakan widget EmojiCompat AppCompat Widget dalam XML tata letak.
  4.     <android.support.text.emoji.widget.EmojiAppCompatTextView
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"/>
    
        <android.support.text.emoji.widget.EmojiAppCompatEditText
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"/>
    
        <android.support.text.emoji.widget.EmojiAppCompatButton
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"/>
        

Konfigurasi font yang di-bundle

Support library EmojiCompat juga tersedia dalam versi font yang di-bundle. Paket ini menyertakan font dengan metadata yang telah disematkan. Paket ini juga menyertakan BundledEmojiCompatConfig yang menggunakan AssetManager untuk memuat metadata dan font.

Catatan: Font berukuran beberapa megabyte.

Menambahkan dependensi support library

Untuk menggunakan support library EmojiCompat dengan konfigurasi font yang di-bundle, Anda harus mengubah dependensi classpath project aplikasi dalam lingkungan pengembangan Anda.

Untuk menambahkan Support Library ke project aplikasi Anda:

  1. Buka file build.gradle aplikasi Anda.
  2. Tambahkan support library ke bagian dependencies.
    dependencies {
        ...
        implementation "com.android.support:support-emoji-bundled:$version"
    }
    

Menggunakan font yang di-bundle untuk mengonfigurasi EmojiCompat

Untuk menggunakan font yang di-bundle untuk mengonfigurasi EmojiCompat, lakukan langkah-langkah berikut:

  1. Gunakan BundledEmojiCompatConfig untuk membuat instance dari EmojiCompat dan memberikan instance Context.
  2. Panggil metode init() untuk menginisialisasi EmojiCompat dan teruskan instance BundledEmojiCompatConfig.

Kotlin

    class MyApplication : Application() {

        override fun onCreate() {
            super.onCreate()
            val config = BundledEmojiCompatConfig(this)
            EmojiCompat.init(config)
        }
    }
    

Java

    public class MyApplication extends Application {
        @Override
        public void onCreate() {
            super.onCreate();
            EmojiCompat.Config config = new BundledEmojiCompatConfig(this);
            EmojiCompat.init(config);
            ...
        }
    }
    

Menggunakan EmojiCompat tanpa widget

EmojiCompat menggunakan EmojiSpan untuk merender gambar yang benar. Oleh karena itu, metode tersebut harus mengubah CharSequence apa pun yang diberikan ke dalam instance Spanned dengan EmojiSpans. Class EmojiCompat menyediakan metode untuk mengubah CharSequences ke dalam instance Spanned dengan EmojiSpans. Dengan menggunakan metode ini, Anda dapat memproses dan men-cache instance yang diproses, dan bukan string mentah, yang meningkatkan performa aplikasi Anda.

Kotlin

    val processed = EmojiCompat.get().process("neutral face \uD83D\uDE10")
    

Java

    CharSequence processed = EmojiCompat.get().process("neutral face \uD83D\uDE10");
    

Menggunakan EmojiCompat untuk IME

Dengan menggunakan support library EmojiCompat, keyboard dapat merender emoji yang didukung oleh aplikasi yang berinteraksi dengannya. IME dapat menggunakan metode hasEmojiGlyph() untuk memeriksa apakah EmojiCompat dapat merender emoji. Metode ini membutuhkan CharSequence dari emoji dan menampilkan true jika EmojiCompat dapat mendeteksi dan merender emoji.

Keyboard juga dapat memeriksa versi support library EmojiCompat yang didukung aplikasi untuk menentukan emoji yang akan dirender pada palet. Untuk memeriksa versi, jika tersedia, keyboard perlu memeriksa apakah kunci berikut ada di bundle EditorInfo.extras:

Setelah menerima kunci di bundle EditorInfo.extras, keyboard dapat menggunakan metode hasEmojiGlyph() di mana metadataVersion adalah nilai untuk EDITOR_INFO_METAVERSION_KEY, untuk memeriksa apakah aplikasi dapat merender emoji tertentu.

Menggunakan EmojiCompat dengan widget kustom

Anda selalu dapat menggunakan metode process() untuk melakukan praproses CharSequence di aplikasi Anda dan menambahkannya ke widget yang dapat merender instance Spanned; misalnya, TextView. Selain itu, EmojiCompat menyediakan class helper widget berikut agar Anda dapat memperkaya widget kustom dengan dukungan emoji tanpa susah payah.

Contoh TextView

Kotlin

    class MyTextView(context: Context) : AppCompatTextView(context) {

        private val emojiTextViewHelper: EmojiTextViewHelper by lazy(LazyThreadSafetyMode.NONE) {
            EmojiTextViewHelper(this).apply {
                updateTransformationMethod()
            }
        }

        override fun setFilters(filters: Array<InputFilter>) {
            super.setFilters(emojiTextViewHelper.getFilters(filters))
        }

        override fun setAllCaps(allCaps: Boolean) {
            super.setAllCaps(allCaps)
            emojiTextViewHelper.setAllCaps(allCaps)
        }
    }
    

Java

    public class MyTextView extends AppCompatTextView {
       ...
       public MyTextView(Context context) {
           super(context);
           init();
       }
       ...
       private void init() {
           getEmojiTextViewHelper().updateTransformationMethod();
       }

       @Override
       public void setFilters(InputFilter[] filters) {
           super.setFilters(getEmojiTextViewHelper().getFilters(filters));
       }

       @Override
       public void setAllCaps(boolean allCaps) {
           super.setAllCaps(allCaps);
           getEmojiTextViewHelper().setAllCaps(allCaps);
       }

       private EmojiTextViewHelper getEmojiTextViewHelper() {
           ...
       }
    }
    
Contoh EditText

Kotlin

    class MyEditText(context: Context) : AppCompatEditText(context) {

        private val emojiEditTextHelper: EmojiEditTextHelper by lazy(LazyThreadSafetyMode.NONE) {
            EmojiEditTextHelper(this).also {
                super.setKeyListener(it.getKeyListener(keyListener))
            }
        }

        override fun setKeyListener(input: KeyListener?) {
            input?.also {
                super.setKeyListener(emojiEditTextHelper.getKeyListener(it))
            }
        }

        override fun onCreateInputConnection(outAttrs: EditorInfo): InputConnection {
            val inputConnection: InputConnection = super.onCreateInputConnection(outAttrs)
            return emojiEditTextHelper.onCreateInputConnection(
                    inputConnection,
                    outAttrs
            ) as InputConnection
        }
    }
    

Java

    public class MyEditText extends AppCompatEditText {
       ...
       public MyEditText(Context context) {
           super(context);
           init();
       }
       ...
       private void init() {
           super.setKeyListener(getEmojiEditTextHelper().getKeyListener(getKeyListener()));
       }

       @Override
       public void setKeyListener(android.text.method.KeyListener keyListener) {
           super.setKeyListener(getEmojiEditTextHelper().getKeyListener(keyListener));
       }

       @Override
       public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
           InputConnection inputConnection = super.onCreateInputConnection(outAttrs);
           return getEmojiEditTextHelper().onCreateInputConnection(inputConnection, outAttrs);
       }

       private EmojiEditTextHelper getEmojiEditTextHelper() {
           ...
       }
    }
    

Pertanyaan umum

  • Bagaimana cara memulai download font?
  • Font emoji didownload pada permintaan pertama, jika font tersebut tidak ada di perangkat. Penjadwalan download bersifat transparan untuk aplikasi.

  • Berapa lama waktu yang diperlukan untuk melakukan inisialisasi?
  • Setelah font didownload, diperlukan sekitar 150 milidetik untuk menginisialisasi EmojiCompat.

  • Berapa banyak memori yang digunakan oleh support library EmojiCompat?
  • Saat ini, struktur data untuk menemukan emoji dimuat di memori aplikasi dan menggunakan sekitar 200 KB.

  • Dapatkah saya menggunakan EmojiCompat untuk TextView kustom?
  • Ya. EmojiCompat menyediakan class helper untuk widget kustom. Anda juga dapat memproses string tertentu dan mengubahnya menjadi Spanned. Untuk informasi selengkapnya tentang class helper widget, lihat bagian Menggunakan EmojiCompat dengan widget kustom.

  • Apa yang terjadi jika saya menambahkan widget dalam XML tata letak pada perangkat yang berjalan di Android 4.4 (API level 19) atau yang lebih rendah?
  • Anda dapat menyertakan support library EmojiCompat atau widgetnya di aplikasi yang mendukung perangkat yang menjalankan Android 4.4 (API level 19) atau yang lebih rendah. Namun, jika perangkat berjalan pada versi Android sebelum API level 19, EmojiCompat dan widget-nya berada dalam status "tidak beroperasi". Ini berarti bahwa EmojiTextView berperilaku seperti instance TextView.EmojiCompat biasa, yaitu akan langsung masuk ke status LOAD_STATE_SUCCEEDED saat Anda memanggil metode init().

Referensi lainnya

Untuk informasi tambahan tentang penggunaan library EmojiCompat, lihat EmojiCompat.