• Nenhum resultado encontrado

2.3 App Cliente

2.3.3 Implementação

Para a implementação desta aplicação foram utilizadas as ferramentas oferecidas pelo Google, para o desenvolvimento de uma aplicação nativa ao Android, a linguagem utilizada é o Java. Para implementar todas as funções da aplicação foram utilizadas várias bibliotecas.

O código está estruturado segundo o padrão de desenho Singleton, este é bastante simples e é ótimo para utilizar em sistemas que usam multithread. O Java é uma linguagem que permite usar mais do que uma thread ao mesmo tempo, ou seja é possível realizar várias atividades em simultâneo, neste caso vários pedidos HTTP. O padrão Singleton assegura a existência de apenas uma única instância da classe, desta forma mantém um ponto global de acesso ao objeto.

O código da aplicação o objeto Singleton permite que só seja realizada uma única chamada à base de dados para guardar os dados, do cliente e outros importantes. Desta forma sempre que é necessário, por exemplo o Id do cliente, é chamado o objeto. Esta classe guarda variáveis que são necessárias ao longo da aplicação. Por exemplo, quando o utilizador escolhe as coordenadas de origem, estas só são usadas mais tarde. O padrão permite guardar e quando forem necessárias é possível aceder globalmente a partir de qualquer classe.

Na classe Singleton foram criados vários métodos necessários a mais do que uma classe, os métodos para realizar os pedidos HTTP, fazem parte da mesma. De cada vez que é necessário realizar uma solicitação, basta chamar o método do objeto. Isto torna aplicação mais eficiente, já que não é necessário criar o método e as variáveis de cada vez que uma classe é chamada pela aplicação.



1

2 public void initRequest(int index, JSONInterface list) { 3 if (index != 99) {

4 json = new JSONParse(list, URLs[index], context); 5

6 } else

7 json = new JSONParse(list, URLs[3], context);

8 }

9

2.3. App Cliente 31 11 json.execute();

12 }

13

14 public void closeRequest(int f) { 15 json = null;

16

17 closeWait(f);

18 }

19

20 public void closeWait(int f) { 21 if (handler != null)

22 handler.removeCallbacks(runnable); 23 if (mProgressDialog != null)

24 try {

25 (context).runOnUiThread(new Runnable() {

26 @Override

27 public void run() { 28 mProgressDialog.dismiss(); 29 mProgressDialog = null; 30 } 31 }); 32 } catch (Error e) { 33 e.printStackTrace(); 34 } 35 if (f > 0) { 36 startAct(f); 37 } 38 }  

Bloco de Código 2.4: Métodos HTTP na classe Singleton

O código2.4é um excerto da classe Singleton e são os métodos que tratam da inicialização, execução e encerramento dos pedidos HTTP. A própria classe implementa a biblioteca JSON, esta faz o tratamento dos pedidos de modo assíncrono. É uma biblioteca open source que faz todo o processo de um pedido.

Os métodos utilizados no excerto de código2.5, são utilizados sempre que for realizado um pedido HTTP. O facto de estarem implementados no objeto Singleton, permite que não seja necessário distribuir por todas as classes que realizem um pedido. Este no código2.4, consiste em três períodos distintos. A inicialização (linha 2), em que são inseridos os dados e o URL de destino. Neste caso todos os URLs necessários estão guardados num array de Strings. De seguida é realizado o pedido através da biblioteca JSON (linha 10). Por fim, quando o utilizador receber a resposta, é encerrada a ligação (linha 20).



1

2 public void finishIt() {

3 if (!utils.destA.equals("")) { 4

32 Capítulo 2. MyNetTaxi 6

7 utils.initRequest(3, Taxi_call_resume.this); 8 utils.json.addParameter("accu", "" + 0);

9 utils.json.addParameter("pos_x", "" + utils.sourceX); 10 utils.json.addParameter("pos_y", "" + utils.sourceY); 11 int idC = utils.getSP().getInt("id_user", -1);

12 utils.json.addParameter("id_cli", "" + idC); 13 utils.json.addParameter("address", utils.sourceA); 14 utils.json.addParameter("accuD", "" + 0);

15 utils.json.addParameter("pos_xD", "" + utils.destX); 16 utils.json.addParameter("pos_yD", "" + utils.destY); 17 utils.json.addParameter("addressD", utils.destA); 18 utils.json.addParameter("distance", "" + km); 19 utils.json.addParameter("cost", "" + custo); 20 utils.json.addParameter("numlug", "" + seats); 21 utils.json.addParameter("obs",utils.obs); 22 if (utils.taxiId == -1) {

23 utils.json.addParameter("idDriver", "");

24 }

25 else utils.json.addParameter("idDriver", "" + utils.taxiId); 26 utils.startRequest();

27 }

28 }

 

Bloco de Código 2.5: Pedido HTTP na classe para criar uma viagem

O bloco de código2.5, é a parte do código da classe que faz o pedido para uma nova viagem.É na linha 7 que o pedido é inicializado, ao chamar um método da classe Singleton, este será explicado mais à frente. Depois desta são adicionados os vários parâmetros que compõem o corpo da mensagem, em que mais uma vez é a biblioteca JSON que estrutura a mensagem. Finalmente na linha 26, é iniciado o pedido.

O servidor envia a resposta e esta tem que ser guardada. O excerto2.6consiste no tratamento da mesma, na linha 1 é o método que iniciar esse processo. Neste caso o servidor retribuiu o Id da viagem, mais uma vez é guardado numa variável do objeto Singleton, na linha 12 é guardada essa variável. Caso tenha sido bem sucedido é encerrada a ligação na linha 13 e a aplicação avança para o próximo menu (linha 20).



1 public void onTaskCompleted(JSONArray jo, String url) { 2 if(url.equals(utils.URLs[2])) {

3

4 for (int i = 0; i < jo.length(); i++) { 5

6 int tempv = 0;

7 JSONObject json_data;

8 try {

9 json_data = jo.getJSONObject(i); 10 tempv = json_data.getInt("id"); 11 if (tempv > 0) {

2.3. App Cliente 33 12 utils.getSP().edit().putLong("id_req", tempv).commit();

13 utils.closeRequest(0); 14 if (!utils.destA.equals("")) 15 utils.hasDest = 1; 16 else 17 utils.hasDest = 0; 18

19 Intent a = new Intent(Taxi_call_resume.this, Main_Trip.class); 20 startActivity(a); 21 22 } 23 } catch (JSONException e) { 24 utils.closeRequest(0); 25 e.printStackTrace(); 26 break; 27 } 28 } 29 30 }  

Bloco de Código 2.6: Tratamento da resposta do pedido HTTP na classe para criar uma viagem

Quando um utilizador novo se regista, ele introduz os dados e uma password. Por questões de segurança a palavra-passe não pode ser enviada nem armazenada em texto simples, caso contrário qualquer atacante à base de dados ou que esteja a escutar a ligação, tem acesso aos dados de login do utilizador. A password tem que ser cifrada antes de enviar, para isso é utilizada a biblioteca BCrypt, esta permite cifrar usando a cifra de blocos Blowfish em conjunto com um SALT, que adiciona um numero aleatório à cifra. Primeiro é gerado o SALT, posteriormente a password é cifrada em conjunto com o mesmo, é o resultado da cifra que é enviado para a base de dados.

Esta aplicação recebe mensagens GCM, por conseguinte foi necessário implementar o serviço, de modo a fazer o registo e receber as mensagens. Para a implementação deste serviço é necessário utilizar as bibliotecas oferecidas, que tratam do processo do registo e também ajudam ao tratamento das mensagens. Durante o login é feito o registo GCM, a biblioteca faz a ligação ao servidor GCM e retribui o Id atribuído ao cliente, este é guardado numa variável do objeto Singleton. O método para receber e fazer o encaminhamento das mensagens também está implementado na classe Singleton.

As mensagens recebidas são bastante simples, contêm o ID do pedido e o estado da viagem. Não é necessário mais informações, o que torna a leitura fácil. Na imagem2.11está esquematizado as mensagens GCM que o utilizador recebe durante uma viagem, os números das ligações são os estados. O estado da viagem é um dos números representados no esquema. Por exemplo, o estado 11 é quando o táxi chega ao cliente. Este mapa pode ser encaixado no esquema 2.10, as ligações de cor azul são todas as ligações na imagem 2.11, ou seja são as mensagens enviadas pelo servidor.

34 Capítulo 2. MyNetTaxi

Figura 2.11: Estados recebidos pela aplicação e enviados pelo servidor

Como foi explicado anteriormente, o objeto Singleton recebe a mensagem e encaminha para a classe competente. Esta tem que verificar o valor do estado e correr os métodos necessários para mostrar na aplicação o evento seguinte. No bloco de código 2.7, encontram-se dois excertos de como é realizado o processo. Na linha 2, é realizado o tratamento para quando recebe um estado a indicar que o motorista se atrasou. Neste caso além da mensagem, é enviado o número de minutos a acrescentar ao tempo atual e é atualizado o valor que aparece no ecrã. Se a mensagem recebida for um 11, significa que o táxi chegou ao cliente, na linha 15 é realizado o tratamento desse estado. Neste caso, envia para uma nova view e fica a aguardar a mensagem que chegou ao final da viagem.  1 2 if(id.equals("12")){ 3 4 timeDist+=Integer.parseInt(split[1]); 5 displayCalc(timeDist*60);

6 runOnUiThread(new Runnable() {

7 @Override

8 public void run() {

9 timeM.setTextColor(getResources().getColor(R.color.red)); 10 } 11 }); 12 } 13 14 if(id.equals("11")){ 15 16 stopClock();

2.4. Conclusão 35

No documento Plataformas online para clientes de táxis (páginas 50-55)

Documentos relacionados