Meski berpendidikan barat, saya masih orang Java.

javanese on java

Kalimat judul di atas adalah twit saya terakhir sebelum mendadak akun twitter saya jadi tersuspend. Masih belum tahu juga, apa alasan pihak twitter mensuspend akun saya, tetapi pilihan saya ya cuma satu, mencari kesalahan diri saya sendiri. Sangat bisa jadi ada postingan saya yang dianggap melanggar rule twitter. Mungkin video anak-anak yang main di sawah yang saya posting beberapa hari sebelumnya. Sebuah postingan iseng untuk memanggil lagi nostalgia masa kecil, tetapi memang bisa dilihat juga sebagai child pornography, lha wong anak-anaknya pada ga pake baju. Ya gimana, main di sawah dan mandi di sungai masak pakai baju hihi.

Tapi sudahlah, dunia akan jalan sebagaimana mestinya juga, ada atau tidak ada @lantip di dalamnya. Kalaupun nanti akunku kembali, ya kembali saja, ndak ada yang aneh. Kalaupun tidak, ya sudah, wong ya dunia ndak akan mengalami perubahan apapun. Yang penting saya masih bisa ngetik di sini, masih bisa berbagi di telegram, di whatsapp, dan yang jelas di Github.

Bicara soal github, kalau ditilik, lebih banyak didominasi dengan postingan berbasis python. Apa boleh bikin, sampai saat ini memang bahasa pemrograman itu yang nguripi saya dan keluarga saya hihi. Tetapi sebenarnya, saya juga sedang mengasah lagi kemampuan kodingan dengan bahasa lain. Akhir-akhir ini sedang berkecimpung dengan Java, setelah sebelumnya sempat mengulik C++.

Nah, bahasa Java itulah yang saya lagi pakai untuk mbikin keyboard aksara jawa di android. Sudah banyak sebenarnya keyboard android untuk aksara jawa, dan semuanya keren-keren. Masing-masing punya kelebihannya sendiri-sendiri. Keyboard Ramayana misalnya, memungkinkan kita mengetik memakai aksara latin dan langsung berubah menjadi aksara jawa. Lalu ada lagi keyboard berbasis MOK, juga tak kalah keren yang berbasis Keyman.

Hanya saja, saya lagi iseng saja, pingin mbikin yang native pakai Java. Dan karena selama ini berkecimpungnya di dunia machine learning, jadi kepikir untuk ngasih sugestion text di keyboardnya. Ambisius memang. Mungkin itu alasan paling kuat dari twitter kenapa mensuspend akun saya, supaya leren ndak kakehan ipyik haha.

Memangnya, apa sulitnya bikin layout keyboard?

Justru itu, ndak ada sulitnya sebenarnya. Hanya butuh ke-selo-nan sedikit. Tantangan pertama adalah font. Hal yang lebih mudah kalau itu pakai keyboard berbasis javascript seperti keyman, ataupun sekalian pakai aksara latin. Kenapa? Karena render unicode di Android 11 ngacau total. Akibatnya aksara jawa jadi terlihat kotak-kotak saja, seperti didublaki amplop disuruh beli HP baru.

tuh.. jadi kotak-kotak kan… hihi.. ini di Xiaomi Redmi Note 9 Pro. MIUI 12.5.1

Lantas gimana? Solusinya, mesti menyertakan font unicode yang benar di keyboardnya. Google sendiri sudah punya Noto Sans, dan di versi terbarunya, sudah tidak buntung lagi aksaranya. Tapi kacrutnya, di android 11, pembacaan fontnya salah, akibatnya ya itu tadi, unicode karakter jadi kotak-kotak amplop.

Nah, agar bisa menyempilkan font ini, maka tidak bisa kalau sekadar bikin layout berbasis XML saja. Menyerahkan ke input methods, dengan memberikan kode unicode, hanya akan memeberikan renderan kotak-kotak amplop lagi di keyboardnya. Maka piihannya mengoverride KeyboardView dan Keyboard dari module Input method.

Ini juga ndak sulit sih sebenarnya, sesimple repaint saja. Intinya, memanggil lagi semua keys, lalu didraw ulang di canvas dengan font yang benar. Kodingnya simple sekali:

Paint paint = new Paint();
paint.setTextAlign(Paint.Align.CENTER);
paint.setTextSize(50);
paint.setColor(Color.WHITE);
Typeface font = Typeface.createFromAsset(this.getContext().getAssets(),"fonts/nykNgayogyanJejeg.ttf");
paint.setTypeface(font);

Di situ saya pakai font nyk Ngayogyan Jejeg. Ada banyak pilihan font di aksaradinusantara.com kalau njenengan mau coba. Tapi inti dari snipet di atas adalah memanggil modul paint, lalu menerapkan font. Setelah ini, maka tinggal dipasangkan ke semua keys di keyboardnya.

List<Key> keys = getKeyboard().getKeys();
for(Key key: keys) {
   if (key.label != null) {
      String keyLabel = key.label.toString();
      canvas.drawText(keyLabel, key.x + (key.width / 2), key.y + (key.height / 2), paint);
    }
}

Gampang bukan? Nah tapi masih ada masalah lagi, di mana label originalnya, akan tetap dirender oleh android, dan jadinya font di keyboard jadi berbayang. Untuk menghilangkan ini, lumayan ngulik banyak. Dari mulai menyamakan warna dengan background keyboard, hingga menghilangkan shadow, dan yang penting juga, mensetting agar ukuran fontnya 0sp.

Nah sudah, font sudah benar, keyboard sudah beres. Tetapi di keyboard aksara jawa ada karakter yang berupa gabungan dua karakter, taling tarung misalnya, lantas bagaimana? Ini simple saja. Memang ketika membuat layout, xmlnya mesti begini:

<Key android:codes="43475" android:keyLabel="๊ง“"/>

Dimana keylabel adalah tampilan yang akan dilihat di keyboard, dan codes adalah kode unicode (html entity) untuk aksaranya. Nha, untuk label tidak ada issue, kita bisa tuliskan taling tarung langsung di labelnya: ๊ฆบ๊ฆด tetapi codesnya jadi gimana? Nah, untuk ini kita manfaatkan setkeyoutputext. Jadi begini:

<Key android:codes="43444" android:keyLabel="๊ฆบ๊ฆด" android:keyOutputText="๊ฆบ๊ฆด"/>

Seperti njenengan lihat, untuk codesnya saya cukup pasang codes untuk tarungnya saja, sementara supaya hasilnya tetap keluar sebagai taling-tarung maka saya pakai keyoutputtext itu. Dan ya sudah, urusan ini beres.

Begitu dulu deh untuk malam ini. Terimakasih atas hadiah ulang tahunnya, twitter. Bakal teringat terus ๐Ÿ˜€