🚀 6.9 Integração Prática: Salvando Viagens na Agenda

A integração final entre o BoaViagem e o Google consiste em transformar uma entidade de viagem do banco de dados local (Room) em um evento na nuvem. Veremos como realizar essa operação de forma assíncrona e resiliente.

O Método de Gravação (Java 17)

Utilizamos o objeto com.google.api.services.calendar.model.Event para estruturar os dados. A gravação ocorre através do serviço que inicializamos no login:

private void registrarEventoNaAgenda(Viagem viagem, GoogleSignInAccount conta) {
    var executor = Executors.newSingleThreadExecutor();
    
    executor.execute(() -> {
        try {
            var service = obterServiceAgenda(conta);
            
            // Criando o evento com dados do Room
            var event = new Event()
                .setSummary("Viagem: " + viagem.destino)
                .setDescription("Cadastrado via BoaViagem App");
 
            // Configurando datas (com conversão java.time para DateTime do Google)
            var start = new EventDateTime().setDateTime(new DateTime(viagem.dataSaida));
            var end = new EventDateTime().setDateTime(new DateTime(viagem.dataChegada));
            
            event.setStart(start);
            event.setEnd(end);
 
            // Inserindo na agenda Principal
            service.events().insert("primary", event).execute();
            
            runOnUiThread(() -> Toast.makeText(this, "Sincronizado com Google Agenda!", Toast.LENGTH_SHORT).show());
            
        } catch (IOException e) {
            Log.e("BOAVIAGEM", "Erro ao sincronizar", e);
        }
    });
}

Onde Chamar a Sincronização?

A recomendação premium é disparar a sincronização imediatamente após o insert bem-sucedido no banco de dados local, dentro da ViagemActivity:

private void salvarViagem() {
    // 1. Salva no Room
    repository.salvar(novaViagem);
    
    // 2. Tenta sincronizar se o usuário estiver logado
    var conta = GoogleSignIn.getLastSignedInAccount(this);
    if (conta != null) {
        registrarEventoNaAgenda(novaViagem, conta);
    }
}

CAUTION

Operações Bloqueantes: Nunca chame .execute() da Calendar API na Thread Principal. Isso causará um erro instantâneo de NetworkOnMainThreadException. Sempre utilize o padrão de Executors ou WorkManager para garantir a fluidez do app.

TIP

Caso a viagem não tenha uma data de fim definida, a Calendar API permite criar eventos de “Dia Inteiro” omitindo o campo dateTime e utilizando apenas o campo date:

new EventDateTime().setDate(new DateTime(true, data.getTime(), 0));

⬅️ Capítulo Anterior | Próximo Capítulo ➡️