testautoa 0.4.0 → 0.4.1

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 (79) hide show
  1. data/Rakefile +7 -7
  2. data/bin/calabash-android +8 -1
  3. data/bin/calabash-android-build.rb +1 -1
  4. data/bin/calabash-android-console.rb +4 -4
  5. data/bin/calabash-android-run.rb +2 -10
  6. data/bin/testautoa +461 -0
  7. data/calabash-android.gemspec +3 -1
  8. data/features-skeleton/support/app_life_cycle_hooks.rb +0 -1
  9. data/irbrc +3 -1
  10. data/lib/calabash-android/helpers.rb +45 -17
  11. data/lib/calabash-android/lib/TestServer.apk +0 -0
  12. data/lib/calabash-android/lib/unsign.jar +0 -0
  13. data/lib/calabash-android/operations.rb +150 -66
  14. data/lib/calabash-android/steps/list_steps.rb +1 -1
  15. data/lib/calabash-android/steps/time_picker_steps.rb +1 -1
  16. data/lib/calabash-android/touch_helpers.rb +9 -0
  17. data/lib/calabash-android/version.rb +1 -1
  18. data/lib/calabash-android/wait_helpers.rb +93 -0
  19. data/test-server/AndroidManifest.xml +2 -0
  20. data/test-server/build.xml +1 -0
  21. data/test-server/instrumentation-backend/.classpath +0 -1
  22. data/test-server/instrumentation-backend/AndroidManifest.xml +1 -1
  23. data/test-server/instrumentation-backend/antlr/UIQuery.g +48 -5
  24. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/Command.java +4 -3
  25. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/FranklyResult.java +95 -0
  26. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/Result.java +7 -1
  27. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/HttpServer.java +14 -29
  28. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/activity/FinishOpenedActivities.java +19 -0
  29. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/activity/GetOpenedActivities.java +31 -0
  30. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/activity/GoBackToActivity.java +67 -0
  31. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/gestures/DragCoordinates.java +28 -0
  32. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/gestures/Swipe.java +11 -5
  33. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/location/FakeGPSLocation.java +13 -10
  34. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/softkey/LeftKey.java +24 -0
  35. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/softkey/RightKey.java +24 -0
  36. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/softkey/UpKey.java +24 -0
  37. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/version/Version.java +31 -0
  38. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/CalabashChromeClient.java +131 -36
  39. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/DumpBodyHtml.java +38 -18
  40. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/DumpHtml.java +38 -16
  41. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/EnterTextByCssSelector.java +94 -66
  42. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/ExecuteAsyncJavascript.java +55 -33
  43. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/ExecuteJavascript.java +53 -31
  44. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/JavaScriptOperation.java +44 -0
  45. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/PressByCssSelector.java +52 -27
  46. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/QueryHelper.java +39 -32
  47. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/ScrollTo.java +56 -41
  48. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/SetPropertyByCssSelector.java +50 -25
  49. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/SetText.java +19 -22
  50. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/CompletedFuture.java +40 -0
  51. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/InvocationOperation.java +222 -0
  52. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/Operation.java +7 -0
  53. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/PropertyOperation.java +56 -0
  54. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/Query.java +151 -43
  55. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/UIQuery.tokens +19 -12
  56. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/UIQueryResultVoid.java +22 -0
  57. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ViewMapper.java +41 -11
  58. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/antlr/UIQueryLexer.java +1010 -242
  59. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/antlr/UIQueryParser.java +406 -98
  60. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/BeginsWithRelation.java +45 -0
  61. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/ComparisonOperator.java +54 -0
  62. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/ContainsRelation.java +41 -0
  63. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/EndsWithRelation.java +42 -0
  64. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/LikeRelation.java +79 -0
  65. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/PartialFutureList.java +100 -0
  66. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryAST.java +1 -1
  67. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryASTClassName.java +54 -25
  68. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryASTPredicate.java +147 -0
  69. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryASTPredicateRelation.java +5 -0
  70. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryASTWith.java +153 -89
  71. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryDirection.java +12 -2
  72. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryEvaluator.java +58 -141
  73. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryUtils.java +162 -7
  74. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryVisibility.java +32 -0
  75. metadata +130 -97
  76. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/Query.java +0 -24
  77. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/Touch.java +0 -44
  78. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/antlr/UIQuery.tokens +0 -10
  79. data/test-server/instrumentation-backend/tests/sh/calaba/instrumentationbackend/query/tests/UIQueryTest.java +0 -134
@@ -12,23 +12,66 @@ options {
12
12
  package sh.calaba.instrumentationbackend.query.antlr;
13
13
  }
14
14
 
15
+ @lexer::members {
16
+ public String getErrorMessage(RecognitionException e, String[] tokenNames)
17
+ {
18
+ List stack = getRuleInvocationStack(e, this.getClass().getName());
19
+ String msg = null;
20
+ if ( e instanceof NoViableAltException ) {
21
+ NoViableAltException nvae = (NoViableAltException)e;
22
+ msg = " no viable alt; token="+e.token+" (decision="+nvae.decisionNumber+" state "+nvae.stateNumber+")"+" decision=<<"+nvae.grammarDecisionDescription+">>";
23
+ throw new RuntimeException(msg, e);
24
+ }
25
+ else {
26
+ msg = super.getErrorMessage(e, tokenNames);
27
+ }
28
+ return stack+" "+msg;
29
+ }
30
+ public String getTokenErrorDisplay(Token t) {
31
+ return t.toString();
32
+ }
33
+ }
15
34
 
16
35
  query : expr (WHITE! expr)*
17
36
  ;
18
37
 
19
38
 
20
- expr : (className | filter)
39
+ expr : (className | filter | visibility | predicate | DIRECTION^)
40
+ ;
41
+
42
+ DIRECTION : 'descendant' | 'child' | 'parent' | 'sibling'
21
43
  ;
22
44
 
23
- className : (NAME^ | QUALIFIED_NAME^);
45
+ className : (WILDCARD^ | NAME^ | QUALIFIED_NAME^);
46
+
47
+ WILDCARD : '*';
24
48
 
25
49
  QUALIFIED_NAME : NAME ('.' NAME)+;
26
50
 
51
+ visibility : (ALL^ | VISIBLE^);
52
+
53
+ ALL : 'all';
54
+
55
+ VISIBLE : 'visible';
56
+
57
+
27
58
  filter : NAME FILTER_COLON^ (INT | STRING | BOOL | NIL);
28
59
 
29
60
  FILTER_COLON : ':'
30
61
  ;
31
62
 
63
+ predicate : BEGINPRED^ NAME WHITE! RELATION WHITE! (INT | STRING | BOOL | NIL) ENDPRED!
64
+ ;
65
+ BEGINPRED : '{'
66
+ ;
67
+ ENDPRED : '}'
68
+ ;
69
+
70
+ RELATION : | '=' | '>' | '>=' | '<' | '<=' |
71
+ (( 'BEGINSWITH' | 'ENDSWITH' | 'CONTAINS' | 'LIKE'
72
+ | 'beginswith' | 'endswith' | 'contains' | 'like') ('[' ('a'..'z' | 'A'..'Z')* ']')?)
73
+
74
+ ;
32
75
 
33
76
  INT : '0'..'9'+
34
77
  ;
@@ -43,16 +86,16 @@ NAME : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
43
86
  ;
44
87
 
45
88
  STRING
46
- : '\'' ( ESC_SEQ | ~('\\'|'"') )* '\''
89
+ : '\'' ( ESC_SEQ | ~('\\'|'\'') )* '\''
47
90
  ;
48
91
 
49
- WHITE : ' '* ;
92
+ WHITE : ' '+ ;
50
93
  fragment
51
94
  HEX_DIGIT : ('0'..'9'|'a'..'f'|'A'..'F') ;
52
95
 
53
96
  fragment
54
97
  ESC_SEQ
55
- : '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\')
98
+ : '\\' ('b'|'t'|'n'|'f'|'r'|'\''|'\\')
56
99
  | UNICODE_ESC
57
100
  | OCTAL_ESC
58
101
  ;
@@ -44,8 +44,9 @@ public class Command {
44
44
 
45
45
  public Result execute() {
46
46
  final Action action = InstrumentationBackend.actions.lookup(getCommand());
47
-
48
- if ( Looper.getMainLooper().getThread() != Thread.currentThread()) {
47
+ return action.execute(getArguments());
48
+ /*
49
+ if ( Looper.getMainLooper().getThread() == Thread.currentThread()) {
49
50
  return action.execute(getArguments());
50
51
  }
51
52
 
@@ -57,7 +58,7 @@ public class Command {
57
58
  }
58
59
  });
59
60
  return result.get();
60
-
61
+ */
61
62
  }
62
63
 
63
64
  }
@@ -0,0 +1,95 @@
1
+ package sh.calaba.instrumentationbackend;
2
+
3
+ import java.io.CharArrayWriter;
4
+ import java.io.IOException;
5
+ import java.io.PrintWriter;
6
+ import java.util.Collections;
7
+ import java.util.HashMap;
8
+ import java.util.List;
9
+ import java.util.Map;
10
+
11
+ import sh.calaba.org.codehaus.jackson.map.ObjectMapper;
12
+
13
+ /**
14
+ * Represents a response in the Frankly protocol.
15
+ * This protocol is a JSON over HTTP protocol which is
16
+ * used across Calabash iOS, Calabash Android and Frank.
17
+ * @author krukow
18
+ * @see https://github.com/moredip/Frank/blob/master/doc/frankly.md
19
+ *
20
+ */
21
+ public class FranklyResult {
22
+
23
+ final boolean success;
24
+ final String reason;
25
+ final String detail;
26
+ @SuppressWarnings("rawtypes")
27
+ final List results;
28
+
29
+
30
+ @SuppressWarnings({ "rawtypes" })
31
+ public FranklyResult(boolean success, List results, String reason,
32
+ String detail) {
33
+ super();
34
+ this.success = success;
35
+ this.results = results;
36
+ this.reason = reason;
37
+ this.detail = detail;
38
+ }
39
+
40
+ public static FranklyResult fromThrowable(Throwable t) {
41
+ CharArrayWriter caw = new CharArrayWriter();
42
+ t.printStackTrace(new PrintWriter(caw));
43
+ return new FranklyResult(false,Collections.EMPTY_LIST,t.getMessage(),caw.toString());
44
+ }
45
+
46
+ public static FranklyResult emptyResult() {
47
+ return new FranklyResult(true,Collections.EMPTY_LIST,null,null);
48
+ }
49
+
50
+ public static FranklyResult failedResult(String message,String detail) {
51
+ return new FranklyResult(false,Collections.EMPTY_LIST,message,detail);
52
+ }
53
+
54
+ public String asJson() {
55
+ ObjectMapper mapper = new ObjectMapper();
56
+
57
+ try {
58
+ return mapper.writeValueAsString(asMap());
59
+ } catch (IOException e) {
60
+ throw new RuntimeException("Could not convert result to json", e);
61
+ }
62
+ }
63
+
64
+ public Map<String,Object> asMap()
65
+ {
66
+ Map<String,Object> result = new HashMap<String, Object>();
67
+ result.put("outcome", this.success ? "SUCCESS" : "ERROR");
68
+
69
+ if (this.success)
70
+ {
71
+ result.put("results",this.results);
72
+ }
73
+ else
74
+ {
75
+ result.put("reason", this.reason);
76
+ if (this.detail != null)
77
+ {
78
+ result.put("detail", this.detail);
79
+ }
80
+ }
81
+ return result;
82
+ }
83
+
84
+ @Override
85
+ public String toString()
86
+ {
87
+ return "FranklyResult [success=" + success + ", reason=" + reason
88
+ + ", details=" + detail + ", results=" + results + "]";
89
+ }
90
+
91
+ @SuppressWarnings("rawtypes")
92
+ public static FranklyResult successResult(List result) {
93
+ return new FranklyResult(true, result, null,null);
94
+ }
95
+ }
@@ -22,7 +22,13 @@ public class Result {
22
22
  this.success = success;
23
23
  this.message = message;
24
24
  }
25
-
25
+
26
+ public Result(boolean success, List<String> messages) {
27
+ this.success = success;
28
+ this.message = null;
29
+ this.bonusInformation = messages;
30
+ }
31
+
26
32
  public String getMessage() {
27
33
  return message;
28
34
  }
@@ -14,13 +14,13 @@ import java.util.concurrent.locks.Lock;
14
14
  import java.util.concurrent.locks.ReentrantLock;
15
15
 
16
16
  import sh.calaba.instrumentationbackend.Command;
17
+ import sh.calaba.instrumentationbackend.FranklyResult;
17
18
  import sh.calaba.instrumentationbackend.InstrumentationBackend;
18
19
  import sh.calaba.instrumentationbackend.Result;
19
20
  import sh.calaba.instrumentationbackend.query.Query;
20
21
  import sh.calaba.instrumentationbackend.query.QueryResult;
21
22
  import sh.calaba.org.codehaus.jackson.map.DeserializationConfig.Feature;
22
23
  import sh.calaba.org.codehaus.jackson.map.ObjectMapper;
23
- import sh.calaba.org.codehaus.jackson.type.TypeReference;
24
24
  import android.graphics.Bitmap;
25
25
  import android.util.Log;
26
26
  import android.view.View;
@@ -75,6 +75,7 @@ public class HttpServer extends NanoHTTPD {
75
75
  return new NanoHTTPD.Response(HTTP_OK, MIME_HTML, "pong");
76
76
 
77
77
  } else if (uri.endsWith("/map")) {
78
+ FranklyResult errorResult = null;
78
79
  try {
79
80
  String commandString = params.getProperty("json");
80
81
  ObjectMapper mapper = new ObjectMapper();
@@ -85,39 +86,23 @@ public class HttpServer extends NanoHTTPD {
85
86
  String methodName = (String) op.get("method_name");
86
87
  List arguments = (List) op.get("arguments");
87
88
 
89
+ //For now we only support query and query_all
90
+ //query_all includes also invisible views, while query filters them
91
+ boolean includeInVisible = "query_all".equals(methodName);
88
92
 
89
93
 
90
-
91
-
92
- System.out.println(methodName);
93
- System.out.println(uiQuery);
94
- System.out.println(arguments);
95
-
96
- QueryResult queryResult = new Query(uiQuery,arguments).execute();
97
-
94
+ List queryResult = new Query(uiQuery,arguments).executeQuery();
98
95
 
99
- return new NanoHTTPD.Response(HTTP_OK, "application/json;charset=utf-8",
100
- queryResult.asJson());
101
- } catch (IOException e) {
102
- // TODO Auto-generated catch block
96
+ return new NanoHTTPD.Response(HTTP_OK, "application/json;charset=utf-8",
97
+ FranklyResult.successResult(queryResult).asJson());
98
+ } catch (Exception e ) {
103
99
  e.printStackTrace();
104
- }
105
-
100
+ errorResult = FranklyResult.fromThrowable(e);
101
+ }
102
+ return new NanoHTTPD.Response(HTTP_OK, "application/json;charset=utf-8", errorResult.asJson());
106
103
  } else if (uri.endsWith("/query")) {
107
- try {
108
- String commandString = params.getProperty("json");
109
- ObjectMapper mapper = new ObjectMapper();
110
- Map<String, String> command = mapper.readValue(commandString,
111
- new TypeReference<Map<String, String>>() {
112
- });
113
- QueryResult result = new Query(command.get("query")).execute();
114
- return new NanoHTTPD.Response(HTTP_OK, MIME_HTML,
115
- result.asJson());
116
- } catch (IOException e) {
117
- e.printStackTrace();
118
- return new Response(HTTP_INTERNALERROR, MIME_PLAINTEXT,
119
- "Could not parse arguments as JSON");
120
- }
104
+ return new Response(HTTP_BADREQUEST, MIME_PLAINTEXT,
105
+ "/query endpoint is discontinued - use /map with operation query");
121
106
  } else if (uri.endsWith("/kill")) {
122
107
  lock.lock();
123
108
  try {
@@ -0,0 +1,19 @@
1
+ package sh.calaba.instrumentationbackend.actions.activity;
2
+
3
+ import sh.calaba.instrumentationbackend.InstrumentationBackend;
4
+ import sh.calaba.instrumentationbackend.Result;
5
+ import sh.calaba.instrumentationbackend.actions.Action;
6
+
7
+ public class FinishOpenedActivities implements Action {
8
+
9
+ @Override
10
+ public Result execute(String... args) {
11
+ InstrumentationBackend.solo.finishOpenedActivities();
12
+ return Result.successResult();
13
+ }
14
+
15
+ @Override
16
+ public String key() {
17
+ return "finish_opened_activities";
18
+ }
19
+ }
@@ -0,0 +1,31 @@
1
+ package sh.calaba.instrumentationbackend.actions.activity;
2
+
3
+ import java.util.ArrayList;
4
+
5
+ import sh.calaba.instrumentationbackend.InstrumentationBackend;
6
+ import sh.calaba.instrumentationbackend.Result;
7
+ import sh.calaba.instrumentationbackend.actions.Action;
8
+ import android.app.Activity;
9
+
10
+ public class GetOpenedActivities implements Action {
11
+
12
+ @Override
13
+ public Result execute(String... args) {
14
+ final ArrayList<Activity> activities = InstrumentationBackend.solo
15
+ .getAllOpenedActivities();
16
+ final ArrayList<String> opened = new ArrayList<String>(
17
+ activities.size());
18
+
19
+ for (final Activity activity : activities) {
20
+ opened.add(activity.getClass().getSimpleName());
21
+ }
22
+
23
+ // opened is attached to bonusInformation
24
+ return new Result(true, opened);
25
+ }
26
+
27
+ @Override
28
+ public String key() {
29
+ return "get_opened_activities";
30
+ }
31
+ }
@@ -0,0 +1,67 @@
1
+ package sh.calaba.instrumentationbackend.actions.activity;
2
+
3
+ import java.util.ArrayList;
4
+
5
+ import android.app.Activity;
6
+ import android.view.KeyEvent;
7
+ import sh.calaba.instrumentationbackend.InstrumentationBackend;
8
+ import sh.calaba.instrumentationbackend.Result;
9
+ import sh.calaba.instrumentationbackend.actions.Action;
10
+ import sh.calaba.instrumentationbackend.actions.Actions;
11
+
12
+ public class GoBackToActivity implements Action {
13
+
14
+ @Override
15
+ public Result execute(String... args) {
16
+
17
+ if (args == null) {
18
+ return Result
19
+ .failedResult("Target activity name must not be null.");
20
+ }
21
+
22
+ if (args.length != 1) {
23
+ return Result.failedResult("Must pass exactly one argument.");
24
+ }
25
+
26
+ if (args[0].trim().length() == 0) {
27
+ return Result.failedResult("Argument must not be whitespace.");
28
+ }
29
+
30
+ final String targetActivityName = args[0];
31
+
32
+ final ArrayList<Activity> activities = InstrumentationBackend.solo
33
+ .getAllOpenedActivities();
34
+ boolean success = false;
35
+
36
+ final ArrayList<String> opened = new ArrayList<String>(
37
+ activities.size());
38
+
39
+ for (final Activity activity : activities) {
40
+ final String name = activity.getClass().getSimpleName();
41
+ if (name.contentEquals(targetActivityName)) {
42
+ success = true;
43
+ }
44
+ opened.add(name);
45
+ }
46
+
47
+ if (!success) {
48
+ return new Result(false, opened);
49
+ }
50
+
51
+ while (!InstrumentationBackend.solo.getCurrentActivity().getClass()
52
+ .getSimpleName().contentEquals(targetActivityName)) {
53
+ try {
54
+ Actions.parentInstrumentation
55
+ .sendKeyDownUpSync(KeyEvent.KEYCODE_BACK);
56
+ } catch (Exception exception) {
57
+ }
58
+ }
59
+
60
+ return new Result(true, opened);
61
+ }
62
+
63
+ @Override
64
+ public String key() {
65
+ return "go_back_to_activity";
66
+ }
67
+ }
@@ -0,0 +1,28 @@
1
+ package sh.calaba.instrumentationbackend.actions.gestures;
2
+
3
+ import sh.calaba.instrumentationbackend.InstrumentationBackend;
4
+ import sh.calaba.instrumentationbackend.Result;
5
+ import sh.calaba.instrumentationbackend.actions.Action;
6
+
7
+ public class DragCoordinates implements Action {
8
+
9
+ @Override
10
+ public Result execute(String... args) {
11
+
12
+ Float fromX = new Float(args[0]);
13
+ Float fromY = new Float(args[1]);
14
+ Float toX = new Float(args[2]);
15
+ Float toY = new Float(args[3]);
16
+ Integer stepCount = 40;
17
+
18
+ InstrumentationBackend.solo.drag(fromX, toX, fromY, toY, stepCount);
19
+
20
+ return Result.successResult();
21
+ }
22
+
23
+ @Override
24
+ public String key() {
25
+ return "drag_coordinates";
26
+ }
27
+
28
+ }
@@ -1,5 +1,6 @@
1
1
  package sh.calaba.instrumentationbackend.actions.gestures;
2
2
 
3
+ import android.util.DisplayMetrics;
3
4
  import sh.calaba.instrumentationbackend.InstrumentationBackend;
4
5
  import sh.calaba.instrumentationbackend.Result;
5
6
  import sh.calaba.instrumentationbackend.actions.Action;
@@ -11,13 +12,18 @@ public class Swipe implements Action {
11
12
  @Override
12
13
  public Result execute(String... args) {
13
14
  String direction = args[0];
14
- if(direction.equalsIgnoreCase("left")) {
15
- InstrumentationBackend.solo.scrollToSide(Solo.LEFT);
16
- } else {
17
- InstrumentationBackend.solo.scrollToSide(Solo.RIGHT);
18
15
 
16
+ if (args.length == 1) {
17
+ if(direction.equalsIgnoreCase("left")) {
18
+ InstrumentationBackend.solo.scrollToSide(Solo.LEFT);
19
+ return Result.successResult();
20
+ } else if(direction.equalsIgnoreCase("right")) {
21
+ InstrumentationBackend.solo.scrollToSide(Solo.RIGHT);
22
+ return Result.successResult();
23
+ }
24
+ return Result.failedResult("Invalid direction to swipe: " + direction);
19
25
  }
20
- return Result.successResult();
26
+ return Result.failedResult("You must provide a direction. Either 'left' or 'right'");
21
27
  }
22
28
 
23
29
  @Override
@@ -10,6 +10,8 @@ import android.location.Location;
10
10
  import android.location.LocationManager;
11
11
  import android.location.LocationProvider;
12
12
 
13
+ import java.lang.reflect.Method;
14
+
13
15
 
14
16
  public class FakeGPSLocation implements Action {
15
17
 
@@ -73,15 +75,22 @@ public class FakeGPSLocation implements Action {
73
75
 
74
76
  private void setLocation(LocationManager locationManager, String locationProvider, double latitude, double longitude) {
75
77
 
76
- //locationManager.clearTestProviderLocation(locationProvider);
77
-
78
78
  Location location = new Location(locationProvider);
79
79
  location.setLatitude(latitude);
80
80
  location.setLongitude(longitude);
81
81
  location.setAccuracy(1);
82
82
  location.setTime(System.currentTimeMillis());
83
83
 
84
- locationManager.setTestProviderLocation(locationProvider, location);
84
+ try {
85
+ Method makeComplete = Location.class.getMethod("makeComplete");
86
+ if (makeComplete != null) {
87
+ makeComplete.invoke(location);
88
+ }
89
+ } catch (Exception e) {
90
+ //Method only available in Jelly Bean
91
+ }
92
+
93
+ locationManager.setTestProviderLocation(locationProvider, location);
85
94
  }
86
95
 
87
96
  public void finish() {
@@ -93,13 +102,7 @@ public class FakeGPSLocation implements Action {
93
102
  public String key() {
94
103
  return "set_gps_coordinates";
95
104
  }
96
-
97
- /**
98
- * Causes error if Device does not support given provider
99
- *
100
- * @param provider
101
- * @return
102
- */
105
+
103
106
  private boolean doesDeviceProvideGPS() {
104
107
  LocationManager locationManager = (LocationManager) InstrumentationBackend.solo.getCurrentActivity().getSystemService(Context.LOCATION_SERVICE);
105
108
  if (locationManager.getProvider(LocationManager.GPS_PROVIDER) == null) {
@@ -0,0 +1,24 @@
1
+ package sh.calaba.instrumentationbackend.actions.softkey;
2
+
3
+
4
+ import com.jayway.android.robotium.solo.Solo;
5
+
6
+ import sh.calaba.instrumentationbackend.InstrumentationBackend;
7
+ import sh.calaba.instrumentationbackend.Result;
8
+ import sh.calaba.instrumentationbackend.actions.Action;
9
+
10
+
11
+ public class LeftKey implements Action {
12
+
13
+ @Override
14
+ public Result execute(String... args) {
15
+ InstrumentationBackend.solo.sendKey(Solo.LEFT);
16
+ return Result.successResult();
17
+ }
18
+
19
+ @Override
20
+ public String key() {
21
+ return "send_key_left";
22
+ }
23
+
24
+ }
@@ -0,0 +1,24 @@
1
+ package sh.calaba.instrumentationbackend.actions.softkey;
2
+
3
+
4
+ import com.jayway.android.robotium.solo.Solo;
5
+
6
+ import sh.calaba.instrumentationbackend.InstrumentationBackend;
7
+ import sh.calaba.instrumentationbackend.Result;
8
+ import sh.calaba.instrumentationbackend.actions.Action;
9
+
10
+
11
+ public class RightKey implements Action {
12
+
13
+ @Override
14
+ public Result execute(String... args) {
15
+ InstrumentationBackend.solo.sendKey(Solo.RIGHT);
16
+ return Result.successResult();
17
+ }
18
+
19
+ @Override
20
+ public String key() {
21
+ return "send_key_right";
22
+ }
23
+
24
+ }
@@ -0,0 +1,24 @@
1
+ package sh.calaba.instrumentationbackend.actions.softkey;
2
+
3
+
4
+ import com.jayway.android.robotium.solo.Solo;
5
+
6
+ import sh.calaba.instrumentationbackend.InstrumentationBackend;
7
+ import sh.calaba.instrumentationbackend.Result;
8
+ import sh.calaba.instrumentationbackend.actions.Action;
9
+
10
+
11
+ public class UpKey implements Action {
12
+
13
+ @Override
14
+ public Result execute(String... args) {
15
+ InstrumentationBackend.solo.sendKey(Solo.UP);
16
+ return Result.successResult();
17
+ }
18
+
19
+ @Override
20
+ public String key() {
21
+ return "send_key_up";
22
+ }
23
+
24
+ }
@@ -0,0 +1,31 @@
1
+ package sh.calaba.instrumentationbackend.actions.version;
2
+
3
+ import sh.calaba.instrumentationbackend.Result;
4
+ import sh.calaba.instrumentationbackend.actions.Action;
5
+
6
+
7
+ /**
8
+ * Generated Code.
9
+ * Do not edit.
10
+ *
11
+ */
12
+ public class Version implements Action {
13
+
14
+ /******
15
+ * Generate Version Number
16
+ * DO NOT EDIT
17
+ *
18
+ */
19
+ public static final String VERSION="####VERSION####";
20
+
21
+ @Override
22
+ public Result execute(String... args) {
23
+ return new Result(true,VERSION);
24
+ }
25
+
26
+ @Override
27
+ public String key() {
28
+ return "version";
29
+ }
30
+
31
+ }