Geofence3 Sample Overview

Mobile native

The Geofence sample application demonstrates how to manage fences and places using the Geofence API.

The following figure illustrates the main view of the Geofence.

Figure: Geofence main view

Geofence main view

In the application main view, you can manage geofences. You can, for example, create a fence, get the fence status, and add and remove fences and places.

Prerequisites

To ensure proper application execution, the following privilege must be set:

  • http://tizen.org/privilege/location

Implementation

Application Main View

To create the application main view:

  1. In the view_create() function, create the window, conformant, naviframe, and grid:

    Eina_Bool
    view_create(void *user_data)
    {
        /* Create the window */
        s_info.win = view_create_win(PACKAGE);
        if (s_info.win == NULL) {
            dlog_print(DLOG_ERROR, LOG_TAG, "failed to create a window.");
    
            return EINA_FALSE;
        }
    
        /* Create the conformant */
        s_info.conform = view_create_conformant_without_indicator(s_info.win);
        if (s_info.conform == NULL) {
            dlog_print(DLOG_ERROR, LOG_TAG, "failed to create a conformant");
    
            return EINA_FALSE;
        }
    
        /* Create the naviframe */
        s_info.nf = view_create_naviframe(s_info.conform);
        if (s_info.nf == NULL) {
            dlog_print(DLOG_ERROR, LOG_TAG, "failed to create a naviframe");
    
            return EINA_FALSE;
        }
    
        /* Create the grid and grid content */
        Evas_Object *grid = view_create_grid_and_content(s_info.nf, (appdata_s *)user_data);
        if (grid == NULL) {
            dlog_print(DLOG_ERROR, LOG_TAG, "failed to create a grid");
    
            return EINA_FALSE;
        }
    
        /* Push an item to the naviframe */
        Elm_Object_Item *nf_it = elm_naviframe_item_push(s_info.nf, "Geofence", NULL, NULL, grid, NULL);
        elm_naviframe_item_pop_cb_set(nf_it, naviframe_pop_cb, NULL);
    
        /* Show the window after the main view is set up */
        evas_object_show(s_info.win);
    
        return EINA_TRUE;
    }
    
  2. The view_create_grid_and_content() function creates a panel for 10 buttons and 3 entries for displaying the result:

    static Evas_Object*
    view_create_grid_and_content(Evas_Object *nf, appdata_s *ad)
    {
        /* Create and initialize elm_grid */
        Evas_Object *grid = NULL;
    
        if (nf == NULL) {
            dlog_print(DLOG_ERROR, LOG_TAG, "naviframe is NULL.");
    
            return NULL;
        }
    
        grid = elm_grid_add(nf);
        evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
        evas_object_size_hint_align_set(grid, EVAS_HINT_FILL, EVAS_HINT_FILL);
        elm_object_content_set(nf, grid);
    
        /* Entry for the API name */
        s_info.entry = create_entry(grid);
        elm_grid_pack(grid, s_info.entry, 0, 5, 90, 10);
    
        /* Entry for the API result */
        s_info.event_entry = create_entry(grid);
        elm_grid_pack(grid, s_info.event_entry, 0, 15, 90, 10);
    
        /* Entry for the fence state */
        s_info.state_entry = create_entry(grid);
        elm_grid_pack(grid, s_info.state_entry, 0, 25, 90, 10);
    
        /* Entry for the proximity state */
        s_info.proximity_entry = create_entry(grid);
        elm_grid_pack(grid, s_info.proximity_entry, 0, 35, 90, 10);
    
        /* Create the panel */
        Evas_Object *panel = create_panel_and_content(grid, ad);
        elm_grid_pack(grid, panel, 0, 55, 100, 45);
    
        return grid;
    }
    
  3. The create_panel_basic_content() function creates 10 buttons:

    static Evas_Object*
    create_panel_basic_content(Evas_Object *panel, appdata_s *ad)
    {
        /* Create and initialize elm_table */
        Evas_Object *table;
    
        if (panel == NULL) {
            dlog_print(DLOG_ERROR, LOG_TAG, "panel is NULL.");
    
            return NULL;
        }
    
        table = elm_table_add(parent);
        elm_table_padding_set(table, 10, 0);
    
        /* Create the buttons */
    
        /* "Create" button */
        ad->create_btn = elm_button_add(table);
        evas_object_size_hint_weight_set(ad->create_btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
        evas_object_size_hint_align_set(ad->create_btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
        elm_object_text_set(ad->create_btn, "<font_size=30>Create</font_size>");
        elm_object_disabled_set(ad->create_btn, EINA_FALSE);
        evas_object_smart_callback_add(ad->create_btn, "clicked", clicked_create_cb, ad);
        evas_object_show(ad->create_btn);
        elm_table_pack(table, ad->create_btn, 0, 0, 1, 1);
    
        /* "Fence Status" button */
        ad->fence_status_btn = elm_button_add(table);
        evas_object_size_hint_weight_set(ad->fence_status_btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
        evas_object_size_hint_align_set(ad->fence_status_btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
        elm_object_text_set(ad->fence_status_btn, "<font_size=30>Fence Status</font_size>");
        elm_object_disabled_set(ad->fence_status_btn, EINA_TRUE);
        evas_object_smart_callback_add(ad->fence_status_btn, "clicked", show_popup_cb, ad);
        evas_object_show(ad->fence_status_btn);
        elm_table_pack(table, ad->fence_status_btn, 1, 0, 1, 1);
    
        /* "Add Fence" button */
        ad->add_fence_btn = elm_button_add(table);
        evas_object_size_hint_weight_set(ad->add_fence_btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
        evas_object_size_hint_align_set(ad->add_fence_btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
        elm_object_text_set(ad->add_fence_btn, "<font_size=30>Add Fence</font_size>");
        elm_object_disabled_set(ad->add_fence_btn, EINA_TRUE);
        evas_object_smart_callback_add(ad->add_fence_btn, "clicked", show_popup_cb, ad);
        evas_object_show(ad->add_fence_btn);
        elm_table_pack(table, ad->add_fence_btn, 0, 1, 1, 1);
    
        /* "Add Place" button */
        ad->add_place_btn = elm_button_add(table);
        evas_object_size_hint_weight_set(ad->add_place_btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
        evas_object_size_hint_align_set(ad->add_place_btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
        elm_object_text_set(ad->add_place_btn, "<font_size=30>Add Place</font_size>");
        elm_object_disabled_set(ad->add_place_btn, EINA_TRUE);
        evas_object_smart_callback_add(ad->add_place_btn, "clicked", show_popup_cb, ad);
        evas_object_show(ad->add_place_btn);
        elm_table_pack(table, ad->add_place_btn, 1, 1, 1, 1);
    
        /* "Start" button */
        ad->start_btn = elm_button_add(table);
        evas_object_size_hint_weight_set(ad->start_btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
        evas_object_size_hint_align_set(ad->start_btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
        elm_object_text_set(ad->start_btn, "<font_size=30>Start</font_size>");
        elm_object_disabled_set(ad->start_btn, EINA_TRUE);
        evas_object_smart_callback_add(ad->start_btn, "clicked", show_popup_cb, ad);
        evas_object_show(ad->start_btn);
        elm_table_pack(table, ad->start_btn, 0, 2, 1, 1);
    
        /* "Stop" button */
        ad->stop_btn = elm_button_add(table);
        evas_object_size_hint_weight_set(ad->stop_btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
        evas_object_size_hint_align_set(ad->stop_btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
        elm_object_text_set(ad->stop_btn, "<font_size=30>Stop</font_size>");
        elm_object_disabled_set(ad->stop_btn, EINA_TRUE);
        evas_object_smart_callback_add(ad->stop_btn, "clicked", show_popup_cb, ad);
        evas_object_show(ad->stop_btn);
        elm_table_pack(table, ad->stop_btn, 1, 2, 1, 1);
    
        /* "Remove Fence" button */
        ad->remove_fence_btn = elm_button_add(table);
        evas_object_size_hint_weight_set(ad->remove_fence_btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
        evas_object_size_hint_align_set(ad->remove_fence_btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
        elm_object_text_set(ad->remove_fence_btn, "<font_size=30>Remove Fence</font_size>");
        elm_object_disabled_set(ad->remove_fence_btn, EINA_TRUE);
        evas_object_smart_callback_add(ad->remove_fence_btn, "clicked", show_popup_cb, ad);
        evas_object_show(ad->remove_fence_btn);
        elm_table_pack(table, ad->remove_fence_btn, 0, 3, 1, 1);
    
        /* "Remove Place" button */
        ad->remove_place_btn = elm_button_add(table);
        evas_object_size_hint_weight_set(ad->remove_place_btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
        evas_object_size_hint_align_set(ad->remove_place_btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
        elm_object_text_set(ad->remove_place_btn, "<font_size=30>Remove Place</font_size>");
        elm_object_disabled_set(ad->remove_place_btn, EINA_TRUE);
        evas_object_smart_callback_add(ad->remove_place_btn, "clicked", show_popup_cb, ad);
        evas_object_show(ad->remove_place_btn);
        elm_table_pack(table, ad->remove_place_btn, 1, 3, 1, 1);
    
        /* "Update Place" button */
        ad->update_place_btn = elm_button_add(table);
        evas_object_size_hint_weight_set(ad->update_place_btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
        evas_object_size_hint_align_set(ad->update_place_btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
        elm_object_text_set(ad->update_place_btn, "<font_size=30>Update Place</font_size>");
        elm_object_disabled_set(ad->update_place_btn, EINA_TRUE);
        evas_object_smart_callback_add(ad->update_place_btn, "clicked", show_popup_cb, ad);
        evas_object_show(ad->update_place_btn);
        elm_table_pack(table, ad->update_place_btn, 0, 4, 1, 1);
    
        /* "Destroy" button */
        ad->destroy_btn = elm_button_add(table);
        evas_object_size_hint_weight_set(ad->destroy_btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
        evas_object_size_hint_align_set(ad->destroy_btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
        elm_object_text_set(ad->destroy_btn, "<font_size=30>Destroy</font_size>");
        elm_object_disabled_set(ad->destroy_btn, EINA_TRUE);
        evas_object_smart_callback_add(ad->destroy_btn, "clicked", clicked_destroy_cb, ad);
        evas_object_show(ad->destroy_btn);
        elm_table_pack(table, ad->destroy_btn, 1, 4, 1, 1);
    
        evas_object_show(table);
    
        return table;
    }
  4. The show_popup_cb() function has several functions for the buttons:

    static void
    show_popup_cb(void *data, Evas_Object *obj, void *event_info)
    {
        appdata_s *ad = (appdata_s *)data;
    
        /* Set a function and parameter for each button */
        if (obj == ad->fence_status_btn)
            select_fence_list(ad, get_status_cb);
        else if (obj == ad->add_fence_btn)
            select_place_list(ad, add_fence_cb);
        else if (obj == ad->add_place_btn)
            insert_place_name(ad, ad->add_place_btn, -1, NULL);
        else if (obj == ad->start_btn)
            select_fence_list(ad, start_fence_cb);
        else if (obj == ad->stop_btn)
            select_fence_list(ad, stop_fence_cb);
        else if (obj == ad->remove_fence_btn)
            select_fence_list(ad, remove_fence_cb);
        else if (obj == ad->remove_place_btn)
            select_place_list(ad, remove_place_cb);
        else if (obj == ad->update_place_btn)
            select_place_list(ad, update_place_cb);
    }
    

Application Operation

The application operations are activated by clicking the buttons on the main view.

To create the operations:

  • The Create button creates a geofence manager handle:

    static void
    clicked_create_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
    {
        appdata_s *ad = (appdata_s *)data;
        int ret = 0;
    
        if (ad == NULL) {
            dlog_print(DLOG_ERROR, LOG_TAG, "Application data is NULL.");
    
            return;
        }
    
        /* Create geofence handle */
        ret = geofence_manager_create(&(ad->geo_manager));
    
        /* Show the called API */
        elm_entry_entry_set(ad->entry, "<font_size=30><align=left>geofence_manager_create</align></font_size>");
        /* Show the API result */
        showError(ad->event_entry, ret);
        /* Clear the fence state entry*/
        elm_entry_entry_set(ad->status_entry, "<font_size=25><align=left></align></font_size>");
        /* Clear the proximity state entry */
        elm_entry_entry_set(s_info.proximity_entry, "<font_size=25><align=left></align></font_size>");
    
        /* Enable the buttons when the geofence handle is created */
        if (ret == GEOFENCE_MANAGER_ERROR_NONE) 
        {
            elm_object_disabled_set(ad->create_btn, EINA_TRUE);
            elm_object_disabled_set(ad->fence_status_btn, EINA_FALSE);
            elm_object_disabled_set(ad->add_fence_btn, EINA_FALSE);
            elm_object_disabled_set(ad->add_place_btn, EINA_FALSE);
            elm_object_disabled_set(ad->start_btn, EINA_FALSE);
            elm_object_disabled_set(ad->stop_btn, EINA_FALSE);
            elm_object_disabled_set(ad->remove_fence_btn, EINA_FALSE);
            elm_object_disabled_set(ad->remove_place_btn, EINA_FALSE);
            elm_object_disabled_set(ad->update_place_btn, EINA_FALSE);
            elm_object_disabled_set(ad->destroy_btn, EINA_FALSE);
    
            /* Set a callback for the geofence event */
            geofence_manager_set_geofence_event_cb(ad->geo_manager, show_event_cb, ad);
            /* Set a callback for the geofence state */
            geofence_manager_set_geofence_state_changed_cb(ad->geo_manager, show_state_changed_cb, ad);
            /* Set a callback for the proximity state */
            geofence_manager_set_geofence_proximity_state_changed_cb(ad->geo_manager, show_proximity_changed_cb, NULL);
        }
    }
    
  • The Fence Status button gets the state of the selected fence:

    static void
    get_state_cb(void *data, Evas_Object *obj, void *event_info)
    {
        int geofence_id = (int)data;
        geofence_status_h status = NULL;
        geofence_state_e state;
        int seconds = 0;
        int ret = 0;
        char buf[50] = {};
        char *state_str[] = {"UNCERTAIN", "IN", "OUT"};
    
        evas_object_del(s_info.popup);
    
        /* Create the geofence status handle */
        ret = geofence_status_create(geofence_id, &status);
    
        /* Show the called API */
        elm_entry_entry_set(s_info.entry, "<font_size=30><align=left>geofence_status_create</align></font_size>");
        /* Show the API result */
        showError(s_info.event_entry, ret);
        /* Clear the fence state entry */
        elm_entry_entry_set(s_info.state_entry, "<font_size=25><align=left></align></font_size>");
        /* Clear the proximity state entry */
        elm_entry_entry_set(s_info.proximity_entry, "<font_size=25><align=left></align></font_size>");
    
        if (ret != GEOFENCE_MANAGER_ERROR_NONE)
            return;
    
        /* Get state */
        ret = geofence_status_get_state(status, &state);
    
        /* Show the called API */
        elm_entry_entry_set(s_info.entry, "<font_size=30><align=left>geofence_status_get_state</align></font_size>");
        /* Show the API result */
        showError(s_info.event_entry, ret);
        /* Clear the fence state entry */
        elm_entry_entry_set(s_info.state_entry, "<font_size=25><align=left></align></font_size>");
        /* Clear the proximity state entry */
        elm_entry_entry_set(s_info.proximity_entry, "<font_size=25><align=left></align></font_size>");
    
        /* Get the duration */
        ret = geofence_status_get_duration(status, &seconds);
    
        /* Show the called API */
        elm_entry_entry_set(s_info.entry, "<font_size=30><align=left>geofence_status_get_duration</align></font_size>");
        /* Show the API result */
        showError(s_info.event_entry, ret);
        /* Clear the fence state entry */
        elm_entry_entry_set(s_info.state_entry, "<font_size=25><align=left></align></font_size>");
        /* Clear the proximity state entry */
        elm_entry_entry_set(s_info.proximity_entry, "<font_size=25><align=left></align></font_size>");
    
        if (ret != GEOFENCE_MANAGER_ERROR_NONE)
            return;
    
        /* Destroy the geofence status handle */
        ret = geofence_status_destroy(status);
    
        /* Show the called API */
        elm_entry_entry_set(s_info.entry, "<font_size=30><align=left>geofence_status_destroy</align></font_size>");
        /* Show the API result */
        showError(s_info.event_entry, ret);
        /* Show the fence state */
        snprintf(buf, sizeof(buf), "Fence ID: %d, State: %s, Duration: %d", geofence_id, state_str[state], seconds);
        elm_entry_entry_append(s_info.state_entry, "<font_size=25><align=left>");
        elm_entry_entry_append(s_info.state_entry, buf);
        elm_entry_entry_append(s_info.state_entry, "</align></font_size>");
        /* Clear the proximity state entry */
        elm_entry_entry_set(s_info.proximity_entry, "<font_size=25><align=left></align></font_size>");
    }
    
    
  • The Add Fence button adds a fence according to the input data:

    static void
    popup_method_value_cb(void *data, Evas_Object *obj, void *event_info)
    {
        appdata_s *ad = evas_object_data_get(obj, "app_data");
        int place_id = (int)evas_object_data_get(obj, "place_id");
        int method = (int)data;
    
        const char *value = elm_entry_entry_get(s_info.gen_entry);
        const char *value_nd = elm_entry_entry_get(s_info.gen_entry_nd);
    
        if (ad == NULL) {
            dlog_print(DLOG_ERROR, LOG_TAG, "Application data is NULL.");
    
            return;
        }
    
        geofence_h fence = NULL;
        double latitude = 0.0, longitude = 0.0;
        int geofence_id = -1;
        int ret = 0;
    
        if (!strcmp(value, "")) {
            show_toast_popup("Empty Value");
    
            return;
        }
        if (method == METHOD_GPS) {
            if (!strcmp(value_nd, "")) {
                show_toast_popup("Empty Value");
    
                return;
            }
        }
    
        switch (method) {
        case METHOD_GPS:
            latitude = atof(value);
            longitude = atof(value_nd);
            /* Create a geopoint fence handle */
            ret = geofence_create_geopoint(place_id, latitude, longitude, 200, "Dubai MR", &fence);
            /* Show the called API */
            elm_entry_entry_set(s_info.entry, "<font_size=30><align=left<geofence_create_geopoint</align></font_size>");
            break;
        case METHOD_WIFI:
            /* Create a Wi-Fi fence handle */
            ret = geofence_create_wifi(place_id, value, "Dubai MR", &fence);
            /* Show the called API */
            elm_entry_entry_set(s_info.entry, "<font_size=30><align=left>geofence_create_wifi</align></font_size>");
            break;
        case METHOD_BT:
            /* Create a bluetooth fence handle */
            ret = geofence_create_bluetooth(place_id, value, "Dubai MR", &fence);
            /* Show the called API */
            elm_entry_entry_set(s_info.entry, "<font_size=30><align=left>geofence_create_bluetooth</align></font_size>");
            break;
        default:
            break;
        }
        /* Show the API result */
        showError(s_info.event_entry, ret);
        /* Clear the fence state entry */
        elm_entry_entry_set(s_info.state_entry, "<font_size=25><align=left></align></font_size>");
        /* Clear the proximity state entry */
        elm_entry_entry_set(s_info.proximity_entry, "<font_size=25><align=left></align></font_size>");
    
        /* Add the fence */
        ret = geofence_manager_add_fence(ad->geo_manager, fence, &geofence_id);
        /* Show the API result */
        showError(s_info.event_entry, ret);
    
        evas_object_del(s_info.popup);
    }
    
  • The Remove Fence button removes the selected fence:

    static void
    remove_fence_cb(void *data, Evas_Object *obj, void *event_info)
    {
        appdata_s *ad = evas_object_data_get(obj, "app_data");
        int fence_id = (int)data;
        int ret = 0;
    
        if (ad == NULL) {
            dlog_print(DLOG_ERROR, LOG_TAG, "Application data is NULL.");
    
            return;
        }
    
        evas_object_del(s_info.popup);
    
        /* Remove the fence */
        ret = geofence_manager_remove_fence(ad->geo_manager, fence_id);
    
        /* Show the called API */
        elm_entry_entry_set(s_info.entry, "<font_size=30><align=left>geofence_manager_remove_fence</align></font_size>");
        /* Show the API result */
        showError(s_info.event_entry, ret);
        /* Clear the fence state entry */
        elm_entry_entry_set(s_info.state_entry, "<font_size=25><align=left></align></font_size>");
        /* Clear the proximity state entry */
        elm_entry_entry_set(s_info.proximity_entry, "<font_size=25><align=left></align></font_size>");
    }
    
  • The Add Place button adds a place or renames the selected place:

    static void
    popup_place_name_cb(void *data, Evas_Object *obj, void *event_info)
    {
        appdata_s *ad = evas_object_data_get(obj, "app_data");
        int ret = 0;
        int place_id = (int)data;
        const char *place_name = elm_entry_entry_get(s_info.gen_entry);
    
        if (ad == NULL) {
            dlog_print(DLOG_ERROR, LOG_TAG, "Application data is NULL.");
    
            return;
        }
    
        /* Check that a name is inserted */
        if (!strcmp(place_name, "")) {
            show_toast_popup("Empty Value");
    
            return;
        }
    
        if (place_id < 0) {
            /* Add a place */
            ret = geofence_manager_add_place(ad->geo_manager, place_name, &place_id);
            /* Show the called API */
            elm_entry_entry_set(s_info.entry, "<font_size=30><align=left>geofence_manager_add_place</align></font_size>");
        } else {
            /* Update the place */
            ret = geofence_manager_update_place(ad->geo_manager, place_id, place_name);
            /* show called API */
            elm_entry_entry_set(s_info.entry, "<font_size=30><align=left>geofence_manager_update_place</align></font_size>");
        }
    
        /* Show the API result */
        showError(s_info.event_entry, ret);
    
        /* Show or clear the geofence state */
        if (place_id > 0 && place_id <= 3)
            elm_entry_entry_set(s_info.state_entry, "<font_size=25><align=left>The renaming of default place is impossible</align></font_size>");
        else
            elm_entry_entry_set(s_info.state_entry, "<font_size=25><align=left></align></font_size>");
    
        /* Clear the proximity state entry */
        elm_entry_entry_set(s_info.proximity_entry, "<font_size=25><align=left></align></font_size>");
        evas_object_del(s_info.popup);
    }
    
  • The Remove Place button removes the selected place:

    static void
    remove_place_cb(void *data, Evas_Object *obj, void *event_info)
    {
        appdata_s *ad = evas_object_data_get(obj, "app_data");
        int place_id = (int)data;
        int ret = 0;
    
        if (ad == NULL) {
            dlog_print(DLOG_ERROR, LOG_TAG, "Application data is NULL.");
    
            return;
        }
    
        evas_object_del(s_info.popup);
    
        /* Remove the place */
        ret = geofence_manager_remove_place(ad->geo_manager, place_id);
    
        /* Show the called API */
        elm_entry_entry_set(s_info.entry, "<font_size=30><align=left>geofence_manager_remove_place</align></font_size>");
        /* Show the API result */
        showError(s_info.event_entry, ret);
        /* Show or clear the fence state */
        if (place_id <= 3)
            elm_entry_entry_set(s_info.state_entry, "<font_size=25><align=left>The deletion of default place is impossible</align></font_size>");
        else
            elm_entry_entry_set(s_info.state_entry, "<font_size=25><align=left></align></font_size>");
        /* Clear the proximity state entry */
        elm_entry_entry_set(s_info.proximity_entry, "<font_size=25><align=left></align></font_size>");
    }
    
    
  • The Start button starts the selected fence:

    static void
    start_fence_cb(void *data, Evas_Object *obj, void *event_info)
    {
        appdata_s *ad = evas_object_data_get(obj, "app_data");
        int fence_id = (int)data;
        int ret = 0;
    
        if (ad == NULL) {
            dlog_print(DLOG_ERROR, LOG_TAG, "Application data is NULL.");
    
            return;
        }
    
        evas_object_del(s_info.popup);
    
        /* Start the fence */
        ret = geofence_manager_start(ad->geo_manager, fence_id);
    
        /* Show the called API */
        elm_entry_entry_set(s_info.entry, "<font_size=30><align=left>geofence_manager_start</align></font_size>");
        /* Show the API result */
        showError(s_info.event_entry, ret);
        /* Clear the fence state entry */
        elm_entry_entry_set(s_info.state_entry, "<font_size=25><align=left></align></font_size>");
        /* Clear the proximity state entry */
        elm_entry_entry_set(s_info.proximity_entry, "<font_size=25><align=left></align></font_size>");
    }
    
  • The Stop button stops the selected fence:

    static void
    stop_fence_cb(void *data, Evas_Object *obj, void *event_info)
    {
        appdata_s *ad = evas_object_data_get(obj, "app_data");
        int fence_id = (int)data;
        int ret = 0;
    
        if (ad == NULL) {
            dlog_print(DLOG_ERROR, LOG_TAG, "Application data is NULL.");
    
            return;
        }
    
        evas_object_del(s_info.popup);
    
        /* Stop the fence */
        ret = geofence_manager_stop(ad->geo_manager, fence_id);
    
        /* Show the called API */
        elm_entry_entry_set(s_info.entry, "<font_size=30><align=left>geofence_manager_stop</align></font_size>");
        /* Show the API result */
        showError(s_info.event_entry, ret);
        /* Clear the fence state entry */
        elm_entry_entry_set(s_info.state_entry, "<font_size=25><align=left></align></font_size>");
        /* Clear the proximity state entry */
        elm_entry_entry_set(s_info.proximity_entry, "<font_size=25><align=left></align></font_size>");
    }
    
  • The Destroy button destroys the geofence manager handle:

    static void
    clicked_destroy_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
    {
        appdata_s *ad = (appdata_s *)data;
        int ret = 0;
    
        if (ad == NULL) {
            dlog_print(DLOG_ERROR, LOG_TAG, "Application data is NULL.");
    
            return;
        }
    
        /* Unset the callback for the geofence event */
        geofence_manager_unset_geofence_event_cb(ad->geo_manager);
        /* Unset the callback for the geofence state */
        geofence_manager_unset_geofence_state_changed_cb(ad->geo_manager);
        /* unset callback for proximity state */
        geofence_manager_unset_geofence_proximity_state_changed_cb(ad->geo_manager);
    
        /* Destroy geofence handle */
        ret = geofence_manager_destroy(ad->geo_manager);
    
        /* Show the called API */
        elm_entry_entry_set(s_info.entry, "<font_size=30><align=left>geofence_manager_destroy</align></font_size>");
        /* Show the API result */
        showError(s_info.event_entry, ret);
        /* Clear the fence state */
        elm_entry_entry_set(s_info.state_entry, "<font_size=25><align=left></align></font_size>");
        /* Clear the proximity state entry */
        elm_entry_entry_set(s_info.proximity_entry, "<font_size=25><align=left></align></font_size>");
    
        /* Disable the button when the geofence handle is destroyed */
        if (ret == GEOFENCE_MANAGER_ERROR_NONE) {
            elm_object_disabled_set(s_info.create_btn, EINA_FALSE);
            elm_object_disabled_set(s_info.fence_state_btn, EINA_TRUE);
            elm_object_disabled_set(s_info.add_fence_btn, EINA_TRUE);
            elm_object_disabled_set(s_info.add_place_btn, EINA_TRUE);
            elm_object_disabled_set(s_info.start_btn, EINA_TRUE);
            elm_object_disabled_set(s_info.stop_btn, EINA_TRUE);
            elm_object_disabled_set(s_info.remove_fence_btn, EINA_TRUE);
            elm_object_disabled_set(s_info.remove_place_btn, EINA_TRUE);
            elm_object_disabled_set(s_info.update_place_btn, EINA_TRUE);
            elm_object_disabled_set(s_info.destroy_btn, EINA_TRUE);
    
            ad->geo_manager = NULL;
        }
    }