Add more parameters to set_position_mode, notify framework of our capabilities.

Change-Id: Ie53106b89030d48187d17be47482a3c74b837f3e
Signed-off-by: Mike Lockwood <lockwood@android.com>
diff --git a/loc_api/libloc_api/loc_eng.cpp b/loc_api/libloc_api/loc_eng.cpp
index 46827ef..f49e80d 100755
--- a/loc_api/libloc_api/loc_eng.cpp
+++ b/loc_api/libloc_api/loc_eng.cpp
@@ -66,7 +66,8 @@
 static int  loc_eng_init(GpsCallbacks* callbacks);
 static int  loc_eng_start();
 static int  loc_eng_stop();
-static int  loc_eng_set_position_mode(GpsPositionMode mode, int fix_frequency);
+static int  loc_eng_set_position_mode(GpsPositionMode mode, GpsPositionRecurrence recurrence,
+            uint32_t min_interval, uint32_t preferred_accuracy, uint32_t preferred_time);
 static void loc_eng_cleanup();
 static int  loc_eng_inject_time(GpsUtcTime time, int64_t timeReference, int uncertainty);
 static int  loc_eng_inject_location(double latitude, double longitude, float accuracy);
@@ -178,6 +179,8 @@
     // Start the LOC api RPC service
     loc_api_glue_init ();
 
+    callbacks->set_capabilities_cb(GPS_CAPABILITY_SCHEDULING | GPS_CAPABILITY_MSA | GPS_CAPABILITY_MSB);
+
     memset (&loc_eng_data, 0, sizeof (loc_eng_data_s_type));
 
     // LOC ENG module data initialization
@@ -379,7 +382,7 @@
 FUNCTION    loc_eng_set_position_mode
 
 DESCRIPTION
-   Sets the mode and fix frequnecy (in seconds) for the tracking session.
+   Sets the mode and fix frequency for the tracking session.
 
 DEPENDENCIES
    None
@@ -391,37 +394,56 @@
    N/A
 
 ===========================================================================*/
-static int loc_eng_set_position_mode(GpsPositionMode mode, int fix_frequency)
+static int loc_eng_set_position_mode(GpsPositionMode mode, GpsPositionRecurrence recurrence,
+            uint32_t min_interval, uint32_t preferred_accuracy, uint32_t preferred_time)
 {
     rpc_loc_ioctl_data_u_type    ioctl_data;
     rpc_loc_fix_criteria_s_type *fix_criteria_ptr;
     boolean                      ret_val;
 
     LOGD ("loc_eng_set_position mode, client = %d, interval = %d, mode = %d\n",
-            (int32) loc_eng_data.client_handle, fix_frequency, mode);
+            (int32) loc_eng_data.client_handle, min_interval, mode);
 
     loc_eng_data.position_mode = mode;
     ioctl_data.disc = RPC_LOC_IOCTL_SET_FIX_CRITERIA;
 
     fix_criteria_ptr = &(ioctl_data.rpc_loc_ioctl_data_u_type_u.fix_criteria);
-    fix_criteria_ptr->valid_mask = RPC_LOC_FIX_CRIT_VALID_MIN_INTERVAL |
-                                   RPC_LOC_FIX_CRIT_VALID_PREFERRED_OPERATION_MODE |
+    fix_criteria_ptr->valid_mask = RPC_LOC_FIX_CRIT_VALID_PREFERRED_OPERATION_MODE |
                                    RPC_LOC_FIX_CRIT_VALID_RECURRENCE_TYPE;
-    fix_criteria_ptr->min_interval = fix_frequency * 1000; // Translate to ms
-    fix_criteria_ptr->recurrence_type = RPC_LOC_PERIODIC_FIX;
 
-    if (mode == GPS_POSITION_MODE_MS_BASED)
-    {
-        fix_criteria_ptr->preferred_operation_mode = RPC_LOC_OPER_MODE_MSB;
+    switch (mode) {
+        case GPS_POSITION_MODE_MS_BASED:
+            fix_criteria_ptr->preferred_operation_mode = RPC_LOC_OPER_MODE_MSB;
+            break;
+        case GPS_POSITION_MODE_MS_ASSISTED:
+            fix_criteria_ptr->preferred_operation_mode = RPC_LOC_OPER_MODE_MSA;
+            break;
+        case GPS_POSITION_MODE_STANDALONE:
+        default:
+            fix_criteria_ptr->preferred_operation_mode = RPC_LOC_OPER_MODE_STANDALONE;
+            break;
     }
-    else if (mode == GPS_POSITION_MODE_MS_ASSISTED)
-    {
-        fix_criteria_ptr->preferred_operation_mode = RPC_LOC_OPER_MODE_MSA;
+    if (min_interval > 0) {
+        fix_criteria_ptr->min_interval = min_interval;
+        fix_criteria_ptr->valid_mask |= RPC_LOC_FIX_CRIT_VALID_MIN_INTERVAL;
     }
-    // Default: standalone
-    else
-    {
-        fix_criteria_ptr->preferred_operation_mode = RPC_LOC_OPER_MODE_STANDALONE;
+    if (preferred_accuracy > 0) {
+        fix_criteria_ptr->preferred_accuracy = preferred_accuracy;
+        fix_criteria_ptr->valid_mask |= RPC_LOC_FIX_CRIT_VALID_PREFERRED_ACCURACY;
+    }
+    if (preferred_time > 0) {
+        fix_criteria_ptr->preferred_response_time = preferred_time;
+        fix_criteria_ptr->valid_mask |= RPC_LOC_FIX_CRIT_VALID_PREFERRED_RESPONSE_TIME;
+    }
+
+    switch (recurrence) {
+        case GPS_POSITION_RECURRENCE_SINGLE:
+            fix_criteria_ptr->recurrence_type = RPC_LOC_SINGLE_FIX;
+            break;
+        case GPS_POSITION_RECURRENCE_PERIODIC:
+        default:
+            fix_criteria_ptr->recurrence_type = RPC_LOC_PERIODIC_FIX;
+            break;
     }
 
     ret_val = loc_eng_ioctl(loc_eng_data.client_handle,