Menyesuaikan kolom sistem

Untuk menyesuaikan kolom sistem, gunakan kombinasi konfigurasi XML dan modul Dagger ke komponen UI.

Menentukan perilaku kolom sistem

Untuk menentukan kolom sistem, gunakan tag <SystemBar> dalam file XML untuk menentukan tampilan dan animasi. File XML ini adalah bagian dari overlay resource runtime (RRO).

Atribut tag SystemBar

Elemen root untuk konfigurasi kolom sistem adalah <SystemBar>, yang mendukung atribut berikut:

Atribut Status Deskripsi
id Wajib ID resource unik untuk kolom sistem. Misalnya, @id/my_custom_status_bar
type Wajib Menentukan jenis kolom sistem, yaitu status atau navigation
barZOrder Wajib

Bilangan bulat untuk mewakili Z-order kolom sistem. Nilai yang lebih tinggi menunjukkan bahwa sistem menggambar kolom di atas yang lain. Harus berupa bilangan bulat positif. Aturan berikut berlaku:

  • Jika Anda menampilkan kolom sistem di atas notifikasi pop-up, maka nilai ini harus lebih besar dari 10
  • Kolom sistem yang tumpang-tindih tidak boleh memiliki Z-order yang sama
defaultVariant Wajib ID <Variant> yang berlaku secara default saat kolom sistem diinisialisasi
displayId Opsional ID <Variant> yang berlaku secara default saat kolom sistem diinisialisasi
hideForKeyboard Opsional

Nilai boolean true atau false untuk menunjukkan apakah kolom sistem otomatis disembunyikan saat keyboard virtual aktif. Atribut ini secara default adalah false.

Jika atribut ini adalah true, Anda harus menyediakan _System_Show_Panel dan _System_Hide_Panel transisi untuk kolom sistem.

dragOpenNotification Opsional

Nilai boolean true atau false untuk menunjukkan apakah kolom sistem otomatis memicu pembukaan panel notifikasi. Atribut ini secara default adalah false.

dragCloseNotification Opsional

Nilai boolean true atau false untuk menunjukkan apakah kolom sistem otomatis memicu penutupan panel notifikasi. Atribut ini secara default adalah false.

ID dan jenis kolom sistem

Hindari penggunaan TopCarSystemBar, BottomCarSystemBar, LeftCarSystemBar, dan RightCarSystemBar sebagai nilai id. Sistem mencadangkan ID ini untuk kompatibilitas mundur, dan penggunaannya dapat menyebabkan perilaku yang tidak terduga.

Untuk konfigurasi kolom status atas dasar dan kolom navigasi bawah, gunakan status dan nav, masing-masing, sebagai nilai atribut type.

Jika menggunakan ID ini, Anda dapat melewati bagian yang berjudul Menyediakan UI kolom sistem dengan Dagger.

<Variant>
Menentukan status visual. Untuk mempelajari lebih lanjut, lihat Menggunakan varian untuk mendesain status visual. Dalam tag <SystemBar>, tentukan satu atau beberapa <Variant> tag. Setiap varian mewakili status visual yang berbeda dan berisi properti yang mengontrol tampilan kolom sistem dalam status tersebut.
<Visibility isVisible="true|false">
Mengontrol visibilitas kolom sistem. Boolean isVisible memberi sinyal apakah kolom sistem terlihat atau tidak.
<Alpha alpha="float_value">
Mengontrol transparansi kolom sistem. Nilai untuk alpha mengambang antara 0.0 (sepenuhnya transparan) dan 1.0 (sepenuhnya buram).
<Bounds .../>

Menentukan posisi dan ukuran kolom sistem. Untuk elemen <SystemBar>, batas harus menyentuh setidaknya satu tepi tampilan (kiri, atas, kanan, atau bawah). Atributnya adalah:

  • left, top, right, bottom: Koordinat absolut.
  • width, height: Dimensi.
  • leftOffset, topOffset, rightOffset, bottomOffset: Offset ke arah tengah persegi panjang.
<Corner radius="dimen"/>

Menentukan radius sudut kolom sistem. Untuk radius, masukkan dimensi radius sudut.

<Insets .../>

Menentukan sisipan untuk kolom sistem. Atributnya adalah left, top, right, dan bottom. Untuk setiap atribut, masukkan nilai dimensi untuk sisipan.

<Gravity .../>

Menentukan gravitasi konten kolom sistem. Untuk mempelajari lebih lanjut, lihat HunTagXmlParserKt.GRAVITY_TAG dalam kode sumber.

  • Jika Anda menghilangkan nilai untuk gravitasi, sistem akan menghitungnya secara internal.
  • Nilai yang didukung adalah kombinasi TOP, BOTTOM, LEFT, RIGHT, CENTER, CENTER_HORIZONTAL, CENTER_VERTICAL, dan FILL_HORIZONTAL, yang masing-masing dipisahkan oleh karakter |.

Unit dimensi

Tentukan dimensi dengan px, dp (atau dip), %, atau referensi ke resource dimension, integer, fraction, string, atau attribute.

Transisi: Menganimasikan antar-varian

Untuk mempelajari lebih lanjut, lihat Mengonfigurasi transisi. Gunakan blok <Transitions> untuk menentukan cara kolom sistem menganimasikan antar-varian yang berbeda:

Item Atribut tag
<Transition> fromVariant, toVariant, onEvent, onEventTokens, animator, duration, delay, interpolator
<Transitions> defaultDuration, defaultInterpolator

UI yang dapat diskalakan hanya mendukung transisi di kolom sistem jika Anda menentukannya untuk kasus penggunaan mode non-immersive. Artinya, mode immersive tidak memicu transisi jendela UI yang Dapat Diskala untuk kolom sistem saat menyembunyikan (atau menampilkan) kolom sistem.

UI yang Dapat Diskala terus mengirim peristiwa untuk menyembunyikan (atau menampilkan) kolom sistem sehingga panel lain dapat merespons sesuai kebutuhan, sementara transisi untuk menyembunyikan dan menampilkan kolom sistem harus disediakan agar atribut hideForKeyboard berfungsi dengan baik. Pertimbangkan contoh struktur XML ini:

<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>

Menyediakan UI kolom sistem dengan Dagger

Setelah menentukan kolom sistem dalam XML, berikan View dan Window yang sebenarnya. Untuk melakukannya, terapkan penggantian aplikasi ke modul Dagger default, CarSystemBarModule.java. Contoh:

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

Membuat modul Dagger dalam penggantian SystemUI

Untuk memperluas resource tata letak kustom, gunakan class CarSystemBarViewSupplierUsingLayout dan CarSystemBarWindowSupplierUsingLayout.

Buat modul Dagger untuk menyediakan supplier kustom Anda. @StringKey harus cocok dengan id di tag XML <SystemBar>.

Untuk mengganti CarSystemBarModule, lihat contoh kode ini:

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

Menggunakan RRO untuk membuat konfigurasi tingkat sistem

Tetapkan beberapa konfigurasi tingkat sistem yang memengaruhi kolom sistem dalam file res/values/config.xml di RRO Anda.

Menonaktifkan kolom sistem lama

Untuk mencegah konflik dengan UI yang Dapat Diskala, nonaktifkan konfigurasi kolom sistem lama dengan menetapkan flag berikut ke 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>

Lokasi indikator privasi

Resource string config_privacyIndicatorLocation menentukan kolom sistem mana yang menghosting indikator privasi. Nilainya harus berupa nama id dari <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>

Pemroses peristiwa tarik

Konfigurasi ini menentukan kolom sistem mana yang memproses peristiwa tarik (misalnya, untuk menggeser ke bawah guna membuka panel notifikasi). Mulai Android Automotive OS dengan UI yang Dapat Diskala, gunakan atribut XML sebagai default, bukan array resource penemuan yang didorong untuk menentukan kemampuan ini.

Direkomendasikan: Penemuan berbasis XML (UI yang Dapat Diskala)

Gunakan atribut dragOpenNotification dan dragCloseNotification langsung di tag <SystemBar> di dalam XML 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>

Lama: Array resource (fallback)

Jika Anda mempertahankan build UI yang tidak Dapat Diskala atau perlu menentukan pemroses untuk perangkat yang kompatibel dengan versi sebelumnya, gunakan pendekatan string-array lama di res/values/config.xml di RRO Anda. Resource string-array ini menentukan kolom sistem mana yang memproses peristiwa tarik. Misalnya, untuk membuka panel notifikasi. Setiap <item> adalah nama id kolom sistem.

  • config_registerHvacDragCloseListener
  • config_notificationDragOpenListener
  • config_notificationDragCloseListener

Contoh:

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

Mem-build dan men-deploy

Untuk mem-build dan men-deploy kolom status:

  1. Flash perangkat dengan aplikasi penggantian SystemUI yang telah diubah.

  2. Gunakan sistem build Android (m) untuk mengompilasi project RRO.

  3. Deploy APK RRO yang dihasilkan ke perangkat Android Automotive. Gunakan adb install atau flash build lengkap yang menyertakan RRO Anda.