|
- /*
- ==============================================================================
-
- This file is part of the JUCE library.
- Copyright (c) 2020 - Raw Material Software Limited
-
- JUCE is an open source library subject to commercial or open-source
- licensing.
-
- By using JUCE, you agree to the terms of both the JUCE 6 End-User License
- Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020).
-
- End User License Agreement: www.juce.com/juce-6-licence
- Privacy Policy: www.juce.com/juce-privacy-policy
-
- Or: You may also use this code under the terms of the GPL v3 (see
- www.gnu.org/licenses).
-
- JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
- EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
- DISCLAIMED.
-
- ==============================================================================
- */
-
- namespace juce
- {
-
- class AndroidViewComponent::Pimpl : public ComponentMovementWatcher
- {
- public:
- Pimpl (const LocalRef<jobject>& v, Component& comp)
- : ComponentMovementWatcher (&comp),
- view (v),
- owner (comp)
- {
- if (owner.isShowing())
- componentPeerChanged();
- }
-
- ~Pimpl() override
- {
- removeFromParent();
- }
-
- void componentMovedOrResized (bool /*wasMoved*/, bool /*wasResized*/) override
- {
- auto* topComp = owner.getTopLevelComponent();
-
- if (topComp->getPeer() != nullptr)
- {
- auto pos = topComp->getLocalPoint (&owner, Point<int>());
-
- Rectangle<int> r (pos.x, pos.y, owner.getWidth(), owner.getHeight());
- r *= Desktop::getInstance().getDisplays().getMainDisplay().scale;
-
- getEnv()->CallVoidMethod (view, AndroidView.layout, r.getX(), r.getY(),
- r.getRight(), r.getBottom());
- }
- }
-
- void componentPeerChanged() override
- {
- auto* peer = owner.getPeer();
-
- if (currentPeer != peer)
- {
- removeFromParent();
- currentPeer = peer;
-
- addToParent();
- }
-
- enum
- {
- VISIBLE = 0,
- INVISIBLE = 4
- };
-
- getEnv()->CallVoidMethod (view, AndroidView.setVisibility, owner.isShowing() ? VISIBLE : INVISIBLE);
- }
-
- void componentVisibilityChanged() override
- {
- componentPeerChanged();
- }
-
- void componentBroughtToFront (Component& comp) override
- {
- ComponentMovementWatcher::componentBroughtToFront (comp);
- }
-
- Rectangle<int> getViewBounds() const
- {
- auto* env = getEnv();
-
- int width = env->CallIntMethod (view, AndroidView.getWidth);
- int height = env->CallIntMethod (view, AndroidView.getHeight);
-
- return Rectangle<int> (width, height);
- }
-
- GlobalRef view;
-
- private:
- void addToParent()
- {
- if (currentPeer != nullptr)
- {
- jobject peerView = (jobject) currentPeer->getNativeHandle();
-
- // NB: Assuming a parent is always of ViewGroup type
- auto* env = getEnv();
-
- env->CallVoidMethod (peerView, AndroidViewGroup.addView, view.get());
- componentMovedOrResized (false, false);
- }
- }
-
- void removeFromParent()
- {
- auto* env = getEnv();
- auto parentView = env->CallObjectMethod (view, AndroidView.getParent);
-
- if (parentView != nullptr)
- {
- // Assuming a parent is always of ViewGroup type
- env->CallVoidMethod (parentView, AndroidViewGroup.removeView, view.get());
- }
- }
-
- Component& owner;
- ComponentPeer* currentPeer = nullptr;
-
- JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Pimpl)
- };
-
- //==============================================================================
- AndroidViewComponent::AndroidViewComponent()
- {
- }
-
- AndroidViewComponent::~AndroidViewComponent() {}
-
- void AndroidViewComponent::setView (void* view)
- {
- if (view != getView())
- {
- pimpl.reset();
-
- if (view != nullptr)
- {
- // explicitly create a new local ref here so that we don't
- // delete the users pointer
- auto* env = getEnv();
- auto localref = LocalRef<jobject>(env->NewLocalRef((jobject) view));
-
- pimpl.reset (new Pimpl (localref, *this));
- }
- }
- }
-
- void* AndroidViewComponent::getView() const
- {
- return pimpl == nullptr ? nullptr : (void*) pimpl->view;
- }
-
- void AndroidViewComponent::resizeToFitView()
- {
- if (pimpl != nullptr)
- setBounds (pimpl->getViewBounds());
- }
-
- void AndroidViewComponent::paint (Graphics&) {}
-
- } // namespace juce
|