]> gitweb.fperrin.net Git - GpsPrune.git/blobdiff - tim/prune/function/AsyncMediaLoader.java
Version 17.2, February 2015
[GpsPrune.git] / tim / prune / function / AsyncMediaLoader.java
index 0365125b6e9e5133487e63790eb5948069683bf3..78ffc838197450079cf935f6da59cdd1186b35e4 100644 (file)
@@ -8,9 +8,12 @@ import tim.prune.GenericFunction;
 import tim.prune.I18nManager;
 import tim.prune.UpdateMessageBroker;
 import tim.prune.data.AudioClip;
+import tim.prune.data.DataPoint;
+import tim.prune.data.Distance;
 import tim.prune.data.MediaObject;
 import tim.prune.data.Photo;
 import tim.prune.data.Track;
+import tim.prune.data.UnitSetLibrary;
 import tim.prune.load.MediaHelper;
 import tim.prune.load.MediaLoadProgressDialog;
 import tim.prune.undo.UndoLoadAudios;
@@ -29,6 +32,8 @@ implements Runnable, Cancellable
        private String[] _linkArray = null;
        /** Track to use for connecting */
        private Track _track = null;
+       /** Source file */
+       private File _sourceFile = null;
        /** Cancelled flag */
        private boolean _cancelled = false;
 
@@ -38,13 +43,15 @@ implements Runnable, Cancellable
         * @param inApp App object
         * @param inLinkArray array of links
         * @param inTrack Track object for connecting points
+        * @param inSourceFile file from which data was loaded, if any
         */
-       public AsyncMediaLoader(App inApp, File inZipFile, String[] inLinkArray, Track inTrack)
+       public AsyncMediaLoader(App inApp, File inZipFile, String[] inLinkArray, Track inTrack, File inSourceFile)
        {
                super(inApp);
                _zipFile = inZipFile;
                _linkArray = inLinkArray;
                _track = inTrack;
+               _sourceFile = inSourceFile;
        }
 
        /**
@@ -84,6 +91,7 @@ implements Runnable, Cancellable
                if (numLinks <= 0) return;
                // Make progress dialog
                MediaLoadProgressDialog progressDialog = new MediaLoadProgressDialog(_app.getFrame(), this);
+
                // Make array to store results
                MediaObject[] media = new MediaObject[numLinks];
                int currLink = 0;
@@ -91,17 +99,33 @@ implements Runnable, Cancellable
                {
                        if (_linkArray[i] != null)
                        {
-                               MediaObject mf = MediaHelper.createMediaObject(_zipFile, _linkArray[i]);
+                               MediaObject mf = MediaHelper.createMediaObject(_zipFile, _linkArray[i], _sourceFile);
                                if (mf != null)
                                {
+                                       // Check if the media object has a point now (from exif)
+                                       DataPoint exifPoint = mf.getDataPoint();
                                        // attach media to point and set status
                                        _track.getPoint(i).attachMedia(mf);
-                                       mf.setOriginalStatus(MediaObject.Status.TAGGED);
-                                       mf.setCurrentStatus(MediaObject.Status.TAGGED);
+                                       // Check exif to see whether media was already tagged
+                                       final MediaObject.Status originalMediaStatus =
+                                               (exifPoint == null ? MediaObject.Status.NOT_CONNECTED : MediaObject.Status.TAGGED);
+                                       mf.setOriginalStatus(originalMediaStatus);
+                                       MediaObject.Status currMediaStatus = MediaObject.Status.TAGGED;
+                                       if (exifPoint != null)
+                                       {
+                                               final double distinMetres = Distance.convertRadiansToDistance(
+                                                       DataPoint.calculateRadiansBetween(exifPoint, _track.getPoint(i)),
+                                                       UnitSetLibrary.UNITS_METRES);
+                                               if (distinMetres > 10.0) {
+                                                       currMediaStatus = MediaObject.Status.CONNECTED; // still connected but changed
+                                               }
+                                       }
+                                       mf.setCurrentStatus(currMediaStatus);
                                        media[currLink] = mf;
                                        // update progress
-                                       if (!_app.isBusyLoading())
+                                       if (!_app.isBusyLoading()) {
                                                progressDialog.showProgress(currLink, numLinks);
+                                       }
                                        currLink++;
                                }
                                try {Thread.sleep(100);} catch (InterruptedException ie) {}