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; 36a302d91d236c969bb55d2e492db049b4456b807fAndrew Dai & Rick Kawala private boolean didResolution; 3706abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard 3806abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard @Implementation 3906abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard public List<Address> getFromLocation(double latitude, double longitude, int maxResults) throws IOException { 4006abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard wasCalled = true; 4106abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard this.lastLatitude = latitude; 4206abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard this.lastLongitude = longitude; 4306abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard if (shouldSimulateGeocodeException) { 4406abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard throw new IOException("Simulated geocode exception"); 4506abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard } 4600acfbd3521893738d94b6f7726128ea32ab5c4fpivotal Address address = makeAddress(); 4706abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard address.setAddressLine(0, addressLine1); 4806abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard address.setLocality(city); 4906abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard address.setAdminArea(state); 5006abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard address.setPostalCode(zip); 5106abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard address.setCountryCode(countryCode); 5206abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard return oneElementList(address); 5306abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard } 5406abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard 5506abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard @Implementation 5606abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard public List<Address> getFromLocationName(String locationName, int maxResults) throws IOException { 57a302d91d236c969bb55d2e492db049b4456b807fAndrew Dai & Rick Kawala didResolution = true; 58b22dbaacb93d4360a5b7d9f2f19b7bae5f638861pivotal-jiwire this.lastLocationName = locationName; 5906abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard if (shouldSimulateGeocodeException) { 6006abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard throw new IOException("Simulated geocode exception"); 6106abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard } 6200acfbd3521893738d94b6f7726128ea32ab5c4fpivotal if (returnNoResults) { 6300acfbd3521893738d94b6f7726128ea32ab5c4fpivotal return new ArrayList<Address>(); 6400acfbd3521893738d94b6f7726128ea32ab5c4fpivotal } else { 6500acfbd3521893738d94b6f7726128ea32ab5c4fpivotal Address address = makeAddress(); 6600acfbd3521893738d94b6f7726128ea32ab5c4fpivotal address.setLatitude(simulatedLatitude); 6700acfbd3521893738d94b6f7726128ea32ab5c4fpivotal address.setLongitude(simulatedLongitude); 6800acfbd3521893738d94b6f7726128ea32ab5c4fpivotal return oneElementList(address); 6900acfbd3521893738d94b6f7726128ea32ab5c4fpivotal } 7000acfbd3521893738d94b6f7726128ea32ab5c4fpivotal } 7100acfbd3521893738d94b6f7726128ea32ab5c4fpivotal 7200acfbd3521893738d94b6f7726128ea32ab5c4fpivotal private Address makeAddress() { 7306abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard Address address = new Address(Locale.getDefault()); 7400acfbd3521893738d94b6f7726128ea32ab5c4fpivotal shadowOf(address).setSimulatedHasLatLong(hasLatitude, hasLongitude); 7500acfbd3521893738d94b6f7726128ea32ab5c4fpivotal return address; 7606abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard } 7706abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard 7821b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin /** 7921b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin * Sets up a simulated response for {@link #getFromLocation(double, double, int)} 8021b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin * 8140c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams * @param address the address for the response 8240c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams * @param city the city for the response 8340c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams * @param state the state for the response 8440c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams * @param zip the zip code for the response 8521b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin * @param countryCode the country code for the response 8621b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin */ 8706abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard public void setSimulatedResponse(String address, String city, String state, String zip, String countryCode) { 8806abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard this.addressLine1 = address; 8906abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard this.city = city; 9006abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard this.state = state; 9106abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard this.zip = zip; 9206abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard this.countryCode = countryCode; 9306abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard } 9406abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard 9521b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin 9621b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin /** 9721b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin * Sets up a simulated response for {@link #getFromLocationName(String, int)}} 9821b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin * 9921b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin * @param lat latitude for simulated response 10021b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin * @param lng longitude for simulated response 10121b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin */ 10221b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin public void setSimulatedLatLong(double lat, double lng) { 10321b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin this.simulatedLatitude = lat; 10421b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin this.simulatedLongitude = lng; 10521b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin } 10621b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin 10721b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin /** 10821b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin * Sets a flag to indicate whether or not {@link #getFromLocationName(String, int)} should throw an exception to 10921b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin * simulate a failure. 11021b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin * 11121b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin * @param shouldSimulateException whether or not an exception should be thrown from {@link #getFromLocationName(String, int)} 11221b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin */ 11306abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard public void setShouldSimulateGeocodeException(boolean shouldSimulateException) { 11406abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard this.shouldSimulateGeocodeException = true; 11506abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard } 11606abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard 11721b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin /** 11821b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin * Non-Android accessor that indicates whether {@link #getFromLocation(double, double, int)} was called. 11921b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin * 12021b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin * @return whether {@link #getFromLocation(double, double, int)} was called. 12121b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin */ 12206abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard public boolean wasGetFromLocationCalled() { 12306abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard return wasCalled; 12406abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard } 12506abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard 12606abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard public double getLastLongitude() { 12706abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard return lastLongitude; 12806abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard } 12906abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard 13006abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard public double getLastLatitude() { 13106abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard return lastLatitude; 13206abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard } 13306abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard 134b22dbaacb93d4360a5b7d9f2f19b7bae5f638861pivotal-jiwire public String getLastLocationName() { 135b22dbaacb93d4360a5b7d9f2f19b7bae5f638861pivotal-jiwire return lastLocationName; 136b22dbaacb93d4360a5b7d9f2f19b7bae5f638861pivotal-jiwire } 137b22dbaacb93d4360a5b7d9f2f19b7bae5f638861pivotal-jiwire 13806abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard private List<Address> oneElementList(Address address) { 13906abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard ArrayList<Address> addresses = new ArrayList<Address>(); 14006abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard addresses.add(address); 14106abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard return addresses; 14206abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard } 14300acfbd3521893738d94b6f7726128ea32ab5c4fpivotal 14400acfbd3521893738d94b6f7726128ea32ab5c4fpivotal public void setSimulatedHasLatLong(boolean hasLatitude, boolean hasLongitude) { 14500acfbd3521893738d94b6f7726128ea32ab5c4fpivotal this.hasLatitude = hasLatitude; 14600acfbd3521893738d94b6f7726128ea32ab5c4fpivotal this.hasLongitude = hasLongitude; 14700acfbd3521893738d94b6f7726128ea32ab5c4fpivotal } 14800acfbd3521893738d94b6f7726128ea32ab5c4fpivotal 14900acfbd3521893738d94b6f7726128ea32ab5c4fpivotal public void setReturnNoResults(boolean returnNoResults) { 15000acfbd3521893738d94b6f7726128ea32ab5c4fpivotal this.returnNoResults = returnNoResults; 15100acfbd3521893738d94b6f7726128ea32ab5c4fpivotal } 152a302d91d236c969bb55d2e492db049b4456b807fAndrew Dai & Rick Kawala 153a302d91d236c969bb55d2e492db049b4456b807fAndrew Dai & Rick Kawala public boolean didResolution() { 154a302d91d236c969bb55d2e492db049b4456b807fAndrew Dai & Rick Kawala return didResolution; 155a302d91d236c969bb55d2e492db049b4456b807fAndrew Dai & Rick Kawala } 15606abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard}