/** * @param command The {@link AndroidCommand} * @return {@link AndroidCommandResult} * @throws JSONException * @see * io.appium.android.bootstrap.CommandHandler#execute(io.appium.android.bootstrap.AndroidCommand) */ @Override public AndroidCommandResult execute(final AndroidCommand command) throws JSONException { initalize(); try { params = command.params(); // isElementCommand doesn't check to see if we actually have an element // so getElement is used instead. try { if (command.getElement() != null) { isElement = true; } } catch (final Exception e) { isElement = false; } if (isElement) { // extract x and y from the element. el = command.getElement(); final Rect bounds = el.getVisibleBounds(); clickX = bounds.centerX(); clickY = bounds.centerY(); } else { // no element so extract x and y from params final Object paramX = params.get("x"); final Object paramY = params.get("y"); double targetX = 0.5; double targetY = 0.5; if (paramX != null) { targetX = Double.parseDouble(paramX.toString()); } if (paramY != null) { targetY = Double.parseDouble(paramY.toString()); } final ArrayList<Integer> posVals = absPosFromCoords(new Double[] {targetX, targetY}); clickX = posVals.get(0); clickY = posVals.get(1); } if (executeTouchEvent()) { return getSuccessResult(true); } } catch (final UiObjectNotFoundException e) { return new AndroidCommandResult(WDStatus.NO_SUCH_ELEMENT, e.getMessage()); } catch (final ElementNotInHashException e) { return new AndroidCommandResult(WDStatus.NO_SUCH_ELEMENT, e.getMessage()); } catch (final Exception e) { return getErrorResult(e.getMessage()); } return getErrorResult("Failed to execute touch event"); }
/** * @param command The {@link AndroidCommand} * @return {@link AndroidCommandResult} * @throws JSONException * @see * io.appium.android.bootstrap.CommandHandler#execute(io.appium.android.bootstrap.AndroidCommand) */ @Override public AndroidCommandResult execute(final AndroidCommand command) throws JSONException { try { final Hashtable<String, Object> params = command.params(); AndroidElement el = null; int clickX = -1; int clickY = -1; boolean isElement = false; // isElementCommand doesn't check to see if we actually have an element // so getElement is used instead. try { if (command.getElement() != null) { isElement = true; } } catch (final Exception e) { } if (isElement) { // extract x and y from the element. el = command.getElement(); final Rect bounds = el.getVisibleBounds(); clickX = bounds.centerX(); clickY = bounds.centerY(); } else { // no element so extract x and y from params final Object paramX = params.get("x"); final Object paramY = params.get("y"); double targetX = 0.5; double targetY = 0.5; if (paramX != null) { targetX = Double.parseDouble(paramX.toString()); } if (paramY != null) { targetY = Double.parseDouble(paramY.toString()); } final ArrayList<Integer> posVals = absPosFromCoords(new Double[] {targetX, targetY}); clickX = posVals.get(0); clickY = posVals.get(1); } final Object paramDuration = params.get("duration"); int duration = 2000; // two seconds if (paramDuration != null) { duration = Integer.parseInt(paramDuration.toString()); } Logger.debug( "longClick using element? " + isElement + " x: " + clickX + ", y: " + clickY + ", duration: " + duration); if (correctLongClick(clickX, clickY, duration)) { return getSuccessResult(true); } // if correctLongClick failed and we have an element // then uiautomator's longClick is used as a fallback. if (isElement) { Logger.debug("Falling back to broken longClick"); final boolean res = el.longClick(); return getSuccessResult(res); } } catch (final UiObjectNotFoundException e) { return new AndroidCommandResult(WDStatus.NO_SUCH_ELEMENT, e.getMessage()); } catch (final ElementNotInHashException e) { return new AndroidCommandResult(WDStatus.NO_SUCH_ELEMENT, e.getMessage()); } catch (final Exception e) { return getErrorResult(e.getMessage()); } return getErrorResult("Failed to long click"); }