Merge lp:~zsombi/ubuntu-ui-toolkit/30-alarm-update-fix into lp:ubuntu-ui-toolkit/staging

Proposed by Zsombor Egri
Status: Merged
Approved by: Cris Dywan
Approved revision: 1208
Merged at revision: 1210
Proposed branch: lp:~zsombi/ubuntu-ui-toolkit/30-alarm-update-fix
Merge into: lp:ubuntu-ui-toolkit/staging
Prerequisite: lp:~zsombi/ubuntu-ui-toolkit/20-alarm-model-update
Diff against target: 179 lines (+75/-39)
3 files modified
modules/Ubuntu/Components/plugin/adapters/alarmsadapter_organizer.cpp (+38/-38)
modules/Ubuntu/Components/plugin/adapters/alarmsadapter_p.h (+0/-1)
tests/unit/tst_alarms/tst_alarms.cpp (+37/-0)
To merge this branch: bzr merge lp:~zsombi/ubuntu-ui-toolkit/30-alarm-update-fix
Reviewer Review Type Date Requested Status
PS Jenkins bot continuous-integration Approve
Cris Dywan Approve
Nekhelesh Ramananthan Pending
Review via email: mp+231882@code.launchpad.net

Commit message

Fixing alarm disabling issue.

Change organiser item fields only if those were marked as changed.

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

prereq merge

Revision history for this message
Cris Dywan (kalikiana) wrote :

I guess this is a race condition in the backend? If so maybe it's worth having a little comment pointing this out?

Other than that it seems sensible.

review: Approve
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
Nekhelesh Ramananthan (nik90) wrote :

erm I was testing this to see if it causes any regressions in the clock app but it seems it got top approved before I could complete?

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'modules/Ubuntu/Components/plugin/adapters/alarmsadapter_organizer.cpp'
2--- modules/Ubuntu/Components/plugin/adapters/alarmsadapter_organizer.cpp 2014-08-22 14:49:12 +0000
3+++ modules/Ubuntu/Components/plugin/adapters/alarmsadapter_organizer.cpp 2014-08-22 14:49:12 +0000
4@@ -172,26 +172,45 @@
5 {
6 event.setCollectionId(collection.id());
7 event.setAllDay(false);
8- event.setStartDateTime(AlarmData::transcodeDate(alarm.date, Qt::UTC));
9- event.setDisplayLabel(alarm.message);
10-
11- if (alarm.enabled) {
12- // set visual and audible reminder serving as alarm note
13- QOrganizerItemVisualReminder visual;
14- visual.setSecondsBeforeStart(0);
15- visual.setMessage(alarm.message);
16- event.saveDetail(&visual);
17-
18- QOrganizerItemAudibleReminder audible;
19- audible.setSecondsBeforeStart(0);
20- audible.setDataUrl(alarm.sound);
21- event.saveDetail(&audible);
22+ if (alarm.changes & AlarmData::Date) {
23+ event.setStartDateTime(AlarmData::transcodeDate(alarm.date, Qt::UTC));
24+ }
25+ if (alarm.changes & AlarmData::Message) {
26+ event.setDisplayLabel(alarm.message);
27+ }
28+
29+ if (alarm.changes & AlarmData::Enabled) {
30+ QOrganizerItemVisualReminder visual = event.detail(QOrganizerItemDetail::TypeVisualReminder);
31+ QOrganizerItemAudibleReminder audible = event.detail(QOrganizerItemDetail::TypeAudibleReminder);
32+
33+ if (alarm.enabled) {
34+ if (visual.isEmpty()) {
35+ visual.setSecondsBeforeStart(0);
36+ visual.setMessage(alarm.message);
37+ event.saveDetail(&visual);
38+ }
39+ if (audible.isEmpty()) {
40+ audible.setSecondsBeforeStart(0);
41+ audible.setDataUrl(alarm.sound);
42+ event.saveDetail(&audible);
43+ }
44+ } else {
45+ event.removeDetail(&visual);
46+ event.removeDetail(&audible);
47+ }
48 }
49
50 // save the sound as description as the audible reminder may be off
51- event.setDescription(alarm.sound.toString());
52+ if (alarm.changes && AlarmData::Sound) {
53+ event.setDescription(alarm.sound.toString());
54+ }
55
56- // set repeating
57+ // set repeating, reset recurrence no matter if we had it or not
58+ if (((alarm.changes & AlarmData::Type) == AlarmData::Type)
59+ || ((alarm.changes & AlarmData::Days) == AlarmData::Days)) {
60+ QOrganizerItemRecurrence old = event.detail(QOrganizerItemDetail::TypeRecurrence);
61+ event.removeDetail(&old);
62+ }
63 switch (alarm.type) {
64 case UCAlarm::OneTime: {
65 break;
66@@ -212,25 +231,6 @@
67 }
68 }
69
70-void AlarmsAdapter::updateOrganizerEventFromAlarmData(const AlarmData &alarm, QOrganizerTodo &event)
71-{
72- // remove affected details
73- if (!alarm.enabled || (alarm.changes & AlarmData::Enabled)) {
74- // remove previously set reminders
75- QOrganizerItemVisualReminder visual = event.detail(QOrganizerItemDetail::TypeVisualReminder);
76- event.removeDetail(&visual);
77- QOrganizerItemAudibleReminder audible = event.detail(QOrganizerItemDetail::TypeAudibleReminder);
78- event.removeDetail(&audible);
79- }
80- if (((alarm.changes & AlarmData::Type) == AlarmData::Type)
81- || ((alarm.changes & AlarmData::Days) == AlarmData::Days)) {
82- QOrganizerItemRecurrence old = event.detail(QOrganizerItemDetail::TypeRecurrence);
83- event.removeDetail(&old);
84- }
85-
86- organizerEventFromAlarmData(alarm, event);
87-}
88-
89 int AlarmsAdapter::alarmDataFromOrganizerEvent(const QOrganizerTodo &event, AlarmData &alarm)
90 {
91 if (event.isEmpty()) {
92@@ -452,8 +452,8 @@
93 QOrganizerTodo event;
94
95 if (!alarm.cookie.isValid()) {
96- // new event
97- AlarmsAdapter::get()->organizerEventFromAlarmData(alarm, event);
98+ // new event, mark all fields dirty
99+ alarm.changes = AlarmData::AllFields;
100 } else {
101 // update existing event
102 QOrganizerItemId itemId = alarm.cookie.value<QOrganizerItemId>();
103@@ -462,8 +462,8 @@
104 setStatus(AlarmRequest::Saving, AlarmRequest::Fail, UCAlarm::AdaptationError);
105 return false;
106 }
107- AlarmsAdapter::get()->updateOrganizerEventFromAlarmData(alarm, event);
108 }
109+ AlarmsAdapter::get()->organizerEventFromAlarmData(alarm, event);
110
111 QOrganizerItemSaveRequest *operation = new QOrganizerItemSaveRequest(q_ptr);
112 operation->setManager(AlarmsAdapter::get()->manager);
113
114=== modified file 'modules/Ubuntu/Components/plugin/adapters/alarmsadapter_p.h'
115--- modules/Ubuntu/Components/plugin/adapters/alarmsadapter_p.h 2014-08-22 14:49:12 +0000
116+++ modules/Ubuntu/Components/plugin/adapters/alarmsadapter_p.h 2014-08-22 14:49:12 +0000
117@@ -85,7 +85,6 @@
118 void saveAlarms();
119
120 void organizerEventFromAlarmData(const AlarmData &alarm, QOrganizerTodo &event);
121- void updateOrganizerEventFromAlarmData(const AlarmData &alarm, QOrganizerTodo &event);
122 int alarmDataFromOrganizerEvent(const QOrganizerTodo &event, AlarmData &alarm);
123 QSet<Qt::DayOfWeek> daysToSet(const AlarmData &alarm) const;
124 void daysFromSet(AlarmData &alarm, QSet<Qt::DayOfWeek> set);
125
126=== modified file 'tests/unit/tst_alarms/tst_alarms.cpp'
127--- tests/unit/tst_alarms/tst_alarms.cpp 2014-08-22 14:49:12 +0000
128+++ tests/unit/tst_alarms/tst_alarms.cpp 2014-08-22 14:49:12 +0000
129@@ -104,6 +104,18 @@
130 return false;
131 }
132
133+ AlarmData getAlarmDataFromAlarmCookie(UCAlarm *alarm)
134+ {
135+ UCAlarmPrivate *pAlarm = UCAlarmPrivate::get(alarm);
136+ AlarmList alarms = AlarmManager::instance().alarms();
137+ int index = alarms.indexOfAlarm(pAlarm->rawData.cookie);
138+ AlarmData data;
139+ if (index >= 0) {
140+ data = alarms[index];
141+ }
142+ return data;
143+ }
144+
145 private Q_SLOTS:
146
147 void initTestCase()
148@@ -526,6 +538,31 @@
149 QCOMPARE(alarm, saved);
150 QCOMPARE(alarm.sound().toString(), saved.sound().toString());
151 }
152+
153+ // guard bug #1360101
154+ void test_create_update_and_disable_alarm() {
155+ UCAlarm alarm(QDateTime::currentDateTime(), UCAlarm::AutoDetect, "test_create_update_and_disable_alarm");
156+ alarm.setSound(QUrl("file:///usr/share/sounds/ubuntu/ringtones/Celestial.ogg"));
157+ alarm.save();
158+ waitForRequest(&alarm);
159+ QVERIFY(containsAlarm(&alarm));
160+
161+ // update alarm to occur 1h earlier
162+ QDateTime date = alarm.date();
163+ date.addSecs(-60);
164+ alarm.save();
165+ waitForRequest(&alarm);
166+ QVERIFY(containsAlarm(&alarm));
167+
168+ // disable alarm
169+ alarm.setEnabled(false);
170+ alarm.save();
171+ waitForRequest(&alarm);
172+ QVERIFY(containsAlarm(&alarm));
173+ AlarmData data = getAlarmDataFromAlarmCookie(&alarm);
174+ QVERIFY(data.cookie.isValid());
175+ QCOMPARE(data.enabled, false);
176+ }
177 };
178
179 QTEST_MAIN(tst_UCAlarms)

Subscribers

People subscribed via source and target branches