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,153 @@
1
+ package io.appium.espressoserver.lib.helpers.w3c.adapter.espresso
2
+
3
+ import android.os.SystemClock
4
+ import android.view.MotionEvent
5
+ import android.view.MotionEvent.PointerProperties
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.MoveTargetOutOfBoundsException
10
+ import io.appium.espressoserver.lib.helpers.AndroidLogger
11
+ import io.appium.espressoserver.lib.helpers.w3c.models.InputSource
12
+
13
+ class MotionEventBuilder {
14
+ private val motionEventParams: MotionEventParams
15
+ fun withX(x: List<Long>?): MotionEventBuilder = apply { motionEventParams.x = x }
16
+ fun withY(y: List<Long>?): MotionEventBuilder = apply { motionEventParams.y = y }
17
+ fun withX(x: Long): MotionEventBuilder = apply { motionEventParams.x = listOf(x) }
18
+ fun withY(y: Long): MotionEventBuilder = apply { motionEventParams.y = listOf(y) }
19
+ fun withDownTime(downTime: Long): MotionEventBuilder = apply { motionEventParams.downTime = downTime }
20
+ fun withEventTime(eventTime: Long): MotionEventBuilder = apply { motionEventParams.eventTime = eventTime }
21
+ fun withAction(action: Int): MotionEventBuilder = apply { motionEventParams.action = action }
22
+ fun withMetaState(metaState: Int): MotionEventBuilder = apply { motionEventParams.metaState = metaState }
23
+ fun withButtonState(buttonState: Int): MotionEventBuilder = apply { motionEventParams.buttonState = buttonState }
24
+ fun withXPrecision(xPrecision: Float): MotionEventBuilder = apply { motionEventParams.xPrecision = xPrecision }
25
+ fun withYPrecision(yPrecision: Float): MotionEventBuilder = apply { motionEventParams.yPrecision = yPrecision }
26
+ fun withDeviceId(deviceId: Int): MotionEventBuilder = apply { motionEventParams.deviceId = deviceId }
27
+ fun withSource(source: Int): MotionEventBuilder = apply { motionEventParams.source = source }
28
+ fun withEdgeFlags(edgeFlags: Int): MotionEventBuilder = apply { motionEventParams.edgeFlags = edgeFlags }
29
+ fun withPointerType(pointerType: InputSource.PointerType?): MotionEventBuilder = apply { motionEventParams.pointerType = pointerType }
30
+
31
+ fun build(): MotionEventRunner {
32
+ return MotionEventRunner(motionEventParams)
33
+ }
34
+
35
+ class MotionEventParams {
36
+ var downTime: Long = 0
37
+ var action = 0
38
+ var x: List<Long>? = null
39
+ var y: List<Long>? = null
40
+ var metaState = 0
41
+ var xPrecision = 0f
42
+ var yPrecision = 0f
43
+ var deviceId = 0
44
+ var edgeFlags = 0
45
+ var buttonState = 0
46
+ var source = 0
47
+ var pointerType: InputSource.PointerType? = null
48
+ var eventTime: Long = 0
49
+ }
50
+
51
+ class MotionEventRunner(private val motionEventParams: MotionEventParams) {
52
+ @Throws(AppiumException::class)
53
+ fun run(uiController: UiController): MotionEvent? {
54
+ var pointerCount = if (motionEventParams.x == null) 0 else motionEventParams.x!!.size
55
+
56
+ // Don't do anything if no pointers were provided
57
+ if (pointerCount == 0 && motionEventParams.action != MotionEvent.ACTION_CANCEL) {
58
+ return null
59
+ }
60
+ val pointerCoords = arrayOfNulls<MotionEvent.PointerCoords>(pointerCount)
61
+ val pointerProperties = arrayOfNulls<PointerProperties>(pointerCount)
62
+ for (pointerIndex in 0 until pointerCount) {
63
+ // Set pointer coordinates
64
+ pointerCoords[pointerIndex] = MotionEvent.PointerCoords()
65
+ pointerCoords[pointerIndex]!!.let {
66
+ it.clear()
67
+ it.pressure = 1f
68
+ it.size = 1f
69
+ it.x = motionEventParams.x!![pointerIndex].toFloat()
70
+ it.y = motionEventParams.y!![pointerIndex].toFloat()
71
+ }
72
+
73
+ // Set pointer properties
74
+ pointerProperties[pointerIndex] = PointerProperties()
75
+ pointerProperties[pointerIndex]!!.let {
76
+ it.toolType = getToolType(motionEventParams.pointerType)
77
+ it.id = pointerIndex
78
+ }
79
+ }
80
+
81
+ // ACTION_POINTER_DOWN and ACTION_POINTER_UP need a bit mask
82
+ var action = motionEventParams.action
83
+ if (pointerCount > 1 && (action == MotionEvent.ACTION_POINTER_DOWN || action == MotionEvent.ACTION_POINTER_UP)) {
84
+ action += pointerProperties[1]!!.id shl MotionEvent.ACTION_POINTER_INDEX_SHIFT
85
+ }
86
+
87
+ // ACTION_DOWN and ACTION_UP and ACTION_CANCEL has a pointer count of 1
88
+ if (action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
89
+ pointerCount = if (motionEventParams.x != null && motionEventParams.y != null) {
90
+ 1
91
+ } else {
92
+ 0
93
+ }
94
+ }
95
+ val eventTime = if (motionEventParams.eventTime > 0) motionEventParams.eventTime else SystemClock.uptimeMillis()
96
+ AndroidLogger.info(String.format(
97
+ "Running Android MotionEvent.obtain with parameters: " +
98
+ "downTime=[%s], eventTime=[%s], action=[%s], pointerCount=[%s], " + "" +
99
+ "pointerProperties=[%s], pointerCoords=[%s], metaState=[%s], buttonState=[%s], " +
100
+ "xPrecision=[%s], yPrecision=[%s], deviceId=[%s], edgeFlags=[%s], source=[%s], " +
101
+ "flags=[%s]",
102
+ "For more information, see https://developer.android.com/reference/android/view/MotionEvent#obtain(long,%20long,%20int,%20int,%20android.view.MotionEvent.PointerProperties[],%20android.view.MotionEvent.PointerCoords[],%20int,%20int,%20float,%20float,%20int,%20int,%20int,%20int)",
103
+ motionEventParams.downTime,
104
+ eventTime,
105
+ action,
106
+ pointerCount,
107
+ pointerProperties.contentToString(),
108
+ pointerCoords.contentToString(),
109
+ motionEventParams.metaState,
110
+ motionEventParams.buttonState,
111
+ motionEventParams.xPrecision,
112
+ motionEventParams.yPrecision,
113
+ motionEventParams.deviceId,
114
+ motionEventParams.edgeFlags,
115
+ motionEventParams.source,
116
+ 0
117
+ ))
118
+ val evt = MotionEvent.obtain(
119
+ motionEventParams.downTime,
120
+ eventTime,
121
+ action,
122
+ pointerCount,
123
+ pointerProperties,
124
+ pointerCoords,
125
+ motionEventParams.metaState,
126
+ motionEventParams.buttonState,
127
+ motionEventParams.xPrecision,
128
+ motionEventParams.yPrecision,
129
+ motionEventParams.deviceId,
130
+ motionEventParams.edgeFlags,
131
+ motionEventParams.source,
132
+ 0 // MotionEvent flags. Don't think we need to set these.
133
+ )
134
+ try {
135
+ val success = uiController.injectMotionEvent(evt)
136
+ if (!success) {
137
+ throw AppiumException("Could not complete pointer operation")
138
+ }
139
+ } catch (e: InjectEventSecurityException) {
140
+ throw MoveTargetOutOfBoundsException(String.format(
141
+ "Could not complete pointer operation. Pointer operation is within the viewport but is not within bounds of the app-under-test. Cause: %s",
142
+ e.cause
143
+ ))
144
+ }
145
+ return evt
146
+ }
147
+
148
+ }
149
+
150
+ init {
151
+ motionEventParams = MotionEventParams()
152
+ }
153
+ }
@@ -0,0 +1,132 @@
1
+ package io.appium.espressoserver.lib.helpers.w3c.adapter.espresso
2
+
3
+ import android.os.SystemClock
4
+ import android.view.MotionEvent
5
+ import androidx.test.espresso.UiController
6
+ import io.appium.espressoserver.lib.handlers.exceptions.AppiumException
7
+ import io.appium.espressoserver.lib.helpers.w3c.adapter.espresso.AndroidMotionEvent.Companion.getTouchMotionEvent
8
+ import io.appium.espressoserver.lib.helpers.w3c.models.InputSource
9
+ import io.appium.espressoserver.lib.helpers.w3c.state.KeyInputState
10
+ import java.util.*
11
+
12
+ class MultiTouchState {
13
+ private val touchStateSet: MutableMap<String, TouchState> = LinkedHashMap()
14
+ private var globalKeyInputState: KeyInputState? = null
15
+ private var button = 0
16
+ private var downEvent: MotionEvent? = null
17
+ private var touchPhase: TouchPhase? = null
18
+ fun updateTouchState(actionType: Int,
19
+ sourceId: String,
20
+ x: Long?, y: Long?,
21
+ globalKeyInputState: KeyInputState?,
22
+ button: Int?) {
23
+
24
+ // Lazily get the touch state of the input with given sourceId
25
+ if (!touchStateSet.containsKey(sourceId)) {
26
+ val touchState = TouchState()
27
+ touchStateSet[sourceId] = touchState
28
+ }
29
+
30
+ // Update x and y coordinates
31
+ val touchState = touchStateSet[sourceId]!!
32
+ touchState.x = x!!
33
+ touchState.y = y!!
34
+
35
+ // Update to global key input state
36
+ this.globalKeyInputState = globalKeyInputState
37
+ if (button != null) {
38
+ this.button = button
39
+ }
40
+
41
+ // Record if we're in the TOUCH_DOWN or TOUCH_UP phase
42
+ if (actionType == MotionEvent.ACTION_DOWN) {
43
+ touchPhase = TouchPhase.DOWN
44
+ } else if (actionType == MotionEvent.ACTION_UP) {
45
+ touchPhase = TouchPhase.UP
46
+ }
47
+ }
48
+
49
+ /**
50
+ * Get the x coordinates for all inputs in the same order they were entered
51
+ * @return X coordinates as a list
52
+ */
53
+ private val xCoords: List<Long>
54
+ get() { return touchStateSet.values.map { it.x } }
55
+
56
+ /**
57
+ * Get the y coordinates for all inputs in the same order they were entered
58
+ * @return Y coordinates as a list
59
+ */
60
+ private val yCoords: List<Long>
61
+ get() { return touchStateSet.values.map { it.y } }
62
+
63
+ @Throws(AppiumException::class)
64
+ fun pointerDown(uiController: UiController) {
65
+ val androidMotionEvent = getTouchMotionEvent(uiController)
66
+ val eventTime = SystemClock.uptimeMillis()
67
+ val xCoords = xCoords
68
+ val yCoords = yCoords
69
+ downEvent = androidMotionEvent.pointerEvent(
70
+ xCoords, yCoords,
71
+ MotionEvent.ACTION_DOWN, button, InputSource.PointerType.TOUCH, globalKeyInputState!!, null, eventTime)
72
+ if (xCoords.size > 1) {
73
+ androidMotionEvent.pointerEvent(xCoords, yCoords,
74
+ MotionEvent.ACTION_POINTER_DOWN, button, InputSource.PointerType.TOUCH, globalKeyInputState!!, downEvent, eventTime)
75
+ }
76
+ }
77
+
78
+ @Throws(AppiumException::class)
79
+ fun pointerUp(uiController: UiController) {
80
+ val androidMotionEvent = getTouchMotionEvent(uiController)
81
+ val eventTime = SystemClock.uptimeMillis()
82
+ val xCoords = xCoords
83
+ val yCoords = yCoords
84
+ if (xCoords.size > 1) {
85
+ androidMotionEvent.pointerEvent(
86
+ xCoords, yCoords,
87
+ MotionEvent.ACTION_POINTER_UP, button, InputSource.PointerType.TOUCH, globalKeyInputState!!, downEvent, eventTime)
88
+ }
89
+ androidMotionEvent.pointerEvent(
90
+ xCoords, yCoords,
91
+ MotionEvent.ACTION_UP, button, InputSource.PointerType.TOUCH, globalKeyInputState!!, downEvent, eventTime)
92
+ downEvent = null
93
+ }
94
+
95
+ @Throws(AppiumException::class)
96
+ fun pointerCancel(uiController: UiController) {
97
+ val xCoords = xCoords
98
+ val yCoords = yCoords
99
+ getTouchMotionEvent(uiController).pointerEvent(
100
+ xCoords, yCoords,
101
+ MotionEvent.ACTION_CANCEL, button, InputSource.PointerType.TOUCH, globalKeyInputState!!, downEvent, SystemClock.uptimeMillis()
102
+ )
103
+ downEvent = null
104
+ touchPhase = TouchPhase.NONE
105
+ }
106
+
107
+ @Throws(AppiumException::class)
108
+ fun pointerMove(uiController: UiController) {
109
+ if (isDown) {
110
+ val androidMotionEvent = getTouchMotionEvent(uiController)
111
+ androidMotionEvent.pointerMove(
112
+ xCoords, yCoords, InputSource.PointerType.TOUCH, globalKeyInputState!!, downEvent)
113
+ }
114
+ }
115
+
116
+ val isDown: Boolean
117
+ get() = downEvent != null
118
+
119
+ @Throws(AppiumException::class)
120
+ fun perform(uiController: UiController) {
121
+ if (touchPhase == TouchPhase.DOWN) {
122
+ pointerDown(uiController)
123
+ } else if (touchPhase == TouchPhase.UP) {
124
+ pointerUp(uiController)
125
+ }
126
+ touchPhase = TouchPhase.NONE
127
+ }
128
+
129
+ enum class TouchPhase {
130
+ DOWN, UP, NONE
131
+ }
132
+ }
@@ -0,0 +1,7 @@
1
+ package io.appium.espressoserver.lib.helpers.w3c.adapter.espresso
2
+
3
+ class TouchState {
4
+ var x: Long = 0
5
+ var y: Long = 0
6
+ var sourceId: String? = null
7
+ }
@@ -0,0 +1,96 @@
1
+ /*
2
+ * Licensed under the Apache License, Version 2.0 (the "License");
3
+ * you may not use this file except in compliance with the License.
4
+ * See the NOTICE file distributed with this work for additional
5
+ * information regarding copyright ownership.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ package io.appium.espressoserver.lib.helpers.w3c.caps
18
+
19
+ import io.appium.espressoserver.lib.helpers.AndroidLogger
20
+ import io.appium.espressoserver.lib.handlers.exceptions.InvalidArgumentException
21
+
22
+
23
+ val STANDARD_CAPS = listOf(
24
+ "browserName",
25
+ "browserVersion",
26
+ "platformName",
27
+ "acceptInsecureCerts",
28
+ "pageLoadStrategy",
29
+ "proxy",
30
+ "setWindowRect",
31
+ "timeouts",
32
+ "unhandledPromptBehavior"
33
+ )
34
+ const val APPIUM_PREFIX = "appium"
35
+
36
+
37
+ fun isStandardCap(capName: String): Boolean = STANDARD_CAPS.any { it.toLowerCase() == capName.toLowerCase() }
38
+
39
+
40
+ fun mergeCaps(primary: Map<String, Any?>, secondary: Map<String, Any?>): Map<String, Any?> {
41
+ val result = primary.toMutableMap()
42
+ secondary.mapValues {
43
+ if (result[it.key] != null) {
44
+ throw InvalidArgumentException(
45
+ "Property '${it.key}' should not exist on both primary ($primary) and secondary ($secondary) objects")
46
+ }
47
+ result[it.key] = it.value
48
+ }
49
+ return result
50
+ }
51
+
52
+
53
+ fun stripPrefixes(caps: Map<String, Any?>): Map<String, Any?> {
54
+ val prefix = "$APPIUM_PREFIX:"
55
+ val badPrefixedCaps = caps.keys
56
+ .filter { it.startsWith(prefix) }
57
+ .fold(mutableListOf<String>(), { acc, capName ->
58
+ val strippedName = capName.substring(prefix.length)
59
+ if (isStandardCap(strippedName)) {
60
+ acc.add(strippedName)
61
+ }
62
+ acc
63
+ })
64
+ if (badPrefixedCaps.isNotEmpty()) {
65
+ throw InvalidArgumentException(
66
+ "The capabilities $badPrefixedCaps are standard capabilities and should not have the '$prefix' prefix")
67
+ }
68
+
69
+ return caps.map {
70
+ if (it.key.startsWith(prefix) && it.key.length > prefix.length)
71
+ it.key.substring(prefix.length) to it.value
72
+ else
73
+ it.key to it.value
74
+ }.toMap()
75
+ }
76
+
77
+
78
+ fun parseCapabilities(firstMatchValue: List<Map<String, Any?>>?,
79
+ alwaysMatchValue: Map<String, Any?>?): Map<String, Any?> {
80
+ val alwaysMatch = alwaysMatchValue ?: mapOf()
81
+ val firstMatch = firstMatchValue ?: listOf()
82
+
83
+ val allFirstMatchCaps = if (firstMatch.isNotEmpty()) firstMatch else listOf<Map<*, *>>(mapOf<String, Any?>())
84
+ val requiredCaps = stripPrefixes(alwaysMatch)
85
+ @Suppress("UNCHECKED_CAST")
86
+ (allFirstMatchCaps as List<Map<String, Any?>>)
87
+ .map { stripPrefixes(it) }
88
+ .forEach {
89
+ try {
90
+ return mergeCaps(requiredCaps, it)
91
+ } catch (e: Exception) {
92
+ AndroidLogger.warn(e)
93
+ }
94
+ }
95
+ throw InvalidArgumentException("Could not find matching capabilities from {$firstMatch, $alwaysMatch}")
96
+ }
@@ -0,0 +1,14 @@
1
+ package io.appium.espressoserver.lib.helpers.w3c.dispatcher
2
+
3
+ import io.appium.espressoserver.lib.handlers.exceptions.AppiumException
4
+ import java.util.concurrent.Callable
5
+
6
+ abstract class BaseDispatchResult {
7
+ var next: Callable<BaseDispatchResult>? = null
8
+ operator fun hasNext(): Boolean {
9
+ return next != null
10
+ }
11
+
12
+ @Throws(AppiumException::class)
13
+ abstract fun perform()
14
+ }
@@ -0,0 +1,22 @@
1
+ package io.appium.espressoserver.lib.helpers.w3c.dispatcher
2
+
3
+ import io.appium.espressoserver.lib.handlers.exceptions.AppiumException
4
+ import io.appium.espressoserver.lib.helpers.w3c.adapter.W3CActionAdapter
5
+ import io.appium.espressoserver.lib.helpers.w3c.models.InputSource
6
+ import io.appium.espressoserver.lib.helpers.w3c.state.KeyInputState
7
+
8
+ class DispatchPointerMoveResult(private val dispatcherAdapter: W3CActionAdapter,
9
+ private val sourceId: String,
10
+ private val pointerType: InputSource.PointerType,
11
+ private val currentX: Float, private val currentY: Float,
12
+ private val x: Float, private val y: Float,
13
+ private val buttons: Set<Int>,
14
+ private val globalKeyInputState: KeyInputState?) : BaseDispatchResult() {
15
+ @Throws(AppiumException::class)
16
+ override fun perform() {
17
+ if (currentX != x || currentY != y) {
18
+ dispatcherAdapter.pointerMove(sourceId, pointerType, currentX, currentY, x, y, buttons, globalKeyInputState)
19
+ }
20
+ }
21
+
22
+ }
@@ -0,0 +1,151 @@
1
+ package io.appium.espressoserver.lib.helpers.w3c.dispatcher
2
+
3
+ import io.appium.espressoserver.lib.handlers.exceptions.AppiumException
4
+ import io.appium.espressoserver.lib.helpers.w3c.adapter.W3CActionAdapter
5
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.KeyNormalizer
6
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.NormalizedKeys
7
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.getCode
8
+ import io.appium.espressoserver.lib.helpers.w3c.dispatcher.constants.getLocation
9
+ import io.appium.espressoserver.lib.helpers.w3c.models.ActionObject
10
+ import io.appium.espressoserver.lib.helpers.w3c.models.InputSource
11
+ import io.appium.espressoserver.lib.helpers.w3c.state.InputStateTable
12
+ import io.appium.espressoserver.lib.helpers.w3c.state.KeyInputState
13
+
14
+ /**
15
+ * Implement key dispatch events (https://www.w3.org/TR/webdriver/#keyboard-actions)
16
+ */
17
+ @Throws(AppiumException::class)
18
+ private fun dispatchKeyEvent(dispatcherAdapter: W3CActionAdapter,
19
+ actionObject: ActionObject,
20
+ inputState: KeyInputState,
21
+ inputStateTable: InputStateTable,
22
+ @Suppress("UNUSED_PARAMETER") tickDuration: Float,
23
+ down: Boolean): W3CKeyEvent {
24
+ // Get the base Key Event
25
+ val keyEvent = getKeyEvent(dispatcherAdapter, actionObject.value!!)
26
+ val key = keyEvent.key!!
27
+
28
+ // 3. If the input state's pressed property contains key, let repeat be true, otherwise let repeat be false.
29
+ if (inputState.isPressed(key)) {
30
+ keyEvent.isRepeat = true
31
+ }
32
+
33
+ // 6. Let charCode, keyCode and which be the implementation-specific values of the charCode,
34
+ // keyCode and which properties.
35
+ // Omiting this for now until there's an implementation that needs it.
36
+
37
+ // 7-10: Set the alt, shift, ctrl meta key state
38
+ dispatcherAdapter.logger.info(String.format(
39
+ "Dispatching '%s' event on input source with id %s with properties '%s'",
40
+ if (down) "keyDown" else "keyUp", actionObject.id, keyEvent.logMessage()
41
+ ))
42
+ if (down) {
43
+ inputState.isAlt = inputState.isAlt || key == NormalizedKeys.ALT
44
+ inputState.isShift = inputState.isShift || key == NormalizedKeys.SHIFT
45
+ inputState.isCtrl = inputState.isCtrl || key == NormalizedKeys.CONTROL
46
+ inputState.isMeta = inputState.isMeta || key == NormalizedKeys.META
47
+ } else {
48
+ inputState.isAlt = inputState.isAlt && key != NormalizedKeys.ALT
49
+ inputState.isShift = inputState.isShift && key != NormalizedKeys.SHIFT
50
+ inputState.isCtrl = inputState.isCtrl && key != NormalizedKeys.CONTROL
51
+ inputState.isMeta = inputState.isMeta && key != NormalizedKeys.META
52
+ }
53
+
54
+ // Set the alt, shift, ctrl and meta states on the Key Event
55
+ keyEvent.isAltKey = inputState.isAlt
56
+ keyEvent.isCtrlKey = inputState.isCtrl
57
+ keyEvent.isShiftKey = inputState.isShift
58
+ keyEvent.isMetaKey = inputState.isMeta
59
+
60
+ // 11: Add key to the set corresponding to input state's pressed property
61
+ if (down) {
62
+ inputState.addPressed(key)
63
+ } else {
64
+ inputState.removePressed(key)
65
+ }
66
+
67
+ // Must lock the dispatcherAdapter in-case other threads are also using it
68
+ dispatcherAdapter.lockAdapter()
69
+ try {
70
+ if (down) {
71
+
72
+ // 12: Append action object with subtype property changed to 'keyUp' to cancel list
73
+ val cancelActionObject = ActionObject(actionObject)
74
+ cancelActionObject.subType = InputSource.ActionType.KEY_UP
75
+ inputStateTable.addActionToCancel(cancelActionObject)
76
+
77
+ // 13: Call implementation specific key-down event
78
+ dispatcherAdapter.keyDown(keyEvent)
79
+ } else {
80
+ // 13: Call implementation specific key-up event
81
+ dispatcherAdapter.keyUp(keyEvent)
82
+ }
83
+ } finally {
84
+ dispatcherAdapter.unlockAdapter()
85
+ }
86
+
87
+ // Log the updated keyboard state
88
+ dispatcherAdapter.logger.info(String.format(
89
+ "Current state of key input source with id: %s",
90
+ inputState.logMessage()
91
+ ))
92
+ return keyEvent
93
+ }
94
+
95
+ /**
96
+ * Dispatch a key down event (in accordance with https://www.w3.org/TR/webdriver/#keyboard-actions)
97
+ *
98
+ * @param dispatcherAdapter Adapter that has implementation specific keyDown event
99
+ * @param actionObject W3C Action Object
100
+ * @param inputState State of the input source
101
+ * @param inputStateTable All of the input states for this session
102
+ * @param tickDuration How long the 'tick' is. This is unused currently but may be used in the future
103
+ * @return W3CKeyEvent (for testing purposes). 'null' if the dispatch failed.
104
+ */
105
+ @Throws(AppiumException::class)
106
+ fun dispatchKeyDown(dispatcherAdapter: W3CActionAdapter,
107
+ actionObject: ActionObject, inputState: KeyInputState,
108
+ inputStateTable: InputStateTable, tickDuration: Float = 0f): W3CKeyEvent? =
109
+ dispatchKeyEvent(dispatcherAdapter, actionObject, inputState, inputStateTable, tickDuration, true)
110
+
111
+ /**
112
+ * Dispatch a key up event (in accordance with https://www.w3.org/TR/webdriver/#keyboard-actions)
113
+ *
114
+ * @param dispatcherAdapter Adapter that has implementation specific keyDown event
115
+ * @param actionObject W3C Action Object
116
+ * @param inputState State of the input source
117
+ * @param inputStateTable All of the input states for this session
118
+ * @param tickDuration How long the 'tick' is. This is unused currently but may be used in the future
119
+ * @return W3CKeyEvent (for testing purposes). 'null' if the dispatch failed.
120
+ */
121
+ @Throws(AppiumException::class)
122
+ fun dispatchKeyUp(dispatcherAdapter: W3CActionAdapter,
123
+ actionObject: ActionObject, inputState: KeyInputState,
124
+ inputStateTable: InputStateTable, tickDuration: Float = 0f): W3CKeyEvent? =
125
+ dispatchKeyEvent(dispatcherAdapter, actionObject, inputState, inputStateTable, tickDuration, false)
126
+
127
+ /**
128
+ * Helper method to get a Key Event that has common attributes between KeyUp and KeyDispatch
129
+ * @param rawKey The value of the key stroke
130
+ * @return W3CKeyEvent Key event info used by adapter
131
+ */
132
+ @Throws(AppiumException::class)
133
+ fun getKeyEvent(dispatcherAdapter: W3CActionAdapter, rawKey: String): W3CKeyEvent = W3CKeyEvent().apply {
134
+ // 1. Let raw key be action's value property
135
+
136
+ // 2. Let key be equal to the normalised key value for raw key
137
+ this.key = KeyNormalizer.toNormalizedKey(rawKey)
138
+
139
+ // 4. Let code be 'code' for raw keypress
140
+ this.code = getCode(rawKey)
141
+
142
+ // 5. Let location be the key location for raw key
143
+ this.location = getLocation(rawKey)
144
+
145
+ // 6. Let charCode, keyCode and which be the implementation-specific values of the charCode,
146
+ // keyCode and which properties appropriate for a key with key key and location location on
147
+ // a 102 key US keyboard
148
+ this.keyCode = dispatcherAdapter.getKeyCode(this.key, this.location)
149
+ this.charCode = dispatcherAdapter.getCharCode(this.code, this.location)
150
+ this.which = dispatcherAdapter.getWhich(this.key, this.location)
151
+ }