Processar interação do usuário

O Glance simplifica o gerenciamento da interação do usuário usando as classes Action As classes Action do Glance definem as ações que um usuário pode realizar, e você pode especificar a operação realizada em resposta à ação. É possível aplicar uma Action a qualquer componente usando o método GlanceModifier.clickable.

Os widgets de apps residem em um processo remoto. Portanto, as ações são definidas no momento da criação, e a execução acontece no processo remoto. No RemoteViews nativo, isso é feito usando PendingIntents.

As ações a seguir estão descritas nesta página:

Iniciar uma atividade

Para iniciar uma atividade após a interação do usuário, forneça a função actionStartActivity a um Button ou outro elemento combinável usando o modificador GlanceModifier.clickable(..).

Forneça uma das seguintes informações em actionStartActivity:

O Glance converte a ação em um PendingIntent com o destino e os parâmetros fornecidos. No exemplo a seguir, o NavigationActivity é iniciado quando um usuário clica no botão:

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

Iniciar um serviço

De forma semelhante ao lançamento de uma atividade, iniciar um serviço na interação do usuário usando um dos métodos actionStartService.

Forneça uma das seguintes informações em actionStartService:

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

Enviar um evento de transmissão

Envie um evento de transmissão na interação do usuário usando um dos métodos actionSendBroadcast:

Forneça uma das seguintes informações em actionSendBroadcast:

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

Realizar ações personalizadas

Em vez de iniciar um destino específico, o Glance pode usar uma ação lambda ou um actionRunCallback para realizar uma ação, como atualizar a interface ou o estado na interação do usuário.

Executar ações lambda

Você pode usar funções lambda como callbacks para as interações da interface.

Por exemplo, transmita a função lambda ao modificador GlanceModifier.clickable:

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

Ou transmita-o para o parâmetro onClick em elementos combináveis que têm suporte a ele:

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

Executar ActionCallback

Se preferir, use os métodos actionRunCallback para realizar uma ação com base na interação do usuário. Para fazer isso, forneça uma implementação personalizada do 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
    }
}

No clique do usuário, o método suspend onAction do ActionCallback fornecido é chamado, executando a lógica definida (ou seja, solicitando dados de atualização).

Para atualizar o widget depois que a ação for realizada, crie uma nova instância e chame update(..). Para saber mais, consulte a seção Gerenciar o estado do GlanceAppWidget.

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

Fornecer parâmetros para ações

Para fornecer mais informações a uma ação, use a API ActionParameters para criar um par de chave-valor tipado. Por exemplo, para definir o destino clicado:

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

Abaixo, os parâmetros são incluídos na intent usada para iniciar a atividade, permitindo que a atividade de destino a recupere.

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

Os parâmetros também são fornecidos ao ActionCallback. Use o Parameters.Key definido para recuperar o 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
        // ...
    }
}