calabash-android 0.4.0.pre6 → 0.4.0.pre7
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/calabash-android +7 -0
- data/bin/calabash-android-build.rb +1 -1
- data/bin/calabash-android-console.rb +1 -1
- data/bin/calabash-android-run.rb +1 -1
- data/calabash-android.gemspec +1 -0
- data/irbrc +2 -0
- data/lib/calabash-android/helpers.rb +4 -2
- data/lib/calabash-android/lib/TestServer.apk +0 -0
- data/lib/calabash-android/operations.rb +31 -22
- data/lib/calabash-android/version.rb +1 -1
- data/test-server/instrumentation-backend/.classpath +0 -1
- data/test-server/instrumentation-backend/antlr/UIQuery.g +11 -2
- 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 +15 -23
- 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/webview/CalabashChromeClient.java +136 -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 +54 -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 +201 -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 +144 -72
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/UIQuery.tokens +15 -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 +38 -11
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/antlr/UIQueryLexer.java +226 -109
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/antlr/UIQueryParser.java +237 -84
- 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 +26 -22
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryASTWith.java +170 -102
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryEvaluator.java +54 -155
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryUtils.java +97 -2
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryVisibility.java +32 -0
- metadata +27 -5
- 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/tests/sh/calaba/instrumentationbackend/query/tests/UIQueryTest.java +0 -134
data/bin/calabash-android
CHANGED
@@ -1,8 +1,15 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
3
|
require 'fileutils'
|
4
|
+
require 'rbconfig'
|
4
5
|
require 'calabash-android/helpers'
|
5
6
|
|
7
|
+
# for ruby 1.9.1 and earlier
|
8
|
+
unless defined? RbConfig.ruby
|
9
|
+
def RbConfig.ruby
|
10
|
+
File.join(RbConfig::CONFIG["bindir"], RbConfig::CONFIG["ruby_install_name"] + RbConfig::CONFIG["EXEEXT"])
|
11
|
+
end
|
12
|
+
end
|
6
13
|
|
7
14
|
require File.join(File.dirname(__FILE__), "calabash-android-helpers")
|
8
15
|
require File.join(File.dirname(__FILE__), "calabash-android-generate")
|
@@ -18,7 +18,7 @@ def calabash_build(app)
|
|
18
18
|
FileUtils.cp(unsigned_test_apk, "TestServer.apk")
|
19
19
|
FileUtils.cp(File.join(File.dirname(__FILE__), '..', 'test-server/AndroidManifest.xml'), "AndroidManifest.xml")
|
20
20
|
|
21
|
-
unless system %Q{ruby -pi.bak -e "gsub(/#targetPackage#/, '#{package_name(app)}')" AndroidManifest.xml}
|
21
|
+
unless system %Q{"#{RbConfig.ruby}" -pi.bak -e "gsub(/#targetPackage#/, '#{package_name(app)}')" AndroidManifest.xml}
|
22
22
|
raise "Could not replace package name in manifest"
|
23
23
|
end
|
24
24
|
|
data/bin/calabash-android-run.rb
CHANGED
data/calabash-android.gemspec
CHANGED
data/irbrc
CHANGED
@@ -116,8 +116,10 @@ def fingerprint_from_apk(app_path)
|
|
116
116
|
end
|
117
117
|
|
118
118
|
def extract_md5_fingerprint(fingerprints)
|
119
|
-
if
|
120
|
-
|
119
|
+
if is_windows?
|
120
|
+
if fingerprints.encoding.name == "CP850"
|
121
|
+
fingerprints = fingerprints.gsub("\xA0".force_encoding("CP850"),"")
|
122
|
+
end
|
121
123
|
end
|
122
124
|
|
123
125
|
m = fingerprints.scan(/MD5\s*:\s*((?:\h\h:){15}\h\h)/).flatten
|
Binary file
|
@@ -13,7 +13,6 @@ module Calabash module Android
|
|
13
13
|
|
14
14
|
module Operations
|
15
15
|
|
16
|
-
|
17
16
|
def log(message)
|
18
17
|
$stdout.puts "#{Time.now.strftime("%Y-%m-%d %H:%M:%S")} - #{message}" if (ARGV.include? "-v" or ARGV.include? "--verbose")
|
19
18
|
end
|
@@ -29,6 +28,7 @@ module Operations
|
|
29
28
|
Then(txt)
|
30
29
|
end
|
31
30
|
end
|
31
|
+
|
32
32
|
def default_device
|
33
33
|
unless @default_device
|
34
34
|
@default_device = Device.new(self, ENV["ADB_DEVICE_ARG"], ENV["TEST_SERVER_PORT"], ENV["APP_PATH"], ENV["TEST_APP_PATH"])
|
@@ -36,6 +36,10 @@ module Operations
|
|
36
36
|
@default_device
|
37
37
|
end
|
38
38
|
|
39
|
+
def set_default_device(device)
|
40
|
+
@default_device = device
|
41
|
+
end
|
42
|
+
|
39
43
|
def performAction(action, *arguments)
|
40
44
|
default_device.perform_action(action, *arguments)
|
41
45
|
end
|
@@ -97,20 +101,15 @@ module Operations
|
|
97
101
|
end
|
98
102
|
|
99
103
|
def query(uiquery, *args)
|
100
|
-
|
101
|
-
|
102
|
-
if
|
103
|
-
|
104
|
-
JSON.parse(r["message"])
|
104
|
+
converted_args = []
|
105
|
+
args.each do |arg|
|
106
|
+
if arg.is_a?(Hash) and arg.count == 1
|
107
|
+
converted_args << {:method_name => arg.keys.first, :arguments => [ arg.values.first ]}
|
105
108
|
else
|
106
|
-
|
109
|
+
converted_args << arg
|
107
110
|
end
|
108
|
-
else
|
109
|
-
arguments = [*args]
|
110
|
-
operation = {"method_name"=>"query", "arguments" => arguments}
|
111
|
-
data = {"query" => uiquery, "operation" => operation}
|
112
|
-
JSON.parse(http("/map",data))
|
113
111
|
end
|
112
|
+
map(uiquery,:query,*converted_args)
|
114
113
|
end
|
115
114
|
|
116
115
|
def ni
|
@@ -134,10 +133,6 @@ module Operations
|
|
134
133
|
|
135
134
|
class Device
|
136
135
|
|
137
|
-
def make_default_device
|
138
|
-
@cucumber_world.default_device = self
|
139
|
-
end
|
140
|
-
|
141
136
|
def initialize(cucumber_world, serial, server_port, app_path, test_server_path)
|
142
137
|
@cucumber_world = cucumber_world
|
143
138
|
@serial = serial
|
@@ -320,8 +315,8 @@ module Operations
|
|
320
315
|
wake_up
|
321
316
|
end
|
322
317
|
|
323
|
-
env_options = {:target_package => options[:target_package] ||
|
324
|
-
:main_activity => options[:main_activity] ||
|
318
|
+
env_options = {:target_package => options[:target_package] || package_name(@app_path),
|
319
|
+
:main_activity => options[:main_activity] || main_activity(@app_path),
|
325
320
|
:debug => options[:debug] || false,
|
326
321
|
:class => options[:class] || "sh.calaba.instrumentationbackend.InstrumentationBackend"}
|
327
322
|
|
@@ -402,17 +397,20 @@ module Operations
|
|
402
397
|
end
|
403
398
|
|
404
399
|
def touch(uiquery,*args)
|
400
|
+
raise "Cannot touch nil" unless uiquery
|
401
|
+
|
405
402
|
if uiquery.instance_of? String
|
406
403
|
elements = query(uiquery, *args)
|
407
404
|
raise "No elements found" if elements.empty?
|
408
405
|
element = elements.first
|
409
406
|
else
|
410
407
|
element = uiquery
|
408
|
+
element = element.first if element.instance_of?(Array)
|
411
409
|
end
|
412
410
|
|
413
411
|
|
414
|
-
center_x = element["
|
415
|
-
center_y = element["
|
412
|
+
center_x = element["rect"]["center_x"]
|
413
|
+
center_y = element["rect"]["center_y"]
|
416
414
|
performAction("touch_coordinate", center_x, center_y)
|
417
415
|
end
|
418
416
|
|
@@ -527,8 +525,19 @@ module Operations
|
|
527
525
|
ni
|
528
526
|
end
|
529
527
|
|
530
|
-
def map(
|
531
|
-
|
528
|
+
def map(query, method_name, *method_args)
|
529
|
+
operation_map = {
|
530
|
+
:method_name => method_name,
|
531
|
+
:arguments => method_args
|
532
|
+
}
|
533
|
+
res = http("/map",
|
534
|
+
{:query => query, :operation => operation_map})
|
535
|
+
res = JSON.parse(res)
|
536
|
+
if res['outcome'] != 'SUCCESS'
|
537
|
+
screenshot_and_raise "map #{query}, #{method_name} failed because: #{res['reason']}\n#{res['details']}"
|
538
|
+
end
|
539
|
+
|
540
|
+
res['results']
|
532
541
|
end
|
533
542
|
|
534
543
|
def url_for( verb )
|
@@ -3,7 +3,6 @@
|
|
3
3
|
<classpathentry kind="src" path="src"/>
|
4
4
|
<classpathentry kind="src" path="gen"/>
|
5
5
|
<classpathentry kind="src" path="assets"/>
|
6
|
-
<classpathentry kind="src" path="tests"/>
|
7
6
|
<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
|
8
7
|
<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
|
9
8
|
<classpathentry kind="lib" path="libs/robotium-solo-3.6.jar"/>
|
@@ -35,13 +35,22 @@ query : expr (WHITE! expr)*
|
|
35
35
|
;
|
36
36
|
|
37
37
|
|
38
|
-
expr : (className | filter)
|
38
|
+
expr : (className | filter | visibility)
|
39
39
|
;
|
40
40
|
|
41
|
-
className : (NAME^ | QUALIFIED_NAME^);
|
41
|
+
className : (WILDCARD^ | NAME^ | QUALIFIED_NAME^);
|
42
|
+
|
43
|
+
WILDCARD : '*';
|
42
44
|
|
43
45
|
QUALIFIED_NAME : NAME ('.' NAME)+;
|
44
46
|
|
47
|
+
visibility : (ALL^ | VISIBLE^);
|
48
|
+
|
49
|
+
ALL : 'all';
|
50
|
+
|
51
|
+
VISIBLE : 'visible';
|
52
|
+
|
53
|
+
|
45
54
|
filter : NAME FILTER_COLON^ (INT | STRING | BOOL | NIL);
|
46
55
|
|
47
56
|
FILTER_COLON : ':'
|
@@ -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,32 +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
|
|
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);
|
92
|
+
|
93
|
+
|
94
|
+
List queryResult = new Query(uiQuery,arguments).executeQuery();
|
89
95
|
|
90
|
-
return new NanoHTTPD.Response(HTTP_OK, "application/json;charset=utf-8",
|
91
|
-
queryResult.asJson());
|
92
|
-
} catch (IOException e) {
|
93
|
-
e.printStackTrace();
|
96
|
+
return new NanoHTTPD.Response(HTTP_OK, "application/json;charset=utf-8",
|
97
|
+
FranklyResult.successResult(queryResult).asJson());
|
94
98
|
} catch (Exception e ) {
|
95
|
-
|
96
|
-
|
99
|
+
e.printStackTrace();
|
100
|
+
errorResult = FranklyResult.fromThrowable(e);
|
97
101
|
}
|
98
|
-
return new NanoHTTPD.Response(
|
102
|
+
return new NanoHTTPD.Response(HTTP_OK, "application/json;charset=utf-8", errorResult.asJson());
|
99
103
|
} else if (uri.endsWith("/query")) {
|
100
|
-
|
101
|
-
|
102
|
-
ObjectMapper mapper = new ObjectMapper();
|
103
|
-
Map<String, String> command = mapper.readValue(commandString,
|
104
|
-
new TypeReference<Map<String, String>>() {
|
105
|
-
});
|
106
|
-
QueryResult result = new Query(command.get("query")).executeInMainThread();
|
107
|
-
return new NanoHTTPD.Response(HTTP_OK, MIME_HTML,
|
108
|
-
result.asJson());
|
109
|
-
} catch (IOException e) {
|
110
|
-
e.printStackTrace();
|
111
|
-
return new Response(HTTP_INTERNALERROR, MIME_PLAINTEXT,
|
112
|
-
"Could not parse arguments as JSON");
|
113
|
-
}
|
104
|
+
return new Response(HTTP_BADREQUEST, MIME_PLAINTEXT,
|
105
|
+
"/query endpoint is discontinued - use /map with operation query");
|
114
106
|
} else if (uri.endsWith("/kill")) {
|
115
107
|
lock.lock();
|
116
108
|
try {
|
@@ -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) {
|