1
0
Fork 0
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Pharmacies/src/org/r3pek/pharmacies/PharmaciesOverlay.java

166 lines
6.2 KiB

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<OverlayItem> {
private Context ctx;
private MapView mapView;
private View shownView;
private SensorManager sm;
private ImageRotater cRotator;
private Compass compass;
private LinkedList<Pharmacy> 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<Pharmacy>();
}
@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();
}
}