/* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License */ package com.android.server.location; import android.location.Country; import android.location.CountryListener; import android.test.AndroidTestCase; public class ComprehensiveCountryDetectorTest extends AndroidTestCase { private class TestCountryDetector extends ComprehensiveCountryDetector { public final static String COUNTRY_ISO = "us"; private boolean mLocationBasedDetectorStarted; private boolean mLocationBasedDetectorStopped; protected boolean mNotified; private boolean listenerAdded = false; private Country mNotifiedCountry; public TestCountryDetector() { super(getContext()); } public void notifyLocationBasedListener(Country country) { mNotified = true; mNotifiedCountry = country; mLocationBasedCountryDetector.notifyListener(country); } public boolean locationBasedDetectorStarted() { return mLocationBasedCountryDetector != null && mLocationBasedDetectorStarted; } public boolean locationBasedDetectorStopped() { return mLocationBasedCountryDetector == null && mLocationBasedDetectorStopped; } public boolean locationRefreshStarted() { return mLocationRefreshTimer != null; } public boolean locationRefreshCancelled() { return mLocationRefreshTimer == null; } @Override protected CountryDetectorBase createLocationBasedCountryDetector() { return new CountryDetectorBase(mContext) { @Override public Country detectCountry() { mLocationBasedDetectorStarted = true; return null; } @Override public void stop() { mLocationBasedDetectorStopped = true; } }; } @Override protected Country getNetworkBasedCountry() { return null; } @Override protected Country getLastKnownLocationBasedCountry() { return mNotifiedCountry; } @Override protected Country getSimBasedCountry() { return null; } @Override protected Country getLocaleCountry() { return null; } @Override protected void runAfterDetectionAsync(final Country country, final Country detectedCountry, final boolean notifyChange, final boolean startLocationBasedDetection) { runAfterDetection(country, detectedCountry, notifyChange, startLocationBasedDetection); }; @Override protected boolean isAirplaneModeOff() { return true; } @Override protected synchronized void addPhoneStateListener() { listenerAdded = true; } @Override protected synchronized void removePhoneStateListener() { listenerAdded = false; } @Override protected boolean isGeoCoderImplemented() { return true; } public boolean isPhoneStateListenerAdded() { return listenerAdded; } } private class CountryListenerImpl implements CountryListener { private boolean mNotified; private Country mCountry; public void onCountryDetected(Country country) { mNotified = true; mCountry = country; } public boolean notified() { return mNotified; } public Country getCountry() { return mCountry; } } public void testDetectNetworkBasedCountry() { final Country resultCountry = new Country( TestCountryDetector.COUNTRY_ISO, Country.COUNTRY_SOURCE_NETWORK); TestCountryDetector countryDetector = new TestCountryDetector() { @Override protected Country getNetworkBasedCountry() { return resultCountry; } }; CountryListenerImpl listener = new CountryListenerImpl(); countryDetector.setCountryListener(listener); Country country = countryDetector.detectCountry(); assertTrue(sameCountry(country, resultCountry)); assertFalse(listener.notified()); assertFalse(countryDetector.locationBasedDetectorStarted()); assertFalse(countryDetector.locationRefreshStarted()); countryDetector.stop(); } public void testDetectLocationBasedCountry() { final Country resultCountry = new Country( TestCountryDetector.COUNTRY_ISO, Country.COUNTRY_SOURCE_SIM); final Country locationBasedCountry = new Country( TestCountryDetector.COUNTRY_ISO, Country.COUNTRY_SOURCE_LOCATION); TestCountryDetector countryDetector = new TestCountryDetector() { @Override protected Country getSimBasedCountry() { return resultCountry; } }; CountryListenerImpl listener = new CountryListenerImpl(); countryDetector.setCountryListener(listener); Country country = countryDetector.detectCountry(); assertTrue(sameCountry(country, resultCountry)); assertTrue(countryDetector.locationBasedDetectorStarted()); countryDetector.notifyLocationBasedListener(locationBasedCountry); assertTrue(listener.notified()); assertTrue(sameCountry(listener.getCountry(), locationBasedCountry)); assertTrue(countryDetector.locationBasedDetectorStopped()); assertTrue(countryDetector.locationRefreshStarted()); countryDetector.stop(); assertTrue(countryDetector.locationRefreshCancelled()); } public void testLocaleBasedCountry() { final Country resultCountry = new Country( TestCountryDetector.COUNTRY_ISO, Country.COUNTRY_SOURCE_LOCALE); TestCountryDetector countryDetector = new TestCountryDetector() { @Override protected Country getLocaleCountry() { return resultCountry; } }; CountryListenerImpl listener = new CountryListenerImpl(); countryDetector.setCountryListener(listener); Country country = countryDetector.detectCountry(); assertTrue(sameCountry(country, resultCountry)); assertFalse(listener.notified()); assertTrue(countryDetector.locationBasedDetectorStarted()); assertTrue(countryDetector.locationRefreshStarted()); countryDetector.stop(); assertTrue(countryDetector.locationRefreshCancelled()); } public void testStoppingDetector() { // Test stopping detector when LocationBasedCountryDetector was started final Country resultCountry = new Country( TestCountryDetector.COUNTRY_ISO, Country.COUNTRY_SOURCE_SIM); TestCountryDetector countryDetector = new TestCountryDetector() { @Override protected Country getSimBasedCountry() { return resultCountry; } }; CountryListenerImpl listener = new CountryListenerImpl(); countryDetector.setCountryListener(listener); Country country = countryDetector.detectCountry(); assertTrue(sameCountry(country, resultCountry)); assertTrue(countryDetector.locationBasedDetectorStarted()); countryDetector.stop(); // The LocationBasedDetector should be stopped. assertTrue(countryDetector.locationBasedDetectorStopped()); // The location refresh should not running. assertTrue(countryDetector.locationRefreshCancelled()); } public void testLocationBasedCountryNotFound() { final Country resultCountry = new Country( TestCountryDetector.COUNTRY_ISO, Country.COUNTRY_SOURCE_SIM); TestCountryDetector countryDetector = new TestCountryDetector() { @Override protected Country getSimBasedCountry() { return resultCountry; } }; CountryListenerImpl listener = new CountryListenerImpl(); countryDetector.setCountryListener(listener); Country country = countryDetector.detectCountry(); assertTrue(sameCountry(country, resultCountry)); assertTrue(countryDetector.locationBasedDetectorStarted()); countryDetector.notifyLocationBasedListener(null); assertFalse(listener.notified()); assertTrue(sameCountry(listener.getCountry(), null)); assertTrue(countryDetector.locationBasedDetectorStopped()); assertTrue(countryDetector.locationRefreshStarted()); countryDetector.stop(); assertTrue(countryDetector.locationRefreshCancelled()); } public void testNoCountryFound() { TestCountryDetector countryDetector = new TestCountryDetector(); CountryListenerImpl listener = new CountryListenerImpl(); countryDetector.setCountryListener(listener); Country country = countryDetector.detectCountry(); assertTrue(sameCountry(country, null)); assertTrue(countryDetector.locationBasedDetectorStarted()); countryDetector.notifyLocationBasedListener(null); assertFalse(listener.notified()); assertTrue(sameCountry(listener.getCountry(), null)); assertTrue(countryDetector.locationBasedDetectorStopped()); assertTrue(countryDetector.locationRefreshStarted()); countryDetector.stop(); assertTrue(countryDetector.locationRefreshCancelled()); } public void testAddRemoveListener() { TestCountryDetector countryDetector = new TestCountryDetector(); CountryListenerImpl listener = new CountryListenerImpl(); countryDetector.setCountryListener(listener); assertTrue(countryDetector.isPhoneStateListenerAdded()); assertTrue(countryDetector.locationBasedDetectorStarted()); countryDetector.setCountryListener(null); assertFalse(countryDetector.isPhoneStateListenerAdded()); assertTrue(countryDetector.locationBasedDetectorStopped()); } public void testGeocoderNotImplemented() { TestCountryDetector countryDetector = new TestCountryDetector() { @Override protected boolean isGeoCoderImplemented() { return false; } }; CountryListenerImpl listener = new CountryListenerImpl(); countryDetector.setCountryListener(listener); assertTrue(countryDetector.isPhoneStateListenerAdded()); assertFalse(countryDetector.locationBasedDetectorStarted()); countryDetector.setCountryListener(null); assertFalse(countryDetector.isPhoneStateListenerAdded()); } private boolean sameCountry(Country country1, Country country2) { return country1 == null && country2 == null || country1 != null && country2 != null && country1.getCountryIso().equalsIgnoreCase(country2.getCountryIso()) && country1.getSource() == country2.getSource(); } }