Added periodic sync. Improved sync dialog UI.

This commit is contained in:
Mark Qvist 2022-10-08 22:47:08 +02:00
parent d5231da5bb
commit 7df2a69b4b
3 changed files with 91 additions and 13 deletions

View File

@ -1,3 +1,4 @@
# TODO: Reset
__debug_build__ = True
__disable_shaders__ = True
__version__ = "0.2.2"
@ -65,9 +66,10 @@ else:
from .ui.messages import Messages, ts_format
from .ui.helpers import ContentNavigationDrawer, DrawerList, IconListItem
from kivy.metrics import dp
from kivymd.uix.button import MDFlatButton
from kivy.metrics import dp, sp
from kivymd.uix.button import MDFlatButton, MDRectangleFlatButton
from kivymd.uix.dialog import MDDialog
from kivymd.color_definitions import colors
dark_theme_text_color = "ddd"
@ -178,12 +180,24 @@ class SidebandApp(MDApp):
else:
self.theme_cls.theme_style = "Light"
self.update_ui_colors()
def update_ui_colors(self):
if self.sideband.config["dark_ui"]:
self.color_reject = colors["DeepOrange"]["900"]
self.color_accept = colors["LightGreen"]["700"]
else:
self.color_reject = colors["DeepOrange"]["800"]
self.color_accept = colors["LightGreen"]["700"]
def update_ui_theme(self):
if self.sideband.config["dark_ui"]:
self.theme_cls.theme_style = "Dark"
else:
self.theme_cls.theme_style = "Light"
self.update_ui_colors()
st = time.time()
RNS.log("Recursing widgets...")
for wid in self.root.ids:
@ -311,6 +325,12 @@ class SidebandApp(MDApp):
self.sync_dialog.ids.sync_progress.value = self.sideband.get_sync_progress()*100
self.sync_dialog.ids.sync_status.text = self.sideband.get_sync_status()
state = self.sideband.message_router.propagation_transfer_state
if state > LXMF.LXMRouter.PR_IDLE and state < LXMF.LXMRouter.PR_COMPLETE:
self.widget_hide(self.sync_dialog.stop_button, False)
else:
self.widget_hide(self.sync_dialog.stop_button, True)
elif self.root.ids.screen_manager.current == "announces_screen":
if self.sideband.getstate("app.flags.new_announces"):
if self.announces_view != None:
@ -674,27 +694,40 @@ class SidebandApp(MDApp):
else:
sl = None
self.sideband.setpersistent("lxmf.lastsync", time.time())
self.sideband.setpersistent("lxmf.syncretrying", False)
self.sideband.request_lxmf_sync(limit=sl)
close_button = MDFlatButton(text="Close", font_size=dp(20))
# stop_button = MDFlatButton(text="Stop", font_size=dp(20))
# , font_size=dp(20)
close_button = MDRectangleFlatButton(text="Close",font_size=sp(18))
stop_button = MDRectangleFlatButton(text="Stop",font_size=sp(18), theme_text_color="Custom", line_color=self.color_reject, text_color=self.color_reject)
dialog_content = MsgSync()
dialog = MDDialog(
title="LXMF Sync via "+RNS.prettyhexrep(self.sideband.message_router.get_outbound_propagation_node()),
type="custom",
content_cls=dialog_content,
buttons=[ close_button ],
buttons=[ stop_button, close_button ],
# elevation=0,
)
dialog.d_content = dialog_content
def dl_close(s):
self.sideband.setstate("app.flags.lxmf_sync_dialog_open", False)
dialog.dismiss()
# self.sideband.cancel_lxmf_sync()
def dl_stop(s):
# self.sideband.setstate("app.flags.lxmf_sync_dialog_open", False)
# dialog.dismiss()
self.sideband.cancel_lxmf_sync()
def cb(dt):
self.widget_hide(self.sync_dialog.stop_button, True)
Clock.schedule_once(cb, 0.25)
close_button.bind(on_release=dl_close)
stop_button.bind(on_release=dl_stop)
self.sideband.setstate("app.flags.lxmf_sync_dialog_open", True)
self.sync_dialog = dialog_content
self.sync_dialog.stop_button = stop_button
dialog.open()
dialog_content.ids.sync_progress.value = self.sideband.get_sync_progress()*100
dialog_content.ids.sync_status.text = self.sideband.get_sync_status()
@ -854,6 +887,7 @@ class SidebandApp(MDApp):
self.root.ids.settings_lxmf_sync_periodic.text = "Auto sync every "+interval_text
if pre != self.root.ids.settings_lxmf_sync_periodic.text:
if save:
self.sideband.config["lxmf_sync_interval"] = interval
self.sideband.save_configuration()
self.root.ids.settings_lxmf_address.text = RNS.hexrep(self.sideband.lxmf_destination.hash, delimit=False)

View File

@ -63,7 +63,9 @@ class SidebandCore():
MAX_ANNOUNCES = 24
JOB_INTERVAL = 1
SERVICE_JOB_INTERVAL = 1
PERIODIC_JOBS_INTERVAL = 60
PERIODIC_SYNC_RETRY = 360
aspect_filter = "lxmf.delivery"
def received_announce(self, destination_hash, announced_identity, app_data):
@ -929,10 +931,46 @@ class SidebandCore():
def _service_jobs(self):
if self.is_service:
while True:
time.sleep(SidebandCore.JOB_INTERVAL)
time.sleep(SidebandCore.SERVICE_JOB_INTERVAL)
if self.getstate("wants.announce"):
self.lxmf_announce()
def _periodic_jobs(self):
if self.is_service or self.is_standalone:
while True:
time.sleep(SidebandCore.PERIODIC_JOBS_INTERVAL)
if self.config["lxmf_periodic_sync"] == True:
if self.getpersistent("lxmf.lastsync") == None:
# TODO: Remove
RNS.log("Lastsync was none, setting now as initial", RNS.LOG_DEBUG)
self.setpersistent("lxmf.lastsync", time.time())
else:
now = time.time()
syncinterval = self.config["lxmf_sync_interval"]
lastsync = self.getpersistent("lxmf.lastsync")
nextsync = lastsync+syncinterval
RNS.log("Last sync was "+RNS.prettytime(now-lastsync)+" ago", RNS.LOG_DEBUG)
RNS.log("Next sync is "+("in "+RNS.prettytime(nextsync-now) if nextsync-now > 0 else "now"), RNS.LOG_DEBUG)
if now > nextsync:
# TODO: Remove
RNS.log("Syncing now...", RNS.LOG_DEBUG)
if self.request_lxmf_sync():
RNS.log("Scheduled LXMF sync succeeded", RNS.LOG_DEBUG)
self.setpersistent("lxmf.lastsync", time.time())
self.setpersistent("lxmf.syncretrying", False)
else:
if not self.getpersistent("lxmf.syncretrying"):
RNS.log("Scheduled LXMF sync failed, retrying in "+RNS.prettytime(SidebandCore.PERIODIC_SYNC_RETRY), RNS.LOG_DEBUG)
self.setpersistent("lxmf.lastsync", lastsync+SidebandCore.PERIODIC_SYNC_RETRY)
self.setpersistent("lxmf.syncretrying", True)
else:
RNS.log("Retry of scheduled LXMF sync failed too, waiting until next scheduled sync to try again", RNS.LOG_DEBUG)
self.setpersistent("lxmf.lastsync", time.time())
self.setpersistent("lxmf.syncretrying", False)
def __start_jobs_deferred(self):
if self.config["start_announce"]:
self.lxmf_announce()
@ -941,6 +979,10 @@ class SidebandCore():
self.service_thread = threading.Thread(target=self._service_jobs, daemon=True)
self.service_thread.start()
if self.is_standalone or self.is_service:
self.periodic_thread = threading.Thread(target=self._periodic_jobs, daemon=True)
self.periodic_thread.start()
def __start_jobs_immediate(self):
if self.log_verbose:
selected_level = 7

View File

@ -71,13 +71,14 @@ MDNavigationLayout:
MDIconButton:
pos_hint: {"center_x": .5, "center_y": .5}
icon: "close-network-outline"
# icon: "close-network-outline"
icon: "waves"
icon_size: "72dp"
MDLabel:
id: connecting_info
halign: "center"
text: "Shutting down..."
text: "Dissolving Reticulum"
font_size: "32dp"
size_hint_y: None
text_size: self.width, None
@ -1117,17 +1118,18 @@ MDNavigationLayout:
orientation: "vertical"
spacing: "24dp"
size_hint_y: None
padding: [0, 0, 0, dp(16)]
height: self.minimum_height+dp(24)
MDProgressBar:
id: sync_progress
value: 0
MDLabel:
id: sync_status
hint_text: "Name"
text: "Initiating sync..."
MDProgressBar:
id: sync_progress
value: 0
<ConvSettings>
orientation: "vertical"
spacing: "24dp"