appium-espresso-driver 1.46.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (311) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/LICENSE +201 -0
  3. package/README.md +864 -0
  4. package/build/index.js +48 -0
  5. package/build/lib/commands/execute.js +67 -0
  6. package/build/lib/commands/general.js +337 -0
  7. package/build/lib/commands/idling-resources.js +31 -0
  8. package/build/lib/commands/index.js +26 -0
  9. package/build/lib/commands/services.js +27 -0
  10. package/build/lib/desired-caps.js +65 -0
  11. package/build/lib/driver.js +475 -0
  12. package/build/lib/espresso-runner.js +381 -0
  13. package/build/lib/logger.js +18 -0
  14. package/build/lib/server-builder.js +213 -0
  15. package/build/lib/server.js +39 -0
  16. package/build/lib/utils.js +85 -0
  17. package/espresso-server/app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk +0 -0
  18. package/espresso-server/app/build/outputs/apk/androidTest/debug/output-metadata.json +18 -0
  19. package/espresso-server/app/build.gradle.kts +153 -0
  20. package/espresso-server/app/proguard-rules.pro +25 -0
  21. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/EspressoServerRunnerTest.kt +93 -0
  22. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/drivers/AppDriver.kt +29 -0
  23. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/drivers/ComposeDriver.kt +73 -0
  24. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/drivers/DriverContext.kt +35 -0
  25. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/drivers/EspressoDriver.kt +70 -0
  26. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/AcceptAlert.kt +32 -0
  27. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/Back.kt +31 -0
  28. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/Clear.kt +40 -0
  29. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/Click.kt +27 -0
  30. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/CreateSession.kt +58 -0
  31. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/DeleteSession.kt +33 -0
  32. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/DismissAlert.kt +32 -0
  33. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/DrawerActionHandler.kt +45 -0
  34. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/ElementEquals.kt +19 -0
  35. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/ElementScreenshot.kt +31 -0
  36. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/ElementValue.kt +85 -0
  37. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/FindActive.kt +32 -0
  38. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/FindElement.kt +29 -0
  39. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/FindElements.kt +43 -0
  40. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetAlertText.kt +31 -0
  41. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetAttribute.kt +101 -0
  42. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetClipboard.kt +65 -0
  43. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetDeviceInfo.kt +44 -0
  44. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetDisplayed.kt +28 -0
  45. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetEnabled.kt +30 -0
  46. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetLocation.kt +32 -0
  47. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetLocationInView.kt +33 -0
  48. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetName.kt +31 -0
  49. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetOrientation.kt +44 -0
  50. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetRect.kt +38 -0
  51. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetRotation.kt +33 -0
  52. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetSelected.kt +30 -0
  53. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetSession.kt +34 -0
  54. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetSessions.kt +41 -0
  55. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetSettings.kt +25 -0
  56. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetSize.kt +32 -0
  57. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetToastVisibility.kt +34 -0
  58. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetWindowRect.kt +43 -0
  59. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/GetWindowSize.kt +42 -0
  60. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/HideKeyboard.kt +29 -0
  61. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/Keys.kt +82 -0
  62. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/ListIdlingResources.kt +30 -0
  63. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/MobileBackdoor.kt +42 -0
  64. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/MobileClickAction.kt +49 -0
  65. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/MobileSwipe.kt +71 -0
  66. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/MobileViewFlash.kt +50 -0
  67. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/MoveTo.kt +50 -0
  68. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/MultiTouchAction.kt +50 -0
  69. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/NavigateTo.kt +42 -0
  70. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/NoSessionCommandHandler.kt +4 -0
  71. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/NotYetImplemented.kt +28 -0
  72. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/OpenNotifications.kt +28 -0
  73. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/PerformAction.kt +42 -0
  74. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/PerformAutofillDismissal.kt +31 -0
  75. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/PerformEditorAction.kt +30 -0
  76. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/PointerEventHandler.kt +281 -0
  77. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/PressKeyCode.kt +90 -0
  78. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/RegisterIdlingResources.kt +33 -0
  79. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/ReleaseActions.kt +41 -0
  80. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/RequestHandler.kt +43 -0
  81. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/ScreenshotHandler.kt +29 -0
  82. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/ScrollToPage.kt +60 -0
  83. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/SetClipboard.kt +64 -0
  84. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/SetDate.kt +41 -0
  85. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/SetOrientation.kt +61 -0
  86. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/SetRotation.kt +46 -0
  87. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/SetTime.kt +41 -0
  88. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/Source.kt +29 -0
  89. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/StartActivity.kt +30 -0
  90. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/StartService.kt +40 -0
  91. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/Status.kt +26 -0
  92. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/StopService.kt +37 -0
  93. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/Text.kt +28 -0
  94. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/TouchAction.kt +49 -0
  95. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/Uiautomator.kt +68 -0
  96. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/UiautomatorPageSource.kt +35 -0
  97. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/UnregisterIdlingResources.kt +33 -0
  98. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/UpdateSettings.kt +35 -0
  99. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/WebAtoms.kt +69 -0
  100. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/AppiumException.kt +40 -0
  101. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/DuplicateRouteException.kt +22 -0
  102. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/ElementNotVisibleException.kt +30 -0
  103. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/InvalidArgumentException.kt +35 -0
  104. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/InvalidElementStateException.kt +41 -0
  105. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/InvalidSelectorException.kt +35 -0
  106. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/MoveTargetOutOfBoundsException.kt +39 -0
  107. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/NoAlertOpenException.kt +33 -0
  108. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/NoSuchDriverException.kt +31 -0
  109. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/NoSuchElementException.kt +34 -0
  110. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/NotYetImplementedException.kt +33 -0
  111. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/ScreenCaptureException.kt +30 -0
  112. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/SessionNotCreatedException.kt +34 -0
  113. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/StaleElementException.kt +30 -0
  114. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/handlers/exceptions/XPathLookupException.kt +31 -0
  115. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/AccessibilityServiceState.kt +15 -0
  116. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/ActivityHelpers.kt +125 -0
  117. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/ActivityOptionsHelpers.kt +60 -0
  118. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/AlertHelpers.kt +170 -0
  119. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/AndroidLogger.kt +45 -0
  120. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/AssertHelpers.kt +17 -0
  121. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/AutofillHelpers.kt +44 -0
  122. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/BackdoorUtils.java +49 -0
  123. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/ClipboardHelper.kt +51 -0
  124. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/ComposeNodeFinder.kt +59 -0
  125. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/DeviceInfoHelper.kt +148 -0
  126. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/EspressoViewsCache.kt +57 -0
  127. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/GsonParserHelpers.kt +72 -0
  128. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/IMEHelpers.kt +88 -0
  129. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/IntentHelpers.kt +336 -0
  130. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/InteractionHelper.kt +40 -0
  131. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/InvocationOperation.java +80 -0
  132. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/LocaleHelpers.kt +46 -0
  133. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/Logger.kt +25 -0
  134. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/NotificationListener.kt +87 -0
  135. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/Rect.kt +22 -0
  136. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/ReflectionUtils.kt +64 -0
  137. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/ScreenshotsHelper.kt +59 -0
  138. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/StringHelpers.kt +42 -0
  139. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/ThreadHelpers.kt +15 -0
  140. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/UiAutomationWrapper.kt +48 -0
  141. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/ViewFinder.kt +316 -0
  142. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/XMLHelpers.kt +56 -0
  143. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/extensions/Semaphore.kt +22 -0
  144. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/reflection/ArrayUtils.java +110 -0
  145. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/reflection/ClassUtils.java +180 -0
  146. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/reflection/MethodUtils.java +155 -0
  147. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/reflection/Validate.java +34 -0
  148. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/adapter/BaseW3CActionAdapter.kt +71 -0
  149. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/adapter/DummyW3CActionAdapter.kt +133 -0
  150. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/adapter/W3CActionAdapter.kt +71 -0
  151. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/adapter/espresso/AndroidKeyEvent.kt +271 -0
  152. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/adapter/espresso/AndroidMotionEvent.kt +90 -0
  153. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/adapter/espresso/EspressoW3CActionAdapter.kt +147 -0
  154. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/adapter/espresso/Helpers.kt +71 -0
  155. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/adapter/espresso/MotionEventBuilder.kt +153 -0
  156. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/adapter/espresso/MultiTouchState.kt +132 -0
  157. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/adapter/espresso/TouchState.kt +7 -0
  158. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/caps/CapsUtils.kt +96 -0
  159. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/dispatcher/BaseDispatchResult.kt +14 -0
  160. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/dispatcher/DispatchPointerMoveResult.kt +22 -0
  161. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/dispatcher/KeyDispatch.kt +151 -0
  162. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/dispatcher/PointerDispatch.kt +286 -0
  163. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/dispatcher/W3CKeyEvent.kt +21 -0
  164. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/dispatcher/constants/KeyCodeMapper.kt +169 -0
  165. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/dispatcher/constants/KeyLocationMapper.kt +50 -0
  166. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/dispatcher/constants/KeyNormalizer.kt +84 -0
  167. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/dispatcher/constants/NormalizedKeys.kt +60 -0
  168. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/models/ActionObject.kt +138 -0
  169. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/models/ActionSequence.kt +112 -0
  170. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/models/Actions.kt +89 -0
  171. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/models/InputSource.kt +173 -0
  172. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/models/Origin.kt +24 -0
  173. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/models/OriginDeserializer.kt +25 -0
  174. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/models/Tick.kt +62 -0
  175. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/processor/ActionsProcessor.kt +93 -0
  176. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/processor/KeyProcessor.kt +57 -0
  177. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/processor/PauseProcessor.kt +59 -0
  178. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/processor/PointerProcessor.kt +115 -0
  179. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/processor/ProcessorHelpers.kt +35 -0
  180. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/state/ActiveInputSources.kt +62 -0
  181. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/state/InputState.kt +6 -0
  182. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/state/InputStateTable.kt +95 -0
  183. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/state/KeyInputState.kt +82 -0
  184. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/helpers/w3c/state/PointerInputState.kt +45 -0
  185. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/http/RouteDefinition.kt +67 -0
  186. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/http/RouteMap.kt +51 -0
  187. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/http/Router.kt +250 -0
  188. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/http/Server.kt +109 -0
  189. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/http/response/AppiumResponse.kt +61 -0
  190. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/http/response/BaseResponse.kt +25 -0
  191. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/AlertParams.kt +21 -0
  192. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/AppiumParams.kt +55 -0
  193. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/BackdoorMethodArg.kt +3 -0
  194. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/ClipboardDataType.kt +18 -0
  195. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/DrawerActionParams.kt +21 -0
  196. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/EditorActionParams.kt +21 -0
  197. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/Element.kt +169 -0
  198. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/GetClipboardParams.kt +27 -0
  199. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/GlobalSession.kt +64 -0
  200. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/HamcrestMatcher.kt +144 -0
  201. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/IdlingResourcesParams.kt +66 -0
  202. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/KeyEventParams.kt +23 -0
  203. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/LocaleParams.kt +34 -0
  204. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/Location.kt +19 -0
  205. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/Locator.kt +22 -0
  206. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/MatcherJson.kt +37 -0
  207. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/MobileBackdoorMethod.kt +22 -0
  208. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/MobileBackdoorParams.kt +20 -0
  209. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/MobileClickActionParams.kt +81 -0
  210. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/MobileSwipeParams.kt +106 -0
  211. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/MotionEventParams.kt +37 -0
  212. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/MoveToParams.kt +26 -0
  213. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/MultiTouchActionsParams.kt +5 -0
  214. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/NavigateToParams.kt +21 -0
  215. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/OrientationParams.kt +21 -0
  216. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/OrientationType.kt +6 -0
  217. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/Rect.kt +24 -0
  218. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/RotationParams.kt +38 -0
  219. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/ScrollToPageParams.kt +36 -0
  220. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/SessionParams.kt +23 -0
  221. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/SetClipboardParams.kt +29 -0
  222. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/SetDateParams.kt +23 -0
  223. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/SetTimeParams.kt +22 -0
  224. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/SettingsParams.kt +19 -0
  225. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/Size.kt +22 -0
  226. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/SourceDocument.kt +286 -0
  227. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/StartActivityParams.kt +9 -0
  228. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/StartServiceParams.kt +22 -0
  229. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/StopServiceParams.kt +21 -0
  230. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/Strategy.kt +49 -0
  231. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/TextValueParams.kt +6 -0
  232. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/ToastLookupParams.kt +22 -0
  233. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/TouchAction.kt +178 -0
  234. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/TouchActionsParams.kt +5 -0
  235. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/UiautomatorParams.kt +123 -0
  236. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/ViewAttributesEnum.kt +51 -0
  237. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/ViewElement.kt +204 -0
  238. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/ViewFlashParams.kt +9 -0
  239. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/ViewText.kt +12 -0
  240. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/WindowRect.kt +24 -0
  241. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/WindowSize.kt +22 -0
  242. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/settings/AbstractSetting.kt +23 -0
  243. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/settings/DriverSetting.kt +40 -0
  244. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/settings/SettingType.kt +21 -0
  245. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/web/WebAtom.kt +26 -0
  246. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/web/WebAtomDeserializer.kt +99 -0
  247. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/web/WebAtomsMethods.kt +4 -0
  248. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/model/web/WebAtomsParams.kt +9 -0
  249. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/viewaction/OrientationChange.kt +47 -0
  250. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/viewaction/ScrollTo.kt +48 -0
  251. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/viewaction/UiControllerPerformer.kt +67 -0
  252. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/viewaction/UiControllerRunnable.kt +25 -0
  253. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/viewaction/ViewGetter.kt +79 -0
  254. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/viewaction/ViewTextGetter.kt +31 -0
  255. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/viewmatcher/RegexpTextMatcher.kt +38 -0
  256. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/viewmatcher/WithView.kt +33 -0
  257. package/espresso-server/app/src/androidTest/java/io/appium/espressoserver/lib/viewmatcher/WithXPath.kt +55 -0
  258. package/espresso-server/app/src/main/AndroidManifest.xml +7 -0
  259. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/assets/Helpers.kt +20 -0
  260. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/assets/backdoor-methods.json +51 -0
  261. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/assets/key-actions.json +15 -0
  262. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/assets/multi-touch-actions.json +28 -0
  263. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/GsonParserHelpersTest.kt +41 -0
  264. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/IntentCreationTests.kt +115 -0
  265. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/InvocationOperationTest.java +97 -0
  266. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/KReflectionUtilsTest.kt +108 -0
  267. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/XpathQueryParserTests.kt +42 -0
  268. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/ActionSequenceTest.kt +220 -0
  269. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/ActionsTest.kt +76 -0
  270. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/CapsUtilsTest.kt +76 -0
  271. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/Helpers.kt +7 -0
  272. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/InputSourceTest.kt +153 -0
  273. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/InputStateTableTest.kt +72 -0
  274. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/KeyDispatchTest.kt +133 -0
  275. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/KeyInputStateTest.kt +74 -0
  276. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/PointerDispatchTest.kt +370 -0
  277. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/ProcessorTest.kt +320 -0
  278. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/TickTest.kt +265 -0
  279. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/adapter/AndroidKeyEventTest.kt +114 -0
  280. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/helpers/w3c/adapter/HelpersTest.kt +31 -0
  281. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/http/RouteDefinitionTest.kt +74 -0
  282. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/model/HamcrestMatcherTest.kt +112 -0
  283. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/model/MatcherJsonTest.kt +20 -0
  284. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/model/MobileBackdoorMethodTest.java +110 -0
  285. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/model/MobileClickTest.kt +46 -0
  286. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/model/MobileSwipeTest.kt +68 -0
  287. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/model/TouchActionTest.kt +56 -0
  288. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/model/web/WebAtomTest.kt +68 -0
  289. package/espresso-server/app/src/test/java/io/appium/espressoserver/test/model/web/WebAtomsTest.kt +96 -0
  290. package/espresso-server/build.gradle.kts +33 -0
  291. package/espresso-server/gradle/wrapper/gradle-wrapper.jar +0 -0
  292. package/espresso-server/gradle/wrapper/gradle-wrapper.properties +5 -0
  293. package/espresso-server/gradle.properties +26 -0
  294. package/espresso-server/gradlew +185 -0
  295. package/espresso-server/gradlew.bat +89 -0
  296. package/espresso-server/lint.xml +4 -0
  297. package/espresso-server/settings.gradle.kts +1 -0
  298. package/index.js +29 -0
  299. package/lib/commands/execute.js +72 -0
  300. package/lib/commands/general.js +321 -0
  301. package/lib/commands/idling-resources.js +52 -0
  302. package/lib/commands/index.js +16 -0
  303. package/lib/commands/services.js +50 -0
  304. package/lib/desired-caps.js +55 -0
  305. package/lib/driver.js +566 -0
  306. package/lib/espresso-runner.js +340 -0
  307. package/lib/logger.js +6 -0
  308. package/lib/server-builder.js +194 -0
  309. package/lib/server.js +18 -0
  310. package/lib/utils.js +74 -0
  311. package/package.json +105 -0
@@ -0,0 +1,71 @@
1
+ package io.appium.espressoserver.lib.helpers.w3c.adapter
2
+
3
+ import android.graphics.Point
4
+
5
+ import io.appium.espressoserver.lib.handlers.exceptions.AppiumException
6
+ import io.appium.espressoserver.lib.helpers.Logger
7
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.W3CKeyEvent
8
+ import io.appium.espressoserver.lib.helpers.w3c.models.InputSource.PointerType
9
+ import io.appium.espressoserver.lib.helpers.w3c.state.KeyInputState
10
+ import io.appium.espressoserver.lib.helpers.w3c.state.PointerInputState
11
+
12
+ interface W3CActionAdapter {
13
+
14
+ val viewportWidth: Long
15
+
16
+ val viewportHeight: Long
17
+
18
+ val logger: Logger
19
+
20
+ @Throws(AppiumException::class)
21
+ fun keyDown(keyDownEvent: W3CKeyEvent)
22
+
23
+ @Throws(AppiumException::class)
24
+ fun keyUp(keyUpEvent: W3CKeyEvent)
25
+
26
+ @Throws(AppiumException::class)
27
+ fun pointerDown(button: Int, sourceId: String, pointerType: PointerType?,
28
+ x: Float, y: Float, depressedButtons: Set<Int>,
29
+ globalKeyInputState: KeyInputState?)
30
+
31
+ @Throws(AppiumException::class)
32
+ fun pointerUp(button: Int, sourceId: String, pointerType: PointerType?,
33
+ x: Float, y: Float, depressedButtons: Set<Int>,
34
+ globalKeyInputState: KeyInputState?)
35
+
36
+ @Throws(AppiumException::class)
37
+ fun pointerMove(sourceId: String, pointerType: PointerType?,
38
+ currentX: Float, currentY: Float, x: Float, y: Float,
39
+ buttons: Set<Int>?, globalKeyInputState: KeyInputState?)
40
+
41
+ @Throws(AppiumException::class)
42
+ fun pointerCancel(sourceId: String, pointerType: PointerType)
43
+
44
+ fun lockAdapter()
45
+
46
+ fun unlockAdapter()
47
+
48
+ @Throws(AppiumException::class)
49
+ fun getKeyCode(keyValue: String?, location: Int): Int
50
+
51
+ @Throws(AppiumException::class)
52
+ fun getCharCode(keyValue: String?, location: Int): Int
53
+
54
+ @Throws(AppiumException::class)
55
+ fun getWhich(keyValue: String?, location: Int): Int
56
+
57
+ fun getPointerMoveDurationMargin(pointerInputState: PointerInputState): Double
58
+
59
+ fun pointerMoveIntervalDuration(): Int
60
+
61
+ @Throws(AppiumException::class)
62
+ fun sleep(duration: Float)
63
+
64
+ fun waitForUiThread()
65
+
66
+ @Throws(AppiumException::class)
67
+ fun getElementCenterPoint(elementId: String?): Point
68
+
69
+ @Throws(AppiumException::class)
70
+ fun sychronousTickActionsComplete()
71
+ }
@@ -0,0 +1,271 @@
1
+ package io.appium.espressoserver.lib.helpers.w3c.adapter.espresso
2
+
3
+ import android.os.SystemClock
4
+ import android.view.KeyCharacterMap
5
+ import android.view.KeyEvent
6
+ import androidx.test.espresso.InjectEventSecurityException
7
+ import androidx.test.espresso.UiController
8
+ import io.appium.espressoserver.lib.handlers.exceptions.AppiumException
9
+ import io.appium.espressoserver.lib.handlers.exceptions.InvalidArgumentException
10
+ import io.appium.espressoserver.lib.helpers.AndroidLogger
11
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.W3CKeyEvent
12
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.NormalizedKeys.ALT
13
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.NormalizedKeys.ARROW_DOWN
14
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.NormalizedKeys.ARROW_LEFT
15
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.NormalizedKeys.ARROW_RIGHT
16
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.NormalizedKeys.ARROW_UP
17
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.NormalizedKeys.ASTERISK
18
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.NormalizedKeys.BACKSPACE
19
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.NormalizedKeys.CLEAR
20
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.NormalizedKeys.COMMA
21
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.NormalizedKeys.CONTROL
22
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.NormalizedKeys.DELETE
23
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.NormalizedKeys.EIGHT
24
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.NormalizedKeys.END
25
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.NormalizedKeys.EQUALS
26
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.NormalizedKeys.ESCAPE
27
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.NormalizedKeys.F1
28
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.NormalizedKeys.F10
29
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.NormalizedKeys.F11
30
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.NormalizedKeys.F12
31
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.NormalizedKeys.F2
32
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.NormalizedKeys.F3
33
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.NormalizedKeys.F4
34
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.NormalizedKeys.F5
35
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.NormalizedKeys.F6
36
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.NormalizedKeys.F7
37
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.NormalizedKeys.F8
38
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.NormalizedKeys.F9
39
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.NormalizedKeys.FIVE
40
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.NormalizedKeys.FORWARD_SLASH
41
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.NormalizedKeys.FOUR
42
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.NormalizedKeys.HELP
43
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.NormalizedKeys.HOME
44
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.NormalizedKeys.HYPHEN
45
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.NormalizedKeys.INSERT
46
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.NormalizedKeys.META
47
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.NormalizedKeys.NINE
48
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.NormalizedKeys.ONE
49
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.NormalizedKeys.PAGEDOWN
50
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.NormalizedKeys.PAGEUP
51
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.NormalizedKeys.PAUSE
52
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.NormalizedKeys.PERIOD
53
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.NormalizedKeys.PLUS
54
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.NormalizedKeys.RETURN
55
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.NormalizedKeys.SEMICOLON
56
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.NormalizedKeys.SEVEN
57
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.NormalizedKeys.SHIFT
58
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.NormalizedKeys.SIX
59
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.NormalizedKeys.TAB
60
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.NormalizedKeys.THREE
61
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.NormalizedKeys.TWO
62
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.NormalizedKeys.UNIDENTIFIED
63
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.NormalizedKeys.WHITESPACE
64
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.NormalizedKeys.ZENKAKU_HANKAKU
65
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.NormalizedKeys.ZERO
66
+ import java.util.*
67
+
68
+
69
+ /**
70
+ * Translate a W3C Key into an Android Key Event (if possible
71
+ * @param keyValue The W3C normalized key value (https://www.w3.org/TR/webdriver1/#keyboard-actions)
72
+ * @param location The W3C "key location"
73
+ * @return
74
+ */
75
+ fun keyCodeToEvent(keyValue: String?, @Suppress("UNUSED_PARAMETER") location: Int): Int {
76
+ return when (keyValue) {
77
+ UNIDENTIFIED -> KeyEvent.KEYCODE_UNKNOWN
78
+ HELP -> KeyEvent.KEYCODE_HELP
79
+ BACKSPACE -> KeyEvent.KEYCODE_DEL
80
+ TAB -> KeyEvent.KEYCODE_TAB
81
+ CLEAR -> KeyEvent.KEYCODE_CLEAR
82
+ RETURN -> KeyEvent.KEYCODE_ENTER
83
+ PAUSE -> KeyEvent.KEYCODE_BREAK
84
+ ESCAPE -> KeyEvent.KEYCODE_ESCAPE
85
+ WHITESPACE -> KeyEvent.KEYCODE_SPACE
86
+ SEMICOLON -> KeyEvent.KEYCODE_SEMICOLON
87
+ EQUALS -> KeyEvent.KEYCODE_EQUALS
88
+ ZERO -> KeyEvent.KEYCODE_0
89
+ ONE -> KeyEvent.KEYCODE_1
90
+ TWO -> KeyEvent.KEYCODE_2
91
+ THREE -> KeyEvent.KEYCODE_3
92
+ FOUR -> KeyEvent.KEYCODE_4
93
+ FIVE -> KeyEvent.KEYCODE_5
94
+ SIX -> KeyEvent.KEYCODE_6
95
+ SEVEN -> KeyEvent.KEYCODE_7
96
+ EIGHT -> KeyEvent.KEYCODE_8
97
+ NINE -> KeyEvent.KEYCODE_9
98
+ ASTERISK -> KeyEvent.KEYCODE_STAR
99
+ PLUS -> KeyEvent.KEYCODE_NUMPAD_ADD
100
+ COMMA -> KeyEvent.KEYCODE_COMMA
101
+ HYPHEN -> KeyEvent.KEYCODE_MINUS
102
+ PERIOD -> KeyEvent.KEYCODE_PERIOD
103
+ FORWARD_SLASH -> KeyEvent.KEYCODE_SLASH
104
+ F1 -> KeyEvent.KEYCODE_F1
105
+ F2 -> KeyEvent.KEYCODE_F2
106
+ F3 -> KeyEvent.KEYCODE_F3
107
+ F4 -> KeyEvent.KEYCODE_F4
108
+ F5 -> KeyEvent.KEYCODE_F5
109
+ F6 -> KeyEvent.KEYCODE_F6
110
+ F7 -> KeyEvent.KEYCODE_F7
111
+ F8 -> KeyEvent.KEYCODE_F8
112
+ F9 -> KeyEvent.KEYCODE_F9
113
+ F10 -> KeyEvent.KEYCODE_F10
114
+ F11 -> KeyEvent.KEYCODE_F11
115
+ F12 -> KeyEvent.KEYCODE_F12
116
+ ZENKAKU_HANKAKU -> KeyEvent.KEYCODE_ZENKAKU_HANKAKU
117
+ SHIFT -> KeyEvent.KEYCODE_SHIFT_LEFT
118
+ CONTROL -> KeyEvent.KEYCODE_CTRL_LEFT
119
+ ALT -> KeyEvent.KEYCODE_ALT_LEFT
120
+ META -> KeyEvent.KEYCODE_META_LEFT
121
+ PAGEUP -> KeyEvent.KEYCODE_PAGE_UP
122
+ PAGEDOWN -> KeyEvent.KEYCODE_PAGE_DOWN
123
+ END -> KeyEvent.KEYCODE_MOVE_END
124
+ HOME -> KeyEvent.KEYCODE_HOME
125
+ ARROW_LEFT -> KeyEvent.KEYCODE_DPAD_LEFT
126
+ ARROW_UP -> KeyEvent.KEYCODE_DPAD_DOWN
127
+ ARROW_RIGHT -> KeyEvent.KEYCODE_DPAD_RIGHT
128
+ ARROW_DOWN -> KeyEvent.KEYCODE_DPAD_DOWN
129
+ INSERT -> KeyEvent.KEYCODE_INSERT
130
+ DELETE -> KeyEvent.KEYCODE_FORWARD_DEL
131
+ else -> -1
132
+ }
133
+ }
134
+
135
+ class AndroidKeyEvent(private val uiController: UiController) {
136
+ private val keyCharacterMap = KeyCharacterMap.load(KeyCharacterMap.VIRTUAL_KEYBOARD)
137
+ private val keyDownTimes: MutableMap<String?, List<KeyEvent>> = HashMap()
138
+
139
+ @Throws(AppiumException::class)
140
+ fun keyDown(w3cKeyEvent: W3CKeyEvent) {
141
+ keyUpOrDown(w3cKeyEvent, true)
142
+ }
143
+
144
+ @Throws(AppiumException::class)
145
+ fun keyUp(w3cKeyEvent: W3CKeyEvent) {
146
+ keyUpOrDown(w3cKeyEvent, false)
147
+ }
148
+
149
+ /**
150
+ * Translate a string into a sequence of Android Key Events
151
+ * @param key A key in String form
152
+ * @param isDown Returns true if this is a key down events
153
+ * @param isRepeat Returns true if this is a repeat key down
154
+ * @param metaState The current global meta state of Android key events
155
+ * @return
156
+ * @throws InvalidArgumentException
157
+ */
158
+ @Throws(InvalidArgumentException::class)
159
+ private fun convertStringToAndroidKeyEvents(key: String?, isDown: Boolean,
160
+ isRepeat: Boolean, metaState: Int): List<KeyEvent> {
161
+ val keyEventsFromChar = keyCharacterMap.getEvents(key!!.toCharArray())
162
+ ?: throw InvalidArgumentException(String.format("Could not find matching keycode for character %s", key))
163
+ val now = SystemClock.uptimeMillis()
164
+ val keyEvents: MutableList<KeyEvent> = ArrayList()
165
+ var keyEventIndex = 0
166
+ while (keyEventIndex * 2 < keyEventsFromChar.size) {
167
+ // getEvents produces UP and DOWN events, so we need to skip over every other event
168
+ val keyEvent = keyEventsFromChar[keyEventIndex * 2]
169
+ val downTime = if (isDown) SystemClock.uptimeMillis() else keyDownTimes[key]!![keyEventIndex].downTime
170
+ keyEvents.add(KeyEvent(
171
+ downTime,
172
+ if (isDown) downTime else now,
173
+ if (isDown) KeyEvent.ACTION_DOWN else KeyEvent.ACTION_UP,
174
+ keyEvent.keyCode,
175
+ if (isRepeat) 1 else 0,
176
+ metaState or keyEvent.metaState,
177
+ KeyCharacterMap.VIRTUAL_KEYBOARD, 0, 0
178
+ ))
179
+ keyEventIndex++
180
+ }
181
+ return keyEvents
182
+ }
183
+
184
+ /**
185
+ * Dispatch an Android key event
186
+ * @param w3cKeyEvent Key Event in W3C form (https://www.w3.org/TR/webdriver1/#keyboard-actions)
187
+ * @param isDown Returns true if it's keyDown, otherwise it's keyUp
188
+ * @throws AppiumException
189
+ */
190
+ @Throws(AppiumException::class)
191
+ private fun keyUpOrDown(w3cKeyEvent: W3CKeyEvent, isDown: Boolean) {
192
+ val action = if (isDown) KeyEvent.ACTION_DOWN else KeyEvent.ACTION_UP
193
+ val key = w3cKeyEvent.key
194
+ val keyCode = w3cKeyEvent.keyCode
195
+
196
+ // No-op if releasing a key that isn't down
197
+ if (action == KeyEvent.ACTION_UP && !keyDownTimes.containsKey(key)) {
198
+ return
199
+ }
200
+ val keyEvents: List<KeyEvent>
201
+ keyEvents = if (keyCode >= 0) {
202
+
203
+ // If the keyCode is known, send it now
204
+ val downTime = if (isDown) SystemClock.uptimeMillis() else keyDownTimes[key]!![0].downTime
205
+ listOf(KeyEvent(
206
+ downTime,
207
+ if (isDown) downTime else SystemClock.uptimeMillis(),
208
+ action,
209
+ keyCode,
210
+ if (w3cKeyEvent.isRepeat) 1 else 0,
211
+ getMetaState(w3cKeyEvent),
212
+ KeyCharacterMap.VIRTUAL_KEYBOARD, 0, 0
213
+ ))
214
+ } else {
215
+ // If there's no keyCode, map the characters to Android keys
216
+ convertStringToAndroidKeyEvents(key, isDown, w3cKeyEvent.isRepeat, getMetaState(w3cKeyEvent))
217
+ }
218
+ injectKeyEvents(isDown, keyEvents, key)
219
+ }
220
+
221
+ /**
222
+ * Get the Android key meta state from a W3C key event
223
+ * @param keyEvent W3C key event
224
+ * @return
225
+ */
226
+ private fun getMetaState(keyEvent: W3CKeyEvent): Int {
227
+ var metaState = 0
228
+ if (keyEvent.isAltKey) {
229
+ metaState = metaState or KeyEvent.META_ALT_MASK
230
+ }
231
+ if (keyEvent.isCtrlKey) {
232
+ metaState = metaState or KeyEvent.META_CTRL_MASK
233
+ }
234
+ if (keyEvent.isShiftKey) {
235
+ metaState = metaState or KeyEvent.META_SHIFT_MASK
236
+ }
237
+ return metaState
238
+ }
239
+
240
+ /**
241
+ * Inject a key event into UiController
242
+ * @param isDown Is it a key down event?
243
+ * @param keyEvents A list of the Android Key Events to inject
244
+ * @param key The key to inject in string form (for logging purposes)
245
+ * @throws AppiumException
246
+ */
247
+ @Throws(AppiumException::class)
248
+ private fun injectKeyEvents(isDown: Boolean, keyEvents: List<KeyEvent>, key: String?) {
249
+ // If it's a keydown event, record that this key went down. If it's keyup, remove pre-existing
250
+ // record of this key going down
251
+ if (isDown) {
252
+ keyDownTimes[key] = keyEvents
253
+ } else {
254
+ keyDownTimes.remove(key)
255
+ }
256
+
257
+ // Inject all of the key events, in order
258
+ for (androidKeyEvent in keyEvents) {
259
+ AndroidLogger.info(String.format("Calling key event: %s", androidKeyEvent))
260
+ var isSuccess: Boolean
261
+ isSuccess = try {
262
+ uiController.injectKeyEvent(androidKeyEvent)
263
+ } catch (e: InjectEventSecurityException) {
264
+ throw AppiumException(e.cause.toString())
265
+ }
266
+ if (!isSuccess) {
267
+ throw AppiumException(String.format("Could not inject key event %s", key))
268
+ }
269
+ }
270
+ }
271
+ }
@@ -0,0 +1,90 @@
1
+ package io.appium.espressoserver.lib.helpers.w3c.adapter.espresso
2
+
3
+ import android.view.MotionEvent
4
+ import androidx.test.espresso.UiController
5
+ import io.appium.espressoserver.lib.handlers.exceptions.AppiumException
6
+ import io.appium.espressoserver.lib.helpers.w3c.models.InputSource
7
+ import io.appium.espressoserver.lib.helpers.w3c.state.KeyInputState
8
+ import java.util.concurrent.ConcurrentHashMap
9
+
10
+ class AndroidMotionEvent private constructor(private val uiController: UiController) {
11
+ private var downTime: Long = 0
12
+
13
+ @Throws(AppiumException::class)
14
+ fun pointerEvent(x: List<Long>?, y: List<Long>?,
15
+ action: Int,
16
+ button: Int?,
17
+ pointerType: InputSource.PointerType?,
18
+ globalKeyInputState: KeyInputState?,
19
+ downEvent: MotionEvent?,
20
+ eventTime: Long): MotionEvent {
21
+ val metaState = globalKeyInputState?.toMetaState() ?: 0
22
+ downTime = downEvent?.downTime ?: eventTime
23
+ return MotionEventBuilder()
24
+ .withAction(action)
25
+ .withButtonState(extractButton(button, pointerType))
26
+ .withPointerType(pointerType)
27
+ .withDownTime(downTime)
28
+ .withEventTime(eventTime)
29
+ .withX(x)
30
+ .withY(y)
31
+ .withMetaState(metaState)
32
+ .withSource(downEvent?.source ?: 0)
33
+ .build()
34
+ .run(uiController)!!
35
+ }
36
+
37
+ @Throws(AppiumException::class)
38
+ fun pointerMove(x: List<Long>?, y: List<Long>?,
39
+ pointerType: InputSource.PointerType?,
40
+ globalKeyInputState: KeyInputState?,
41
+ downEvent: MotionEvent?) {
42
+ val metaState = globalKeyInputState?.toMetaState() ?: 0
43
+ MotionEventBuilder()
44
+ .withAction(MotionEvent.ACTION_MOVE)
45
+ .withDownTime(downTime)
46
+ .withPointerType(pointerType)
47
+ .withX(x)
48
+ .withY(y)
49
+ .withMetaState(metaState)
50
+ .withSource(downEvent?.source ?: 0)
51
+ .build()
52
+ .run(uiController)
53
+ }
54
+
55
+ @JvmOverloads
56
+ @Throws(AppiumException::class)
57
+ fun pointerCancel(x: List<Long>? = null, y: List<Long>? = null) {
58
+ MotionEventBuilder()
59
+ .withAction(MotionEvent.ACTION_CANCEL)
60
+ .withDownTime(downTime)
61
+ .withX(x)
62
+ .withY(y)
63
+ .withPointerType(InputSource.PointerType.TOUCH)
64
+ .build()
65
+ .run(uiController)
66
+ }
67
+
68
+ companion object {
69
+ private var touchMotionEvent: AndroidMotionEvent? = null
70
+ private val motionEvents: MutableMap<String, AndroidMotionEvent> = ConcurrentHashMap()
71
+
72
+ @Synchronized
73
+ fun getMotionEvent(
74
+ sourceId: String, uiController: UiController): AndroidMotionEvent {
75
+ if (!motionEvents.containsKey(sourceId)) {
76
+ motionEvents[sourceId] = AndroidMotionEvent(uiController)
77
+ }
78
+ return motionEvents[sourceId]!!
79
+ }
80
+
81
+ @Synchronized
82
+ fun getTouchMotionEvent(uiController: UiController): AndroidMotionEvent {
83
+ if (touchMotionEvent == null) {
84
+ touchMotionEvent = AndroidMotionEvent(uiController)
85
+ }
86
+ return touchMotionEvent!!
87
+ }
88
+ }
89
+
90
+ }
@@ -0,0 +1,147 @@
1
+ package io.appium.espressoserver.lib.helpers.w3c.adapter.espresso
2
+
3
+ import android.content.Context
4
+ import android.graphics.Point
5
+
6
+ import androidx.test.espresso.UiController
7
+ import androidx.test.espresso.action.GeneralLocation
8
+ import io.appium.espressoserver.lib.handlers.exceptions.AppiumException
9
+ import io.appium.espressoserver.lib.helpers.AndroidLogger
10
+ import io.appium.espressoserver.lib.helpers.Logger
11
+ import io.appium.espressoserver.lib.helpers.w3c.adapter.BaseW3CActionAdapter
12
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.W3CKeyEvent
13
+ import io.appium.espressoserver.lib.helpers.w3c.models.InputSource.PointerType
14
+ import io.appium.espressoserver.lib.helpers.w3c.state.KeyInputState
15
+ import io.appium.espressoserver.lib.model.EspressoElement
16
+
17
+ import android.view.KeyEvent.ACTION_DOWN
18
+ import android.view.KeyEvent.ACTION_UP
19
+ import android.view.MotionEvent.ACTION_MOVE
20
+ import android.view.MotionEvent.ACTION_POINTER_DOWN
21
+ import android.view.MotionEvent.ACTION_POINTER_UP
22
+ import androidx.test.core.app.ApplicationProvider.getApplicationContext
23
+ import kotlin.math.roundToInt
24
+ import kotlin.math.roundToLong
25
+
26
+ class EspressoW3CActionAdapter(private val uiController: UiController) : BaseW3CActionAdapter() {
27
+
28
+ private val androidKeyEvent: AndroidKeyEvent = AndroidKeyEvent(uiController)
29
+ private val multiTouchState = MultiTouchState()
30
+ private val displayMetrics = getApplicationContext<Context>().resources.displayMetrics
31
+
32
+ override val viewportHeight: Long
33
+ get() = displayMetrics.heightPixels.toLong()
34
+
35
+ override val viewportWidth: Long
36
+ get() = displayMetrics.widthPixels.toLong()
37
+
38
+ override val logger: Logger
39
+ get() = AndroidLogger
40
+
41
+ @Throws(AppiumException::class)
42
+ override fun keyDown(keyDownEvent: W3CKeyEvent) {
43
+ androidKeyEvent.keyDown(keyDownEvent)
44
+ }
45
+
46
+ @Throws(AppiumException::class)
47
+ override fun keyUp(keyUpEvent: W3CKeyEvent) {
48
+ androidKeyEvent.keyUp(keyUpEvent)
49
+ }
50
+
51
+ @Throws(AppiumException::class)
52
+ override fun pointerDown(button: Int, sourceId: String, pointerType: PointerType?,
53
+ x: Float, y: Float, depressedButtons: Set<Int>,
54
+ globalKeyInputState: KeyInputState?) {
55
+ this.logger.info("Running pointer down at coordinates: ${x}, ${y}, $pointerType")
56
+ val roundedCoords = toCoordinates(x, y)
57
+
58
+ if (isTouch(pointerType)) {
59
+ // touch down actions need to be grouped together
60
+ multiTouchState.updateTouchState(ACTION_DOWN, sourceId, roundedCoords.x.toLong(), roundedCoords.y.toLong(), globalKeyInputState, button)
61
+ } else {
62
+ val androidMotionEvent = AndroidMotionEvent.getMotionEvent(sourceId, uiController)
63
+ val xList = listOf(roundedCoords.x.toLong())
64
+ val yList = listOf(roundedCoords.y.toLong())
65
+ androidMotionEvent.pointerEvent(
66
+ xList, yList,
67
+ ACTION_DOWN, button, pointerType, globalKeyInputState, null, 0)
68
+
69
+ androidMotionEvent.pointerEvent(
70
+ xList, yList,
71
+ ACTION_POINTER_DOWN, button, pointerType, globalKeyInputState, null, 0)
72
+ }
73
+ }
74
+
75
+ @Throws(AppiumException::class)
76
+ override fun pointerUp(button: Int, sourceId: String, pointerType: PointerType?,
77
+ x: Float, y: Float, depressedButtons: Set<Int>,
78
+ globalKeyInputState: KeyInputState?) {
79
+ this.logger.info("Running pointer up at coordinates: $x $y $pointerType")
80
+ val roundedCoords = toCoordinates(x, y)
81
+ if (isTouch(pointerType)) {
82
+ // touch up actions need to be grouped together
83
+ multiTouchState.updateTouchState(ACTION_UP, sourceId, roundedCoords.x.toLong(), roundedCoords.y.toLong(), globalKeyInputState, button)
84
+ } else {
85
+ val xList = listOf(roundedCoords.x.toLong())
86
+ val yList = listOf(roundedCoords.y.toLong())
87
+ val androidMotionEvent = AndroidMotionEvent.getMotionEvent(sourceId, uiController)
88
+ androidMotionEvent.pointerEvent(xList, yList,
89
+ ACTION_POINTER_UP, button, pointerType, globalKeyInputState, null, 0)
90
+ androidMotionEvent.pointerEvent(xList, yList,
91
+ ACTION_UP, button, pointerType, globalKeyInputState, null, 0)
92
+ }
93
+ }
94
+
95
+ @Throws(AppiumException::class)
96
+ override fun pointerMove(sourceId: String, pointerType: PointerType?,
97
+ currentX: Float, currentY: Float, x: Float, y: Float,
98
+ buttons: Set<Int>?, globalKeyInputState: KeyInputState?) {
99
+ this.logger.info("Running pointer move at coordinates: $x $y $pointerType")
100
+ val roundedCoords = toCoordinates(x, y)
101
+ if (isTouch(pointerType)) {
102
+ multiTouchState.updateTouchState(ACTION_MOVE, sourceId, roundedCoords.x.toLong(), roundedCoords.y.toLong(), globalKeyInputState, null)
103
+ multiTouchState.pointerMove(uiController)
104
+ } else {
105
+ AndroidMotionEvent.getMotionEvent(sourceId, uiController)
106
+ .pointerMove(listOf(roundedCoords.x.toLong()), listOf(roundedCoords.y.toLong()), pointerType, globalKeyInputState, null)
107
+ }
108
+ }
109
+
110
+ @Throws(AppiumException::class)
111
+ override fun pointerCancel(sourceId: String, pointerType: PointerType) {
112
+ if (isTouch(pointerType)) {
113
+ multiTouchState.pointerCancel(uiController)
114
+ } else {
115
+ AndroidMotionEvent.getMotionEvent(sourceId, uiController).pointerCancel()
116
+ }
117
+ }
118
+
119
+ @Throws(AppiumException::class)
120
+ override fun sychronousTickActionsComplete() {
121
+ multiTouchState.perform(uiController)
122
+ AndroidLogger.info("Pointer event: Tick complete")
123
+ }
124
+
125
+ override fun getKeyCode(keyValue: String?, location: Int): Int {
126
+ return keyCodeToEvent(keyValue, location)
127
+ }
128
+
129
+ @Throws(AppiumException::class)
130
+ override fun getElementCenterPoint(elementId: String?): Point {
131
+ val view = EspressoElement.getViewById(elementId)
132
+ val coords = GeneralLocation.CENTER.calculateCoordinates(view)
133
+ val point = Point()
134
+ point.x = coords[0].roundToInt()
135
+ point.y = coords[1].roundToInt()
136
+ return point
137
+ }
138
+
139
+ override fun waitForUiThread() {
140
+ uiController.loopMainThreadUntilIdle()
141
+ }
142
+
143
+ override fun sleep(duration: Float) {
144
+ val roundedDuration = duration.roundToLong()
145
+ uiController.loopMainThreadForAtLeast(roundedDuration)
146
+ }
147
+ }
@@ -0,0 +1,71 @@
1
+ package io.appium.espressoserver.lib.helpers.w3c.adapter.espresso
2
+
3
+ import android.graphics.Point
4
+ import android.os.Build
5
+ import android.view.MotionEvent
6
+ import io.appium.espressoserver.lib.handlers.exceptions.AppiumException
7
+ import io.appium.espressoserver.lib.helpers.w3c.models.InputSource
8
+ import kotlin.math.roundToInt
9
+
10
+ private const val MOUSE_BUTTON_LEFT = 0
11
+ private const val MOUSE_BUTTON_MIDDLE = 1
12
+ private const val MOUSE_BUTTON_RIGHT = 2
13
+
14
+ @Throws(AppiumException::class)
15
+ fun extractButton(w3cButton: Int?, pointerType: InputSource.PointerType?): Int {
16
+ // Get the Android tool type constant associated with the W3C provided pointer type
17
+ val toolType = getToolType(pointerType)
18
+ if (toolType == MotionEvent.TOOL_TYPE_FINGER) {
19
+ // Ignore button code conversion for the unsupported tool type
20
+ return w3cButton ?: 0
21
+ }
22
+ var androidButton = MOUSE_BUTTON_LEFT
23
+ if (w3cButton != null) {
24
+ androidButton = w3cButton
25
+ }
26
+ return when (androidButton) {
27
+ MOUSE_BUTTON_LEFT -> if (toolType == MotionEvent.TOOL_TYPE_STYLUS && Build.VERSION.SDK_INT >= 23) MotionEvent.BUTTON_STYLUS_PRIMARY else MotionEvent.BUTTON_PRIMARY
28
+ MOUSE_BUTTON_MIDDLE -> MotionEvent.BUTTON_TERTIARY
29
+ MOUSE_BUTTON_RIGHT -> if (toolType == MotionEvent.TOOL_TYPE_STYLUS && Build.VERSION.SDK_INT >= 23) MotionEvent.BUTTON_STYLUS_SECONDARY else MotionEvent.BUTTON_SECONDARY
30
+ else -> androidButton
31
+ }
32
+ }
33
+
34
+ /**
35
+ * Return Android tool type based on W3C pointer type
36
+ * @param pointerType W3C pointer types (TOUCH, PEN, MOUSE)
37
+ * @return Android Motion Event type (FINGER, STYLUS, MOUSE)
38
+ */
39
+ @Throws(AppiumException::class)
40
+ fun getToolType(pointerType: InputSource.PointerType?): Int {
41
+ @Suppress("REDUNDANT_ELSE_IN_WHEN")
42
+ return if (pointerType == null) {
43
+ MotionEvent.TOOL_TYPE_FINGER
44
+ } else when (pointerType) {
45
+ InputSource.PointerType.TOUCH -> MotionEvent.TOOL_TYPE_FINGER
46
+ InputSource.PointerType.PEN -> MotionEvent.TOOL_TYPE_STYLUS
47
+ InputSource.PointerType.MOUSE -> MotionEvent.TOOL_TYPE_MOUSE
48
+ else -> throw AppiumException(String.format("Invalid tool type: %s", pointerType))
49
+ }
50
+ }
51
+
52
+ // If a 'mouse' event was provided, convert it to 'touch'
53
+ // This is because some clients only send 'mouse' events and the assumption is that if they
54
+ // send 'mouse' events to a device that has a touch screen, it needs to be converted
55
+ fun isTouch(type: InputSource.PointerType?): Boolean {
56
+ // return type == TOUCH || (type == MOUSE && isTouchScreen); // TODO Revisit this if we wish to support MOUSE on Android
57
+ return type === InputSource.PointerType.TOUCH || type === InputSource.PointerType.MOUSE
58
+ }
59
+
60
+ /**
61
+ * Convert [x,y] coordinates from float to long.
62
+ *
63
+ * Gives warning if the long values are different from the float values
64
+ *
65
+ * @param x X coordinate
66
+ * @param y Y coordinate
67
+ * @return Rounded x and y coordinates
68
+ */
69
+ fun toCoordinates(x: Float, y: Float): Point {
70
+ return Point(x.roundToInt(), y.roundToInt())
71
+ }