view libervia/desktop_kivy/plugins/plugin_transfer_file.py @ 514:d78728d7fd6a default tip

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 source

#!/usr/bin/env python3


# 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
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Affero General Public License for more details.

# 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/>.

from functools import partial
import sys

from libervia.backend.core import log as logging
from libervia.backend.core.i18n import _

from kivy import properties
from kivy.uix.boxlayout import BoxLayout
from libervia.desktop_kivy.core import file_chooser

log = logging.getLogger(__name__)


PLUGIN_INFO = {
    "name": _("file"),
    "main": "FileTransmitter",
    "description": _("transmit a local file"),
    "icon_medium": "{media}/icons/muchoslava/png/fichier_50.png",
}


class FileChooserBox(BoxLayout):
    callback = properties.ObjectProperty()
    cancel_cb = properties.ObjectProperty()
    default_path = properties.StringProperty()


class FileTransmitter(BoxLayout, file_chooser.FileChooser):
    """Widget to transmit files"""

    def __init__(self, *args, **kwargs):
        if sys.platform == "android":
            self.native_filechooser = False
            self.default_path = storagepath.get_downloads_dir()

        super().__init__(*args, **kwargs)

        if self.native_filechooser:
            self.open()
        else:
            self.add_widget(
                FileChooserBox(
                    default_path=self.default_path,
                    callback=self.on_files,
                    cancel_cb=partial(self.cancel_cb, self),
                )
            )