I am trying to get mock updates from FusedLocationProviderApi, but I cannot get it to work. This is my setup method in android test:
locationProvider = new LocationProvider(InstrumentationRegistry.getTargetContext().getApplicationContext(), settings);
locationProvider.googleApiClient.blockingConnect();
LocationServices.FusedLocationApi.setMockMode(locationProvider.googleApiClient, true);
InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
@Override
public void run() {
locationProvider.start();
}
});
while (!locationProvider.isReceivingLocationUpdates) {
Thread.sleep(10);
}
After this point, I would expect that any calls LocationServices.fusedLocationApi.setMockLocation(apiClient, location)would set the layout of the location that my listener would receive. Unfortunately, this is not so, and the listener was silent.
My reliable (or so I thought) method of setting a mock location is as follows:
private void setMockLocation(final Location location) throws Exception {
assertTrue(locationProvider.googleApiClient.isConnected());
assertTrue(locationProvider.isReceivingLocationUpdates);
final CountDownLatch countDownLatch = new CountDownLatch(1);
LocationServices.FusedLocationApi.setMockMode(locationProvider.googleApiClient, true)
.setResultCallback(new ResultCallback<Status>() {
@Override
public void onResult(Status status) {
assertTrue(status.isSuccess());
LocationServices.FusedLocationApi.setMockLocation(locationProvider.googleApiClient, location)
.setResultCallback(new ResultCallback<Status>() {
@Override
public void onResult(Status status) {
assertTrue(status.isSuccess());
countDownLatch.countDown();
}
});
}
});
assertTrue(countDownLatch.await(500, TimeUnit.MILLISECONDS));
}
, . . , ( , , , ). , , :
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
.