overheat popup : add signal handler to update time and remove 30 seconds power off... 62/105762/9 accepted/tizen/3.0/mobile/20161221.011726 accepted/tizen/3.0/tv/20161221.010900 accepted/tizen/3.0/wearable/20161221.011343 submit/tizen_3.0/20161220.112901
authorlokilee73 <changjoo.lee@samsung.com>
Mon, 19 Dec 2016 11:07:46 +0000 (20:07 +0900)
committerlokilee73 <changjoo.lee@samsung.com>
Tue, 20 Dec 2016 10:05:06 +0000 (19:05 +0900)
Change-Id: If608a90d0db8c6f2a4f6a146fa48387bdd733aa0
Signed-off-by: lokilee73 <changjoo.lee@samsung.com>
src/overheat/overheat.c

index 3803822..6000939 100755 (executable)
 #define POWER_METHOD            "reboot"
 #define POWER_OPERATION_OFF     "poweroff"
 
+/* Overheat Timer*/
+#define OVERHEAT_BUS_NAME              "org.tizen.system.popup"
+#define OVERHEAT_OBJECT_PATH           "/Org/Tizen/System/Popup"
+#define OVERHEAT_INTERFACE_NAME        OVERHEAT_BUS_NAME
+#define OVERHEAT_PATH                  OVERHEAT_OBJECT_PATH"/Overheat"
+#define OVERHEAT_INTERFACE             OVERHEAT_INTERFACE_NAME".Overheat"
+#define SIGNAL_OVERHEAT_TIME           "TimeUpdate"
+
 #define OVERTEMP_TIMEOUT  30
 
 static int overtemp_timer = OVERTEMP_TIMEOUT;
+static Evas_Object *timer_label;
 
 static const struct popup_ops overheat_ops;
 static const struct popup_ops overheat_poweroff_warning_ops;
@@ -40,7 +49,10 @@ static void unregister_handlers(const struct popup_ops *ops);
 static void overheat_poweroff(const struct popup_ops *ops);
 static int overheat_launch(bundle *b, const struct popup_ops *ops);
 static void overheat_poweroff_warning_terminate(const struct popup_ops *ops);
+static int add_dbus_signal_handler(const struct popup_ops *ops);
+static void remove_dbus_signal_handler(void);
 static __attribute__ ((constructor)) void overheat_register_popup(void);
+static E_DBus_Signal_Handler *overheat_sig_handler = NULL;
 
 static char *items[] = {
        "IDS_IDLE_HEADER_PHONE_OVERHEATING_ABB",
@@ -80,44 +92,31 @@ _popup_cancel_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info)
        load_simple_popup(b, &overheat_poweroff_warning_ops);
 }
 
-static Eina_Bool
-progressbar_timer_cb(void *data)
+static void update_overtemp_time(void *data, DBusMessage *msg)
 {
-       struct object_ops *obj = data;
-       Evas_Object *progressbar = evas_object_data_get(obj->popup, "progressbar");
-       double value = 0.0;
-
-       value = elm_progressbar_value_get(progressbar);
-       if (value == 1.0) {
-               evas_object_data_del(obj->popup, "timer");
-               overheat_poweroff(obj->ops);
-               return ECORE_CALLBACK_CANCEL;
-       }
-       value = value + 0.01;
-       elm_progressbar_value_set(progressbar, value);
-
-       return ECORE_CALLBACK_RENEW;
-}
-
-static void
-progressbar_popup_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
-{
-       Ecore_Timer *timer = data;
+       DBusError err;
+       int time = 0;
+       int ret;
 
-       ecore_timer_del(timer);
-}
+       ret = dbus_message_is_signal(msg, OVERHEAT_INTERFACE, SIGNAL_OVERHEAT_TIME);
+       if (!ret) {
+               _E("No overheat SIG");
+               return;
+       }
 
-static Eina_Bool update_overtemp_time(Evas_Object *label)
-{
-       overtemp_timer--;
-
-       if (overtemp_timer < 0) {
-               overtemp_timer = OVERTEMP_TIMEOUT;
-               return ECORE_CALLBACK_CANCEL;
-       } else {
-               elm_object_text_set(label, gl_text_get(2));
-               return ECORE_CALLBACK_RENEW;
+       dbus_error_init(&err);
+       if (dbus_message_get_args(msg, &err,
+               DBUS_TYPE_INT32, &time,
+               DBUS_TYPE_INVALID) == 0) {
+               dbus_error_free(&err);
+               return;
        }
+       dbus_error_free(&err);
+
+       overtemp_timer = time;
+       elm_object_text_set(timer_label, gl_text_get(2));
+       if (!overtemp_timer)
+               remove_dbus_signal_handler();
 }
 
 static void unregister_handlers(const struct popup_ops *ops)
@@ -174,15 +173,68 @@ static int overheat_poweroff_warning_launch(bundle *b, const struct popup_ops *o
        return 0;
 }
 
+static int add_dbus_signal_handler(const struct popup_ops *ops)
+{
+       E_DBus_Connection *conn;
+
+       conn = get_dbus_connection();
+       if (!conn) {
+               _E("Failed to get dbus connection");
+               return -ENOMEM;
+       }
+
+       overheat_sig_handler = e_dbus_signal_handler_add(
+                       conn, NULL,
+                       OVERHEAT_PATH,
+                       OVERHEAT_INTERFACE,
+                       SIGNAL_OVERHEAT_TIME,
+                       update_overtemp_time,
+                       (void *)ops);
+       if (!overheat_sig_handler) {
+               _E("Failed to add signal handler");
+               return -ENOMEM;
+       }
+
+       return 0;
+}
+
+static void remove_dbus_signal_handler(void)
+{
+       E_DBus_Connection *conn;
+
+       if (!overheat_sig_handler) {
+               _E("No available sig handler for overheat");
+               return;
+       }
+
+       conn = get_dbus_connection();
+       if (!conn) {
+               overheat_sig_handler = NULL;
+               _E("No Dbus connection for overheat sig");
+               return;
+       }
+
+       e_dbus_signal_handler_del(conn, overheat_sig_handler);
+       overheat_sig_handler = NULL;
+}
+
 static int overheat_launch(bundle *b, const struct popup_ops *ops)
 {
+       int ret;
+
        register_handlers(ops);
+
+       ret = add_dbus_signal_handler(ops);
+       if (ret < 0)
+               _E("Failed to add dbus handler(%d)", ret);
+
        return 0;
 }
 
 static void overheat_terminate(const struct popup_ops *ops)
 {
        unregister_handlers(ops);
+       remove_dbus_signal_handler();
 }
 
 static void overheat_poweroff_warning_terminate(const struct popup_ops *ops)
@@ -213,9 +265,8 @@ int overheat_popup(bundle *b, const struct popup_ops *ops)
        Evas_Object *btn;
        Evas_Object *progressbar;
        Evas_Object *scroller1, *scroller2;
-       Evas_Object *label1, *label2;
+       Evas_Object *label1;
        Evas_Object *win;
-       Ecore_Timer *timer;
        struct object_ops *obj;
        int ret;
 
@@ -283,21 +334,15 @@ int overheat_popup(bundle *b, const struct popup_ops *ops)
        evas_object_show(label1);
        elm_object_content_set(scroller1, label1);
 
-       label2 = elm_label_add(scroller2);
-       elm_object_style_set(label2, "popup/default");
-       elm_label_line_wrap_set(label2, ELM_WRAP_MIXED);
-       elm_object_text_set(label2, gl_text_get(2));
+       timer_label = elm_label_add(scroller2);
+       elm_object_style_set(timer_label, "popup/default");
+       elm_label_line_wrap_set(timer_label, ELM_WRAP_MIXED);
+       elm_object_text_set(timer_label, gl_text_get(2));
 
-       /*  set timer  */
-       if (!ecore_timer_add(1, (Ecore_Task_Cb)update_overtemp_time, label2)) {
-               _E("Fail to set timer");
-               return -EINVAL;
-       }
-
-       evas_object_size_hint_weight_set(label2, EVAS_HINT_EXPAND, 0.0);
-       evas_object_size_hint_align_set(label2, EVAS_HINT_FILL, EVAS_HINT_FILL);
-       evas_object_show(label2);
-       elm_object_content_set(scroller2, label2);
+       evas_object_size_hint_weight_set(timer_label, EVAS_HINT_EXPAND, 0.0);
+       evas_object_size_hint_align_set(timer_label, EVAS_HINT_FILL, EVAS_HINT_FILL);
+       evas_object_show(timer_label);
+       elm_object_content_set(scroller2, timer_label);
 
        /* progressbar */
        progressbar = elm_progressbar_add(layout);
@@ -306,11 +351,7 @@ int overheat_popup(bundle *b, const struct popup_ops *ops)
        evas_object_size_hint_weight_set(progressbar, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
        elm_progressbar_pulse(progressbar, EINA_TRUE);
        elm_object_part_content_set(layout, "processing", progressbar);
-       timer = ecore_timer_add(0.3, progressbar_timer_cb, obj);
-
        evas_object_data_set(popup, "progressbar", progressbar);
-       evas_object_data_set(popup, "timer", timer);
-       evas_object_event_callback_add(popup, EVAS_CALLBACK_DEL, progressbar_popup_del_cb, timer);
 
        elm_object_content_set(popup, layout);
        evas_object_show(popup);