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