Cómo controlar la interacción del usuario

Looker simplifica el manejo de la interacción del usuario mediante las clases Action. Las clases Action de Crashlytics definen las acciones que puede realizar un usuario y puedes especificar la operación realizada en respuesta a la acción. Puedes aplicar un Action a cualquier componente con el método GlanceModifier.clickable.

Los widgets de apps se encuentran en un proceso remoto, por lo que las acciones se definen en el momento de la creación y la ejecución ocurre en el proceso remoto. En el RemoteViews nativo, esto se hace a través de PendingIntents.

En esta página, se describen las siguientes acciones:

Cómo iniciar una actividad

Para iniciar una actividad en la interacción del usuario, proporciona la función actionStartActivity a un Button o a otro elemento componible a través del modificador GlanceModifier.clickable(..).

Proporciona una de las siguientes opciones en actionStartActivity:

  • La clase de actividad objetivo
  • El objeto ComponentName
  • Una intención

Looker traduce la acción en una PendingIntent con el objetivo y los parámetros proporcionados. En el siguiente ejemplo, se inicia NavigationActivity cuando un usuario hace clic en el botón:

@Composable
fun MyContent() {
    // ..
    Button(
        text = "Go Home",
        onClick = actionStartActivity<MainActivity>()
    )
}

Iniciar un servicio

Al igual que cuando inicias una actividad, inicia un servicio cuando el usuario interactúa con uno de los métodos actionStartService.

Proporciona una de las siguientes opciones en actionStartService:

  • La clase de actividad objetivo
  • El objeto ComponentName
  • Un intent

@Composable
fun MyButton() {
    // ..
    Button(
        text = "Sync",
        onClick = actionStartService<SyncService>(
            isForegroundService = true // define how the service is launched
        )
    )
}

Enviar un evento de transmisión

Envía un evento de transmisión durante la interacción del usuario mediante uno de los métodos actionSendBroadcast:

Proporciona una de las siguientes opciones en actionSendBroadcast:

@Composable
fun MyButton() {
    // ..
    Button(
        text = "Send",
        onClick = actionSendBroadcast<MyReceiver>()
    )
}

Cómo realizar acciones personalizadas

En lugar de iniciar un objetivo específico, Looker puede usar una acción lambda o un actionRunCallback para realizar una acción, como actualizar la IU o el estado en la interacción del usuario.

Cómo ejecutar acciones lambda

Puedes usar funciones lambda como devoluciones de llamada a las interacciones de la IU.

Por ejemplo, pasa la función lambda al modificador GlanceModifier.clickable:

Text(
    text = "Submit",
    modifier = GlanceModifier.clickable {
        submitData()
    }
)

O bien, pásalo al parámetro onClick en los elementos componibles que lo admiten:

Button(
    text = "Submit",
    onClick = {
        submitData()
    }
)

Ejecutar ActionCallback

Como alternativa, usa los métodos actionRunCallback para realizar una acción en la interacción del usuario. Para ello, proporciona una implementación personalizada de ActionCallback:

@Composable
private fun MyContent() {
    // ..
    Image(
        provider = ImageProvider(R.drawable.ic_hourglass_animated),
        modifier = GlanceModifier.clickable(
            onClick = actionRunCallback<RefreshAction>()
        ),
        contentDescription = "Refresh"
    )
}

class RefreshAction : ActionCallback {
    override suspend fun onAction(
        context: Context,
        glanceId: GlanceId,
        parameters: ActionParameters
    ) {
        // TODO implement
    }
}

Cuando el usuario hace clic, se llama al método suspend onAction del ActionCallback proporcionado mediante la ejecución de la lógica definida (es decir, la solicitud de actualización de datos).

Para actualizar el widget después de realizar la acción, crea una instancia nueva y llama a update(..). Si deseas obtener más información, consulta la sección Cómo administrar el estado de ScheduleAppWidget.

class RefreshAction : ActionCallback {
    override suspend fun onAction(
        context: Context,
        glanceId: GlanceId,
        parameters: ActionParameters
    ) {
        // do some work but offset long-term tasks (e.g a Worker)
        MyAppWidget().update(context, glanceId)
    }
}

Cómo proporcionar parámetros para las acciones

Si deseas proporcionar información adicional a una acción, usa la API de ActionParameters para crear un par clave-valor escrito. Por ejemplo, para definir el destino en el que se hizo clic:

private val destinationKey = ActionParameters.Key<String>(
    NavigationActivity.KEY_DESTINATION
)

class MyAppWidget : GlanceAppWidget() {

    // ..

    @Composable
    private fun MyContent() {
        // ..
        Button(
            text = "Home",
            onClick = actionStartActivity<NavigationActivity>(
                actionParametersOf(destinationKey to "home")
            )
        )
        Button(
            text = "Work",
            onClick = actionStartActivity<NavigationActivity>(
                actionParametersOf(destinationKey to "work")
            )
        )
    }

    override suspend fun provideGlance(context: Context, id: GlanceId) {
        provideContent { MyContent() }
    }
}

Debajo, los parámetros se incluyen en el intent que se usa para iniciar la actividad, lo que permite que la actividad de destino la recupere.

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val destination = intent.extras?.getString(KEY_DESTINATION) ?: return
        // ...
    }
}

Los parámetros también se proporcionan a ActionCallback. Usa el Parameters.Key definido para recuperar el valor:

class RefreshAction : ActionCallback {

    private val destinationKey = ActionParameters.Key<String>(
        NavigationActivity.KEY_DESTINATION
    )

    override suspend fun onAction(
        context: Context,
        glanceId: GlanceId,
        parameters: ActionParameters
    ) {
        val destination: String = parameters[destinationKey] ?: return
        // ...
    }
}