Dukungan dekorasi sistem

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

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 menampilkan dekorasi yang diaktifkan secara opsional. Dukungan untuk Editor Metode Input (IME) dapat diatur secara terpisah dari dekorasi sistem lainnya.

Gunakan DisplayWindowSettings#setShouldShowSystemDecorsLocked() untuk menambahkan dukungan dekorasi sistem pada tampilan tertentu atau memberikan nilai default di /data/system/display_settings.xml . Misalnya, 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 akan berlaku sepenuhnya hanya setelah perangkat di-boot ulang.

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

Jendela dekorasi UI sistem

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

Bilah status adalah jendela sistem yang lebih rumit, karena juga berisi Bayangan Pemberitahuan, Pengaturan Cepat, dan Layar Kunci. Di Android 10, bilah status tidak didukung pada tampilan sekunder. Oleh karena itu, notifikasi, pengaturan, dan pengaman tombol lengkap hanya tersedia di tampilan utama.

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

Penerapan

Untuk mengimplementasikan 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, kondisi balapan akan dibuat. Hal ini dapat dihindari dengan menerapkan panggilan balik khusus dari WindowManager ke UI Sistem saat tampilan ditambahkan alih-alih berlangganan peristiwa DisplayManager .DisplayListener . Untuk implementasi referensi, lihat CommandQueue.Callbacks#onDisplayReady untuk dukungan bilah navigasi dan WallpaperManagerInternal#onDisplayReady untuk wallpaper.

Selain itu, Android 10 menyediakan pembaruan berikut:

  • Kelas NavigationBarController mengontrol semua fungsi 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 aktivitas peluncur yang terpisah.

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

Kebanyakan peluncur yang ada tidak mendukung banyak contoh dan tidak dioptimalkan untuk ukuran layar besar. Selain itu, pengalaman berbeda sering kali diharapkan pada tampilan sekunder/eksternal. Untuk menyediakan aktivitas khusus untuk layar sekunder, Android 10 memperkenalkan kategori SECONDARY_HOME di 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 banyak kejadian 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 pada aktivitas di tampilan sekunder, untuk menghindari kemungkinan aplikasi jahat membuat tampilan virtual dengan dekorasi Sistem diaktifkan dan membaca informasi sensitif pengguna dari permukaan, peluncur hanya muncul di tampilan virtual milik sistem. Peluncur tidak menampilkan konten pada tampilan virtual non-sistem.

Wallpaper

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

Gambar 2. Wallpaper hidup di layar 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 ini 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 frame rate yang berbeda, dengan memperhatikan VSYNC.

Pilih wallpaper untuk masing-masing layar

Android 10 tidak menyediakan dukungan platform langsung untuk memilih wallpaper untuk setiap layar. Untuk mencapai hal 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 pengidentifikasi stabil untuk tampilan fisik dan dapat digunakan untuk implementasi penuh di masa mendatang. Sayangnya, sudah terlambat untuk mengimplementasikan 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 bisa mendapatkan displayId dari instance WallpaperManager tanpa menambahkan metode baru.
  3. Di sisi kerangka kerja, gunakan displayId yang diperoleh dari objek Context dan petakan ke pengidentifikasi statis (seperti port tampilan fisik). Gunakan pengidentifikasi statis untuk mempertahankan wallpaper yang dipilih.

Solusi ini menggunakan implementasi yang ada untuk pemetik wallpaper. Jika dibuka pada tampilan tertentu dan menggunakan konteks yang tepat, maka ketika dipanggil untuk menyetel wallpaper, sistem dapat secara otomatis mengidentifikasi tampilan tersebut.

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

Pembatasan keamanan

Sistem tidak akan menampilkan wallpaper pada tampilan virtual yang bukan miliknya. Hal ini disebabkan oleh masalah keamanan sehingga 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, antarmuka IWallpaperConnection#attachEngine() dan IWallpaperService#attach() menerima parameter displayId untuk membuat koneksi per layar. 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 terkait. WallpaperInfo#supportsMultipleDisplays() dan atribut sumber daya terkait 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 penggantian wallpaper untuk tampilan sekunder