package de.blau.android; import java.io.Serializable; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.util.Log; import de.blau.android.exception.OsmException; import de.blau.android.osm.BoundingBox; /** * Start vespucci with JOSM style remote control url */ public class RemoteControlUrlActivity extends Activity { private static final String DEBUG_TAG = "RemoteControlUrlAct..."; public static final String RCDATA = "de.blau.android.RemoteControlActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override protected void onStart() { super.onStart(); Uri data = getIntent().getData(); if (data == null) { Log.d(DEBUG_TAG,"Called with null data, aborting"); finish(); return; } Log.d(DEBUG_TAG,data.toString()); Intent intent = new Intent(this, Main.class); intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP|Intent.FLAG_ACTIVITY_CLEAR_TOP); try { // extract command String command = data.getPath(); if ("josm".equals(data.getScheme())) { // extract command from scheme specific part command = data.getSchemeSpecificPart(); if (command != null) { int q = command.indexOf('?'); if (q > 0) { command = command.substring(0, q); } } } if (command != null && command.startsWith("/")) { // remove any command = command.substring(1); } Log.d(DEBUG_TAG,"Command: " + command); Log.d(DEBUG_TAG,"Query: " + data.getQuery()); boolean loadAndZoom = "load_and_zoom".equals(command); if (loadAndZoom || "zoom".equals(command)) { try { RemoteControlUrlData rcData = new RemoteControlUrlData(); rcData.setLoad(loadAndZoom); String leftParam = data.getQueryParameter("left"); String rightParam = data.getQueryParameter("right"); String bottomParam = data.getQueryParameter("bottom"); String topParam = data.getQueryParameter("top"); if (leftParam != null && rightParam != null && bottomParam != null && topParam != null) { try { Double left = Double.valueOf(leftParam); Double right = Double.valueOf(rightParam); Double bottom = Double.valueOf(bottomParam); Double top = Double.valueOf(topParam); rcData.setBox(new BoundingBox(left, bottom, right, top)); Log.d(DEBUG_TAG,"bbox " + rcData.getBox() + " load " + rcData.load()); } catch (NumberFormatException e) { Log.d(DEBUG_TAG,"Invalid bounding box parameter", e); intent = null; } } if (intent != null) { String select = data.getQueryParameter("select"); if (rcData.load() && select != null) { rcData.setSelect(select); } intent.putExtra(RCDATA, rcData); } } catch (OsmException e) { Log.d(DEBUG_TAG,"OsmException ", e); intent = null; } } else { Log.d(DEBUG_TAG,"Unknown RC command: " + command); intent = null; } if (intent != null) { startActivity(intent); } } catch (Exception ex) { // avoid crashing on getting called with stuff that can't be parsed Log.d(DEBUG_TAG,"Exception: " + ex); intent = null; } setResult(intent != null ? RESULT_OK : RESULT_CANCELED); // not clear if this actually helps with anything finish(); } public static class RemoteControlUrlData implements Serializable { private static final long serialVersionUID = 1L; private boolean load = false; private BoundingBox box; private String select = null; /** * @return the box */ public BoundingBox getBox() { return box; } /** * return string with elements to select * @return */ public String getSelect() { return select; } public void setSelect(String select) { this.select = select; } /** * @param box the box to set */ public void setBox(BoundingBox box) { this.box = box; } /** * @return the load */ public boolean load() { return load; } /** * @param load the load to set */ public void setLoad(boolean load) { this.load = load; } } }