Mercurial > libervia-desktop-kivy
comparison 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 |
comparison
equal
deleted
inserted
replaced
513:0fdf3e59aaad | 514:d78728d7fd6a |
---|---|
1 #!/usr/bin/env python3 | 1 #!/usr/bin/env python3 |
2 | 2 |
3 | 3 |
4 #Libervia Desktop-Kivy | 4 # Libervia Desktop-Kivy |
5 # Copyright (C) 2016-2021 Jérôme Poisson (goffi@goffi.org) | 5 # Copyright (C) 2016-2021 Jérôme Poisson (goffi@goffi.org) |
6 | 6 |
7 # This program is free software: you can redistribute it and/or modify | 7 # This program is free software: you can redistribute it and/or modify |
8 # it under the terms of the GNU Affero General Public License as published by | 8 # it under the terms of the GNU Affero General Public License as published by |
9 # the Free Software Foundation, either version 3 of the License, or | 9 # the Free Software Foundation, either version 3 of the License, or |
15 # GNU Affero General Public License for more details. | 15 # GNU Affero General Public License for more details. |
16 | 16 |
17 # You should have received a copy of the GNU Affero General Public License | 17 # You should have received a copy of the GNU Affero General Public License |
18 # along with this program. If not, see <http://www.gnu.org/licenses/>. | 18 # along with this program. If not, see <http://www.gnu.org/licenses/>. |
19 | 19 |
20 import threading | 20 from functools import partial |
21 import sys | 21 import sys |
22 from functools import partial | 22 |
23 from libervia.backend.core import log as logging | 23 from libervia.backend.core import log as logging |
24 from libervia.backend.core.i18n import _ | 24 from libervia.backend.core.i18n import _ |
25 | |
26 from kivy import properties | |
25 from kivy.uix.boxlayout import BoxLayout | 27 from kivy.uix.boxlayout import BoxLayout |
26 from kivy import properties | 28 from libervia.desktop_kivy.core import file_chooser |
27 from kivy.clock import Clock | |
28 from plyer import filechooser, storagepath | |
29 | 29 |
30 log = logging.getLogger(__name__) | 30 log = logging.getLogger(__name__) |
31 | 31 |
32 | 32 |
33 PLUGIN_INFO = { | 33 PLUGIN_INFO = { |
42 callback = properties.ObjectProperty() | 42 callback = properties.ObjectProperty() |
43 cancel_cb = properties.ObjectProperty() | 43 cancel_cb = properties.ObjectProperty() |
44 default_path = properties.StringProperty() | 44 default_path = properties.StringProperty() |
45 | 45 |
46 | 46 |
47 class FileTransmitter(BoxLayout): | 47 class FileTransmitter(BoxLayout, file_chooser.FileChooser): |
48 callback = properties.ObjectProperty() | 48 """Widget to transmit files""" |
49 cancel_cb = properties.ObjectProperty() | |
50 native_filechooser = True | |
51 default_path = storagepath.get_home_dir() | |
52 | 49 |
53 def __init__(self, *args, **kwargs): | 50 def __init__(self, *args, **kwargs): |
54 if sys.platform == 'android': | 51 if sys.platform == "android": |
55 self.native_filechooser = False | 52 self.native_filechooser = False |
56 self.default_path = storagepath.get_downloads_dir() | 53 self.default_path = storagepath.get_downloads_dir() |
57 | 54 |
58 super(FileTransmitter, self).__init__(*args, **kwargs) | 55 super().__init__(*args, **kwargs) |
59 | 56 |
60 if self.native_filechooser: | 57 if self.native_filechooser: |
61 thread = threading.Thread(target=self._native_file_chooser) | 58 self.open() |
62 thread.start() | |
63 else: | 59 else: |
64 self.add_widget(FileChooserBox(default_path = self.default_path, | 60 self.add_widget( |
65 callback=self.on_files, | 61 FileChooserBox( |
66 cancel_cb=partial(self.cancel_cb, self))) | 62 default_path=self.default_path, |
67 | 63 callback=self.on_files, |
68 def _native_file_chooser(self, *args, **kwargs): | 64 cancel_cb=partial(self.cancel_cb, self), |
69 title=_("Please select a file to upload") | 65 ) |
70 files = filechooser.open_file(title=title, | 66 ) |
71 path=self.default_path, | |
72 multiple=False, | |
73 preview=True) | |
74 # we want to leave the thread when calling on_files, so we use Clock | |
75 Clock.schedule_once(lambda *args: self.on_files(files=files), 0) | |
76 | |
77 def on_files(self, files): | |
78 if files: | |
79 self.callback(files[0]) | |
80 else: | |
81 self.cancel_cb(self) |