on xenial help sign in
Instead of looking at proximity sensor to determine if we are in a call, use callManager
ccf5695Michael Terry
plugins/Powerd/Powerd.cpp+16−2
@@ -27,7 +27,8 @@ void autoBrightnessChanged(GSettings *settings, const gchar *key, QDBusInterface
27
27
28Powerd::Powerd(QObject* parent)
28Powerd::Powerd(QObject* parent)
29 : QObject(parent),
29 : QObject(parent),
30− unityScreen(NULL)
30+ unityScreen(NULL),
31+ cachedStatus(Status::On)
31{
32{
32 unityScreen = new QDBusInterface("com.canonical.Unity.Screen",
33 unityScreen = new QDBusInterface("com.canonical.Unity.Screen",
33 "/com/canonical/Unity/Screen",
34 "/com/canonical/Unity/Screen",
@@ -39,7 +40,7 @@ Powerd::Powerd(QObject* parent)
39 "com.canonical.Unity.Screen",
40 "com.canonical.Unity.Screen",
40 "DisplayPowerStateChange",
41 "DisplayPowerStateChange",
41 this,
42 this,
42− SIGNAL(displayPowerStateChange(int, int)));
43+ SLOT(handleDisplayPowerStateChange(int, int)));
43
44
44 systemSettings = g_settings_new("com.ubuntu.touch.system");
45 systemSettings = g_settings_new("com.ubuntu.touch.system");
45 g_signal_connect(systemSettings, "changed::auto-brightness", G_CALLBACK(autoBrightnessChanged), unityScreen);
46 g_signal_connect(systemSettings, "changed::auto-brightness", G_CALLBACK(autoBrightnessChanged), unityScreen);
@@ -51,3 +52,16 @@ Powerd::~Powerd()
51 g_signal_handlers_disconnect_by_data(systemSettings, unityScreen);
52 g_signal_handlers_disconnect_by_data(systemSettings, unityScreen);
52 g_object_unref(systemSettings);
53 g_object_unref(systemSettings);
53}
54}
55+
56+Powerd::Status Powerd::status() const
57+{
58+ return cachedStatus;
59+}
60+
61+void Powerd::handleDisplayPowerStateChange(int status, int reason)
62+{
63+ if (cachedStatus != (Status)status) {
64+ cachedStatus = (Status)status;
65+ Q_EMIT statusChanged((DisplayStateChangeReason)reason);
66+ }
67+}
plugins/Powerd/Powerd.h+8−1
@@ -29,6 +29,7 @@ class Powerd: public QObject
29 Q_OBJECT
29 Q_OBJECT
30 Q_ENUMS(Status)
30 Q_ENUMS(Status)
31 Q_ENUMS(DisplayStateChangeReason)
31 Q_ENUMS(DisplayStateChangeReason)
32+ Q_PROPERTY(Status status READ status NOTIFY statusChanged)
32
33
33public:
34public:
34 enum DisplayStateChangeReason {
35 enum DisplayStateChangeReason {
@@ -46,12 +47,18 @@ public:
46 explicit Powerd(QObject *parent = 0);
47 explicit Powerd(QObject *parent = 0);
47 ~Powerd();
48 ~Powerd();
48
49
50+ Status status() const;
51+
49Q_SIGNALS:
52Q_SIGNALS:
50− void displayPowerStateChange(int status, int reason);
53+ void statusChanged(DisplayStateChangeReason reason);
54+
55+private Q_SLOTS:
56+ void handleDisplayPowerStateChange(int status, int reason);
51
57
52private:
58private:
53 QDBusInterface *unityScreen;
59 QDBusInterface *unityScreen;
54 GSettings *systemSettings;
60 GSettings *systemSettings;
61+ Status cachedStatus;
55};
62};
56
63
57#endif
64#endif
qml/Panel/Indicators/IndicatorsLight.qml+2−2
@@ -31,8 +31,8 @@ QtObject {
31 id: powerConnection
31 id: powerConnection
32
32
33 target: Powerd
33 target: Powerd
34− onDisplayPowerStateChange: {
34+ onStatusChanged: {
35− Lights.state = (status === Powerd.Off) ? Lights.On : Lights.Off
35+ Lights.state = (Powerd.status === Powerd.Off) ? Lights.On : Lights.Off
36 }
36 }
37 }
37 }
38}
38}
qml/Shell.qml+17−8
@@ -21,6 +21,7 @@ import Unity.Application 0.1
21import Ubuntu.Components 0.1
21import Ubuntu.Components 0.1
22import Ubuntu.Components.Popups 0.1
22import Ubuntu.Components.Popups 0.1
23import Ubuntu.Gestures 0.1
23import Ubuntu.Gestures 0.1
24+import Ubuntu.Telephony 0.1 as Telephony
24import Unity.Launcher 0.1
25import Unity.Launcher 0.1
25import LightDM 0.1 as LightDM
26import LightDM 0.1 as LightDM
26import Powerd 0.1
27import Powerd 0.1
@@ -638,21 +639,29 @@ FocusScope {
638 || panel.indicators.shown
639 || panel.indicators.shown
639 }
640 }
640
641
642+ function showGreeterIfScreenIsOff() {
643+ if (Powerd.status === Powerd.Off && !callManager.hasCalls && !edgeDemo.running) {
644+ greeter.showNow()
645+ }
646+ }
647+
648+ Connections {
649+ id: callConnection
650+ target: callManager
651+ onHasCallsChanged: showGreeterIfScreenIsOff()
652+ }
653+
641 Connections {
654 Connections {
642 id: powerConnection
655 id: powerConnection
643 target: Powerd
656 target: Powerd
644
657
645− onDisplayPowerStateChange: {
658+ onStatusChanged: {
646− // We ignore any display-off signals when the proximity sensor
659+ showGreeterIfScreenIsOff()
647− // is active. This usually indicates something like a phone call.
648− if (status == Powerd.Off && reason != Powerd.Proximity && !edgeDemo.running) {
649− greeter.showNow();
650− }
651
660
652 // No reason to chew demo CPU when user isn't watching
661 // No reason to chew demo CPU when user isn't watching
653− if (status == Powerd.Off) {
662+ if (Powerd.status === Powerd.Off) {
654 edgeDemo.paused = true;
663 edgeDemo.paused = true;
655− } else if (status == Powerd.On) {
664+ } else if (Powerd.status === Powerd.On) {
656 edgeDemo.paused = false;
665 edgeDemo.paused = false;
657 }
666 }
658 }
667 }
tests/mocks/Powerd/Powerd.cpp+15−1
@@ -19,6 +19,20 @@
19#include "Powerd.h"
19#include "Powerd.h"
20
20
21Powerd::Powerd(QObject* parent)
21Powerd::Powerd(QObject* parent)
22− : QObject(parent)
22+ : QObject(parent),
23+ m_status(Powerd::Status::On)
23{
24{
24}
25}
26+
27+void Powerd::setStatus(Powerd::Status status)
28+{
29+ if (m_status != status) {
30+ m_status = status;
31+ Q_EMIT statusChanged(DisplayStateChangeReason::Unknown);
32+ }
33+}
34+
35+Powerd::Status Powerd::status() const
36+{
37+ return m_status;
38+}
tests/mocks/Powerd/Powerd.h+8−1
@@ -26,6 +26,7 @@ class Powerd: public QObject
26 Q_OBJECT
26 Q_OBJECT
27 Q_ENUMS(Status)
27 Q_ENUMS(Status)
28 Q_ENUMS(DisplayStateChangeReason)
28 Q_ENUMS(DisplayStateChangeReason)
29+ Q_PROPERTY(Status status READ status WRITE setStatus NOTIFY statusChanged) // write only exists for tests
29
30
30public:
31public:
31 enum DisplayStateChangeReason {
32 enum DisplayStateChangeReason {
@@ -42,8 +43,14 @@ public:
42
43
43 explicit Powerd(QObject *parent = 0);
44 explicit Powerd(QObject *parent = 0);
44
45
46+ Status status() const;
47+ void setStatus(Status status);
48+
45Q_SIGNALS:
49Q_SIGNALS:
46− void displayPowerStateChange(int status, int reason);
50+ void statusChanged(DisplayStateChangeReason reason);
51+
52+private:
53+ Status m_status;
47};
54};
48
55
49#endif
56#endif
tests/qmltests/tst_Shell.qml+13−8
@@ -21,6 +21,7 @@ import QtQuick 2.0
21import QtTest 1.0
21import QtTest 1.0
22import GSettings 1.0
22import GSettings 1.0
23import LightDM 0.1 as LightDM
23import LightDM 0.1 as LightDM
24+import Ubuntu.Telephony 0.1 as Telephony
24import Unity.Application 0.1
25import Unity.Application 0.1
25import Unity.Test 0.1 as UT
26import Unity.Test 0.1 as UT
26import Powerd 0.1
27import Powerd 0.1
@@ -56,6 +57,11 @@ Item {
56 signalName: "sessionStarted"
57 signalName: "sessionStarted"
57 }
58 }
58
59
60+ Telephony.CallEntry {
61+ id: phoneCall
62+ phoneNumber: "+447812221111"
63+ }
64+
59 UT.UnityTestCase {
65 UT.UnityTestCase {
60 name: "Shell"
66 name: "Shell"
61 when: windowShown
67 when: windowShown
@@ -202,21 +208,20 @@ Item {
202 verify(mainApp);
208 verify(mainApp);
203 tryCompare(mainApp, "state", ApplicationInfo.Running);
209 tryCompare(mainApp, "state", ApplicationInfo.Running);
204
210
205− // Try to suspend while proximity is engaged...
211+ // Suspend while call is active...
212+ callManager.foregroundCall = phoneCall;
206− Powerd.displayPowerStateChange(Powerd.Off, Powerd.Proximity);
213+ Powerd.status = Powerd.Off;
207 tryCompare(greeter, "showProgress", 0);
214 tryCompare(greeter, "showProgress", 0);
208
215
209− // Now really suspend
216+ // Now end call, triggering a greeter show
210− print("suspending")
217+ callManager.foregroundCall = null;
211− Powerd.displayPowerStateChange(Powerd.Off, 0);
212− print("done suspending")
213 tryCompare(greeter, "showProgress", 1);
218 tryCompare(greeter, "showProgress", 1);
214
219
215 tryCompare(ApplicationManager, "suspended", true);
220 tryCompare(ApplicationManager, "suspended", true);
216 compare(mainApp.state, ApplicationInfo.Suspended);
221 compare(mainApp.state, ApplicationInfo.Suspended);
217
222
218 // And wake up
223 // And wake up
219− Powerd.displayPowerStateChange(Powerd.On, 0);
224+ Powerd.status = Powerd.On;
220 tryCompare(greeter, "showProgress", 1);
225 tryCompare(greeter, "showProgress", 1);
221
226
222 // Swipe away greeter to focus app
227 // Swipe away greeter to focus app
@@ -497,7 +502,7 @@ Item {
497 if (data.greeter) {
502 if (data.greeter) {
498 // Swipe the greeter in
503 // Swipe the greeter in
499 var greeter = findChild(shell, "greeter");
504 var greeter = findChild(shell, "greeter");
500− Powerd.displayPowerStateChange(Powerd.Off, 0);
505+ LightDM.Greeter.showGreeter();
501 tryCompare(greeter, "showProgress", 1);
506 tryCompare(greeter, "showProgress", 1);
502 }
507 }
503
508