testautoa 0.4.0 → 0.4.1
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +7 -7
- data/bin/calabash-android +8 -1
- data/bin/calabash-android-build.rb +1 -1
- data/bin/calabash-android-console.rb +4 -4
- data/bin/calabash-android-run.rb +2 -10
- data/bin/testautoa +461 -0
- data/calabash-android.gemspec +3 -1
- data/features-skeleton/support/app_life_cycle_hooks.rb +0 -1
- data/irbrc +3 -1
- data/lib/calabash-android/helpers.rb +45 -17
- data/lib/calabash-android/lib/TestServer.apk +0 -0
- data/lib/calabash-android/lib/unsign.jar +0 -0
- data/lib/calabash-android/operations.rb +150 -66
- data/lib/calabash-android/steps/list_steps.rb +1 -1
- data/lib/calabash-android/steps/time_picker_steps.rb +1 -1
- data/lib/calabash-android/touch_helpers.rb +9 -0
- data/lib/calabash-android/version.rb +1 -1
- data/lib/calabash-android/wait_helpers.rb +93 -0
- data/test-server/AndroidManifest.xml +2 -0
- data/test-server/build.xml +1 -0
- data/test-server/instrumentation-backend/.classpath +0 -1
- data/test-server/instrumentation-backend/AndroidManifest.xml +1 -1
- data/test-server/instrumentation-backend/antlr/UIQuery.g +48 -5
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/Command.java +4 -3
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/FranklyResult.java +95 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/Result.java +7 -1
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/HttpServer.java +14 -29
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/activity/FinishOpenedActivities.java +19 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/activity/GetOpenedActivities.java +31 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/activity/GoBackToActivity.java +67 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/gestures/DragCoordinates.java +28 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/gestures/Swipe.java +11 -5
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/location/FakeGPSLocation.java +13 -10
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/softkey/LeftKey.java +24 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/softkey/RightKey.java +24 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/softkey/UpKey.java +24 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/version/Version.java +31 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/CalabashChromeClient.java +131 -36
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/DumpBodyHtml.java +38 -18
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/DumpHtml.java +38 -16
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/EnterTextByCssSelector.java +94 -66
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/ExecuteAsyncJavascript.java +55 -33
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/ExecuteJavascript.java +53 -31
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/JavaScriptOperation.java +44 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/PressByCssSelector.java +52 -27
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/QueryHelper.java +39 -32
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/ScrollTo.java +56 -41
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/SetPropertyByCssSelector.java +50 -25
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/SetText.java +19 -22
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/CompletedFuture.java +40 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/InvocationOperation.java +222 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/Operation.java +7 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/PropertyOperation.java +56 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/Query.java +151 -43
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/UIQuery.tokens +19 -12
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/UIQueryResultVoid.java +22 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ViewMapper.java +41 -11
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/antlr/UIQueryLexer.java +1010 -242
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/antlr/UIQueryParser.java +406 -98
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/BeginsWithRelation.java +45 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/ComparisonOperator.java +54 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/ContainsRelation.java +41 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/EndsWithRelation.java +42 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/LikeRelation.java +79 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/PartialFutureList.java +100 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryAST.java +1 -1
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryASTClassName.java +54 -25
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryASTPredicate.java +147 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryASTPredicateRelation.java +5 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryASTWith.java +153 -89
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryDirection.java +12 -2
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryEvaluator.java +58 -141
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryUtils.java +162 -7
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryVisibility.java +32 -0
- metadata +130 -97
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/Query.java +0 -24
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/Touch.java +0 -44
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/antlr/UIQuery.tokens +0 -10
- 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
|
-
|
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
|
}
|
data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/FranklyResult.java
ADDED
@@ -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 (
|
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
|
-
|
108
|
-
|
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.
|
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
|
-
|
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
|
+
}
|