ShadowGeocoder.java revision 00acfbd3521893738d94b6f7726128ea32ab5c4f
106abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richardpackage com.xtremelabs.robolectric.shadows; 206abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard 306abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richardimport android.location.Address; 406abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richardimport android.location.Geocoder; 522c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.Implementation; 622c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.Implements; 706abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard 806abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richardimport java.io.IOException; 906abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richardimport java.util.ArrayList; 1006abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richardimport java.util.List; 1106abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richardimport java.util.Locale; 1206abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard 1300acfbd3521893738d94b6f7726128ea32ab5c4fpivotalimport static com.xtremelabs.robolectric.Robolectric.shadowOf; 1400acfbd3521893738d94b6f7726128ea32ab5c4fpivotal 1521b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin/** 1621b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin * A shadow for Geocoder that supports simulated responses and failures 1721b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin */ 1806abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard@SuppressWarnings({"UnusedDeclaration"}) 1906abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard@Implements(Geocoder.class) 2006abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richardpublic class ShadowGeocoder { 2106abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard private String addressLine1; 2206abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard private String city; 2306abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard private String state; 2406abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard private String zip; 2506abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard private String countryCode; 2606abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard private boolean wasCalled; 2706abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard private double lastLatitude; 2806abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard private double lastLongitude; 29b22dbaacb93d4360a5b7d9f2f19b7bae5f638861pivotal-jiwire private String lastLocationName; 3006abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard private double simulatedLatitude; 3106abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard private double simulatedLongitude; 3206abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard private boolean shouldSimulateGeocodeException; 3300acfbd3521893738d94b6f7726128ea32ab5c4fpivotal private boolean hasLatitude; 3400acfbd3521893738d94b6f7726128ea32ab5c4fpivotal private boolean hasLongitude; 3500acfbd3521893738d94b6f7726128ea32ab5c4fpivotal private boolean returnNoResults = false; 3606abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard 3706abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard @Implementation 3806abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard public List<Address> getFromLocation(double latitude, double longitude, int maxResults) throws IOException { 3906abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard wasCalled = true; 4006abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard this.lastLatitude = latitude; 4106abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard this.lastLongitude = longitude; 4206abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard if (shouldSimulateGeocodeException) { 4306abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard throw new IOException("Simulated geocode exception"); 4406abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard } 4500acfbd3521893738d94b6f7726128ea32ab5c4fpivotal Address address = makeAddress(); 4606abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard address.setAddressLine(0, addressLine1); 4706abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard address.setLocality(city); 4806abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard address.setAdminArea(state); 4906abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard address.setPostalCode(zip); 5006abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard address.setCountryCode(countryCode); 5106abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard return oneElementList(address); 5206abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard } 5306abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard 5406abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard @Implementation 5506abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard public List<Address> getFromLocationName(String locationName, int maxResults) throws IOException { 56b22dbaacb93d4360a5b7d9f2f19b7bae5f638861pivotal-jiwire this.lastLocationName = locationName; 5706abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard if (shouldSimulateGeocodeException) { 5806abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard throw new IOException("Simulated geocode exception"); 5906abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard } 6000acfbd3521893738d94b6f7726128ea32ab5c4fpivotal if (returnNoResults) { 6100acfbd3521893738d94b6f7726128ea32ab5c4fpivotal return new ArrayList<Address>(); 6200acfbd3521893738d94b6f7726128ea32ab5c4fpivotal } else { 6300acfbd3521893738d94b6f7726128ea32ab5c4fpivotal Address address = makeAddress(); 6400acfbd3521893738d94b6f7726128ea32ab5c4fpivotal address.setLatitude(simulatedLatitude); 6500acfbd3521893738d94b6f7726128ea32ab5c4fpivotal address.setLongitude(simulatedLongitude); 6600acfbd3521893738d94b6f7726128ea32ab5c4fpivotal return oneElementList(address); 6700acfbd3521893738d94b6f7726128ea32ab5c4fpivotal } 6800acfbd3521893738d94b6f7726128ea32ab5c4fpivotal } 6900acfbd3521893738d94b6f7726128ea32ab5c4fpivotal 7000acfbd3521893738d94b6f7726128ea32ab5c4fpivotal private Address makeAddress() { 7106abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard Address address = new Address(Locale.getDefault()); 7200acfbd3521893738d94b6f7726128ea32ab5c4fpivotal shadowOf(address).setSimulatedHasLatLong(hasLatitude, hasLongitude); 7300acfbd3521893738d94b6f7726128ea32ab5c4fpivotal return address; 7406abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard } 7506abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard 7621b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin /** 7721b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin * Sets up a simulated response for {@link #getFromLocation(double, double, int)} 7821b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin * 7940c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams * @param address the address for the response 8040c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams * @param city the city for the response 8140c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams * @param state the state for the response 8240c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams * @param zip the zip code for the response 8321b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin * @param countryCode the country code for the response 8421b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin */ 8506abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard public void setSimulatedResponse(String address, String city, String state, String zip, String countryCode) { 8606abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard this.addressLine1 = address; 8706abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard this.city = city; 8806abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard this.state = state; 8906abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard this.zip = zip; 9006abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard this.countryCode = countryCode; 9106abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard } 9206abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard 9321b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin 9421b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin /** 9521b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin * Sets up a simulated response for {@link #getFromLocationName(String, int)}} 9621b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin * 9721b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin * @param lat latitude for simulated response 9821b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin * @param lng longitude for simulated response 9921b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin */ 10021b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin public void setSimulatedLatLong(double lat, double lng) { 10121b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin this.simulatedLatitude = lat; 10221b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin this.simulatedLongitude = lng; 10321b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin } 10421b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin 10521b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin /** 10621b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin * Sets a flag to indicate whether or not {@link #getFromLocationName(String, int)} should throw an exception to 10721b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin * simulate a failure. 10821b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin * 10921b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin * @param shouldSimulateException whether or not an exception should be thrown from {@link #getFromLocationName(String, int)} 11021b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin */ 11106abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard public void setShouldSimulateGeocodeException(boolean shouldSimulateException) { 11206abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard this.shouldSimulateGeocodeException = true; 11306abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard } 11406abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard 11521b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin /** 11621b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin * Non-Android accessor that indicates whether {@link #getFromLocation(double, double, int)} was called. 11721b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin * 11821b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin * @return whether {@link #getFromLocation(double, double, int)} was called. 11921b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin */ 12006abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard public boolean wasGetFromLocationCalled() { 12106abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard return wasCalled; 12206abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard } 12306abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard 12406abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard public double getLastLongitude() { 12506abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard return lastLongitude; 12606abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard } 12706abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard 12806abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard public double getLastLatitude() { 12906abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard return lastLatitude; 13006abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard } 13106abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard 132b22dbaacb93d4360a5b7d9f2f19b7bae5f638861pivotal-jiwire public String getLastLocationName() { 133b22dbaacb93d4360a5b7d9f2f19b7bae5f638861pivotal-jiwire return lastLocationName; 134b22dbaacb93d4360a5b7d9f2f19b7bae5f638861pivotal-jiwire } 135b22dbaacb93d4360a5b7d9f2f19b7bae5f638861pivotal-jiwire 13606abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard private List<Address> oneElementList(Address address) { 13706abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard ArrayList<Address> addresses = new ArrayList<Address>(); 13806abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard addresses.add(address); 13906abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard return addresses; 14006abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard } 14100acfbd3521893738d94b6f7726128ea32ab5c4fpivotal 14200acfbd3521893738d94b6f7726128ea32ab5c4fpivotal public void setSimulatedHasLatLong(boolean hasLatitude, boolean hasLongitude) { 14300acfbd3521893738d94b6f7726128ea32ab5c4fpivotal this.hasLatitude = hasLatitude; 14400acfbd3521893738d94b6f7726128ea32ab5c4fpivotal this.hasLongitude = hasLongitude; 14500acfbd3521893738d94b6f7726128ea32ab5c4fpivotal } 14600acfbd3521893738d94b6f7726128ea32ab5c4fpivotal 14700acfbd3521893738d94b6f7726128ea32ab5c4fpivotal public void setReturnNoResults(boolean returnNoResults) { 14800acfbd3521893738d94b6f7726128ea32ab5c4fpivotal this.returnNoResults = returnNoResults; 14900acfbd3521893738d94b6f7726128ea32ab5c4fpivotal } 15006abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard}