/// <summary>
        /// The OpenXR plug-in uses extensions to expose all possible data, which might be surfaced through multiple input devices.
        /// This method is overridden to account for multiple input devices.
        /// </summary>
        /// <param name="inputDevice">The current input device to grab data from.</param>
        public override void UpdateController(InputDevice inputDevice)
        {
            if (!Enabled)
            {
                return;
            }

            if (Interactions == null)
            {
                Debug.LogError($"No interaction configuration for {GetType().Name}");
                Enabled = false;
            }

            using (UpdateControllerPerfMarker.Auto())
            {
                if (inputDevice.TryGetFeatureValue(CommonUsages.devicePosition, out Vector3 _))
                {
                    base.UpdateController(inputDevice);

                    // We've gotten device data from the platform, don't attempt to infer other input actions
                    // from the hand joint data
                    receivingDeviceInputs = true;
                }
                else
                {
                    UpdateHandData(inputDevice);

                    // Updating the Index finger pose right after getting the hand data
                    // regardless of whether device data is present
                    for (int i = 0; i < Interactions?.Length; i++)
                    {
                        var interactionMapping = Interactions[i];
                        switch (interactionMapping.InputType)
                        {
                        case DeviceInputType.IndexFinger:
                            handDefinition?.UpdateCurrentIndexPose(interactionMapping);
                            break;
                        }
                    }

                    // If we aren't getting device data, infer input actions, velocity, etc from hand joint data
                    if (!receivingDeviceInputs)
                    {
                        for (int i = 0; i < Interactions?.Length; i++)
                        {
                            var interactionMapping = Interactions[i];
                            switch (interactionMapping.InputType)
                            {
                            case DeviceInputType.SpatialGrip:
                                if (TryGetJoint(TrackedHandJoint.Palm, out MixedRealityPose currentGripPose))
                                {
                                    interactionMapping.PoseData = currentGripPose;

                                    if (interactionMapping.Changed)
                                    {
                                        CoreServices.InputSystem?.RaisePoseInputChanged(InputSource, ControllerHandedness, interactionMapping.MixedRealityInputAction, currentGripPose);

                                        // Spatial Grip is also used as the basis for the source pose when device data is not provided
                                        // We need to rotate it by an offset to properly represent the source pose.
                                        MixedRealityPose CurrentControllerPose = currentGripPose;
                                        CurrentControllerPose.Rotation *= (ControllerHandedness == Handedness.Left ? leftPalmOffset : rightPalmOffset);

                                        CoreServices.InputSystem?.RaiseSourcePoseChanged(InputSource, this, CurrentControllerPose);
                                        IsPositionAvailable = IsRotationAvailable = true;
                                    }
                                }
                                break;

                            case DeviceInputType.Select:
                            case DeviceInputType.TriggerPress:
                            case DeviceInputType.GripPress:
                                interactionMapping.BoolData = IsPinching || IsGrabbing;

                                if (interactionMapping.Changed)
                                {
                                    if (interactionMapping.BoolData)
                                    {
                                        CoreServices.InputSystem?.RaiseOnInputDown(InputSource, ControllerHandedness, interactionMapping.MixedRealityInputAction);
                                    }
                                    else
                                    {
                                        CoreServices.InputSystem?.RaiseOnInputUp(InputSource, ControllerHandedness, interactionMapping.MixedRealityInputAction);
                                    }
                                }
                                break;

                            case DeviceInputType.SpatialPointer:
                                handDefinition?.UpdatePointerPose(interactionMapping);
                                break;

                            // Gotta do this only for non-AR devices
                            case DeviceInputType.ThumbStick:
                                handDefinition?.UpdateCurrentTeleportPose(interactionMapping);
                                break;
                            }
                        }

                        // Update the controller velocity based on the hand definition's calculations
                        handDefinition?.UpdateVelocity();
                        Velocity        = (handDefinition?.Velocity).Value;
                        AngularVelocity = (handDefinition?.AngularVelocity).Value;
                    }
                }
            }
        }