Dukungan Dekorasi Sistem, Dukungan Dekorasi Sistem

Pembaruan yang dilakukan pada area khusus tampilan ini disediakan di bawah ini:

Dekorasi sistem

Android 10 menambahkan dukungan untuk mengonfigurasi tampilan sekunder untuk menampilkan dekorasi sistem tertentu, seperti wallpaper, bilah navigasi, dan peluncur. Secara default, tampilan utama menampilkan semua dekorasi sistem, dan tampilan sekunder menunjukkan yang diaktifkan secara opsional. Dukungan untuk Editor Metode Input (IME) dapat diatur secara terpisah dari dekorasi sistem lainnya.

Gunakan DisplayWindowSettings#setShouldShowSystemDecorsLocked() untuk menambahkan dukungan untuk dekorasi sistem pada tampilan tertentu atau memberikan nilai default di /data/system/display_settings.xml . Sebagai contoh, lihat Pengaturan jendela tampilan .

Penerapan

DisplayWindowSettings#setShouldShowSystemDecorsLocked() juga diekspos di WindowManager#setShouldShowSystemDecors() untuk pengujian. Memicu metode ini dengan maksud untuk mengaktifkan dekorasi sistem tidak menambahkan jendela dekorasi yang sebelumnya hilang, atau menghapusnya jika sebelumnya ada. Dalam kebanyakan kasus, perubahan dukungan dekorasi sistem berlaku penuh hanya setelah perangkat di-boot ulang.

Pemeriksaan dukungan dekorasi sistem di basis kode WindowManager biasanya melalui DisplayContent#supportsSystemDecorations() sementara memeriksa layanan eksternal (seperti System UI untuk memeriksa apakah bilah navigasi harus ditampilkan) menggunakan WindowManager#shouldShowSystemDecors() . Untuk memahami apa yang dikendalikan oleh pengaturan ini, jelajahi titik panggilan dari metode ini.

Jendela dekorasi UI sistem

Android 10 menambahkan dukungan jendela dekorasi sistem hanya untuk bilah navigasi , karena bilah navigasi sangat penting untuk menavigasi antara aktivitas dan aplikasi. Secara default, bilah navigasi menunjukkan keterjangkauan Kembali dan Beranda. Ini hanya disertakan jika tampilan target mendukung dekorasi sistem (lihat DisplayWindowSettings ).

Bilah status adalah jendela sistem yang lebih rumit, karena juga berisi Notification Shade, Quick Settings, dan Lock Screen. Di Android 10, bilah status tidak didukung di layar sekunder. Oleh karena itu, pemberitahuan, pengaturan, dan pengaman tombol lengkap hanya tersedia di layar utama.

Jendela sistem Ikhtisar/Terbaru tidak didukung di layar sekunder. Di Android 10, AOSP hanya menampilkan Recents pada tampilan default dan berisi aktivitas dari semua tampilan. Saat diluncurkan dari Terbaru, aktivitas yang ada di tampilan sekunder dibawa ke depan di tampilan itu, secara default. Pendekatan ini memiliki beberapa masalah yang diketahui, seperti tidak segera memperbarui saat aplikasi muncul di layar lain.

Penerapan

Untuk menerapkan fitur UI Sistem tambahan, produsen perangkat harus menggunakan satu komponen UI Sistem yang mendengarkan penambahan/penghapusan tampilan dan menyajikan konten yang sesuai.

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

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

Saat UI Sistem mendeteksi penambahan tampilan sebelum WindowManager, itu menciptakan kondisi balapan. Ini dapat dihindari dengan menerapkan panggilan balik khusus dari WindowManager ke UI Sistem saat tampilan ditambahkan alih-alih berlangganan acara DisplayManager .DisplayListener . Untuk implementasi referensi, lihat CommandQueue.Callbacks#onDisplayReady untuk dukungan bilah navigasi dan WallpaperManagerInternal#onDisplayReady untuk wallpaper.

Selain itu, Android 10 menyediakan pembaruan ini:

  • Kelas NavigationBarController mengontrol semua fungsionalitas khusus untuk bilah navigasi.
  • Untuk melihat bilah navigasi yang disesuaikan, lihat CarStatusBar .
  • TYPE_NAVIGATION_BAR tidak lagi terbatas pada satu instance dan dapat digunakan per tampilan.
  • IWindowManager#hasNavigationBar() diperbarui untuk menyertakan parameter displayId hanya untuk UI Sistem.

Peluncur

Di Android 10, setiap tampilan yang dikonfigurasi untuk mendukung dekorasi sistem memiliki tumpukan beranda khusus untuk aktivitas peluncur dengan tipe WindowConfiguration#ACTIVITY_TYPE_HOME , secara default. Setiap tampilan menggunakan instance terpisah dari aktivitas peluncur.

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

Sebagian besar peluncur yang ada tidak mendukung banyak instans dan tidak dioptimalkan untuk ukuran layar besar. Juga, jenis pengalaman yang berbeda sering diharapkan pada tampilan sekunder/eksternal. Untuk menyediakan aktivitas khusus untuk layar sekunder, Android 10 memperkenalkan kategori SECONDARY_HOME dalam filter maksud. Contoh aktivitas ini digunakan pada semua tampilan yang mendukung dekorasi sistem, satu per tampilan.

<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 ukuran layar yang berbeda. Mode peluncuran tidak boleh singleInstance atau singleTask .

Penerapan

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

Pembatasan keamanan

Selain pembatasan yang berlaku untuk aktivitas pada tampilan sekunder, untuk menghindari kemungkinan aplikasi jahat membuat tampilan virtual dengan dekorasi Sistem yang diaktifkan dan membaca informasi sensitif pengguna dari permukaan, peluncur hanya muncul di tampilan virtual yang dimiliki oleh sistem. Peluncur tidak menampilkan konten pada tampilan virtual non-sistem.

Wallpaper

Di Android 10 (dan lebih tinggi), wallpaper didukung di layar sekunder:

Gambar 2. Wallpaper hidup pada tampilan internal (atas) dan eksternal (bawah)

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

Kerangka kerja membuat satu instance WallpaperService.Engine per tampilan, sehingga setiap mesin memiliki permukaan dan konteks tampilannya sendiri. Pengembang perlu memastikan bahwa setiap mesin dapat menggambar secara independen, pada kecepatan bingkai yang berbeda, dengan menghormati VSYNC.

Memilih wallpaper untuk layar individual

Android 10 tidak menyediakan dukungan platform langsung untuk memilih wallpaper untuk layar individual. Untuk mencapai ini, pengidentifikasi tampilan yang stabil diperlukan untuk mempertahankan pengaturan wallpaper per tampilan. Display#getDisplayId() bersifat dinamis, jadi tidak ada jaminan bahwa tampilan fisik akan memiliki ID yang sama setelah reboot.

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

  1. Gunakan WallpaperManager API untuk mengatur wallpaper.
  2. WallpaperManager diperoleh dari objek Context , dan setiap objek Context memiliki informasi tentang tampilan yang sesuai ( Context#getDisplay()/getDisplayId() ). Oleh karena itu, Anda dapat memperoleh displayId dari instance WallpaperManager tanpa menambahkan metode baru.
  3. Di sisi kerangka kerja, gunakan displayId diperoleh dari objek Context dan petakan ke pengenal statis (seperti port tampilan fisik). Gunakan pengenal statis untuk mempertahankan wallpaper yang dipilih.

Solusi ini menggunakan implementasi yang ada untuk pemilih wallpaper. Jika dibuka pada tampilan tertentu dan menggunakan konteks yang tepat, maka saat panggilan untuk menyetel wallpaper, sistem dapat mengidentifikasi tampilan secara otomatis.

Jika ada kebutuhan untuk menyetel wallpaper untuk tampilan selain tampilan saat ini, buat objek Context baru untuk tampilan target ( Context#createDisplayContext ) dan dapatkan instance WallpaperManager dari tampilan itu.

Pembatasan keamanan

Sistem tidak akan menampilkan wallpaper pada tampilan virtual yang tidak dimilikinya. Ini karena masalah keamanan bahwa aplikasi jahat dapat membuat tampilan virtual dengan dukungan dekorasi sistem yang diaktifkan dan membaca informasi sensitif pengguna dari permukaan (seperti foto pribadi).

Penerapan

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

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

Jika layanan wallpaper yang ditampilkan pada tampilan default tidak mendukung beberapa tampilan, maka sistem akan menampilkan wallpaper default pada tampilan sekunder.

Gambar 3. Logika fallback wallpaper untuk tampilan sekunder