Di Android, Chrome (dan Chromium serta turunan-turunannya) memiliki fitur auto hide address bar ketika kita scroll down page-nya. Itu loh, yang di atas, yang isinya ada URL bar, tombol tab, dan tombol menu.

Fitur ini sangatlah berguna karena tampilan page yang kita browse jadi lebih lega, tak termakan space-nya oleh address bar ini. Namun, HP zaman sekarang ukurannya panjang-panjang dan layarnya lega sehingga alasan tersebut sudah tak relevan lagi. Justru, auto hide ini membuat kita harus scroll up untuk memunculkannya kembali ketika kita ingin mengaksesnya, which is itu menambah aksi.

Apakah Anda seperti saya yang memiliki HP panjang? Apakah Anda juga sebal karena harus scroll up tiap kali ingin memunculkan address bar? Apakah Anda seorang frontend developer yang merasa gatal karena auto hide ini membuat viewport page menjadi berubah-ubah? Apakah Anda ingin men-disable fitur ini? Jika ya, ada kabar buruk, yaitu Chrome tak menyediakan fitur untuk men-disable ini. Tapi tenang saja, ada kabar baik. Saya tahu workaround-nya. Mari merapat, akan saya jelaskan.

github:chromium/chromium

Pertama-tama, kita perlu tahu dulu cara kerja auto hide address bar tersebut. Setelah tahu cara kerjanya, barulah kita bisa men-disable auto hide-nya. Semoga saja semudah itu. Amin. Oleh karena itu, kita perlu membaca source code Chrome agar supaya dapat memahami cara kerja ini.

Baik, mari kita baca source code Chrome ini. Tak ada sih, adanya source code Chromium. Tapi itu sama saja, Chrome itu based on Chromium. Source code Chromium ada mirror-nya di github:chromium/chromium. Silakan clone. Lumayan, untuk baca-baca. Tapi ukuran repo ini besar. Clone at your own risks. Tak mau clone juga tak apa, baca artikel ini saja sampai habis.

Okay, mulai darimana kita. Oh, iya, mulai dari aplikasi Android-nya. Selayaknya aplikasi Android sebagaimana khodratnya, komponen UI terkandung dalam sebuah Activity. Dan sebagaimana khodrat tersebut, Activity itu didefinisikan di manifest. Mari kita buka AndroidManifest.xml lalu kita cari Activity yang selanjutnya akan kita baca-baca. Oh, astaga! ada banyak ternyata Activity-nya! Lalu yang mana yang akan kita baca-baca?

ChromeTabbedActivity

Tenang, kita mulai dari awal dulu. Bismillah. Activity paling awal yang dibuka di aplikasi Android adalah Activity yang memiliki intent filter dengan category android.intent.category.LAUNCHER, yang mana itu untuk penanda top-level launcher. Setelah Ctrl+F, akhirnya ketemu juga Activity tersebut.

Eh sebentar, ternyata Activity yang kita temukan merupakan activity-alias. Activity tersebut ternyata hanyalah sebuah alias! Activity aslinya ditunjukkan oleh atribut android:targetActivity! Yasudah, kita buka saja Activity aslinya tersebut, yaitu org.chromium.chrome.browser.ChromeTabbedActivity. Mari kita baca source code-nya. Dari package name-nya sih kayaknya itu ada di folder /chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java deh. Eh ternyata benar! Mari kita baca file tersebut.

canAutoHideBrowserControls

Okay, dibaca, hmm, menarik, lalu ngapain ya? Oh iya, kita kan mau mencari tahu cara kerja auto hide addres bar, jadi kita Ctrl+F "hide" saja. Setelah searching, nampaknya ada method mencurigakan nih, nama method-nya canAutoHideBrowserControls. Hmm, apakah "BrowserControls" ini address bar? Eh, ternyata iya! Hah, tahu dari mana? Percaya saja sama saya, itu benar kok. Kalau tak percaya, silakan track sendiri, search source code yang tentang BrowserControls ini. Maka Anda akan setuju juga dengan saya.

Okay, lanjut. Hmm, ternyata method ini memanggil method super-nya. Oh, ternyata class-nya extend dari TabStateBrowserControlsVisibilityDelegate. Siap, mari kita baca class tersebut. Yuk, ke method yang kita mau, yaitu canAutoHideBrowserControls.

Ketemu cuy! Inilah cara kerja auto hide address bar tersebut! Sebenarnya, tinggal ubah isi method ini menjadi return false, build, install di HP, maka selesai sudah tujuan kita. Namun, build Chromium itu lamaaaaa banget. Sudah mah lama, kita juga harus re-build ulang setiap ada update. Sudah mah selalu re-build ulang, ternyata hasilnya Chromium pula bukan Chrome! Wah tak bisa nih, bukan solusi yang saya inginkan nih. Saya ingin solusi yang tetap jalan di Chrome yang ada di Play Store, karena itu lah satu-satunya Chrome yang direstui oleh Google. Bukan Chromium bikinan sendiri, bukan pula Chromium KW yang lain. Yasudah, mari kita kaji dulu method-nya, siapa tau bisa membuat method ini me-return false tanpa perlu nge-build.

AccessibilityUtil

Singkat cerita, saya tertariknya dengan kondisi yang berhubungan dengan AccessibilityUtil. Mari kita baca source code AccessibilityUtil tersebut, terutama yang method isAccessibilityEnabled karena itu yang dipanggil di canAutoHideBrowserControls.

Di isAccessibilityEnabled banyak kondisi, tapi yang me-return nilai true (which is nilai itulah yang membuat canAutoHideBrowserControls me-return false) adalah ketika manager.isEnabled, manager.isTouchExplorationEnabled, manager.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_ALL_MASK), dan canPerformGestures bernilai true.

Solusi

Ah ternyata, solusinya adalah dengan meng-enable sebuah Accessibility Service yang provide canRequestTouchExplorationMode, accessibilityFeedbackType, dan canPerformGestures.

Simpel sekali ya! Yasudah, demi keseruan semata, mari kita bikin sendiri aplikasi yang memiliki Accessibility Service seperti itu. Pertama, buat project aplikasi android seperti biasanya. Kedua, sesuai dengan tutorial "how to create accessibility service", buat file app\src\main\res\xml\my_accessibility_service.xml di project ini dengan isi sebagai berikut.

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
    android:accessibilityFeedbackType="feedbackGeneric"
    android:canPerformGestures="true"
    android:canRequestTouchExplorationMode="true"
/>

Tuh, provide semua kriteria untuk membuat isAccessibilityEnabled menjadi true kan? Sehingga berarti membuat canAutoHideBrowserControls menjadi false kan? Sehingga tak akan lagi auto hide address bar kan? Ya kaaan?

Sabar itu, kita belum selesai. Kita harus mendaftarkan my_accessibility_service tersebut ke manifest. Sip, buka app\src\main\AndroidManifest.xml project kita lalu tambahkan yang di bawah ini di dalam <application>.

<service
    android:name=".MyAccessibilityService"
    android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
    <intent-filter>
        <action android:name="android.accessibilityservice.AccessibilityService" />
    </intent-filter>
    <meta-data
        android:name="android.accessibilityservice"
        android:resource="@xml/my_accessibility_service" />
</service>

Setelah itu, juga implementasi class .MyAccessibilityService. Class kosongan saja. Isinya kurang lebih sebagai berikut.

import android.accessibilityservice.AccessibilityService;
import android.view.accessibility.AccessibilityEvent;

public class MyAccessibilityService extends AccessibilityService {
    @Override
    public void onAccessibilityEvent(AccessibilityEvent accessibilityEvent) {
    }

    @Override
    public void onInterrupt() {
    }
}

Sudah, beres, build, install di HP, aktifkan Accessibility Service-nya via menu setting Android Anda, dan voila! Chrome Anda sudah tak akan auto hide address bar lagi! Hore, selesai juga tulisan saya ini!