Sideband/sbapp/plyer/platforms/ios/filechooser.py

82 lines
2.6 KiB
Python
Raw Normal View History

2022-09-16 12:07:57 -04:00
'''
IOS file chooser
--------------------
This module houses the iOS implementation of the plyer FileChooser.
.. versionadded:: 1.4.4
'''
2024-06-02 12:31:58 -04:00
from sbapp.plyer.facades import FileChooser
2022-09-16 12:07:57 -04:00
from pyobjus import autoclass, protocol
from pyobjus.dylib_manager import load_framework
load_framework('/System/Library/Frameworks/Photos.framework')
class IOSFileChooser(FileChooser):
'''
FileChooser implementation for IOS using
the built-in file browser via UIImagePickerController.
.. versionadded:: 1.4.0
'''
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self._on_selection = None
def _file_selection_dialog(self, *args, **kwargs):
"""
Function called when action is required, A "mode" parameter specifies
which and is one of "open", "save" or "dir".
"""
self._on_selection = kwargs["on_selection"]
if kwargs["mode"] == "open":
self._open()
else:
raise NotImplementedError()
def _get_picker(self):
"""
Return an instantiated and configured UIImagePickerController.
"""
picker = autoclass("UIImagePickerController")
po = picker.alloc().init()
po.sourceType = 0
po.delegate = self
return po
def _open(self):
"""
Launch the native iOS file browser. Upon selection, the
`imagePickerController_didFinishPickingMediaWithInfo_` delegate is
called where we close the file browser and handle the result.
"""
picker = self._get_picker()
UIApplication = autoclass('UIApplication')
vc = UIApplication.sharedApplication().keyWindow.rootViewController()
vc.presentViewController_animated_completion_(picker, True, None)
@protocol('UIImagePickerControllerDelegate')
def imagePickerController_didFinishPickingMediaWithInfo_(
self, image_picker, frozen_dict):
"""
Delegate which handles the result of the image selection process.
"""
image_picker.dismissViewControllerAnimated_completion_(True, None)
# Note: We need to call this Objective C class as there is currently
# no way to call a non-class function via pyobjus. And here,
# we have to use the `UIImagePNGRepresentation` to get the png
# representation. For this, please ensure you are using an
# appropriate version of kivy-ios.
native_image_picker = autoclass("NativeImagePicker").alloc().init()
path = native_image_picker.writeToPNG_(frozen_dict)
self._on_selection([path.UTF8String()])
def instance():
return IOSFileChooser()