Skip to content

Android suitability: fix AnimalSniffer violations in ReflectionUtil, ObjectLayoutBuilder, UIText clipboard #84

Description

@soloturn

AI-assisted issue. Filed by agent driven by @soloturn via GDD.

Context

Wiring up the AnimalSniffer + gummy-bears-api-24 Android-suitability check (#83) surfaced 21 real violations across two modules — genuine gaps between NUI's API surface and what's available on Android, not signature-set false positives. Concrete motivation: DestinationSol's engine module depends directly on nui, nui-libgdx, nui-gestalt, and nui-reflect, and targets Android via libGDX.

Problem / Current State

  • nui-reflect: ReflectionUtil — 6 violations. resolvedMethodToString took a java.lang.reflect.Executable parameter and called getTypeParameters()/getName()/getDeclaringClass()/getGenericParameterTypes()/isVarArgs() on it directly. Executable itself isn't available before API 26, even though Method and Constructor each declare these same methods directly and have since long before API 24. typeToString also called Class.getTypeName() (API 26+).
  • nui: ObjectLayoutBuilder — 2 violations. Used Constructor.getParameters() (returns Parameter[]) and Parameter.getParameterizedType() to build the argument-type list. java.lang.reflect.Parameter itself isn't available before API 26.
  • nui: UIText clipboard — 13 violations. getClipboardContents()/setClipboardContents() use java.awt.Toolkit/Clipboard/DataFlavor/StringSelection/Transferable/UnsupportedFlavorException directly. Unlike the above two, this isn't fixable by calling a different method — AWT genuinely doesn't exist on Android at all.

Acceptance Criteria

  • ReflectionUtil violations fixed by calling through the concrete Method/Constructor type instead of the shared Executable supertype, and reimplementing Class.getTypeName()'s behavior — no public API change (build: check API surface for Android suitability #83)
  • ObjectLayoutBuilder violations fixed by using Constructor.getGenericParameterTypes() instead of going through Parameter — no public API change (build: check API surface for Android suitability #83)
  • UIText clipboard calls isolated into a private nested class (UIText.AwtClipboard) with LinkageError caught by the caller, so invoking copy/paste on a platform without java.awt degrades to a no-op with a logged warning instead of crashing (build: check API surface for Android suitability #83)
  • UIText actually has a working clipboard on platforms without AWT (e.g. Android via nui-libgdx, since libGDX's Gdx.app.getClipboard() is a cross-platform abstraction that works there), not just a graceful no-op — left open, see Technical Notes

Technical Notes

The last item is a real design decision, deliberately left out of #83 to keep that PR focused on the suitability check rather than a clipboard-abstraction redesign: likely a pluggable Clipboard strategy on UIText, defaulting to the current AWT-backed behavior on desktop, with nui-libgdx supplying a Gdx.app.getClipboard()-backed implementation for platforms (including Android) that have it.

Full violation reports (pre-fix, from #83's initial run): nui/build/reports/animalsniffer/main.text, nui-reflect/build/reports/animalsniffer/main.text.

Related

#83

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type: ImprovementRequest for or addition/enhancement of a feature

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions