Thanks for posting your code. I'm glad you were able to dismiss the crosshair programmatically.
Now lets see if we can get the crosshair to show programmatically!
Looking at your code, I believe the issue is that the chain of events (in your case, press down, touch slop, release) are completing too quickly, and so the chart is not aware that a long press has taken place. Firstly, you can customize the time taken before a long press is recognized by the chart using this API:
I think you need to modify the part of your code which handles the 'up' gesture. Crucially I think you need to make sure that the eventTime parameter (which you pass to the obtain method of the MotionEvent class) is set to be that of the touch down gesture, plus an increment of time to denote the duration of the long press. If you modify the chart time-out duration by using the above API, then this increment simply needs to be greater than or equal to this figure. Alternatively, a common approach is to use the value returned by the following method:
One thing I also noticed about your code is that in each call to MotionEvent.obtain(), you pass the current time as the 'downTime' parameter. In my experience, when working with a chain of events, such as a long press I have always used the same value for this parameter. I am not 100% sure if this will matter but my understanding is that it tells Android the time at which (crucially) the first event in the chain was invoked. It may be worth trying this with your code, so you may want to capture the system time just before the first call to obtain(), then use this same value for the downTime parameter in each call to obtain().
Finally, for simplicity, I would start by removing your middle step concerning the touch slop.
I hope that this helps, please let us know how you get on!