From 89ee84244a50a129678917e82eb982e89f3616b0 Mon Sep 17 00:00:00 2001 From: bonk <91633686+LPlusBonk@users.noreply.github.com> Date: Tue, 13 Oct 2026 21:52:45 -0400 Subject: [PATCH 1/3] fix: addProvider threw on the provider register events The four "Register...VREvent" classes in visor-api/src/main/java/org/vmstudio/visor/api/client/events/provider/ kept the list passed into their constructors as just a List. XrInputHandler passes List.of(...), an immutable List, into those constructors, so calling providers.add(...) in the addProvider methods would throw UnsupportedOperationException and the event bus would log it but swallow it. The fix done here is to copy the list into an ArrayList in each constructor, but a deeper fix could be to change the private final List providers; to ArrayList, but that would technically change the API surface so I opted not to. --- .../api/client/events/provider/RegisterBodyHapticsVREvent.java | 3 ++- .../client/events/provider/RegisterBodyTrackersVREvent.java | 3 ++- .../client/events/provider/RegisterHandTrackersVREvent.java | 3 ++- .../api/client/events/provider/RegisterTreadmillsVREvent.java | 3 ++- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/visor-api/src/main/java/org/vmstudio/visor/api/client/events/provider/RegisterBodyHapticsVREvent.java b/visor-api/src/main/java/org/vmstudio/visor/api/client/events/provider/RegisterBodyHapticsVREvent.java index 73404419..248a5f1d 100644 --- a/visor-api/src/main/java/org/vmstudio/visor/api/client/events/provider/RegisterBodyHapticsVREvent.java +++ b/visor-api/src/main/java/org/vmstudio/visor/api/client/events/provider/RegisterBodyHapticsVREvent.java @@ -6,6 +6,7 @@ import org.vmstudio.visor.api.VisorAPI; import org.vmstudio.visor.api.common.eventbus.event.VREvent; +import java.util.ArrayList; import java.util.List; /** @@ -20,7 +21,7 @@ public class RegisterBodyHapticsVREvent extends VREvent { public RegisterBodyHapticsVREvent(@NotNull List providers){ super(VisorAPI.addonManager().getCoreAddon()); - this.providers = providers; + this.providers = new ArrayList<>(providers); } public void addProvider(@NotNull XRBodyHapticsProvider provider){ diff --git a/visor-api/src/main/java/org/vmstudio/visor/api/client/events/provider/RegisterBodyTrackersVREvent.java b/visor-api/src/main/java/org/vmstudio/visor/api/client/events/provider/RegisterBodyTrackersVREvent.java index e99cb1fb..2e32a5a8 100644 --- a/visor-api/src/main/java/org/vmstudio/visor/api/client/events/provider/RegisterBodyTrackersVREvent.java +++ b/visor-api/src/main/java/org/vmstudio/visor/api/client/events/provider/RegisterBodyTrackersVREvent.java @@ -6,6 +6,7 @@ import org.vmstudio.visor.api.VisorAPI; import org.vmstudio.visor.api.common.eventbus.event.VREvent; +import java.util.ArrayList; import java.util.List; /** @@ -20,7 +21,7 @@ public class RegisterBodyTrackersVREvent extends VREvent { public RegisterBodyTrackersVREvent(@NotNull List providers){ super(VisorAPI.addonManager().getCoreAddon()); - this.providers = providers; + this.providers = new ArrayList<>(providers); } public void addProvider(@NotNull AtumVRBodyView provider){ diff --git a/visor-api/src/main/java/org/vmstudio/visor/api/client/events/provider/RegisterHandTrackersVREvent.java b/visor-api/src/main/java/org/vmstudio/visor/api/client/events/provider/RegisterHandTrackersVREvent.java index caa04ede..bbdb6cb8 100644 --- a/visor-api/src/main/java/org/vmstudio/visor/api/client/events/provider/RegisterHandTrackersVREvent.java +++ b/visor-api/src/main/java/org/vmstudio/visor/api/client/events/provider/RegisterHandTrackersVREvent.java @@ -6,6 +6,7 @@ import org.vmstudio.visor.api.VisorAPI; import org.vmstudio.visor.api.common.eventbus.event.VREvent; +import java.util.ArrayList; import java.util.List; /** @@ -20,7 +21,7 @@ public class RegisterHandTrackersVREvent extends VREvent { public RegisterHandTrackersVREvent(@NotNull List providers){ super(VisorAPI.addonManager().getCoreAddon()); - this.providers = providers; + this.providers = new ArrayList<>(providers); } public void addProvider(@NotNull XRHandsProvider provider){ diff --git a/visor-api/src/main/java/org/vmstudio/visor/api/client/events/provider/RegisterTreadmillsVREvent.java b/visor-api/src/main/java/org/vmstudio/visor/api/client/events/provider/RegisterTreadmillsVREvent.java index 8f3e64f3..6d6fc231 100644 --- a/visor-api/src/main/java/org/vmstudio/visor/api/client/events/provider/RegisterTreadmillsVREvent.java +++ b/visor-api/src/main/java/org/vmstudio/visor/api/client/events/provider/RegisterTreadmillsVREvent.java @@ -6,6 +6,7 @@ import org.vmstudio.visor.api.VisorAPI; import org.vmstudio.visor.api.common.eventbus.event.VREvent; +import java.util.ArrayList; import java.util.List; /** @@ -20,7 +21,7 @@ public class RegisterTreadmillsVREvent extends VREvent { public RegisterTreadmillsVREvent(@NotNull List providers){ super(VisorAPI.addonManager().getCoreAddon()); - this.providers = providers; + this.providers = new ArrayList<>(providers); } public void addProvider(@NotNull XRTreadmillProvider provider){ From 021a5fd998a843fd3d30130606ac8fe20d08a85a Mon Sep 17 00:00:00 2001 From: bonk <91633686+LPlusBonk@users.noreply.github.com> Date: Tue, 13 Oct 2026 23:27:44 -0400 Subject: [PATCH 2/3] edit: also changed underlying providers member to store an ArrayList This just increases the robustness of the change, enforcing that any future methods that may be created, especially accessors, cannot possibly return or access or especially set the providers member to an immutable List implementation. --- .../api/client/events/provider/RegisterBodyHapticsVREvent.java | 2 +- .../api/client/events/provider/RegisterBodyTrackersVREvent.java | 2 +- .../api/client/events/provider/RegisterHandTrackersVREvent.java | 2 +- .../api/client/events/provider/RegisterTreadmillsVREvent.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/visor-api/src/main/java/org/vmstudio/visor/api/client/events/provider/RegisterBodyHapticsVREvent.java b/visor-api/src/main/java/org/vmstudio/visor/api/client/events/provider/RegisterBodyHapticsVREvent.java index 248a5f1d..70bcacc3 100644 --- a/visor-api/src/main/java/org/vmstudio/visor/api/client/events/provider/RegisterBodyHapticsVREvent.java +++ b/visor-api/src/main/java/org/vmstudio/visor/api/client/events/provider/RegisterBodyHapticsVREvent.java @@ -17,7 +17,7 @@ */ @Getter public class RegisterBodyHapticsVREvent extends VREvent { - private final List providers; + private final ArrayList providers; public RegisterBodyHapticsVREvent(@NotNull List providers){ super(VisorAPI.addonManager().getCoreAddon()); diff --git a/visor-api/src/main/java/org/vmstudio/visor/api/client/events/provider/RegisterBodyTrackersVREvent.java b/visor-api/src/main/java/org/vmstudio/visor/api/client/events/provider/RegisterBodyTrackersVREvent.java index 2e32a5a8..9a2c4e5a 100644 --- a/visor-api/src/main/java/org/vmstudio/visor/api/client/events/provider/RegisterBodyTrackersVREvent.java +++ b/visor-api/src/main/java/org/vmstudio/visor/api/client/events/provider/RegisterBodyTrackersVREvent.java @@ -17,7 +17,7 @@ */ @Getter public class RegisterBodyTrackersVREvent extends VREvent { - private final List providers; + private final ArrayList providers; public RegisterBodyTrackersVREvent(@NotNull List providers){ super(VisorAPI.addonManager().getCoreAddon()); diff --git a/visor-api/src/main/java/org/vmstudio/visor/api/client/events/provider/RegisterHandTrackersVREvent.java b/visor-api/src/main/java/org/vmstudio/visor/api/client/events/provider/RegisterHandTrackersVREvent.java index bbdb6cb8..cf53b780 100644 --- a/visor-api/src/main/java/org/vmstudio/visor/api/client/events/provider/RegisterHandTrackersVREvent.java +++ b/visor-api/src/main/java/org/vmstudio/visor/api/client/events/provider/RegisterHandTrackersVREvent.java @@ -17,7 +17,7 @@ */ @Getter public class RegisterHandTrackersVREvent extends VREvent { - private final List providers; + private final ArrayList providers; public RegisterHandTrackersVREvent(@NotNull List providers){ super(VisorAPI.addonManager().getCoreAddon()); diff --git a/visor-api/src/main/java/org/vmstudio/visor/api/client/events/provider/RegisterTreadmillsVREvent.java b/visor-api/src/main/java/org/vmstudio/visor/api/client/events/provider/RegisterTreadmillsVREvent.java index 6d6fc231..d25e37aa 100644 --- a/visor-api/src/main/java/org/vmstudio/visor/api/client/events/provider/RegisterTreadmillsVREvent.java +++ b/visor-api/src/main/java/org/vmstudio/visor/api/client/events/provider/RegisterTreadmillsVREvent.java @@ -17,7 +17,7 @@ */ @Getter public class RegisterTreadmillsVREvent extends VREvent { - private final List providers; + private final ArrayList providers; public RegisterTreadmillsVREvent(@NotNull List providers){ super(VisorAPI.addonManager().getCoreAddon()); From 29a621ee71a76bf2d6a483fe32741e9bfcdf9431 Mon Sep 17 00:00:00 2001 From: bonk <91633686+LPlusBonk@users.noreply.github.com> Date: Wed, 14 Oct 2026 00:18:33 -0400 Subject: [PATCH 3/3] Revert "edit: also changed underlying providers member to store an ArrayList" This reverts commit 021a5fd998a843fd3d30130606ac8fe20d08a85a. Because of the @Getter annotation, changing the underlying member's type affected the API surface, which is unnecessary considering this is a band-aid fix to this mutable-immutable list abstraction issue to be addressed in 0.7.0. --- .../api/client/events/provider/RegisterBodyHapticsVREvent.java | 2 +- .../api/client/events/provider/RegisterBodyTrackersVREvent.java | 2 +- .../api/client/events/provider/RegisterHandTrackersVREvent.java | 2 +- .../api/client/events/provider/RegisterTreadmillsVREvent.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/visor-api/src/main/java/org/vmstudio/visor/api/client/events/provider/RegisterBodyHapticsVREvent.java b/visor-api/src/main/java/org/vmstudio/visor/api/client/events/provider/RegisterBodyHapticsVREvent.java index 70bcacc3..248a5f1d 100644 --- a/visor-api/src/main/java/org/vmstudio/visor/api/client/events/provider/RegisterBodyHapticsVREvent.java +++ b/visor-api/src/main/java/org/vmstudio/visor/api/client/events/provider/RegisterBodyHapticsVREvent.java @@ -17,7 +17,7 @@ */ @Getter public class RegisterBodyHapticsVREvent extends VREvent { - private final ArrayList providers; + private final List providers; public RegisterBodyHapticsVREvent(@NotNull List providers){ super(VisorAPI.addonManager().getCoreAddon()); diff --git a/visor-api/src/main/java/org/vmstudio/visor/api/client/events/provider/RegisterBodyTrackersVREvent.java b/visor-api/src/main/java/org/vmstudio/visor/api/client/events/provider/RegisterBodyTrackersVREvent.java index 9a2c4e5a..2e32a5a8 100644 --- a/visor-api/src/main/java/org/vmstudio/visor/api/client/events/provider/RegisterBodyTrackersVREvent.java +++ b/visor-api/src/main/java/org/vmstudio/visor/api/client/events/provider/RegisterBodyTrackersVREvent.java @@ -17,7 +17,7 @@ */ @Getter public class RegisterBodyTrackersVREvent extends VREvent { - private final ArrayList providers; + private final List providers; public RegisterBodyTrackersVREvent(@NotNull List providers){ super(VisorAPI.addonManager().getCoreAddon()); diff --git a/visor-api/src/main/java/org/vmstudio/visor/api/client/events/provider/RegisterHandTrackersVREvent.java b/visor-api/src/main/java/org/vmstudio/visor/api/client/events/provider/RegisterHandTrackersVREvent.java index cf53b780..bbdb6cb8 100644 --- a/visor-api/src/main/java/org/vmstudio/visor/api/client/events/provider/RegisterHandTrackersVREvent.java +++ b/visor-api/src/main/java/org/vmstudio/visor/api/client/events/provider/RegisterHandTrackersVREvent.java @@ -17,7 +17,7 @@ */ @Getter public class RegisterHandTrackersVREvent extends VREvent { - private final ArrayList providers; + private final List providers; public RegisterHandTrackersVREvent(@NotNull List providers){ super(VisorAPI.addonManager().getCoreAddon()); diff --git a/visor-api/src/main/java/org/vmstudio/visor/api/client/events/provider/RegisterTreadmillsVREvent.java b/visor-api/src/main/java/org/vmstudio/visor/api/client/events/provider/RegisterTreadmillsVREvent.java index d25e37aa..6d6fc231 100644 --- a/visor-api/src/main/java/org/vmstudio/visor/api/client/events/provider/RegisterTreadmillsVREvent.java +++ b/visor-api/src/main/java/org/vmstudio/visor/api/client/events/provider/RegisterTreadmillsVREvent.java @@ -17,7 +17,7 @@ */ @Getter public class RegisterTreadmillsVREvent extends VREvent { - private final ArrayList providers; + private final List providers; public RegisterTreadmillsVREvent(@NotNull List providers){ super(VisorAPI.addonManager().getCoreAddon());