1
0
Fork 0
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:
attila 2023-04-20 20:58:38 +02:00 committed by Attila Szarvas
parent d8c282e293
commit f519af3b62
5 changed files with 931 additions and 767 deletions

View file

@ -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;
//==============================================================================

View file

@ -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

View file

@ -67,6 +67,8 @@ public:
//==============================================================================
/** @internal */
void paint (Graphics&) override;
/** @internal */
std::unique_ptr<AccessibilityHandler> createAccessibilityHandler() override;
private:
class Pimpl;

View file

@ -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