1a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao/*
2a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao * Copyright (C) 2010 The Android Open Source Project
3a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao *
4a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao * Licensed under the Apache License, Version 2.0 (the "License");
5a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao * you may not use this file except in compliance with the License.
6a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao * You may obtain a copy of the License at
7a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao *
8a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao *      http://www.apache.org/licenses/LICENSE-2.0
9a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao *
10a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao * Unless required by applicable law or agreed to in writing, software
11a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao * distributed under the License is distributed on an "AS IS" BASIS,
12a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao * See the License for the specific language governing permissions and
14a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao * limitations under the License
15a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao */
16a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao
17a58a8751b4c2ce457f0082a0baaee61312d56195Bai Taopackage com.android.server.location;
18a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao
19a58a8751b4c2ce457f0082a0baaee61312d56195Bai Taoimport android.location.Country;
20a58a8751b4c2ce457f0082a0baaee61312d56195Bai Taoimport android.location.CountryListener;
21a58a8751b4c2ce457f0082a0baaee61312d56195Bai Taoimport android.test.AndroidTestCase;
22a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao
23a58a8751b4c2ce457f0082a0baaee61312d56195Bai Taopublic class ComprehensiveCountryDetectorTest extends AndroidTestCase {
24a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao    private class TestCountryDetector extends ComprehensiveCountryDetector {
25a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        public final static String COUNTRY_ISO = "us";
26a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        private boolean mLocationBasedDetectorStarted;
27a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        private boolean mLocationBasedDetectorStopped;
28a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        protected boolean mNotified;
29a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        private boolean listenerAdded = false;
30a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao
31a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        private Country mNotifiedCountry;
32a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        public TestCountryDetector() {
33a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao            super(getContext());
34a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        }
35a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao
36a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        public void notifyLocationBasedListener(Country country) {
37a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao            mNotified = true;
38a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao            mNotifiedCountry = country;
39a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao            mLocationBasedCountryDetector.notifyListener(country);
40a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        }
41a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao
42a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        public boolean locationBasedDetectorStarted() {
43a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao            return mLocationBasedCountryDetector != null && mLocationBasedDetectorStarted;
44a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        }
45a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao
46a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        public boolean locationBasedDetectorStopped() {
47a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao            return mLocationBasedCountryDetector == null && mLocationBasedDetectorStopped;
48a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        }
49a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao
50a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        public boolean locationRefreshStarted() {
51a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao            return mLocationRefreshTimer != null;
52a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        }
53a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao
54a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        public boolean locationRefreshCancelled() {
55a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao            return mLocationRefreshTimer == null;
56a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        }
57a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao
58a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        @Override
59a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        protected CountryDetectorBase createLocationBasedCountryDetector() {
60a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao            return new CountryDetectorBase(mContext) {
61a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao                @Override
62a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao                public Country detectCountry() {
63a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao                    mLocationBasedDetectorStarted = true;
64a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao                    return null;
65a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao                }
66a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao
67a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao                @Override
68a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao                public void stop() {
69a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao                    mLocationBasedDetectorStopped = true;
70a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao                }
71a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao            };
72a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        }
73a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao
74a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        @Override
75a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        protected Country getNetworkBasedCountry() {
76a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao            return null;
77a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        }
78a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao
79a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        @Override
80a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        protected Country getLastKnownLocationBasedCountry() {
81a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao            return mNotifiedCountry;
82a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        }
83a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao
84a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        @Override
85a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        protected Country getSimBasedCountry() {
86a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao            return null;
87a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        }
88a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao
89a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        @Override
90a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        protected Country getLocaleCountry() {
91a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao            return null;
92a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        }
93a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao
94a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        @Override
95a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        protected void runAfterDetectionAsync(final Country country, final Country detectedCountry,
96a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao                final boolean notifyChange, final boolean startLocationBasedDetection) {
97a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao            runAfterDetection(country, detectedCountry, notifyChange, startLocationBasedDetection);
98a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        };
99a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao
100a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        @Override
101a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        protected boolean isAirplaneModeOff() {
102a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao            return true;
103a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        }
104a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao
105a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        @Override
106a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        protected synchronized void addPhoneStateListener() {
107a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao            listenerAdded = true;
108a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        }
109a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao
110a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        @Override
111a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        protected synchronized void removePhoneStateListener() {
112a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao            listenerAdded = false;
113a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        }
114a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao
115a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        @Override
116a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        protected boolean isGeoCoderImplemented() {
117a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao            return true;
118a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        }
119a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao
120a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        public boolean isPhoneStateListenerAdded() {
121a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao            return listenerAdded;
122a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        }
123a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao    }
124a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao
125a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao    private class CountryListenerImpl implements CountryListener {
126a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        private boolean mNotified;
127a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        private Country mCountry;
128a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao
129a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        public void onCountryDetected(Country country) {
130a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao            mNotified = true;
131a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao            mCountry = country;
132a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        }
133a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao
134a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        public boolean notified() {
135a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao            return mNotified;
136a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        }
137a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao
138a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        public Country getCountry() {
139a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao            return mCountry;
140a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        }
141a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao    }
142a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao
143a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao    public void testDetectNetworkBasedCountry() {
144a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        final Country resultCountry = new Country(
145a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao                TestCountryDetector.COUNTRY_ISO, Country.COUNTRY_SOURCE_NETWORK);
146a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        TestCountryDetector countryDetector = new TestCountryDetector() {
147a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao            @Override
148a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao            protected Country getNetworkBasedCountry() {
149a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao                return resultCountry;
150a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao            }
151a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        };
152a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        CountryListenerImpl listener = new CountryListenerImpl();
153a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        countryDetector.setCountryListener(listener);
154a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        Country country = countryDetector.detectCountry();
155a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        assertTrue(sameCountry(country, resultCountry));
156a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        assertFalse(listener.notified());
157a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        assertFalse(countryDetector.locationBasedDetectorStarted());
158a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        assertFalse(countryDetector.locationRefreshStarted());
159a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        countryDetector.stop();
160a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao    }
161a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao
162a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao    public void testDetectLocationBasedCountry() {
163a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        final Country resultCountry = new Country(
164a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao                TestCountryDetector.COUNTRY_ISO, Country.COUNTRY_SOURCE_SIM);
165a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        final Country locationBasedCountry = new Country(
166a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao                TestCountryDetector.COUNTRY_ISO, Country.COUNTRY_SOURCE_LOCATION);
167a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        TestCountryDetector countryDetector = new TestCountryDetector() {
168a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao            @Override
169a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao            protected Country getSimBasedCountry() {
170a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao                return resultCountry;
171a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao            }
172a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        };
173a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        CountryListenerImpl listener = new CountryListenerImpl();
174a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        countryDetector.setCountryListener(listener);
175a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        Country country = countryDetector.detectCountry();
176a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        assertTrue(sameCountry(country, resultCountry));
177a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        assertTrue(countryDetector.locationBasedDetectorStarted());
178a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        countryDetector.notifyLocationBasedListener(locationBasedCountry);
179a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        assertTrue(listener.notified());
180a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        assertTrue(sameCountry(listener.getCountry(), locationBasedCountry));
181a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        assertTrue(countryDetector.locationBasedDetectorStopped());
182a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        assertTrue(countryDetector.locationRefreshStarted());
183a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        countryDetector.stop();
184a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        assertTrue(countryDetector.locationRefreshCancelled());
185a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao    }
186a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao
187a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao    public void testLocaleBasedCountry() {
188a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        final Country resultCountry = new Country(
189a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao                TestCountryDetector.COUNTRY_ISO, Country.COUNTRY_SOURCE_LOCALE);
190a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        TestCountryDetector countryDetector = new TestCountryDetector() {
191a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao            @Override
192a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao            protected Country getLocaleCountry() {
193a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao                return resultCountry;
194a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao            }
195a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        };
196a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        CountryListenerImpl listener = new CountryListenerImpl();
197a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        countryDetector.setCountryListener(listener);
198a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        Country country = countryDetector.detectCountry();
199a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        assertTrue(sameCountry(country, resultCountry));
200a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        assertFalse(listener.notified());
201a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        assertTrue(countryDetector.locationBasedDetectorStarted());
202a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        assertTrue(countryDetector.locationRefreshStarted());
203a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        countryDetector.stop();
204a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        assertTrue(countryDetector.locationRefreshCancelled());
205a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao    }
206a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao
207a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao    public void testStoppingDetector() {
208a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        // Test stopping detector when LocationBasedCountryDetector was started
209a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        final Country resultCountry = new Country(
210a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao                TestCountryDetector.COUNTRY_ISO, Country.COUNTRY_SOURCE_SIM);
211a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        TestCountryDetector countryDetector = new TestCountryDetector() {
212a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao            @Override
213a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao            protected Country getSimBasedCountry() {
214a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao                return resultCountry;
215a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao            }
216a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        };
217a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        CountryListenerImpl listener = new CountryListenerImpl();
218a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        countryDetector.setCountryListener(listener);
219a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        Country country = countryDetector.detectCountry();
220a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        assertTrue(sameCountry(country, resultCountry));
221a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        assertTrue(countryDetector.locationBasedDetectorStarted());
222a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        countryDetector.stop();
223a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        // The LocationBasedDetector should be stopped.
224a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        assertTrue(countryDetector.locationBasedDetectorStopped());
225a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        // The location refresh should not running.
226a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        assertTrue(countryDetector.locationRefreshCancelled());
227a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao    }
228a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao
229a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao    public void testLocationBasedCountryNotFound() {
230a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        final Country resultCountry = new Country(
231a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao                TestCountryDetector.COUNTRY_ISO, Country.COUNTRY_SOURCE_SIM);
232a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        TestCountryDetector countryDetector = new TestCountryDetector() {
233a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao            @Override
234a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao            protected Country getSimBasedCountry() {
235a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao                return resultCountry;
236a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao            }
237a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        };
238a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        CountryListenerImpl listener = new CountryListenerImpl();
239a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        countryDetector.setCountryListener(listener);
240a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        Country country = countryDetector.detectCountry();
241a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        assertTrue(sameCountry(country, resultCountry));
242a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        assertTrue(countryDetector.locationBasedDetectorStarted());
243a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        countryDetector.notifyLocationBasedListener(null);
244a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        assertFalse(listener.notified());
245a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        assertTrue(sameCountry(listener.getCountry(), null));
246a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        assertTrue(countryDetector.locationBasedDetectorStopped());
247a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        assertTrue(countryDetector.locationRefreshStarted());
248a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        countryDetector.stop();
249a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        assertTrue(countryDetector.locationRefreshCancelled());
250a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao    }
251a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao
252a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao    public void testNoCountryFound() {
253a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        TestCountryDetector countryDetector = new TestCountryDetector();
254a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        CountryListenerImpl listener = new CountryListenerImpl();
255a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        countryDetector.setCountryListener(listener);
256a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        Country country = countryDetector.detectCountry();
257a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        assertTrue(sameCountry(country, null));
258a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        assertTrue(countryDetector.locationBasedDetectorStarted());
259a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        countryDetector.notifyLocationBasedListener(null);
260a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        assertFalse(listener.notified());
261a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        assertTrue(sameCountry(listener.getCountry(), null));
262a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        assertTrue(countryDetector.locationBasedDetectorStopped());
263a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        assertTrue(countryDetector.locationRefreshStarted());
264a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        countryDetector.stop();
265a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        assertTrue(countryDetector.locationRefreshCancelled());
266a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao    }
267a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao
268a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao    public void testAddRemoveListener() {
269a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        TestCountryDetector countryDetector = new TestCountryDetector();
270a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        CountryListenerImpl listener = new CountryListenerImpl();
271a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        countryDetector.setCountryListener(listener);
272a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        assertTrue(countryDetector.isPhoneStateListenerAdded());
273a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        assertTrue(countryDetector.locationBasedDetectorStarted());
274a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        countryDetector.setCountryListener(null);
275a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        assertFalse(countryDetector.isPhoneStateListenerAdded());
276a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        assertTrue(countryDetector.locationBasedDetectorStopped());
277a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao    }
278a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao
279a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao    public void testGeocoderNotImplemented() {
280a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        TestCountryDetector countryDetector = new TestCountryDetector() {
281a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao            @Override
282a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao            protected boolean isGeoCoderImplemented() {
283a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao                return false;
284a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao            }
285a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        };
286a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        CountryListenerImpl listener = new CountryListenerImpl();
287a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        countryDetector.setCountryListener(listener);
288a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        assertTrue(countryDetector.isPhoneStateListenerAdded());
289a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        assertFalse(countryDetector.locationBasedDetectorStarted());
290a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        countryDetector.setCountryListener(null);
291a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        assertFalse(countryDetector.isPhoneStateListenerAdded());
292a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao    }
293a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao
294a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao    private boolean sameCountry(Country country1, Country country2) {
295a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        return country1 == null && country2 == null || country1 != null && country2 != null &&
296a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        country1.getCountryIso().equalsIgnoreCase(country2.getCountryIso()) &&
297a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao        country1.getSource() == country2.getSource();
298a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao    }
299a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao}
300