Merge lp:~diegosarmentero/ubuntuone-client/ubuntuone-client-timer into lp:ubuntuone-client

Proposed by Diego Sarmentero
Status: Merged
Approved by: Diego Sarmentero
Approved revision: 1333
Merged at revision: 1325
Proposed branch: lp:~diegosarmentero/ubuntuone-client/ubuntuone-client-timer
Merge into: lp:ubuntuone-client
Diff against target: 492 lines (+121/-84)
9 files modified
tests/platform/sync_menu/test_linux.py (+32/-17)
tests/status/test_aggregator.py (+15/-0)
tests/syncdaemon/test_main.py (+0/-14)
tests/syncdaemon/test_status_listener.py (+2/-2)
ubuntuone/platform/sync_menu/common.py (+0/-10)
ubuntuone/platform/sync_menu/linux.py (+38/-23)
ubuntuone/status/aggregator.py (+29/-3)
ubuntuone/syncdaemon/main.py (+3/-13)
ubuntuone/syncdaemon/status_listener.py (+2/-2)
To merge this branch: bzr merge lp:~diegosarmentero/ubuntuone-client/ubuntuone-client-timer
Reviewer Review Type Date Requested Status
Alejandro J. Cura (community) Approve
Mike McCracken (community) Approve
Review via email: mp+125499@code.launchpad.net

Commit message

- Using a timer event that doesn't fire continuously if another update timer is in progress (LP: #1052922).

To post a comment you must log in.
1322. By Diego Sarmentero

merge

1323. By Diego Sarmentero

adding logging

1324. By Diego Sarmentero

fixing test

1325. By Diego Sarmentero

adding test for register_listener

Revision history for this message
Alejandro J. Cura (alecu) wrote :

This branch is wrong: it keeps using cpu while syncdaemon is idle.

review: Needs Fixing
1326. By Diego Sarmentero

Improving timer

1327. By Diego Sarmentero

merge

1328. By Diego Sarmentero

Timer delay improved

1329. By Diego Sarmentero

raise error when the object is not callable

1330. By Diego Sarmentero

tests fixed

Revision history for this message
Mike McCracken (mikemc) wrote :

OK. looks good - tests pass for me on linux, and there are no new tests to run on darwin or windows.
(I have a branch that'll add tests for windows and darwin)

review: Approve
Revision history for this message
Mike McCracken (mikemc) wrote :

I should've added - I couldn't IRL test this because I don't have Q running yet, and IRL on darwin dies because of the bug that my other branch fixes...

Revision history for this message
Mike McCracken (mikemc) wrote :

I just noticed this - this branch removes the method "start_timer" from the UbuntuOneSyncMenuLinux class, but not from the DummySyncMenu class in sync_menu/linux.py.
The test in test_linux.py tests the dummy for start_timer, so it also needs to be updated.

Don't worry about fixing the same issue in common.py, my branch will do that.

review: Needs Fixing
1331. By Diego Sarmentero

removing start_timer from dummy

1332. By Diego Sarmentero

adding missing update_transfers for dummy and test

Revision history for this message
Mike McCracken (mikemc) wrote :

Looks good.

review: Approve
Revision history for this message
Alejandro J. Cura (alecu) wrote :

A few quick fixes needed:

The name of test_dummy_has_start_timer is wrong.

The docstring in test_register_listener_fail is copied from the one above.

"listeners_callbacks" and "register_listener" are misnamed. They should be "progress_listeners" and "register_progress_listener".

This docstring is wrong: """Create the sync menu and run the loop.""". It should be """Create the sync menu and register the progress listener."""

review: Approve
1333. By Diego Sarmentero

fixing naming and docstring problems

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'tests/platform/sync_menu/test_linux.py'
--- tests/platform/sync_menu/test_linux.py 2012-09-24 13:09:52 +0000
+++ tests/platform/sync_menu/test_linux.py 2012-09-26 20:23:20 +0000
@@ -28,6 +28,7 @@
28# files in the program, then also delete it here.28# files in the program, then also delete it here.
29"""Test the Sync Menu."""29"""Test the Sync Menu."""
3030
31import time
31from collections import Callable32from collections import Callable
3233
33from twisted.internet import defer34from twisted.internet import defer
@@ -57,18 +58,20 @@
57 return self.uploading_data58 return self.uploading_data
5859
5960
60class FakeStatusListener(object):61class FakeTimer(object):
61 """Fake StatusListener."""62 """Fake Timer."""
6263
63 def __init__(self):64 def __init__(self, delay):
64 self.status_frontend = FakeStatusFrontend()65 self.delay = delay
6566 self.callback = None
6667
67class FakeMain(object):68 def addCallback(self, callback):
68 """Fake Main."""69 """Add callback."""
6970 self.callback = callback
70 def __init__(self):71
71 self.status_listener = FakeStatusListener()72
73class FakeSyncdaemonService(object):
74 """Fake SyncdaemonService."""
7275
7376
74class FakeSyncMenuApp(object):77class FakeSyncMenuApp(object):
@@ -101,10 +104,10 @@
101 dummy = linux.DummySyncMenu('random', 'args')104 dummy = linux.DummySyncMenu('random', 'args')
102 self.assertIsInstance(dummy, linux.DummySyncMenu)105 self.assertIsInstance(dummy, linux.DummySyncMenu)
103106
104 def test_dummy_has_start_timer(self):107 def test_dummy_has_update_transfers(self):
105 """Check that the dummy has the proper methods required by the API."""108 """Check that the dummy has the proper methods required by the API."""
106 dummy = linux.DummySyncMenu('random', 'args')109 dummy = linux.DummySyncMenu('random', 'args')
107 self.assertIsInstance(dummy.start_timer, Callable)110 self.assertIsInstance(dummy.update_transfers, Callable)
108111
109112
110class SyncMenuTestCase(TestCase):113class SyncMenuTestCase(TestCase):
@@ -117,12 +120,13 @@
117 yield super(SyncMenuTestCase, self).setUp()120 yield super(SyncMenuTestCase, self).setUp()
118 self.patch(linux.SyncMenu, "App", FakeSyncMenuApp)121 self.patch(linux.SyncMenu, "App", FakeSyncMenuApp)
119 FakeSyncMenuApp.clean()122 FakeSyncMenuApp.clean()
120 self.main = FakeMain()123 self.syncdaemon_service = FakeSyncdaemonService()
121 self.status_frontend = self.main.status_listener.status_frontend124 self.status_frontend = FakeStatusFrontend()
122 self._paused = False125 self._paused = False
123 self.patch(sync_menu.UbuntuOneSyncMenu, "change_sync_status",126 self.patch(sync_menu.UbuntuOneSyncMenu, "change_sync_status",
124 self._change_sync_status)127 self._change_sync_status)
125 self.sync_menu = sync_menu.UbuntuOneSyncMenu(self.main)128 self.sync_menu = sync_menu.UbuntuOneSyncMenu(self.status_frontend,
129 self.syncdaemon_service)
126130
127 def _change_sync_status(self, *args):131 def _change_sync_status(self, *args):
128 """Fake change_sync_status."""132 """Fake change_sync_status."""
@@ -338,3 +342,14 @@
338 self.assertEqual(item.property_get_int(342 self.assertEqual(item.property_get_int(
339 linux.SyncMenu.PROGRESS_MENUITEM_PROP_PERCENT_DONE),343 linux.SyncMenu.PROGRESS_MENUITEM_PROP_PERCENT_DONE),
340 percentage)344 percentage)
345
346 def test_update_transfers_delay(self):
347 """Check that the timer is being handle properly."""
348 self.patch(linux.status.aggregator, "Timer", FakeTimer)
349 self.sync_menu.next_update = time.time() + 3
350 self.sync_menu.update_transfers()
351 self.assertLess(self.sync_menu.timer.delay, 3)
352 self.sync_menu.timer = None
353 self.sync_menu.next_update = time.time() / 2
354 self.sync_menu.update_transfers()
355 self.assertEqual(self.sync_menu.timer.delay, 0)
341356
=== modified file 'tests/status/test_aggregator.py'
--- tests/status/test_aggregator.py 2012-08-20 13:18:43 +0000
+++ tests/status/test_aggregator.py 2012-09-26 20:23:20 +0000
@@ -1314,6 +1314,21 @@
1314 self.assertEqual({}, self.aggregator.to_do)1314 self.assertEqual({}, self.aggregator.to_do)
1315 self.assertIdentical(None, self.aggregator.queue_done_timer)1315 self.assertIdentical(None, self.aggregator.queue_done_timer)
13161316
1317 def test_register_progress_listener(self):
1318 """Check that register listener handles properly additions."""
1319
1320 def fake_callback():
1321 """Do nothing."""
1322
1323 self.aggregator.register_progress_listener(fake_callback)
1324 self.assertEqual(len(self.aggregator.progress_listeners), 1)
1325
1326 def test_register_progress_listener_fail(self):
1327 """Check that register listener fails with not Callable objects."""
1328 self.assertRaises(TypeError,
1329 self.aggregator.register_progress_listener, [])
1330 self.assertEqual(len(self.aggregator.progress_listeners), 0)
1331
1317 def assertMiscCommandQueued(self, fc):1332 def assertMiscCommandQueued(self, fc):
1318 """Assert that some command was queued."""1333 """Assert that some command was queued."""
1319 self.assertEqual(len(self.aggregator.to_do), 1)1334 self.assertEqual(len(self.aggregator.to_do), 1)
13201335
=== modified file 'tests/syncdaemon/test_main.py'
--- tests/syncdaemon/test_main.py 2012-09-19 17:23:02 +0000
+++ tests/syncdaemon/test_main.py 2012-09-26 20:23:20 +0000
@@ -70,19 +70,6 @@
70 return defer.succeed(None)70 return defer.succeed(None)
7171
7272
73class FakedSyncMenu(object):
74 """Do nothing."""
75
76 def __init__(self, *args, **kwargs):
77 self.arguments = (args, kwargs)
78
79 def update_progress(self):
80 """Do nothing."""
81
82 def start_timer(self):
83 """Do nothing."""
84
85
86class MainTests(BaseTwistedTestCase):73class MainTests(BaseTwistedTestCase):
87 """ Basic tests to check main.Main """74 """ Basic tests to check main.Main """
8875
@@ -100,7 +87,6 @@
100 self.patch(main_mod.event_logging, "get_listener", lambda *a: None)87 self.patch(main_mod.event_logging, "get_listener", lambda *a: None)
101 # no status listener by default88 # no status listener by default
102 self.patch(main_mod.status_listener, "get_listener", lambda *a: None)89 self.patch(main_mod.status_listener, "get_listener", lambda *a: None)
103 self.patch(main_mod.sync_menu, "UbuntuOneSyncMenu", FakedSyncMenu)
10490
105 self.handler = MementoHandler()91 self.handler = MementoHandler()
106 self.handler.setLevel(logging.DEBUG)92 self.handler.setLevel(logging.DEBUG)
10793
=== modified file 'tests/syncdaemon/test_status_listener.py'
--- tests/syncdaemon/test_status_listener.py 2012-04-09 20:07:05 +0000
+++ tests/syncdaemon/test_status_listener.py 2012-09-26 20:23:20 +0000
@@ -84,7 +84,7 @@
84 callback(args)84 callback(args)
8585
86 listener = Listener()86 listener = Listener()
87 setattr(listener, 'handle_'+event, listener._handle_event)87 setattr(listener, 'handle_' + event, listener._handle_event)
88 event_q.subscribe(listener)88 event_q.subscribe(listener)
89 return listener89 return listener
9090
@@ -92,7 +92,7 @@
92class FakeStatusFrontend(object):92class FakeStatusFrontend(object):
93 """A fake status frontend."""93 """A fake status frontend."""
9494
95 def __init__(self):95 def __init__(self, *args, **kwargs):
96 """Initialize this instance."""96 """Initialize this instance."""
97 self.call_log = []97 self.call_log = []
9898
9999
=== modified file 'ubuntuone/platform/sync_menu/common.py'
--- ubuntuone/platform/sync_menu/common.py 2012-09-18 16:29:22 +0000
+++ ubuntuone/platform/sync_menu/common.py 2012-09-26 20:23:20 +0000
@@ -31,13 +31,3 @@
3131
32class UbuntuOneSyncMenu(object):32class UbuntuOneSyncMenu(object):
33 """Integrate U1 with the Ubuntu Sync Menu."""33 """Integrate U1 with the Ubuntu Sync Menu."""
34
35 def __init__(self, *args):
36 self.transfers = DummyTransfersMenu()
37
38
39class DummyTransfersMenu(object):
40 """Dummy Transfers Menu."""
41
42 def start_timer(self):
43 """Empty start timer, this is not needed on windows."""
4434
=== modified file 'ubuntuone/platform/sync_menu/linux.py'
--- ubuntuone/platform/sync_menu/linux.py 2012-09-24 12:47:05 +0000
+++ ubuntuone/platform/sync_menu/linux.py 2012-09-26 20:23:20 +0000
@@ -29,6 +29,8 @@
29"""Use SyncMenu lib to integrate U1 with the Systray Sync Icon."""29"""Use SyncMenu lib to integrate U1 with the Systray Sync Icon."""
3030
31import gettext31import gettext
32import logging
33import time
32import sys34import sys
33import webbrowser35import webbrowser
3436
@@ -50,10 +52,12 @@
50 use_syncmenu = True52 use_syncmenu = True
51except:53except:
52 use_syncmenu = False54 use_syncmenu = False
53from twisted.internet import reactor
5455
55from ubuntuone.clientdefs import GETTEXT_PACKAGE56from ubuntuone.clientdefs import GETTEXT_PACKAGE
5657from ubuntuone import status
58
59
60logger = logging.getLogger("ubuntuone.platform.SyncMenu")
5761
58Q_ = lambda string: gettext.dgettext(GETTEXT_PACKAGE, string)62Q_ = lambda string: gettext.dgettext(GETTEXT_PACKAGE, string)
5963
@@ -63,6 +67,7 @@
63MORE_STORAGE = Q_("Get More Space")67MORE_STORAGE = Q_("Get More Space")
64GET_HELP = Q_("Get Help on the Web")68GET_HELP = Q_("Get Help on the Web")
6569
70DELAY_BETWEEN_UPDATES = 3
66UBUNTUONE_LINK = u'https://one.ubuntu.com/'71UBUNTUONE_LINK = u'https://one.ubuntu.com/'
67DASHBOARD = UBUNTUONE_LINK + u'dashboard/'72DASHBOARD = UBUNTUONE_LINK + u'dashboard/'
68HELP_LINK = UBUNTUONE_LINK + u'support/'73HELP_LINK = UBUNTUONE_LINK + u'support/'
@@ -72,11 +77,12 @@
72class UbuntuOneSyncMenuLinux(object):77class UbuntuOneSyncMenuLinux(object):
73 """Integrate U1 with the Ubuntu Sync Menu."""78 """Integrate U1 with the Ubuntu Sync Menu."""
7479
75 def __init__(self, main):80 def __init__(self, status, syncdaemon_service):
76 """Initialize menu."""81 """Initialize menu."""
77 self._main = main82 self._syncdaemon_service = syncdaemon_service
78 self.status_listener = main.status_listener
79 self._paused = False83 self._paused = False
84 self.timer = None
85 self.next_update = time.time()
80 self.root_menu = Dbusmenu.Menuitem()86 self.root_menu = Dbusmenu.Menuitem()
8187
82 self.open_u1 = Dbusmenu.Menuitem()88 self.open_u1 = Dbusmenu.Menuitem()
@@ -86,7 +92,7 @@
86 self.go_to_web.property_set(Dbusmenu.MENUITEM_PROP_LABEL,92 self.go_to_web.property_set(Dbusmenu.MENUITEM_PROP_LABEL,
87 GO_TO_WEB)93 GO_TO_WEB)
8894
89 self.transfers = TransfersMenu(self.status_listener)95 self.transfers = TransfersMenu(status)
90 self.transfers.property_set(Dbusmenu.MENUITEM_PROP_LABEL,96 self.transfers.property_set(Dbusmenu.MENUITEM_PROP_LABEL,
91 TRANSFERS)97 TRANSFERS)
9298
@@ -121,17 +127,13 @@
121 self.app.set_menu(self.server)127 self.app.set_menu(self.server)
122 self.app.connect("notify::paused", self.change_sync_status)128 self.app.connect("notify::paused", self.change_sync_status)
123129
124 def start_timer(self):
125 """Start the transfers timer."""
126 self.transfers.start_timer()
127
128 def change_sync_status(self, *args):130 def change_sync_status(self, *args):
129 """Triggered when the sync status is changed fromm the menu."""131 """Triggered when the sync status is changed fromm the menu."""
130 if self._paused:132 if self._paused:
131 self._main.external.connect()133 self._syncdaemon_service.connect()
132 self._paused = False134 self._paused = False
133 else:135 else:
134 self._main.external.disconnect()136 self._syncdaemon_service.disconnect()
135 self._paused = True137 self._paused = True
136138
137 def open_control_panel(self, *args):139 def open_control_panel(self, *args):
@@ -150,34 +152,45 @@
150 """Open the Ubunto One Help Page"""152 """Open the Ubunto One Help Page"""
151 webbrowser.open(GET_STORAGE_LINK)153 webbrowser.open(GET_STORAGE_LINK)
152154
155 def _timeout(self, result):
156 """The aggregating timer has expired, so update the UI."""
157 self.next_update = int(time.time()) + DELAY_BETWEEN_UPDATES
158 self.transfers.update_progress()
159 self.timer = None
160
161 def update_transfers(self):
162 """Set up a timer if there isn't one ticking and update the ui."""
163 if not self.timer:
164 logger.debug("Updating Transfers.")
165 delay = int(max(0, min(DELAY_BETWEEN_UPDATES,
166 self.next_update - time.time())))
167 self.timer = status.aggregator.Timer(delay)
168 self.timer.addCallback(self._timeout)
169
153170
154class TransfersMenu(Dbusmenu.Menuitem):171class TransfersMenu(Dbusmenu.Menuitem):
155 """Menu that handles the recent and current transfers."""172 """Menu that handles the recent and current transfers."""
156173
157 def __init__(self, listener):174 def __init__(self, status_frontend):
158 super(TransfersMenu, self).__init__()175 super(TransfersMenu, self).__init__()
159 self.listener = listener176 self.status_frontend = status_frontend
160 self.uploading = {}177 self.uploading = {}
161 self.previous_transfers = []178 self.previous_transfers = []
162 self._transfers_items = {}179 self._transfers_items = {}
163 self._uploading_items = {}180 self._uploading_items = {}
164 self.separator = None181 self.separator = None
165182
166 def start_timer(self):
167 """Trigger an update in one second."""
168 self.update_progress()
169 reactor.callLater(3, self.start_timer)
170
171 def update_progress(self):183 def update_progress(self):
172 """Update the list of recent transfers and current transfers."""184 """Update the list of recent transfers and current transfers."""
173 current_transfers = self.listener.status_frontend.recent_transfers()185 current_transfers = self.status_frontend.recent_transfers()
174 uploading_data = {}186 uploading_data = {}
175 for filename, size, written in \187 for filename, size, written in \
176 self.listener.status_frontend.files_uploading():188 self.status_frontend.files_uploading():
177 uploading_data[filename] = (size, written)189 uploading_data[filename] = (size, written)
178190
179 temp_transfers = {}191 temp_transfers = {}
180 if current_transfers != self.previous_transfers:192 if current_transfers != self.previous_transfers:
193 logger.debug("Update recent transfers with: %r", current_transfers)
181 for item_transfer in self._transfers_items:194 for item_transfer in self._transfers_items:
182 self.child_delete(self._transfers_items[item_transfer])195 self.child_delete(self._transfers_items[item_transfer])
183 for item in current_transfers:196 for item in current_transfers:
@@ -204,6 +217,8 @@
204 upload_item.property_set_int(217 upload_item.property_set_int(
205 SyncMenu.PROGRESS_MENUITEM_PROP_PERCENT_DONE,218 SyncMenu.PROGRESS_MENUITEM_PROP_PERCENT_DONE,
206 percentage)219 percentage)
220 logger.debug("Current transfer %s progress update: %r",
221 item, percentage)
207 items_added += 1222 items_added += 1
208 else:223 else:
209 self.child_delete(self._uploading_items[item])224 self.child_delete(self._uploading_items[item])
@@ -223,6 +238,7 @@
223 uploading_file.property_set_int(238 uploading_file.property_set_int(
224 SyncMenu.PROGRESS_MENUITEM_PROP_PERCENT_DONE,239 SyncMenu.PROGRESS_MENUITEM_PROP_PERCENT_DONE,
225 percentage)240 percentage)
241 logger.debug("Current transfer %s created", item)
226 self.child_append(uploading_file)242 self.child_append(uploading_file)
227 self._uploading_items[item] = uploading_file243 self._uploading_items[item] = uploading_file
228 items_added += 1244 items_added += 1
@@ -234,8 +250,7 @@
234 def __init__(self, *args, **kwargs):250 def __init__(self, *args, **kwargs):
235 """Initialize menu."""251 """Initialize menu."""
236252
237 def start_timer(self):253 def update_transfers(self):
238 """Do nothing."""254 """Do nothing."""
239255
240
241UbuntuOneSyncMenu = UbuntuOneSyncMenuLinux if use_syncmenu else DummySyncMenu256UbuntuOneSyncMenu = UbuntuOneSyncMenuLinux if use_syncmenu else DummySyncMenu
242257
=== modified file 'ubuntuone/status/aggregator.py'
--- ubuntuone/status/aggregator.py 2012-08-16 12:00:12 +0000
+++ ubuntuone/status/aggregator.py 2012-09-26 20:23:20 +0000
@@ -33,7 +33,7 @@
33import itertools33import itertools
34import operator34import operator
35import os35import os
36from collections import deque36from collections import deque, Callable
3737
38import gettext38import gettext
3939
@@ -41,7 +41,11 @@
4141
42from ubuntuone.clientdefs import GETTEXT_PACKAGE42from ubuntuone.clientdefs import GETTEXT_PACKAGE
43from ubuntuone.status.logger import logger43from ubuntuone.status.logger import logger
44from ubuntuone.platform import session, notification44from ubuntuone.platform import (
45 notification,
46 session,
47 sync_menu
48)
45from ubuntuone.platform.messaging import Messaging49from ubuntuone.platform.messaging import Messaging
46from ubuntuone.platform.launcher import UbuntuOneLauncher, DummyLauncher50from ubuntuone.platform.launcher import UbuntuOneLauncher, DummyLauncher
4751
@@ -625,6 +629,7 @@
625 self.progress = {}629 self.progress = {}
626 self.to_do = {}630 self.to_do = {}
627 self.recent_transfers = deque(maxlen=5)631 self.recent_transfers = deque(maxlen=5)
632 self.progress_listeners = []
628633
629 def get_notification(self):634 def get_notification(self):
630 """Create a new toggleable notification object."""635 """Create a new toggleable notification object."""
@@ -655,6 +660,13 @@
655 self.to_do = {}660 self.to_do = {}
656 # pylint: enable=W0201661 # pylint: enable=W0201
657662
663 def register_progress_listener(self, listener):
664 """Register a callable object to be notified."""
665 if isinstance(listener, Callable):
666 self.progress_listeners.append(listener)
667 else:
668 raise TypeError("Callable object expected.")
669
658 def get_discovery_message(self):670 def get_discovery_message(self):
659 """Get the text for the discovery bubble."""671 """Get the text for the discovery bubble."""
660 lines = []672 lines = []
@@ -716,6 +728,8 @@
716 progress = float(728 progress = float(
717 sum(self.progress.values())) / sum(self.to_do.values())729 sum(self.progress.values())) / sum(self.to_do.values())
718 self.progress_bar.set_progress(progress)730 self.progress_bar.set_progress(progress)
731 for listener in self.progress_listeners:
732 listener()
719733
720 def download_started(self, command):734 def download_started(self, command):
721 """A download just started."""735 """A download just started."""
@@ -801,13 +815,25 @@
801class StatusFrontend(object):815class StatusFrontend(object):
802 """Frontend for the status aggregator, used by the StatusListener."""816 """Frontend for the status aggregator, used by the StatusListener."""
803817
804 def __init__(self, clock=reactor):818 def __init__(self, clock=reactor, service=None):
805 """Initialize this instance."""819 """Initialize this instance."""
806 self.aggregator = StatusAggregator(clock=clock)820 self.aggregator = StatusAggregator(clock=clock)
807 self.notification = self.aggregator.get_notification()821 self.notification = self.aggregator.get_notification()
808 self.messaging = Messaging()822 self.messaging = Messaging()
809 self.quota_timer = None823 self.quota_timer = None
810824
825 self.syncdaemon_service = service
826 self.sync_menu = None
827 self.start_sync_menu()
828
829 def start_sync_menu(self):
830 """Create the sync menu and register the progress listener."""
831 if self.syncdaemon_service is not None:
832 self.sync_menu = sync_menu.UbuntuOneSyncMenu(self,
833 self.syncdaemon_service)
834 self.aggregator.register_progress_listener(
835 self.sync_menu.update_transfers)
836
811 def recent_transfers(self):837 def recent_transfers(self):
812 """Return a tuple with the recent transfers paths."""838 """Return a tuple with the recent transfers paths."""
813 return list(self.aggregator.recent_transfers)839 return list(self.aggregator.recent_transfers)
814840
=== modified file 'ubuntuone/syncdaemon/main.py'
--- ubuntuone/syncdaemon/main.py 2012-09-19 17:23:02 +0000
+++ ubuntuone/syncdaemon/main.py 2012-09-26 20:23:20 +0000
@@ -48,10 +48,7 @@
48 volume_manager,48 volume_manager,
49)49)
50from ubuntuone import syncdaemon, clientdefs50from ubuntuone import syncdaemon, clientdefs
51from ubuntuone.platform import (51from ubuntuone.platform import event_logging
52 event_logging,
53 sync_menu,
54)
55from ubuntuone.syncdaemon import status_listener52from ubuntuone.syncdaemon import status_listener
56from ubuntuone.syncdaemon.interaction_interfaces import SyncdaemonService53from ubuntuone.syncdaemon.interaction_interfaces import SyncdaemonService
57from ubuntuone.syncdaemon.states import StateManager, QueueManager54from ubuntuone.syncdaemon.states import StateManager, QueueManager
@@ -159,14 +156,6 @@
159 self.mark = task.LoopingCall(self.log_mark)156 self.mark = task.LoopingCall(self.log_mark)
160 self.mark.start(mark_interval)157 self.mark.start(mark_interval)
161158
162 self.sync_menu = None
163 self.start_sync_menu()
164
165 def start_sync_menu(self):
166 """Create the sync menu and run the loop."""
167 self.sync_menu = sync_menu.UbuntuOneSyncMenu(self)
168 self.sync_menu.start_timer()
169
170 def start_event_logger(self):159 def start_event_logger(self):
171 """Start the event logger if it's available for this platform."""160 """Start the event logger if it's available for this platform."""
172 self.eventlog_listener = event_logging.get_listener(self.fs, self.vm)161 self.eventlog_listener = event_logging.get_listener(self.fs, self.vm)
@@ -176,7 +165,8 @@
176165
177 def start_status_listener(self):166 def start_status_listener(self):
178 """Start the status listener if it is configured to start."""167 """Start the status listener if it is configured to start."""
179 self.status_listener = status_listener.get_listener(self.fs, self.vm)168 self.status_listener = status_listener.get_listener(self.fs, self.vm,
169 self.external)
180 # subscribe to EQ, to be unsubscribed in shutdown170 # subscribe to EQ, to be unsubscribed in shutdown
181 if self.status_listener:171 if self.status_listener:
182 self.event_q.subscribe(self.status_listener)172 self.event_q.subscribe(self.status_listener)
183173
=== modified file 'ubuntuone/syncdaemon/status_listener.py'
--- ubuntuone/syncdaemon/status_listener.py 2012-08-10 12:49:46 +0000
+++ ubuntuone/syncdaemon/status_listener.py 2012-09-26 20:23:20 +0000
@@ -48,10 +48,10 @@
48 return True48 return True
4949
5050
51def get_listener(fsm, vm):51def get_listener(fsm, vm, syncdaemon_service=None):
52 """Return an instance of the status listener, or None if turned off."""52 """Return an instance of the status listener, or None if turned off."""
53 if should_start_listener():53 if should_start_listener():
54 status_frontend = StatusFrontend()54 status_frontend = StatusFrontend(service=syncdaemon_service)
55 return StatusListener(fsm, vm, status_frontend)55 return StatusListener(fsm, vm, status_frontend)
56 else:56 else:
57 return None57 return None

Subscribers

People subscribed via source and target branches