testautoa 0.4.0 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
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
+ }