Detail teknis

Bagian ini memberikan detail teknis khusus untuk aplikasi referensi Pusat Kontrol.

Pusat Kontrol adalah aplikasi yang tidak tergabung, memiliki hak istimewa, dan ditandatangani sistem yang memerlukan versi SDK minimum 35 (Android V (level API 35)). Aplikasi diinstal di system/priv-app untuk menggunakan System APIs. Untuk membaca informasi media, aplikasi harus ditandatangani platform. Anda dapat mengupdate aplikasi Over-the-Air (OTA).

Layanan latar belakang

Aplikasi Pusat Kontrol mengandalkan layanan latar belakang untuk fungsinya. Control Center Service dimulai pada status user-post-unlocked dalam siklus proses pengguna oleh Vendor ServiceController. Pusat Kontrol harus selalu aktif dan berkomunikasi di latar belakang—aplikasi tidak dapat mengandalkan aplikasi yang dibuka oleh pengguna.

Control Center Service terhubung dan berkomunikasi dengan instance lain dari dirinya sendiri di zona penumpang lain menggunakan Communication API. Membaca panduan integrasi sangat penting untuk memahami cara instance Pusat Kontrol di setiap pengguna membuat koneksi serta mengirim dan menerima data.

Diagram yang menggambarkan Layanan Control Center yang dimulai oleh Vendor ServiceController.
Gambar 5. Control Center Service dimulai oleh Vendor ServiceController.

Komunikasi

Setelah terhubung, Control Center Service berkomunikasi dengan objek protobuf yang menyampaikan informasi. Untuk meneruskan protobuf ke zona penghuni lain dengan Communication APIs, protobuf dikonversi menjadi byte array, payload object dibuat, dan Payload dikirim melalui CarOccupantConnectionManager#sendPayload.

message ControlCenterPayload {
    required Type messageType = 1;
    // ...
    enum Type {
       MEDIA_STATUS = 0;
       MEDIA_COMMAND = 1;
       INPUT_LOCK_COMMAND = 2;
       INPUT_LOCK_SUCCESSFUL = 3;
       CANCEL_AUDIO_REQUEST = 4;
       MIRRORING_REQUEST_RECEIVER_DECISION = 5;
       MIRRORING_SESSION_ENDED = 6;
    }
}

private fun parsePayload(
    senderZone: OccupantZoneInfo,
    payload: Payload
) {
     val parsedPayload =
         ControlCenterPayload.parseFrom(payload.bytes)
             when (parsedPayload.messageType) {
                 ControlCenterPayload.Type.MEDIA_STATUS -> {
                     // logic here
                 }
             }
             //…
}

Data

Informasi tentang zona hunian disimpan di Pusat Kontrol dalam bentuk objek OccupantZoneData. Perubahan pada OccupantZoneData lokal dikirim ke instance Pusat Kontrol lainnya melalui Comms API.

Saat Payload yang diterima diuraikan, data yang diuraikan akan diteruskan ke OccupantZoneStateRepository lokal yang, pada gilirannya, akan memberi tahu tampilan tentang perubahan tersebut. Sebagian besar data diteruskan antar-class dengan Kotlin flows on Android.

Menangani permintaan audio speaker kabin

Agar pengemudi selalu dapat menerima permintaan penumpang untuk memutar audio melalui speaker kabin, saat dibuat, Control Center Service pengemudi mendaftarkan Primary ZoneMedia Audio RequestCallback.

Callback akan diberi tahu tentang panggilan ke CarAudioManager#requestMediaAudioOnPrimaryZone. Driver Control Center Service menangani permintaan dengan membuat notifikasi pendahuluan (HUN) yang dapat diterima atau ditolak melalui CarAudioManager#allowMediaAudioOnPrimaryZone(boolean).

Menonton bersama video dengan layar lain

Menonton bersama berfungsi karena Task Mirroring APIs di CarActivityManager. TaskMirroringManager menelusuri terlebih dahulu paket aplikasi MediaSession yang sedang diputar di CarActivityManager#getVisibleTasks, lalu membuat VirtualDisplay dan memindahkan tugas yang terlihat ke tampilan ini melalui CarActivityManager#moveRootTaskToDisplay.

Tindakan ini akan menampilkan token IBinder yang dapat digunakan MirroredSurfaceView dalam tata letak untuk menampilkan tugas melalui MirroredSurfaceView#mirrorSurface. Objek Communication API Payload meneruskan token ke zona penghuni lainnya.

Setiap instance Pusat Kontrol di zona penghuni tersebut meluncurkan Mirroring activity dan menggunakan token tersebut untuk mengisi MirroredSurfaceView.

Alur token pencerminan untuk menampilkan tugas di layar lain.
Gambar 6. Meniru alur token.

API pencerminan tugas

Pusat Kontrol menggunakan API pencerminan tugas berikut:

CarActivityManager#getVisibleTasks(int displayId)
<ActivityManager.RunningTaskInfo> dipanggil untuk tampilan pengirim.

CarActivityManager#moveRootTaskToDisplay(int virtualDisplayId)
Memindahkan tugas yang terlihat dan dipilih ke tampilan virtual yang dibuat.

CarActivityManager#createTaskMirroringToken(int taskId)
Membuat tugas untuk mencerminkan token IBinder dan harus dipanggil setelah tugas dipindahkan ke tampilan virtual.

MirroredSurfaceView#mirrorSurface(IBinder token)
Objek tampilan kustom yang menggunakan token untuk menampilkan konten |tampilan virtual.

Batasan pencerminan tugas di Pusat Kontrol

Pusat Kontrol hanya mendukung pencerminan tugas untuk aplikasi MediaSession. Namun, API dapat mencerminkan tugas apa pun. Tampilan virtual dibuat dengan dimensi tampilan pengirim. Jika layar penerima menggunakan resolusi dan dimensi yang berbeda, layar virtual akan muncul di tengah layar.

Menampilkan tugas yang terlihat

Pusat Kontrol memperluas sasis Theme.CarUi.NoToolbar menjadi jendela transparan. Artinya, saat Pusat Kontrol dibuka di atas tugas, tugas akan ditampilkan di CarActivityManager#getVisibleTasks, sehingga tugas dapat dicerminkan.

Menerima informasi pencerminan

Pusat Kontrol memberi tahu aplikasi lain tentang sesi pencerminan. Untuk menerima update, aplikasi harus terikat ke Control Center Service dan mengirim class Handler sebagai klien, yang menerima dan menangani Messages dari Control Center Service.

Aplikasi klien dapat menerima nama paket aplikasi yang dicerminkan dan meluncurkan intent URI untuk aktivitas di Pusat Kontrol yang menghosting aplikasi yang dicerminkan dengan kunci ini:

  • _config_msg_mirroring_pkg_name_key_
  • _config_msg_mirroring_redirect_uri_key_

Konfigurasi ini harus ada di resource aplikasi klien dan di resource Control Center.

Aplikasi klien menerima informasi pencerminan dari Pusat Kontrol.
Gambar 7. Menerima informasi pencerminan dari Pusat Kontrol.

Pusat Kontrol Debug

Class Logger menangani log Pusat Kontrol, yang dapat dikonfigurasi untuk memaksa log.

class Logger(cls: Class<*>) {

   companion object {
       private const val FORCE_LOGS = false
   }

   private val tag: String

   init {
       tag = cls.simpleName
   }

   fun v(message: String) {
       if (Log.isLoggable(tag, Log.VERBOSE) || FORCE_LOGS) {
           Log.v(tag, message)
       }
   }
...

Aplikasi sistem dan kemampuan update

Karena Pusat Kontrol adalah aplikasi sistem dan ditandatangani platform karena penggunaan izin khusus tanda tangan, Pusat Kontrol harus diinstal sebelumnya di perangkat dan hanya dapat diupdate melalui OTA, mirip dengan Aplikasi Media Mobil.

Membangun Pusat Kontrol dari sumber

Untuk mendapatkan kode sumber Pusat Kontrol, lihat Mengintegrasikan aplikasi yang tidak tergabung.

Privasi pengguna dengan multi-tampilan

Control Center memungkinkan semua penumpang mobil melihat informasi media di semua layar. Google merekomendasikan agar Anda menyisipkan pemberitahuan privasi non-blocking untuk memberi tahu pengguna. Google merekomendasikan agar Anda melakukannya di tingkat sistem, saat Anda login ke layar.