package org.r3pek.pharmacies; import java.util.LinkedList; import org.r3pek.pharmacies.utils.GeoUtils; import org.r3pek.pharmacies.utils.GlobalVars; import org.r3pek.pharmacies.widgets.Compass; import org.r3pek.pharmacies.widgets.ImageRotater; import android.content.ActivityNotFoundException; import android.content.Context; import android.content.Intent; import android.graphics.drawable.Drawable; import android.hardware.Sensor; import android.hardware.SensorManager; import android.net.Uri; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import com.google.android.maps.GeoPoint; import com.google.android.maps.ItemizedOverlay; import com.google.android.maps.MapView; import com.google.android.maps.OverlayItem; import com.google.android.maps.MapView.LayoutParams; public class PharmaciesOverlay extends ItemizedOverlay { private Context ctx; private MapView mapView; private View shownView; private SensorManager sm; private ImageRotater cRotator; private Compass compass; private LinkedList pharmacies; public PharmaciesOverlay(Drawable defaultMarker, Context ctx, MapView mapView) { super(boundCenterBottom(defaultMarker)); this.ctx = ctx; this.mapView = mapView; shownView = null; populate(); sm = (SensorManager)ctx.getSystemService(Context.SENSOR_SERVICE); cRotator = new ImageRotater(); pharmacies = new LinkedList(); } @Override protected synchronized OverlayItem createItem(int i) { Pharmacy p = pharmacies.get(i); OverlayItem result = new OverlayItem(p.getGeoPoint(), p.getName(), ""); if (p.isAtService()) result.setMarker(boundCenterBottom(ctx.getResources().getDrawable(R.drawable.pin_on))); return result; } @Override public synchronized int size() { if (pharmacies == null) return 0; return pharmacies.size(); } @Override protected boolean onTap(final int i) { if (mapView.getChildCount() > 0) return true; LayoutInflater inflater = (LayoutInflater)ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE); LinearLayout ll = (LinearLayout)inflater.inflate(R.layout.pharmacy_balloon, null); final Pharmacy pharm = GlobalVars.getPharmacies().get(i); LayoutParams lp = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, pharm.getGeoPoint(), 0, -70, LayoutParams.MODE_MAP | LayoutParams.CENTER); TextView tvName = (TextView)ll.findViewById(R.id.tvBalloonName); TextView tvDistance = (TextView)ll.findViewById(R.id.tvDistance); ImageView ivStatus = (ImageView)ll.findViewById(R.id.ivStatus); Button btnDetalhes = (Button)ll.findViewById(R.id.btnBalloonDetalhes); Button btnTelef = (Button)ll.findViewById(R.id.btnBalloonTelef); Button btnNav = (Button)ll.findViewById(R.id.btnBalloonNav); compass = (Compass)ll.findViewById(R.id.compass); btnTelef.setEnabled(!pharm.getPhoneNumber().equals("")); compass.setBearing(GeoUtils.bearing(GlobalVars.positioner.getLastGeoPoint(), pharm.getGeoPoint())); compass.setOrientation(cRotator.getLastOrientation()); sm.registerListener(cRotator, sm.getDefaultSensor(Sensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_NORMAL); cRotator.addImage(compass); tvName.setText(pharm.getName()); tvDistance.setText(pharm.getDistance().substring(0, pharm.getDistance().indexOf(".")) + "m"); ivStatus.setBackgroundResource(pharm.isAtService() ? R.drawable.status_on : R.drawable.status_off); btnDetalhes.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent pharmInfo = new Intent(ctx, PharmacyInfo.class); pharmInfo.putExtra("org.r3pek.pharmacies.Pharmacy", pharm); pharmInfo.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); ctx.startActivity(pharmInfo); } }); btnTelef.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + pharm.getPhoneNumber())); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); ctx.startActivity(intent); } }); btnNav.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { StringBuilder url = new StringBuilder(); url.append("http://maps.google.com/maps?f=d&hl=en"); url.append("&saddr="); url.append( Double.toString((double)GlobalVars.positioner.getLastGeoPoint().getLatitudeE6()/1.0E6 )); url.append(","); url.append( Double.toString((double)GlobalVars.positioner.getLastGeoPoint().getLongitudeE6()/1.0E6 )); url.append("&daddr="); url.append( Double.toString((double)pharm.getGeoPoint().getLatitudeE6()/1.0E6 )); url.append(","); url.append( Double.toString((double)pharm.getGeoPoint().getLongitudeE6()/1.0E6 )); url.append("&dirflg=d&nav=1"); Intent intent = new Intent(Intent.ACTION_VIEW); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setData(Uri.parse(url.toString())); intent.addFlags(0x10800000); intent.setClassName("com.google.android.apps.m4ps", "com.google.android.maps.driveabout.app.NavigationActivity"); try { ctx.startActivity(intent); } catch (ActivityNotFoundException e) { intent.setClassName("com.google.android.apps.maps", "com.google.android.maps.driveabout.app.NavigationActivity"); try { ctx.startActivity(intent); } catch (ActivityNotFoundException e2) { } } } }); shownView = ll; mapView.addView(ll, lp); mapView.getController().animateTo(pharm.getGeoPoint()); return super.onTap(i); } public void removeBallon() { cRotator.delImage(compass); sm.unregisterListener(cRotator); mapView.removeView(shownView); } @Override public boolean onTap(GeoPoint p, MapView map) { removeBallon(); return super.onTap(p, map); } public synchronized void refresh() { pharmacies.clear(); for (Pharmacy p : GlobalVars.getPharmacies()) pharmacies.add(p); populate(); } }