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 android.location; 18a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao 19a58a8751b4c2ce457f0082a0baaee61312d56195Bai Taoimport android.os.Parcel; 20a58a8751b4c2ce457f0082a0baaee61312d56195Bai Taoimport android.os.Parcelable; 21da123492dee9d0e7e84c4e497e947d3a7c143537Katherine Kuanimport android.os.SystemClock; 22a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao 233746f2d91425e24b23ddf34f2b9afef3f3efc3e2Daisuke Miyakawaimport java.util.Locale; 243746f2d91425e24b23ddf34f2b9afef3f3efc3e2Daisuke Miyakawa 25a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao/** 26a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao * This class wraps the country information. 27a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao * 28a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao * @hide 29a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao */ 30a58a8751b4c2ce457f0082a0baaee61312d56195Bai Taopublic class Country implements Parcelable { 31a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao /** 32a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao * The country code came from the mobile network 33a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao */ 34a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao public static final int COUNTRY_SOURCE_NETWORK = 0; 35a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao 36a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao /** 37a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao * The country code came from the location service 38a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao */ 39a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao public static final int COUNTRY_SOURCE_LOCATION = 1; 40a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao 41a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao /** 42a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao * The country code was read from the SIM card 43a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao */ 44a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao public static final int COUNTRY_SOURCE_SIM = 2; 45a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao 46a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao /** 47a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao * The country code came from the system locale setting 48a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao */ 49a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao public static final int COUNTRY_SOURCE_LOCALE = 3; 50a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao 51a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao /** 52a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao * The ISO 3166-1 two letters country code. 53a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao */ 54a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao private final String mCountryIso; 55a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao 56a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao /** 57a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao * Where the country code came from. 58a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao */ 59a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao private final int mSource; 60a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao 61a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao private int mHashCode; 62da123492dee9d0e7e84c4e497e947d3a7c143537Katherine Kuan 63da123492dee9d0e7e84c4e497e947d3a7c143537Katherine Kuan /** 64da123492dee9d0e7e84c4e497e947d3a7c143537Katherine Kuan * Time that this object was created (which we assume to be the time that the source was 65da123492dee9d0e7e84c4e497e947d3a7c143537Katherine Kuan * consulted). This time is in milliseconds since boot up. 66da123492dee9d0e7e84c4e497e947d3a7c143537Katherine Kuan */ 67da123492dee9d0e7e84c4e497e947d3a7c143537Katherine Kuan private final long mTimestamp; 68da123492dee9d0e7e84c4e497e947d3a7c143537Katherine Kuan 69a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao /** 70a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao * @param countryIso the ISO 3166-1 two letters country code. 71a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao * @param source where the countryIso came from, could be one of below 72a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao * values 73a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao * <p> 74a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao * <ul> 75a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao * <li>{@link #COUNTRY_SOURCE_NETWORK}</li> 76a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao * <li>{@link #COUNTRY_SOURCE_LOCATION}</li> 77a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao * <li>{@link #COUNTRY_SOURCE_SIM}</li> 78a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao * <li>{@link #COUNTRY_SOURCE_LOCALE}</li> 79a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao * </ul> 80a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao */ 81a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao public Country(final String countryIso, final int source) { 82a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao if (countryIso == null || source < COUNTRY_SOURCE_NETWORK 83a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao || source > COUNTRY_SOURCE_LOCALE) { 84a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao throw new IllegalArgumentException(); 85a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 863746f2d91425e24b23ddf34f2b9afef3f3efc3e2Daisuke Miyakawa mCountryIso = countryIso.toUpperCase(Locale.US); 87a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao mSource = source; 88da123492dee9d0e7e84c4e497e947d3a7c143537Katherine Kuan mTimestamp = SystemClock.elapsedRealtime(); 89da123492dee9d0e7e84c4e497e947d3a7c143537Katherine Kuan } 90da123492dee9d0e7e84c4e497e947d3a7c143537Katherine Kuan 91da123492dee9d0e7e84c4e497e947d3a7c143537Katherine Kuan private Country(final String countryIso, final int source, long timestamp) { 92da123492dee9d0e7e84c4e497e947d3a7c143537Katherine Kuan if (countryIso == null || source < COUNTRY_SOURCE_NETWORK 93da123492dee9d0e7e84c4e497e947d3a7c143537Katherine Kuan || source > COUNTRY_SOURCE_LOCALE) { 94da123492dee9d0e7e84c4e497e947d3a7c143537Katherine Kuan throw new IllegalArgumentException(); 95da123492dee9d0e7e84c4e497e947d3a7c143537Katherine Kuan } 96da123492dee9d0e7e84c4e497e947d3a7c143537Katherine Kuan mCountryIso = countryIso.toUpperCase(Locale.US); 97da123492dee9d0e7e84c4e497e947d3a7c143537Katherine Kuan mSource = source; 98da123492dee9d0e7e84c4e497e947d3a7c143537Katherine Kuan mTimestamp = timestamp; 99a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 100a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao 101a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao public Country(Country country) { 102a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao mCountryIso = country.mCountryIso; 103a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao mSource = country.mSource; 104da123492dee9d0e7e84c4e497e947d3a7c143537Katherine Kuan mTimestamp = country.mTimestamp; 105a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 106a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao 107a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao /** 108a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao * @return the ISO 3166-1 two letters country code 109a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao */ 110a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao public final String getCountryIso() { 111a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao return mCountryIso; 112a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 113a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao 114a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao /** 115a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao * @return where the country code came from, could be one of below values 116a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao * <p> 117a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao * <ul> 118a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao * <li>{@link #COUNTRY_SOURCE_NETWORK}</li> 119a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao * <li>{@link #COUNTRY_SOURCE_LOCATION}</li> 120a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao * <li>{@link #COUNTRY_SOURCE_SIM}</li> 121a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao * <li>{@link #COUNTRY_SOURCE_LOCALE}</li> 122a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao * </ul> 123a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao */ 124a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao public final int getSource() { 125a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao return mSource; 126a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 127a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao 128da123492dee9d0e7e84c4e497e947d3a7c143537Katherine Kuan /** 129da123492dee9d0e7e84c4e497e947d3a7c143537Katherine Kuan * Returns the time that this object was created (which we assume to be the time that the source 130da123492dee9d0e7e84c4e497e947d3a7c143537Katherine Kuan * was consulted). 131da123492dee9d0e7e84c4e497e947d3a7c143537Katherine Kuan */ 132da123492dee9d0e7e84c4e497e947d3a7c143537Katherine Kuan public final long getTimestamp() { 133da123492dee9d0e7e84c4e497e947d3a7c143537Katherine Kuan return mTimestamp; 134da123492dee9d0e7e84c4e497e947d3a7c143537Katherine Kuan } 135da123492dee9d0e7e84c4e497e947d3a7c143537Katherine Kuan 136a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao public static final Parcelable.Creator<Country> CREATOR = new Parcelable.Creator<Country>() { 137a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao public Country createFromParcel(Parcel in) { 138da123492dee9d0e7e84c4e497e947d3a7c143537Katherine Kuan return new Country(in.readString(), in.readInt(), in.readLong()); 139a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 140a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao 141a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao public Country[] newArray(int size) { 142a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao return new Country[size]; 143a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 144a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao }; 145a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao 146a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao public int describeContents() { 147a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao return 0; 148a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 149a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao 150a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao public void writeToParcel(Parcel parcel, int flags) { 151a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao parcel.writeString(mCountryIso); 152a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao parcel.writeInt(mSource); 153da123492dee9d0e7e84c4e497e947d3a7c143537Katherine Kuan parcel.writeLong(mTimestamp); 154a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 155a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao 156da123492dee9d0e7e84c4e497e947d3a7c143537Katherine Kuan /** 157da123492dee9d0e7e84c4e497e947d3a7c143537Katherine Kuan * Returns true if this {@link Country} is equivalent to the given object. This ignores 158da123492dee9d0e7e84c4e497e947d3a7c143537Katherine Kuan * the timestamp value and just checks for equivalence of countryIso and source values. 159da123492dee9d0e7e84c4e497e947d3a7c143537Katherine Kuan * Returns false otherwise. 160da123492dee9d0e7e84c4e497e947d3a7c143537Katherine Kuan */ 161a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao @Override 162a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao public boolean equals(Object object) { 163a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao if (object == this) { 164a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao return true; 165a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 166a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao if (object instanceof Country) { 167a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao Country c = (Country) object; 168da123492dee9d0e7e84c4e497e947d3a7c143537Katherine Kuan // No need to check the equivalence of the timestamp 169a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao return mCountryIso.equals(c.getCountryIso()) && mSource == c.getSource(); 170a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 171a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao return false; 172a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 173a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao 174a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao @Override 175a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao public int hashCode() { 176a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao int hash = mHashCode; 177a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao if (hash == 0) { 178a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao hash = 17; 179a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao hash = hash * 13 + mCountryIso.hashCode(); 180a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao hash = hash * 13 + mSource; 181a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao mHashCode = hash; 182a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 183a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao return mHashCode; 184a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 185a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao 186a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao /** 187da123492dee9d0e7e84c4e497e947d3a7c143537Katherine Kuan * Compare the specified country to this country object ignoring the source 188da123492dee9d0e7e84c4e497e947d3a7c143537Katherine Kuan * and timestamp fields, return true if the countryIso fields are equal 189a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao * 190a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao * @param country the country to compare 191a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao * @return true if the specified country's countryIso field is equal to this 192a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao * country's, false otherwise. 193a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao */ 194a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao public boolean equalsIgnoreSource(Country country) { 195a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao return country != null && mCountryIso.equals(country.getCountryIso()); 196a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao } 197da123492dee9d0e7e84c4e497e947d3a7c143537Katherine Kuan 198da123492dee9d0e7e84c4e497e947d3a7c143537Katherine Kuan @Override 199da123492dee9d0e7e84c4e497e947d3a7c143537Katherine Kuan public String toString() { 200da123492dee9d0e7e84c4e497e947d3a7c143537Katherine Kuan return "Country {ISO=" + mCountryIso + ", source=" + mSource + ", time=" + mTimestamp + "}"; 201da123492dee9d0e7e84c4e497e947d3a7c143537Katherine Kuan } 202a58a8751b4c2ce457f0082a0baaee61312d56195Bai Tao} 203