Personalizzare le barre di sistema

Per personalizzare le barre di sistema, utilizza una combinazione di configurazioni XML e moduli Dagger per i componenti dell'interfaccia utente.

Definire il comportamento della barra di sistema

Per definire una barra di sistema, utilizza il tag <SystemBar> in un file XML per definire l' aspetto e l'animazione. Questo file XML fa parte di una sovrapposizione di risorse di runtime (RRO).

Attributi del tag SystemBar

L'elemento principale per una configurazione della barra di sistema è <SystemBar>, che supporta i seguenti attributi:

Attributo Stato Descrizione
id Obbligatorio ID risorsa univoco per la barra di sistema. Ad esempio, @id/my_custom_status_bar
type Obbligatorio Specifica il tipo di barra di sistema, che può essere status o navigation
barZOrder Obbligatorio

Numero intero che rappresenta l'ordine Z della barra di sistema. Valori più alti indicano che il sistema disegna la barra sopra le altre. Deve essere un numero intero positivo. Si applicano le seguenti regole:

  • Se visualizzi una barra di sistema sopra una notifica heads-up, allora questo valore deve essere maggiore di 10
  • Le barre di sistema sovrapposte non possono avere lo stesso ordine Z
defaultVariant Obbligatorio ID di <Variant> che si applica per impostazione predefinita quando la barra di sistema viene inizializzata
displayId Facoltativo ID di <Variant> che si applica per impostazione predefinita quando la barra di sistema viene inizializzata
hideForKeyboard Facoltativo

Valore booleano true o false per indicare se la barra di sistema si nasconde automaticamente quando la tastiera su schermo è attiva. Il valore predefinito di questo attributo è false.

Quando questo attributo è true, devi fornire _System_Show_Panel e _System_Hide_Panel transizioni per la barra di sistema.

dragOpenNotification Facoltativo

Valore booleano true o false per indicare se la barra di sistema attiva automaticamente l'apertura del pannello delle notifiche. Il valore predefinito di questo attributo è false.

dragCloseNotification Facoltativo

Valore booleano true o false per indicare se la barra di sistema attiva automaticamente la chiusura del pannello delle notifiche. Il valore predefinito di questo attributo è false.

ID e tipi di barre di sistema

Evita di utilizzare TopCarSystemBar, BottomCarSystemBar, LeftCarSystemBar e RightCarSystemBar come valori id. Il sistema riserva questi ID per la compatibilità con le versioni precedenti e il loro utilizzo potrebbe comportare un comportamento imprevisto.

Per le configurazioni di base della barra di stato superiore e della barra di navigazione inferiore, utilizza rispettivamente status e nav come valori dell'attributo type.

Se utilizzi questi ID, puoi saltare la sezione intitolata Fornire un'interfaccia utente della barra di sistema con Dagger.

<Variant>
Definisce gli stati visivi. Per scoprire di più, consulta la sezione Utilizzare una variante per progettare uno stato visivo. Nel tag <SystemBar>, definisci uno o più <Variant> tag. Ogni variante rappresenta uno stato visivo distinto e contiene proprietà che controllano l'aspetto della barra di sistema in quello stato.
<Visibility isVisible="true|false">
Controlla la visibilità della barra di sistema. Il valore booleano isVisible indica se la barra di sistema è visibile o meno.
<Alpha alpha="float_value">
Controlla la trasparenza della barra di sistema. Il valore di alpha è un numero mobile compreso tra 0.0 (completamente trasparente) e 1.0 (completamente opaco).
<Bounds .../>

Definisce la posizione e le dimensioni della barra di sistema. Per gli elementi <SystemBar>, i limiti devono toccare almeno un bordo del display (sinistro, superiore, destro o inferiore). Gli attributi sono:

  • left, top, right, bottom: coordinate assolute.
  • width, height: dimensioni.
  • leftOffset, topOffset, rightOffset, bottomOffset: offset verso il centro del rettangolo.
<Corner radius="dimen"/>

Definisce il raggio dell'angolo della barra di sistema. Per radius, inserisci la dimensione del raggio dell'angolo.

<Insets .../>

Definisce i margini interni per la barra di sistema. Gli attributi sono left, top, right e bottom. Per ogni attributo, inserisci un valore di dimensione per i margini interni.

<Gravity .../>

Definisce la gravità dei contenuti della barra di sistema. Per scoprire di più, consulta HunTagXmlParserKt.GRAVITY_TAG nel codice sorgente.

  • Quando ometti un valore per la gravità, il sistema lo calcola internamente.
  • I valori supportati sono combinazioni di TOP, BOTTOM, LEFT, RIGHT, CENTER, CENTER_HORIZONTAL, CENTER_VERTICAL, e FILL_HORIZONTAL, ognuno separato da un carattere |.

Unità di misura

Specifica le dimensioni con px, dp (o dip), % o riferimenti a risorse dimension, integer, fraction, string o attribute.

Transizioni: animare tra le varianti

Per scoprire di più, consulta la sezione Configurare una transizione. Utilizza il blocco <Transitions> per definire come la barra di sistema anima tra le diverse varianti:

Elemento Attributo del tag
<Transition> fromVariant, toVariant, onEvent, onEventTokens, animator, duration, delay, interpolator
<Transitions> defaultDuration, defaultInterpolator

L'interfaccia utente scalabile supporta le transizioni nelle barre di sistema solo quando le definisci per i casi d'uso in modalità non immersiva. Ciò significa che la modalità immersiva non attiva le transizioni di finestre dell'interfaccia utente scalabile per le barre di sistema quando nasconde (o mostra) una barra di sistema.

L'interfaccia utente scalabile continua a inviare eventi per nascondere (o mostrare) una barra di sistema in modo che altri pannelli possano rispondere in base alle esigenze, mentre le transizioni per nascondere e mostrare le barre di sistema devono essere fornite per il corretto funzionamento dell'attributo hideForKeyboard. Considera questa struttura XML di esempio:

<SystemBar id="@id/my_custom_status_bar" type="status" barZOrder="0" defaultVariant="@id/default_variant" hideForKeyboard="true">
    <Variant id="@+id/default_variant">
        <Bounds top="0px" left="0px" right="100%" height="100px"/>
        <Visibility isVisible="true"/>
    </Variant>
    <Variant id="@+id/hidden_variant" parent="@id/default_variant">
        <Visibility isVisible="false"/>
    </Variant>
    <Transitions>
        <Transition onEvent="_System_Show_Panel" onEventTokens="panelId= my_custom_status_bar" toVariant="@id/default_variant"/>
        <Transition onEvent="_System_Hide_Panel" onEventTokens="panelId= my_custom_status_bar" toVariant="@id/hidden_variant"/>
    </Transitions>
</SystemBar>

Fornire un'interfaccia utente della barra di sistema con Dagger

Dopo aver definito la barra di sistema in XML, fornisci la View e la Window effettive. Per farlo, applica un override dell'applicazione al modulo Dagger predefinito, CarSystemBarModule.java. Ad esempio:

import com.android.systemui.car.systembar.CarSystemBarViewSupplier;
import com.android.systemui.car.systembar.CarSystemBarWindowSupplier;
import com.android.systemui.car.systembar.CarSystemBarWindowSupplierUsingLayout;
import com.example.R;

import dagger.Module;
import dagger.Provides;
import dagger.multibindings.IntoMap;
import dagger.multibindings.StringKey;

@Module
public abstract class MySystemBarModule extends CarSystemBarModule {

    @Provides
    @IntoMap
    @StringKey("my_custom_status_bar") // Matches the <SystemBar> id
    static CarSystemBarViewSupplier bindMyCustomStatusBarViewSupplier() {
        return new CarSystemBarViewSupplierUsingLayout(
            R.layout.my_custom_status_bar, // provisioned layout
            R.layout.my_custom_status_bar_unprovisioned // unprovisioned layout
        );
    }

    @Provides
    @IntoMap
    @StringKey("my_custom_status_bar") // Matches the <SystemBar> id
    static CarSystemBarWindowSupplier bindMyCustomStatusBarWindowSupplier() {
        return new CarSystemBarWindowSupplierUsingLayout(
            R.layout.my_navigation_bar_window, // Can reuse existing window layouts
            R.id.my_custom_bar_window // The ID that will be assigned to the window
        );
    }
}

Creare un modulo Dagger in un override di SystemUI

Per espandere le risorse di layout personalizzate, utilizza le classi CarSystemBarViewSupplierUsingLayout e CarSystemBarWindowSupplierUsingLayout.

Crea un modulo Dagger per fornire i tuoi fornitori personalizzati. Il @StringKey deve corrispondere al id nel tag XML <SystemBar>.

Per eseguire l'override di CarSystemBarModule, consulta questo esempio di codice:

import com.android.systemui.car.systembar.CarSystemBarViewSupplier;
import com.android.systemui.car.systembar.CarSystemBarWindowSupplier;
import com.android.systemui.car.systembar.CarSystemBarWindowSupplierUsingLayout;
import com.example.R;

import dagger.Module;
import dagger.Provides;
import dagger.multibindings.IntoMap;
import dagger.multibindings.StringKey;

@Module
public abstract class MySystemBarModule extends CarSystemBarModule {

    @Provides
    @IntoMap
    @StringKey("my_custom_status_bar") // Matches the <SystemBar> id
    static CarSystemBarViewSupplier bindMyCustomStatusBarViewSupplier() {
        return new CarSystemBarViewSupplierUsingLayout(
            R.layout.my_custom_status_bar, // provisioned layout
            R.layout.my_custom_status_bar_unprovisioned // unprovisioned layout
        );
    }

    @Provides
    @IntoMap
    @StringKey("my_custom_status_bar") // Matches the <SystemBar> id
    static CarSystemBarWindowSupplier bindMyCustomStatusBarWindowSupplier() {
        return new CarSystemBarWindowSupplierUsingLayout(
            R.layout.my_navigation_bar_window, // Can reuse existing window layouts
            R.id.my_custom_bar_window // The ID that will be assigned to the window
        );
    }
}

Utilizzare un RRO per creare una configurazione a livello di sistema

Imposta diverse configurazioni a livello di sistema che influiscono sulle barre di sistema nel file res/values/config.xml nel tuo RRO.

Disattivare le barre di sistema legacy

Per evitare conflitti con l'interfaccia utente scalabile, disattiva le configurazioni della barra di sistema legacy impostando i seguenti flag su false:

<resources>
    <bool name="config_enableTopSystemBar">false</bool>
    <bool name="config_enableBottomSystemBar">false</bool>
    <bool name="config_enableLeftSystemBar">false</bool>
    <bool name="config_enableRightSystemBar">false</bool>
</resources>

Posizione dell'indicatore della privacy

La risorsa stringa config_privacyIndicatorLocation specifica quale barra di sistema ospita gli indicatori della privacy. Il valore deve essere il id nome di un <SystemBar>.

<resources>
    <!-- "my_custom_status_bar" corresponds to the android:id name of a SystemBar -->
    <string name="config_privacyIndicatorLocation">my_custom_status_bar</string>
</resources>

Listener di eventi di trascinamento

Queste configurazioni specificano quali barre di sistema sono in ascolto degli eventi di trascinamento (ad esempio, per scorrere verso il basso per aprire il pannello delle notifiche). A partire da Android Automotive OS con l'interfaccia utente scalabile, utilizza gli attributi XML come impostazione predefinita anziché gli array di risorse di rilevamento basati su risorse per definire queste funzionalità.

Consigliato: rilevamento basato su XML (interfaccia utente scalabile)

Utilizza gli attributi dragOpenNotification e dragCloseNotification direttamente nel tag <SystemBar> all'interno dell'XML di overlay:

<SystemBar id="@id/my_custom_status_bar" type="status" barZOrder="0" defaultVariant="@id/default_variant" dragOpenNotification="true">
    <Variant id="@+id/default_variant">
        <Bounds top="0px" left="0px" right="100%" height="100px"/>
        <Visibility isVisible="true"/>
    </Variant>
</SystemBar>

Legacy: array di risorse (fallback)

Se gestisci una build dell'interfaccia utente non scalabile o devi specificare i listener per i dispositivi compatibili con le versioni precedenti, utilizza l'approccio string-array legacy in res/values/config.xml nel tuo RRO. Queste risorse string-array specificano quali barre di sistema sono in ascolto degli eventi di trascinamento. Ad esempio, per aprire il pannello delle notifiche. Ogni <item> è il nome id di una barra di sistema.

  • config_registerHvacDragCloseListener
  • config_notificationDragOpenListener
  • config_notificationDragCloseListener

Ad esempio:

<resources>
    <string-array name="config_notificationDragOpenListener" translatable="false">
        <item>my_custom_status_bar</item>
    </string-array>
</resources>

Creazione e deployment

Per creare ed eseguire il deployment di una barra di stato:

  1. Esegui il flashing del dispositivo con l'applicazione di override di SystemUI modificata.

  2. Utilizza il sistema di compilazione di Android (m) per compilare il progetto RRO.

  3. Esegui il deployment dell'APK RRO generato sul tuo dispositivo Android Automotive. Utilizza adb install o esegui il flashing di una build completa che includa il tuo RRO.