diff libervia/desktop_kivy/plugins/plugin_transfer_file.py @ 514:d78728d7fd6a

plugin wid calls, core: implements WebRTC DataChannel file transfer: - Add a new "file" icon in call UI to send a file via WebRTC. - Handle new preflight mechanism, and WebRTC file transfer. - Native file chooser handling has been moved to new `core.file_chooser` module, and now supports "save" and "dir" modes (based on `plyer`). rel 442
author Goffi <goffi@goffi.org>
date Sat, 06 Apr 2024 13:37:27 +0200
parents b3cedbee561d
children
line wrap: on
line diff
--- a/libervia/desktop_kivy/plugins/plugin_transfer_file.py	Thu Jan 18 23:46:31 2024 +0100
+++ b/libervia/desktop_kivy/plugins/plugin_transfer_file.py	Sat Apr 06 13:37:27 2024 +0200
@@ -1,7 +1,7 @@
 #!/usr/bin/env python3
 
 
-#Libervia Desktop-Kivy
+# Libervia Desktop-Kivy
 # Copyright (C) 2016-2021 Jérôme Poisson (goffi@goffi.org)
 
 # This program is free software: you can redistribute it and/or modify
@@ -17,15 +17,15 @@
 # You should have received a copy of the GNU Affero General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
-import threading
+from functools import partial
 import sys
-from functools import partial
+
 from libervia.backend.core import log as logging
 from libervia.backend.core.i18n import _
-from kivy.uix.boxlayout import BoxLayout
+
 from kivy import properties
-from kivy.clock import Clock
-from plyer import filechooser, storagepath
+from kivy.uix.boxlayout import BoxLayout
+from libervia.desktop_kivy.core import file_chooser
 
 log = logging.getLogger(__name__)
 
@@ -44,38 +44,23 @@
     default_path = properties.StringProperty()
 
 
-class FileTransmitter(BoxLayout):
-    callback = properties.ObjectProperty()
-    cancel_cb = properties.ObjectProperty()
-    native_filechooser = True
-    default_path = storagepath.get_home_dir()
+class FileTransmitter(BoxLayout, file_chooser.FileChooser):
+    """Widget to transmit files"""
 
     def __init__(self, *args, **kwargs):
-        if sys.platform == 'android':
+        if sys.platform == "android":
             self.native_filechooser = False
             self.default_path = storagepath.get_downloads_dir()
 
-        super(FileTransmitter, self).__init__(*args, **kwargs)
+        super().__init__(*args, **kwargs)
 
         if self.native_filechooser:
-            thread = threading.Thread(target=self._native_file_chooser)
-            thread.start()
+            self.open()
         else:
-            self.add_widget(FileChooserBox(default_path = self.default_path,
-                                           callback=self.on_files,
-                                           cancel_cb=partial(self.cancel_cb, self)))
-
-    def _native_file_chooser(self, *args, **kwargs):
-        title=_("Please select a file to upload")
-        files = filechooser.open_file(title=title,
-                                      path=self.default_path,
-                                      multiple=False,
-                                      preview=True)
-        # we want to leave the thread when calling on_files, so we use Clock
-        Clock.schedule_once(lambda *args: self.on_files(files=files), 0)
-
-    def on_files(self, files):
-        if files:
-            self.callback(files[0])
-        else:
-            self.cancel_cb(self)
+            self.add_widget(
+                FileChooserBox(
+                    default_path=self.default_path,
+                    callback=self.on_files,
+                    cancel_cb=partial(self.cancel_cb, self),
+                )
+            )