4 * Copyright (c) 2012 - 2013 Samsung Electronics Co., Ltd.
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.
21 * @file display-dbus.c
22 * @brief dbus interface
28 #include <libsyscommon/libgdbus.h>
29 #include <device/display.h>
31 #include "ambient-mode.h"
35 #include "lock-detector.h"
36 #include "shared/common.h"
37 #include "shared/devices.h"
38 #include "shared/device-notifier.h"
39 #include "shared/apps.h"
40 #include "dd-display.h"
41 #include "display-actor.h"
42 #include "display-ops.h"
44 #include "shared/plugin.h"
45 #include "display-lock.h"
47 #define AUL_APPSTATUS_PATH "/Org/Tizen/Aul/AppStatus"
48 #define AUL_APPSTATUS_INTERFACE "org.tizen.aul.AppStatus"
49 #define APP_CHANGE_STATE "AppStatusChange"
50 #define APP_TERMINATED "AppTerminated"
52 #define TELEPHONY_PATH "/org/tizen/telephony"
53 #define TELEPHONY_INTERFACE_SIM "org.tizen.telephony.Manager"
54 #define SIGNAL_SIM_STATUS "SimInserted"
55 #define SIM_CARD_NOT_PRESENT (0x0)
57 #ifndef VCONFKEY_LCD_BRIGHTNESS_INIT
58 #define VCONFKEY_LCD_BRIGHTNESS_INIT "db/private/deviced/lcd_brightness_init"
61 #define DISPLAY_DIM_BRIGHTNESS 0
62 #define DUMP_MODE_WATING_TIME 600000
64 #define LCDOFF_PROXI_STR "proximity"
65 #define LCDOFF_GESTURE_STR "gesture"
67 #define EXPIRED_POPUP_TYPE_POWER "power_lock_expired"
68 #define EXPIRED_POPUP_PID "_APP_PID_"
69 #define EXPIRED_POPUP_COMM "_APP_COMM_"
70 #define EXPIRED_POPUP_ID "_REQUEST_ID_"
72 static struct display_plugin *disp_plgn;
73 static struct _backlight_ops *backlight_ops;
74 static struct _display_white_balance_ops *display_white_balance_ops;
75 static struct display_config *display_conf;
77 static GVariant *dbus_start(GDBusConnection *conn,
78 const gchar *sender, const gchar *path, const gchar *iface, const gchar *name,
79 GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data)
81 static const struct device_ops *display_device_ops = NULL;
83 if (!display_device_ops)
84 display_device_ops = find_device("display");
85 if (NOT_SUPPORT_OPS(display_device_ops))
88 display_device_ops->start(CORE_LOGIC_MODE);
90 return gdbus_new_g_variant_tuple();
93 static GVariant *dbus_stop(GDBusConnection *conn,
94 const gchar *sender, const gchar *path, const gchar *iface, const gchar *name,
95 GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data)
97 static const struct device_ops *display_device_ops = NULL;
99 if (!display_device_ops)
100 display_device_ops = find_device("display");
101 if (NOT_SUPPORT_OPS(display_device_ops))
104 if (disp_plgn->pm_change_internal)
105 disp_plgn->pm_change_internal(INTERNAL_LOCK_PM, LCD_NORMAL);
107 display_device_ops->stop(CORE_LOGIC_MODE);
109 return gdbus_new_g_variant_tuple();
112 static GVariant *dbus_lockstate(GDBusConnection *conn,
113 const gchar *sender, const gchar *path, const gchar *iface, const gchar *name,
114 GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data)
126 g_variant_get(param, "(sssi)", &state_str, &option1_str, &option2_str, &timeout);
128 if (!state_str || timeout < 0) {
129 _E("message is invalid!");
134 if (!strcmp(state_str, "privilege check"))
137 pid = gdbus_connection_get_sender_pid(conn, sender);
138 if (pid == -1 || kill(pid, 0) == -1) {
139 _E("%d process does not exist, dbus ignored!", pid);
144 if (!strcmp(state_str, PM_LCDON_STR))
146 else if (!strcmp(state_str, PM_LCDDIM_STR)) {
147 if (!display_conf->dimming) {
148 _E("LCD_DIM lock is not supported.");
153 } else if (!strcmp(state_str, PM_LCDOFF_STR))
156 _E("%s state is invalid, dbus ignored.", state_str);
161 if (!strcmp(option1_str, STAYCURSTATE_STR))
162 flag = STAY_CUR_STATE;
163 else if (!strcmp(option1_str, GOTOSTATENOW_STR))
164 flag = GOTO_STATE_NOW;
166 _E("%s option is invalid. set default option!", option1_str);
167 flag = STAY_CUR_STATE;
170 if (!strcmp(option2_str, HOLDKEYBLOCK_STR))
171 flag |= HOLD_KEY_BLOCK;
173 if (flag & GOTO_STATE_NOW) {
174 caps = display_get_caps(DISPLAY_ACTOR_API);
176 if (!display_has_caps(caps, DISPLAY_CAPA_LCDON) &&
177 state == LCD_NORMAL) {
178 _D("No lcdon capability!");
182 if (!display_has_caps(caps, DISPLAY_CAPA_LCDOFF) &&
184 _D("No lcdoff capability!");
190 if (check_dimstay(state, flag) == true) {
191 _E("LCD state can not be changed to OFF state now!");
192 flag &= ~GOTO_STATE_NOW;
193 flag |= STAY_CUR_STATE;
196 if (disp_plgn->pm_lock_internal)
197 ret = disp_plgn->pm_lock_internal(pid, state, flag, timeout);
202 return g_variant_new("(i)", ret);
205 static GVariant *dbus_unlockstate(GDBusConnection *conn,
206 const gchar *sender, const gchar *path, const gchar *iface, const gchar *name,
207 GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data)
216 g_variant_get(param, "(ss)", &state_str, &option_str);
219 _E("message is invalid!");
224 if (!strcmp(state_str, "privilege check"))
227 pid = gdbus_connection_get_sender_pid(conn, sender);
228 if (pid == -1 || kill(pid, 0) == -1) {
229 _E("%d process does not exist, dbus ignored!", pid);
234 if (!strcmp(state_str, PM_LCDON_STR))
236 else if (!strcmp(state_str, PM_LCDDIM_STR)) {
237 if (!display_conf->dimming) {
238 _E("LCD_DIM unlock is not supported.");
243 } else if (!strcmp(state_str, PM_LCDOFF_STR))
246 _E("%s state is invalid, dbus ignored!", state_str);
251 if (!strcmp(option_str, SLEEP_MARGIN_STR))
252 flag = PM_SLEEP_MARGIN;
253 else if (!strcmp(option_str, RESET_TIMER_STR))
254 flag = PM_RESET_TIMER;
255 else if (!strcmp(option_str, KEEP_TIMER_STR))
256 flag = PM_KEEP_TIMER;
258 _E("%s option is invalid. set default option!", option_str);
259 flag = PM_RESET_TIMER;
262 if (disp_plgn->pm_unlock_internal)
263 ret = disp_plgn->pm_unlock_internal(pid, state, flag);
267 return g_variant_new("(i)", ret);
270 static GVariant *dbus_changestate(GDBusConnection *conn,
271 const gchar *sender, const gchar *path, const gchar *iface, const gchar *name,
272 GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data)
277 int ret = 0, len, lcdon_blocked;
280 g_variant_get(param, "(s)", &state_str);
283 _E("message is invalid!");
288 if (!strcmp(state_str, "privilege check"))
291 pid = gdbus_connection_get_sender_pid(conn, sender);
292 if (pid == -1 || kill(pid, 0) == -1) {
293 _E("%d process does not exist, dbus ignored!", pid);
298 len = strlen(state_str);
304 if (!strcmp(state_str, PM_LCDON_STR))
306 else if (!strcmp(state_str, PM_LCDDIM_STR)) {
307 if (!display_conf->dimming) {
308 _E("LCD_DIM state is not supported.");
313 } else if (!strcmp(state_str, PM_LCDOFF_STR))
315 else if (!strcmp(state_str, PM_STANDBY_STR))
317 else if (!strcmp(state_str, PM_SUSPEND_STR))
320 _E("%s state is invalid, dbus ignored!", state_str);
325 caps = display_get_caps(DISPLAY_ACTOR_API);
327 if (!display_has_caps(caps, DISPLAY_CAPA_LCDON) &&
328 state == LCD_NORMAL) {
329 _D("No lcdon capability!");
333 if (!display_has_caps(caps, DISPLAY_CAPA_LCDOFF) &&
335 _D("No lcdoff capability!");
340 lcdon_blocked = is_lcdon_blocked();
341 if (lcdon_blocked != LCDON_BLOCK_NONE) {
342 if (state == LCD_NORMAL || state == LCD_DIM) {
343 _W("LCDON is blocked, %d.", lcdon_blocked);
349 if (check_dimstay(state, GOTO_STATE_NOW) == true) {
350 _E("LCD state can not be changed to OFF state! by %d", pid);
355 if (disp_plgn->pm_change_internal)
356 ret = disp_plgn->pm_change_internal(pid, state);
358 if (!ret && state == LCD_OFF)
359 update_lcdoff_source(VCONFKEY_PM_LCDOFF_BY_TIMEOUT);
362 return g_variant_new("(i)", ret);
365 static GVariant *dbus_getdisplaycount(GDBusConnection *conn,
366 const gchar *sender, const gchar *path, const gchar *iface, const gchar *name,
367 GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data)
371 ret = DEFAULT_DISPLAY_COUNT;
373 return g_variant_new("(i)", ret);
376 static GVariant *dbus_getmaxbrightness(GDBusConnection *conn,
377 const gchar *sender, const gchar *path, const gchar *iface, const gchar *name,
378 GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data)
382 g_variant_get(param, "(i)", &state);
383 if (state == DISPLAY_STATE_NORMAL)
384 ret = DEFAULT_DISPLAY_MAX_BRIGHTNESS;
385 else if (state == DISPLAY_STATE_SCREEN_DIM)
386 ret = DEFAULT_DISPLAY_MAX_DIM_BRIGHTNESS;
390 return g_variant_new("(i)", ret);
393 static GVariant *dbus_setmaxbrightness(GDBusConnection *conn,
394 const gchar *sender, const gchar *path, const gchar *iface, const gchar *name,
395 GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data)
401 return g_variant_new("(i)", ret);
404 static GVariant *dbus_getbrightness(GDBusConnection *conn,
405 const gchar *sender, const gchar *path, const gchar *iface, const gchar *name,
406 GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data)
408 int brt = -1, ret, result;
410 if (get_pm_cur_state() == S_NORMAL) {
411 ret = backlight_ops->get_brightness(&brt);
416 } else if (get_pm_cur_state() == S_LCDDIM) {
417 ret = vconf_get_int(VCONFKEY_SETAPPL_LCD_DIM_BRIGHTNESS, &brt);
419 _E("Failed to get vconf value for lcd dim brightness: %d", vconf_get_ext_errno());
425 result = backlight_ops->get_default_brt();
429 _I("get brightness %d, %d", brt, result);
431 return g_variant_new("(i)", result);
434 static GVariant *dbus_setbrightness(GDBusConnection *conn,
435 const gchar *sender, const gchar *path, const gchar *iface, const gchar *name,
436 GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data)
438 int state, brt, autobrt, ret = 0, caps;
441 caps = display_get_caps(DISPLAY_ACTOR_API);
443 if (!display_has_caps(caps, DISPLAY_CAPA_BRIGHTNESS)) {
444 _D("No brightness changing capability!");
449 g_variant_get(param, "(ii)", &state, &brt);
451 //Check if brt is same with DIM
452 if (brt == DISPLAY_DIM_BRIGHTNESS) {
453 _E("application can not set this value(DIM VALUE:%d)", brt);
458 ret = vconf_get_int(VCONFKEY_SETAPPL_BRIGHTNESS_AUTOMATIC_INT, &autobrt);
460 _E("Failed to get vconf value for automatic brightness: %d", vconf_get_ext_errno());
461 autobrt = SETTING_BRIGHTNESS_AUTOMATIC_OFF;
464 if (autobrt == SETTING_BRIGHTNESS_AUTOMATIC_ON) {
465 _E("auto_brightness state is ON, can not change the brightness value");
470 clear_pm_status_flag(DIM_MASK);
471 if (state == DISPLAY_STATE_NORMAL) {
472 if (disp_plgn->auto_brightness_control) {
473 ret = disp_plgn->auto_brightness_control(BR_SET_BRIGHTNESS, brt);
475 backlight_ops->set_default_brt(brt);
476 ret = backlight_ops->set_brightness(brt);
479 ret = vconf_set_int(VCONFKEY_SETAPPL_LCD_BRIGHTNESS, brt);
481 _E("Failed to set vconf value for lcd brightness: %d", vconf_get_ext_errno());
483 } else if (state == DISPLAY_STATE_SCREEN_DIM) {
484 if (get_pm_cur_state() == S_LCDDIM) {
485 ret = backlight_ops->set_brightness(brt);
490 ret = vconf_set_int(VCONFKEY_SETAPPL_LCD_DIM_BRIGHTNESS, brt);
492 _E("Failed to set vconf value for lcd dim brightness: %d", vconf_get_ext_errno());
496 pid = gdbus_connection_get_sender_pid(conn, sender);
497 _I("Set brightness pid=%d brt=%d ret=%d", pid, brt, ret);
500 return g_variant_new("(i)", ret);
503 static GVariant *dbus_holdbrightness(GDBusConnection *conn,
504 const gchar *sender, const gchar *path, const gchar *iface, const gchar *name,
505 GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data)
507 int brt, autobrt, ret, caps;
510 caps = display_get_caps(DISPLAY_ACTOR_API);
512 if (!display_has_caps(caps, DISPLAY_CAPA_BRIGHTNESS)) {
513 _D("No brightness changing capability!");
518 g_variant_get(param, "(i)", &brt);
520 if (brt == DISPLAY_DIM_BRIGHTNESS) {
521 _E("application can not set this value(DIM VALUE:%d)", brt);
526 ret = vconf_get_int(VCONFKEY_SETAPPL_BRIGHTNESS_AUTOMATIC_INT, &autobrt);
528 _E("Failed to get vconf value for automatic brightness: %d", vconf_get_ext_errno());
529 autobrt = SETTING_BRIGHTNESS_AUTOMATIC_OFF;
532 ret = vconf_set_int(VCONFKEY_PM_CUSTOM_BRIGHTNESS_STATUS, VCONFKEY_PM_CUSTOM_BRIGHTNESS_ON);
534 _E("Failed to set vconf value for custom brightness status: %d", vconf_get_ext_errno());
536 if (disp_plgn->auto_brightness_control)
537 ret = disp_plgn->auto_brightness_control(BR_HOLD_BRIGHTNESS, brt);
539 ret = backlight_ops->set_brightness(brt);
544 if (autobrt == SETTING_BRIGHTNESS_AUTOMATIC_ON) {
545 _D("Auto brightness will be paused");
546 ret = vconf_set_int(VCONFKEY_SETAPPL_BRIGHTNESS_AUTOMATIC_INT, SETTING_BRIGHTNESS_AUTOMATIC_PAUSE);
548 _E("Failed to set vconf value for automatic brightness: %d", vconf_get_ext_errno());
551 pid = gdbus_connection_get_sender_pid(conn, sender);
552 _I("Hold brightness pid=%d brt=%d ret=%d", pid, brt, ret);
555 return g_variant_new("(i)", ret);
558 static GVariant *dbus_releasebrightness(GDBusConnection *conn,
559 const gchar *sender, const gchar *path, const gchar *iface, const gchar *name,
560 GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data)
562 int bat, charger, changed, setting, brt, autobrt, ret = 0;
565 pid = gdbus_connection_get_sender_pid(conn, sender);
566 _I("Release brightness pid=%d", pid);
568 ret = vconf_get_int(VCONFKEY_SYSMAN_BATTERY_STATUS_LOW, &bat);
570 _E("Failed to get vconf value for battery status low: %d", vconf_get_ext_errno());
575 ret = vconf_get_int(VCONFKEY_SYSMAN_CHARGER_STATUS, &charger);
577 _E("Failed to get vconf value for charger status: %d", vconf_get_ext_errno());
582 ret = vconf_get_bool(VCONFKEY_PM_BRIGHTNESS_CHANGED_IN_LPM, &changed);
584 _E("Failed to get vconf value for brightness changed in lpm: %d", vconf_get_ext_errno());
589 ret = vconf_get_int(VCONFKEY_SETAPPL_LCD_BRIGHTNESS, &setting);
591 _E("Failed to get vconf value for lcd brightness: %d", vconf_get_ext_errno());
596 ret = vconf_get_int(VCONFKEY_SETAPPL_BRIGHTNESS_AUTOMATIC_INT, &autobrt);
598 _E("Failed to get vconf value for automatic brightness: %d", vconf_get_ext_errno());
603 ret = vconf_set_int(VCONFKEY_PM_CUSTOM_BRIGHTNESS_STATUS, VCONFKEY_PM_CUSTOM_BRIGHTNESS_OFF);
605 _E("Failed to set vconf value for custom brightness status: %d", vconf_get_ext_errno());
607 ret = backlight_ops->get_brightness(&brt);
612 if (!disp_plgn->auto_brightness_control && low_battery_state(bat) &&
613 charger == VCONFKEY_SYSMAN_CHARGER_DISCONNECTED && !changed) {
614 _D("batt warning low : brightness is not changed!");
616 backlight_ops->set_brightness(0);
620 if (autobrt == SETTING_BRIGHTNESS_AUTOMATIC_OFF) {
621 if (disp_plgn->auto_brightness_control) {
622 disp_plgn->auto_brightness_control(BR_RELEASE_BRIGHTNESS, BR_IMPLICIT);
625 backlight_ops->set_brightness(setting);
627 } else if (autobrt == SETTING_BRIGHTNESS_AUTOMATIC_PAUSE) {
628 _D("Auto brightness will be enable");
629 ret = vconf_set_int(VCONFKEY_SETAPPL_BRIGHTNESS_AUTOMATIC_INT, SETTING_BRIGHTNESS_AUTOMATIC_ON);
631 _E("Failed to set vconf value for automatic brightness: %d", vconf_get_ext_errno());
635 return g_variant_new("(i)", ret);
638 static GVariant *dbus_setrefreshrate(GDBusConnection *conn,
639 const gchar *sender, const gchar *path, const gchar *iface, const gchar *name,
640 GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data)
642 int app, val, ret, control;
644 g_variant_get(param, "(ii)", &app, &val);
646 if (app < 0 || app >= ARRAY_SIZE(display_conf->framerate_app) || val < 0) {
651 if (!display_conf->framerate_app[app]) {
652 _I("This case(%d) is not support in this target", app);
657 control = display_conf->control_display;
660 backlight_ops->off(NORMAL_MODE);
662 _D("app : %d, value : %d", app, val);
663 ret = backlight_ops->set_frame_rate(val);
665 _E("Failed to set frame rate (%d)", ret);
668 backlight_ops->on(NORMAL_MODE);
671 return g_variant_new("(i)", ret);
674 static GVariant *dbus_setautobrightnessmin(GDBusConnection *conn,
675 const gchar *sender, const gchar *path, const gchar *iface, const gchar *name,
676 GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data)
682 if (!display_info.set_autobrightness_min) {
686 g_variant_get(param, "(i)", &val);
688 pid = gdbus_connection_get_sender_pid(conn, sender);
689 if (pid == -1 || kill(pid, 0) == -1) {
690 _E("%d process does not exist, dbus ignored!", pid);
694 ret = display_info.set_autobrightness_min(val, (char *)sender);
696 _W("fail to set autobrightness min %d, %d by %d", val, ret, pid);
699 if (display_info.reset_autobrightness_min) {
700 id = gdbus_watch_name(sender, display_info.reset_autobrightness_min, NULL, NULL, NULL);
702 _E("failed to watch name %s, id %d", sender, id);
703 //todo: set return value
705 _I("set autobrightness min %d by %d", val, pid);
708 return g_variant_new("(i)", ret);
711 static GVariant *dbus_setlcdtimeout(GDBusConnection *conn,
712 const gchar *sender, const gchar *path, const gchar *iface, const gchar *name,
713 GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data)
715 int on, dim, holdkey_block, ret;
719 g_variant_get(param, "(iii)", &on, &dim, &holdkey_block);
721 pid = gdbus_connection_get_sender_pid(conn, sender);
722 if (pid == -1 || kill(pid, 0) == -1) {
723 _E("%d process does not exist, dbus ignored!", pid);
728 ret = set_lcd_timeout(on, dim, holdkey_block, sender);
730 _W("fail to set lcd timeout %d by %d", ret, pid);
732 id = gdbus_watch_name(sender, reset_lcd_timeout, NULL, NULL, NULL);
734 _E("failed to watch name %s, id %d", sender, id);
735 //todo: set return value
737 _I("set lcd timeout on %d, dim %d, holdblock %d by %d",
738 on, dim, holdkey_block, pid);
742 return g_variant_new("(i)", ret);
745 static GVariant *dbus_lockscreenbgon(GDBusConnection *conn,
746 const gchar *sender, const gchar *path, const gchar *iface, const gchar *name,
747 GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data)
752 g_variant_get(param, "(s)", &on);
754 if (!strcmp(on, "true")) {
755 if (disp_plgn->update_pm_setting)
756 disp_plgn->update_pm_setting(SETTING_LOCK_SCREEN_BG, true);
757 } else if (!strcmp(on, "false")) {
758 if (disp_plgn->update_pm_setting)
759 disp_plgn->update_pm_setting(SETTING_LOCK_SCREEN_BG, false);
764 return g_variant_new("(i)", ret);
767 static GVariant *dbus_dumpmode(GDBusConnection *conn,
768 const gchar *sender, const gchar *path, const gchar *iface, const gchar *name,
769 GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data)
774 g_variant_get(param, "(s)", &on);
776 if (!strcmp(on, "on")) {
778 if (disp_plgn->pm_lock_internal)
779 disp_plgn->pm_lock_internal(INTERNAL_LOCK_DUMPMODE, LCD_OFF,
780 STAY_CUR_STATE, DUMP_MODE_WATING_TIME);
781 backlight_ops->release_blink();
782 } else if (!strcmp(on, "off")) {
783 if (disp_plgn->pm_unlock_internal)
784 disp_plgn->pm_unlock_internal(INTERNAL_LOCK_DUMPMODE, LCD_OFF, PM_SLEEP_MARGIN);
785 backlight_ops->blink(0);
786 } else if (!strcmp(on, "blink")) {
787 backlight_ops->blink(500);
793 return g_variant_new("(i)", ret);
796 static GVariant *dbus_savelog(GDBusConnection *conn,
797 const gchar *sender, const gchar *path, const gchar *iface, const gchar *name,
798 GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data)
801 return gdbus_new_g_variant_tuple();
804 static GVariant *dbus_powerkeyignore(GDBusConnection *conn,
805 const gchar *sender, const gchar *path, const gchar *iface, const gchar *name,
806 GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data)
811 g_variant_get(param, "(i)", &on);
813 if (CHECK_OPS(keyfilter_ops, set_powerkey_ignore))
814 keyfilter_ops->set_powerkey_ignore(on == 1 ? true : false);
816 return g_variant_new("(i)", ret);
819 static GVariant *dbus_powerkeylcdoff(GDBusConnection *conn,
820 const gchar *sender, const gchar *path, const gchar *iface, const gchar *name,
821 GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data)
825 if (CHECK_OPS(keyfilter_ops, powerkey_lcdoff))
826 ret = keyfilter_ops->powerkey_lcdoff();
830 return g_variant_new("(i)", ret);
833 static GVariant *dbus_customlcdon(GDBusConnection *conn,
834 const gchar *sender, const gchar *path, const gchar *iface, const gchar *name,
835 GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data)
838 int timeout, lcdon_blocked;
841 pid = gdbus_connection_get_sender_pid(conn, sender);
842 _I("Change state to S_LCDON pid=%d", pid);
844 g_variant_get(param, "(i)", &timeout);
846 lcdon_blocked = is_lcdon_blocked();
847 if (lcdon_blocked != LCDON_BLOCK_NONE) {
848 _W("LCDON is blocked, %d.", lcdon_blocked);
849 return g_variant_new("(i)", -ENOTSUP);
852 ret = custom_lcdon(timeout);
854 return g_variant_new("(i)", ret);
857 static GVariant *dbus_customlcdoff(GDBusConnection *conn,
858 const gchar *sender, const gchar *path, const gchar *iface, const gchar *name,
859 GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data)
862 enum device_flags flag;
863 char *reason_str = NULL;
866 pid = gdbus_connection_get_sender_pid(conn, sender);
867 _I("Change state to S_LCDOFF pid=%d", pid);
869 g_variant_get(param, "(s)", &reason_str);
871 if (!strcmp(reason_str, LCDOFF_PROXI_STR))
872 flag = LCD_OFF_BY_PROXIMITY;
873 else if (!strcmp(reason_str, LCDOFF_GESTURE_STR))
874 flag = LCD_OFF_BY_GESTURE;
876 _E("%s resean is invalid, dbus ignored!", reason_str);
881 ret = custom_lcdoff(flag);
886 return g_variant_new("(i)", ret);
889 static GVariant *dbus_changestatebyreason(GDBusConnection *conn,
890 const gchar *sender, const gchar *path, const gchar *iface, const gchar *name,
891 GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data)
894 int next_state, timeout;
895 char *reason = NULL, *state = NULL;
898 g_variant_get(param, "(isi)", &next_state, &reason, &timeout);
900 if (next_state == DISPLAY_STATE_NORMAL) {
902 ret = display_on_by_reason(reason, timeout);
903 } else if (next_state == DISPLAY_STATE_SCREEN_OFF) {
905 ret = display_off_by_reason(reason);
906 } else if (next_state == DISPLAY_STATE_SCREEN_DIM) {
914 pid = gdbus_connection_get_sender_pid(conn, sender);
915 _I("Change state pid=%d state=%s reason=%s ret=%d", pid, state, reason, ret);
918 return g_variant_new("(i)", ret);
921 static GVariant *dbus_staytouchscreenoff(GDBusConnection *conn,
922 const gchar *sender, const gchar *path, const gchar *iface, const gchar *name,
923 GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data)
929 pid = gdbus_connection_get_sender_pid(conn, sender);
930 _I("Stay touchscreen off pid=%d", pid);
932 g_variant_get(param, "(i)", &val);
934 set_stay_touchscreen_off(val);
936 return g_variant_new("(i)", ret);
939 static GVariant *dbus_lcdpaneloffmode(GDBusConnection *conn,
940 const gchar *sender, const gchar *path, const gchar *iface, const gchar *name,
941 GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data)
947 pid = gdbus_connection_get_sender_pid(conn, sender);
948 _I("Set lcd panel off mode pid=%d", pid);
950 g_variant_get(param, "(i)", &val);
952 set_lcd_paneloff_mode(val);
954 return g_variant_new("(i)", ret);
957 static GVariant *dbus_actorcontrol(GDBusConnection *conn,
958 const gchar *sender, const gchar *path, const gchar *iface, const gchar *name,
959 GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data)
961 int ret = 0, val, actor;
964 g_variant_get(param, "(sii)", &op, &actor, &val);
966 if (!strcmp(op, "set"))
967 ret = display_set_caps(actor, val);
968 else if (!strcmp(op, "reset"))
969 ret = display_reset_caps(actor, val);
974 return g_variant_new("(i)", ret);
977 static GVariant *dbus_getcustombrightness(GDBusConnection *conn,
978 const gchar *sender, const gchar *path, const gchar *iface, const gchar *name,
979 GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data)
983 status = backlight_ops->get_custom_status();
985 return g_variant_new("(i)", status);
988 struct pmlock_expired_s {
990 GDBusMethodInvocation *invocation;
995 static GList *expired_req_list;
997 static GVariant *dbus_locktimeout_expired(GDBusConnection *conn,
998 const gchar *sender, const gchar *path, const gchar *iface, const gchar *name,
999 GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data)
1005 char comm[NAME_MAX];
1006 struct pmlock_expired_s *ex = NULL;
1007 GVariant *gvar = NULL;
1009 g_variant_get(param, "(s)", &req_id);
1011 pid = gdbus_connection_get_sender_pid(conn, sender);
1012 if (pid == -1 || kill(pid, 0) == -1) {
1013 _E("%d process does not exist, dbus ignored!", pid);
1018 ret = get_command(pid, comm, sizeof(comm));
1020 _E("Failed to get command (%d)", ret);
1024 ex = calloc(1, sizeof(struct pmlock_expired_s));
1026 _E("calloc() failed");
1031 snprintf(pid_str, sizeof(pid_str), "%d", pid);
1032 ret = launch_system_app(APP_DEFAULT, 8,
1034 EXPIRED_POPUP_TYPE_POWER,
1042 _E("Failed to launch pmlock expired popup(%d)", ret);
1047 snprintf(ex->req_id, sizeof(ex->req_id), "%s", req_id);
1049 ex->invocation = invocation;
1051 SYS_G_LIST_APPEND(expired_req_list, ex);
1057 gvar = g_variant_new("(i)", ret);
1064 static gboolean app_term(gpointer data)
1066 struct pmlock_expired_s *ex = data;
1069 if (ex->pid > 0 && kill(ex->pid, 0) != -1) {
1070 if (kill(ex->pid, SIGKILL) == -1)
1071 _E("failed to kill pid(%d), err(%m)", ex->pid);
1075 return G_SOURCE_REMOVE;
1078 static gboolean expired_deliver_result(gpointer data)
1080 struct pmlock_expired_s *ex = data;
1081 struct pmlock_expired_s *item = NULL;
1088 return G_SOURCE_REMOVE;
1090 len = strlen(ex->req_id) + 1;
1091 SYS_G_LIST_FOREACH(expired_req_list, l, item) {
1092 if (!strncmp(item->req_id, ex->req_id, len)) {
1093 SYS_G_LIST_REMOVE(expired_req_list, item);
1103 _I("User input of req_id(%s) is (%s)", id, value == 0 ? "ALLOW power lock" :
1104 (value == 2) ? "KILL app" : "Release power lock");
1106 if (!item->invocation) {
1107 _E("item->invocation is null");
1110 g_dbus_method_invocation_return_value(item->invocation, g_variant_new("(i)", 0));
1113 if (item->pid > 0 && kill(item->pid, SIGTERM) == -1)
1114 _E("failed to kill pid(%d), err(%m)", item->pid);
1115 g_timeout_add(3000, app_term, (gpointer)item);
1123 return G_SOURCE_REMOVE;
1126 static GVariant *dbus_locktimeout_input(GDBusConnection *conn,
1127 const gchar *sender, const gchar *path, const gchar *iface, const gchar *name,
1128 GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data)
1132 struct pmlock_expired_s *ex;
1135 g_variant_get(param, "(si)", &req_id, &value);
1137 ex = calloc(1, sizeof(struct pmlock_expired_s));
1139 _E("calloc() failed");
1144 snprintf(ex->req_id, sizeof(ex->req_id), "%s", req_id);
1147 _I("req_id(%s), value(%d)", ex->req_id, ex->value);
1149 g_idle_add(expired_deliver_result, (gpointer)ex);
1155 return g_variant_new("(i)", ret);
1158 static GVariant *dbus_dimstay_control(GDBusConnection *conn,
1159 const gchar *sender, const gchar *path, const gchar *iface, const gchar *name,
1160 GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data)
1162 int dimstay, ret = 0;
1165 g_variant_get(param, "(i)", &dimstay);
1168 _E("Invalid dimstay set value %d.", dimstay);
1173 pid = gdbus_connection_get_sender_pid(conn, sender);
1175 _I("Set DIM_FLAG pid=%d", pid);
1176 set_pm_status_flag(DIM_FLAG);
1178 _I("Unset DIM_FLAG pid=%d", pid);
1179 clear_pm_status_flag(DIM_FLAG);
1182 if (get_pm_cur_state() == S_NORMAL)
1183 backlight_ops->update();
1186 return g_variant_new("(i)", ret);
1189 static GVariant *dbus_getbrightnessinfo(GDBusConnection *conn,
1190 const gchar *sender, const gchar *path, const gchar *iface, const gchar *name,
1191 GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data)
1193 int default_brightness;
1194 int current_brightness;
1196 default_brightness = backlight_ops->get_default_brt();
1197 backlight_ops->get_brightness_raw(¤t_brightness);
1199 return g_variant_new("(ii)", default_brightness, current_brightness);
1202 static GVariant *dbus_setwhitebalance(GDBusConnection *conn,
1203 const gchar *sender, const gchar *path, const gchar *iface, const gchar *name,
1204 GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data)
1206 int white_balance_type, value;
1207 int ret = 0, ret_val;
1210 g_variant_get(param, "(ii)", &white_balance_type, &value);
1212 ret_val = display_white_balance_ops->set_white_balance(white_balance_type, value);
1214 _E("Failed to set white balance");
1218 pid = gdbus_connection_get_sender_pid(conn, sender);
1219 _I("Set white balance pid=%d white balance type=%d value=%d", pid, white_balance_type, value);
1221 return g_variant_new("(i)", ret);
1224 static GVariant *dbus_getwhitebalance(GDBusConnection *conn,
1225 const gchar *sender, const gchar *path, const gchar *iface, const gchar *name,
1226 GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data)
1228 int white_balance_type;
1229 int ret = 0, ret_val;
1232 g_variant_get(param, "(i)", &white_balance_type);
1234 ret = display_white_balance_ops->get_white_balance(white_balance_type, &ret_val);
1236 _E("Failed to get white balance");
1242 pid = gdbus_connection_get_sender_pid(conn, sender);
1243 _I("Get white balance pid=%d white balance type=%d", pid, white_balance_type);
1245 return g_variant_new("(i)", ret);
1248 static const dbus_method_s dbus_methods[] = {
1249 { "start", NULL, NULL, dbus_start },
1250 { "stop", NULL, NULL, dbus_stop },
1251 { "lockstate", "sssi", "i", dbus_lockstate },
1252 { "unlockstate", "ss", "i", dbus_unlockstate },
1253 { "changestate", "s", "i", dbus_changestate },
1254 { "ChangeState", "s", "i", dbus_changestate },
1255 { "getbrightness", "i", "i", dbus_getbrightness }, /* deprecated */
1256 { "setbrightness", "ii", "i", dbus_setbrightness }, /* deprecated */
1257 { "setframerate", "ii", "i", dbus_setrefreshrate }, /* deprecated */
1258 { "setautobrightnessmin", "i", "i", dbus_setautobrightnessmin },
1259 { "setlcdtimeout", "iii", "i", dbus_setlcdtimeout },
1260 { "LockScreenBgOn", "s", "i", dbus_lockscreenbgon },
1261 { "GetDisplayCount", NULL, "i", dbus_getdisplaycount },
1262 { "GetMaxBrightness", "i", "i", dbus_getmaxbrightness },
1263 { "SetMaxBrightness", "i", "i", dbus_setmaxbrightness },
1264 { "GetBrightness", "i", "i", dbus_getbrightness },
1265 { "SetBrightness", "ii", "i", dbus_setbrightness },
1266 { "HoldBrightness", "i", "i", dbus_holdbrightness },
1267 { "ReleaseBrightness", NULL, "i", dbus_releasebrightness },
1268 { "SetRefreshRate", "ii", "i", dbus_setrefreshrate },
1269 { "Dumpmode", "s", "i", dbus_dumpmode },
1270 { "SaveLog", NULL, NULL, dbus_savelog },
1271 { "PowerKeyIgnore", "i", "i", dbus_powerkeyignore },
1272 { "PowerKeyLCDOff", NULL, "i", dbus_powerkeylcdoff },
1273 { "CustomLCDOn", "i", "i", dbus_customlcdon },
1274 { "CustomLCDOff", "s", "i", dbus_customlcdoff },
1275 { "ChangeStateByReason", "isi", "i", dbus_changestatebyreason },
1276 { "StayTouchScreenOff", "i", "i", dbus_staytouchscreenoff },
1277 { "LCDPanelOffMode", "i", "i", dbus_lcdpaneloffmode },
1278 { "ActorControl", "sii", "i", dbus_actorcontrol },
1279 { "CustomBrightness", NULL, "i", dbus_getcustombrightness },
1280 { "CurrentBrightness", "i", "i", dbus_getbrightness }, /* deprecated. It is remained for tizen 2.4 */
1281 { "LockTimeoutExpired", "s", "i", dbus_locktimeout_expired },
1282 { "LockTimeoutInput", "si", "i", dbus_locktimeout_input },
1283 { "DimStayControl", "i", "i", dbus_dimstay_control },
1284 { "GetBrightnessInfo", NULL, "ii", dbus_getbrightnessinfo},
1285 { "SetWhiteBalance", "ii", "i", dbus_setwhitebalance},
1286 { "GetWhiteBalance", "i", "i", dbus_getwhitebalance},
1287 /* Add methods here */
1290 static const dbus_interface_u dbus_interface = {
1292 .name = DEVICED_INTERFACE_DISPLAY,
1293 .methods = dbus_methods,
1294 .nr_methods = ARRAY_SIZE(dbus_methods),
1297 static void changestate_signal_handler(GDBusConnection *conn,
1298 const gchar *sender,
1309 if (!g_variant_get_safe(param, "(issss)", &val, NULL, NULL, &state, NULL)) {
1310 _E("failed to get params from gvariant. expected:%s, type:%s", "(issss)", g_variant_get_type_string(param));
1314 if (state == NULL) {
1315 _E("state is null.");
1320 if (!strcmp(state, "bg")) {
1321 _D("process(%d) was going background.", pid);
1322 set_app_state(pid, APPLICATION_BACKGROUND);
1323 device_notify(DEVICE_NOTIFIER_APPLICATION_BACKGROUND, &pid);
1324 } else if (!strcmp(state, "fg")) {
1325 _D("process(%d) was going foreground.", pid);
1326 set_app_state(pid, APPLICATION_FOREGROUND);
1327 device_notify(DEVICE_NOTIFIER_APPLICATION_FOREGROUND, &pid);
1335 static void app_terminate_signal_handler(GDBusConnection *conn,
1336 const gchar *sender,
1345 if (!g_variant_get_safe(param, "(i)", &pid)) {
1346 _E("failed to get params from gvariant. expected:%s, type:%s", "(i)", g_variant_get_type_string(param));
1350 set_app_state(pid, APPLICATION_TERMINATED);
1351 device_notify(DEVICE_NOTIFIER_APPLICATION_TERMINATED, &pid);
1355 * Default capability
1356 * api := LCDON | LCDOFF | BRIGHTNESS
1359 static struct display_actor_ops display_api_actor = {
1360 .id = DISPLAY_ACTOR_API,
1361 .caps = DISPLAY_CAPA_LCDON |
1362 DISPLAY_CAPA_LCDOFF |
1363 DISPLAY_CAPA_BRIGHTNESS,
1366 static struct display_actor_ops display_gesture_actor = {
1367 .id = DISPLAY_ACTOR_GESTURE,
1368 .caps = DISPLAY_CAPA_LCDON,
1371 int init_pm_dbus(void)
1375 display_add_actor(&display_api_actor);
1376 display_add_actor(&display_gesture_actor);
1378 ret = gdbus_add_object(NULL, DEVICED_PATH_DISPLAY, &dbus_interface);
1380 _E("fail to init dbus method(%d)", ret);
1383 ret = gdbus_signal_subscribe(NULL,
1385 AUL_APPSTATUS_INTERFACE,
1387 changestate_signal_handler,
1390 _E("Failed to register signal handler: %d", ret);
1392 ret = gdbus_signal_subscribe(NULL,
1394 AUL_APPSTATUS_INTERFACE,
1396 app_terminate_signal_handler,
1399 _E("Failed to register signal handler: %d", ret);
1404 static void __CONSTRUCTOR__ initialize(void)
1406 disp_plgn = get_var_display_plugin();
1408 _E("Failed to get display plugin variable.");
1411 backlight_ops = get_var_backlight_ops();
1413 _E("Failed to get backlight operator variable.");
1415 display_white_balance_ops = get_var_display_white_balance_ops();
1416 if (!display_white_balance_ops)
1417 _E("Failed to get display white balance operator variable.");
1419 display_conf = get_var_display_config();
1421 _E("Failed to get display configuration variable.");