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