Skip to content

fix: enable nullable reference types across FreakyControls - #194

Merged
FreakyAli merged 12 commits into
masterfrom
fix/nullables
Aug 12, 2026
Merged

fix: enable nullable reference types across FreakyControls#194
FreakyAli merged 12 commits into
masterfrom
fix/nullables

Conversation

@FreakyAli

@FreakyAli FreakyAli commented Aug 11, 2026

Copy link
Copy Markdown
Owner

Summary by CodeRabbit

  • Bug Fixes

    • Improved stability when controls, events, images, streams, or platform resources are unavailable.
    • Prevented potential crashes during rendering, touch handling, image loading, autocomplete, and signature interactions.
    • Improved handling of empty or missing autocomplete and signature input.
    • Improved touch and drawable handling across Android controls.
    • Improved image conversion and signature output when required resources are unavailable.
  • Documentation

    • Clarified signature image-stream usage and documented autocomplete limitations on Windows.
    • Updated the project description to reflect improved trim safety.
  • Chores

    • Added configuration exclusions for AI development tools and enabled nullable reference checks.
    • Improved sample support for Android functionality.

@coderabbitai

coderabbitai Bot commented Aug 11, 2026

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

The project enables nullable reference types, trim analysis, and trimmability. Shared controls, platform handlers, signature views, samples, tests, and documentation now handle nullable values and unavailable resources.

Changes

Nullable safety migration

Layer / File(s) Summary
Shared controls and APIs
MAUI.FreakyControls/MAUI.FreakyControls/Behaviors/*, Converters/*, EventArgs/*, FreakyAutoCompleteView/*, FreakyButton/*, FreakyCheckbox/*, FreakyChip/*, FreakyCodeView/*, FreakyImage/*, FreakyJumpList/*, FreakyRadioButton/*, FreakyScratchView/*
Public APIs, event arguments, converters, handlers, rendering paths, and control state now represent nullable values and guard missing objects.
Rendering and platform flows
MAUI.FreakyControls/MAUI.FreakyControls/FreakySignatureView/*, FreakySvgImageView/*, Platforms/Android/*, Platforms/Apple/*, Platforms/Windows/*, Helpers/DownloadHelper.cs, Wrappers/StreamWrapper.cs
Image, stream, touch, drawing, autocomplete, and native-control flows now validate nullable resources, views, events, paths, and platform state.
Project, validation, samples, and documentation
Maui.FreakyControls.csproj, Maui.FreakyControls.Tests/*, Samples/*, docs/*, future-plans.md, readme.md, .gitignore
Nullable and trimming analysis are enabled. Tests, samples, documentation, roadmap text, project metadata, and ignore rules reflect the updated state. AndroidX references are added to the samples project.

Estimated code review effort: 3 (Moderate) | ~30 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 13.85% 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
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely describes the primary change: enabling nullable reference types throughout FreakyControls.
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.
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/nullables

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.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 11

Caution

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

⚠️ Outside diff range comments (3)
MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Apple/NativeControls/Signature/InkPresenter.cs (1)

38-81: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Do not retain a stroke when no touch is available.

Line 40 creates currentPath before Line 43 rejects a missing touch. Line 81 also returns without clearing an existing stroke. A later movement can then append to an uninitialized path or retain stale stroke state.

Proposed fix
 public override void TouchesBegan(NSSet touches, UIEvent? evt)
 {
-    currentPath = new InkStroke(UIBezierPath.Create(), new List<CGPoint>(), StrokeColor, StrokeWidth);
-
     var touch = touches.AnyObject as UITouch;
-    if (touch is null) return;
+    if (touch is null)
+        return;
+
+    currentPath = new InkStroke(UIBezierPath.Create(), new List<CGPoint>(), StrokeColor, StrokeWidth);
     var touchLocation = touch.LocationInView(this);
 public override void TouchesEnded(NSSet touches, UIEvent? evt)
 {
     var touch = touches.AnyObject as UITouch;
-    if (touch is null) return;
+    if (touch is null)
+    {
+        currentPath = null;
+        return;
+    }
🤖 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
`@MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Apple/NativeControls/Signature/InkPresenter.cs`
around lines 38 - 81, Update TouchesBegan and TouchesEnded so a missing UITouch
does not create or retain currentPath: validate touches.AnyObject before
initializing the stroke in TouchesBegan, and clear any existing stroke state
before returning from TouchesEnded when no touch is available. Ensure subsequent
TouchesMoved calls cannot append to an uninitialized or stale stroke.
MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Android/NativeControls/FreakyEditText.cs (1)

27-46: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Clear cached drawables when the native drawable is cleared.

When a caller changes alignment, it passes null for the previous side. This method keeps the previous drawable in drawableLeft, drawableRight, drawableTop, or drawableBottom. OnTouchEvent can then invoke clickListener for an image that is no longer displayed.

Proposed fix
     public override void SetCompoundDrawablesWithIntrinsicBounds(Drawable? left, Drawable? top,
             Drawable? right, Drawable? bottom)
     {
-        if (left is not null)
-        {
-            drawableLeft = left;
-        }
-        if (right is not null)
-        {
-            drawableRight = right;
-        }
-        if (top is not null)
-        {
-            drawableTop = top;
-        }
-        if (bottom is not null)
-        {
-            drawableBottom = bottom;
-        }
+        drawableLeft = left;
+        drawableTop = top;
+        drawableRight = right;
+        drawableBottom = bottom;
         base.SetCompoundDrawablesWithIntrinsicBounds(left, top, right, bottom);
     }
🤖 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
`@MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Android/NativeControls/FreakyEditText.cs`
around lines 27 - 46, Update SetCompoundDrawablesWithIntrinsicBounds so each
cached drawable field is assigned the incoming value, including null, rather
than only updating non-null values. Preserve the base method call and ensure
drawableLeft, drawableRight, drawableTop, and drawableBottom accurately reflect
which native drawables are currently displayed for OnTouchEvent.
MAUI.FreakyControls/MAUI.FreakyControls/FreakyScratchView/FreakyScratchViewDrawable.cs (1)

257-268: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Dispose decoded bitmaps that are not adopted.

When cancellation is requested or _maskBitmap or _maskCanvas is unavailable, dispose bitmap before returning. ResetMask, ResetFrontBitmap, and Reset can invalidate these resources while LoadFrontImageAsync awaits.

🤖 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
`@MAUI.FreakyControls/MAUI.FreakyControls/FreakyScratchView/FreakyScratchViewDrawable.cs`
around lines 257 - 268, Update LoadFrontImageAsync to dispose the decoded bitmap
whenever cancellation is detected or _maskBitmap or _maskCanvas is unavailable,
since it is not adopted in those paths. Preserve ownership by retaining the
bitmap only when assigning it to _frontBitmap, including cleanup for resources
invalidated while the await is in progress.
🤖 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 `@docs/FreakySignatureCanvasView.md`:
- Line 63: Update the Events table in FreakySignatureCanvasView documentation to
remove ImageStreamRequested from the consumer-facing event list, or explicitly
label it as internal if it must remain. Keep the surrounding public API event
documentation unchanged and consistent with the statement that
ImageStreamRequested is internal handler plumbing.

In
`@MAUI.FreakyControls/Maui.FreakyControls.Tests/Converters/ContentToInvisibilityConverterTests.cs`:
- Line 14: Update the converter test assertions to require exact Boolean
results: in
MAUI.FreakyControls/Maui.FreakyControls.Tests/Converters/ContentToInvisibilityConverterTests.cs:14,
LeftImageAlignmentToVisibilityConverterTests.cs:23 and :33, and
RightImageAlignmentToVisibilityConverterTests.cs:23 and :33, assert the result
is false; in InverseBoolConverterTests.cs:16, assert the result is a Boolean
equal to expected.

In
`@MAUI.FreakyControls/MAUI.FreakyControls/FreakyAutoCompleteView/FreakyAutoCompleteViewHandler.cs`:
- Around line 55-58: Update the FreakyAutoCompleteViewHandler constructor
parameters to mark both mapper and commandMapper as nullable, matching their
null-coalescing fallbacks in the base constructor call. Correct the mapper
parameter documentation to state that null selects PropertyMapper.

In
`@MAUI.FreakyControls/MAUI.FreakyControls/FreakyCodeView/FreakyCodeView.xaml.cs`:
- Around line 170-171: The nullable bindable-value handling is inconsistent with
the public property contracts. In
MAUI.FreakyControls/MAUI.FreakyControls/FreakyCodeView/FreakyCodeView.xaml.cs
lines 170-171, normalize CodeValue to string.Empty before exposing or storing
it, or propagate string? through the property and all consumers. In
MAUI.FreakyControls/MAUI.FreakyControls/FreakyJumpList/FreakyJumpList.cs lines
182-184, declare AlphabetProvider as IAlphabetProvider? and validate a local
provider before using it.

In `@MAUI.FreakyControls/MAUI.FreakyControls/FreakyJumpList/FreakyJumpList.cs`:
- Line 10: Update OnTouch() to return immediately when charLocationDictionary is
empty, before calling GetClosestPoint() or updating SelectedCharacter. Preserve
the existing touch-selection behavior once the character map contains entries.

In
`@MAUI.FreakyControls/MAUI.FreakyControls/FreakySvgImageView/FreakySvgImageView.cs`:
- Around line 18-24: Update the Canvas-clearing logic in FreakySvgImageView to
store surface.Canvas in a local variable, return immediately when that local is
null, and call Clear() only on the validated non-null canvas.

In
`@MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Android/NativeControls/CircularImageView.cs`:
- Around line 38-40: Update the drawable handling in the circular image view to
verify that drawable is a BitmapDrawable before casting or accessing Bitmap,
returning immediately for other drawable types while preserving the existing
null-bitmap guard.

In
`@MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Android/NativeControls/FreakyMauiDatePicker.cs`:
- Around line 34-35: Update SetCompoundDrawablesWithIntrinsicBounds in
MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Android/NativeControls/FreakyMauiDatePicker.cs:34-35,
FreakyMauiPicker.cs:24-25, FreakyMauiTimePicker.cs:33-34, and
FreakyNativeAutoCompleteView.cs:139-140 so every cached drawable field is
assigned from its corresponding parameter, including null, while preserving the
base-control call.

In
`@MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Android/NativeControls/FreakyMauiPicker.cs`:
- Around line 68-73: Update the extraTapArea calculation in FreakyMauiPicker’s
drawableLeft handling so density conversion rounds the full 13dp value, matching
FreakyMauiDatePicker and FreakyMauiTimePicker, rather than adding 0.5 before
multiplying by 13.

In
`@MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Apple/FreakyAutoCompleteViewHandler.cs`:
- Around line 151-156: Update MapTextAlignment and MapFont to verify
handler.PlatformView is available before passing it to UpdateTextAlignment or
UpdateFont; return without updating when it is unavailable, while preserving the
existing update behavior when the platform view exists.

In
`@MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Apple/NativeControls/FreakyNativeAutoCompleteView.cs`:
- Line 211: Update the code around the view-controller setup and SelectionList
attachment to return immediately when viewController.View is unavailable, before
activating any constraints. Only continue adding the subview and configuring
constraints when the controller view exists, ensuring SelectionList and
InputTextField share a common ancestor.

---

Outside diff comments:
In
`@MAUI.FreakyControls/MAUI.FreakyControls/FreakyScratchView/FreakyScratchViewDrawable.cs`:
- Around line 257-268: Update LoadFrontImageAsync to dispose the decoded bitmap
whenever cancellation is detected or _maskBitmap or _maskCanvas is unavailable,
since it is not adopted in those paths. Preserve ownership by retaining the
bitmap only when assigning it to _frontBitmap, including cleanup for resources
invalidated while the await is in progress.

In
`@MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Android/NativeControls/FreakyEditText.cs`:
- Around line 27-46: Update SetCompoundDrawablesWithIntrinsicBounds so each
cached drawable field is assigned the incoming value, including null, rather
than only updating non-null values. Preserve the base method call and ensure
drawableLeft, drawableRight, drawableTop, and drawableBottom accurately reflect
which native drawables are currently displayed for OnTouchEvent.

In
`@MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Apple/NativeControls/Signature/InkPresenter.cs`:
- Around line 38-81: Update TouchesBegan and TouchesEnded so a missing UITouch
does not create or retain currentPath: validate touches.AnyObject before
initializing the stroke in TouchesBegan, and clear any existing stroke state
before returning from TouchesEnded when no touch is available. Ensure subsequent
TouchesMoved calls cannot append to an uninitialized or stale stroke.
🪄 Autofix

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: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 5746d07f-a7d6-4214-b3fe-bdaf06e2a7e9

📥 Commits

Reviewing files that changed from the base of the PR and between de74dca and b3f9533.

📒 Files selected for processing (83)
  • .gitignore
  • MAUI.FreakyControls/MAUI.FreakyControls/Behaviors/BehaviorBase.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Converters/BaseOneWayValueConverter.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Converters/ContentToInvisibilityConverter.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Converters/InverseBoolConverter.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Converters/LeftImageAlignmentToVisibilityConverter.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Converters/RightImageAlignmentToVisibilityConverter.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/EventArgs/FreakyAutoCompleteViewQuerySubmittedEventArgs.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/EventArgs/FreakyAutoCompleteViewSuggestionChosenEventArgs.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/EventArgs/FreakyCharacterChangedEventArgs.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/EventArgs/FreakyCodeCompletedEventArgs.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/EventArgs/FreakyRadioButtonEventArgs.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/EventArgs/FreakySelectedPinEventArgs.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/EventArgs/ImageStreamRequestedEventArgs.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Extensions/Extensions.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/FreakyAutoCompleteView/FreakyAutoCompleteView.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/FreakyAutoCompleteView/FreakyAutoCompleteViewHandler.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/FreakyAutoCompleteView/IFreakyAutoCompleteView.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/FreakyButton/FreakyButton.xaml.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/FreakyCheckbox/FreakyCheckbox.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/FreakyChip/FreakyChip.xaml.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/FreakyChip/FreakyChipGroup.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/FreakyCodeView/CodeView.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/FreakyCodeView/FreakyCodeView.xaml.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/FreakyCodeView/FreakyPinCodeControl.xaml.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/FreakyImage/FreakyImage.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/FreakyJumpList/FreakyJumpList.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/FreakyRadioButton/FreakyRadioButton.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/FreakyRadioButton/FreakyRadioGroup.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/FreakyScratchView/FreakyScratchView.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/FreakyScratchView/FreakyScratchViewDrawable.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/FreakySignatureView/FreakySignatureCanvasView.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/FreakySignatureView/FreakySignatureCanvasViewHandler.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/FreakySignatureView/FreakySignaturePadView.xaml.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/FreakySvgImageView/FreakySvgImageView.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/FreakySwipeButton/FreakySwipeButton.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/FreakySwitch/FreakySwitch.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/FreakyTextInputLayout/FreakyTextInputLayout.xaml.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/FreakyZoomableImageView/FreakyZoomableView.xaml.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Helpers/DownloadHelper.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Maui.FreakyControls.csproj
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Android/FreakyAutoCompleteViewHandler.android.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Android/FreakyDatePickerHandler.android.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Android/FreakyEntryHandler.android.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Android/FreakyMauiAppCompatActivity.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Android/FreakyPickerHandler.android.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Android/FreakySignatureCanvasViewHandler.android.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Android/FreakyTimePickerHandler.android.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Android/NativeControls/CircularImageView.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Android/NativeControls/FreakyEditText.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Android/NativeControls/FreakyMauiDatePicker.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Android/NativeControls/FreakyMauiPicker.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Android/NativeControls/FreakyMauiTimePicker.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Android/NativeControls/FreakyNativeAutoCompleteView.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Android/NativeControls/Helpers/CustomInsertionActionModeCallback.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Android/NativeControls/Helpers/CustomSelectionActionModeCallback.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Android/NativeControls/Signature/InkPresenter.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Android/NativeControls/Signature/PathSmoothing.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Android/NativeControls/Signature/SignaturePadCanvasView.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Android/NativeExtensions.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Apple/FreakyAutoCompleteViewHandler.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Apple/FreakyEditorHandler.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Apple/FreakyEntryHandler.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Apple/FreakySignatureCanvasViewHandler.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Apple/NativeControls/FreakyNativeAutoCompleteView.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Apple/NativeControls/FreakyUITextView.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Apple/NativeControls/FreakyUITextfield.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Apple/NativeControls/Signature/InkPresenter.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Apple/NativeControls/Signature/InkStroke.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Apple/NativeControls/Signature/PathSmoothing.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Apple/NativeControls/Signature/SignaturePadCanvasView.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Windows/FreakyCircularImageHandler.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Windows/FreakySignatureViewHandler.win.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Wrappers/StreamWrapper.cs
  • MAUI.FreakyControls/Maui.FreakyControls.Tests/Converters/ContentToInvisibilityConverterTests.cs
  • MAUI.FreakyControls/Maui.FreakyControls.Tests/Converters/InverseBoolConverterTests.cs
  • MAUI.FreakyControls/Maui.FreakyControls.Tests/Converters/LeftImageAlignmentToVisibilityConverterTests.cs
  • MAUI.FreakyControls/Maui.FreakyControls.Tests/Converters/RightImageAlignmentToVisibilityConverterTests.cs
  • MAUI.FreakyControls/Samples/Samples.csproj
  • MAUI.FreakyControls/Samples/SignatureView/ImageDisplay.cs
  • MAUI.FreakyControls/Samples/SignatureView/SignatureViewModel.cs
  • docs/FreakySignatureCanvasView.md
  • future-plans.md

Comment thread docs/FreakySignatureCanvasView.md
@FreakyAli

Copy link
Copy Markdown
Owner Author

@coderabbitai full review

@coderabbitai

coderabbitai Bot commented Aug 11, 2026

Copy link
Copy Markdown
⚠️ Action not completed

Review rate limited.


Your included review limit is currently reached under our Fair Usage Limits Policy. This review may still proceed through usage-based billing if eligible. Your next included review will be available in 2 minutes.

@FreakyAli

Copy link
Copy Markdown
Owner Author

@coderabbitai full review

@coderabbitai

coderabbitai Bot commented Aug 11, 2026

Copy link
Copy Markdown
✅ Action performed

Full review finished.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 3

🤖 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
`@MAUI.FreakyControls/Maui.FreakyControls.Tests/Converters/RightImageAlignmentToVisibilityConverterTests.cs`:
- Line 23: Update the assertions in
RightImageAlignmentToVisibilityConverterTests at both affected test cases to
first enforce that the converter result is a bool, then assert that Boolean
value is false. Replace the result-is-true checks while preserving the existing
test scenarios.

In `@MAUI.FreakyControls/MAUI.FreakyControls/Extensions/Extensions.cs`:
- Around line 72-75: Update the provider lookup in the image-source extension to
use GetService<IImageSourceServiceProvider>() instead of GetRequiredService, so
an unregistered optional provider yields null and reaches the existing null
return. Leave the subsequent GetImageSourceService and null handling unchanged.

In
`@MAUI.FreakyControls/MAUI.FreakyControls/FreakyCodeView/FreakyCodeView.xaml.cs`:
- Line 184: Update the delayed code-item flow around UpdateCodeItems so
overlapping CodeValue changes are serialized or invalidated with a
version/cancellation token. Check the token after every delay and before each
CodeView update, ensuring stale animations cannot restore characters after a
newer value arrives.
🪄 Autofix

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: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 796a2132-7729-4f34-aace-76bee199cdf5

📥 Commits

Reviewing files that changed from the base of the PR and between de74dca and 49f1a0a.

📒 Files selected for processing (85)
  • .gitignore
  • MAUI.FreakyControls/MAUI.FreakyControls/Behaviors/BehaviorBase.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Converters/BaseOneWayValueConverter.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Converters/ContentToInvisibilityConverter.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Converters/InverseBoolConverter.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Converters/LeftImageAlignmentToVisibilityConverter.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Converters/RightImageAlignmentToVisibilityConverter.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/EventArgs/FreakyAutoCompleteViewQuerySubmittedEventArgs.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/EventArgs/FreakyAutoCompleteViewSuggestionChosenEventArgs.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/EventArgs/FreakyCharacterChangedEventArgs.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/EventArgs/FreakyCodeCompletedEventArgs.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/EventArgs/FreakyRadioButtonEventArgs.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/EventArgs/FreakySelectedPinEventArgs.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/EventArgs/ImageStreamRequestedEventArgs.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Extensions/Extensions.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/FreakyAutoCompleteView/FreakyAutoCompleteView.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/FreakyAutoCompleteView/FreakyAutoCompleteViewHandler.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/FreakyAutoCompleteView/IFreakyAutoCompleteView.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/FreakyButton/FreakyButton.xaml.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/FreakyCheckbox/FreakyCheckbox.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/FreakyChip/FreakyChip.xaml.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/FreakyChip/FreakyChipGroup.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/FreakyCodeView/CodeView.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/FreakyCodeView/FreakyCodeView.xaml.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/FreakyCodeView/FreakyPinCodeControl.xaml.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/FreakyImage/FreakyImage.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/FreakyJumpList/FreakyJumpList.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/FreakyRadioButton/FreakyRadioButton.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/FreakyRadioButton/FreakyRadioGroup.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/FreakyScratchView/FreakyScratchView.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/FreakyScratchView/FreakyScratchViewDrawable.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/FreakySignatureView/FreakySignatureCanvasView.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/FreakySignatureView/FreakySignatureCanvasViewHandler.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/FreakySignatureView/FreakySignaturePadView.xaml.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/FreakySvgImageView/FreakySvgImageView.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/FreakySwipeButton/FreakySwipeButton.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/FreakySwitch/FreakySwitch.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/FreakyTextInputLayout/FreakyTextInputLayout.xaml.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/FreakyZoomableImageView/FreakyZoomableView.xaml.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Helpers/DownloadHelper.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Maui.FreakyControls.csproj
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Android/FreakyAutoCompleteViewHandler.android.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Android/FreakyDatePickerHandler.android.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Android/FreakyEntryHandler.android.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Android/FreakyMauiAppCompatActivity.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Android/FreakyPickerHandler.android.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Android/FreakySignatureCanvasViewHandler.android.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Android/FreakyTimePickerHandler.android.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Android/NativeControls/CircularImageView.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Android/NativeControls/FreakyEditText.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Android/NativeControls/FreakyMauiDatePicker.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Android/NativeControls/FreakyMauiPicker.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Android/NativeControls/FreakyMauiTimePicker.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Android/NativeControls/FreakyNativeAutoCompleteView.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Android/NativeControls/Helpers/CustomInsertionActionModeCallback.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Android/NativeControls/Helpers/CustomSelectionActionModeCallback.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Android/NativeControls/Signature/InkPresenter.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Android/NativeControls/Signature/PathSmoothing.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Android/NativeControls/Signature/SignaturePadCanvasView.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Android/NativeExtensions.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Apple/FreakyAutoCompleteViewHandler.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Apple/FreakyEditorHandler.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Apple/FreakyEntryHandler.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Apple/FreakySignatureCanvasViewHandler.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Apple/NativeControls/FreakyNativeAutoCompleteView.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Apple/NativeControls/FreakyUITextView.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Apple/NativeControls/FreakyUITextfield.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Apple/NativeControls/Signature/InkPresenter.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Apple/NativeControls/Signature/InkStroke.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Apple/NativeControls/Signature/PathSmoothing.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Apple/NativeControls/Signature/SignaturePadCanvasView.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Windows/FreakyCircularImageHandler.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Platforms/Windows/FreakySignatureViewHandler.win.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/Wrappers/StreamWrapper.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/readme.md
  • MAUI.FreakyControls/Maui.FreakyControls.Tests/Converters/ContentToInvisibilityConverterTests.cs
  • MAUI.FreakyControls/Maui.FreakyControls.Tests/Converters/InverseBoolConverterTests.cs
  • MAUI.FreakyControls/Maui.FreakyControls.Tests/Converters/LeftImageAlignmentToVisibilityConverterTests.cs
  • MAUI.FreakyControls/Maui.FreakyControls.Tests/Converters/RightImageAlignmentToVisibilityConverterTests.cs
  • MAUI.FreakyControls/Samples/Samples.csproj
  • MAUI.FreakyControls/Samples/SignatureView/ImageDisplay.cs
  • MAUI.FreakyControls/Samples/SignatureView/SignatureViewModel.cs
  • docs/FreakyAutoCompleteView.md
  • docs/FreakySignatureCanvasView.md
  • future-plans.md

Comment thread MAUI.FreakyControls/MAUI.FreakyControls/Extensions/Extensions.cs Outdated
Comment thread MAUI.FreakyControls/MAUI.FreakyControls/FreakyCodeView/FreakyCodeView.xaml.cs Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 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
`@MAUI.FreakyControls/Maui.FreakyControls.Tests/Converters/RightImageAlignmentToVisibilityConverterTests.cs`:
- Around line 23-24: Update the assertions in
RightImageAlignmentToVisibilityConverterTests to use the boolean returned by
Assert.IsType<bool>(result) directly, replacing the separate type assertion and
cast with Assert.False(Assert.IsType<bool>(result)) to avoid the nullable cast
warning.
🪄 Autofix

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: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 682c9906-47e1-4d98-a6ee-176bf82b0240

📥 Commits

Reviewing files that changed from the base of the PR and between 49f1a0a and fa0a4c6.

📒 Files selected for processing (3)
  • MAUI.FreakyControls/MAUI.FreakyControls/Extensions/Extensions.cs
  • MAUI.FreakyControls/MAUI.FreakyControls/FreakyCodeView/FreakyCodeView.xaml.cs
  • MAUI.FreakyControls/Maui.FreakyControls.Tests/Converters/RightImageAlignmentToVisibilityConverterTests.cs
🚧 Files skipped from review as they are similar to previous changes (1)
  • MAUI.FreakyControls/MAUI.FreakyControls/Extensions/Extensions.cs

@FreakyAli
FreakyAli merged commit b5e0c0a into master Aug 12, 2026
4 checks passed
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