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.
166 lines
6.2 KiB
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();
|
|
}
|
|
|
|
}
|
|
|