From 3a8c63f5d46e331fdb38ca508b6dc9e444c38d90 Mon Sep 17 00:00:00 2001 From: hogliux Date: Thu, 5 Jul 2018 16:33:31 +0100 Subject: [PATCH] iOS: Ensured that native file choosers also work in iOS apps --- .../AU/juce_AUv3_Wrapper.mm | 14 ++++++++++ .../native/juce_ios_FileChooser.mm | 26 +++++++++++++++---- .../native/juce_ios_UIViewComponentPeer.mm | 19 ++++++++++++-- 3 files changed, 52 insertions(+), 7 deletions(-) diff --git a/modules/juce_audio_plugin_client/AU/juce_AUv3_Wrapper.mm b/modules/juce_audio_plugin_client/AU/juce_AUv3_Wrapper.mm index 8d138540d7..f17d828b87 100644 --- a/modules/juce_audio_plugin_client/AU/juce_AUv3_Wrapper.mm +++ b/modules/juce_audio_plugin_client/AU/juce_AUv3_Wrapper.mm @@ -1657,6 +1657,17 @@ JuceAudioUnitv3Base* JuceAudioUnitv3Base::create (AUAudioUnit* audioUnit, AudioC return new JuceAudioUnitv3 (audioUnit, descr, options, error); } +#if JUCE_IOS +namespace juce +{ +struct UIViewPeerControllerReceiver +{ + virtual ~UIViewPeerControllerReceiver(); + virtual void setViewController (UIViewController*) = 0; +}; +} +#endif + //============================================================================== class JuceAUViewController { @@ -1708,6 +1719,9 @@ public: #if JUCE_IOS if (JUCE_IOS_MAC_VIEW* peerView = [[[myself view] subviews] objectAtIndex: 0]) [peerView setContentMode: UIViewContentModeTop]; + + if (auto* peer = dynamic_cast (editor->getPeer())) + peer->setViewController (myself); #endif } } diff --git a/modules/juce_gui_basics/native/juce_ios_FileChooser.mm b/modules/juce_gui_basics/native/juce_ios_FileChooser.mm index 8304895483..67fd14a48a 100644 --- a/modules/juce_gui_basics/native/juce_ios_FileChooser.mm +++ b/modules/juce_gui_basics/native/juce_ios_FileChooser.mm @@ -85,11 +85,27 @@ public: setOpaque (false); - auto chooserBounds = Desktop::getInstance().getDisplays().getMainDisplay().userArea; - setBounds (chooserBounds); + if (SystemStats::isRunningInAppExtensionSandbox()) + { + [controller.get() setModalPresentationStyle:UIModalPresentationFullScreen]; + + if (auto* editorPeer = ComponentPeer::getPeer (0)) + { + auto chooserBounds = editorPeer->getComponent().getLocalBounds(); + setBounds (chooserBounds); - setAlwaysOnTop (true); - addToDesktop (0); + setAlwaysOnTop (true); + editorPeer->getComponent().addAndMakeVisible (this); + } + } + else + { + auto chooserBounds = Desktop::getInstance().getDisplays().getMainDisplay().userArea; + setBounds (chooserBounds); + + setAlwaysOnTop (true); + addToDesktop (0); + } } ~Native() @@ -308,7 +324,7 @@ bool FileChooser::isPlatformDialogAvailable() #if JUCE_DISABLE_NATIVE_FILECHOOSERS return false; #else - return [[NSFileManager defaultManager] ubiquityIdentityToken] != nil; + return true; #endif } diff --git a/modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm b/modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm index dc2499a82d..1613369d9a 100644 --- a/modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm +++ b/modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm @@ -163,8 +163,17 @@ using namespace juce; namespace juce { +struct UIViewPeerControllerReceiver +{ + virtual ~UIViewPeerControllerReceiver(); + virtual void setViewController (UIViewController*) = 0; +}; + +UIViewPeerControllerReceiver::~UIViewPeerControllerReceiver() {} + class UIViewComponentPeer : public ComponentPeer, - public FocusChangeListener + public FocusChangeListener, + public UIViewPeerControllerReceiver { public: UIViewComponentPeer (Component&, int windowStyleFlags, UIView* viewToAttachTo); @@ -176,6 +185,12 @@ public: void setTitle (const String& title) override; void setBounds (const Rectangle&, bool isNowFullScreen) override; + void setViewController (UIViewController* newController) override + { + jassert (controller == nullptr); + controller = [newController retain]; + } + Rectangle getBounds() const override { return getBounds (! isSharedWindow); } Rectangle getBounds (bool global) const; Point localToGlobal (Point relativePosition) override; @@ -218,7 +233,7 @@ public: //============================================================================== UIWindow* window; JuceUIView* view; - JuceUIViewController* controller; + UIViewController* controller; bool isSharedWindow, fullScreen, insideDrawRect, isAppex; static int64 getMouseTime (UIEvent* e) noexcept