Add SetPopupResult method to support app result callback 00/100800/2 accepted/tizen/common/20161130.070732 accepted/tizen/ivi/20161130.232202 accepted/tizen/mobile/20161130.232137 submit/tizen/20161130.044142
authorWootak Jung <wootak.jung@samsung.com>
Tue, 29 Nov 2016 08:35:55 +0000 (17:35 +0900)
committerWootak Jung <wootak.jung@samsung.com>
Tue, 29 Nov 2016 08:39:01 +0000 (17:39 +0900)
- system session daemon can't receive app result callback any more
so, add SetPopupResult method and used by callmgr-popup app

Change-Id: I1895ec6e98015083094f71fffb4bd155fca840d6

callmgr-popup/include/callmgr-popup-dbus-if.h
callmgr-popup/src/callmgr-popup-dbus-if.c
callmgr-popup/src/callmgr-popup-main.c
callmgr-popup/src/callmgr-popup-widget.c
common/src/callmgr-util.c
introspection/call-manager.xml
packaging/call-manager.spec
service/src/callmgr-dbus.c

index 0f79b2a8c6c4fcab5821f7fdf9e00a9de64467fa..e9852c9988a27f2b0322d11a2679fa4aa3e61475 100644 (file)
@@ -27,6 +27,7 @@ int _callmgr_popup_dbus_init(void *user_data);
 int _callmgr_popup_dbus_deinit(void *user_data);
 
 int _callmgr_popup_dial_call(char *number, int call_type, int sim_slot, int disable_fm, gboolean is_emergency_contact, void *user_data);
+int _callmgr_popup_set_popup_result(callmgr_popup_type_e popup_type, int result, void *user_data);
 
 #endif /* _CALLMGR_POPUP_DBUS_H_ */
 
index 645864b4e4acbcf5cabd22bc18b9ce26505d2c57..e1b14a2ca30bab2afd9228f9bc0b9cb4dd175f46 100644 (file)
 #define DBUS_CALL_MANAGER_DEFAULT_INTERFACE DBUS_CALL_MANAGER
 
 #define DBUS_CALL_MANAGER_METHOD_DIAL_CALL     "DialCall"
+#define DBUS_CALL_MANAGER_METHOD_SET_POPUP_RESULT "SetPopupResult"
 
 #define CM_DEFAULT_TIMEOUT    (60 * 1000)
 
-static void __callmgr_popup_dial_call_cb(GObject *source_object, GAsyncResult *res, gpointer user_data)
+static void __callmgr_popup_response_cb(GObject *source_object, GAsyncResult *res, gpointer user_data)
 {
        GError *error = NULL;
        GDBusConnection *conn = NULL;
@@ -63,7 +64,25 @@ int _callmgr_popup_dial_call(char *number, int call_type, int sim_slot, int disa
        g_dbus_connection_call(ad->dbus_conn, DBUS_CALL_MANAGER,
                        DBUS_CALL_MANAGER_PATH, DBUS_CALL_MANAGER_DEFAULT_INTERFACE, DBUS_CALL_MANAGER_METHOD_DIAL_CALL,
                        g_variant_new("(siiib)", number, call_type, sim_slot, disable_fm, is_emergency_contact), NULL, G_DBUS_CALL_FLAGS_NONE,
-                       CM_DEFAULT_TIMEOUT, ad->ca, __callmgr_popup_dial_call_cb, user_data);
+                       CM_DEFAULT_TIMEOUT, ad->ca, __callmgr_popup_response_cb, user_data);
+
+        DBG("<<");
+        return value;
+}
+
+int _callmgr_popup_set_popup_result(callmgr_popup_type_e popup_type, int result, void *user_data)
+{
+       CallMgrPopAppData_t *ad = (CallMgrPopAppData_t *)user_data;
+
+       gint value = 0;
+       DBG("Set callmgr-popup result!! popup_type[%d], result[%s]",
+               popup_type, result == 0 ? "CANCEL" : "OK");
+
+       g_dbus_connection_call(ad->dbus_conn, DBUS_CALL_MANAGER,
+                       DBUS_CALL_MANAGER_PATH, DBUS_CALL_MANAGER_DEFAULT_INTERFACE,
+                       DBUS_CALL_MANAGER_METHOD_SET_POPUP_RESULT,
+                       g_variant_new("(ii)", popup_type, result), NULL, G_DBUS_CALL_FLAGS_NONE,
+                       CM_DEFAULT_TIMEOUT, ad->ca, NULL, NULL);
 
         DBG("<<");
         return value;
index f421627d5415261f2cd30af74a49dbbabfbeb284..64c869e3a1fc90d13bef197f572267a690045403 100644 (file)
@@ -226,7 +226,9 @@ static void __callmgr_popup_app_service(app_control_h app_control, void *user_da
 
        case CALLMGR_POPUP_HIDE_E:
                if (ad->request) {
-                       _callmgr_popup_reply_to_launch_request(ad, "RESULT", "0");      /* "0" means CANCEL */
+                       _callmgr_popup_set_popup_result(ad->popup_type, 0, ad); /* 0 means CANCEL */
+                       app_control_destroy(ad->request);
+                       ad->request = NULL;
                }
                elm_exit();
                break;
index 398922dd7408e7b783fd1c977bad143c980f9cf6..17e8b77b6ffaea2f552ead628b4474320f43c42d 100644 (file)
@@ -165,7 +165,9 @@ static Eina_Bool __callmgr_popup_win_hard_key_up_cb(void *data, int type, void *
                if ((ad->popup) && (ad->popup_type != CALLMGR_POPUP_FLIGHT_MODE_DISABLING_E)) {
                        evas_object_del(ad->popup);
                        ad->popup = NULL;
-                       _callmgr_popup_reply_to_launch_request(ad, "RESULT", "0");      /* "0" means CANCEL */
+                       _callmgr_popup_set_popup_result(ad->popup_type, 0, ad); /* 0 means CANCEL */
+                       app_control_destroy(ad->request);
+                       ad->request = NULL;
 
                        elm_exit();
                }
@@ -238,7 +240,9 @@ static void __callmgr_popup_hw_key_unload(void *data, Evas_Object *obj, void *ev
                evas_object_del(ad->popup);
        }
 
-       _callmgr_popup_reply_to_launch_request(ad, "RESULT", "0");      /* "0" means CANCEL */
+       _callmgr_popup_set_popup_result(ad->popup_type, 0, ad); /* 0 means OK */
+       app_control_destroy(ad->request);
+       ad->request = NULL;
        elm_exit();
 }
 
@@ -246,7 +250,9 @@ static void __callmgr_popup_fm_popup_ok_cb(void *data, Evas_Object *obj, void *e
 {
        CallMgrPopAppData_t *ad = (CallMgrPopAppData_t *)data;
 
-       _callmgr_popup_reply_to_launch_request(ad, "RESULT", "1");      /* "1" means OK */
+       _callmgr_popup_set_popup_result(ad->popup_type, 1, ad); /* 1 means OK */
+       app_control_destroy(ad->request);
+       ad->request = NULL;
        _callmgr_popup_dial_call(ad->dial_num, ad->call_type, ad->active_sim, 1, FALSE, ad);
        if (ad->popup) {
                evas_object_del(ad->popup);
@@ -261,7 +267,9 @@ static void __callmgr_popup_fm_popup_cancel_cb(void *data, Evas_Object *obj, voi
                evas_object_del(ad->popup);
        }
 
-       _callmgr_popup_reply_to_launch_request(ad, "RESULT", "0");      /* "0" means CANCEL */
+       _callmgr_popup_set_popup_result(ad->popup_type, 0, ad); /* 0 means CANCEL */
+       app_control_destroy(ad->request);
+       ad->request = NULL;
        elm_exit();
 }
 
@@ -456,7 +464,9 @@ static void __callmgr_popup_sim_list_gl_sel(void *data, Evas_Object *obj, void *
                int index = GPOINTER_TO_INT(elm_object_item_data_get(item));
                DBG("index: %d", index);
 
-               _callmgr_popup_reply_to_launch_request(ad, "RESULT", "1");      /* "1" means OK */
+               _callmgr_popup_set_popup_result(ad->popup_type, 1, ad); /* "1" means OK */
+               app_control_destroy(ad->request);
+               ad->request = NULL;
                _callmgr_popup_dial_call(ad->dial_num, ad->call_type, index, 0, FALSE, ad);
        } else {
                ERR("item is NULL");
@@ -538,7 +548,9 @@ static void __callmgr_popup_try_voice_call_ok_cb(void *data, Evas_Object *obj, v
 {
        CallMgrPopAppData_t *ad = (CallMgrPopAppData_t *)data;
 
-       _callmgr_popup_reply_to_launch_request(ad, "RESULT", "1");      /* "1" means OK */
+       _callmgr_popup_set_popup_result(ad->popup_type, 1, ad); /* 1 means OK */
+       app_control_destroy(ad->request);
+       ad->request = NULL;
        _callmgr_popup_dial_call(ad->dial_num, ad->call_type, ad->active_sim, 0, FALSE, ad);
        if (ad->popup) {
                evas_object_del(ad->popup);
@@ -552,7 +564,9 @@ static void __callmgr_popup_try_voice_call_cancel_cb(void *data, Evas_Object *ob
        if (ad->popup) {
                evas_object_del(ad->popup);
        }
-       _callmgr_popup_reply_to_launch_request(ad, "RESULT", "0");      /* "0" means CANCEL */
+       _callmgr_popup_set_popup_result(ad->popup_type, 0, ad); /* 0 means CANCEL */
+       app_control_destroy(ad->request);
+       ad->request = NULL;
        elm_exit();
 }
 
index ec9945f8f89a3c87ce14499b91961089e541d56f..2fae3e98b0d9c10e71e2aea125adfbbca92b44e6 100644 (file)
@@ -234,7 +234,7 @@ static gpointer __callmgr_util_launch_voice_call(gpointer data)
        callmgr_thread_data_t *cb_data = (callmgr_thread_data_t*)data;
        CM_RETURN_VAL_IF_FAIL(cb_data, NULL);
        char buf[2] = {0, };
-       bundle *kb      = NULL;
+       bundle *kb = NULL;
        uid_t uid = 0;
 
        kb = bundle_create();
@@ -271,7 +271,8 @@ static gpointer __callmgr_util_launch_voice_call_by_sat(gpointer data)
        callmgr_thread_data_t *cb_data = (callmgr_thread_data_t*)data;
        CM_RETURN_VAL_IF_FAIL(cb_data, NULL);
        char buf[500 + 1] = {0, };
-       bundle *kb      = NULL;
+       bundle *kb = NULL;
+       uid_t uid = 0;
 
        kb = bundle_create();
 
@@ -281,7 +282,9 @@ static gpointer __callmgr_util_launch_voice_call_by_sat(gpointer data)
        g_snprintf(buf, 2, "%d", cb_data->sim_slot);
        dbg("sim_slot : [%s]", buf);
        appsvc_add_data(kb, "sim_slot", buf);
-       appsvc_run_service(kb, 0, NULL, NULL);
+       /* To support multi-user, launch call-ui with active uid */
+       __callmgr_util_get_active_uid(&uid);
+       appsvc_usr_run_service(kb, 0, NULL, NULL, uid);
 
        bundle_free(kb);
        g_free(cb_data);
@@ -302,7 +305,8 @@ static gpointer __callmgr_util_launch_video_call(gpointer data)
        callmgr_thread_data_t *cb_data = (callmgr_thread_data_t*)data;
        CM_RETURN_VAL_IF_FAIL(cb_data, NULL);
        char buf[2] = {0, };
-       bundle *kb      = NULL;
+       bundle *kb = NULL;
+       uid_t uid = 0;
 
        kb = bundle_create();
 /*
@@ -319,7 +323,9 @@ static gpointer __callmgr_util_launch_video_call(gpointer data)
        g_snprintf(buf, 2, "%d", cb_data->sim_slot);
        dbg("sim_slot : [%s]", buf);
        appsvc_add_data(kb, "sim_slot", buf);
-       appsvc_run_service(kb, 0, NULL, NULL);
+       /* To support multi-user, launch vt-call with active uid */
+       __callmgr_util_get_active_uid(&uid);
+       appsvc_usr_run_service(kb, 0, NULL, NULL, uid);
 
        bundle_free(kb);
        g_free(cb_data);
@@ -461,6 +467,9 @@ int _callmgr_util_launch_callui_by_sat(int sim_slot)
        return 0;
 }
 
+/*
+ * system session daemon can't receive result-callback from application.
+ * so, do not use this code and refer the 'SetPopupResult' method.
 static void __callmgr_util_popup_reply_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
 {
        dbg("__callmgr_util_popup_reply_cb");
@@ -487,53 +496,42 @@ static void __callmgr_util_popup_reply_cb(app_control_h request, app_control_h r
        }
        return;
 }
+*/
 
 int _callmgr_util_launch_popup(call_popup_type popup_type, int info, const char* number, int active_sim, callmgr_util_popup_result_cb cb, void *user_data)
 {
        dbg("_callmgr_util_launch_popup: popup_type(%d), info(%d)", popup_type, info);
-       char type_buf[10] = { 0, };
-       char err_buf[10] = { 0, };
-       char sim_buf[10] = { 0, };
-       _callmgr_util_popup_data_t *popup_data = NULL;
-       int result = APP_CONTROL_ERROR_NONE;
+       char type_buf[10] = {0, };
+       char err_buf[10] = {0, };
+       char sim_buf[10] = {0, };
+       bundle *kb = NULL;
+       uid_t uid = 0;
+       GThread* selfi = g_thread_self();
 
-       app_control_h app_control = NULL;
-       result = app_control_create(&app_control);
-       if (result != APP_CONTROL_ERROR_NONE) {
-               warn("app_control_create() return error : %d", result);
-               return -1;
-       }
-       app_control_set_app_id(app_control, CALLMGR_POPUP_NAME);
+       kb = bundle_create();
+
+       appsvc_set_appid(kb, CALLMGR_POPUP_NAME);
 
        snprintf(type_buf, sizeof(type_buf), "%d", popup_type);
-       app_control_add_extra_data(app_control, "TYPE", type_buf);
+       appsvc_add_data(kb, "TYPE", type_buf);
 
        snprintf(err_buf, sizeof(err_buf), "%d", info);
-       app_control_add_extra_data(app_control, "SUB_INFO", err_buf);
+       appsvc_add_data(kb, "SUB_INFO", err_buf);
 
-       app_control_add_extra_data(app_control, "NUMBER", number);
+       appsvc_add_data(kb, "NUMBER", number);
 
        snprintf(sim_buf, sizeof(sim_buf), "%d", active_sim);
-       app_control_add_extra_data(app_control, "ACTIVE_SIM", sim_buf);
+       appsvc_add_data(kb, "ACTIVE_SIM", sim_buf);
 
-       if (cb) {
-               popup_data = (_callmgr_util_popup_data_t*)calloc(1, sizeof(_callmgr_util_popup_data_t));
-               if (popup_data == NULL) {
-                       app_control_destroy(app_control);
-                       return -1;
-               }
-               popup_data->popup_type = popup_type;
-               popup_data->popup_result_cb = cb;
-               popup_data->user_data = user_data;
-       }
+       /* To support multi-user, launch call-ui with active uid */
+       __callmgr_util_get_active_uid(&uid);
+       appsvc_usr_run_service(kb, 0, NULL, NULL, uid);
+
+       bundle_free(kb);
 
-       result = app_control_send_launch_request(app_control, __callmgr_util_popup_reply_cb, popup_data);
-       if (result != APP_CONTROL_ERROR_NONE) {
-               warn("Retry");
-               result = app_control_send_launch_request(app_control, __callmgr_util_popup_reply_cb, popup_data);
-               err("retry : %d", result);
+       if (TRUE == __callmgr_util_thread_dispatch(g_main_context_default(), G_PRIORITY_LOW, (GSourceFunc)__callmgr_util_thread_finish_cb, selfi)) {
+               dbg("Thread %p processing is complete", selfi);
        }
-       app_control_destroy(app_control);
 
        return 0;
 }
index fe6707380faf745967fc906840c0f6c8831ca7ae..bc13989e287c11c183b2f6fcbc8430a9aa450737 100644 (file)
                        <arg direction="out" type="b" name="is_video_recording" />
                </method>
 
+               <method name="SetPopupResult">
+                       <arg direction="in" type="i" name="popup_type" />
+                       <arg direction="in" type="i" name="result" />
+                       <arg direction="out" type="i" name="err" />
+               </method>
+
                <!--signal list -->
 
                <signal name="CallEvent">
index 2b5b2f6086f5cee80dffc59627471b2d12c1caa2..cc803d07af2d11ead77e336a6db1012fbf16785e 100644 (file)
@@ -1,6 +1,6 @@
 %define major 0
 %define minor 1
-%define patchlevel 88
+%define patchlevel 89
 %define ext_feature 0
 
 Name:           call-manager
index 15824016777cddc5703260cdf9cfa4391b37d60c..dc4ee5949b1c1535cc470a0b38fe5cbf8ba34b82 100644 (file)
@@ -915,6 +915,29 @@ static gboolean __get_video_recording_status_handler(GDBusInterfaceSkeleton *di,
        return TRUE;
 }
 
+static gboolean __set_popup_result_handler(GDBusInterfaceSkeleton *di,
+               GDBusMethodInvocation *invoc, gint popup_type, gint result, gpointer user_data)
+{
+       callmgr_core_data_t *core_data = (callmgr_core_data_t *)user_data;
+       CM_RETURN_VAL_IF_FAIL(core_data, FALSE);
+
+       dbg("__set_popup_result_handler() is called. popup_type[%d], result[%d]",
+               popup_type, result == 0 ? "CANCEL" : "OK");
+
+       if (popup_type == CALL_POPUP_FLIGHT_MODE) {
+               cm_util_popup_result_e popup_result = (cm_util_popup_result_e)result;
+               if (popup_result == CM_UTIL_POPUP_RESP_CANCEL)
+                       _callmgr_dbus_send_dial_status(core_data, CALL_MANAGER_DIAL_FAIL_FLIGHT_MODE);
+               else
+                       info("OK button on FM popup is clicked ");
+       } else if (popup_type == CALL_POPUP_SIM_SELECT || popup_type == CALL_POPUP_OUT_OF_3G_TRY_VOICE_CALL) {
+               cm_util_popup_result_e popup_result = (cm_util_popup_result_e)result;
+               if (popup_result == CM_UTIL_POPUP_RESP_CANCEL)
+                       _callmgr_dbus_send_dial_status(core_data, CALL_MANAGER_DIAL_CANCEL);
+       }
+
+       return TRUE;
+}
 
 /********************************************/
 static gchar *__callmgr_dbus_convert_name_to_path(const gchar *name)
@@ -1030,6 +1053,7 @@ static int __callmgr_dbus_init_handlers(callmgr_core_data_t *core_data)
        g_signal_connect(di, "handle-get-mute-status", G_CALLBACK(__get_mute_status_handler), core_data);
        g_signal_connect(di, "handle-get-answering-machine-status", G_CALLBACK(__get_answering_machine_status_handler), core_data);
        g_signal_connect(di, "handle-get-video-recording-status", G_CALLBACK(__get_video_recording_status_handler), core_data);
+       g_signal_connect(di, "handle-set-popup-result", G_CALLBACK(__set_popup_result_handler), core_data);
 
        __callmgr_dbus_object_export(core_data, di, CALLMGR_DBUS_PATH);
        core_data->dbus_skeleton_interface = di;