Détails techniques

Cette section fournit des informations techniques spécifiques à l'application de référence Control Center.

Le Centre de contrôle est une application système privilégiée et non groupée qui nécessite une version minimale du SDK 35 (Android V, niveau d'API 35). L'application est installée dans system/priv-app pour utiliser System APIs. Pour lire les informations multimédias, l'application doit être signée par la plate-forme. Vous pouvez mettre à jour l'application Over-the-Air (OTA).

Service d'arrière-plan

L'application Centre de contrôle repose sur un service en arrière-plan pour fonctionner. Control Center Service est démarré à l'état user-post-unlocked du cycle de vie de l'utilisateur par Vendor ServiceController. Le centre de contrôle doit toujours être actif et communiquer en arrière-plan. L'application ne peut pas compter sur le fait que l'utilisateur l'ouvre.

Control Center Service se connecte à d'autres instances de lui-même dans d'autres zones d'occupant et communique avec elles à l'aide de l'API Communication. Il est essentiel de lire le guide d'intégration pour comprendre comment les instances du Centre de contrôle de chaque utilisateur établissent des connexions, et envoient et reçoivent des données.

Diagramme illustrant le service Control Center initié par le Vendor ServiceController.
Figure 5 : Le service Control Center a été démarré par le Vendor ServiceController.

Communication

Une fois connecté, Control Center Service communique avec les objets protobuf qui transmettent des informations. Pour transmettre le protobuf à une autre zone d'occupant avec le Communication APIs, le protobuf est converti en byte array, un payload object est créé et le Payload est envoyé via 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
                 }
             }
             //…
}

Données

Les informations sur les zones d'occupant sont stockées dans le centre de contrôle sous la forme d'objets OccupantZoneData. Les modifications apportées au OccupantZoneData local sont envoyées aux autres instances du Centre de contrôle via Comms API.

Lorsque le Payload reçu est analysé, les données analysées sont transmises au OccupantZoneStateRepository local qui, à son tour, notifie les vues du changement. La plupart des données sont transmises entre les classes avec Kotlin flows on Android.

Gérer les demandes de diffusion audio sur les enceintes

Pour que le conducteur puisse toujours recevoir des demandes de passagers pour diffuser de l'audio sur les haut-parleurs de l'habitacle, le Control Center Service du conducteur enregistre le Primary ZoneMedia Audio RequestCallback lors de sa création.

Le rappel est informé des appels à CarAudioManager#requestMediaAudioOnPrimaryZone. Le pilote Control Center Service gère les requêtes en créant une notification prioritaire (HUN, heads-up notification) qui peut être acceptée ou refusée via CarAudioManager#allowMediaAudioOnPrimaryZone(boolean).

Regarder une vidéo à plusieurs sur différents écrans

Le visionnage à plusieurs fonctionne grâce à la fonctionnalité Task Mirroring APIs dans CarActivityManager. TaskMirroringManager recherche d'abord le package de l'application MediaSession en cours de lecture dans CarActivityManager#getVisibleTasks, puis crée un VirtualDisplay et déplace la tâche visible vers cet affichage via CarActivityManager#moveRootTaskToDisplay.

Cela renvoie un jeton IBinder que MirroredSurfaceView peut utiliser dans une mise en page pour afficher la tâche via MirroredSurfaceView#mirrorSurface. L'objet Communication API Payload a transmis le jeton à d'autres zones d'occupants.

Chaque instance du centre de contrôle dans ces zones d'occupant lance un Mirroring activity et utilise ce jeton pour remplir le MirroredSurfaceView.

Flux d'un jeton de duplication pour afficher une tâche sur un autre écran.
Figure 6 : Mettez en miroir un flux de jetons.

API de duplication des tâches

Le Centre de contrôle utilise les API de duplication de tâches suivantes :

CarActivityManager#getVisibleTasks(int displayId)
<ActivityManager.RunningTaskInfo> appelé pour l'affichage de l'expéditeur.

CarActivityManager#moveRootTaskToDisplay(int virtualDisplayId)
Déplace la tâche visible sélectionnée vers un écran virtuel créé.

CarActivityManager#createTaskMirroringToken(int taskId)
Crée une tâche pour refléter le jeton IBinder et doit être appelé après le déplacement de la tâche vers l'écran virtuel.

MirroredSurfaceView#mirrorSurface(IBinder token)
Objet de vue personnalisée qui utilise le jeton pour afficher le contenu de l'écran virtuel.

Limites de la duplication des tâches dans le Centre de contrôle

Le Centre de contrôle n'est compatible avec la mise en miroir des tâches que pour les applications MediaSession. Toutefois, l'API peut refléter n'importe quelle tâche. L'écran virtuel est créé avec les dimensions de l'écran de l'expéditeur. Si l'écran du récepteur utilise des résolutions et des dimensions différentes, l'écran virtuel s'affiche au centre de l'écran.

Afficher les tâches visibles

Le centre de contrôle étend le châssis Theme.CarUi.NoToolbar pour qu'il devienne une fenêtre translucide. Cela signifie que lorsque le centre de contrôle est ouvert sur une tâche, celle-ci est renvoyée dans CarActivityManager#getVisibleTasks, ce qui permet de la dupliquer.

Recevoir des informations sur la duplication

Le centre de contrôle informe les autres applications des sessions de duplication. Pour recevoir des mises à jour, les applications doivent se lier à Control Center Service et envoyer une classe Handler en tant que client, qui reçoit et gère Messages à partir de Control Center Service.

Les applications clientes peuvent recevoir le nom du package de l'application mise en miroir et lancer un intent URI pour l'activité dans le centre de contrôle hébergeant l'application mise en miroir avec ces clés :

  • _config_msg_mirroring_pkg_name_key_
  • _config_msg_mirroring_redirect_uri_key_

Ces configurations doivent exister dans les ressources de l'application cliente et dans les ressources du Centre de contrôle.

Les applications clientes reçoivent des informations de mise en miroir du centre de contrôle.
Figure 7 : Recevez des informations sur la duplication d'écran depuis le centre de contrôle.

Centre de contrôle du débogage

La classe Logger gère les journaux du centre de contrôle, qui peuvent être configurés pour forcer les journaux.

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)
       }
   }
...

Application système et mise à jour

Étant donné que le centre de contrôle est une application système et qu'il est signé par la plate-forme en raison de l'utilisation d'autorisations de signature uniquement, il doit être préinstallé sur l'appareil et ne peut être mis à jour que par OTA, comme l'application multimédia pour voiture.

Compiler Control Center à partir de la source

Pour obtenir le code source du centre de contrôle, consultez Intégrer des applications non groupées.

Confidentialité des utilisateurs avec plusieurs écrans

Le centre de contrôle permet à tous les passagers du véhicule d'afficher des informations sur les contenus multimédias sur tous les écrans. Google vous recommande d'insérer un avis de confidentialité non bloquant pour en informer les utilisateurs. Google vous recommande de le faire au niveau du système, lorsque vous vous connectez à un écran.