on xenial help sign in
Listen to the system setting StatsWelcomeScreen, which tells us whether to show user-specific infographic data in the greeter. Fixes: https://bugs.launchpad.net/bugs/1207857.
b8d722aMichael Terry
Greeter/GreeterContent.qml+11−7
@@ -135,19 +135,23 @@ MouseArea {
135
135
136 Infographics {
136 Infographics {
137 id: infographics
137 id: infographics
138+ objectName: "infographics"
138 height: narrowMode ? parent.height : 0.75 * parent.height
139 height: narrowMode ? parent.height : 0.75 * parent.height
139 model: greeterContentLoader.infographicModel
140 model: greeterContentLoader.infographicModel
140
141
141− Component.onCompleted: infographics.updateUsername(greeterContentLoader.currentIndex)
142+ property string selectedUser
143+ property string infographicUser: AccountsService.statsWelcomeScreen ? selectedUser : ""
144+ onInfographicUserChanged: greeterContentLoader.infographicModel.username = infographicUser
142
145
143− Connections {
146+ Component.onCompleted: {
144− target: root
147+ selectedUser = greeterContentLoader.model.data(greeterContentLoader.currentIndex, LightDM.UserRoles.NameRole)
145− onSelected: infographics.updateUsername(uid)
148+ greeterContentLoader.infographicModel.username = infographicUser
149+ greeterContentLoader.infographicModel.readyForDataChange()
146 }
150 }
147
151
148− function updateUsername(uid) {
152+ Connections {
153+ target: root
149− greeterContentLoader.infographicModel.username = greeterContentLoader.model.data(uid, LightDM.UserRoles.NameRole)
154+ onSelected: infographics.selectedUser = greeterContentLoader.model.data(uid, LightDM.UserRoles.NameRole)
150− greeterContentLoader.infographicModel.readyForDataChangeSlot();
151 }
155 }
152
156
153 anchors {
157 anchors {
Greeter/Infographics.qml+10−1
@@ -29,21 +29,30 @@ Item {
29 Connections {
29 Connections {
30 target: model
30 target: model
31
31
32+ onDataAboutToAppear: startHideAnimation() // hide "no data" label
32 onDataAppeared: startShowAnimation()
33 onDataAppeared: startShowAnimation()
33
34
34 onDataAboutToChange: startHideAnimation()
35 onDataAboutToChange: startHideAnimation()
35−
36 onDataChanged: startShowAnimation()
36 onDataChanged: startShowAnimation()
37
37
38 onDataAboutToDisappear: startHideAnimation()
38 onDataAboutToDisappear: startHideAnimation()
39+ onDataDisappeared: startShowAnimation() // show "no data" label
39 }
40 }
40
41
41 function startShowAnimation() {
42 function startShowAnimation() {
43+ dotHideAnimTimer.stop()
44+ circleShrinkAnimTimer.stop()
45+ notification.hideAnim.stop()
46+
42 dotShowAnimTimer.startFromBeginning()
47 dotShowAnimTimer.startFromBeginning()
43 notification.showAnim.start()
48 notification.showAnim.start()
44 }
49 }
45
50
46 function startHideAnimation() {
51 function startHideAnimation() {
52+ dotShowAnimTimer.stop()
53+ circleGrowAnimTimer.stop()
54+ notification.showAnim.stop()
55+
47 dotHideAnimTimer.startFromBeginning()
56 dotHideAnimTimer.startFromBeginning()
48 notification.hideAnim.start()
57 notification.hideAnim.start()
49 }
58 }
plugins/AccountsService/AccountsService.cpp+19
@@ -44,6 +44,7 @@ void AccountsService::setUser(const QString &user)
44
44
45 updateDemoEdges();
45 updateDemoEdges();
46 updateBackgroundFile();
46 updateBackgroundFile();
47+ updateStatsWelcomeScreen();
47}
48}
48
49
49bool AccountsService::demoEdges() const
50bool AccountsService::demoEdges() const
@@ -62,6 +63,11 @@ QString AccountsService::backgroundFile() const
62 return m_backgroundFile;
63 return m_backgroundFile;
63}
64}
64
65
66+bool AccountsService::statsWelcomeScreen() const
67+{
68+ return m_statsWelcomeScreen;
69+}
70+
65void AccountsService::updateDemoEdges()
71void AccountsService::updateDemoEdges()
66{
72{
67 auto demoEdges = m_service->getUserProperty(m_user, "com.canonical.unity.AccountsService", "demo-edges").toBool();
73 auto demoEdges = m_service->getUserProperty(m_user, "com.canonical.unity.AccountsService", "demo-edges").toBool();
@@ -80,6 +86,15 @@ void AccountsService::updateBackgroundFile()
80 }
86 }
81}
87}
82
88
89+void AccountsService::updateStatsWelcomeScreen()
90+{
91+ bool statsWelcomeScreen = m_service->getUserProperty(m_user, "com.ubuntu.touch.AccountsService.SecurityPrivacy", "StatsWelcomeScreen").toBool();
92+ if (m_statsWelcomeScreen != statsWelcomeScreen) {
93+ m_statsWelcomeScreen = statsWelcomeScreen;
94+ Q_EMIT statsWelcomeScreenChanged();
95+ }
96+}
97+
83void AccountsService::propertiesChanged(const QString &user, const QString &interface, const QStringList &changed)
98void AccountsService::propertiesChanged(const QString &user, const QString &interface, const QStringList &changed)
84{
99{
85 if (m_user != user) {
100 if (m_user != user) {
@@ -90,6 +105,10 @@ void AccountsService::propertiesChanged(const QString &user, const QString &inte
90 if (changed.contains("demo-edges")) {
105 if (changed.contains("demo-edges")) {
91 updateDemoEdges();
106 updateDemoEdges();
92 }
107 }
108+ } else if (interface == "com.ubuntu.touch.AccountsService.SecurityPrivacy") {
109+ if (changed.contains("StatsWelcomeScreen")) {
110+ updateStatsWelcomeScreen();
111+ }
93 }
112 }
94}
113}
95
114
plugins/AccountsService/AccountsService.h+7
@@ -38,6 +38,9 @@ class AccountsService: public QObject
38 Q_PROPERTY (QString backgroundFile
38 Q_PROPERTY (QString backgroundFile
39 READ backgroundFile
39 READ backgroundFile
40 NOTIFY backgroundFileChanged)
40 NOTIFY backgroundFileChanged)
41+ Q_PROPERTY (bool statsWelcomeScreen
42+ READ statsWelcomeScreen
43+ NOTIFY statsWelcomeScreenChanged)
41
44
42public:
45public:
43 explicit AccountsService(QObject *parent = 0);
46 explicit AccountsService(QObject *parent = 0);
@@ -47,11 +50,13 @@ public:
47 bool demoEdges() const;
50 bool demoEdges() const;
48 void setDemoEdges(bool demoEdges);
51 void setDemoEdges(bool demoEdges);
49 QString backgroundFile() const;
52 QString backgroundFile() const;
53+ bool statsWelcomeScreen() const;
50
54
51Q_SIGNALS:
55Q_SIGNALS:
52 void userChanged();
56 void userChanged();
53 void demoEdgesChanged();
57 void demoEdgesChanged();
54 void backgroundFileChanged();
58 void backgroundFileChanged();
59+ void statsWelcomeScreenChanged();
55
60
56private Q_SLOTS:
61private Q_SLOTS:
57 void propertiesChanged(const QString &user, const QString &interface, const QStringList &changed);
62 void propertiesChanged(const QString &user, const QString &interface, const QStringList &changed);
@@ -60,11 +65,13 @@ private Q_SLOTS:
60private:
65private:
61 void updateDemoEdges();
66 void updateDemoEdges();
62 void updateBackgroundFile();
67 void updateBackgroundFile();
68+ void updateStatsWelcomeScreen();
63
69
64 AccountsServiceDBusAdaptor *m_service;
70 AccountsServiceDBusAdaptor *m_service;
65 QString m_user;
71 QString m_user;
66 bool m_demoEdges;
72 bool m_demoEdges;
67 QString m_backgroundFile;
73 QString m_backgroundFile;
74+ bool m_statsWelcomeScreen;
68};
75};
69
76
70#endif
77#endif
tests/mocks/AccountsService/AccountsService.cpp+13−1
@@ -20,7 +20,8 @@
20
20
21AccountsService::AccountsService(QObject* parent)
21AccountsService::AccountsService(QObject* parent)
22 : QObject(parent),
22 : QObject(parent),
23− m_backgroundFile(TOP_SRCDIR "/graphics/phone_background.jpg")
23+ m_backgroundFile(TOP_SRCDIR "/graphics/phone_background.jpg"),
24+ m_statsWelcomeScreen(true)
24{
25{
25}
26}
26
27
@@ -54,3 +55,14 @@ void AccountsService::setBackgroundFile(const QString &backgroundFile)
54 m_backgroundFile = backgroundFile;
55 m_backgroundFile = backgroundFile;
55 backgroundFileChanged();
56 backgroundFileChanged();
56}
57}
58+
59+bool AccountsService::statsWelcomeScreen() const
60+{
61+ return m_statsWelcomeScreen;
62+}
63+
64+void AccountsService::setStatsWelcomeScreen(bool statsWelcomeScreen)
65+{
66+ m_statsWelcomeScreen = statsWelcomeScreen;
67+ statsWelcomeScreenChanged();
68+}
tests/mocks/AccountsService/AccountsService.h+8
@@ -39,6 +39,10 @@ class AccountsService: public QObject
39 READ backgroundFile
39 READ backgroundFile
40 WRITE setBackgroundFile // only available in mock
40 WRITE setBackgroundFile // only available in mock
41 NOTIFY backgroundFileChanged)
41 NOTIFY backgroundFileChanged)
42+ Q_PROPERTY (bool statsWelcomeScreen
43+ READ statsWelcomeScreen
44+ WRITE setStatsWelcomeScreen // only available in mock
45+ NOTIFY statsWelcomeScreenChanged)
42
46
43public:
47public:
44 explicit AccountsService(QObject *parent = 0);
48 explicit AccountsService(QObject *parent = 0);
@@ -49,14 +53,18 @@ public:
49 void setDemoEdges(bool demoEdges);
53 void setDemoEdges(bool demoEdges);
50 QString backgroundFile() const;
54 QString backgroundFile() const;
51 void setBackgroundFile(const QString &backgroundFile);
55 void setBackgroundFile(const QString &backgroundFile);
56+ bool statsWelcomeScreen() const;
57+ void setStatsWelcomeScreen(bool statsWelcomeScreen);
52
58
53Q_SIGNALS:
59Q_SIGNALS:
54 void userChanged();
60 void userChanged();
55 void demoEdgesChanged();
61 void demoEdgesChanged();
56 void backgroundFileChanged();
62 void backgroundFileChanged();
63+ void statsWelcomeScreenChanged();
57
64
58private:
65private:
59 QString m_backgroundFile;
66 QString m_backgroundFile;
67+ bool m_statsWelcomeScreen;
60};
68};
61
69
62#endif
70#endif
tests/mocks/libusermetrics/UserMetrics.cpp+6−2
@@ -228,7 +228,7 @@ UserMetricsPrivate::~UserMetricsPrivate()
228
228
229void UserMetricsPrivate::setUsername(const QString &username)
229void UserMetricsPrivate::setUsername(const QString &username)
230{
230{
231− if (m_username == username) {
231+ if (m_username == username && m_newData) {
232 return;
232 return;
233 }
233 }
234
234
@@ -407,7 +407,11 @@ UserMetrics::~UserMetrics()
407
407
408QString UserMetrics::label() const
408QString UserMetrics::label() const
409{
409{
410+ if (d_ptr->m_label.isEmpty()) {
411+ return "No data";
412+ } else {
410− return d_ptr->m_label;
413+ return d_ptr->m_label;
414+ }
411}
415}
412
416
413QString UserMetrics::username() const
417QString UserMetrics::username() const
tests/qmltests/Greeter/tst_Infographics.qml+4−4
@@ -64,15 +64,15 @@ Item {
64
64
65 function test_set_username_data() {
65 function test_set_username_data() {
66 return [
66 return [
67− { username: "has-password" },
67+ { username: "has-password", label: "<b>19</b> minutes talk time" },
68− { username: "no-password" },
68+ { username: "two-factor", label: "No data" },
69− { username: "empty-name" }
69+ { username: "", label: "No data" },
70 ]
70 ]
71 }
71 }
72
72
73 function test_set_username(data) {
73 function test_set_username(data) {
74 infographicModel.username = data.username
74 infographicModel.username = data.username
75− tryCompare(label, "text", "<b>19</b> minutes talk time")
75+ tryCompare(label, "text", data.label)
76 }
76 }
77 }
77 }
78
78
tests/qmltests/Greeter/tst_Phone.qml+15
@@ -19,6 +19,7 @@ import QtTest 1.0
19import ".."
19import ".."
20import "../../../Greeter"
20import "../../../Greeter"
21import AccountsService 0.1
21import AccountsService 0.1
22+import LightDM 0.1 as LightDM
22import Ubuntu.Components 0.1
23import Ubuntu.Components 0.1
23import Unity.Test 0.1 as UT
24import Unity.Test 0.1 as UT
24
25
@@ -53,6 +54,10 @@ Item {
53 name: "Greeter"
54 name: "Greeter"
54 when: windowShown
55 when: windowShown
55
56
57+ function cleanup() {
58+ AccountsService.statsWelcomeScreen = true
59+ }
60+
56 function test_properties() {
61 function test_properties() {
57 compare(greeter.multiUser, false)
62 compare(greeter.multiUser, false)
58 compare(greeter.narrowMode, true)
63 compare(greeter.narrowMode, true)
@@ -105,6 +110,16 @@ Item {
105 tryCompareFunction(function() { return greeter.x;}, 0);
110 tryCompareFunction(function() { return greeter.x;}, 0);
106 }
111 }
107
112
113+ function test_statsWelcomeScreen() {
114+ // Test logic in greeter that turns statsWelcomeScreen setting into infographic changes
115+ compare(AccountsService.statsWelcomeScreen, true)
116+ tryCompare(LightDM.Infographic, "username", "single")
117+ AccountsService.statsWelcomeScreen = false
118+ tryCompare(LightDM.Infographic, "username", "")
119+ AccountsService.statsWelcomeScreen = true
120+ tryCompare(LightDM.Infographic, "username", "single")
121+ }
122+
108 function test_wallpaper_data() {
123 function test_wallpaper_data() {
109 return [
124 return [
110 {tag: "set", accounts: "../tests/data/unity/backgrounds/blue.png", expected: "blue.png"},
125 {tag: "set", accounts: "../tests/data/unity/backgrounds/blue.png", expected: "blue.png"},