support and set GPS wakelock for Firefox OS
[lantea.git] / js / map.js
index 490bfac9eb002836449a825af930d37dbb1522e2..f02386bc986190d4451ac5b1904745707d95acdb 100644 (file)
--- a/js/map.js
+++ b/js/map.js
@@ -75,7 +75,7 @@ var gMapPrefsLoaded = false;
 var gDragging = false;
 var gDragTouchID, gPinchStartWidth;
 
-var gGeoWatchID;
+var gGeoWatchID, gGPSWakeLock;
 var gTrack = [];
 var gLastTrackPoint, gLastDrawnPoint;
 var gCenterPosition = true;
@@ -108,8 +108,6 @@ function initMap() {
   }
   gTrackCanvas = document.getElementById("track");
   gTrackContext = gTrackCanvas.getContext("2d");
-  if (!gMap.activeMap)
-    gMap.activeMap = "osm_mapnik";
 
   //gDebug = true;
   if (gDebug) {
@@ -153,8 +151,6 @@ function loadPrefs(aEvent) {
       document.addEventListener("visibilitychange", visibilityEvHandler, false);
 
       console.log("Events added.");
-      document.getElementById("copyright").innerHTML =
-          gMapStyles[gMap.activeMap].copyright;
 
       console.log("Init loading tile...");
       gLoadingTile = new Image();
@@ -172,6 +168,21 @@ function loadPrefs(aEvent) {
       gAction.removeEventListener(aEvent.type, loadPrefs, false);
     gAction.addEventListener("prefs-step", loadPrefs, false);
     gWaitCounter++;
+    gPrefs.get("active_map_style", function(aValue) {
+      if (aValue && gMapStyles[aValue]) {
+        gMap.activeMap = aValue;
+      }
+      else {
+        gMap.activeMap = "osm_mapnik";
+      }
+      document.getElementById("mapSelector").value = gMap.activeMap;
+      document.getElementById("copyright").innerHTML =
+          gMapStyles[gMap.activeMap].copyright;
+      gWaitCounter--;
+      var throwEv = new CustomEvent("prefs-step");
+      gAction.dispatchEvent(throwEv);
+    });
+    gWaitCounter++;
     gPrefs.get("position", function(aValue) {
       if (aValue && aValue.x && aValue.y && aValue.z) {
         gMap.pos = aValue;
@@ -182,10 +193,12 @@ function loadPrefs(aEvent) {
     });
     gWaitCounter++;
     gPrefs.get("center_map", function(aValue) {
-      if (aValue === undefined)
+      if (aValue === undefined) {
         document.getElementById("centerCheckbox").checked = true;
-      else
+      }
+      else {
         document.getElementById("centerCheckbox").checked = aValue;
+      }
       setCentering(document.getElementById("centerCheckbox"));
       gWaitCounter--;
       var throwEv = new CustomEvent("prefs-step");
@@ -193,10 +206,12 @@ function loadPrefs(aEvent) {
     });
     gWaitCounter++;
     gPrefs.get("tracking_enabled", function(aValue) {
-      if (aValue === undefined)
+      if (aValue === undefined) {
         document.getElementById("trackCheckbox").checked = true;
-      else
+      }
+      else {
         document.getElementById("trackCheckbox").checked = aValue;
+      }
       gWaitCounter--;
       var throwEv = new CustomEvent("prefs-step");
       gAction.dispatchEvent(throwEv);
@@ -619,10 +634,13 @@ function setMapStyle() {
   var mapSel = document.getElementById("mapSelector");
   if (mapSel.selectedIndex >= 0 && gMap.activeMap != mapSel.value) {
     gMap.activeMap = mapSel.value;
+    gPrefs.set("active_map_style", gMap.activeMap);
     document.getElementById("copyright").innerHTML =
         gMapStyles[gMap.activeMap].copyright;
-    showUI();
-    gMap.draw();
+    if (!gWaitCounter) { // Only do this when prefs are loaded already.
+      showUI();
+      gMap.draw();
+    }
   }
 }
 
@@ -1101,6 +1119,9 @@ function startTracking() {
   if (gGeolocation) {
     gActionLabel.textContent = "Establishing Position";
     gAction.style.display = "block";
+    if (navigator.requestWakeLock) {
+      gGPSWakeLock = navigator.requestWakeLock("gps");
+    }
     gGeoWatchID = gGeolocation.watchPosition(
       function(position) {
         if (gActionLabel.textContent) {
@@ -1156,6 +1177,10 @@ function endTracking() {
     gActionLabel.textContent = "";
     gAction.style.display = "none";
   }
+  if (navigator.requestWakeLock && gGPSWakeLock) {
+    console.log("releasing WakeLock");
+    gGPSWakeLock.unlock();
+  }
   if (gGeoWatchID) {
     gGeolocation.clearWatch(gGeoWatchID);
   }