DCC052 - Trabalho Prático


Introdução

O objetivo deste projeto é desenvolver uma pequena aplicação que ajude o usuário a procurar por imóveis a venda. O cenário típico de uso será o seguinte: o usuário está caminhando, ou dirigindo, por vias públicas, e vê um anúncio de venda de um imóvel que julgue interessante. Esse usuário saca seu telefone, e nossa aplicação lhe permite gravar os principais dados do imóvel. Em particular, podemos gravar o telefone de contato do vendedor, e salvar o endereço daquele ponto geográfico em que se encontra o usuário.

Um dos objetivos desse trabalho é também exercitar o desenvolvimento gradual de um projeto pequeno. Para tanto, o trabalho está dividido em cinco partes, e cada uma dessas partes acrescenta alguma funcionalidade extra sobre a parte anterior. Algumas dessas partes simulam mudanças na especificação de requisitos do sistema. Essas partes são úteis para que o aluno possa exercitar formas de estender módulos implementados na linguagem Java.

Obtendo ajuda para desenvolver em Android

Android é um ambiente de execução para computadores móveis que inclui um sistema operacional, um middleware e uma biblioteca de programação. O sistema Android é mantido por um consórcio internacional que inclui várias empresas muito grandes: o Open Handset Alliance. Embora seja possível desenvolver aplicações para Android em linguagens tais como C++, nossos programas serão desenvolvidos em Java.

A melhor, e mais rápida, maneira de se aprender a programar para Android é via os tutoriais disponíveis na página da plataforma. Em particular, recomenda-se o primeiro e mais básico tutorial: o Hello, World!. Recomenda-se também que o estudante estude o tutorial sobre o bloco de notas desenvolvido em Android.

Data de entrega e forma de avaliação

Esse projeto consiste em duas entregas. A primeira entrega deverá ser feita até a meia-noite do dia 19 de Agosto de 2012. Essa primeira entrega deverá conter pelo menos a primeira parte do trabalho. Essa entrega vale 20.0 pontos. A segunda entrega deverá ser feita até o dia 9 de Setembro de 2012. Essa segunda entrega deverá conter todo o trabalho. A segunda entrega vale 80.0 pontos.

Entrega parcial: é possível que o grupo não termine o trabalho completamente, mas consiga implementar um subconjunto de suas partes. Cada parte implementada e entregue até a data final confere ao estudante 20.0 pontos. Assim, se um grupo não entregar a primeira parte até o dia 19 de Agosto, mas entregar o trabalho até a parte 4 no dia 9 de Setembro, esse grupo perderá 20.0 pontos devido à primeira entrega, e mais vinte pontos devido à última.

Liberação da solução: Como as demais partes do trabalho dependem da primeira parte, esta será liberada para consulta a partir do dia 20 de Agosto.

Como entregar o projeto

Aplicações Android possuem um ponto de entrada chamado atividade. Essa aplicação deverá ter uma atividade principal chamada MoreAquiXActivity, sendo X o número referente à maior parte do trabalho implementada.

Plataforma de desenvolvimento: O projeto deve ser desenvolvido em eclipse. A fim de treinar boas práticas de programação, cada grupo deve usar o padronizador de código checkstyle, que possui um plug-in em Eclipse.

Submetendo o projeto: o projeto deve ser enviado via e-mail, como um arquivo zip anexo. O e-mail deve ser enviado para pronesto@gmail.com. Cada e-mail de entrega deve conter o seguinte assunto: [DCC052]:[Num]:[XXXXXXXXX_YYYYYYYY], sendo NUM o número da entrega, se 1 (primeira) ou 2 (segunda), e XXXXXXXXX_YYYYYYYY os nomes da dupla de alunos. Por exemplo [DCC052]:[2]:[Joao_Ernesto]. Não envie documentação escrita junto à entrega. A única documentação esperada são os comentários no código, os quais devem seguir o estilo sugerido pelo Checkstyle. Para criar o arquivo zip, siga as instruções abaixo no Eclipse:

  1. Clique em File
  2. Clique em Export
  3. Escolha General
  4. Escolha File Archive
  5. Escreva o seguinte nome de arquivo: hw(number)_(studentName1)_(studentName2).zip. For instance: hw1_Joao_Ernesto.zip.
  6. Escolha Save in ZIP format.
  7. Escolha Create directory structure.
  8. Clique OK.

Grupo de trabalho.

Esse trabalho pode ser feito individualmente ou em dupla. Caso alunos optem por realizar o trabalho em dupla, o nome da dupla deve constar já na primeira entrega, a qual dar-se-á até a meia-noite do dia 19 de Agosto. É necessária somente uma entrega por dupla.

Sobre plágio: não serão aceitos trabalhos similares. Havendo a suspeita de plágio, todos os alunos envolvidos serão expulsos do curso de extensão Introdução à Plataforma Android, e não receberão certificado de participação. Todo aluno que enviar um trabalho para correção se compromete a ser seu único autor, salvo o segundo membro da dupla, quando houver. Discussões entre alunos são permitidas e encorajadas, porém toda idéia de terceiros aplicada no códico deve vir comentada no próprio código.

O que fazer.

Conforme dito anteriormente, esse projeto consiste em uma aplicação que ajuda o usuário a cadastrar imóveis que ele encontra enquanto caminha pelas vias públicas de sua cidade. O projeto está dividido em cinco partes. Cada parte descreve uma funcionalidade nova. Tendo implementado a quinta parte, o grupo terá uma aplicação Android relativamente complexa, e bastante útil para quem procura imóveis. As cinco partes estão divididas da seguinte maneira:

  1. Parte 1: cria a interface gráfica principal da aplicação, e cria a atividade para cadastrar imóveis novos.
  2. Parte 2: armazena os dados castrados em um banco de dados persistente.
  3. Parte 3: envia as informações cadastradas para um servidor remoto.
  4. Parte 4: lê as coordenadas geográficas do anúncio visto, e armazena essas coordenadas. Algumas partes do código já feito deverão ser alteradas para simular uma mudança de especificação de requisitos.
  5. Parte 5: exibe os endereços de imóveis cadastrados em um mapa.

As relaçoes de dependêcias entre as cinco partes estão esquematizadas na figura abaixo. Note que é possível implementar as partes 4 e 5 do trabalho sem implementar antes a sua terceira parte. Dessa forma, caso o trabalho seja realizado em dupla, cada membro do time pode concentrar-se em uma dessas tarefas, e tendo terminado a sua parte, passar à revisão do código do companheiro.

Homework 1

Primeira parte

O objetivo dessa primeira parte do projeto é definir o layout principal de nossa aplicação, e criar o layout de cadastro de novos imóveis. A principal estrutura de dados que nossa aplicação manipula são imóveis. Eu preparei uma classe Estate que representa um imóvel. Objetos da classe Estate são imutáveis. Isso quer dizer que uma vez tendo sido criados, seus campos não podem mais ser modificados. Há várias vantagens em se trabalhar com objetos imutáveis. A principal delas é que Java permite que duas referências apontem para o mesmo objeto. Alterações via uma delas podem gerar efeitos colaterais no objeto apontado pela outra. Sendo os objetos imutáveis, esse problema não ocorre mais.

As seguintes tarefas deverão ser realizadas nesta parte do projeto:

Homework 1 Crie uma atividade principal para a aplicação, contendo os três botões vistos ao lado: Novo, Procurar e Mapa. Clique na imagem para ver uma versão maior.
Homework 1 Crie um gerenciador de eventos de toque, isto é, um OnClickListener, que trate eventos sobre o botão Novo.
Homework 1 Crie uma atividade InsertActivity que receba os dados de um imóvel novo. Essa atividade deverá possuir as funcionalidades representadas na figura ao lado.
Homework 1 Por hora assumiremos que os números de telefone são inteiros. Você precisa tratar a situação em que um número inválido é fornecido pelo usuário. Por exemplo, em nossa solução, uma mensagem de alerta é utilizada para indicar ao usuário que o número de telefone não é um inteiro válido.
Homework 1 Sempre que um número válido for inserido, imprima o objeto criado no log do Android. para isso, use a chamada Log.v("New", e.toString()), sendo e a instância da classe Estate que acabou de ser criada. Note que o usuário da aplicação não enxerga o log; ele somente é útil para o desenvolvedor. Para avisar o usuário que o novo dado foi inserido com sucesso, utilize uma caixa de alerta.

Internacionalização: hoje é muito comum que programas desenvolvidos em uma língua acabem tendo de ser portados para outra. A sua aplicação deve permitir fácil internacionalização. O segredo para isso, no mundo Android, é definir todos os textos que são mostrados para o usuário em um arquivo Strings.xml. Assim, trocando-se o arquivo pode-se utilizar texto em uma língua diferente. Todos os textos que são visíveis, isto é, que podem aparecer em uma tela gráfica de sua aplicação deverão ser definidos nesse arquivo. Isso inclui os textos usados para fornecer mensagens de erro.


Segunda Parte

Nessa segunda parte do trabalho prático os dados cadastrados deverão ser inseridos em um banco de dados persistente. O banco de dados que utilizaremos será o SQLite.

Homework 1 Crie uma class EstatesData que estenda a classe SQLiteOpenHelper. Essa última classe possui vários métodos para lidar com um banco de dados SQLite. O seu banco de dados deverá ter as seguintes colunas: ID, TYPE (o tipo do imóvel, ex. casa, loja, etc), SIZE (o tamanho do imóvel, ex., pequeno, médio, etc), STATUS (se o imóvel está pronto, em construção, possui moradores, etc) e PHONE, o contato do vendedor.
Homework 1 Modifique sua atividade InsertActivity para utilizar um banco de dados. Sempre que um imóvel válido for cadastrado, esse imóvel deverá ser inserido nesse banco de dados, em vez de ser impresso no log do Eclipse.
Homework 1 Mude o nome do botão Procurar para Visualizar. Crie um gerenciador de eventos para lidar com o botão Visualizar na atividade principal. Esse botão deverá abrir uma nova atividade que exiba as informações cadastradas no banco de dados.
Homework 1 Crie uma atividade ShowActivity, que estenda a classe ListActivity. Essa atividade, disparada pelo botão Visualizar da atividade principal implementa uma lista, a qual é alimentada com os dados cadastrados em nosso banco de dados.
Homework 1 Note que a interface da atividade ShowActivity não possui um botão para voltar para a atividade principal. Contudo, é suficiente terminar a atividade com o botão voltar do aparelho móvel. Atividades são alocadas em uma pilha. Ao retornarmos de uma atividade A, chegamos à atividade anterior que criou A.

Terceira parte

O objetivo da terceira parte do trabalho prático é salvar os dados armazenados no aparelho móvel em um servidor remoto. Para tanto, foi implementado um servidor que o aluno pode usar. Esse servidor recebe objetos serializáveis, e os imprime na tela. O código do servidor está disponível nesse arquivo compactado. Outras informações sobre o servidor estão disponíveis em sua página javadoc.

Homework 1 Para executar o servidor, use o comando java -cp ".:/path-to-Estate.class/" server.ServerMainThread, sendo path-to-Estate.class/ o caminho em que está o binário da classe Estate. Esse caminho é necessário porque o servidor deverá receber objetos desse tipo. Ao fornecer o caminho para o objeto serializado, você faz com que não seja necessário que o binário exista no diretório em que está o servidor.
Homework 1 Adicione o botão Gravar ao layout da sua atividade principal.
Homework 1 Associe um evento ao botão Gravar que envie os dados armazenados localmente no aparelho móvel para o servidor remoto. Note que a implementação do servidor já disponibiliza algumas funcionalidades para a criação de clientes. Em particular, você pode usar as interfaces DAO e Command.
Homework 1 Ao conectar-se ao servidor sua aplicação deverá enviar cada um dos dados armazenados no banco de dados para ele. Não é necessário remover esses dados do aparelho móvel. Se você fizer somente uma conexão com o servidor remoto, e por essa conexão enviar todos os dados, sua aplicação deverá ser mais eficiente. Essa eficiência, contudo, não é um requerimento desse trabalho.
Homework 1 Note que ao receber as suas informações, o servidor irá imprimir cada objeto recebido em sua saída padrão. Inclusive o servidor mostra quantos objetos já foram recebidos. Experimente enviar os mesmos objetos várias vezes. Será que esses objetos estão sendo armazenados múltiplas vezes no servidor?

Importante: nessa parte do trabalho é vital que você feche a conexão com o servidor quando dela não mais precisar. Note que o Invoker disponível junto ao servidor garante esse tipo de contrato.


Quarta Parte

O objetivo da quarta parte do projeto é ler as coordenadas geográficas do imóvel que está sendo cadastrado. Note que em nenhum momento do projeto - até aqui - endereços físicos dos imóveis cadastrados foram considerados. Contudo, Android oferece ao desenvolver uma API para manipulação de dados de geolocalização. É nossa intenção que os endereços dos imóveis cadastrados possam ser obtidos sem a intervenção do usuário da aplicação.

Um segundo objetivo dessa parte do trabalho, de cunho mais pedagógico, é lidar com mudanças de requisitos durante o desenvolvimento de uma aplicação. A aplicação até aqui foi desenvolvida sem o conceito de localização. Esse deve ser adicionado a ela. Espera-se que essa alteração possa ser feita de forma suave e segura.

Homework 1 Estenda a classe Estate para que ela possua ciência de localização. Não modifique diretamente o código fonte de Estate: isso não é reúso de software. O reúso genuíno consiste em reutilizar módulos sem que o acesso ao código fonte desses módulos faça-se necessário. Existem duas formas básicas de reúso de software: a herança e a agragação. Para esse trabalho espera-se que o aluno seja capaz de reutilizar a classe Estate via o mecanismo de herança.
Homework 1 Modifique a atividade que insere novos imóveis no banco de dados (InsertActivity) para que ela guarde as coordenadas do evento em que ocorreu o cadastro. Para confirmar que as coordenadas estão sendo capturadas corretamente, modifique essa atividade, para que ela imprima os dados cadastrados no log do Android.
Homework 1 É possível testar a atividade com localizações diferentes. Para tanto, é necessário que a atividade em foco seja capaz de escutar e atualizar eventos de localização. Em outras palavras, essa atividade precisa ser um LocationListener. Isso não é necessário para esse trabalho, mas pode ser feito. Para enviar coordenadas diferentes para a aplicação o Eclipse disponibiliza um menu que simula alguns dos sensores do aparelho móvel.
Homework 1 O banco de dados da nova aplicação difere do banco de dados implementado nessa última parte do trabalho. Lembre-se de modificá-lo, para que as coordenadas do imóvel possam ser convenientemente armazenadas.

Quinta Parte

O objetivo dessa última parte do trabalho é exibir em um mapa os endereços das coordenadas cadastradas. Para tanto, deverá ser criada uma atividade ShowAddressesActivity que implemente uma MapActivity.

Homework 1 Utilize o marcador ao lado para apontar as coordenadas de cada imóvel.
Homework 1 Lembre-se de indicar em seu manifesto que a aplicação estará usando a biblioteca de mapas do Google.
Homework 1 Crie a atividade ShowAddressesActivity que implemente uma MapActivity. Essa atividade precisa definir uma sobrecamada (Overlay) que renderiza marcadores sobre o mapa, sendo as coordenadas de cada marcador definidas por cada imóvel cadastrado. Inicialmente o mapa deve ser centralizado nas coordenadas do primeiro imóvel cadastrado.
Homework 1 Adicione um botão de zoom à atividade ShowAddressesActivity, de forma tal que o usuário possa observar em maiores detalhes o endereço do imóvel cadastrado.