summaryrefslogtreecommitdiffstats
path: root/docs/html/training/location/location-testing.jd
diff options
context:
space:
mode:
authorJoe Malin <jmalin@google.com>2013-09-12 10:48:38 -0700
committerAndroid Git Automerger <android-git-automerger@android.com>2013-09-12 10:48:38 -0700
commit1e3a02030949df8c1d1f37a37fc23f25357632f0 (patch)
tree6f0b71a726664f957343e235ff65fe9c11e6b4aa /docs/html/training/location/location-testing.jd
parent4c6cde545c5d2e76d9ba8ef926399463369da7e7 (diff)
parent6f9e30e3b76f564db3a56de24e4efdc5a64455f0 (diff)
downloadframeworks_base-1e3a02030949df8c1d1f37a37fc23f25357632f0.zip
frameworks_base-1e3a02030949df8c1d1f37a37fc23f25357632f0.tar.gz
frameworks_base-1e3a02030949df8c1d1f37a37fc23f25357632f0.tar.bz2
am 6f9e30e3: Merge "Android Training: Add Location Testing Lesson" into jb-mr2-docs
* commit '6f9e30e3b76f564db3a56de24e4efdc5a64455f0': Android Training: Add Location Testing Lesson
Diffstat (limited to 'docs/html/training/location/location-testing.jd')
-rw-r--r--docs/html/training/location/location-testing.jd371
1 files changed, 371 insertions, 0 deletions
diff --git a/docs/html/training/location/location-testing.jd b/docs/html/training/location/location-testing.jd
new file mode 100644
index 0000000..e36bac1
--- /dev/null
+++ b/docs/html/training/location/location-testing.jd
@@ -0,0 +1,371 @@
+page.title=Testing Using Mock Locations
+
+trainingnavtop=true
+@jd:body
+
+<div id="tb-wrapper">
+<div id="tb">
+
+<!-- table of contents -->
+<h2>This lesson teaches you to</h2>
+<ol>
+ <li><a href="#TurnOnMockMode">Turn On Mock Mode</a></li>
+ <li><a href="#SendMockLocations">Send Mock Locations</a></li>
+ <li><a href="RunProvider">Run the Mock Location Provider App</a></li>
+ <li><a href="#TestingTips">Testing Tips</a>
+</ol>
+
+<h2>You should also read</h2>
+<ul>
+ <li><a href="receive-location-updates.html">Receiving Location Updates</a></li>
+ <li><a href="geofencing.html">Creating and Monitoring Geofences</a></li>
+ <li><a href="{@docRoot}guide/components/services.html">Services</a></li>
+ <li><a href="{@docRoot}guide/components/processes-and-threads.html">Processes and Threads</a>
+</ul>
+
+<h2>Example Test App</h2>
+
+<div class="download-box">
+ <a href="http://developer.android.com/shareables/training/LocationProvider.zip" class="button"
+ >Download the sample</a>
+ <p class="filename">LocationProvider.zip</p>
+</div>
+
+</div>
+</div>
+<p>
+ To test a location-aware app that uses Location Services, you don't need to move your device
+ from place to place to generate location data. Instead, you can put Location Services into mock
+ mode. In this mode, you can send mock {@link android.location.Location} objects to
+ Location Services, which then sends them to location clients. In mock mode, Location Services
+ also uses mock {@link android.location.Location} objects to trigger geofences.
+</p>
+<p>
+ Using mock locations has several advantages:
+</p>
+<ul>
+ <li>
+ Mock locations allow you to create specific mock data, instead of trying to approximate
+ data by moving an actual device.
+ </li>
+ <li>
+ Since mock locations come from Location Services, they test every part of your
+ location-handling code. In addition, since you can send the mock data from outside your
+ production app, you don't have to disable or remove test code before you publish.
+ </li>
+ <li>
+ Since you don't have to generate test locations by moving a device, you can test an app
+ using the emulator.
+ </li>
+</ul>
+<p>
+ The best way to use mock locations is to send them from a separate mock location provider app.
+ This lesson includes a provider app that you can download and use to test your own software.
+ Modify the provider app as necessary to suit your own needs. Some ideas for providing test data
+ to the app are listed in the section <a href="TestData">Managing test data</a>.
+</p>
+<p>
+ The remainder of this lesson shows you how to turn on mock mode and use a location client to
+ send mock locations to Location Services.
+</p>
+<p class="note">
+ <strong>Note:</strong> Mock locations have no effect on the activity recognition algorithm used
+ by Location Services. To learn more about activity recognition, see the lesson
+ <a href="activity-recognition.html">Recognizing the User's Current Activity</a>.
+</p>
+<!--
+ Create a Test App
+ -->
+<h2 id="TurnOnMockMode">Turn On Mock Mode</h2>
+<p>
+ To send mock locations to Location Services in mock mode, a test app must request the permission
+ {@link android.Manifest.permission#ACCESS_MOCK_LOCATION}. In addition, you must enable mock
+ locations on the test device using the option <b>Enable mock locations</b>. To learn how to
+ enable mock locations on the device, see
+ <a href="{@docRoot}tools/device.html#setting-up">Setting up a Device for Development</a>.
+</p>
+<p>
+ To turn on mock mode in Location Services, start by connecting a location client to Location
+ Services, as described in the lesson
+ <a href="retrieve-current.html">Retrieving the Current Location</a>.
+ Next, call the method
+<code><a href="{@docRoot}reference/com/google/android/gms/location/LocationClient.html#setMockMode(boolean)">LocationClient.setMockMode(true)</a></code>.
+ Once you call this method, Location Services turns off its internal location providers and only
+ sends out the mock locations you provide it. The following snippet shows you how to call
+<code><a href="{@docRoot}reference/com/google/android/gms/location/LocationClient.html#setMockMode(boolean)">LocationClient.setMockMode(true)</a></code>:
+</p>
+<pre>
+ // Define a LocationClient object
+ public LocationClient mLocationClient;
+ ...
+ // Connect to Location Services
+ mLocationClient.connect();
+ ...
+ // When the location client is connected, set mock mode
+ mLocationClinet.setMockMode(true);
+</pre>
+<p>
+ Once you have connected the location client to Location Services, you must keep it connected
+ until you finish sending out mock locations. Once you call
+<code><a href="{@docRoot}reference/com/google/android/gms/location/LocationClient.html#disconnect()">LocationClient.disconnect()</a></code>,
+ Location Services returns to using its internal location providers. To turn off mock mode while
+ the location client is connected, call
+<code><a href="{@docRoot}reference/com/google/android/gms/location/LocationClient.html#setMockMode(boolean)">LocationClient.setMockMode(false)</a></code>.
+</p>
+<h2 id="SendMockLocations">Send Mock Locations</h2>
+<p>
+ Once you have set mock mode, you can create mock {@link android.location.Location} objects and
+ send them to Location Services. In turn, Location Services sends these mock
+ {@link android.location.Location} objects to connected location clients. Location Services also
+ uses the mock {@link android.location.Location} objects to control geofence triggering.
+</p>
+<p>
+ To create a new mock {@link android.location.Location}, create a new
+ {@link android.location.Location} object using your test data. Always set the provider
+ value to {@code flp}, which is the code that Location Services puts into the
+ {@link android.location.Location} objects it sends out. The following snippet shows you how
+ to create a new mock {@link android.location.Location}:
+</p>
+<pre>
+ private static final String PROVIDER = "flp";
+ private static final double LAT = 37.377166;
+ private static final double LNG = -122.086966;
+ private static final float ACCURACY = 3.0f;
+ ...
+ /*
+ * From input arguments, create a single Location with provider set to
+ * "flp"
+ */
+ public Location createLocation(double lat, double lng, float accuracy) {
+ // Create a new Location
+ Location newLocation = new Location(PROVIDER);
+ newLocation.setLatitude(lat);
+ newLocation.setLongitude(lng);
+ newLocation.setAccuracy(accuracy);
+ return newLocation;
+ }
+ ...
+ // Example of creating a new Location from test data
+ Location testLocation = createLocation(LAT, LNG, ACCURACY);
+</pre>
+<p>
+ In mock mode, to send a mock location to Location Services call the method
+<code><a href="{@docRoot}reference/com/google/android/gms/location/LocationClient.html#setMockLocation(android.location.Location)">LocationClient.setMockLocation()</a></code>.
+ For example:
+</p>
+<pre>
+ mLocationClient.setMockLocation(testLocation);
+</pre>
+<p>
+ Location Services sets this mock location as the current location, and this location is sent
+ out as the next location update. If this new mock location moves across a geofence boundary,
+ Location Services triggers the geofence.
+</p>
+<!--
+ Run the Mock Location Provider
+ -->
+<h2 id="RunProvider">Run the Mock Location Provider App</h2>
+<p>
+ This section contains a brief overview of the mock location provider sample app
+ (available for download above) and gives you directions for testing an app using the sample app.
+</p>
+<h3>Overview</h3>
+<p>
+ The mock location provider app included with this lesson sends mock
+ {@link android.location.Location} objects to Location Services from a background thread running
+ in a started {@link android.app.Service}. By using a started service, the provider app is able
+ to keep running even if the app's main {@link android.app.Activity} is destroyed because of
+ a configuration change or other system event. By using a background thread, the service is able
+ to perform a long-running test without blocking the UI thread.
+</p>
+<p>
+ The {@link android.app.Activity} that starts when you run the provider app allows you to
+ send test parameters to the {@link android.app.Service} and control the type of test you want.
+ You have the following options:
+</p>
+<dl>
+ <dt>
+ Pause before test
+ </dt>
+ <dd>
+ The number of seconds to wait before the provider app starts sending test data to Location
+ Services. This interval allows you to switch from the provider app to the app under test
+ before the testing actually starts.
+ </dd>
+ <dt>
+ Send interval
+ </dt>
+ <dd>
+ The number of seconds that the provider app waits before it sends another mock location to
+ Location Services. See the section <a href="#TestingTips">Testing Tips</a> to learn more
+ about setting the send interval.
+ </dd>
+ <dt>
+ Run once
+ </dt>
+ <dd>
+ Switch from normal mode to mock mode, run through the test data once, switch back to
+ normal mode, and then kill the {@link android.app.Service}.
+ </dd>
+ <dt>
+ Run continuously
+ </dt>
+ <dd>
+ Switch from normal mode to mock mode, then run through the test data indefinitely. The
+ background thread and the started {@link android.app.Service} continue to run, even if the
+ main {@link android.app.Activity} is destroyed.
+ </dd>
+ <dt>
+ Stop test
+ </dt>
+ <dd>
+ If a continuous test is in progress, stop it; otherwise, return a warning message. The
+ started {@link android.app.Service} switches from mock mode to normal mode and then
+ stops itself. This also stops the background thread.
+ </dd>
+</dl>
+<p>
+ Besides the options, the provider app has two status displays:
+</p>
+<dl>
+ <dt>
+ App status
+ </dt>
+ <dd>
+ Displays messages related to the lifecycle of the provider app.
+ </dd>
+ <dt>
+ Connection status
+ </dt>
+ <dd>
+ Displays messages related to the state of the location client connection.
+ </dd>
+</dl>
+<p>
+ While the started {@link android.app.Service} is running, it also posts notifications with the
+ testing status. These notifications allow you to see status updates even if the app is not in
+ the foreground. When you click on a notification, the main {@link android.app.Activity} of the
+ provider app returns to the foreground.
+</p>
+<h3>Test using the mock location provider app</h3>
+<p>
+ To test mock location data coming from the mock location provider app:
+</p>
+<ol>
+ <li>
+ Install the mock location provider app on a device that has Google Play services installed.
+ Location Services is part of Google Play services.
+ </li>
+ <li>
+ On the device, enable mock locations. To learn how to do this, see the topic
+ <a href="{@docRoot}tools/device.html#setting-up">Setting up a Device for Development</a>.
+ </li>
+ <li>
+ Start the provider app from the Launcher, then choose the options you want from the main
+ screen.
+ </li>
+ <li>
+ Unless you've removed the pause interval feature, the mock location provider app
+ pauses for a few seconds, and then starts sending mock location data to Location
+ Services.
+ </li>
+ <li>
+ Run the app you want to test. While the mock location provider app is running, the app
+ you're testing receives mock locations instead of real locations.
+ </li>
+ <li>
+ If the provider app is in the midst of a continuous test, you can switch back to real
+ locations by clicking <b>Stop test</b>. This forces the started {@link android.app.Service}
+ to turn off mock mode and then stop itself. When the service stops itself, the background
+ thread is also destroyed.
+ </li>
+
+</ol>
+<h2 id="TestingTips">Testing Tips</h2>
+<p>
+ The following sections contain tips for creating mock location data and using the data with a
+ mock location provider app.
+</p>
+<h3>Choosing a send interval</h3>
+<p>
+ Each location provider that contributes to the fused location sent out by Location Services has
+ its own minimum update cycle. For example, the GPS provider can't send a new location more often
+ than once per second, and the Wi-Fi provider can't send a new location more often than once
+ every five seconds. These cycle times are handled automatically for real locations, but you
+ should account for them when you send mock locations. For example, you shouldn't send a new mock
+ location more than once per second. If you're testing indoor locations, which rely heavily on
+ the Wi-Fi provider, then you should consider using a send interval of five seconds.
+</p>
+<h3>Simulating speed</h3>
+<p>
+ To simulate the speed of an actual device, shorten or lengthen the distance between two
+ successive locations. For example, changing the location by 88 feet every second simulates
+ car travel, because this change works out to 60 miles an hour. In comparison, changing the
+ location by 1.5 feet every second simulates brisk walking, because this change works out to
+ 3 miles per hour.
+</p>
+<h3>Calculating location data</h3>
+<p>
+ By searching the web, you can find a variety of small programs that calculate a new set of
+ latitude and longitude coordinates from a starting location and a distance, as well as
+ references to formulas for calculating the distance between two points based on their latitude
+ and longitude. In addition, the {@link android.location.Location} class offers two methods for
+ calculating the distance between points:
+</p>
+<dl>
+ <dt>
+ {@link android.location.Location#distanceBetween distanceBetween()}
+ </dt>
+ <dd>
+ A static method that calculates the distance between two points specified by latitude and
+ longitude.
+ </dd>
+ <dt>
+ {@link android.location.Location#distanceTo distanceTo()}
+ </dt>
+ <dd>
+ For a given {@link android.location.Location}, returns the distance to another
+ {@link android.location.Location}.
+ </dd>
+</dl>
+<h3>Geofence testing</h3>
+<p>
+ When you test an app that uses geofence detection, use test data that reflects different modes
+ of travel, including walking, cycling, driving, and traveling by train. For a slow mode of
+ travel, make small changes in position between points. Conversely, for a fast mode of travel,
+ make a large change in position between points.
+</p>
+<h3 id="TestData">Managing test data</h3>
+<p>
+ The mock location provider app included with this lesson contains test latitude, longitude,
+ and accuracy values in the form of constants. You may want to consider other ways of organizing
+ data as well:
+</p>
+<dl>
+ <dt>
+ XML
+ </dt>
+ <dd>
+ Store location data in XML files that are including in the provider app. By separating the
+ data from the code, you facilitate changes to the data.
+ </dd>
+ <dt>
+ Server download
+ </dt>
+ <dd>
+ Store location data on a server and then have the provider app download it. Since the data
+ is completely separate from the app, you can change the data without having to rebuild the
+ app. You can also change the data on the server and have the changes reflected immediately
+ in the mock locations you're testing.
+ </dd>
+ <dt>
+ Recorded data
+ </dt>
+ <dd>
+ Instead of making up test data, write a utility app that records location data as you move
+ the device. Use the recorded data as your test data, or use the data to guide you in
+ developing test data. For example, record locations as you walk with a device, and then
+ create mock locations that have an appropriate change in latitude and longitude over
+ time.
+ </dd>
+</dl>