sync : Dynamic interval table for multi handle 20/98320/1 accepted/tizen/3.0/common/20161121.140604 accepted/tizen/3.0/ivi/20161121.073441 accepted/tizen/3.0/mobile/20161121.073348 accepted/tizen/3.0/tv/20161121.073400 accepted/tizen/3.0/wearable/20161121.073421 submit/tizen_3.0/20161117.071916
authorkj7.sung <kj7.sung@samsung.com>
Thu, 17 Nov 2016 05:14:23 +0000 (14:14 +0900)
committerkj7.sung <kj7.sung@samsung.com>
Thu, 17 Nov 2016 05:14:23 +0000 (14:14 +0900)
Change-Id: Ibfe81e4d8f5600f996fed888e247f9de0b9c4f9b
Signed-off-by: kj7.sung <kj7.sung@samsung.com>
location/manager/location-gps.c
location/manager/location-hybrid-mobile.c
location/manager/location-ielement.h
location/manager/location-passive.c
location/manager/location-signaling-util.c
location/manager/location-wps.c
location/manager/location.c
location/manager/location.h
packaging/liblbs-location.changes
packaging/liblbs-location.spec

index 1eee488..afc1f6b 100755 (executable)
@@ -45,22 +45,23 @@ typedef struct _LocationGpsPrivate {
        gboolean                        is_started;
        gboolean                        is_batch_invoked;
        gboolean                        is_mock;
-       guint                           app_type;
        gboolean                        set_noti;
        gboolean                        enabled;
        gint                            signal_type;
+       guint                           app_type;
        guint                           pos_updated_timestamp;
-       guint                           pos_interval;
        guint                           vel_updated_timestamp;
-       guint                           vel_interval;
        guint                           sat_updated_timestamp;
-       guint                           sat_interval;
        guint                           loc_updated_timestamp;
+       guint                           dist_updated_timestamp;
+       guint                           pos_interval;
+       guint                           vel_interval;
+       guint                           sat_interval;
        guint                           loc_interval;
+       guint                           optimized_interval;
        guint                           loc_timeout;
        guint                           batch_interval;
        guint                           batch_period;
-       guint                           dist_updated_timestamp;
        guint                           min_interval;
        gdouble                         min_distance;
        LocationPosition        *pos;
@@ -269,7 +270,7 @@ static void location_setting_gps_cb(keynode_t *key, gpointer self)
        } else if (1 == location_setting_get_key_val(key) && priv->mod->ops.start && !__get_started(self)) {
                LOCATION_LOGD("location resumed by setting");
                __set_started(self, TRUE);
-               ret = priv->mod->ops.start(priv->mod->handler, priv->pos_interval, gps_status_cb, gps_location_cb, gps_satellite_cb, self);
+               ret = priv->mod->ops.start(priv->mod->handler, priv->optimized_interval, gps_status_cb, gps_location_cb, gps_satellite_cb, self);
                if (ret != LOCATION_ERROR_NONE) {
                        __set_started(self, FALSE);
                        LOCATION_LOGI("Fail to start[%d]", ret);
@@ -296,7 +297,7 @@ static int location_gps_start(LocationGps *self)
                return LOCATION_ACCESS_DENIED;
        } else {
                __set_started(self, TRUE);
-               ret = priv->mod->ops.start(priv->mod->handler, priv->pos_interval, gps_status_cb, gps_location_cb, gps_satellite_cb, self);
+               ret = priv->mod->ops.start(priv->mod->handler, priv->optimized_interval, gps_status_cb, gps_location_cb, gps_satellite_cb, self);
                if (ret != LOCATION_ERROR_NONE) {
                        LOCATION_LOGE("Fail to start gps. Error[%d]", ret);
                        __set_started(self, FALSE);
@@ -306,7 +307,6 @@ static int location_gps_start(LocationGps *self)
 
        if (priv->app_type != CPPAPP && priv->set_noti == FALSE) {
                location_setting_add_notify(VCONFKEY_LOCATION_ENABLED, location_setting_gps_cb, self);
-
                location_state_add_notify(VCONFKEY_LOCATION_GPS_STATE, location_setting_search_cb, self);
                priv->set_noti = TRUE;
        }
@@ -563,6 +563,16 @@ static void location_gps_finalize(GObject *gobject)
        G_OBJECT_CLASS(location_gps_parent_class)->finalize(gobject);
 }
 
+static guint get_valid_interval(guint interval, int max_interval, int min_interval)
+{
+       if (interval > max_interval)
+               return (guint)max_interval;
+       else if (interval < min_interval)
+               return (guint)min_interval;
+       else
+               return interval;
+}
+
 static void location_gps_set_property(GObject *object, guint property_id, const GValue *value, GParamSpec *pspec)
 {
        LocationGpsPrivate *priv = GET_PRIVATE(object);
@@ -588,17 +598,10 @@ static void location_gps_set_property(GObject *object, guint property_id, const
        case PROP_POS_INTERVAL: {
                guint interval = g_value_get_uint(value);
                LOCATION_LOGD("Set prop>> PROP_POS_INTERVAL: %u", interval);
-               /* We don't need to set interval when new one is same as the previous one */
                if (interval == priv->pos_interval) break;
 
-               if (interval > 0) {
-                       if (interval < LOCATION_UPDATE_INTERVAL_MAX)
-                               priv->pos_interval = interval;
-                       else
-                               priv->pos_interval = (guint)LOCATION_UPDATE_INTERVAL_MAX;
-               } else {
-                       priv->pos_interval = (guint)LOCATION_UPDATE_INTERVAL_DEFAULT;
-               }
+               priv->pos_interval = get_valid_interval(interval, LOCATION_UPDATE_INTERVAL_MAX, LOCATION_UPDATE_INTERVAL_MIN);
+               priv->optimized_interval = priv->pos_interval;
 
                if (__get_started(object) == TRUE) {
                        LOCATION_LOGD("[update_pos_interval]: update pos-interval while pos-tracking");
@@ -611,54 +614,35 @@ static void location_gps_set_property(GObject *object, guint property_id, const
                guint interval = g_value_get_uint(value);
                LOCATION_LOGD("Set prop>> PROP_VEL_INTERVAL: %u", interval);
                if (interval == priv->vel_interval) break;
-
-               if (interval > 0) {
-                       if (interval < LOCATION_UPDATE_INTERVAL_MAX)
-                               priv->vel_interval = interval;
-                       else
-                               priv->vel_interval = (guint)LOCATION_UPDATE_INTERVAL_MAX;
-               } else {
-                       priv->vel_interval = (guint)LOCATION_UPDATE_INTERVAL_DEFAULT;
-               }
+               priv->vel_interval = get_valid_interval(interval, LOCATION_UPDATE_INTERVAL_MAX, LOCATION_UPDATE_INTERVAL_MIN);
                break;
        }
        case PROP_SAT_INTERVAL: {
                guint interval = g_value_get_uint(value);
                LOCATION_LOGD("Set prop>> PROP_SAT_INTERVAL: %u", interval);
-               if (interval > 0) {
-                       if (interval < LOCATION_UPDATE_INTERVAL_MAX)
-                               priv->sat_interval = interval;
-                       else
-                               priv->sat_interval = (guint)LOCATION_UPDATE_INTERVAL_MAX;
-               } else {
-                       priv->sat_interval = (guint)LOCATION_UPDATE_INTERVAL_DEFAULT;
-               }
+               priv->sat_interval = get_valid_interval(interval, LOCATION_UPDATE_INTERVAL_MAX, LOCATION_UPDATE_INTERVAL_MIN);
                break;
        }
        case PROP_LOC_INTERVAL: {
                guint interval = g_value_get_uint(value);
                LOCATION_LOGD("Set prop>> PROP_LOC_INTERVAL: %u", interval);
-               if (interval > 0) {
-                       if (interval < LOCATION_UPDATE_INTERVAL_MAX)
-                               priv->loc_interval = interval;
-                       else
-                               priv->loc_interval = (guint)LOCATION_UPDATE_INTERVAL_MAX;
-               } else {
-                       priv->loc_interval = (guint)LOCATION_UPDATE_INTERVAL_DEFAULT;
+               if (interval == priv->loc_interval) break;
+
+               priv->loc_interval = get_valid_interval(interval, LOCATION_UPDATE_INTERVAL_MAX, LOCATION_UPDATE_INTERVAL_MIN);
+               priv->optimized_interval = priv->loc_interval;
+
+               if (__get_started(object) == TRUE) {
+                       LOCATION_LOGD("[update_pos_interval]: update loc-interval while loc-tracking");
+                       g_return_if_fail(priv->mod->ops.set_position_update_interval);
+                       priv->mod->ops.set_position_update_interval(priv->mod->handler, priv->loc_interval);
                }
                break;
        }
        case PROP_BATCH_INTERVAL: {
                guint interval = g_value_get_uint(value);
                LOCATION_LOGD("Set prop>> PROP_BATCH_INTERVAL: %u", interval);
-               if (interval > 0) {
-                       if (interval < LOCATION_BATCH_INTERVAL_MAX)
-                               priv->batch_interval = interval;
-                       else
-                               priv->batch_interval = (guint)LOCATION_BATCH_INTERVAL_MAX;
-               } else {
-                       priv->batch_interval = (guint)LOCATION_UPDATE_INTERVAL_DEFAULT;
-               }
+
+               priv->batch_interval = interval;
 
                if (__get_started(object) == TRUE) {
                        LOCATION_LOGD("[update_batch_interval]: update batch-interval while pos-tracking");
@@ -670,41 +654,19 @@ static void location_gps_set_property(GObject *object, guint property_id, const
        case PROP_BATCH_PERIOD: {
                guint interval = g_value_get_uint(value);
                LOCATION_LOGD("Set prop>> PROP_BATCH_PERIOD: %u", interval);
-               if (interval > 0) {
-                       if (interval < LOCATION_BATCH_PERIOD_MAX)
-                               priv->batch_period = interval;
-                       else
-                               priv->batch_period = (guint)LOCATION_BATCH_PERIOD_MAX;
-               } else {
-                       priv->batch_period = (guint)LOCATION_BATCH_PERIOD_DEFAULT;
-               }
+               priv->batch_period = interval;
                break;
        }
        case PROP_MIN_INTERVAL: {
                guint interval = g_value_get_uint(value);
                LOCATION_LOGD("Set prop>> PROP_MIN_INTERVAL: %u", interval);
-               if (interval > 0) {
-                       if (interval < LOCATION_MIN_INTERVAL_MAX)
-                               priv->min_interval = interval;
-                       else
-                               priv->min_interval = (guint)LOCATION_MIN_INTERVAL_MAX;
-               } else {
-                       priv->min_interval = (guint)LOCATION_MIN_INTERVAL_DEFAULT;
-               }
+               priv->min_interval = interval;
                break;
        }
        case PROP_MIN_DISTANCE: {
                gdouble distance = g_value_get_double(value);
                LOCATION_LOGD("Set prop>> PROP_MIN_DISTANCE: %u", distance);
-               if (distance > 0) {
-                       if (distance < LOCATION_MIN_DISTANCE_MAX)
-                               priv->min_distance = distance;
-                       else
-                               priv->min_distance = (gdouble)LOCATION_MIN_DISTANCE_MAX;
-               } else {
-                       priv->min_distance = (gdouble)LOCATION_MIN_DISTANCE_DEFAULT;
-               }
-
+               priv->min_distance = distance;
                break;
        }
        case PROP_SERVICE_STATUS: {
@@ -971,7 +933,7 @@ location_gps_request_single_location(LocationGps *self, int timeout)
        int ret = LOCATION_ERROR_NONE;
 
        __set_started(self, TRUE);
-       ret = priv->mod->ops.start(priv->mod->handler, priv->pos_interval, gps_status_cb, gps_single_location_cb, NULL, self);
+       ret = priv->mod->ops.start(priv->mod->handler, LOCATION_UPDATE_INTERVAL_DEFAULT, gps_status_cb, gps_single_location_cb, NULL, self);
        if (ret != LOCATION_ERROR_NONE) {
                LOCATION_LOGE("Fail to start request single. Error[%d]", ret);
                __set_started(self, FALSE);
@@ -1151,6 +1113,7 @@ static void location_gps_init(LocationGps *self)
        priv->batch_interval = LOCATION_UPDATE_INTERVAL_DEFAULT;
        priv->batch_period = LOCATION_BATCH_PERIOD_DEFAULT;
        priv->min_interval = LOCATION_UPDATE_INTERVAL_NONE;
+       priv->optimized_interval = LOCATION_UPDATE_INTERVAL_DEFAULT;
 
        priv->pos_updated_timestamp = 0;
        priv->vel_updated_timestamp = 0;
@@ -1199,14 +1162,6 @@ static void location_gps_class_init(LocationGpsClass *klass)
                        G_STRUCT_OFFSET(LocationGpsClass, disabled),
                        NULL, NULL, location_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT);
 
-#if 0 /* TODO: STATUS_CHANGED will aggregate SERVICE_ENABLED and SERVICE_DISABLED */
-       signals[STATUS_CHANGED] =
-                       g_signal_new("status-changed", G_TYPE_FROM_CLASS(klass),
-                       G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE,
-                       G_STRUCT_OFFSET(LocationGpsClass, status_changed),
-                       NULL, NULL, location_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT);
-#endif
-
        signals[SERVICE_UPDATED] =
                        g_signal_new("service-updated", G_TYPE_FROM_CLASS(klass),
                        G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE,
index 2489f07..d3461fe 100755 (executable)
@@ -42,15 +42,15 @@ typedef struct _LocationHybridPrivate {
        gboolean                wps_enabled;
        gint                    signal_type;
        guint                   pos_updated_timestamp;
-       guint                   pos_interval;
        guint                   vel_updated_timestamp;
-       guint                   vel_interval;
        guint                   sat_updated_timestamp;
-       guint                   sat_interval;
        guint                   dist_updated_timestamp;
+       guint                   loc_updated_timestamp;
+       guint                   pos_interval;
+       guint                   vel_interval;
+       guint                   sat_interval;
        guint                   min_interval;
        gdouble                 min_distance;
-       guint                   loc_updated_timestamp;
        guint                   loc_interval;
        LocationObject  *gps;
        LocationObject  *wps;
@@ -431,55 +431,6 @@ hybrid_service_disabled(GObject *obj, guint status, gpointer self)
 
 }
 
-#if 0
-static void
-hybrid_status_changed(GObject *obj, guint status, gpointer self)
-{
-       LOCATION_LOGD("status = %d", status);
-       LocationHybridPrivate *priv = GET_PRIVATE((LocationHybrid *)self);
-       g_return_if_fail(priv);
-       GType g_type = G_TYPE_FROM_INSTANCE(obj);
-
-
-       switch (status) {
-       case LOCATION_STATUS_NO_FIX:
-                       if (g_type == LOCATION_TYPE_GPS) {
-                               priv->gps_enabled = FALSE;
-                       } else if (g_type == LOCATION_TYPE_WPS) {
-                               priv->wps_enabled = FALSE;
-                       } else {
-                               LOCATION_LOGW("Undefined GType disabled");
-                               return;
-                       }
-                       hybrid_get_update_method(priv);
-                       if (!priv->gps_enabled && !priv->wps_enabled)
-                               enable_signaling(self, signals, &(priv->enabled), FALSE, status);
-                       break;
-
-       case LOCATION_STATUS_2D_FIX:
-       case LOCATION_STATUS_3D_FIX:
-                       if (g_type == LOCATION_TYPE_GPS) {
-                               priv->gps_enabled = TRUE;
-                       } else if (g_type == LOCATION_TYPE_WPS) {
-                               priv->wps_enabled = TRUE;
-                       } else {
-                               LOCATION_LOGW("Undefined GType enabled");
-                               return;
-                       }
-                       hybrid_get_update_method(priv);
-                       break;
-
-       case LOCATION_STATUS_MOCK_SET:
-                       break;
-
-       default:
-                               LOCATION_LOGW("Undefined status");
-                       break;
-       }
-}
-#endif
-
-
 static int
 location_hybrid_start(LocationHybrid *self)
 {
@@ -598,18 +549,16 @@ location_hybrid_finalize(GObject *gobject)
        if (priv->gps) {
                g_signal_handlers_disconnect_by_func(priv->gps, G_CALLBACK(hybrid_service_enabled), gobject);
                g_signal_handlers_disconnect_by_func(priv->gps, G_CALLBACK(hybrid_service_disabled), gobject);
-               /* g_signal_handlers_disconnect_by_func(priv->gps, G_CALLBACK(hybrid_status_changed), gobject); */
                g_signal_handlers_disconnect_by_func(priv->gps, G_CALLBACK(hybrid_service_updated), gobject);
                g_signal_handlers_disconnect_by_func(priv->gps, G_CALLBACK(hybrid_location_updated), gobject);
-               location_free(priv->gps);
+               location_free(priv->gps, TRUE);
        }
        if (priv->wps) {
                g_signal_handlers_disconnect_by_func(priv->wps, G_CALLBACK(hybrid_service_enabled), gobject);
                g_signal_handlers_disconnect_by_func(priv->wps, G_CALLBACK(hybrid_service_disabled), gobject);
-               /* g_signal_handlers_disconnect_by_func(priv->wps, G_CALLBACK(hybrid_status_changed), gobject); */
                g_signal_handlers_disconnect_by_func(priv->wps, G_CALLBACK(hybrid_service_updated), gobject);
                g_signal_handlers_disconnect_by_func(priv->wps, G_CALLBACK(hybrid_location_updated), gobject);
-               location_free(priv->wps);
+               location_free(priv->wps, TRUE);
        }
 
        if (priv->boundary_list) {
@@ -1198,20 +1147,18 @@ location_hybrid_init(LocationHybrid *self)
        priv->pos_timer = 0;
        priv->vel_timer = 0;
 
-       if (location_is_supported_method(LOCATION_METHOD_GPS)) priv->gps = location_new(LOCATION_METHOD_GPS);
-       if (location_is_supported_method(LOCATION_METHOD_WPS)) priv->wps = location_new(LOCATION_METHOD_WPS);
+       if (location_is_supported_method(LOCATION_METHOD_GPS)) priv->gps = location_new(LOCATION_METHOD_GPS, TRUE);
+       if (location_is_supported_method(LOCATION_METHOD_WPS)) priv->wps = location_new(LOCATION_METHOD_WPS, TRUE);
 
        if (priv->gps) {
                g_signal_connect(priv->gps, "service-enabled", G_CALLBACK(hybrid_service_enabled), self);
                g_signal_connect(priv->gps, "service-disabled", G_CALLBACK(hybrid_service_disabled), self);
-               /* g_signal_connect(priv->gps, "status-changed", G_CALLBACK(hybrid_status_changed), self); */
                g_signal_connect(priv->gps, "service-updated", G_CALLBACK(hybrid_service_updated), self);
                g_signal_connect(priv->gps, "location-updated", G_CALLBACK(hybrid_location_updated), self);
        }
        if (priv->wps) {
                g_signal_connect(priv->wps, "service-enabled", G_CALLBACK(hybrid_service_enabled), self);
                g_signal_connect(priv->wps, "service-disabled", G_CALLBACK(hybrid_service_disabled), self);
-               /* g_signal_connect(priv->wps, "status-changed", G_CALLBACK(hybrid_status_changed), self); */
                g_signal_connect(priv->wps, "service-updated", G_CALLBACK(hybrid_service_updated), self);
                g_signal_connect(priv->wps, "location-updated", G_CALLBACK(hybrid_location_updated), self);
        }
@@ -1253,14 +1200,6 @@ location_hybrid_class_init(LocationHybridClass *klass)
                        G_STRUCT_OFFSET(LocationHybridClass, disabled),
                        NULL, NULL, location_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT);
 
-#if 0 /* TODO: STATUS_CHANGED will aggregate SERVICE_ENABLED and SERVICE_DISABLED */
-       signals[STATUS_CHANGED] =
-                       g_signal_new("status-changed", G_TYPE_FROM_CLASS(klass),
-                       G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE,
-                       G_STRUCT_OFFSET(LocationHybridClass, status_changed),
-                       NULL, NULL, location_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT);
-#endif
-
        signals[SERVICE_UPDATED] =
                        g_signal_new("service-updated", G_TYPE_FROM_CLASS(klass),
                        G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE,
index 7f30cf8..58f0b4b 100644 (file)
@@ -72,7 +72,6 @@ typedef int (*TYPE_STOP_BATCH)(LocationIElement *self);
 typedef int (*TYPE_GET_NMEA)(LocationIElement *self, char **nmea);
 
 /* Tizen 3.0 */
-typedef int (*TYPE_GET_STATUS)(LocationIElement *self, int *status);
 typedef int (*TYPE_SET_MOCK_LOCATION)(LocationIElement *self, const LocationPosition *position, const LocationVelocity *velocity, const LocationAccuracy *accuracy);
 typedef int (*TYPE_CLEAR_MOCK_LOCATION)(LocationIElement *self);
 
index 1663f86..f2400b8 100755 (executable)
@@ -49,13 +49,13 @@ typedef struct _LocationPassivePrivate {
        gboolean                        set_noti;
        gboolean                        enabled;
        guint                           pos_updated_timestamp;
-       guint                           pos_interval;
        guint                           vel_updated_timestamp;
-       guint                           vel_interval;
        guint                           loc_updated_timestamp;
+       guint                           dist_updated_timestamp;
+       guint                           pos_interval;
+       guint                           vel_interval;
        guint                           loc_interval;
        guint                           loc_timeout;
-       guint                           dist_updated_timestamp;
        guint                           min_interval;
        gdouble                         min_distance;
        LocationPosition        *pos;
@@ -661,14 +661,6 @@ static void location_passive_class_init(LocationPassiveClass *klass)
                        G_STRUCT_OFFSET(LocationPassiveClass, disabled),
                        NULL, NULL, location_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT);
 
-#if 0 /* TODO: STATUS_CHANGED will aggregate SERVICE_ENABLED and SERVICE_DISABLED */
-       signals[STATUS_CHANGED] =
-                       g_signal_new("status-changed", G_TYPE_FROM_CLASS(klass),
-                       G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE,
-                       G_STRUCT_OFFSET(LocationPassiveClass, status_changed),
-                       NULL, NULL, location_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT);
-#endif
-
        signals[SERVICE_UPDATED] =
                        g_signal_new("service-updated", G_TYPE_FROM_CLASS(klass),
                        G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE,
index adce2bb..bc96db2 100755 (executable)
@@ -40,19 +40,11 @@ enable_signaling(LocationObject *obj, guint32 signals[LAST_SIGNAL], gboolean *pr
                *prev_enabled = FALSE;
                LOCATION_LOGD("Signal emit: SERVICE_DISABLED, status = %d", status);
                g_signal_emit(obj, signals[SERVICE_DISABLED], 0, LOCATION_STATUS_NO_FIX);
-               /* g_signal_emit(obj, signals[STATUS_CHANGED], 0, LOCATION_STATUS_NO_FIX); */
        } else if (*prev_enabled == FALSE && enabled == TRUE) {
                *prev_enabled = TRUE;
                LOCATION_LOGD("Signal emit: SERVICE_ENABLED, status = %d", status);
                g_signal_emit(obj, signals[SERVICE_ENABLED], 0, status);
-               /* g_signal_emit(obj, signals[STATUS_CHANGED], 0, status); */
        }
-#if 0
-       } else if (*prev_enabled != enabled) {
-               LOCATION_LOGD("Signal emit: prev_enabled = %d, enabled = %d, status = %d", *prev_enabled, enabled, status);
-               /* g_signal_emit(obj, signals[STATUS_CHANGED], 0, status); */
-       }
-#endif
 }
 
 void
index 879497f..f96417f 100755 (executable)
@@ -50,13 +50,13 @@ typedef struct _LocationWpsPrivate {
        gboolean                        set_noti;
        gboolean                        enabled;
        guint                           pos_updated_timestamp;
-       guint                           pos_interval;
        guint                           vel_updated_timestamp;
-       guint                           vel_interval;
        guint                           loc_updated_timestamp;
+       guint                           dist_updated_timestamp;
+       guint                           pos_interval;
+       guint                           vel_interval;
        guint                           loc_interval;
        guint                           loc_timeout;
-       guint                           dist_updated_timestamp;
        guint                           min_interval;
        gdouble                         min_distance;
        LocationPosition        *pos;
@@ -832,14 +832,6 @@ location_wps_class_init(LocationWpsClass *klass)
                        G_STRUCT_OFFSET(LocationWpsClass, disabled),
                        NULL, NULL, location_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT);
 
-#if 0 /* TODO: STATUS_CHANGED will aggregate SERVICE_ENABLED and SERVICE_DISABLED */
-       signals[STATUS_CHANGED] =
-                       g_signal_new("status-changed", G_TYPE_FROM_CLASS(klass),
-                       G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE,
-                       G_STRUCT_OFFSET(LocationWpsClass, status_changed),
-                       NULL, NULL, location_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT);
-#endif
-
        signals[SERVICE_UPDATED] =
                        g_signal_new("service-updated", G_TYPE_FROM_CLASS(klass),
                        G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE,
index e84decb..fa83b32 100755 (executable)
 #include "location-privacy.h"
 #endif
 
-#define LOCATION_PRIVILEGE     "http://tizen.org/privilege/location"
+#define LOCATION_PRIVILEGE                     "http://tizen.org/privilege/location"
 #define LOCATION_ENABLE_PRIVILEGE      "http://tizen.org/privilege/location.enable"
+#define HYBRID 2
 
 typedef struct _LocationSetting {
        LocationSettingCb callback;
        void *user_data;
 } LocationSetting;
 
+enum {
+       _METHOD_HYBRID = 0,
+       _METHOD_GPS_1,
+       _METHOD_GPS_2,
+       _METHOD_WPS_1,
+       _METHOD_WPS_2,
+       _METHOD_MAX
+};
+
 static LocationSetting g_location_setting;
+static bool is_method_created[_METHOD_MAX] = {false};
 
 static char *__convert_setting_key(LocationMethod method)
 {
@@ -119,20 +130,53 @@ int location_init(void)
 }
 
 EXPORT_API LocationObject *
-location_new(LocationMethod method)
+location_new(LocationMethod method, gboolean is_internal_for_hybrid)
 {
        LocationObject *self = NULL;
-       LOCATION_LOGD("method: %d", method);
+       LOCATION_LOGD("method : %d, is_internal_for_hybrid[%d]", method, is_internal_for_hybrid);
 
        switch (method) {
        case LOCATION_METHOD_HYBRID:
-               self = g_object_new(LOCATION_TYPE_HYBRID, NULL);
+               if (is_method_created[_METHOD_HYBRID]) {
+                       LOCATION_LOGE("Hybrid handle already exist.");
+               } else {
+                       self = g_object_new(LOCATION_TYPE_HYBRID, NULL);
+                       is_method_created[_METHOD_HYBRID] = true;
+               }
                break;
        case LOCATION_METHOD_GPS:
-               self = g_object_new(LOCATION_TYPE_GPS, NULL);
+               if (is_internal_for_hybrid) {
+                       if (is_method_created[_METHOD_GPS_2]) {
+                               LOCATION_LOGD("Hybrid(GPS) handle already exist.");
+                       } else {
+                               is_method_created[_METHOD_GPS_2] = true;
+                               self = g_object_new(LOCATION_TYPE_GPS, NULL);
+                       }
+               } else {
+                       if (is_method_created[_METHOD_GPS_1]) {
+                               LOCATION_LOGE("GPS handle already exist.");
+                       } else {
+                               is_method_created[_METHOD_GPS_1] = true;
+                               self = g_object_new(LOCATION_TYPE_GPS, NULL);
+                       }
+               }
                break;
        case LOCATION_METHOD_WPS:
-               self = g_object_new(LOCATION_TYPE_WPS, NULL);
+               if (is_internal_for_hybrid) {
+                       if (is_method_created[_METHOD_WPS_2]) {
+                               LOCATION_LOGD("Hybrid(WPS) handle already exist.");
+                       } else {
+                               is_method_created[_METHOD_WPS_2] = true;
+                               self = g_object_new(LOCATION_TYPE_WPS, NULL);
+                       }
+               } else {
+                       if (is_method_created[_METHOD_WPS_1]) {
+                               LOCATION_LOGE("WPS handle already exist.");
+                       } else {
+                               is_method_created[_METHOD_WPS_1] = true;
+                               self = g_object_new(LOCATION_TYPE_WPS, NULL);
+                       }
+               }
                break;
        case LOCATION_METHOD_PASSIVE:
                self = g_object_new(LOCATION_TYPE_PASSIVE, NULL);
@@ -146,9 +190,22 @@ location_new(LocationMethod method)
 }
 
 EXPORT_API int
-location_free(LocationObject *obj)
+location_free(LocationObject *obj, gboolean is_internal_for_hybrid)
 {
        g_return_val_if_fail(obj, LOCATION_ERROR_PARAMETER);
+       if (G_OBJECT_TYPE(obj) == LOCATION_TYPE_HYBRID) {
+               is_method_created[_METHOD_HYBRID] = false;
+       } else if (G_OBJECT_TYPE(obj) == LOCATION_TYPE_GPS) {
+               if (is_internal_for_hybrid)
+                       is_method_created[_METHOD_GPS_2] = false;
+               else
+                       is_method_created[_METHOD_GPS_1] = false;
+       } else if (G_OBJECT_TYPE(obj) == LOCATION_TYPE_WPS) {
+               if (is_internal_for_hybrid)
+                       is_method_created[_METHOD_WPS_2] = false;
+               else
+                       is_method_created[_METHOD_WPS_1] = false;
+       }
        g_object_unref(obj);
        return LOCATION_ERROR_NONE;
 }
index 9e37dce..022493f 100755 (executable)
@@ -72,7 +72,7 @@ int location_init(void);
  * @retval NULL                        if error occured
  * @see location_free
  */
-LocationObject *location_new(LocationMethod method);
+LocationObject *location_new(LocationMethod method, gboolean is_internal_for_hybrid);
 
 /**
  * @brief Free memory of given #LocationObject.
@@ -84,7 +84,7 @@ LocationObject *location_new(LocationMethod method);
  * @retval 0                                                   Success.
  * Please refer #LocationError for more information.
  */
-int location_free(LocationObject *obj);
+int location_free(LocationObject *obj, gboolean is_internal_for_hybrid);
 
 /**
  * @brief Start the location service by using given #LocationObject.
index fb77254..46169db 100644 (file)
@@ -1,3 +1,9 @@
+[Version]      libslp-location_1.3.5
+[Date]         28 Oct 2016
+[Changes]      Dynamic interval table for multi handle
+[Developer]    Kyoungjun Sung <kj7.sung@samsung.com>
+
+================================================================================
 [Version]      libslp-location_1.3.4
 [Date]         6 Sep 2016
 [Changes]      Passive location
index af4da08..e29c2cf 100755 (executable)
@@ -1,6 +1,6 @@
 Name: liblbs-location
 Summary: Location Based Service Library
-Version: 1.3.4
+Version: 1.3.5
 Release: 1
 Group: Location/Libraries
 License: Apache-2.0