mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-01-10 23:44:24 +00:00
WebBrowserComponent: Android: Add accessibility integration
This commit is contained in:
parent
d8c282e293
commit
f519af3b62
5 changed files with 931 additions and 767 deletions
|
|
@ -269,12 +269,30 @@ public:
|
|||
{
|
||||
if (virtualViewId != HOST_VIEW_ID)
|
||||
virtualViewIdMap.erase (virtualViewId);
|
||||
|
||||
if (nativeChildViewId.has_value())
|
||||
virtualViewIdMap.erase (*nativeChildViewId);
|
||||
}
|
||||
|
||||
int getVirtualViewId() const noexcept { return virtualViewId; }
|
||||
|
||||
void populateNodeInfo (jobject info)
|
||||
jobject getNativeView (int viewId) const
|
||||
{
|
||||
if (nativeChildViewId == viewId)
|
||||
return static_cast<jobject> (AccessibilityHandler::getNativeChildForComponent (accessibilityHandler.getComponent()));
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void populateNodeInfo (jobject info, int infoVirtualViewId)
|
||||
{
|
||||
if ( AccessibilityHandler::getNativeChildForComponent (accessibilityHandler.getComponent()) != nullptr
|
||||
&& ! nativeChildViewId.has_value())
|
||||
{
|
||||
nativeChildViewId.emplace (getNextVirtualViewId());
|
||||
virtualViewIdMap[*nativeChildViewId] = &accessibilityHandler;
|
||||
}
|
||||
|
||||
const ScopedValueSetter<bool> svs (inPopulateNodeInfo, true);
|
||||
|
||||
const auto sourceView = getSourceView (accessibilityHandler);
|
||||
|
|
@ -293,6 +311,10 @@ public:
|
|||
env->CallVoidMethod (info, AndroidAccessibilityNodeInfo.addChild,
|
||||
sourceView, child->getNativeImplementation()->getVirtualViewId());
|
||||
|
||||
if (nativeChildViewId.has_value() && nativeChildViewId != infoVirtualViewId)
|
||||
env->CallVoidMethod (info, AndroidAccessibilityNodeInfo.addChild,
|
||||
sourceView, *nativeChildViewId);
|
||||
|
||||
if (auto* parent = accessibilityHandler.getParent())
|
||||
env->CallVoidMethod (info, AndroidAccessibilityNodeInfo.setVirtualParent,
|
||||
sourceView, parent->getNativeImplementation()->getVirtualViewId());
|
||||
|
|
@ -807,14 +829,19 @@ public:
|
|||
private:
|
||||
static std::unordered_map<int, AccessibilityHandler*> virtualViewIdMap;
|
||||
|
||||
static int getVirtualViewIdForHandler (const AccessibilityHandler& handler)
|
||||
static int getNextVirtualViewId()
|
||||
{
|
||||
static int counter = 0;
|
||||
|
||||
return counter++;
|
||||
}
|
||||
|
||||
static int getVirtualViewIdForHandler (const AccessibilityHandler& handler)
|
||||
{
|
||||
if (handler.getComponent().isOnDesktop())
|
||||
return HOST_VIEW_ID;
|
||||
|
||||
return counter++;
|
||||
return getNextVirtualViewId();
|
||||
}
|
||||
|
||||
LocalRef<jstring> getDescriptionString() const
|
||||
|
|
@ -908,6 +935,7 @@ private:
|
|||
|
||||
AccessibilityHandler& accessibilityHandler;
|
||||
const int virtualViewId;
|
||||
std::optional<int> nativeChildViewId;
|
||||
bool inPopulateNodeInfo = false;
|
||||
|
||||
//==============================================================================
|
||||
|
|
|
|||
|
|
@ -888,6 +888,7 @@ public final class ComponentPeerView extends ViewGroup
|
|||
}
|
||||
|
||||
//==============================================================================
|
||||
private native View getNativeView (long host, int virtualViewId);
|
||||
private native boolean populateAccessibilityNodeInfo (long host, int virtualViewId, AccessibilityNodeInfo info);
|
||||
private native boolean handlePerformAction (long host, int virtualViewId, int action, Bundle arguments);
|
||||
private native Integer getInputFocusViewId (long host);
|
||||
|
|
@ -906,6 +907,11 @@ public final class ComponentPeerView extends ViewGroup
|
|||
if (host == 0)
|
||||
return null;
|
||||
|
||||
View nativeView = getNativeView (host, virtualViewId);
|
||||
|
||||
if (nativeView != null)
|
||||
return nativeView.createAccessibilityNodeInfo();
|
||||
|
||||
final AccessibilityNodeInfo nodeInfo;
|
||||
|
||||
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.R)
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -67,6 +67,8 @@ public:
|
|||
//==============================================================================
|
||||
/** @internal */
|
||||
void paint (Graphics&) override;
|
||||
/** @internal */
|
||||
std::unique_ptr<AccessibilityHandler> createAccessibilityHandler() override;
|
||||
|
||||
private:
|
||||
class Pimpl;
|
||||
|
|
|
|||
|
|
@ -140,7 +140,10 @@ AndroidViewComponent::AndroidViewComponent()
|
|||
{
|
||||
}
|
||||
|
||||
AndroidViewComponent::~AndroidViewComponent() {}
|
||||
AndroidViewComponent::~AndroidViewComponent()
|
||||
{
|
||||
AccessibilityHandler::setNativeChildForComponent (*this, nullptr);
|
||||
}
|
||||
|
||||
void AndroidViewComponent::setView (void* view)
|
||||
{
|
||||
|
|
@ -156,6 +159,12 @@ void AndroidViewComponent::setView (void* view)
|
|||
auto localref = LocalRef<jobject>(env->NewLocalRef((jobject) view));
|
||||
|
||||
pimpl.reset (new Pimpl (localref, *this));
|
||||
|
||||
AccessibilityHandler::setNativeChildForComponent (*this, getView());
|
||||
}
|
||||
else
|
||||
{
|
||||
AccessibilityHandler::setNativeChildForComponent (*this, nullptr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -173,4 +182,9 @@ void AndroidViewComponent::resizeToFitView()
|
|||
|
||||
void AndroidViewComponent::paint (Graphics&) {}
|
||||
|
||||
std::unique_ptr<AccessibilityHandler> AndroidViewComponent::createAccessibilityHandler()
|
||||
{
|
||||
return std::make_unique<AccessibilityHandler> (*this, AccessibilityRole::group);
|
||||
}
|
||||
|
||||
} // namespace juce
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue