display: Add getter for lock count and signal on count changed 39/311639/1
authorYoungjae Cho <y0.cho@samsung.com>
Thu, 23 May 2024 02:38:20 +0000 (11:38 +0900)
committeryoungjae cho <y0.cho@samsung.com>
Thu, 23 May 2024 03:16:55 +0000 (03:16 +0000)
The dbus method "PmlockGetLockCount" has been added to get lock count.
And the dbus signal "PowerLockCountChanged" has also been added for
broadcasting on every display lock/unlock. The existing method
"PmlockGetLockState" and signal "PowerLockCountChanged" only say in
'locked' or 'unlocked', however, the "PmLockGetLockCount" and
"PowerLockCountChanged" respond in number.

Change-Id: Ia5aeedd0693ffc0142d3695fcab864d84fd6ad42
Signed-off-by: Youngjae Cho <y0.cho@samsung.com>
src/display/display-dbus.c
src/display/display-lock.c
src/display/display-lock.h

index bcda4f842efe51e17286455637ea22897d0aecd9..cb6181e263c1167cf2a977c23f26b47ec30af56b 100644 (file)
@@ -1382,6 +1382,30 @@ static GVariant *dbus_setrotationangle(GDBusConnection *conn,
        return g_variant_new("(i)", ret);
 }
 
+static GVariant *dbus_pmlockgetlockcount(GDBusConnection *conn,
+       const gchar *sender, const gchar *path, const gchar *iface, const gchar *name,
+       GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data)
+{
+       power_lock_e power_lock_type;
+       int pmlock_count = 0;
+       enum syscommon_deviced_display_state pmlock_type;
+       pid_t pid;
+
+       g_variant_get(param, "(i)", &power_lock_type);
+
+       if (power_lock_type < POWER_LOCK_CPU || power_lock_type > POWER_LOCK_DISPLAY_DIM)
+               _W("Invalid parameter power lock type=(%d)", power_lock_type);
+
+       pmlock_type = power_lock_type_to_pmlock(power_lock_type);
+
+       pmlock_count = display_lock_get_lock_count(pmlock_type);
+
+       pid = gdbus_connection_get_sender_pid(conn, sender);
+       _D("Pmlock get lock count pid=%d power lock count=%d", pid, pmlock_count);
+
+       return g_variant_new("(i)", pmlock_count);
+}
+
 static GVariant *dbus_pmlockgetlockstate(GDBusConnection *conn,
        const gchar *sender, const gchar *path, const gchar *iface, const gchar *name,
        GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data)
@@ -1447,6 +1471,7 @@ static const dbus_method_s dbus_methods[] = {
        { "GetWhiteBalance", "i", "i", dbus_getwhitebalance},
        { "GetRotationAngle", "i", "iii", dbus_getrotationangle},
        { "SetRotationAngle", "iii", "i", dbus_setrotationangle},
+       { "PmlockGetLockCount", "i", "i", dbus_pmlockgetlockcount},
        { "PmlockGetLockState", "i", "i", dbus_pmlockgetlockstate},
        /* Add methods here */
 };
index 2fe48ee4c496f7638eae13bf3308a0d4420f6a62..1f736581613b216b6145191cb8870a0017e9eb91 100644 (file)
@@ -206,6 +206,16 @@ int display_lock_is_state_locked(enum syscommon_deviced_display_state state)
        return (g_display_fglock_list[state] != NULL);
 }
 
+int display_lock_get_lock_count(enum syscommon_deviced_display_state state)
+{
+       int nlock = 0;
+
+       nlock += g_list_length(g_display_fglock_list[state]);
+       nlock += g_list_length(g_display_bglock_list[state]);
+
+       return nlock;
+}
+
 enum syscommon_deviced_display_state power_lock_type_to_pmlock(power_lock_e power_lock_type)
 {
        switch(power_lock_type) {
@@ -245,6 +255,14 @@ static void broadcast_lock_changed(enum syscommon_deviced_display_state state)
 
        nlock += g_list_length(g_display_fglock_list[state]);
        nlock += g_list_length(g_display_bglock_list[state]);
+
+       /* broadcast on every change of lock count */
+       gdbus_signal_emit(NULL,
+                       DEVICED_PATH_DISPLAY,
+                       DEVICED_INTERFACE_DISPLAY,
+                       DEVICED_SIGNAL_POWER_LOCK_COUNT_CHANGED,
+                       g_variant_new("(ii)", power_lock_type, nlock));
+
        if (nlock > 1)
                return;
 
index b277100e96e92dc2cbb7675bc2663993fad1ce32..209d00c98aaa977fa6f12e7896b12d483bdd7fb7 100644 (file)
@@ -39,6 +39,7 @@ int display_lock_update_lock(enum syscommon_deviced_display_state state, pid_t p
 void display_lock_release_lock(enum syscommon_deviced_display_state state, pid_t pid);
 void display_lock_release_lock_all(enum syscommon_deviced_display_state state);
 int display_lock_is_state_locked(enum syscommon_deviced_display_state state);
+int display_lock_get_lock_count(enum syscommon_deviced_display_state state);
 int display_lock_print_lock_info(int fd);
 
 int display_lock_proc_condition(PMMsg *data);