Fix download

This commit is contained in:
Victor Shcherb 2012-12-15 00:20:44 +01:00
parent a045b20580
commit 8c7b21e7fc
5 changed files with 162 additions and 107 deletions

View file

@ -9,6 +9,9 @@
1. All your modified/created strings are in the top of the file (to make easier find what\'s translated).
PLEASE: Have a look at http://code.google.com/p/osmand/wiki/UIConsistency, it may really improve your and our work :-) Thx - Hardy
-->
<string name="audionotes_location_not_defined">Location is not defined yet to take with audio notes</string>
<string name="monitoring_control_stop">stop</string>
<string name="map_widget_audionotes">Audio notes</string>
<string name="audionotes_plugin_description">Audio notes plugin description</string>
<string name="audionotes_plugin_name">Audio notes plugin</string>
<string name="index_srtm_parts">parts</string>

View file

@ -69,6 +69,7 @@ public class ResourceManager {
public static final String APP_DIR = "osmand/"; //$NON-NLS-1$
public static final String ROUTING_XML = APP_DIR + "routing.xml";
public static final String AV_PATH = APP_DIR + IndexConstants.AV_INDEX_DIR;
public static final String SRTM_PATH = APP_DIR + IndexConstants.SRTM_INDEX_DIR;
public static final String VOICE_PATH = APP_DIR + IndexConstants.VOICE_INDEX_DIR;
public static final String GPX_PATH = APP_DIR + "tracks";

View file

@ -1,18 +1,54 @@
package net.osmand.plus.audionotes;
import java.io.File;
import java.io.IOException;
import java.util.EnumSet;
import net.osmand.LogUtil;
import net.osmand.access.AccessibleToast;
import net.osmand.data.DataTileManager;
import net.osmand.osm.MapUtils;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.R;
import net.osmand.plus.ResourceManager;
import net.osmand.plus.activities.ApplicationMode;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.parkingpoint.ParkingPositionLayer;
import net.osmand.plus.views.MapInfoLayer;
import net.osmand.plus.views.OsmandMapLayer;
import net.osmand.plus.views.OsmandMapTileView;
import net.osmand.plus.views.TextInfoControl;
import org.apache.commons.logging.Log;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import android.location.Location;
import android.media.MediaRecorder;
import android.view.View;
import android.widget.Toast;
public class AudioVideoNotesPlugin extends OsmandPlugin {
public static final String ID = "osmand.audionotes";
private static final Log log = LogUtil.getLog(AudioVideoNotesPlugin.class);
private OsmandApplication app;
private TextInfoControl recordControl;
private MapActivity mapActivity;
private DataTileManager<Recording> indexedFiles = new DataTileManager<AudioVideoNotesPlugin.Recording>(14);
private AudioNotesLayer audioNotesLayer;
public static class Recording {
public Recording(File f) {
this.file = f;
}
public File file;
public int x31;
public int y31;
}
@Override
public String getId() {
@ -41,11 +77,120 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
@Override
public void registerLayers(MapActivity activity) {
if(audioNotesLayer != null) {
activity.getMapView().removeLayer(audioNotesLayer);
}
audioNotesLayer = new AudioNotesLayer(activity);
registerWidget(activity);
}
@Override
public void updateLayers(OsmandMapTileView mapView, MapActivity activity) {
}
private void registerWidget(MapActivity activity) {
MapInfoLayer mapInfoLayer = activity.getMapLayers().getMapInfoLayer();
mapActivity = activity;
if (mapInfoLayer != null ) {
recordControl = createRecordControl(activity, mapInfoLayer.getPaintText(), mapInfoLayer.getPaintSubText());
mapInfoLayer.getMapInfoControls().registerSideWidget(recordControl,
-1/*R.drawable.widget_parking*/, R.string.map_widget_appearance, "audionotes", false,
EnumSet.allOf(ApplicationMode.class),
EnumSet.noneOf(ApplicationMode.class), 22);
mapInfoLayer.recreateControls();
}
}
private TextInfoControl createRecordControl(MapActivity activity, Paint paintText, Paint paintSubText) {
TextInfoControl recordPlaceControl = new TextInfoControl(activity, 0, paintText, paintSubText);
setRecordListener(recordPlaceControl);
return recordPlaceControl;
}
private void setRecordListener(final TextInfoControl recordPlaceControl) {
recordPlaceControl.setText("", app.getString(R.string.monitoring_control_start));
recordPlaceControl.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
recordAudioVideo(recordPlaceControl);
}
});
}
private void recordAudioVideo(final TextInfoControl recordPlaceControl) {
Location loc = mapActivity.getLastKnownLocation();
if(loc == null) {
AccessibleToast.makeText(app, R.string.audionotes_location_not_defined, Toast.LENGTH_LONG).show();
}
String basename = MapUtils.createShortLocString(loc.getLatitude(), loc.getLongitude(), 15);
File f = app.getSettings().extendOsmandPath(ResourceManager.AV_PATH);
f.mkdirs();
final MediaRecorder mr = new MediaRecorder();
mr.setAudioSource(MediaRecorder.AudioSource.MIC);
int k = 1;
File fl;
do {
fl = new File(f, basename + "_" + (k++) + ".3gpp");
} while(fl.exists());
mr.setOutputFile(fl.getAbsolutePath());
mr.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recordPlaceControl.setText("", app.getString(R.string.monitoring_control_stop));
try {
mr.prepare();
mr.start();
recordPlaceControl.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mr.stop();
mr.release();
setRecordListener(recordPlaceControl);
}
});
} catch (Exception e) {
AccessibleToast.makeText(app, app.getString(R.string.error_io_error) + " : " + e.getMessage(), Toast.LENGTH_LONG).show();
}
}
public void indexFile(File f){
Recording r = new Recording(f);
indexedFiles.registerObject(r.x31, r.y31, r);
}
@Override
public void disable(OsmandApplication app) {
}
public class AudioNotesLayer extends OsmandMapLayer {
private MapActivity activity;
public AudioNotesLayer(MapActivity activity) {
this.activity = activity;
}
@Override
public void initLayer(OsmandMapTileView view) {
}
@Override
public void onDraw(Canvas canvas, RectF latlonRect, RectF tilesRect, DrawSettings settings) {
}
@Override
public void destroyLayer() {
}
@Override
public boolean drawInScreenPixels() {
return false;
}
}
}

View file

@ -1,96 +0,0 @@
package net.osmand.plus.render;
import java.util.ArrayList;
import java.util.List;
import android.graphics.RectF;
public class QuadTree<T> {
private static class Node<T> {
List<T> data = null;
Node<T>[] children = null;
RectF bounds;
@SuppressWarnings("unchecked")
private Node(RectF b) {
bounds = new RectF(b);
children = new Node[4];
}
};
private float ratio;
private int maxDepth;
private Node<T> root;
public QuadTree(RectF r, int depth/* =8 */, float ratio /* = 0.55 */) {
this.ratio = ratio;
this.root = new Node<T>(r);
this.maxDepth = depth;
}
void insert(T data, RectF box) {
int depth = 0;
doInsertData(data, box, root, depth);
}
void queryInBox(RectF box, List<T> result) {
result.clear();
queryNode(box, result, root);
}
private void queryNode(RectF box, List<T> result, Node<T> node) {
if (node != null) {
if (RectF.intersects(box, node.bounds)) {
if (node.data != null) {
result.addAll(node.data);
}
for (int k = 0; k < 4; ++k) {
queryNode(box, result, node.children[k]);
}
}
}
}
private void doInsertData(T data, RectF box, Node<T> n, int depth) {
if (++depth >= maxDepth) {
if (n.data == null) {
n.data = new ArrayList<T>();
}
n.data.add(data);
} else {
RectF[] ext = new RectF[4];
splitBox(n.bounds, ext);
for (int i = 0; i < 4; ++i) {
if (ext[i].contains(box)) {
if (n.children[i] == null) {
n.children[i] = new Node<T>(ext[i]);
}
doInsertData(data, box, n.children[i], depth);
return;
}
}
if (n.data == null) {
n.data = new ArrayList<T>();
}
n.data.add(data);
}
}
void splitBox(RectF node_extent, RectF[] n) {
// coord2d c=node_extent.center();
float width = node_extent.width();
float height = node_extent.height();
float lox = node_extent.left;
float loy = node_extent.top;
float hix = node_extent.right;
float hiy = node_extent.bottom;
n[0] = new RectF(lox, loy, lox + width * ratio, loy + height * ratio);
n[1] = new RectF(hix - width * ratio, loy, hix, loy + height * ratio);
n[2] = new RectF(lox, hiy - height * ratio, lox + width * ratio, hiy);
n[3] = new RectF(hix - width * ratio, hiy - height * ratio, hix, hiy);
}
}

View file

@ -10,6 +10,8 @@ import java.util.List;
import net.osmand.binary.BinaryMapDataObject;
import net.osmand.binary.BinaryMapIndexReader.TagValuePair;
import net.osmand.data.QuadTree;
import net.osmand.data.QuadTree.QuadRect;
import net.osmand.plus.render.OsmandRenderer.RenderingContext;
import net.osmand.render.RenderingRuleSearchRequest;
import net.osmand.render.RenderingRulesStorage;
@ -42,7 +44,7 @@ public class TextRenderer {
String text = null;
Path drawOnPath = null;
RectF bounds = null;
QuadRect bounds = null;
float vOffset = 0;
float centerX = 0;
float pathRotate = 0;
@ -99,9 +101,9 @@ public class TextRenderer {
return a * a;
}
boolean intersects(RectF tRect, float tRot, RectF sRect, float sRot) {
boolean intersects(QuadRect tRect, float tRot, QuadRect sRect, float sRot) {
if (Math.abs(tRot) < Math.PI / 15 && Math.abs(sRot) < Math.PI / 15) {
return RectF.intersects(tRect, sRect);
return QuadRect.intersects(tRect, sRect);
}
float dist = FloatMath.sqrt(sqr(tRect.centerX() - sRect.centerX()) + sqr(tRect.centerY() - sRect.centerY()));
if (dist < 3) {
@ -114,7 +116,7 @@ public class TextRenderer {
tRot += Math.PI / 2;
float l = tRect.centerX() - tRect.height() / 2;
float t = tRect.centerY() - tRect.width() / 2;
tRect = new RectF(l, t, l + tRect.height(), t + tRect.width());
tRect = new QuadRect(l, t, l + tRect.height(), t + tRect.width());
}
// determine difference close to 180/0 degrees
@ -125,12 +127,12 @@ public class TextRenderer {
diff -= sRot;
float left = sRect.centerX() + dist * FloatMath.cos(diff) - tRect.width() / 2;
float top = sRect.centerY() - dist * FloatMath.sin(diff) - tRect.height() / 2;
RectF nRect = new RectF(left, top, left + tRect.width(), top + tRect.height());
return RectF.intersects(nRect, sRect);
QuadRect nRect = new QuadRect(left, top, left + tRect.width(), top + tRect.height());
return QuadRect.intersects(nRect, sRect);
}
// TODO other cases not covered
return RectF.intersects(tRect, sRect);
return QuadRect.intersects(tRect, sRect);
}
void drawTestBox(Canvas cv, RectF r, float rot, String text) {
@ -160,7 +162,7 @@ public class TextRenderer {
}
}
if (text.minDistance > 0) {
RectF boundsSearch = new RectF(text.bounds);
QuadRect boundsSearch = new QuadRect(text.bounds);
boundsSearch.inset(-rc.getDensityValue(Math.max(5.0f, text.minDistance)), -rc.getDensityValue(15));
boundIntersections.queryInBox(boundsSearch, tempSearch);
// drawTestBox(cv, &boundsSearch, text.pathRotate, paintIcon, text.text, NULL/*paintText*/);
@ -201,7 +203,7 @@ public class TextRenderer {
return object1.textOrder - object2.textOrder;
}
});
RectF r = new RectF(0, 0, rc.width, rc.height);
QuadRect r = new QuadRect(0, 0, rc.width, rc.height);
r.inset(-100, -100);
QuadTree<TextDrawInfo> nonIntersectedBounds = new QuadTree<TextDrawInfo>(r, 4, 0.6f);
@ -313,7 +315,7 @@ public class TextRenderer {
paintText.setTextSize(rc.getDensityValue(text.textSize));
Rect bs = new Rect();
paintText.getTextBounds(name, 0, name.length(), bs);
text.bounds = new RectF(bs);
text.bounds = new QuadRect(bs.left, bs.top, bs.right, bs.bottom);
text.bounds.inset(-rc.getDensityValue(3), -rc.getDensityValue(10));
boolean display = true;
if(path != null) {