Merge lp:~andreas-pokorny/powerd/blank-on-proximity-powerstate into lp:powerd

Proposed by Andreas Pokorny
Status: Merged
Approved by: Ricardo Salveti
Approved revision: 143
Merged at revision: 143
Proposed branch: lp:~andreas-pokorny/powerd/blank-on-proximity-powerstate
Merge into: lp:powerd
Diff against target: 514 lines (+148/-198)
9 files modified
CMakeLists.txt (+1/-0)
cli/powerd-cli.c (+50/-0)
data/com.canonical.powerd.xml (+8/-0)
src/power-request.c (+2/-1)
src/powerd-internal.h (+6/-0)
src/powerd-object.c (+4/-29)
src/powerd-proximity.cpp (+63/-0)
src/powerd.cpp (+2/-168)
src/powerd.h (+12/-0)
To merge this branch: bzr merge lp:~andreas-pokorny/powerd/blank-on-proximity-powerstate
Reviewer Review Type Date Requested Status
Ricardo Salveti (community) Approve
PS Jenkins bot continuous-integration Approve
Review via email: mp+235356@code.launchpad.net

Commit message

Adds two dbus messages to control proximity sensor based blanking from other processes

Those messages are used by telepathy-ofono during a call to blank on proximity depending on the used audio outputs. Since now proximity handling is requested externally the builtin handling ofono voice calls is removed.
powerd-cli now supports a proximity command:
powerd-cli proximity on|off

Description of the change

This change deactivates the builtin proximity handling during calls, and lets an external requester deactivate and activate proximity using a new dbus methods.

To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
Ricardo Salveti (rsalveti) wrote :

The change looks fine, still need to test it though (together with https://code.launchpad.net/~andreas-pokorny/telepathy-ofono/control-proximity-handling-in-powerd/+merge/235358).

Created silo 10 so we can have the packages available in the same PPA.

We just need to make sure telepathy-ofono is handling the same use cases as previously done by powerd.

Revision history for this message
Ricardo Salveti (rsalveti) wrote :

Works fine as well.

review: Approve
144. By Andreas Pokorny

Trigger suspend on proximity events.

+ moved proximity handling to power-request.c

145. By Andreas Pokorny

Adds two new requets to enable and disable proximity based display blanking

instead of combining that behavior with a power state it is now a separate status. That way suspend logic remains unaffected by this.

Revision history for this message
Ricardo Salveti (rsalveti) wrote :

As you added a new API, would it be possible to also change powerd-cli to support that?

146. By Andreas Pokorny

Adds an option to powerd-cli enable and disable proximty handling

this also fixes the missing dbus reponse.

Revision history for this message
Ricardo Salveti (rsalveti) wrote :

Great, thanks!

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'CMakeLists.txt'
--- CMakeLists.txt 2014-08-18 21:33:32 +0000
+++ CMakeLists.txt 2014-10-01 07:49:36 +0000
@@ -53,6 +53,7 @@
53 src/powerd-client.c53 src/powerd-client.c
54 src/powerd-object.c54 src/powerd-object.c
55 src/powerd-sensors.cpp55 src/powerd-sensors.cpp
56 src/powerd-proximity.cpp
56 src/spline.c57 src/spline.c
57 src/stats.c58 src/stats.c
58 src/util.c59 src/util.c
5960
=== modified file 'cli/powerd-cli.c'
--- cli/powerd-cli.c 2014-08-19 00:39:27 +0000
+++ cli/powerd-cli.c 2014-10-01 07:49:36 +0000
@@ -101,6 +101,32 @@
101}101}
102102
103gboolean103gboolean
104requestProximityBlanking(gboolean enable)
105{
106 GVariant *ret = NULL;
107 GError *error = NULL;
108 const char *method = enable ?
109 "enableProximityHandling":
110 "disableProximityHandling";
111
112 ret = g_dbus_proxy_call_sync(powerd_proxy,
113 method,
114 g_variant_new("(s)", "powerd-cli"),
115 G_DBUS_CALL_FLAGS_NONE,
116 -1,
117 NULL,
118 &error);
119 if (ret == NULL) {
120 cli_warn("%s failed: %s", method, error->message);
121 g_error_free(error);
122 return FALSE;
123 }
124
125 g_variant_unref(ret);
126 return TRUE;
127}
128
129gboolean
104requestSysState(const char *name, int state,130requestSysState(const char *name, int state,
105 powerd_cookie_t *cookie)131 powerd_cookie_t *cookie)
106{132{
@@ -691,6 +717,8 @@
691 printf("client-test - test powerd registration / ack API.\n");717 printf("client-test - test powerd registration / ack API.\n");
692 printf("display <on>\n"\718 printf("display <on>\n"\
693 "\tMake the display stay on\n");719 "\tMake the display stay on\n");
720 printf("proximity on|off\n"\
721 "\tEnable disable proximity based screen blanking\n");
694 printf("help\t- display this usage information.\n");722 printf("help\t- display this usage information.\n");
695 printf("list\t- list outstanding requests.\n");723 printf("list\t- list outstanding requests.\n");
696 printf("listen\t- listen for signals from powerd. This runs a\n"\724 printf("listen\t- listen for signals from powerd. This runs a\n"\
@@ -732,6 +760,7 @@
732 (strcmp(argv[1],"dbusnametest")) &&760 (strcmp(argv[1],"dbusnametest")) &&
733 (strcmp(argv[1],"listen")) &&761 (strcmp(argv[1],"listen")) &&
734 (strcmp(argv[1],"display")) &&762 (strcmp(argv[1],"display")) &&
763 (strcmp(argv[1],"proximity")) &&
735 (strcmp(argv[1],"help")) &&764 (strcmp(argv[1],"help")) &&
736 (strcmp(argv[1],"clear-sys")) &&765 (strcmp(argv[1],"clear-sys")) &&
737 (strcmp(argv[1],"client-test")) &&766 (strcmp(argv[1],"client-test")) &&
@@ -821,6 +850,27 @@
821 clearDisplayState(disp_cookie);850 clearDisplayState(disp_cookie);
822 return 0;851 return 0;
823 }852 }
853 else if (!strcmp(argv[1],"proximity")) {
854 gboolean enable = TRUE;
855 if (argc != 3) {
856 fprintf(stderr,"proximity requires a parameter: 'on'|'off'\n");
857 return -1;
858 }
859 if (!strcmp(argv[2],"on"))
860 enable = TRUE;
861 else if (!strcmp(argv[2],"off"))
862 enable = FALSE;
863 else {
864 fprintf(stderr,"proximity requires a parameter: 'on'|'off'\n");
865 return -1;
866 }
867
868 if (requestProximityBlanking(enable) == FALSE) {
869 fprintf(stderr,"failed powerd proximity request\n");
870 return -1;
871 }
872 return 0;
873 }
824 else if (!strncmp(argv[1],"clear",strlen("clear"))) {874 else if (!strncmp(argv[1],"clear",strlen("clear"))) {
825 if (argc != 3) {875 if (argc != 3) {
826 fprintf(stderr,"clear requires a cookie\n");876 fprintf(stderr,"clear requires a cookie\n");
827877
=== modified file 'data/com.canonical.powerd.xml'
--- data/com.canonical.powerd.xml 2014-08-18 21:33:32 +0000
+++ data/com.canonical.powerd.xml 2014-10-01 07:49:36 +0000
@@ -20,6 +20,14 @@
20 <arg type="s" name="cookie" direction="out" />20 <arg type="s" name="cookie" direction="out" />
21 </method>21 </method>
2222
23 <method name="enableProximityHandling">
24 <arg type="s" name="name" direction="in" />
25 </method>
26
27 <method name="disableProximityHandling">
28 <arg type="s" name="name" direction="in" />
29 </method>
30
23 <method name="clearWakeup">31 <method name="clearWakeup">
24 <arg type="s" name="cookie" direction="in" />32 <arg type="s" name="cookie" direction="in" />
25 </method>33 </method>
2634
=== modified file 'src/power-request.c'
--- src/power-request.c 2014-08-12 07:23:07 +0000
+++ src/power-request.c 2014-10-01 07:49:36 +0000
@@ -43,6 +43,7 @@
43 const char *owner;43 const char *owner;
44 uuid_t cookie;44 uuid_t cookie;
45 enum SysPowerStates state;45 enum SysPowerStates state;
46 int power_state_flags;
46};47};
4748
48/*49/*
@@ -438,6 +439,7 @@
438 if (ret)439 if (ret)
439 powerd_warn("Failed to prepare for suspend: %d", ret);440 powerd_warn("Failed to prepare for suspend: %d", ret);
440 }441 }
442
441 ack_pending = powerd_client_transition_start(pending_system_state);443 ack_pending = powerd_client_transition_start(pending_system_state);
442 powerd_sys_state_signal_emit(pending_system_state);444 powerd_sys_state_signal_emit(pending_system_state);
443445
@@ -523,7 +525,6 @@
523 delayed_state_transition_process,525 delayed_state_transition_process,
524 NULL);526 NULL);
525 }527 }
526
527}528}
528529
529/* Must be called from main loop */530/* Must be called from main loop */
530531
=== modified file 'src/powerd-internal.h'
--- src/powerd-internal.h 2014-08-18 21:33:32 +0000
+++ src/powerd-internal.h 2014-10-01 07:49:36 +0000
@@ -97,6 +97,12 @@
97gboolean handle_clear_sys_state(PowerdSource *obj,97gboolean handle_clear_sys_state(PowerdSource *obj,
98 GDBusMethodInvocation *invocation,98 GDBusMethodInvocation *invocation,
99 gchar *cookie);99 gchar *cookie);
100gboolean handle_enable_proximity_handling(PowerdSource *obj,
101 GDBusMethodInvocation *invocation,
102 const char *name);
103gboolean handle_disable_proximity_handling(PowerdSource *obj,
104 GDBusMethodInvocation *invocation,
105 const char *name);
100gboolean request_sys_state_internal(const char *name, int state,106gboolean request_sys_state_internal(const char *name, int state,
101 uuid_t *cookie, const char *owner);107 uuid_t *cookie, const char *owner);
102gboolean clear_sys_state_internal(uuid_t cookie);108gboolean clear_sys_state_internal(uuid_t cookie);
103109
=== modified file 'src/powerd-object.c'
--- src/powerd-object.c 2014-08-18 21:33:32 +0000
+++ src/powerd-object.c 2014-10-01 07:49:36 +0000
@@ -223,6 +223,10 @@
223 G_CALLBACK(handle_clear_sys_state), powerd_source);223 G_CALLBACK(handle_clear_sys_state), powerd_source);
224 g_signal_connect(oskel, "handle-list-sys-requests",224 g_signal_connect(oskel, "handle-list-sys-requests",
225 G_CALLBACK(handle_list_sys_requests), powerd_source);225 G_CALLBACK(handle_list_sys_requests), powerd_source);
226 g_signal_connect(oskel, "handle-enable-proximity-handling",
227 G_CALLBACK(handle_enable_proximity_handling), powerd_source);
228 g_signal_connect(oskel, "handle-disable-proximity-handling",
229 G_CALLBACK(handle_disable_proximity_handling), powerd_source);
226230
227 g_signal_connect(oskel, "handle-register-client",231 g_signal_connect(oskel, "handle-register-client",
228 G_CALLBACK(handle_register_client), powerd_source);232 G_CALLBACK(handle_register_client), powerd_source);
@@ -343,35 +347,6 @@
343}347}
344348
345void349void
346ofono_voicecall_proxy_connect_cb(GObject *source_object,
347 GAsyncResult *res,
348 gpointer user_data)
349{
350 GError *error = NULL;
351 GDBusProxy *ofono_proxy;
352 struct call_data *call;
353
354 ofono_proxy = g_dbus_proxy_new_finish(res, &error);
355 if (error) {
356 powerd_warn("%s failed: %s", __func__, error->message);
357 g_error_free(error);
358 return;
359 }
360
361 call = user_data;
362 call->ofono_proxy = ofono_proxy;
363
364 /* Register for voicecall signals */
365 g_signal_connect(ofono_proxy, "g-signal",
366 G_CALLBACK(on_ofono_voicecall_signal), NULL);
367
368 /* Get current voice call state */
369 g_dbus_proxy_call(ofono_proxy, "GetProperties", NULL,
370 G_DBUS_CALL_FLAGS_NONE, -1, NULL,
371 ofono_voicecall_get_props_cb, NULL);
372}
373
374void
375ofono_proxy_connect_cb(GObject *source_object,350ofono_proxy_connect_cb(GObject *source_object,
376 GAsyncResult *res,351 GAsyncResult *res,
377 gpointer user_data)352 gpointer user_data)
378353
=== added file 'src/powerd-proximity.cpp'
--- src/powerd-proximity.cpp 1970-01-01 00:00:00 +0000
+++ src/powerd-proximity.cpp 2014-10-01 07:49:36 +0000
@@ -0,0 +1,63 @@
1/*
2 * Copyright 2013 Canonical Ltd.
3 *
4 * This file is part of powerd.
5 *
6 * powerd is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; version 3.
9 *
10 * powerd is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
17 */
18
19
20#include "powerd-internal.h"
21
22#include "libsuspend.h"
23#include "powerd-dbus.h"
24
25#include <unordered_set>
26
27static std::unordered_set<std::string> active_proximity_users;
28gboolean handle_enable_proximity_handling(PowerdSource *obj,
29 GDBusMethodInvocation *invocation,
30 const char *name)
31{
32 if (active_proximity_users.empty())
33 powerd_sensors_proximity_enable();
34 active_proximity_users.insert(name);
35
36 g_dbus_method_invocation_return_value(invocation, NULL);
37
38 return TRUE;
39}
40
41
42gboolean handle_disable_proximity_handling(PowerdSource *obj,
43 GDBusMethodInvocation *invocation,
44 const char *name)
45{
46 bool was_empty = active_proximity_users.empty();
47 active_proximity_users.erase(name);
48 if (!was_empty && active_proximity_users.empty())
49 powerd_sensors_proximity_disable();
50
51 g_dbus_method_invocation_return_value(invocation, NULL);
52
53 return TRUE;
54}
55
56void powerd_proximity_event(gboolean near)
57{
58 if (near)
59 turn_display_on(FALSE, UNITY_SCREEN_REASON_PROXIMITY);
60 else
61 turn_display_on(TRUE, UNITY_SCREEN_REASON_PROXIMITY);
62}
63
064
=== modified file 'src/powerd.cpp'
--- src/powerd.cpp 2014-08-19 20:22:10 +0000
+++ src/powerd.cpp 2014-10-01 07:49:36 +0000
@@ -92,31 +92,9 @@
92/* List with detected modems */92/* List with detected modems */
93static GSList *g_modems = NULL;93static GSList *g_modems = NULL;
9494
95static void free_call_data(void *data)
96{
97 struct call_data *call = (struct call_data *) data;
98 g_free(call->obj_name);
99 if (call->ofono_proxy)
100 g_object_unref(call->ofono_proxy);
101}
102
103static gint call_data_cmp(gconstpointer a, gconstpointer b)
104{
105 const struct call_data *call = (const struct call_data *) a;
106 const char *call_name = (const char *) b;
107
108 return strcmp(call->obj_name, call_name);
109}
110
111static GDBusProxy *g_ofono_proxy;95static GDBusProxy *g_ofono_proxy;
112static GDBusProxy *g_unity_proxy;96static GDBusProxy *g_unity_proxy;
11397
114/* List with existing calls */
115static GSList *g_calls = NULL;
116
117/* Flag set when proximity sensor is on */
118static gboolean g_proximity_on = FALSE;
119
120static struct power_module* _power_module;98static struct power_module* _power_module;
12199
122static void100static void
@@ -231,87 +209,6 @@
231 g_variant_unref(result);209 g_variant_unref(result);
232}210}
233211
234static void notify_proximity_sensor(const char *call_state)
235{
236 /*
237 * This function enables the proximity sensor in case the new state of the
238 * call is:
239 *
240 * Active - meaning, the call is in progress --> Proximity On
241 * Dialing - a signal made on outbound calls only which means that
242 * we have started to talk to the network, but the call has not
243 * been picked up. --> Proximity On (this signal is not
244 * sent on inbound calls)
245 * Note that the proximity sensor is not activated for "incoming" state
246 * For more details on states see voicecall-api.txt in the ofono source
247 */
248
249 if (g_proximity_on)
250 return;
251
252 if (strcmp("active", call_state) == 0
253 || strcmp("dialing", call_state) == 0) {
254 powerd_sensors_proximity_enable();
255 g_proximity_on = TRUE;
256 }
257}
258
259static void deactivate_proximity_sensor(void)
260{
261 if (!g_proximity_on)
262 return;
263
264 powerd_sensors_proximity_disable();
265 g_proximity_on = FALSE;
266}
267
268
269void powerd_proximity_event(gboolean near)
270{
271 if (near)
272 turn_display_on(FALSE, UNITY_SCREEN_REASON_PROXIMITY);
273 else
274 turn_display_on(TRUE, UNITY_SCREEN_REASON_PROXIMITY);
275}
276
277void
278ofono_voicecall_get_props_cb(GObject *source_object, GAsyncResult *res,
279 gpointer user_data)
280{
281 GDBusProxy *client = G_DBUS_PROXY(source_object);
282 GVariant *result;
283 GVariant *item;
284 GError *error = NULL;
285 GVariantIter *iter = NULL;
286
287 result = g_dbus_proxy_call_finish(client, res, &error);
288 if (result == NULL) {
289 powerd_warn("%s: call error", __func__);
290 return;
291 }
292
293 g_variant_get(result, "(a{sv})", &iter);
294
295 while ((item = g_variant_iter_next_value(iter))) {
296 GVariant *value = NULL;
297 const char *prop_name = NULL;
298 const char *call_state = NULL;
299
300 g_variant_get(item, "{&sv}", &prop_name, &value);
301
302 if (strcmp("State", prop_name) == 0) {
303 g_variant_get(value, "&s", &call_state);
304 notify_proximity_sensor(call_state);
305 powerd_info("GetProperties. Call State = %s", call_state);
306 }
307
308 g_variant_unref(value);
309 g_variant_unref(item);
310 }
311
312 g_variant_unref(result);
313}
314
315void on_ofono_manager_signal(GDBusProxy *proxy, gchar *sender_name,212void on_ofono_manager_signal(GDBusProxy *proxy, gchar *sender_name,
316 gchar *signal_name, GVariant *parameters, gpointer user_data)213 gchar *signal_name, GVariant *parameters, gpointer user_data)
317{214{
@@ -354,75 +251,13 @@
354 GVariant *parameters,251 GVariant *parameters,
355 gpointer user_data)252 gpointer user_data)
356{253{
357 GVariant *tmp;
358
359 if (!strcmp(signal_name, "CallAdded")) {254 if (!strcmp(signal_name, "CallAdded")) {
360 struct call_data *call;
361
362 turn_display_on(TRUE, UNITY_SCREEN_REASON_NORMAL);255 turn_display_on(TRUE, UNITY_SCREEN_REASON_NORMAL);
363256
364 call = (struct call_data *) calloc(1, sizeof(*call));257 powerd_info("incoming call");
365 tmp = g_variant_get_child_value(parameters, 0);
366 call->obj_name = g_variant_dup_string(tmp, NULL);
367 g_calls = g_slist_prepend(g_calls, call);
368
369 powerd_info("%s incoming call", call->obj_name);
370
371 /* Connect to voicecall interface */
372 g_dbus_proxy_new_for_bus(G_BUS_TYPE_SYSTEM,
373 G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES,
374 NULL,
375 "org.ofono",
376 call->obj_name,
377 "org.ofono.VoiceCall",
378 NULL,
379 (GAsyncReadyCallback) ofono_voicecall_proxy_connect_cb,
380 call);
381
382 g_variant_unref(tmp);
383258
384 } else if (!strcmp(signal_name, "CallRemoved")) {259 } else if (!strcmp(signal_name, "CallRemoved")) {
385 const gchar *object_path;260 powerd_info("call removed");
386 GSList *node;
387
388 tmp = g_variant_get_child_value(parameters, 0);
389 object_path = g_variant_get_string(tmp, NULL);
390 node = g_slist_find_custom(g_calls, object_path, call_data_cmp);
391 if (node != NULL) {
392 free_call_data(node->data);
393 g_calls = g_slist_delete_link(g_calls, node);
394 powerd_info("%s call removed", object_path);
395 }
396
397 if (g_calls == NULL)
398 deactivate_proximity_sensor();
399
400 g_variant_unref(tmp);
401 }
402}
403
404void
405on_ofono_voicecall_signal (GDBusProxy *proxy,
406 gchar *sender_name,
407 gchar *signal_name,
408 GVariant *parameters,
409 gpointer user_data)
410{
411 GVariant *value = NULL;
412 const char *prop_name = NULL;
413 const char *call_state = NULL;
414
415 if (!strcmp(signal_name, "PropertyChanged")) {
416 g_variant_get(parameters, "(&sv)", &prop_name, &value);
417
418 if (!strcmp(prop_name, "State")) {
419 g_variant_get(value, "&s", &call_state);
420
421 powerd_info("Call State = %s", call_state);
422 notify_proximity_sensor(call_state);
423 }
424
425 g_variant_unref(value);
426 }261 }
427}262}
428263
@@ -608,7 +443,6 @@
608 powerd_client_deinit();443 powerd_client_deinit();
609 powerd_stats_deinit();444 powerd_stats_deinit();
610 g_slist_free_full(g_modems, free_modem_data);445 g_slist_free_full(g_modems, free_modem_data);
611 g_slist_free_full(g_calls, free_call_data);
612 if (g_ofono_proxy)446 if (g_ofono_proxy)
613 g_object_unref(g_ofono_proxy);447 g_object_unref(g_ofono_proxy);
614 if (g_unity_proxy)448 if (g_unity_proxy)
615449
=== modified file 'src/powerd.h'
--- src/powerd.h 2014-05-21 03:17:03 +0000
+++ src/powerd.h 2014-10-01 07:49:36 +0000
@@ -30,11 +30,23 @@
3030
31 //The Active state will prevent system suspend31 //The Active state will prevent system suspend
32 POWERD_SYS_STATE_ACTIVE,32 POWERD_SYS_STATE_ACTIVE,
33 //Substate of Active with disabled proximity based blanking
34 POWERD_SYS_STATE_ACTIVE_BLANK_ON_PROXIMITY,
3335
34 POWERD_NUM_POWER_STATES36 POWERD_NUM_POWER_STATES
35};37};
3638
37/*39/*
40 * Flags that can be applied to power states
41 * TODO Create dedicated power states instead?
42 */
43enum SysPowerStateFlags {
44 POWERD_POWER_STATE_FLAG_MASK = 0xFFFF0000,
45 // disables display blanking on proximity events
46 POWERD_DISABLE_PROXIMITY_SENSOR_BLANKING = 0x10000,
47};
48
49/*
38 * Clients should treat this as an opaque type. Though this isn't really50 * Clients should treat this as an opaque type. Though this isn't really
39 * possible until the client library is written.51 * possible until the client library is written.
40 */52 */

Subscribers

People subscribed via source and target branches