public OsmBugsUtil getOsmbugsUtil(OpenStreetNote bug) { OsmandSettings settings = ((OsmandApplication) activity.getApplication()).getSettings(); if ((bug != null && bug.isLocal()) || settings.OFFLINE_EDITION.get() || !settings.isInternetConnectionAvailable(true)) { return local; } else { return remote; } }
@Override public void onPrepareBufferImage(Canvas canvas, RotatedTileBox tileBox, DrawSettings settings) { if (tileBox.getZoom() >= startZoom) { // request to load data.queryNewData(tileBox); List<OpenStreetNote> objects = data.getResults(); if (objects != null) { for (OpenStreetNote o : objects) { int x = tileBox.getPixXFromLonNoRot(o.getLongitude()); int y = tileBox.getPixYFromLatNoRot(o.getLatitude()); canvas.drawCircle( x, y, getRadiusBug(tileBox), o.isLocal() ? pointNotSubmitedUI : (o.isOpened() ? pointOpenedUI : pointClosedUI)); } } } }
@Override public boolean onSingleTap(PointF point, RotatedTileBox tileBox) { ArrayList<OpenStreetNote> list = new ArrayList<OpenStreetNote>(); getBugFromPoint(tileBox, point, list); if (!list.isEmpty()) { StringBuilder res = new StringBuilder(); int i = 0; for (OpenStreetNote o : list) { if (i++ > 0) { res.append("\n\n"); } res.append( activity.getString(R.string.osb_bug_name) + " : " + o.getCommentDescription()); // $NON-NLS-1$ } AccessibleToast.makeText(activity, res.toString(), Toast.LENGTH_LONG).show(); return true; } return false; }
public void getBugFromPoint(RotatedTileBox tb, PointF point, List<? super OpenStreetNote> res) { List<OpenStreetNote> objects = data.getResults(); if (objects != null && view != null) { int ex = (int) point.x; int ey = (int) point.y; final int rad = getRadiusBug(tb); int radius = rad * 3 / 2; int small = rad * 3 / 4; try { for (int i = 0; i < objects.size(); i++) { OpenStreetNote n = objects.get(i); int x = (int) tb.getPixXFromLatLon(n.getLatitude(), n.getLongitude()); int y = (int) tb.getPixYFromLatLon(n.getLatitude(), n.getLongitude()); if (Math.abs(x - ex) <= radius && Math.abs(y - ey) <= radius) { radius = small; res.add(n); } } } catch (IndexOutOfBoundsException e) { // that's really rare case, but is much efficient than introduce synchronized block } } }
protected List<OpenStreetNote> loadingBugs( double topLatitude, double leftLongitude, double bottomLatitude, double rightLongitude) { final int deviceApiVersion = android.os.Build.VERSION.SDK_INT; String SITE_API; if (deviceApiVersion >= android.os.Build.VERSION_CODES.GINGERBREAD) { SITE_API = "https://api.openstreetmap.org/"; } else { SITE_API = "http://api.openstreetmap.org/"; } List<OpenStreetNote> bugs = new ArrayList<OpenStreetNote>(); StringBuilder b = new StringBuilder(); b.append(SITE_API + "api/0.6/notes?bbox="); // $NON-NLS-1$ b.append(leftLongitude); // $NON-NLS-1$ b.append(",").append(bottomLatitude); // $NON-NLS-1$ b.append(",").append(rightLongitude); // $NON-NLS-1$ b.append(",").append(topLatitude); // $NON-NLS-1$ try { log.info("Loading bugs " + b); // $NON-NLS-1$ URLConnection connection = NetworkUtils.getHttpURLConnection(b.toString()); BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); XmlPullParser parser = Xml.newPullParser(); parser.setInput(reader); int tok; OpenStreetNote current = null; int commentIndex = 0; while ((tok = parser.next()) != XmlPullParser.END_DOCUMENT) { if (tok == XmlPullParser.START_TAG) { if (parser.getName().equals("note")) { current = new OpenStreetNote(); commentIndex = -1; current.setLongitude(Double.parseDouble(parser.getAttributeValue("", "lon"))); current.setLatitude(Double.parseDouble(parser.getAttributeValue("", "lat"))); current.setOpened(true); bugs.add(current); } else if (parser.getName().equals("status") && current != null) { current.setOpened("open".equals(readText(parser, "status"))); } else if (parser.getName().equals("id") && current != null) { current.id = Long.parseLong(readText(parser, "id")); } else if (parser.getName().equals("comment")) { commentIndex++; } else if (parser.getName().equals("user") && current != null) { if (commentIndex == current.users.size()) { current.users.add(readText(parser, "user")); } } else if (parser.getName().equals("date") && current != null) { if (commentIndex == current.dates.size()) { current.dates.add(readText(parser, "date")); } } else if (parser.getName().equals("text") && current != null) { if (commentIndex == current.comments.size()) { current.comments.add(readText(parser, "text")); } } } } reader.close(); } catch (IOException e) { log.warn("Error loading bugs", e); // $NON-NLS-1$ } catch (NumberFormatException e) { log.warn("Error loading bugs", e); // $NON-NLS-1$ } catch (RuntimeException e) { log.warn("Error loading bugs", e); // $NON-NLS-1$ } catch (XmlPullParserException e) { log.warn("Error loading bugs", e); // $NON-NLS-1$ } for (OsmNotesPoint p : local.getOsmbugsPoints()) { if (p.getId() < 0) { OpenStreetNote bug = new OpenStreetNote(); bug.setId(p.getId()); bug.setLongitude(p.getLongitude()); bug.setLatitude(p.getLatitude()); bug.dates.add(""); bug.users.add(activity.getMyApplication().getSettings().USER_NAME.get()); bug.comments.add(p.getText()); bug.setOpened(p.getAction() == Action.CREATE || p.getAction() == Action.MODIFY); bug.setLocal(true); bugs.add(bug); } } return bugs; }