SystemUIOverlayWindow Codelab

Este artículo explica cómo crear una vista en SystemUIOverlayWindow .

Antes de que empieces

El contenido proporcionado a continuación supone que ha leído estos artículos de la interfaz de usuario del sistema:

Este artículo:

  • Supone que está familiarizado con los casos de uso del sistema operativo Android Automotive y su SystemUIOverlayWindow .
  • Proporciona ejemplos de ciertas subclases de OverlayViewController .
  • No aborda las subclases de OverlayViewController .
  • No explica cómo configurar Android para el desarrollo.
  • No describe cada opción que se puede anular en las clases base. Más bien, describe solo los necesarios para configurar una vista básica.

Completa el laboratorio de código

Paso 1: Cree un diseño para OverlayViewController

Cree un archivo denominado frameworks/base/packages/CarSystemUI/res/layout/codelab_layout.xml para que contenga lo siguiente:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/codelab_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/black">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:gravity="center"
            android:text="Code Lab View!"
            android:color="@*android:color/car_accent"
            android:textStyle="italic"
            android:textSize="34sp"/>
        <Button
            android:id="@+id/codelab_button"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="0"
            android:text="Hide!"
            android:background="@*android:color/car_accent"/>
    </LinearLayout>
</FrameLayout>

Este diseño crea la siguiente vista:

OverlayViewController
Figura 1. OverlayViewController

Paso 2: agregue un ViewStub a SysUIOverlayWindow

Agregue la vista a su ventana agregando ViewStub a SystemUIOverlayWindow .

Agregue el siguiente código a frameworks/base/packages/CarSystemUI/res/layout/sysui_overlay_window.xml en el FrameLayout raíz:

<ViewStub android:id="@+id/codelab_stub"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:layout="@layout/codelab_layout"/>

El orden en el que se definen ViewStubs en el FrameLayout raíz define el orden Z de las vistas en la ventana. Dado que este laboratorio de código no implica capas de vistas, puede agregar el fragmento de código en cualquier lugar del FrameLayout raíz.

Paso 3: Crea un OverlayViewController

Para que se muestre y se oculte, el nuevo diseño debe estar vinculado a un OverlayViewController .

Para crear un OverlayViewController inyectable llamado frameworks/base/packages/CarSystemUI/src/com/android/systemui/car/codelab/CodeLabViewController.java con el siguiente contenido:

package com.android.systemui.car.codelab;

import com.android.systemui.R;
import com.android.systemui.car.window.OverlayViewController;
import com.android.systemui.car.window.OverlayViewGlobalStateController;
import com.android.systemui.dagger.SysUISingleton;

import javax.inject.Singleton;

@SysUISingleton
public class CodeLabViewController extends OverlayViewController {

    @Inject
    public CodeLabViewController(
            OverlayViewGlobalStateController overlayViewGlobalStateController) {
        super(R.id.codelab_stub, overlayViewGlobalStateController);
    }
}

Paso 4: Cree un OverlayViewMediator

Se requiere un OverlayViewMediator para activar cuando se muestra u oculta una nueva vista.

Cree un nuevo OverlayViewMediator inyectable llamado frameworks/base/packages/CarSystemUI/src/com/android/systemui/car/codelab/CodeLabViewMediator.java con el siguiente contenido:
package com.android.systemui.car.codelab;

import android.bluetooth.BluetoothAdapter; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter;
import com.android.systemui.car.window.OverlayViewMediator; import com.android.systemui.dagger.SysUISingleton;
import javax.inject.Inject;
@SysUISingleton public class CodeLabViewMediator implements OverlayViewMediator { Context mContext; CodeLabViewController mCodeLabViewController;
@Inject public CodeLabViewMediator(Context context, CodeLabViewController codeLabViewController) { mContext = context; mCodeLabViewController = codeLabViewController; }
@Override public void registerListeners() { // no-op }
@Override public void setupOverlayContentViewControllers() { // no-op } }

Paso 5: mostrar la vista

Para facilitar la comprensión y activar nuestra vista, utilice Bluetooth cuando el estado esté desactivado.

Reemplace // no-op en CodeLabViewMediator#registerListeners con lo siguiente:

// Register Show Listener
mContext.registerReceiver(new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        final String action = intent.getAction();

if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) { final int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR); switch (state) { case BluetoothAdapter.STATE_OFF: // Show OverlayViewController mCodeLabViewController.start(); break; } } } }, new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED));

Paso 6: ocultar la vista

La vista se ocultará cuando el botón "¡Ocultar!" se hace clic en el botón. Dado que esta acción solo se realiza en el botón de la vista inflada, agregue esto directamente a su OverlayViewController .

Agregue el siguiente método a CodeLabViewController :

@Override
protected void onFinishInflate() {
    getLayout().findViewById(R.id.codelab_button).setOnClickListener(v -> {
        stop();
    });
}

Paso 7: Configure el nuevo OverlayViewMediator

  1. Para agregar el nuevo OverlayViewMediator a OverlayWindowModule, agregue el siguiente código a OverlayWindowModule :
    /** Injects CodeLabViewMediator. */
    @Binds
    @IntoMap
    @ClassKey(CodeLabViewMediator.class)
    public abstract OverlayViewMediator bindCodeLabViewMediator(
            CodeLabViewMediator overlayViewsMediator);
    
  2. Para agregar el nuevo OverlayViewMediator a config_carSystemUIOverlayViewsMediators, agregue la siguiente línea a config_carSystemUIOverlayViewsMediators en frameworks/base/packages/CarSystemUI/res/values/config.xml :
    <item>com.android.systemui.car.codelab.CodeLabViewMediator</item>
    

Resultado

¡Felicidades! Ha creado una vista en SystemUIOverlayWindow :

SystemUIOverlayWindow
Figura 2. Ventana SystemUIOverlay

Recursos adicionales

Para obtener más información, consulte los recursos proporcionados a continuación.

Muestra OverlayViewController

Vea el conmutador de usuario de pantalla completa como una aplicación sencilla de SystemUIOverlayWindow: :

Otros OverlayViewControllers

OverlayPanelViewController

Se usa un OverlayPanelViewController para proporcionar una animación de arrastre básica al mostrar y ocultar vistas dentro SystemUIOverlayWindow . Consulte el panel de notificaciones para obtener más información: