changeset 2845:42380a4f6433

quick frontend (app): new synchronisation mechanism: on some frontend (notably on mobiles) frontend can be paused and lose synchronisation with backend, this can also happen if backend restart a connexion without resuming using stream management. To manage that, QuickApp now has a sync attribute which is True when the backend is in sync with frontend. When synchronisation has been lost and is possible again, all widget will have their "resync" method called, which can be used to do necessary calls to update the status. It's the responsability of each widget to then reset the "sync" attribute, once everything has been resynchronised.
author Goffi <goffi@goffi.org>
date Sat, 09 Mar 2019 16:33:31 +0100
parents fa1cc09df195
children 58ea675d0f05
files sat_frontends/quick_frontend/quick_app.py sat_frontends/quick_frontend/quick_widgets.py
diffstat 2 files changed, 39 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/sat_frontends/quick_frontend/quick_app.py	Sat Mar 09 16:24:17 2019 +0100
+++ b/sat_frontends/quick_frontend/quick_app.py	Sat Mar 09 16:33:31 2019 +0100
@@ -329,6 +329,7 @@
         self.features = None
         self.ns_map = {}  # map of short name to namespaces
         self.encryption_plugins = []
+        self._sync = True  # state of synchronisation with backend
 
     def connectBridge(self):
         self.bridge.bridgeConnect(callback=self._bridgeCb, errback=self._bridgeEb)
@@ -425,6 +426,43 @@
             if isinstance(w, quick_widgets.QuickWidget):
                 return w
 
+    # backend state management
+
+    @property
+    def sync(self):
+        """Get synchronization flag
+
+        True if this frontend is synchronised with backend
+        """
+        return self._sync
+
+    @sync.setter
+    def sync(self, state):
+        """Called when backend is desynchronised or resynchronising
+
+        @param state(bool): True: if the backend is resynchronising
+            False when we lose synchronisation, for instance if frontend is going to sleep
+            or if connection has been lost and a reconnection is needed
+        """
+        if state:
+            # we are resynchronising
+            for w in self.widgets:
+                try:
+                    resync = w.resync
+                except AttributeError:
+                    pass
+                else:
+                    resync()
+            self._sync = state
+        else:
+            self._sync = state
+            # we've lost synchronisation
+            for w in self.widgets:
+                try:
+                    w.sync = False
+                except AttributeError:
+                    pass
+
     def registerSignal(
         self, function_name, handler=None, iface="core", with_profile=True
     ):
--- a/sat_frontends/quick_frontend/quick_widgets.py	Sat Mar 09 16:24:17 2019 +0100
+++ b/sat_frontends/quick_frontend/quick_widgets.py	Sat Mar 09 16:33:31 2019 +0100
@@ -125,7 +125,7 @@
     def getWidget(self, class_, target=None, profiles=None):
         """Get a widget without creating it if it doesn't exist.
 
-        @param class_(class): class of the widget to create
+        @param class_: subclass of QuickWidget, same parameter as used in [getOrCreateWidget]
         @param target: target depending of the widget, usually a JID instance
         @param profiles (unicode, iterable[unicode], None): profile(s) to use (may or may not be
             used, depending of the widget class)