Dukungan dekorasi sistem

Pembaruan yang dilakukan pada area khusus tampilan ini disediakan di halaman ini.

Dekorasi sistem

Android 10 menambahkan dukungan untuk mengonfigurasi tampilan sekunder guna menampilkan dekorasi sistem tertentu, seperti wallpaper, panel navigasi, dan peluncur. Secara default, layar utama menampilkan semua dekorasi sistem, dan layar sekunder menampilkan dekorasi yang diaktifkan secara opsional. Anda dapat menetapkan dukungan untuk editor metode input (IME) secara terpisah dari dekorasi sistem lainnya.

Gunakan DisplayWindowSettings#setShouldShowSystemDecorsLocked untuk menambahkan dukungan untuk dekorasi sistem pada layar tertentu atau memberikan nilai default di /data/system/display_settings.xml. Untuk contoh, lihat Setelan jendela tampilan.

Di Android 17 dan yang lebih tinggi, dukungan layar untuk dekorasi sistem dapat berubah secara dinamis. Jika layar memiliki tanda FLAG_ALLOWS_CONTENT_MODE_SWITCH, sistem akan membiarkan pengguna memutuskan apakah layar menghosting aplikasi atau mencerminkan layar lain. Sistem menggunakan dekorasi sistem hanya jika pengguna memutuskan untuk menggunakan layar untuk menghosting aplikasi. Komponen sistem, seperti UI Sistem dan peluncur OEM, bertanggung jawab untuk membuat dan menampilkan dekorasi sistem. Untuk menambahkan atau menghapus dekorasi sistem secara dinamis, dan untuk menginisialisasi atau membebaskan struktur per-tampilan, komponen ini harus mendaftarkan instance IDisplayWindowListener dan menerapkan metode IDisplayWindowListener.onDisplayAddSystemDecorations dan IDisplayWindowListener.onDisplayRemoveSystemDecorations. IDisplayWindowListener adalah API tersembunyi yang hanya tersedia untuk komponen sistem.

Penerapan

DisplayWindowSettings#setShouldShowSystemDecorsLocked juga ditampilkan di WindowManager#setShouldShowSystemDecors untuk pengujian. Memicu metode ini dengan maksud untuk mengaktifkan dekorasi sistem tidak akan menambahkan jendela dekorasi yang sebelumnya tidak ada, atau menghapusnya jika sebelumnya ada. Dalam sebagian besar kasus, perubahan dukungan dekorasi sistem akan diterapkan sepenuhnya hanya setelah perangkat dimulai ulang.

Pemeriksaan dukungan dekorasi sistem di basis kode WindowManager biasanya dilakukan melalui DisplayContent#supportsSystemDecorations, sedangkan pemeriksaan layanan eksternal (seperti UI Sistem untuk memeriksa apakah panel navigasi harus ditampilkan) menggunakan WindowManager#shouldShowSystemDecors. Untuk memahami apa yang dikontrol oleh setelan ini, pelajari titik panggilan metode ini.

Jendela dekorasi UI sistem

Android 10 menambahkan dukungan jendela dekorasi sistem hanya untuk panel navigasi karena panel navigasi sangat penting untuk bernavigasi antar-aktivitas dan aplikasi. Secara default, menu navigasi menampilkan kemampuan Kembali dan Beranda. Panel navigasi hanya disertakan jika target tampilan mendukung dekorasi sistem (lihat DisplayWindowSettings).

Status bar adalah jendela sistem yang lebih rumit, karena juga berisi Menu Notifikasi, Setelan Cepat, dan Layar Kunci. Di Android 10, status bar tidak didukung pada tampilan sekunder. Oleh karena itu, notifikasi, setelan, dan keyguard lengkap hanya tersedia di layar utama.

Jendela sistem Ringkasan atau Terbaru tidak didukung di layar sekunder. Di Android 10, AOSP hanya menampilkan Terbaru di layar default dan berisi aktivitas dari semua layar. Saat diluncurkan dari Terbaru, aktivitas yang berada di tampilan sekunder akan ditampilkan di bagian depan pada tampilan tersebut secara default. Pendekatan ini memiliki beberapa masalah umum, seperti tidak langsung diperbarui saat aplikasi muncul di layar lain.

Penerapan

Untuk menerapkan fitur UI Sistem tambahan, produsen perangkat harus menggunakan satu komponen UI Sistem yang memantau penambahan atau penghapusan layar dan menampilkan konten yang sesuai.

Komponen UI Sistem yang mendukung Multi-Tampilan (MD) harus menangani kasus berikut:

  • Inisialisasi beberapa layar saat startup
  • Tampilan ditambahkan saat runtime
  • Tampilan dihapus saat runtime

Saat UI Sistem mendeteksi penambahan layar sebelum WindowManager, kondisi persaingan akan terjadi. Anda dapat menghindarinya dengan menerapkan callback kustom dari WindowManager ke UI Sistem saat layar ditambahkan, bukan berlangganan ke peristiwa DisplayManager.DisplayListener. Untuk implementasi referensi, lihat CommandQueue.Callbacks#onDisplayAddSystemDecorations untuk dukungan menu navigasi dan WallpaperManagerInternal#onDisplayAddSystemDecorations untuk wallpaper.

Selain itu, Android 10 menyediakan update berikut:

  • Class NavigationBarController mengontrol semua fungsi khusus untuk panel navigasi.
  • Untuk melihat menu navigasi yang disesuaikan, lihat CarStatusBar.
  • TYPE_NAVIGATION_BAR tidak lagi dibatasi pada satu instance dan dapat digunakan per tampilan.
  • IWindowManager#hasNavigationBar diperbarui untuk menyertakan parameter displayId hanya untuk UI Sistem.

Peluncur

Di Android 10, setiap layar yang dikonfigurasi untuk mendukung dekorasi sistem memiliki stack beranda khusus untuk aktivitas peluncur dengan jenis WindowConfiguration#ACTIVITY_TYPE_HOME, secara default. Setiap layar menggunakan instance aktivitas peluncur yang terpisah:

Gambar 1. Contoh peluncur multi-tampilan untuk platform/development/samples/MultiDisplay.

Sebagian besar peluncur yang ada tidak mendukung beberapa instance dan tidak dioptimalkan untuk ukuran layar besar. Selain itu, jenis pengalaman yang berbeda sering kali diharapkan di layar sekunder/eksternal. Untuk menyediakan aktivitas khusus bagi layar sekunder, Android 10 memperkenalkan kategori SECONDARY_HOME dalam filter intent. Instance aktivitas ini digunakan pada semua layar yang mendukung dekorasi sistem, satu untuk setiap layar.

<activity>
    ...
    <intent-filter>
        <category android:name="android.intent.category.SECONDARY_HOME" />
        ...
    </intent-filter>
</activity>

Aktivitas harus memiliki mode peluncuran yang tidak mencegah beberapa instance dan diharapkan dapat beradaptasi dengan berbagai ukuran layar. Mode peluncuran tidak boleh singleInstance atau singleTask.

Penerapan

Di Android 10, RootActivityContainer#startHomeOnDisplay secara otomatis memilih komponen dan intent yang diinginkan, bergantung pada layar tempat layar utama diluncurkan. RootActivityContainer#resolveSecondaryHomeActivity berisi logika untuk mencari komponen aktivitas peluncur, bergantung pada peluncur yang saat ini dipilih dan dapat menggunakan default sistem, jika diperlukan (lihat ActivityTaskManagerService#getSecondaryHomeIntent).

Batasan keamanan

Selain batasan yang berlaku untuk aktivitas di layar sekunder, untuk menghindari kemungkinan aplikasi berbahaya membuat layar virtual dengan Dekorasi sistem yang diaktifkan dan membaca informasi sensitif pengguna dari platform, peluncur hanya muncul di layar virtual yang dimiliki oleh sistem. Peluncur tidak menampilkan konten di tampilan virtual non-sistem.

Wallpaper

Di Android 10 dan yang lebih baru, wallpaper didukung di tampilan sekunder:

Gambar 2. Wallpaper animasi di layar internal (di atas) dan eksternal (di bawah).

Developer dapat mendeklarasikan dukungan untuk fitur wallpaper dengan menyediakan android:supportsMultipleDisplays="true" dalam definisi XML WallpaperInfo. Developer wallpaper juga diharapkan memuat aset menggunakan konteks tampilan di WallpaperService.Engine#getDisplayContext.

Framework membuat satu instance WallpaperService.Engine per tampilan, sehingga setiap mesin memiliki konteks tampilan dan permukaannya sendiri. Developer harus memastikan bahwa setiap mesin dapat menggambar secara independen, pada kecepatan frame yang berbeda, dengan mematuhi VSync.

Memilih wallpaper untuk setiap layar

Android 10 tidak menyediakan dukungan platform langsung untuk memilih wallpaper untuk setiap layar. Untuk melakukannya, ID tampilan yang stabil diperlukan untuk mempertahankan setelan wallpaper per tampilan. Display#getDisplayId bersifat dinamis, sehingga tidak ada jaminan bahwa tampilan fisik akan memiliki ID yang sama setelah reboot.

Namun, Android 10 menambahkan DisplayInfo.mAddress, yang berisi ID stabil untuk tampilan fisik dan dapat digunakan untuk penerapan penuh pada masa mendatang. Sayangnya, sudah terlambat untuk menerapkan logika untuk Android 10. Solusi yang disarankan:

  1. Gunakan class WallpaperManager untuk menyetel wallpaper.

    WallpaperManager diperoleh dari objek Context, dan setiap objek Context memiliki informasi tentang tampilan (Context#getDisplay/getDisplayId) yang sesuai. Oleh karena itu, Anda dapat memperoleh displayId dari instance WallpaperManager tanpa menambahkan metode baru.

  2. Di sisi framework, gunakan displayId yang diperoleh dari objek Context dan petakan ke ID statis (seperti port tampilan fisik). Gunakan ID statis untuk mempertahankan wallpaper yang dipilih.

Solusi ini menggunakan implementasi yang ada untuk pemilih wallpaper. Jika dibuka di layar tertentu dan menggunakan konteks yang tepat, saat memanggil untuk menyetel wallpaper, sistem dapat mengidentifikasi layar secara otomatis.

Jika perlu menyetel wallpaper untuk layar selain layar saat ini, buat objek Context baru untuk layar target (Context#createDisplayContext) dan dapatkan instance WallpaperManager dari layar tersebut.

Batasan keamanan

Sistem tidak akan menampilkan wallpaper di layar virtual yang tidak dimilikinya. Hal ini disebabkan oleh masalah keamanan bahwa aplikasi berbahaya dapat membuat tampilan virtual dengan dukungan dekorasi sistem yang diaktifkan dan membaca informasi sensitif pengguna dari layar (seperti foto pribadi).

Penerapan

Di Android 10, antarmuka IWallpaperConnection#attachEngine dan IWallpaperService#attach menerima parameter displayId untuk membuat koneksi per layar. WallpaperManagerService.DisplayConnector merangkum mesin dan koneksi wallpaper per layar. Di WindowManager, pengontrol wallpaper dibuat untuk setiap objek DisplayContent saat konstruksi, bukan satu WallpaperController untuk semua layar.

Beberapa implementasi metode WallpaperManager publik (seperti WallpaperManager#getDesiredMinimumWidth) diperbarui untuk menghitung dan memberikan informasi untuk tampilan yang sesuai. WallpaperInfo#supportsMultipleDisplays dan atribut resource yang sesuai telah ditambahkan, sehingga developer aplikasi dapat melaporkan wallpaper mana yang siap untuk beberapa layar.

Jika layanan wallpaper yang ditampilkan di layar default tidak mendukung beberapa layar, sistem akan menampilkan wallpaper default di layar sekunder:

Gambar 3. Logika penggantian wallpaper untuk tampilan sekunder.

Mengaktifkan dukungan wallpaper animasi

Di Android 10 dan yang lebih tinggi (API 29), developer dapat menggunakan atribut android:supportsMultipleDisplays untuk menunjukkan apakah wallpaper mereka dapat ditampilkan di berbagai layar. Di lingkungan mode jendela desktop, tempat multitasking dilakukan secara intensif, merender wallpaper animasi di layar eksternal dapat memengaruhi GPU dan overhead memori secara signifikan.

Untuk menghemat resource sistem, sistem tidak merender live wallpaper di layar yang terhubung secara default. Jika wallpaper animasi dibatasi oleh konfigurasi sistem atau manifes aplikasi, sistem akan merender wallpaper statis pengganti.

OEM dapat menyesuaikan pengalaman ini dengan mengaktifkan dukungan wallpaper animasi untuk hardware kelas atas atau menyesuaikan penggantian statis untuk tampilan bermerek.

Jika hardware Anda dapat merender beberapa instance wallpaper animasi, ganti konfigurasi berikut:

Jalur Resource frameworks/base/core/res/res/values/config.xml
Nama Konfigurasi config_isLiveWallpaperSupportedInDesktopExperience

Menyesuaikan wallpaper pengganti

Jika wallpaper animasi dinonaktifkan atau tidak didukung oleh penyedia, sistem akan menggunakan komponen default. Anda dapat mengarahkannya ke penyedia wallpaper statis Anda sendiri:

Jalur Resource frameworks/base/core/res/res/values/config.xml
Nama Konfigurasi fallback_wallpaper_component

Menerapkan dukungan wallpaper

Untuk menerapkan perubahan ini, gunakan overlay resource waktu build di folder khusus perangkat Anda, yang biasanya device/<vendor>/<product>/overlay/frameworks/base/core/res/res/values/.