Skip to content

ADFA-3375: Support TextInputLayout and TextInputEditText in preview#1312

Merged
dara-abijo-adfa merged 11 commits into
stagefrom
ADFA-3375-support-text-input-layout-in-preview
May 18, 2026
Merged

ADFA-3375: Support TextInputLayout and TextInputEditText in preview#1312
dara-abijo-adfa merged 11 commits into
stagefrom
ADFA-3375-support-text-input-layout-in-preview

Conversation

@dara-abijo-adfa
Copy link
Copy Markdown
Contributor

@dara-abijo-adfa dara-abijo-adfa commented May 15, 2026

Jira ticket

Add support for Material TextInputLayout and TextInputEditText so they are previewed correctly in the layout editor

@dara-abijo-adfa dara-abijo-adfa changed the title ADFA-3375: Support TextInputLaout and textInputEditText in preview ADFA-3375: Support TextInputLayout and TextInputEditText in preview May 15, 2026
@dara-abijo-adfa dara-abijo-adfa self-assigned this May 15, 2026
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 15, 2026

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 4147f270-0e4a-40e1-9bf5-a6034762e38b

📥 Commits

Reviewing files that changed from the base of the PR and between 12af60c and e4c755e.

📒 Files selected for processing (2)
  • layouteditor/src/main/java/org/appdevforall/codeonthego/layouteditor/editor/callers/text/TextInputLayoutCaller.kt
  • layouteditor/src/main/java/org/appdevforall/codeonthego/layouteditor/tools/XmlLayoutGenerator.java
🚧 Files skipped from review as they are similar to previous changes (2)
  • layouteditor/src/main/java/org/appdevforall/codeonthego/layouteditor/editor/callers/text/TextInputLayoutCaller.kt
  • layouteditor/src/main/java/org/appdevforall/codeonthego/layouteditor/tools/XmlLayoutGenerator.java

📝 Walkthrough
  • Features

    • Added preview support for Material Components text fields:
      • TextInputLayout: supports android:hint, app:hintEnabled, app:errorEnabled, app:counterEnabled
      • TextInputEditText: supports android:hint, android:inputType, android:textColorHint, android:singleLine
    • Palette and widget mappings:
      • New palette entries for TextInputLayout and TextInputEditText with sensible defaults and icons
      • widgetclasses.json mappings added for TextInputLayoutDesign and TextInputEditTextDesign
    • Design-time components:
      • New TextInputLayoutDesign and TextInputEditTextDesign classes providing dashed-stroke overlay for blueprint/design rendering
      • New TextInputEditTextCaller (Kotlin) and TextInputLayoutCaller (Kotlin) to apply attributes at preview time, including string resource resolution for hint
    • Layout editor improvements:
      • Drag/drop now selects layoutParams based on parent type (LinearLayout, FrameLayout, generic ViewGroup) in DesignEditor
      • XmlLayoutGenerator refactored to use a shared StringBuilder and void-style peek(...) helper
      • XmlLayoutParser adjusted parsing behavior and conditional layoutParams assignment
      • StructureView updated to special-case TextInputLayout and TextInputEditText in the view tree and overlay rendering
  • Risk / Best-practice notes

    • Reflection / API compatibility: The Java file TextInputLayoutCaller.java was removed. Verify no external code, plugins, or reflection-based callers rely on that exact class name or Java-based API surface.
    • Class-cast risk: Caller methods cast target View to TextInputLayout (or TextInputEditText) without an instanceof/type check; if invoked with an unexpected view type this will throw ClassCastException at runtime in the editor.
    • Resource resolution behavior: TextInputLayoutCaller.setHint() resolves @string/ resources by querying ProjectManager.instance.openedProject and returns early if no project is open (safe behavior). Ensure callers expect returned early/no-op behavior when no project is loaded.
    • XmlLayoutGenerator refactor: The change from return-based peek(...) to mutating shared StringBuilder increases regression risk for XML formatting edge cases (indentation, self-closing logic). Add unit/integration tests for include/fragment/merge and empty-child cases.
    • XmlLayoutParser layoutParams change: Conditional assignment of WRAP_CONTENT layoutParams depending on parser state (listViews) may alter inferred sizing for some imported or generated layouts—test a variety of nested/container layouts to ensure no unintended sizing changes.
    • StructureView special-casing: Adding bespoke traversal/rendering for TextInputLayout increases code complexity and may miss other compound view types with similar internal child wiring; review other compound/custom views to ensure consistency.
    • Testing recommendation: Run layout editor/preview smoke tests (drag/drop, resource-backed hints, blueprint/design toggles, XML export/import) and validate that the new design classes render correctly across blueprint vs design modes and that generated XML remains valid for include/fragment/merge cases.
  • Files of note

    • Added/modified assets:
      • layouteditor/src/main/assets/attributes/attributes.json (attribute mappings for Material text components)
      • layouteditor/src/main/assets/palette/text.json (palette entries)
      • layouteditor/src/main/assets/widgetclasses.json (widget→design mappings)
    • Added/modified source:
      • layouteditor/src/main/java/.../callers/text/TextInputLayoutCaller.kt (attribute setters + string resolution)
      • layouteditor/src/main/java/.../callers/text/TextInputEditTextCaller.kt
      • layouteditor/src/main/java/.../palette/text/TextInputLayoutDesign.kt
      • layouteditor/src/main/java/.../palette/text/TextInputEditTextDesign.kt
      • layouteditor/src/main/java/.../editor/DesignEditor.kt (parent-aware layoutParams selection)
      • layouteditor/src/main/java/.../tools/XmlLayoutGenerator.java (refactor)
      • layouteditor/src/main/java/.../tools/XmlLayoutParser.kt (conditional layoutParams assignment)
      • layouteditor/src/main/java/.../views/StructureView.kt (special handling & icons for Material text components)

Walkthrough

Adds Material Components TextInputLayout and TextInputEditText support: attribute mappings and palette entries, design widget classes with dashed-stroke rendering, callers for attribute application (including string resolution), parent-aware layout param selection, XML generation tweaks, and StructureView integration.

Material Text Field Support

Layer / File(s) Summary
Configuration and data setup
layouteditor/src/main/assets/attributes/attributes.json, layouteditor/src/main/assets/palette/text.json, layouteditor/src/main/assets/widgetclasses.json
Attribute mappings, palette entries, and widget-to-design class bindings for TextInputLayout and TextInputEditText.
Design widget classes
layouteditor/src/main/java/.../editor/palette/text/TextInputEditTextDesign.kt, layouteditor/src/main/java/.../editor/palette/text/TextInputLayoutDesign.kt
Design subclasses that draw dashed-stroke overlays and expose stroke/blueprint setters.
Attribute setter callers
layouteditor/src/main/java/.../editor/callers/text/TextInputEditTextCaller.kt, layouteditor/src/main/java/.../editor/callers/text/TextInputLayoutCaller.kt
Callers to apply attributes; TextInputLayoutCaller resolves @string/... values and converts boolean flags.
Parent-aware layout parameter selection
layouteditor/src/main/java/.../editor/DesignEditor.kt, layouteditor/src/main/java/.../tools/XmlLayoutParser.kt
Select layoutParams based on parent type (LinearLayout, FrameLayout, fallback) and avoid unconditional wrap_content assignments.
XML generation and structure view rendering
layouteditor/src/main/java/.../tools/XmlLayoutGenerator.java, layouteditor/src/main/java/.../views/StructureView.kt
XmlLayoutGenerator uses a void-style peek and conditional closing tags; StructureView special-cases TextInputLayout recursion and overlay drawing, plus icon map entries.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

Suggested reviewers

  • Daniel-ADFA
  • jomen-adfa
  • itsaky-adfa

Poem

🐰 I nibble strings and set the hint so bright,
Dashed strokes dance in blueprint light,
Parents now know where children should lie,
XML sings and structure draws nigh,
Material fields hop into sight.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 9.09% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and specifically describes the main change: adding support for Material TextInputLayout and TextInputEditText components in the layout editor preview.
Description check ✅ Passed The description is directly related to the changeset, explaining the purpose of adding support for Material TextInputLayout and TextInputEditText components for correct preview functionality.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch ADFA-3375-support-text-input-layout-in-preview

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
layouteditor/src/main/java/org/appdevforall/codeonthego/layouteditor/views/StructureView.kt (1)

148-163: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

TextInput type icon/name mapping is currently bypassed.

On Line 156, using view.javaClass.superclass.simpleName prevents the new imgMap entries for TextInputLayout and TextInputEditText from being hit, so these nodes render as fallback/incorrect types in the structure list.

Proposed fix
-		} else {
-			val viewSimpleName = view.javaClass.superclass.simpleName
+		} else {
+			val viewSimpleName =
+				when (view) {
+					is TextInputLayout, is TextInputEditText -> view.javaClass.simpleName
+					else -> view.javaClass.superclass.simpleName
+				}
 			var imageResource = imgMap[viewSimpleName]
 			if (imageResource == null) {
 				imageResource = imgMap["_unknown"]
 			}
 			icon.setImageResource(imageResource!!)
 			viewName.text = viewSimpleName
 		}

Also applies to: 404-405

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@layouteditor/src/main/java/org/appdevforall/codeonthego/layouteditor/views/StructureView.kt`
around lines 148 - 163, The view type detection incorrectly uses
view.javaClass.superclass.simpleName (in the else branch where viewSimpleName is
set), which bypasses mappings for TextInputLayout/TextInputEditText; change the
logic to use view.javaClass.simpleName to look up imgMap (falling back to
imgMap["_unknown"] as before) and update any related display text
(viewName.text) to use that actual simpleName so TextInput* entries resolve
correctly; ensure this change touches the variables viewSimpleName and
imageResource lookup in StructureView (keeping the existing LinearLayout
special-case intact).
♻️ Duplicate comments (1)
layouteditor/src/main/java/org/appdevforall/codeonthego/layouteditor/editor/palette/text/TextInputLayoutDesign.kt (1)

14-37: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Potential double-drawing of stroke in blueprint mode.

This class has the same draw/dispatchDraw override pattern as TextInputEditTextDesign, which can result in double-drawing the dashed stroke when both isBlueprint and drawStrokeEnabled are true. See the comment on TextInputEditTextDesign.kt for details and proposed fix.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@layouteditor/src/main/java/org/appdevforall/codeonthego/layouteditor/editor/palette/text/TextInputLayoutDesign.kt`
around lines 14 - 37, The stroke is being drawn in both dispatchDraw and draw
when isBlueprint and drawStrokeEnabled are true; centralize drawing to avoid
double-draw by removing the stroke call from draw and making dispatchDraw
responsible for all stroke drawing. Change draw(Canvas) to always call
super.draw(canvas) (remove the Utils.drawDashPathStroke call there), and update
dispatchDraw(Canvas) to draw the dashed stroke when (drawStrokeEnabled ||
isBlueprint) using Utils.drawDashPathStroke(this, canvas, if (isBlueprint)
Constants.BLUEPRINT_DASH_COLOR else Constants.DESIGN_DASH_COLOR). Keep
setStrokeEnabled, drawStrokeEnabled and isBlueprint logic unchanged.
🧹 Nitpick comments (3)
layouteditor/src/main/java/org/appdevforall/codeonthego/layouteditor/editor/callers/text/TextInputLayoutCaller.kt (1)

24-37: 💤 Low value

Prefer Kotlin's toBoolean() over Java's parseBoolean().

Lines 26, 31, and 36 use java.lang.Boolean.parseBoolean(value). In Kotlin, the idiomatic approach is to use the String.toBoolean() extension function.

♻️ Proposed Kotlin idiom
 `@JvmStatic`
 fun setHintEnabled(target: View, value: String, context: Context) {
-    (target as TextInputLayout).isHintEnabled = java.lang.Boolean.parseBoolean(value)
+    (target as TextInputLayout).isHintEnabled = value.toBoolean()
 }

 `@JvmStatic`
 fun setErrorEnabled(target: View, value: String, context: Context) {
-    (target as TextInputLayout).isErrorEnabled = java.lang.Boolean.parseBoolean(value)
+    (target as TextInputLayout).isErrorEnabled = value.toBoolean()
 }

 `@JvmStatic`
 fun setCounterEnabled(target: View, value: String, context: Context) {
-    (target as TextInputLayout).isCounterEnabled = java.lang.Boolean.parseBoolean(value)
+    (target as TextInputLayout).isCounterEnabled = value.toBoolean()
 }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@layouteditor/src/main/java/org/appdevforall/codeonthego/layouteditor/editor/callers/text/TextInputLayoutCaller.kt`
around lines 24 - 37, Replace the Java boolean parsing with Kotlin idiom in the
TextInputLayout caller methods: in setHintEnabled, setErrorEnabled, and
setCounterEnabled, stop using java.lang.Boolean.parseBoolean(value) and use the
Kotlin String.toBoolean() extension (i.e., convert value.toBoolean()) when
assigning to TextInputLayout.isHintEnabled, isErrorEnabled, and isCounterEnabled
so the code is idiomatic and null-safe for Kotlin strings.
layouteditor/src/main/assets/attributes/attributes.json (1)

642-707: 💤 Low value

Consider removing duplicate attribute definitions.

The TextInputEditText attribute mappings (lines 642-707) are identical to EditText (lines 382-447). Since TextInputEditText extends EditText and TextInputEditTextCaller extends EditTextCaller, the attribute system might already support inheritance. If so, you could omit this section and rely on inherited mappings, reducing duplication.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@layouteditor/src/main/assets/attributes/attributes.json` around lines 642 -
707, The JSON block for
"com.google.android.material.textfield.TextInputEditText" duplicates the same
attribute mappings already defined for EditText (e.g., android:hint,
android:inputType, android:textColorHint, android:singleLine) and uses
text.TextInputEditTextCaller which extends EditTextCaller; remove this redundant
block to avoid duplication, or replace it with a single inheritance/delegation
entry so the system uses the EditText mappings (refer to
text.TextInputEditTextCaller and EditTextCaller and the duplicated attributes
like "android:hint" and "android:inputType") to ensure mappings are inherited
rather than redefined.
layouteditor/src/main/assets/palette/text.json (1)

142-150: ⚡ Quick win

Icon name may not match the widget type.

Line 145 uses "ic_palette_linear_layout_vert" for TextInputLayout. This icon name suggests it's a vertical LinearLayout icon, which doesn't visually represent a text input field. Consider using a more appropriate icon like "ic_palette_edit_text" (as done for TextInputEditText) or creating a dedicated icon for Material text fields.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@layouteditor/src/main/assets/palette/text.json` around lines 142 - 150, The
palette entry for the TextInputLayout widget uses an incorrect iconName
("ic_palette_linear_layout_vert") which doesn't represent a text field; update
the "iconName" for the entry with name "TextInputLayout" and className
"org.appdevforall.codeonthego.layouteditor.editor.palette.text.TextInputLayoutDesign"
to a more appropriate icon such as "ic_palette_edit_text" or provide a dedicated
Material text field icon, ensuring the new icon asset exists in the project's
resources and references the same filename in this JSON entry.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@layouteditor/src/main/java/org/appdevforall/codeonthego/layouteditor/editor/callers/text/TextInputLayoutCaller.kt`:
- Around line 12-22: The setHint function uses a force-unwrapped project
(project!!.stringsPath) which can throw NPE; modify setHint in
TextInputLayoutCaller to null-check ProjectManager.instance.openedProject (the
local variable project) before using stringsPath and handle the null case
gracefully—either skip resource lookup and keep finalValue as-is or return
early; ensure you reference ProjectManager.instance.openedProject and
ValuesManager.getValueFromResources(ValuesResourceParser.TAG_STRING, finalValue,
project.stringsPath) only after confirming project != null and log or comment
the fallback behavior.

In
`@layouteditor/src/main/java/org/appdevforall/codeonthego/layouteditor/editor/palette/text/TextInputEditTextDesign.kt`:
- Around line 14-37: The stroke is being drawn twice when isBlueprint is true
because both draw() and dispatchDraw() call Utils.drawDashPathStroke; to fix it,
update dispatchDraw so it only draws the stroke when drawStrokeEnabled is true
AND isBlueprint is false (i.e., change the condition in dispatchDraw to if
(drawStrokeEnabled && !isBlueprint) before calling Utils.drawDashPathStroke),
leaving draw() behavior for blueprint mode unchanged; reference methods/fields:
dispatchDraw, draw, drawStrokeEnabled, isBlueprint, and
Utils.drawDashPathStroke.

---

Outside diff comments:
In
`@layouteditor/src/main/java/org/appdevforall/codeonthego/layouteditor/views/StructureView.kt`:
- Around line 148-163: The view type detection incorrectly uses
view.javaClass.superclass.simpleName (in the else branch where viewSimpleName is
set), which bypasses mappings for TextInputLayout/TextInputEditText; change the
logic to use view.javaClass.simpleName to look up imgMap (falling back to
imgMap["_unknown"] as before) and update any related display text
(viewName.text) to use that actual simpleName so TextInput* entries resolve
correctly; ensure this change touches the variables viewSimpleName and
imageResource lookup in StructureView (keeping the existing LinearLayout
special-case intact).

---

Duplicate comments:
In
`@layouteditor/src/main/java/org/appdevforall/codeonthego/layouteditor/editor/palette/text/TextInputLayoutDesign.kt`:
- Around line 14-37: The stroke is being drawn in both dispatchDraw and draw
when isBlueprint and drawStrokeEnabled are true; centralize drawing to avoid
double-draw by removing the stroke call from draw and making dispatchDraw
responsible for all stroke drawing. Change draw(Canvas) to always call
super.draw(canvas) (remove the Utils.drawDashPathStroke call there), and update
dispatchDraw(Canvas) to draw the dashed stroke when (drawStrokeEnabled ||
isBlueprint) using Utils.drawDashPathStroke(this, canvas, if (isBlueprint)
Constants.BLUEPRINT_DASH_COLOR else Constants.DESIGN_DASH_COLOR). Keep
setStrokeEnabled, drawStrokeEnabled and isBlueprint logic unchanged.

---

Nitpick comments:
In `@layouteditor/src/main/assets/attributes/attributes.json`:
- Around line 642-707: The JSON block for
"com.google.android.material.textfield.TextInputEditText" duplicates the same
attribute mappings already defined for EditText (e.g., android:hint,
android:inputType, android:textColorHint, android:singleLine) and uses
text.TextInputEditTextCaller which extends EditTextCaller; remove this redundant
block to avoid duplication, or replace it with a single inheritance/delegation
entry so the system uses the EditText mappings (refer to
text.TextInputEditTextCaller and EditTextCaller and the duplicated attributes
like "android:hint" and "android:inputType") to ensure mappings are inherited
rather than redefined.

In `@layouteditor/src/main/assets/palette/text.json`:
- Around line 142-150: The palette entry for the TextInputLayout widget uses an
incorrect iconName ("ic_palette_linear_layout_vert") which doesn't represent a
text field; update the "iconName" for the entry with name "TextInputLayout" and
className
"org.appdevforall.codeonthego.layouteditor.editor.palette.text.TextInputLayoutDesign"
to a more appropriate icon such as "ic_palette_edit_text" or provide a dedicated
Material text field icon, ensuring the new icon asset exists in the project's
resources and references the same filename in this JSON entry.

In
`@layouteditor/src/main/java/org/appdevforall/codeonthego/layouteditor/editor/callers/text/TextInputLayoutCaller.kt`:
- Around line 24-37: Replace the Java boolean parsing with Kotlin idiom in the
TextInputLayout caller methods: in setHintEnabled, setErrorEnabled, and
setCounterEnabled, stop using java.lang.Boolean.parseBoolean(value) and use the
Kotlin String.toBoolean() extension (i.e., convert value.toBoolean()) when
assigning to TextInputLayout.isHintEnabled, isErrorEnabled, and isCounterEnabled
so the code is idiomatic and null-safe for Kotlin strings.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 77d6fa7e-a577-46dc-bbce-b0373bfdca12

📥 Commits

Reviewing files that changed from the base of the PR and between d256473 and 12af60c.

📒 Files selected for processing (12)
  • layouteditor/src/main/assets/attributes/attributes.json
  • layouteditor/src/main/assets/palette/text.json
  • layouteditor/src/main/assets/widgetclasses.json
  • layouteditor/src/main/java/org/appdevforall/codeonthego/layouteditor/editor/DesignEditor.kt
  • layouteditor/src/main/java/org/appdevforall/codeonthego/layouteditor/editor/callers/TextInputLayoutCaller.java
  • layouteditor/src/main/java/org/appdevforall/codeonthego/layouteditor/editor/callers/text/TextInputEditTextCaller.kt
  • layouteditor/src/main/java/org/appdevforall/codeonthego/layouteditor/editor/callers/text/TextInputLayoutCaller.kt
  • layouteditor/src/main/java/org/appdevforall/codeonthego/layouteditor/editor/palette/text/TextInputEditTextDesign.kt
  • layouteditor/src/main/java/org/appdevforall/codeonthego/layouteditor/editor/palette/text/TextInputLayoutDesign.kt
  • layouteditor/src/main/java/org/appdevforall/codeonthego/layouteditor/tools/XmlLayoutGenerator.java
  • layouteditor/src/main/java/org/appdevforall/codeonthego/layouteditor/tools/XmlLayoutParser.kt
  • layouteditor/src/main/java/org/appdevforall/codeonthego/layouteditor/views/StructureView.kt
💤 Files with no reviewable changes (1)
  • layouteditor/src/main/java/org/appdevforall/codeonthego/layouteditor/editor/callers/TextInputLayoutCaller.java

@dara-abijo-adfa dara-abijo-adfa merged commit 2c9224e into stage May 18, 2026
2 checks passed
@dara-abijo-adfa dara-abijo-adfa deleted the ADFA-3375-support-text-input-layout-in-preview branch May 18, 2026 14:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants