4 * Copyright (c) 2016 Samsung Electronics Co., Ltd. All rights reserved.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
20 #include "popup-common.h"
23 #define SYSTEMD_STOP_POWER_OFF 4
25 #define DEVICED_BUS_NAME "org.tizen.system.deviced"
26 #define REBOOT_OBJECT_PATH "/Org/Tizen/System/DeviceD/Reboot"
27 #define REBOOT_INTERFACE_NAME DEVICED_BUS_NAME".reboot"
29 #define REBOOT_METHOD "reboot"
30 #define REBOOT_OPERATION_OFF "poweroff"
33 #define OVERHEAT_BUS_NAME "org.tizen.system.popup"
34 #define OVERHEAT_OBJECT_PATH "/Org/Tizen/System/Popup"
35 #define OVERHEAT_INTERFACE_NAME OVERHEAT_BUS_NAME
36 #define OVERHEAT_PATH OVERHEAT_OBJECT_PATH"/Overheat"
37 #define OVERHEAT_INTERFACE OVERHEAT_INTERFACE_NAME".Overheat"
38 #define SIGNAL_OVERHEAT_TIME "TimeUpdate"
40 #define OVERTEMP_TIMEOUT 30
42 static int overtemp_timer = OVERTEMP_TIMEOUT;
43 static Evas_Object *timer_label;
45 static const struct popup_ops overheat_ops;
46 static const struct popup_ops overheat_poweroff_warning_ops;
47 static const struct popup_ops remove_overheat_popups_ops;
48 static void register_handlers(const struct popup_ops *ops);
49 static void unregister_handlers(const struct popup_ops *ops);
50 static void overheat_poweroff(const struct popup_ops *ops);
51 static int overheat_launch(bundle *b, const struct popup_ops *ops);
52 static void overheat_poweroff_warning_terminate(const struct popup_ops *ops);
53 static int add_dbus_signal_handler(const struct popup_ops *ops);
54 static void remove_dbus_signal_handler(void);
55 static __attribute__ ((constructor)) void overheat_register_popup(void);
56 static E_DBus_Signal_Handler *overheat_sig_handler = NULL;
58 static char *items[] = {
59 "IDS_IDLE_HEADER_PHONE_OVERHEATING_ABB",
60 "IDS_QP_POP_YOUR_DEVICE_IS_OVERHEATING_IT_WILL_NOW_POWER_OFF_TO_COOL_DOWN",
61 "IDS_IDLE_POP_PD_SECONDS_ARE_LEFT_BEFORE_YOUR_DEVICE_POWERS_OFF",
62 "IDS_ST_BUTTON_TURN_OFF_NOW",
66 char* gl_text_get(int index)
68 char *text = NULL, buffer[BUF_MAX] = {'\0',};
72 snprintf(buffer, sizeof(buffer), text, overtemp_timer);
74 return strdup(buffer);
75 } else return strdup(_(items[index]));
79 _popup_turnoff_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info)
81 const struct popup_ops *ops = data;
83 overheat_poweroff(ops);
87 _popup_cancel_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info)
89 const struct popup_ops *ops = data;
92 unload_simple_popup(ops);
93 load_simple_popup(b, &overheat_poweroff_warning_ops);
96 static void update_overtemp_time(void *data, DBusMessage *msg)
102 ret = dbus_message_is_signal(msg, OVERHEAT_INTERFACE, SIGNAL_OVERHEAT_TIME);
104 _E("No overheat SIG.");
108 dbus_error_init(&err);
109 if (dbus_message_get_args(msg, &err,
110 DBUS_TYPE_INT32, &time,
111 DBUS_TYPE_INVALID) == 0) {
112 dbus_error_free(&err);
115 dbus_error_free(&err);
117 overtemp_timer = time;
118 elm_object_text_set(timer_label, gl_text_get(2));
120 remove_dbus_signal_handler();
123 static void unregister_handlers(const struct popup_ops *ops)
128 static void register_handlers(const struct popup_ops *ops)
133 static void overheat_poweroff(const struct popup_ops *ops)
135 static int bPowerOff = 0;
144 unload_simple_popup(ops);
146 param[0] = REBOOT_OPERATION_OFF;
147 snprintf(data, sizeof(data), "0");
149 ret = popup_dbus_method_sync(DEVICED_BUS_NAME,
151 REBOOT_INTERFACE_NAME,
155 _E("Failed to request poweroff to deviced: %d", ret);
158 static int overheat_poweroff_warning_launch(bundle *b, const struct popup_ops *ops)
160 register_handlers(ops);
164 static int add_dbus_signal_handler(const struct popup_ops *ops)
166 E_DBus_Connection *conn;
168 conn = get_dbus_connection();
170 _E("Failed to get dbus connection.");
174 overheat_sig_handler = e_dbus_signal_handler_add(
178 SIGNAL_OVERHEAT_TIME,
179 update_overtemp_time,
181 if (!overheat_sig_handler) {
182 _E("Failed to add signal handler.");
189 static void remove_dbus_signal_handler(void)
191 E_DBus_Connection *conn;
193 if (!overheat_sig_handler) {
194 _E("No available sig handler for overheat.");
198 conn = get_dbus_connection();
200 overheat_sig_handler = NULL;
201 _E("No Dbus connection for overheat sig.");
205 e_dbus_signal_handler_del(conn, overheat_sig_handler);
206 overheat_sig_handler = NULL;
209 static int overheat_launch(bundle *b, const struct popup_ops *ops)
213 register_handlers(ops);
215 ret = add_dbus_signal_handler(ops);
217 _E("Failed to add dbus handler: %d", ret);
222 static void overheat_terminate(const struct popup_ops *ops)
224 unregister_handlers(ops);
225 remove_dbus_signal_handler();
228 static void overheat_poweroff_warning_terminate(const struct popup_ops *ops)
230 unregister_handlers(ops);
233 static bool overheat_skip(bundle *b, const struct popup_ops *ops)
235 struct object_ops *obj;
238 ret = get_object_by_ops(&overheat_ops, &obj);
239 if (ret == 0 && obj->popup)
242 ret = get_object_by_ops(&overheat_poweroff_warning_ops, &obj);
243 if (ret == 0 && obj->popup)
249 int overheat_popup(bundle *b, const struct popup_ops *ops)
254 Evas_Object *progressbar;
255 Evas_Object *scroller1, *scroller2;
258 struct object_ops *obj;
261 ret = get_object_by_ops(ops, &obj);
263 _E("Failed to get object: %d", ret);
271 evas_object_show(win);
273 popup = elm_popup_add(win);
278 elm_popup_align_set(popup, ELM_NOTIFY_ALIGN_FILL, 1.0);
279 elm_object_part_text_set(popup, "title,text", gl_text_get(0));
280 evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
283 layout = elm_layout_add(popup);
284 elm_layout_file_set(layout, ELM_OVERHEAT_EDC, "overheat_view_layout");
285 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
288 btn = elm_button_add(popup);
289 elm_object_style_set(btn, "bottom");
290 elm_object_text_set(btn, gl_text_get(4));
291 elm_object_part_content_set(popup, "button1", btn);
292 evas_object_smart_callback_add(btn, "clicked", _popup_cancel_btn_clicked_cb, ops);
294 /* turn off button */
295 btn = elm_button_add(popup);
296 elm_object_style_set(btn, "bottom");
297 elm_object_text_set(btn, gl_text_get(3));
298 elm_object_part_content_set(popup, "button2", btn);
299 evas_object_smart_callback_add(btn, "clicked", _popup_turnoff_btn_clicked_cb, ops);
302 eext_object_event_callback_add(popup, EEXT_CALLBACK_BACK, event_back_key_up, (void*)ops);
305 scroller1 = elm_scroller_add(layout);
306 elm_scroller_bounce_set(scroller1, EINA_TRUE, EINA_TRUE);
307 elm_scroller_policy_set(scroller1, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO);
308 elm_object_part_content_set(layout, "elm.swallow.content1", scroller1);
310 scroller2 = elm_scroller_add(layout);
311 elm_scroller_bounce_set(scroller2, EINA_TRUE, EINA_TRUE);
312 elm_scroller_policy_set(scroller2, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO);
313 elm_object_part_content_set(layout, "elm.swallow.content2", scroller2);
316 label1 = elm_label_add(scroller1);
317 elm_object_style_set(label1, "popup/default");
318 elm_label_line_wrap_set(label1, ELM_WRAP_MIXED);
319 elm_object_text_set(label1, gl_text_get(1));
320 evas_object_size_hint_weight_set(label1, EVAS_HINT_EXPAND, 0.0);
321 evas_object_size_hint_align_set(label1, EVAS_HINT_FILL, EVAS_HINT_FILL);
322 evas_object_show(label1);
323 elm_object_content_set(scroller1, label1);
325 timer_label = elm_label_add(scroller2);
326 elm_object_style_set(timer_label, "popup/default");
327 elm_label_line_wrap_set(timer_label, ELM_WRAP_MIXED);
328 elm_object_text_set(timer_label, gl_text_get(2));
330 evas_object_size_hint_weight_set(timer_label, EVAS_HINT_EXPAND, 0.0);
331 evas_object_size_hint_align_set(timer_label, EVAS_HINT_FILL, EVAS_HINT_FILL);
332 evas_object_show(timer_label);
333 elm_object_content_set(scroller2, timer_label);
336 progressbar = elm_progressbar_add(layout);
337 elm_object_style_set(progressbar, "process_large");
338 evas_object_size_hint_align_set(progressbar, EVAS_HINT_FILL, 0.5);
339 evas_object_size_hint_weight_set(progressbar, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
340 elm_progressbar_pulse(progressbar, EINA_TRUE);
341 elm_object_part_content_set(layout, "processing", progressbar);
342 evas_object_data_set(popup, "progressbar", progressbar);
344 elm_object_content_set(popup, layout);
345 evas_object_show(popup);
351 static int remove_all_overheat_popups(bundle *b, const struct popup_ops *ops)
353 unload_simple_popup(&overheat_ops);
354 unload_simple_popup(&overheat_poweroff_warning_ops);
355 terminate_if_no_popup();
360 static const struct popup_ops remove_overheat_popups_ops = {
361 .name = "remove_overheat_popups",
362 .show = remove_all_overheat_popups,
365 static const struct popup_ops overheat_ops = {
366 .name = "overheat", //overheat first popup
367 .pattern = FEEDBACK_PATTERN_LOWBATT,
368 .show = overheat_popup,
369 .skip = overheat_skip,
370 .pre = overheat_launch,
371 .terminate = overheat_terminate,
374 static const struct popup_ops overheat_poweroff_warning_ops = {
375 .name = "overheat_poweroff_warning", //overheat second popup
376 .show = load_simple_popup,
377 .title = "IDS_IDLE_HEADER_PHONE_POWERING_OFF_ABB",
378 .content = "IDS_QP_POP_YOUR_DEVICE_OVERHEATED_IT_POWERED_OFF_TO_PREVENT_DAMAGE_MSG",
379 .left_text = "IDS_COM_SK_OK",
380 .pre = overheat_poweroff_warning_launch,
381 .terminate = overheat_poweroff_warning_terminate,
384 /* Constructor to register lowbattery button */
385 static __attribute__ ((constructor)) void overheat_register_popup(void)
387 register_popup(&overheat_ops);
388 register_popup(&overheat_poweroff_warning_ops);
389 register_popup(&remove_overheat_popups_ops);