Fix issue 1945

This commit is contained in:
Victor Shcherb 2013-07-18 23:30:42 +02:00
parent b9812ceef5
commit 1ef07093b3
9 changed files with 292 additions and 312 deletions

1
.gitignore vendored
View file

@ -5,3 +5,4 @@ countries.reginfo
h_*.png
g_*.png
mm_*.png
mx_*.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 384 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 216 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 750 B

After

Width:  |  Height:  |  Size: 279 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 892 B

After

Width:  |  Height:  |  Size: 186 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 483 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 252 B

View file

@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?><resources>
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<resources>
<string name="local_index_gpx_timespan">\nZeitspanne: %1$d:%2$02d:%3$02d</string>
<string name="local_index_gpx_timemoving">\nZeit in Bewegung: %1$d:%2$02d:%3$02d</string>
<string name="context_menu_item_destination_point">Als Ziel wählen</string>

View file

@ -1,6 +1,5 @@
package net.osmand.plus.audionotes;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
@ -23,6 +22,7 @@ import net.osmand.PlatformUtil;
import net.osmand.access.AccessibleAlertBuilder;
import net.osmand.access.AccessibleToast;
import net.osmand.data.DataTileManager;
import net.osmand.data.FavouritePoint;
import net.osmand.data.LatLon;
import net.osmand.plus.ApplicationMode;
import net.osmand.plus.ContextMenuAdapter;
@ -38,6 +38,7 @@ import net.osmand.plus.activities.LocalIndexInfo;
import net.osmand.plus.activities.LocalIndexesActivity;
import net.osmand.plus.activities.LocalIndexesActivity.LoadLocalIndexTask;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.activities.SavingTrackHelper;
import net.osmand.plus.activities.SettingsActivity;
import net.osmand.plus.views.MapInfoLayer;
import net.osmand.plus.views.OsmandMapTileView;
@ -67,7 +68,6 @@ import android.media.MediaPlayer;
import android.media.MediaPlayer.OnPreparedListener;
import android.media.MediaRecorder;
import android.media.SoundPool;
import android.media.SoundPool.OnLoadCompleteListener;
import android.net.Uri;
import android.os.Build;
import android.preference.Preference;
@ -97,9 +97,9 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
private OsmandApplication app;
private TextInfoWidget recordControl;
public final CommonPreference<Boolean> AV_EXTERNAL_RECORDER ;
public final CommonPreference<Boolean> AV_EXTERNAL_PHOTO_CAM ;
public final CommonPreference<Boolean> AV_PHOTO_PLAY_SOUND ;
public final CommonPreference<Boolean> AV_EXTERNAL_RECORDER;
public final CommonPreference<Boolean> AV_EXTERNAL_PHOTO_CAM;
public final CommonPreference<Boolean> AV_PHOTO_PLAY_SOUND;
public static final int VIDEO_OUTPUT_MP4 = 0;
public static final int VIDEO_OUTPUT_3GP = 1;
@ -125,9 +125,7 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
public final CommonPreference<Integer> AV_DEFAULT_ACTION;
public final OsmandPreference<Boolean> SHOW_RECORDINGS ;
public final OsmandPreference<Boolean> SHOW_RECORDINGS;
private DataTileManager<Recording> recordings = new DataTileManager<AudioVideoNotesPlugin.Recording>(14);
private Map<String, Recording> recordingByFileName = new LinkedHashMap<String, Recording>();
@ -140,6 +138,7 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
public Recording(File f) {
this.file = f;
}
public File file;
public String name;
@ -148,15 +147,15 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
private long duration = -1;
private boolean available = true;
public double getLatitude(){
public double getLatitude() {
return lat;
}
public double getLongitude(){
public double getLongitude() {
return lon;
}
private void updateInternalDescription(){
private void updateInternalDescription() {
if (duration == -1) {
duration = 0;
if (!isPhoto()) {
@ -187,15 +186,15 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
}
private String convertDegToExifRational(double l) {
if(l < 0){
if (l < 0) {
l = -l;
}
String s = ((int) l) + "/1,"; //degrees
String s = ((int) l) + "/1,"; // degrees
l = (l - ((int) l)) * 60.0;
s+= (int) l + "/1,"; //minutes
s += (int) l + "/1,"; // minutes
l = (l - ((int) l)) * 60000.0;
s+= (int) l + "/1000"; //seconds
//log.info("deg rational: " + s);
s += (int) l + "/1000"; // seconds
// log.info("deg rational: " + s);
return s;
}
@ -206,29 +205,31 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
Constructor c = exClass.getConstructor(new Class[] { String.class });
Object exInstance = c.newInstance(file.getAbsolutePath());
Method setAttribute = exClass.getMethod("setAttribute",
new Class[] { String.class, String.class } );
setAttribute.invoke(exInstance,"GPSLatitude", convertDegToExifRational(lat));
setAttribute.invoke(exInstance,"GPSLatitudeRef", lat > 0 ?"N" :"S");
setAttribute.invoke(exInstance,"GPSLongitude", convertDegToExifRational(lon));
setAttribute.invoke(exInstance,"GPSLongitudeRef", lon > 0?"E" : "W");
if(!Double.isNaN(rot)){
setAttribute.invoke(exInstance,"GPSImgDirectionRef", "T");
while(rot < 0) { rot += 360; }
while(rot > 360) { rot -= 360; }
int abs = (int) (Math.abs(rot) * 100.0);
String rotString = abs/100f+"";
setAttribute.invoke(exInstance,"GPSImgDirection", rotString);
Method setAttribute = exClass.getMethod("setAttribute", new Class[] { String.class, String.class });
setAttribute.invoke(exInstance, "GPSLatitude", convertDegToExifRational(lat));
setAttribute.invoke(exInstance, "GPSLatitudeRef", lat > 0 ? "N" : "S");
setAttribute.invoke(exInstance, "GPSLongitude", convertDegToExifRational(lon));
setAttribute.invoke(exInstance, "GPSLongitudeRef", lon > 0 ? "E" : "W");
if (!Double.isNaN(rot)) {
setAttribute.invoke(exInstance, "GPSImgDirectionRef", "T");
while (rot < 0) {
rot += 360;
}
if(loc != null && loc.hasAltitude()){
while (rot > 360) {
rot -= 360;
}
int abs = (int) (Math.abs(rot) * 100.0);
String rotString = abs / 100f + "";
setAttribute.invoke(exInstance, "GPSImgDirection", rotString);
}
if (loc != null && loc.hasAltitude()) {
double alt = loc.getAltitude();
String altString = (int) (Math.abs(alt) * 100.0) + "/100";
System.err.println(altString);
setAttribute.invoke(exInstance,"GPSAltitude", altString);
setAttribute.invoke(exInstance,"GPSAltitudeRef", alt < 0 ? "1" : "0");
setAttribute.invoke(exInstance, "GPSAltitude", altString);
setAttribute.invoke(exInstance, "GPSAltitudeRef", alt < 0 ? "1" : "0");
}
Method saveAttributes = exClass.getMethod("saveAttributes",
new Class[] {} );
Method saveAttributes = exClass.getMethod("saveAttributes", new Class[] {});
saveAttributes.invoke(exInstance);
} catch (Exception e) {
e.printStackTrace();
@ -244,8 +245,7 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
Constructor c = exClass.getConstructor(new Class[] { String.class });
Object exInstance = c.newInstance(file.getAbsolutePath());
Method getAttributeInt = exClass.getMethod("getAttributeInt",
new Class[] { String.class, Integer.TYPE} );
Method getAttributeInt = exClass.getMethod("getAttributeInt", new Class[] { String.class, Integer.TYPE });
Integer it = (Integer) getAttributeInt.invoke(exInstance, "Orientation", new Integer(1));
orientation = it.intValue();
} catch (Exception e) {
@ -271,53 +271,47 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
return rotation;
}
public String getDescription(Context ctx){
String nm = name == null? "" : name ;
if(isPhoto()){
return ctx.getString(R.string.recording_photo_description, nm,
Algorithms.formatDateTime(file.lastModified())).trim();
public String getDescription(Context ctx) {
String nm = name == null ? "" : name;
if (isPhoto()) {
return ctx.getString(R.string.recording_photo_description, nm, Algorithms.formatDateTime(file.lastModified())).trim();
}
updateInternalDescription();
return ctx.getString(R.string.recording_description, nm, getDuration(ctx),
Algorithms.formatDateTime(file.lastModified())).trim();
return ctx.getString(R.string.recording_description, nm, getDuration(ctx), Algorithms.formatDateTime(file.lastModified()))
.trim();
}
public String getSmallDescription(Context ctx){
String nm = name == null? "" : name ;
if(isPhoto()){
return ctx.getString(R.string.recording_photo_description, nm,
Algorithms.formatDateTime(file.lastModified())).trim();
public String getSmallDescription(Context ctx) {
String nm = name == null ? "" : name;
if (isPhoto()) {
return ctx.getString(R.string.recording_photo_description, nm, Algorithms.formatDateTime(file.lastModified())).trim();
}
return ctx.getString(R.string.recording_description, nm, "",
Algorithms.formatDateTime(file.lastModified())).trim();
return ctx.getString(R.string.recording_description, nm, "", Algorithms.formatDateTime(file.lastModified())).trim();
}
private String getDuration(Context ctx) {
String additional = "";
if(duration > 0) {
if (duration > 0) {
int d = (int) (duration / 1000);
additional += Algorithms.formatDuration(d);
}
if(!available) {
additional += "("+ctx.getString(R.string.recording_unavailable)+")";
if (!available) {
additional += "(" + ctx.getString(R.string.recording_unavailable) + ")";
}
return additional;
}
}
private static void initializeRemoteControlRegistrationMethods() {
try {
if (mRegisterMediaButtonEventReceiver == null) {
mRegisterMediaButtonEventReceiver = AudioManager.class.getMethod(
"registerMediaButtonEventReceiver",
new Class[] { ComponentName.class } );
mRegisterMediaButtonEventReceiver = AudioManager.class.getMethod("registerMediaButtonEventReceiver",
new Class[] { ComponentName.class });
}
if (mUnregisterMediaButtonEventReceiver == null) {
mUnregisterMediaButtonEventReceiver = AudioManager.class.getMethod(
"unregisterMediaButtonEventReceiver",
new Class[] { ComponentName.class } );
mUnregisterMediaButtonEventReceiver = AudioManager.class.getMethod("unregisterMediaButtonEventReceiver",
new Class[] { ComponentName.class });
}
/* success, this device will take advantage of better remote */
/* control event handling */
@ -327,7 +321,6 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
}
}
@Override
public String getId() {
return ID;
@ -341,7 +334,7 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
AV_VIDEO_FORMAT = settings.registerIntPreference("av_video_format", VIDEO_OUTPUT_MP4).makeGlobal();
AV_DEFAULT_ACTION = settings.registerIntPreference("av_default_action", AV_DEFAULT_ACTION_CHOOSE).makeGlobal();
// camera focus type:
AV_CAMERA_FOCUS_TYPE = settings.registerIntPreference("av_camera_focus_type",AV_CAMERA_FOCUS_AUTO).makeGlobal();
AV_CAMERA_FOCUS_TYPE = settings.registerIntPreference("av_camera_focus_type", AV_CAMERA_FOCUS_AUTO).makeGlobal();
// camera sound:
AV_PHOTO_PLAY_SOUND = settings.registerBooleanPreference("av_photo_play_sound", true).makeGlobal();
@ -362,19 +355,16 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
public boolean init(final OsmandApplication app) {
initializeRemoteControlRegistrationMethods();
AudioManager am = (AudioManager) app.getSystemService(Context.AUDIO_SERVICE);
if(am != null){
if (am != null) {
registerMediaListener(am);
}
return true;
}
@Override
public void registerLayers(MapActivity activity) {
this.activity = activity;
if(audioNotesLayer != null) {
if (audioNotesLayer != null) {
activity.getMapView().removeLayer(audioNotesLayer);
}
audioNotesLayer = new AudioNotesLayer(activity, this);
@ -382,17 +372,14 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
registerWidget(activity);
}
private void registerMediaListener(AudioManager am) {
ComponentName receiver = new ComponentName(app.getPackageName(),
MediaRemoteControlReceiver.class.getName());
ComponentName receiver = new ComponentName(app.getPackageName(), MediaRemoteControlReceiver.class.getName());
try {
if (mRegisterMediaButtonEventReceiver == null) {
return;
}
mRegisterMediaButtonEventReceiver.invoke(am,
receiver);
mRegisterMediaButtonEventReceiver.invoke(am, receiver);
} catch (Exception ite) {
log.error(ite.getMessage(), ite);
}
@ -410,7 +397,6 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
}
}
@Override
public void registerLayerContextMenuActions(final OsmandMapTileView mapView, ContextMenuAdapter adapter, final MapActivity mapActivity) {
OnContextMenuClick listener = new OnContextMenuClick() {
@ -423,31 +409,31 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
}
}
};
adapter.item(R.string.layer_recordings).selected(SHOW_RECORDINGS.get()? 1 : 0)
adapter.item(R.string.layer_recordings).selected(SHOW_RECORDINGS.get() ? 1 : 0)
.icons(R.drawable.ic_action_audio_dark, R.drawable.ic_action_audio_light).listen(listener).position(6).reg();
}
@Override
public void registerMapContextMenuActions(final MapActivity mapActivity, final double latitude, final double longitude, ContextMenuAdapter adapter,
Object selectedObj) {
adapter.item(R.string.recording_context_menu_arecord).icons(R.drawable.ic_action_micro_dark, R.drawable.ic_action_micro_light) .
listen(new OnContextMenuClick() {
public void registerMapContextMenuActions(final MapActivity mapActivity, final double latitude, final double longitude,
ContextMenuAdapter adapter, Object selectedObj) {
adapter.item(R.string.recording_context_menu_arecord).icons(R.drawable.ic_action_micro_dark, R.drawable.ic_action_micro_light)
.listen(new OnContextMenuClick() {
@Override
public void onContextMenuClick(int itemId, int pos, boolean isChecked, DialogInterface dialog) {
recordAudio(latitude, longitude, mapActivity);
}
}).position(6).reg();
adapter.item(R.string.recording_context_menu_vrecord).icons(R.drawable.ic_action_video_dark, R.drawable.ic_action_video_light).
listen(new OnContextMenuClick() {
adapter.item(R.string.recording_context_menu_vrecord).icons(R.drawable.ic_action_video_dark, R.drawable.ic_action_video_light)
.listen(new OnContextMenuClick() {
@Override
public void onContextMenuClick(int itemId, int pos, boolean isChecked, DialogInterface dialog) {
recordVideo(latitude, longitude, mapActivity);
}
}).position(7).reg();
adapter.item(R.string.recording_context_menu_precord).icons(R.drawable.ic_action_photo_dark, R.drawable.ic_action_photo_light).
listen(new OnContextMenuClick() {
adapter.item(R.string.recording_context_menu_precord).icons(R.drawable.ic_action_photo_dark, R.drawable.ic_action_photo_light)
.listen(new OnContextMenuClick() {
@Override
public void onContextMenuClick(int itemId, int pos, boolean isChecked, DialogInterface dialog) {
takePhoto(latitude, longitude, mapActivity);
@ -458,27 +444,25 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
@Override
public void updateLayers(OsmandMapTileView mapView, MapActivity activity) {
if(SHOW_RECORDINGS.get()) {
if(audioNotesLayer == null) {
if (SHOW_RECORDINGS.get()) {
if (audioNotesLayer == null) {
registerLayers(activity);
} else if(!mapView.getLayers().contains(audioNotesLayer)) {
} else if (!mapView.getLayers().contains(audioNotesLayer)) {
mapView.addLayer(audioNotesLayer, 3.5f);
}
} else if(audioNotesLayer != null){
} else if (audioNotesLayer != null) {
mapView.removeLayer(audioNotesLayer);
}
}
private void registerWidget(MapActivity activity) {
MapInfoLayer mapInfoLayer = activity.getMapLayers().getMapInfoLayer();
if (mapInfoLayer != null ) {
if (mapInfoLayer != null) {
recordControl = new TextInfoWidget(activity, 0, mapInfoLayer.getPaintText(), mapInfoLayer.getPaintSubText());
recordControl.setImageDrawable(activity.getResources().getDrawable(R.drawable.monitoring_rec_inactive));
setRecordListener(recordControl, activity);
mapInfoLayer.getMapInfoControls().registerSideWidget(recordControl,
R.drawable.widget_icon_av_inactive, R.string.map_widget_av_notes, "audionotes", false,
EnumSet.allOf(ApplicationMode.class),
mapInfoLayer.getMapInfoControls().registerSideWidget(recordControl, R.drawable.widget_icon_av_inactive,
R.string.map_widget_av_notes, "audionotes", false, EnumSet.allOf(ApplicationMode.class),
EnumSet.noneOf(ApplicationMode.class), 22);
mapInfoLayer.recreateControls();
}
@ -496,7 +480,6 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
});
}
private void updateWidgetIcon(final TextInfoWidget recordPlaceControl) {
recordPlaceControl.setImageDrawable(activity.getResources().getDrawable(R.drawable.widget_icon_av_inactive));
if (AV_DEFAULT_ACTION.get() == AV_DEFAULT_ACTION_VIDEO) {
@ -526,18 +509,16 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
}
}
private void chooseDefaultAction(final double lat, final double lon, final MapActivity mapActivity) {
AccessibleAlertBuilder ab = new AccessibleAlertBuilder(mapActivity);
ab.setItems(new String[] {
mapActivity.getString(R.string.recording_context_menu_arecord),
ab.setItems(
new String[] { mapActivity.getString(R.string.recording_context_menu_arecord),
mapActivity.getString(R.string.recording_context_menu_vrecord),
mapActivity.getString(R.string.recording_context_menu_precord),
}, new OnClickListener() {
mapActivity.getString(R.string.recording_context_menu_precord), }, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
int action = which == 0 ? AV_DEFAULT_ACTION_AUDIO :
(which == 1 ? AV_DEFAULT_ACTION_VIDEO:AV_DEFAULT_ACTION_TAKEPICTURE);
int action = which == 0 ? AV_DEFAULT_ACTION_AUDIO : (which == 1 ? AV_DEFAULT_ACTION_VIDEO
: AV_DEFAULT_ACTION_TAKEPICTURE);
takeAction(mapActivity, lon, lat, action);
}
@ -545,7 +526,6 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
ab.show();
}
private void takeAction(final MapActivity mapActivity, double lon, double lat, int action) {
if (action == AV_DEFAULT_ACTION_VIDEO) {
recordVideo(lat, lon, mapActivity);
@ -556,7 +536,6 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
}
}
private File getBaseFileName(double lat, double lon, OsmandApplication app, String ext) {
String basename = MapUtils.createShortLocString(lat, lon, 15);
int k = 1;
@ -565,7 +544,7 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
File fl;
do {
fl = new File(f, basename + "-" + (k++) + "." + ext);
} while(fl.exists());
} while (fl.exists());
return fl;
}
@ -581,7 +560,7 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
String ext = MPEG4_EXTENSION;
if(AV_VIDEO_FORMAT.get() == VIDEO_OUTPUT_3GP ){
if (AV_VIDEO_FORMAT.get() == VIDEO_OUTPUT_3GP) {
ext = THREEGP_EXTENSION;
}
Uri fileUri = Uri.fromFile(getBaseFileName(lat, lon, app, ext));
@ -598,7 +577,7 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
}
public void recordVideo(final double lat, final double lon, final MapActivity mapActivity) {
if(AV_EXTERNAL_RECORDER.get()) {
if (AV_EXTERNAL_RECORDER.get()) {
captureVideoExternal(lat, lon, mapActivity);
} else {
recordVideoCamera(lat, lon, mapActivity);
@ -619,14 +598,14 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
public void surfaceCreated(SurfaceHolder holder) {
MediaRecorder mr = new MediaRecorder();
String ext = MPEG4_EXTENSION;
if(AV_VIDEO_FORMAT.get() == VIDEO_OUTPUT_3GP ){
if (AV_VIDEO_FORMAT.get() == VIDEO_OUTPUT_3GP) {
ext = THREEGP_EXTENSION;
}
final File f = getBaseFileName(lat, lon, app,ext );
final File f = getBaseFileName(lat, lon, app, ext);
mr.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
mr.setVideoSource(MediaRecorder.VideoSource.CAMERA);
if(AV_VIDEO_FORMAT.get() == VIDEO_OUTPUT_3GP ){
if (AV_VIDEO_FORMAT.get() == VIDEO_OUTPUT_3GP) {
mr.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
} else {
mr.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
@ -680,7 +659,7 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
protected Camera openCamera() {
try {
return Camera.open();
} catch (Exception e ){
} catch (Exception e) {
logErr(e);
return null;
}
@ -697,7 +676,6 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
}
}
public void recordAudio(double lat, double lon, final MapActivity mapActivity) {
MediaRecorder mr = new MediaRecorder();
final File f = getBaseFileName(lat, lon, app, THREEGP_EXTENSION);
@ -727,7 +705,6 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
}
}
private void takePhotoWithCamera(final double lat, final double lon, final MapActivity mapActivity, final Camera cam) {
try {
final Dialog dlg = new Dialog(mapActivity);
@ -748,16 +725,16 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
int rotation = mapActivity.getWindowManager().getDefaultDisplay().getRotation();
int degrees = 0;
switch (rotation) {
case /*Surface.ROTATION_0*/ 0:
case /* Surface.ROTATION_0 */0:
degrees = 0;
break;
case /*Surface.ROTATION_90*/ 1:
case /* Surface.ROTATION_90 */1:
degrees = 90;
break;
case /*Surface.ROTATION_180*/ 2:
case /* Surface.ROTATION_180 */2:
degrees = 180;
break;
case /*Surface.ROTATION_270*/ 3:
case /* Surface.ROTATION_270 */3:
degrees = 270;
break;
}
@ -780,10 +757,10 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
// camera focus type:
boolean autofocus = true;
// boolean autofocus = !Boolean.parseBoolean(parameters.get("auto-exposure-lock-supported"));
// boolean autofocus = !Boolean.parseBoolean(parameters.get("auto-exposure-lock-supported"));
parameters.setGpsLatitude(lat);
parameters.setGpsLongitude(lon);
switch( AV_CAMERA_FOCUS_TYPE.get() ) {
switch (AV_CAMERA_FOCUS_TYPE.get()) {
case AV_CAMERA_FOCUS_HIPERFOCAL:
parameters.setFocusMode(Parameters.FOCUS_MODE_FIXED);
autofocus = false;
@ -812,16 +789,15 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
log.info("Osmand:AudioNotes set camera FOCUS_MODE_AUTO");
break;
}
// parameters.setFocusMode(Parameters.FOCUS_MODE_FIXED);
// parameters.set("auto-exposure-lock", "true");
//}
// parameters.setFocusMode(Parameters.FOCUS_MODE_FIXED);
// parameters.set("auto-exposure-lock", "true");
// }
// load sound befor shot:
if (AV_PHOTO_PLAY_SOUND.get()) {
if(sp==null)
if (sp == null)
sp = new SoundPool(5, AudioManager.STREAM_MUSIC, 0);
log.info("Play sound on photo");
if(shotId==0)
{
if (shotId == 0) {
shotId = sp.load(app.getAssets().openFd("sounds/camera_click.ogg"), 1);
log.debug("loaded file sound ID: " + shotId);
}
@ -853,8 +829,7 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
}
private void printCamParams(Parameters parameters, boolean autoExposure) {
log.info("Cam params auto exposure=" + autoExposure +
" focus_distances="+parameters.get("focus-distances"));
log.info("Cam params auto exposure=" + autoExposure + " focus_distances=" + parameters.get("focus-distances"));
}
@Override
@ -869,7 +844,6 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
}
}
private void takeIntentPhoto(double lat, double lon, final MapActivity mapActivity) {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
final File f = getBaseFileName(lat, lon, app, IMG_EXTENSION);
@ -892,7 +866,7 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
final MapInfoLayer mil = mapActivity.getMapLayers().getMapInfoLayer();
final StackWidgetView par = mil.getRightStack();
final boolean contains = par.getAllViews().contains(recordControl);
if(!contains) {
if (!contains) {
par.addStackView(recordControl);
mapActivity.getMapView().refreshMap(true);
}
@ -900,7 +874,7 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
recordControl.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(!contains) {
if (!contains) {
par.removeView(recordControl);
}
stopRecording(mapActivity);
@ -912,19 +886,19 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
});
}
public void indexFile(File f){
public void indexFile(File f) {
boolean oldFileExist = recordingByFileName.containsKey(f.getName());
if(oldFileExist){
if (oldFileExist) {
return;
}
Recording r = new Recording(f);
String encodeName = f.getName();
int i = encodeName.indexOf('-');
if(i > 0) {
if (i > 0) {
encodeName = encodeName.substring(0, i);
}
i = encodeName.indexOf('.');
if(i > 0) {
if (i > 0) {
encodeName = encodeName.substring(0, i);
}
r.file = f;
@ -933,7 +907,7 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
r.lon = l.getLongitude();
Float heading = app.getLocationProvider().getHeading();
Location loc = app.getLocationProvider().getLastKnownLocation();
if(lastTakingPhoto != null && lastTakingPhoto.getName().equals(f.getName()) && heading != null) {
if (lastTakingPhoto != null && lastTakingPhoto.getName().equals(f.getName()) && heading != null) {
float rot = heading.floatValue();
try {
r.updatePhotoInformation(r.lat, r.lon, loc, rot == 0 ? Double.NaN : rot);
@ -949,30 +923,41 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
@Override
public void disable(OsmandApplication app) {
AudioManager am = (AudioManager) app.getSystemService(Context.AUDIO_SERVICE);
if(am != null){
if (am != null) {
unregisterMediaListener(am);
}
}
@Override
public List<String> indexingFiles(IProgress progress) {
return indexingFiles(progress, true);
return indexingFiles(progress, true, false);
}
public List<String> indexingFiles(IProgress progress, boolean reIndexAndKeepOld) {
public List<String> indexingFiles(IProgress progress, boolean reIndexAndKeepOld, boolean registerNew) {
File avPath = app.getAppPath(IndexConstants.AV_INDEX_DIR);
if (avPath.canRead()) {
if(!reIndexAndKeepOld) {
if (!reIndexAndKeepOld) {
recordings.clear();
recordingByFileName.clear();
}
File[] files = avPath.listFiles();
if (files != null) {
for (File f : files) {
if(f.getName().endsWith(THREEGP_EXTENSION)
|| f.getName().endsWith(MPEG4_EXTENSION)
if (f.getName().endsWith(THREEGP_EXTENSION) || f.getName().endsWith(MPEG4_EXTENSION)
|| f.getName().endsWith(IMG_EXTENSION)) {
indexFile(f);
if (registerNew) {
Recording rec = recordingByFileName.get(f.getName());
if (rec != null) {
String name = f.getName();
SavingTrackHelper savingTrackHelper = app.getSavingTrackHelper();
savingTrackHelper.insertPointData(rec.lat, rec.lon, System.currentTimeMillis(), name);
if (app.getSettings().SHOW_CURRENT_GPX_TRACK.get()) {
app.getFavorites().addFavoritePointToGPXFile(new FavouritePoint(rec.lat, rec.lon, name, ""));
}
}
}
}
}
}
@ -980,23 +965,21 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
return null;
}
public DataTileManager<Recording> getRecordings() {
return recordings;
}
private void checkRecordings(){
private void checkRecordings() {
Iterator<Recording> it = recordingByFileName.values().iterator();
while(it.hasNext()){
while (it.hasNext()) {
Recording r = it.next();
if(!r.file.exists()) {
if (!r.file.exists()) {
it.remove();
recordings.unregisterObject(r.lat, r.lon, r);
}
}
}
public void deleteRecording(Recording r) {
recordings.unregisterObject(r.lat, r.lon, r);
recordingByFileName.remove(r.file.getName());
@ -1005,7 +988,6 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
activity.getMapView().refreshMap();
}
@Override
public void settingsActivityCreate(final SettingsActivity activity, PreferenceScreen screen) {
Preference grp = new Preference(activity);
@ -1024,13 +1006,13 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
@Override
public void onMapActivityExternalResult(int requestCode, int resultCode, Intent data) {
if(requestCode == 205) {
indexingFiles(null, true);
if (requestCode == 205) {
indexingFiles(null, true, true);
}
}
public boolean onMapActivityKeyEvent(KeyEvent key){
if(KeyEvent.KEYCODE_CAMERA == key.getKeyCode()) {
public boolean onMapActivityKeyEvent(KeyEvent key) {
if (KeyEvent.KEYCODE_CAMERA == key.getKeyCode()) {
defaultAction(activity);
return true;
}
@ -1088,15 +1070,15 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
playRecording(la, ri.rec);
}
};
if(ri.rec.isPhoto()) {
adapter.item(R.string.recording_context_menu_show).icons(
R.drawable.ic_action_eye_dark, R.drawable.ic_action_eye_light).listen(listener).reg();
if (ri.rec.isPhoto()) {
adapter.item(R.string.recording_context_menu_show).icons(R.drawable.ic_action_eye_dark, R.drawable.ic_action_eye_light)
.listen(listener).reg();
} else {
adapter.item(R.string.recording_context_menu_play).icons(
R.drawable.ic_action_play_dark, R.drawable.ic_action_play_light).listen(listener).reg();
adapter.item(R.string.recording_context_menu_play).icons(R.drawable.ic_action_play_dark, R.drawable.ic_action_play_light)
.listen(listener).reg();
}
adapter.item(R.string.show_location).icons(R.drawable.ic_action_marker_dark, R.drawable.ic_action_marker_light).
listen(new OnContextMenuClick() {
adapter.item(R.string.show_location).icons(R.drawable.ic_action_marker_dark, R.drawable.ic_action_marker_light)
.listen(new OnContextMenuClick() {
@Override
public void onContextMenuClick(int itemId, int pos, boolean isChecked, DialogInterface dialog) {
SHOW_RECORDINGS.set(true);
@ -1108,7 +1090,7 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
}
}
public Collection<Recording> getAllRecordings(){
public Collection<Recording> getAllRecordings() {
return recordingByFileName.values();
}
@ -1128,7 +1110,6 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
return res;
}
public void playRecording(final Context ctx, final Recording r) {
final MediaPlayer player = r.isPhoto() ? null : new MediaPlayer();
final AccessibleAlertBuilder dlg = new AccessibleAlertBuilder(ctx);
@ -1136,7 +1117,7 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
@Override
public void onClick(DialogInterface v, int w) {
if(player == null) {
if (player == null) {
Intent vint = new Intent(Intent.ACTION_VIEW);
vint.setDataAndType(Uri.fromFile(r.file), "image/*");
vint.setFlags(0x10000000);
@ -1156,11 +1137,11 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
}
}
});
dlg.setNegativeButton(R.string.default_buttons_cancel, new OnClickListener(){
dlg.setNegativeButton(R.string.default_buttons_cancel, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if(player != null && player.isPlaying()) {
if (player != null && player.isPlaying()) {
player.stop();
}
@ -1226,21 +1207,18 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
FileOutputStream fos = new FileOutputStream(pictureFile);
fos.write(data);
fos.close();
indexingFiles(null, true);
indexingFiles(null, true, true);
dlg.dismiss();
// play sound after photo - sound file must be loaded at this time:
if (AV_PHOTO_PLAY_SOUND.get()) {
if(sp!=null && shotId!=0)
{
int ret=sp.play(shotId, 0.7f, 0.7f, 0, 0, 1);
if (sp != null && shotId != 0) {
int ret = sp.play(shotId, 0.7f, 0.7f, 0, 0, 1);
log.debug("play sound shot success!");
log.debug("sp.play()="+ret);
log.debug("sp.play()=" + ret);
// sp.release();
// sp=null;
// shotId=0
}
else
{
} else {
log.error("can not play sound on shot - not init SoundPool or not loaded sound");
}
}