Fix swipe action with target element: #3647

@Jonahss @imurchie (this reviewers of the first merge request that I closed because the new changes are a lot different) 

*  The original scope of this change was adding the ability to specify a destination element when doing a swipe.  Those are the changes you'll see in the server JS.
*  I added a bunch of tests.
*  When I started expanding the test suite for Android, I uncovered some nasty bugs w relative coordinates.  At least one was caused by copy/pasting.  I then discovered similar code (not nec buggy, but using the same patterns) in multiple places in the project.  I consolidated the logic to decrease the likelihood of bugs and ensure that absolute coordinates were all derived in the same way.
*  There's a bunch of spaghetti code.  If you have any suggestions on how I can get rid of it, lmk.
*  There's a change to the sample code that goes along with this.
*  I ran all the Android `touch` tests and they passed, with the exception of 'should work like `longPress` when released after a pause', which also failed for me before the refactoring


Excellent suggestion.

On 10/31/14, Jonah <notifications@github.com> wrote:
>> +   * the absolute coordinates of the display rectangle.
>> +   * @param shouldCheckBounds Throw if the translated point is outside
>> displayRect?
>> +   * @return
>> +   * @throws UiObjectNotFoundException
>> +   * @throws InvalidCoordinatesException
>> +   */
>> +  public static Point getAbsolutePosition(final Point point, final Rect
>> displayRect,
>> +                                          final Point offsets, final
>> boolean shouldCheckBounds)
>> +      throws UiObjectNotFoundException, InvalidCoordinatesException {
>> +    final Point absolutePosition = new Point();
>> +
>> +    absolutePosition.x = _translateCoordinate(point.x,
>> displayRect.width(), offsets.x);
>> +    absolutePosition.y = _translateCoordinate(point.y,
>> displayRect.height(), offsets.y);
>> +
>> +    if (shouldCheckBounds &&
>> +        !displayRect.contains(absolutePosition.x.intValue(),
>> absolutePosition.y.intValue())) {
>
> You could use `floor` and `ceiling` to make sure we always round in the
> less-buggy direction.
>
> ---
> Reply to this email directly or view it on GitHub:
> https://github.com/appium/appium/pull/3943/files#r19696388