Merge "Update the location tracker test app"
diff --git a/tests/LocationTracker/res/values/strings.xml b/tests/LocationTracker/res/values/strings.xml
index ea6bf2d..60a2912 100644
--- a/tests/LocationTracker/res/values/strings.xml
+++ b/tests/LocationTracker/res/values/strings.xml
@@ -16,15 +16,14 @@
 * limitations under the License.
 */
 -->
-
 <resources>
     <string name="start_service_menu">Start Service</string>
     <string name="stop_service_menu">Stop Service</string>
     <string name="settings_menu">Settings</string>
     <string name="update_preference">Update frequency</string>
-    <string name="title_mintime_preference">Minimum update time</string>
-    <string name="summary_mintime_preference">The suggested minimum time interval for location updates, in seconds</string>
-    <string name="dialog_title_mintime_preference">Minimum update time</string>
+    <string name="title_update_preference">Update Interval (seconds)</string>
+    <string name="summary_update_preference">The suggested time interval for location updates, in seconds</string>
+    <string name="dialog_update_preference">Update Interval (seconds)</string>
     <string name="title_mindistance_preference">Minimum distance</string>
     <string name="summary_mindistance_preference">Minimum distance interval for location updates, in meters</string>
     <string name="dialog_title_mindistance_preference">Minimum distance</string>
@@ -45,4 +44,17 @@
     <string name="clear_data">Clear data</string>
     <string name="delete_confirm">All current tracking data will be deleted.</string>
     <string name="confirm_title">Clear data</string>
-</resources>
+    <string name="title_power_preference">Power Consumption</string>
+    <string name="summary_power_preference">Select "High" for high accuracy location updates. Select "Low" will avoid high power location work where possible. Select "None" will receive location updates triggered by other applications. </string>
+    <string name="dialog_power_preference">Power Consumption</string>
+    <string-array name="powerList">
+        <item >High</item>
+        <item >Low</item>
+        <item >None</item>
+    </string-array>
+        <string-array name="powerValues">
+        <item >203</item>
+        <item >201</item>
+        <item >200</item>
+    </string-array>
+</resources>
\ No newline at end of file
diff --git a/tests/LocationTracker/res/xml/preferences.xml b/tests/LocationTracker/res/xml/preferences.xml
index 61d4817..bd7f504 100755
--- a/tests/LocationTracker/res/xml/preferences.xml
+++ b/tests/LocationTracker/res/xml/preferences.xml
@@ -21,15 +21,16 @@
     <PreferenceCategory android:title="@string/update_preference">
         <EditTextPreference android:key="mintime_preference"
             android:defaultValue="0"
-            android:title="@string/title_mintime_preference"
-            android:summary="@string/summary_mintime_preference"
-            android:dialogTitle="@string/dialog_title_mintime_preference" />
+            android:title="@string/title_update_preference"
+            android:summary="@string/summary_update_preference"
+            android:dialogTitle="@string/dialog_update_preference" />
 
-        <EditTextPreference android:key="mindistance_preference"
-            android:defaultValue="0"
-            android:title="@string/title_mindistance_preference"
-            android:summary="@string/summary_mindistance_preference"
-            android:dialogTitle="@string/dialog_title_mindistance_preference" />
+   <ListPreference android:key="power_preference"
+            android:title="@string/title_power_preference"
+            android:summary="@string/summary_power_preference"
+            android:defaultValue="203"
+            android:entries="@array/powerList"
+            android:entryValues="@array/powerValues"/>
 
     </PreferenceCategory>
 
diff --git a/tests/LocationTracker/src/com/android/locationtracker/TrackerActivity.java b/tests/LocationTracker/src/com/android/locationtracker/TrackerActivity.java
index 4cfdf6c..835e584 100644
--- a/tests/LocationTracker/src/com/android/locationtracker/TrackerActivity.java
+++ b/tests/LocationTracker/src/com/android/locationtracker/TrackerActivity.java
@@ -16,17 +16,12 @@
 
 package com.android.locationtracker;
 
-import com.android.locationtracker.data.DateUtils;
-import com.android.locationtracker.data.TrackerDataHelper;
-import com.android.locationtracker.data.TrackerListHelper;
-
 import android.app.AlertDialog;
 import android.app.ListActivity;
 import android.content.DialogInterface;
 import android.content.DialogInterface.OnClickListener;
 import android.content.Intent;
 import android.database.Cursor;
-import android.location.LocationManager;
 import android.os.Bundle;
 import android.os.Environment;
 import android.util.Log;
@@ -35,6 +30,10 @@
 import android.view.MenuItem;
 import android.widget.Toast;
 
+import com.android.locationtracker.data.DateUtils;
+import com.android.locationtracker.data.TrackerDataHelper;
+import com.android.locationtracker.data.TrackerListHelper;
+
 import java.io.BufferedWriter;
 import java.io.File;
 import java.io.FileWriter;
@@ -160,12 +159,8 @@
 
     private void exportKML() {
         String exportFileName = getUniqueFileName(
-                LocationManager.NETWORK_PROVIDER + ".kml");
-        exportFile(LocationManager.NETWORK_PROVIDER, exportFileName,
-                new TrackerDataHelper(this, TrackerDataHelper.KML_FORMATTER));
-        exportFileName = getUniqueFileName(
-                LocationManager.GPS_PROVIDER + ".kml");
-        exportFile(LocationManager.GPS_PROVIDER, exportFileName,
+                "fused" + ".kml");
+        exportFile(null, exportFileName,
                 new TrackerDataHelper(this, TrackerDataHelper.KML_FORMATTER));
     }
 
diff --git a/tests/LocationTracker/src/com/android/locationtracker/TrackerService.java b/tests/LocationTracker/src/com/android/locationtracker/TrackerService.java
index e2332bf..844d13f 100644
--- a/tests/LocationTracker/src/com/android/locationtracker/TrackerService.java
+++ b/tests/LocationTracker/src/com/android/locationtracker/TrackerService.java
@@ -16,8 +16,6 @@
 
 package com.android.locationtracker;
 
-import com.android.locationtracker.data.TrackerDataHelper;
-
 import android.app.Service;
 import android.content.BroadcastReceiver;
 import android.content.Context;
@@ -28,6 +26,7 @@
 import android.location.Location;
 import android.location.LocationListener;
 import android.location.LocationManager;
+import android.location.LocationRequest;
 import android.net.ConnectivityManager;
 import android.net.wifi.ScanResult;
 import android.net.wifi.WifiManager;
@@ -43,10 +42,9 @@
 import android.util.Log;
 import android.widget.Toast;
 
-import java.util.ArrayList;
-import java.util.HashSet;
+import com.android.locationtracker.data.TrackerDataHelper;
+
 import java.util.List;
-import java.util.Set;
 
 /**
  * Location Tracking service
@@ -56,13 +54,10 @@
  */
 public class TrackerService extends Service {
 
-    private List<LocationTrackingListener> mListeners;
+    private LocationTrackingListener mListener;
 
     private static final String LOG_TAG = TrackerActivity.LOG_TAG;
 
-    // controls which location providers to track
-    private Set<String> mTrackedProviders;
-
     private TrackerDataHelper mTrackerData;
 
     private TelephonyManager mTelephonyManager;
@@ -79,7 +74,7 @@
 
     // preference constants
     private static final String MIN_TIME_PREF = "mintime_preference";
-    private static final String MIN_DIS_PREF = "mindistance_preference";
+    private static final String POWER_PREF = "power_preference";
     private static final String GPS_PREF = "gps_preference";
     private static final String NETWORK_PREF = "network_preference";
     private static final String SIGNAL_PREF = "signal_preference";
@@ -103,43 +98,34 @@
      * @param startId
      */
     @Override
-    public void onStart(Intent intent, int startId) {
-        super.onStart(intent, startId);
+    public int onStartCommand(Intent intent, int flags, int startId) {
         mNetworkLocation = null;
 
         initLocationListeners();
         Toast.makeText(this, "Tracking service started", Toast.LENGTH_SHORT);
+        return START_STICKY;
     }
 
     private synchronized void initLocationListeners() {
         mTrackerData = new TrackerDataHelper(this);
+
+        mListener = new LocationTrackingListener();
         LocationManager lm = getLocationManager();
 
-        mTrackedProviders = getTrackedProviders();
-
-        List<String> locationProviders = lm.getAllProviders();
-        mListeners = new ArrayList<LocationTrackingListener>(
-                locationProviders.size());
-
         long minUpdateTime = getLocationUpdateTime();
-        float minDistance = getLocationMinDistance();
-
-        for (String providerName : locationProviders) {
-            if (mTrackedProviders.contains(providerName)) {
-                Log.d(LOG_TAG, "Adding location listener for provider " +
-                        providerName);
-                if (doDebugLogging()) {
-                    mTrackerData.writeEntry("init", String.format(
-                            "start listening to %s : %d ms; %f meters",
-                            providerName, minUpdateTime, minDistance));
-                }    
-                LocationTrackingListener listener =
-                    new LocationTrackingListener();
-                lm.requestLocationUpdates(providerName, minUpdateTime,
-                        minDistance, listener);
-                mListeners.add(listener);
-            }
+        int powerConsumption = getPowerConsumption();
+        LocationRequest lr = LocationRequest.create();
+        lr.setInterval(minUpdateTime);
+        lr.setQuality(powerConsumption);
+        if (doDebugLogging()) {
+            mTrackerData.writeEntry("init", String.format(
+                    "start listening to location update : %d ms; %d power consumption",
+                     minUpdateTime, powerConsumption));
         }
+        Log.d(LOG_TAG, "Adding location listener");
+        lm.requestLocationUpdates(lr, mListener, null);
+
+
         mTelephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
 
         if (doDebugLogging()) {
@@ -168,30 +154,10 @@
         getPreferences().registerOnSharedPreferenceChangeListener(mPrefListener);
     }
 
-    private Set<String> getTrackedProviders() {
-        Set<String> providerSet = new HashSet<String>();
-
-        if (trackGPS()) {
-            providerSet.add(LocationManager.GPS_PROVIDER);
-        }
-        if (trackNetwork()) {
-            providerSet.add(LocationManager.NETWORK_PROVIDER);
-        }
-        return providerSet;
-    }
-
     private SharedPreferences getPreferences() {
         return PreferenceManager.getDefaultSharedPreferences(this);
     }
 
-    private boolean trackNetwork() {
-        return getPreferences().getBoolean(NETWORK_PREF, true);
-    }
-
-    private boolean trackGPS() {
-        return getPreferences().getBoolean(GPS_PREF, true);
-    }
-
     private boolean doDebugLogging() {
         return getPreferences().getBoolean(DEBUG_PREF, false);
     }
@@ -200,17 +166,6 @@
         return getPreferences().getBoolean(SIGNAL_PREF, false);
     }
 
-    private float getLocationMinDistance() {
-        try {
-            String disString = getPreferences().getString(MIN_DIS_PREF, "0");
-            return Float.parseFloat(disString);
-        }
-        catch (NumberFormatException e) {
-            Log.e(LOG_TAG, "Invalid preference for location min distance", e);
-        }
-        return 0;
-    }
-
     private long getLocationUpdateTime() {
         try {
             String timeString = getPreferences().getString(MIN_TIME_PREF, "0");
@@ -223,6 +178,15 @@
         return 0;
     }
 
+    private int getPowerConsumption(){
+        try {
+            String power = getPreferences().getString(POWER_PREF, "203");
+            return Integer.valueOf(power);
+        } catch (NumberFormatException e) {
+            Log.e(LOG_TAG, "Invalid preference for power consumption", e);
+        }
+        return 203; //high
+    }
     /**
      * Shuts down this service
      */
@@ -239,19 +203,17 @@
      */
     protected synchronized void stopListeners() {
         LocationManager lm = getLocationManager();
-        if (mListeners != null) {
-            for (LocationTrackingListener listener : mListeners) {
-                lm.removeUpdates(listener);
-            }
-            mListeners.clear();
+        if (mListener != null) {
+            lm.removeUpdates(mListener);
         }
-        mListeners = null;
+
+        mListener = null;
 
         // stop cell state listener
         if (mTelephonyManager != null) {
             mTelephonyManager.listen(mPhoneStateListener, 0);
-        }    
-        
+        }
+
         // stop network/wifi listener
         if (mNetwork != null) {
             unregisterReceiver(mNetwork);
@@ -318,7 +280,7 @@
 
         /**
          * Writes update to tracking file
-         * 
+         *
          * @param provider - name of enabled provider
          */
         public void onProviderEnabled(String provider) {
@@ -328,8 +290,8 @@
         }
 
         /**
-         * Writes update to tracking file 
-         * 
+         * Writes update to tracking file
+         *
          * @param provider - name of provider whose status changed
          * @param status - new status
          * @param extras - optional set of extra status messages
@@ -366,6 +328,7 @@
             }
         }
 
+        @Override
         public void onSignalStrengthsChanged(SignalStrength signalStrength) {
             if (mTelephonyManager.getPhoneType() == TelephonyManager.PHONE_TYPE_CDMA) {
                 String updateMsg = "cdma dBM=" + signalStrength.getCdmaDbm();