MainActivity:
[code]package br.empresa.android.unidadesfooter.mapa;
import java.util.List;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TableLayout;
import android.widget.TextView;
import br.mindset.android.unidadesfooter.R;
import br.mindset.android.unidadesfooter.global.Global;
import br.mindset.android.unidadesfooter.webservice.CallRestClient;
import br.mindset.android.unidadesfooter.webservice.model.Unidade;
import br.mindset.android.unidadesfooter.webservice.parser.Parser;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.MyLocationOverlay;
public class MainActivity extends MapActivity implements LocationListener, OnClickListener {
// Atributos de mapa
private MapView mapa;
private MapController controlador;
private MyLocationOverlay ondeEstou;
// Atributos para o Dialog
private ProgressDialog dialog;
private Handler handler = new Handler();
// Codigo de operadora
private String operadora = “041”;
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
Log.i("map", "[MainActivity].onCreate().");
setContentView(R.layout.mapview);
// Inicializa estruturas da tela
Log.i("map", "[MainActivity].onCreate() -> Inicializa estruturas.");
mapa = (MapView) findViewById(R.id.mapMapa);
Global.TBL_TABELA = (TableLayout) findViewById(R.id.tblTable);
Global.IMG_UNIDADE = (ImageView) findViewById(R.id.imgFlag);
Global.TXT_NOME = (TextView) findViewById(R.id.txtShortname);
Global.TXT_ENDERECO = (TextView) findViewById(R.id.txtAddress);
Global.TXT_FONE = (TextView) findViewById(R.id.txtPhone);
Global.BTN_LIGAR = (Button) findViewById(R.id.btnLigar);
Global.BTN_OCULTAR = (Button) findViewById(R.id.btnOcultar);
// Eventos de botao
Global.BTN_LIGAR.setOnClickListener(this);
Global.BTN_OCULTAR.setOnClickListener(this);
// Abre a janela com a barra de progresso
Log.i("map", "[MainActivity].onCreate() -> Abre Progress Dialog.");
dialog = ProgressDialog.show(this, "Carregando", "Processando unidades, por favor aguarde...", false, true);
processaUnidades();
// Centraliza o mapa na ultima localizacao conhecida
controlador = mapa.getController();
Location loc = getLocationManager().getLastKnownLocation(LocationManager.GPS_PROVIDER);
// Se existe ultima localizacao converte para GeoPoint
if (loc != null) {
GeoPoint ponto = new Coordenada(loc);
Log.i("map", "[MainActivity] Ultima localizacao: " + ponto);
controlador.setCenter(ponto);
}
ondeEstou = new MyLocationOverlay(this, mapa);
ondeEstou.runOnFirstFix(new Runnable() {
public void run() {
Log.i("map", "[MainActivity] MyOverlay runOnFirstFix: " + ondeEstou.getMyLocation());
}
});
// Adiciona overlays na tela, atualiza ultima posicao, seta zoom para 10 e ativa controla de zoom na tela
Log.i("map", "[MainActivity].onCreate() -> Adiciona Overlays na tela.");
mapa.getOverlays().add(ondeEstou);
getLocationManager().requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
controlador.setZoom(10);
mapa.setBuiltInZoomControls(true);
}
// Adicionar todos os Overlays na tela
private void processaUnidades() {
new Thread() {
@Override
public void run() {
Log.i("map", "[MainActivity].processaUnidades() -> Realiza carregamento de dados.");
// Faz processamento (passa ao mapa a coordenada de todas as unidades da WiseUp e YouMove)
CallRestClient webservice = new CallRestClient();
String retornoWebservice = webservice.callRestClient();
List<Unidade> listaUnidades = Parser.decodificaUnidades(retornoWebservice);
for (Unidade u : listaUnidades) {
ImagemOverlay imagem = new ImagemOverlay(new Coordenada(u.getLatitude(), u.getLongitude()), R.drawable.ponto,
u.getShortname(), u.getAddress(), u.getPhone(), u.getFlagname());
mapa.getOverlays().add(imagem);
}
// Atualiza a tela
carregaTela();
}
}.start();
}
// Utiliza um Handler para atualizar a tela
private void carregaTela() {
handler.post(new Runnable(){
public void run() {
// Fecha a janela de progresso
Log.i("map", "[MainActivity].carregaTela() -> Fecha Progress Dialog.");
dialog.dismiss();
}
});
}
@Override
public void onClick(View v) {
String telefone = Global.TXT_FONE.getText().toString();
// Se e botao de ligar
if (v == Global.BTN_LIGAR) {
Log.i("map", "[MainActivity].onClick().'BTN_LIGAR' -> Chamado para telefone " + operadora + telefone + ".");
Uri uri = Uri.parse("tel: " + operadora + telefone);
Intent it = new Intent(Intent.ACTION_CALL, uri);
Log.i("map", "[MainActivity].onClick().'BTN_LIGAR' -> Realizando ligacao.");
startActivity(it);
} else
// Se e botao de ocultar
if (v == Global.BTN_OCULTAR) {
Log.i("map", "[MainActivity].onClick().'BTN_OCULTAR'.");
Global.TBL_TABELA.setVisibility(View.GONE);
}
}
//===========================
//===== METODOS DE MENU =====
//===========================
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
Log.i("map", "[MainActivity].onCreateoptionsMenu().");
menu.add(0, 0, 0, "Hibrido");
menu.add(0, 1, 1, "Mapa");
menu.add(0, 2, 2, "Satelite");
return true;
}
@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
Log.i("map", "[MainActivity].onMenuItemSelected().");
// Clicou no menu
switch (item.getItemId()) {
case 0:
// Hibrido
mapa.setStreetView(false);
mapa.setSatellite(false);
mapa.setTraffic(true);
break;
case 1:
// Mapa
mapa.setStreetView(true);
mapa.setSatellite(false);
mapa.setTraffic(false);
break;
case 2:
// Satelite
mapa.setSatellite(true);
mapa.setStreetView(false);
mapa.setTraffic(false);
break;
}
return true;
}
private LocationManager getLocationManager() {
Log.i("map", "[MainActivity].getLocationManager().");
return (LocationManager) getSystemService(Context.LOCATION_SERVICE);
}
//==========================
//===== METODOS DE GPS =====
//==========================
public void onLocationChanged(Location location) {
Log.i("map", "[MainActivity].onLocationChanged: latitude: " + location.getLatitude() + ", longitude: " + location.getLongitude());
GeoPoint point = new Coordenada(location);
controlador.animateTo(point);
mapa.invalidate();
}
@Override
protected boolean isRouteDisplayed() {
return false;
}
public void onProviderDisabled(String provider) {}
public void onProviderEnabled(String provider) {}
public void onStatusChanged(String provider, int status, Bundle extras) {}
//====================================
//===== METODOS DE CICLO DE VIDA =====
//====================================
protected void onStart() {
super.onStart();
Log.i("map", "[MainActivity].onStart().");
}
protected void onRestart() {
super.onRestart();
Log.i("map", "[MainActivity].onRestart().");
}
protected void onStop() {
super.onStop();
Log.i("map", "[MainActivity].onStop().");
}
@Override
protected void onResume() {
super.onResume();
Log.i("map", "[MainActivity].onResume().");
// Registra o listener
ondeEstou.enableMyLocation();
// Omite estruturas da tela
Log.i("map", "[MainActivity].onResume() -> Omitindo estruturas da tela.");
Global.TBL_TABELA.setVisibility(View.GONE);
}
@Override
protected void onPause() {
super.onPause();
Log.i("map", "[MainActivity].onPause().");
// Remove o listener
ondeEstou.disableMyLocation();
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.i("map", "[MainActivity].onDestroy().");
// Remove o listener para nao ficar atualizando mesmo depois de sair
getLocationManager().removeUpdates(this);
}
}[/code]
ImagemOverlay:
package br.mindset.empresa.unidadesfooter.mapa;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.RectF;
import android.util.Log;
import android.view.View;
import br.mindset.android.unidadesfooter.R;
import br.mindset.android.unidadesfooter.global.Global;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
public class ImagemOverlay extends Overlay {
// Atributo para desenhar um Overlay no mapa; id da imagem do Overlay; coordenada atual do mapa
private Paint paint = new Paint();
private Integer imagemId;
private GeoPoint coordenada;
// Atributos com informacoes que serao mostradas no Toast quando o Overlay for clicado
private String nome;
private String endereco;
private String fone;
private String unidade;
// Atributos para montar o Overlay na tela
private Integer width;
private Integer height;
// Margem de erro (em pixels) em volta do ponto clicado a fim de determinar se clicamos nele
private Integer margin;
public ImagemOverlay(GeoPoint geoPoint, int resId, String nome, String endereco, String fone, String unidade) {
this.coordenada = geoPoint;
this.imagemId = resId;
this.nome = nome;
this.endereco = endereco;
this.fone = fone;
this.unidade = unidade;
}
@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow) {
super.draw(canvas, mapView, shadow);
// Converte as coordenadas para pixels
Point p = mapView.getProjection().toPixels(coordenada, null);
// Obtem as dimensoes da imagem, em pixels
Bitmap bitmap = BitmapFactory.decodeResource(mapView.getResources(), this.imagemId);
width = bitmap.getWidth();
height = bitmap.getHeight();
// Desenha uma moldura (retangulo) em volta da imagem
RectF r = new RectF(p.x, p.y, p.x + width, p.y + height);
canvas.drawBitmap(bitmap, null, r, paint);
}
@Override
public boolean onTap(GeoPoint geoPoint, MapView mapView) {
Point ponto = mapView.getProjection().toPixels(this.coordenada, null);
// Cria o retangulo que emoldurara o Overlay
margin = (int) Math.floor(height / 3);
RectF recf = new RectF(ponto.x - margin, ponto.y - margin, ponto.x + margin, ponto.y + margin);
// Converte para ponto em pixels
Point newPoint = mapView.getProjection().toPixels(geoPoint, null);
// Corrige coordenada do ponto clicado na tela
Integer centerWidth = (int) Math.floor(width / 2);
Integer centerHeight = (int) Math.floor(height / 2);
// Verifica se o ponto esta contido no retangulo
boolean ok = recf.contains(newPoint.x - centerWidth, newPoint.y - centerHeight);
if (ok) {
Log.v("map", "[ImagemOverlay] Clicou dentro da bandeira!");
// Habilita estruturas da tela
Log.i("map", "[ImagemOverlay].onTap() -> Habilita estruturas na tela.");
Global.TBL_TABELA.setVisibility(View.VISIBLE);
// Verifica se e Empresa1 ou Empresa2
if (this.unidade.equals("Empresa1")) {
Log.i("map", "[ImagemOverlay].onTap() -> Unidade pertence a Empresa1.");
Global.IMG_UNIDADE.setImageResource(R.drawable.empresa1);
} else if (this.unidade.equals("Empresa2")) {
Log.i("map", "[ImagemOverlay].onTap() -> Unidade pertence a Empresa2.");
Global.IMG_UNIDADE.setImageResource(R.drawable.empresa2);
}
// Habilita ou nao botao para realizar ligacao telefonica
if ("".equals(this.fone) || this.fone == null) {
Log.i("map", "[ImagemOverlay].onTap() -> Botao 'BTN_LIGAR' desabilitado.");
Global.BTN_LIGAR.setEnabled(false);
} else {
Log.i("map", "[ImagemOverlay].onTap() -> Botao 'BTN_LIGAR' habilitado.");
Global.BTN_LIGAR.setEnabled(true);
}
// Seta valores das variaveis TextView
Log.i("map", "[ImagemOverlay].onTap() -> Seta valores das variaveis TextView.");
Global.TXT_NOME.setText(this.nome);
Global.TXT_ENDERECO.setText(this.endereco);
Global.TXT_FONE.setText(phoneFormat(this.fone));
return true;
}
return super.onTap(geoPoint, mapView);
}
public static String phoneFormat(String text) {
Log.i("map", "[ImagemOverlay].phoneFormat().");
String saida = "";
char ch;
for (int i = 0; i < text.length(); i++) {
ch = text.charAt(i);
if (ch != ' ' && ch != '(' && ch != ')' && ch != '-') {
saida += ch;
}
}
return saida;
}
//====================================
//===== METODOS DE CICLO DE VIDA =====
//====================================
protected void onStart() {
Log.i("map", "[ImagemOverlay].onStart().");
}
protected void onRestart() {
Log.i("map", "[ImagemOverlay].onRestart().");
}
protected void onStop() {
Log.i("map", "[ImagemOverlay].onStop().");
}
protected void onResume() {
Log.i("map", "[ImagemOverlay].onResume().");
}
protected void onPause() {
Log.i("map", "[ImagemOverlay].onPause().");
}
protected void onDestroy() {
Log.i("map", "[ImagemOverlay].onDestroy().");
}
}