fbpx

Adicionando eventos à agenda do Android com Delphi XE5

Adicionando evento na Agenda do Android com Delphi XE5

Nos dias atuais a agenda de compromissos na “nuvem” é uma realidade muito comum nos usuários de dispositivos Android, daí a possibilidade de sua aplicação interagir diretamente na Agenda do Google torna-se um excelente otimizador do tempo de seu usuário tornando ainda mais agradável a sua experiência de uso.

Imagine você poder a partir do seu cadastro de clientes já agendar a visita ou uma ligação para o cliente sem a necessidade de alternar entre os dois aplicativos? Essa possibilidade será apresentada nesta postagem. 

O caminho

Mais uma vez vamos utilizar aplicativos nativos do Android, e a melhor forma de fazer sua aplicação comunicar-se com o Sistema Operacional é através das Intents. Intent é um tema que já abordei no blog em algumas postagens, se você ainda não leu sobre o tema recomendo que comece por INTENTS COM DELPHI XE5 COMUNICANDO APPS ATRAVÉS DO ANDROID .

Adicionando evento na Agenda do Android com Delphi XE5

A aplicação

A ideia é que nossa aplicação tenha uma tela de disparo de um evento em uma data e hora definida pelo usuário na sua interface.
Vamos iniciar uma aplicação Mobile em branco no Delphi XE5, e no form principal vamos inserir os itens: 1 Button, 1 ToolBar, 1 Image,  2 Edit, 1 CalendarEdit, 1 TimeEdit.
Agora vamos configurar suas respectivas propriedades como litado abaixo:

  • Button1
    • Align -> alBottom
    • Text -> Agendar
  • Edit1
    • Align -> alTop
    • Text -> Meu Evento
    • TextAlign -> taCenter
  • Edit2
    • Align -> alTop
    • Text -> Informação do meu evento
    • TextAlign -> taCenter
  • Image1
    • Align -> alClient
    • MultiResBitmap -> [escolha uma imagem válida a seu gosto]
    • WrapMode -> iwStretch

Coloque o CalendarEdit1 e o TimeEdit1 dentro da ToolBar1 que se encontra no topo da tela e ao final deste processo teremos uma prévia da interface do sistema bem parecida com a imagem abaixo:

Interface da Aplicação de Agendamento

 

O código

No evento onActivate do formulário vamos inserir o seguinte código:

procedure TForm1.FormActivate(Sender: TObject);
begin
  CalendarEdit1.Date := Now;
  TimeEdit1.Time := Now();
end;

Com este procedimento garantimos que sempre que a aplicação for iniciada a data e hora atual do sistema serão carregadas para os referidos componentes.

Na seção Implementation da Unit do formulário vamos inserir a cláusula uses como abaixo:

implementation
{$R *.fmx}
uses
  Androidapi.JNI.GraphicsContentViewText, 
  FMX.Helpers.Android, IdURI, DateUtils,
  Androidapi.JNI.JavaTypes, Androidapi.Jni.Net,
  Androidapi.JNIBridge;

A execução de nossa tarefa de agendamento propriamente dita estará associada ao clique do botão. Para isso vamos codificar o evento onClick do Button1:

procedure TForm1.Button1Click(Sender: TObject);
var
  Intent: JIntent;
  CalendarIni: JCalendar;
  Uri : string;
begin
  Uri      := 'content://com.android.calendar/events';

  Intent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_EDIT,
    TJnet_Uri.JavaClass.parse(StringToJString(TIdURI.URLEncode(uri))));
  CalendarIni := TJCalendar.JavaClass.getInstance;
  CalendarIni.&set(YearOf(CalendarEdit1.DateTime), MonthOf(CalendarEdit1.DateTime)-1, DayOf(CalendarEdit1.DateTime),
                      HourOf(TimeEdit1.Time), MinuteOf(TimeEdit1.Time));
  intent.putExtra(StringToJString('beginTime'), CalendarIni.getTimeInMillis());
  intent.putExtra(StringToJString('endTime'), CalendarIni.getTimeInMillis()+ 2 *3600*1000);
  intent.putExtra(StringToJString('title'), StringToJString(Edit1.Text));
  intent.putExtra(StringToJString('eventLocation'), StringToJString('Itaocara RJ'));
  intent.putExtra(StringToJString('description'),
          StringToJString(Edit2.Text));
  SharedActivity.startActivity(Intent);

end;

Explicações adicionais

Com o procedimento acima, já temos nossa aplicação pronta para ser executada. Vamos apenas detalhar alguns pontos do código acima. Criamos um objeto Intent do tipo JIntent e um objeto CalendarIni do tipo JCalendar, em ambos referencia-se objetos provenientes de classes Java. Setamos o CalendarIni com data e hora fornecidas pelo usuário.

Nota: As funções YearOf, MonthOf, DayOf são declaradas na Namespace System.DateUtils, bem com HourOf e MinuteOf, que incluímos na cláusula uses. Elas retiram de componentes TDateTime Ano, Mês, Dia, Hora e Minuto respecitvamente.
Nota 2: Repare que ao resultado da execução  MonthOf(CalendarEdit1.DateTime) subtraímos um para que o mês retornado seja condizente com o mês selecionado pelo usuário.

O CalendarIni faz uso da função CalendarIni.getTimeInMillis() que transforma seu valor de data/hora em milesegundos, note que na constante endTime passamos o mesmo valor da constante de início do evento, beginTime, somando-o a uma expressão matemática também em milesegundos: 2 *3600*1000.  O resultado dessa expressão equivale a 2 horas, ou seja, 2 vezes o valor de 3600 (quantidade de segundos referentes a uma hora) vezes 1000 (quantidade de milesegundos referentes a 1 segundo). Assim sendo teremos o nosso evento terminando 2 horas após seu início.

Mais sobre a Classe Calendar no Android você encontra clicando no link: http://developer.android.com/reference/android/provider/CalendarContract.EventsColumns.html 

Agende seu evento

Como já mencionei acima, a aplicação já está pronta! Execute e confira o resultado! Agende um data para desenvolver sua próxima aplicação.
Confira o funcionamento na imagens abaixo e até a próxima!

 

,

Comente