1326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams/*
2bc0ca6ba4e31239bf77060578d0bdf1a10e04168Jason Sams * Copyright (C) 2007 The Android Open Source Project
3326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams *
4326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Licensed under the Apache License, Version 2.0 (the "License");
5326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * you may not use this file except in compliance with the License.
6326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * You may obtain a copy of the License at
7326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams *
8326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams *      http://www.apache.org/licenses/LICENSE-2.0
9326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams *
10326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Unless required by applicable law or agreed to in writing, software
11326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * distributed under the License is distributed on an "AS IS" BASIS,
12326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * See the License for the specific language governing permissions and
14326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * limitations under the License.
15326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams */
16326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
17326e0ddf89e8df2837752fbfd7a014814b32082cJason Samspackage android.location;
18326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
190b575de8ed0b628d84d256f5846500b0385979bdTim Murrayimport java.util.HashMap;
20bc0ca6ba4e31239bf77060578d0bdf1a10e04168Jason Samsimport java.util.Locale;
210b575de8ed0b628d84d256f5846500b0385979bdTim Murrayimport java.util.Map;
22bc0ca6ba4e31239bf77060578d0bdf1a10e04168Jason Samsimport java.util.Set;
23326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
24326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsimport android.os.Bundle;
25326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsimport android.os.Parcel;
26afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukimport android.os.Parcelable;
27246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk
28246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk/**
29326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * A class representing an Address, i.e, a set of Strings describing a location.
30326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams *
31c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk * The addres format is a simplified version of xAL (eXtensible Address Language)
328154954868694e1f233d87d4933a474518b1cb81Jason Sams * http://www.oasis-open.org/committees/ciq/ciq.html#6
338154954868694e1f233d87d4933a474518b1cb81Jason Sams */
348154954868694e1f233d87d4933a474518b1cb81Jason Samspublic class Address implements Parcelable {
358154954868694e1f233d87d4933a474518b1cb81Jason Sams
368154954868694e1f233d87d4933a474518b1cb81Jason Sams    private Locale mLocale;
378154954868694e1f233d87d4933a474518b1cb81Jason Sams
38225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams    private String mFeatureName;
39225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams    private HashMap<Integer, String> mAddressLines;
40afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    private int mMaxAddressLineIndex = -1;
41246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk    private String mAdminArea;
42326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    private String mSubAdminArea;
43326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    private String mLocality;
44afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    private String mSubLocality;
45246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk    private String mThoroughfare;
46246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk    private String mSubThoroughfare;
47246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk    private String mPremises;
48246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk    private String mPostalCode;
4986087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines    private String mCountryCode;
50326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    private String mCountryName;
51326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    private double mLatitude;
5250bfc354e61e174a465893fd0dafe913f1954478Alex Sakhartchouk    private double mLongitude;
53326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    private boolean mHasLatitude = false;
54326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    private boolean mHasLongitude = false;
55afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    private String mPhone;
56326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    private String mUrl;
57326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    private Bundle mExtras = null;
58afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk
59c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    /**
60326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams     * Constructs a new Address object set to the given Locale and with all
61326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams     * other fields initialized to null or false.
6286087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines     */
6386087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines    public Address(Locale locale) {
6486087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines        mLocale = locale;
6586087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines    }
6686087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines
67afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    /**
68246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk     * Returns the Locale associated with this address.
69246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk     */
7050bfc354e61e174a465893fd0dafe913f1954478Alex Sakhartchouk    public Locale getLocale() {
7150bfc354e61e174a465893fd0dafe913f1954478Alex Sakhartchouk        return mLocale;
7250bfc354e61e174a465893fd0dafe913f1954478Alex Sakhartchouk    }
73326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
74246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk    /**
75246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk     * Returns the largest index currently in use to specify an address line.
76326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams     * If no address lines are specified, -1 is returned.
77246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk     */
78326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    public int getMaxAddressLineIndex() {
79246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk        return mMaxAddressLineIndex;
80246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk    }
81246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk
82246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk    /**
83246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk     * Returns a line of the address numbered by the given index
8486087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines     * (starting at 0), or null if no such line is present.
85417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk     *
86246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk     * @throws IllegalArgumentException if index < 0
87246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk     */
88246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk    public String getAddressLine(int index) {
8986087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines        if (index < 0) {
90326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            throw new IllegalArgumentException("index = " + index + " < 0");
91326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        }
9250bfc354e61e174a465893fd0dafe913f1954478Alex Sakhartchouk        return mAddressLines == null? null :  mAddressLines.get(index);
9350bfc354e61e174a465893fd0dafe913f1954478Alex Sakhartchouk    }
9450bfc354e61e174a465893fd0dafe913f1954478Alex Sakhartchouk
9586087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines    /**
96246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk     * Sets the line of the address numbered by index (starting at 0) to the
97246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk     * given String, which may be null.
98246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk     *
99246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk     * @throws IllegalArgumentException if index < 0
10086087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines     */
10186087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines    public void setAddressLine(int index, String line) {
1027c52898ac201043a26b3edb7526d414684cfb96bJason Sams        if (index < 0) {
1037c52898ac201043a26b3edb7526d414684cfb96bJason Sams            throw new IllegalArgumentException("index = " + index + " < 0");
1047c52898ac201043a26b3edb7526d414684cfb96bJason Sams        }
105326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        if (mAddressLines == null) {
106326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            mAddressLines = new HashMap<Integer, String>();
107326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        }
10886087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines        mAddressLines.put(index, line);
109326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
11050bfc354e61e174a465893fd0dafe913f1954478Alex Sakhartchouk        if (line == null) {
11186087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines            // We've eliminated a line, recompute the max index
112326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            mMaxAddressLineIndex = -1;
1130b575de8ed0b628d84d256f5846500b0385979bdTim Murray            for (Integer i : mAddressLines.keySet()) {
114bc0ca6ba4e31239bf77060578d0bdf1a10e04168Jason Sams                mMaxAddressLineIndex = Math.max(mMaxAddressLineIndex, i);
115bc0ca6ba4e31239bf77060578d0bdf1a10e04168Jason Sams            }
116bc0ca6ba4e31239bf77060578d0bdf1a10e04168Jason Sams        } else {
117bc0ca6ba4e31239bf77060578d0bdf1a10e04168Jason Sams            mMaxAddressLineIndex = Math.max(mMaxAddressLineIndex, index);
118bc0ca6ba4e31239bf77060578d0bdf1a10e04168Jason Sams        }
119bc0ca6ba4e31239bf77060578d0bdf1a10e04168Jason Sams    }
120bc0ca6ba4e31239bf77060578d0bdf1a10e04168Jason Sams
121bc0ca6ba4e31239bf77060578d0bdf1a10e04168Jason Sams    /**
122bc0ca6ba4e31239bf77060578d0bdf1a10e04168Jason Sams     * Returns the feature name of the address, for example, "Golden Gate Bridge", or null
123bc0ca6ba4e31239bf77060578d0bdf1a10e04168Jason Sams     * if it is unknown
124bc0ca6ba4e31239bf77060578d0bdf1a10e04168Jason Sams     */
125bc0ca6ba4e31239bf77060578d0bdf1a10e04168Jason Sams    public String getFeatureName() {
126bc0ca6ba4e31239bf77060578d0bdf1a10e04168Jason Sams        return mFeatureName;
127bc0ca6ba4e31239bf77060578d0bdf1a10e04168Jason Sams    }
128bc0ca6ba4e31239bf77060578d0bdf1a10e04168Jason Sams
129bc0ca6ba4e31239bf77060578d0bdf1a10e04168Jason Sams    /**
130bc0ca6ba4e31239bf77060578d0bdf1a10e04168Jason Sams     * Sets the feature name of the address to the given String, which may be null
131bc0ca6ba4e31239bf77060578d0bdf1a10e04168Jason Sams     */
132bc0ca6ba4e31239bf77060578d0bdf1a10e04168Jason Sams    public void setFeatureName(String featureName) {
133bc0ca6ba4e31239bf77060578d0bdf1a10e04168Jason Sams        mFeatureName = featureName;
134bc0ca6ba4e31239bf77060578d0bdf1a10e04168Jason Sams    }
135bc0ca6ba4e31239bf77060578d0bdf1a10e04168Jason Sams
136bc0ca6ba4e31239bf77060578d0bdf1a10e04168Jason Sams    /**
137bc0ca6ba4e31239bf77060578d0bdf1a10e04168Jason Sams     * Returns the administrative area name of the address, for example, "CA", or null if
1380b575de8ed0b628d84d256f5846500b0385979bdTim Murray     * it is unknown
13986087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines     */
14050bfc354e61e174a465893fd0dafe913f1954478Alex Sakhartchouk    public String getAdminArea() {
141326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        return mAdminArea;
142326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
14386087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines
14486087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines    /**
14586087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines     * Sets the administrative area name of the address to the given String, which may be null
14686087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines     */
14786087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines    public void setAdminArea(String adminArea) {
14886087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines        this.mAdminArea = adminArea;
14986087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines    }
15086087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines
15186087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines    /**
15286087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines     * Returns the sub-administrative area name of the address, for example, "Santa Clara County",
15386087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines     * or null if it is unknown
15486087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines     */
15586087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines    public String getSubAdminArea() {
15686087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines        return mSubAdminArea;
15786087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines    }
15886087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines
15986087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines    /**
16086087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines     * Sets the sub-administrative area name of the address to the given String, which may be null
16186087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines     */
16286087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines    public void setSubAdminArea(String subAdminArea) {
16386087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines        this.mSubAdminArea = subAdminArea;
16486087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines    }
16586087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines
16686087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines    /**
16786087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines     * Returns the locality of the address, for example "Mountain View", or null if it is unknown.
16886087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines     */
16986087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines    public String getLocality() {
17086087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines        return mLocality;
17186087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines    }
17286087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines
17386087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines    /**
17486087f2f1da630d43f4010c246619f3fd4fad286Stephen Hines     * Sets the locality of the address to the given String, which may be null.
175afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk     */
176e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams    public void setLocality(String locality) {
177e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams        mLocality = locality;
17850bfc354e61e174a465893fd0dafe913f1954478Alex Sakhartchouk    }
17950bfc354e61e174a465893fd0dafe913f1954478Alex Sakhartchouk
18050bfc354e61e174a465893fd0dafe913f1954478Alex Sakhartchouk    /**
18150bfc354e61e174a465893fd0dafe913f1954478Alex Sakhartchouk     * Returns the sub-locality of the address, or null if it is unknown.
182246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk     * For example, this may correspond to the neighborhood of the locality.
18350bfc354e61e174a465893fd0dafe913f1954478Alex Sakhartchouk     */
18487319de2b16a185cf360827c96a42cf1fcaae744Jason Sams    public String getSubLocality() {
185e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams        return mSubLocality;
186e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams    }
187e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams
188e3150cfb3edb028407669e4a65e087eae77e718cJason Sams    /**
189fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk     * Sets the sub-locality of the address to the given String, which may be null.
190fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk     */
191fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    public void setSubLocality(String sublocality) {
192fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        mSubLocality = sublocality;
193fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    }
194fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
195e3150cfb3edb028407669e4a65e087eae77e718cJason Sams    /**
196fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk     * Returns the thoroughfare name of the address, for example, "1600 Ampitheater Parkway",
19750bfc354e61e174a465893fd0dafe913f1954478Alex Sakhartchouk     * which may be null
19850bfc354e61e174a465893fd0dafe913f1954478Alex Sakhartchouk     */
19950bfc354e61e174a465893fd0dafe913f1954478Alex Sakhartchouk    public String getThoroughfare() {
200fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        return mThoroughfare;
201246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk    }
20250bfc354e61e174a465893fd0dafe913f1954478Alex Sakhartchouk
203fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    /**
204fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk     * Sets the thoroughfare name of the address, which may be null.
205afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk     */
206fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    public void setThoroughfare(String thoroughfare) {
207b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk        this.mThoroughfare = thoroughfare;
208afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    }
209af12ac6a08651464f8d823add667c706f993b587Steve Block
210fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    /**
211fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk     * Returns the sub-thoroughfare name of the address, which may be null.
212fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk     * This may correspond to the street number of the address.
213fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk     */
214fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    public String getSubThoroughfare() {
215fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        return mSubThoroughfare;
216fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    }
217afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk
218fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    /**
219fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk     * Sets the sub-thoroughfare name of the address, which may be null.
220fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk     */
221f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams    public void setSubThoroughfare(String subthoroughfare) {
222f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams        this.mSubThoroughfare = subthoroughfare;
223f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams    }
224f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams
225f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams    /**
226a572aca4eb4ddb32c10baa1f529431cfefd756b8Jason Sams     * Returns the premises of the address, or null if it is unknown.
227c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk     */
228c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    public String getPremises() {
229fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        return mPremises;
230fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    }
231afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk
232ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams    /**
233ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams     * Sets the premises of the address to the given String, which may be null.
234ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams     */
235ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams    public void setPremises(String premises) {
236ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams        mPremises = premises;
237ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams    }
238ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams
239ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams    /**
240ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams     * Returns the postal code of the address, for example "94110",
241ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams     * or null if it is unknown.
242ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams     */
243ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams    public String getPostalCode() {
244ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams        return mPostalCode;
245ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams    }
246ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams
247ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams    /**
248c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk     * Sets the postal code of the address to the given String, which may
249c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk     * be null.
250a572aca4eb4ddb32c10baa1f529431cfefd756b8Jason Sams     */
251c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    public void setPostalCode(String postalCode) {
252e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams        mPostalCode = postalCode;
25396abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    }
254f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams
255f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams    /**
25696abf819e50b59ba8cf886c13f894633eb0a24baJason Sams     * Returns the country code of the address, for example "US",
25796abf819e50b59ba8cf886c13f894633eb0a24baJason Sams     * or null if it is unknown.
258f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams     */
25996abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    public String getCountryCode() {
260f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams        return mCountryCode;
261f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams    }
262f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams
263f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams    /**
264a572aca4eb4ddb32c10baa1f529431cfefd756b8Jason Sams     * Sets the country code of the address to the given String, which may
265c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk     * be null.
266f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams     */
267c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    public void setCountryCode(String countryCode) {
26896abf819e50b59ba8cf886c13f894633eb0a24baJason Sams        mCountryCode = countryCode;
269f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams    }
270f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams
27196abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    /**
27296abf819e50b59ba8cf886c13f894633eb0a24baJason Sams     * Returns the localized country name of the address, for example "Iceland",
273246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk     * or null if it is unknown.
274c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk     */
275f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams    public String getCountryName() {
27650bfc354e61e174a465893fd0dafe913f1954478Alex Sakhartchouk        return mCountryName;
27750bfc354e61e174a465893fd0dafe913f1954478Alex Sakhartchouk    }
27850bfc354e61e174a465893fd0dafe913f1954478Alex Sakhartchouk
27950bfc354e61e174a465893fd0dafe913f1954478Alex Sakhartchouk    /**
280a572aca4eb4ddb32c10baa1f529431cfefd756b8Jason Sams     * Sets the country name of the address to the given String, which may
28196abf819e50b59ba8cf886c13f894633eb0a24baJason Sams     * be null.
282f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams     */
283f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams    public void setCountryName(String countryName) {
284f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams        mCountryName = countryName;
285f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams    }
286f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams
287c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    /**
28896abf819e50b59ba8cf886c13f894633eb0a24baJason Sams     * Returns true if a latitude has been assigned to this Address,
28996abf819e50b59ba8cf886c13f894633eb0a24baJason Sams     * false otherwise.
290c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk     */
291c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    public boolean hasLatitude() {
292a572aca4eb4ddb32c10baa1f529431cfefd756b8Jason Sams        return mHasLatitude;
293f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams    }
29496abf819e50b59ba8cf886c13f894633eb0a24baJason Sams
295c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    /**
296afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk     * Returns the latitude of the address if known.
297afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk     *
298c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk     * @throws IllegalStateException if this Address has not been assigned
299a572aca4eb4ddb32c10baa1f529431cfefd756b8Jason Sams     * a latitude.
30096abf819e50b59ba8cf886c13f894633eb0a24baJason Sams     */
30196abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    public double getLatitude() {
30296abf819e50b59ba8cf886c13f894633eb0a24baJason Sams        if (mHasLatitude) {
3039f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines            return mLatitude;
3049f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines        } else {
3059f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines            throw new IllegalStateException();
3069f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines        }
3079f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines    }
3089f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines
3099f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines    /**
3109f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines     * Sets the latitude associated with this address.
3119f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines     */
3129f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines    public void setLatitude(double latitude) {
3139f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines        mLatitude = latitude;
3149f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines        mHasLatitude = true;
3159f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines    }
3169f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines
3179f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines    /**
3189f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines     * Removes any latitude associated with this address.
3199f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines     */
3209f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines    public void clearLatitude() {
3219f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines        mHasLatitude = false;
3229f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines    }
3239f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines
3249f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines    /**
3259f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines     * Returns true if a longitude has been assigned to this Address,
3269f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines     * false otherwise.
3279f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines     */
3289f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines    public boolean hasLongitude() {
3299f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines        return mHasLongitude;
3309f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines    }
3319f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines
3329f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines    /**
3339f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines     * Returns the longitude of the address if known.
334326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams     *
335e5ffb879ae535a899a486285a23bea05e912480fJason Sams     * @throws IllegalStateException if this Address has not been assigned
336326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams     * a longitude.
337326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams     */
338326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    public double getLongitude() {
339c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        if (mHasLongitude) {
340a572aca4eb4ddb32c10baa1f529431cfefd756b8Jason Sams            return mLongitude;
3412353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams        } else {
3422353ae303868d04e3a26002b2f2dc456c15e8170Jason Sams            throw new IllegalStateException();
343a572aca4eb4ddb32c10baa1f529431cfefd756b8Jason Sams        }
344326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
345326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
346c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams    /**
347c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams     * Sets the longitude associated with this address.
348c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams     */
349099bc262f862cdeb547cf8a78fe9e0e92560f437Tim Murray    public void setLongitude(double longitude) {
350dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk        mLongitude = longitude;
35150bfc354e61e174a465893fd0dafe913f1954478Alex Sakhartchouk        mHasLongitude = true;
352246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk    }
353dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk
354dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk    /**
355dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk     * Removes any longitude associated with this address.
356dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk     */
357dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk    public void clearLongitude() {
358246fbee66ccb17cb1f08a5420e104a709183bce1Alex Sakhartchouk        mHasLongitude = false;
359dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk    }
360099bc262f862cdeb547cf8a78fe9e0e92560f437Tim Murray
361dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk    /**
362dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk     * Returns the phone number of the address if known,
363     * or null if it is unknown.
364     *
365     * @throws IllegalStateException if this Address has not been assigned
366     * a latitude.
367     */
368    public String getPhone() {
369        return mPhone;
370    }
371
372    /**
373     * Sets the phone number associated with this address.
374     */
375    public void setPhone(String phone) {
376        mPhone = phone;
377    }
378
379    /**
380     * Returns the public URL for the address if known,
381     * or null if it is unknown.
382     */
383    public String getUrl() {
384        return mUrl;
385    }
386
387    /**
388     * Sets the public URL associated with this address.
389     */
390    public void setUrl(String Url) {
391        mUrl = Url;
392    }
393
394    /**
395     * Returns additional provider-specific information about the
396     * address as a Bundle.  The keys and values are determined
397     * by the provider.  If no additional information is available,
398     * null is returned.
399     *
400     * <!--
401     * <p> A number of common key/value pairs are listed
402     * below. Providers that use any of the keys on this list must
403     * provide the corresponding value as described below.
404     *
405     * <ul>
406     * </ul>
407     * -->
408     */
409    public Bundle getExtras() {
410        return mExtras;
411    }
412
413    /**
414     * Sets the extra information associated with this fix to the
415     * given Bundle.
416     */
417    public void setExtras(Bundle extras) {
418        mExtras = (extras == null) ? null : new Bundle(extras);
419    }
420
421    @Override
422    public String toString() {
423        StringBuilder sb = new StringBuilder();
424        sb.append("Address[addressLines=[");
425        for (int i = 0; i <= mMaxAddressLineIndex; i++) {
426            if (i > 0) {
427                sb.append(',');
428            }
429            sb.append(i);
430            sb.append(':');
431            String line = mAddressLines.get(i);
432            if (line == null) {
433                sb.append("null");
434            } else {
435                sb.append('\"');
436                sb.append(line);
437                sb.append('\"');
438            }
439        }
440        sb.append(']');
441        sb.append(",feature=");
442        sb.append(mFeatureName);
443        sb.append(",admin=");
444        sb.append(mAdminArea);
445        sb.append(",sub-admin=");
446        sb.append(mSubAdminArea);
447        sb.append(",locality=");
448        sb.append(mLocality);
449        sb.append(",thoroughfare=");
450        sb.append(mThoroughfare);
451        sb.append(",postalCode=");
452        sb.append(mPostalCode);
453        sb.append(",countryCode=");
454        sb.append(mCountryCode);
455        sb.append(",countryName=");
456        sb.append(mCountryName);
457        sb.append(",hasLatitude=");
458        sb.append(mHasLatitude);
459        sb.append(",latitude=");
460        sb.append(mLatitude);
461        sb.append(",hasLongitude=");
462        sb.append(mHasLongitude);
463        sb.append(",longitude=");
464        sb.append(mLongitude);
465        sb.append(",phone=");
466        sb.append(mPhone);
467        sb.append(",url=");
468        sb.append(mUrl);
469        sb.append(",extras=");
470        sb.append(mExtras);
471        sb.append(']');
472        return sb.toString();
473    }
474
475    public static final Parcelable.Creator<Address> CREATOR =
476        new Parcelable.Creator<Address>() {
477        public Address createFromParcel(Parcel in) {
478            String language = in.readString();
479            String country = in.readString();
480            Locale locale = country.length() > 0 ?
481                new Locale(language, country) :
482                new Locale(language);
483            Address a = new Address(locale);
484
485            int N = in.readInt();
486            if (N > 0) {
487                a.mAddressLines = new HashMap<Integer, String>(N);
488                for (int i = 0; i < N; i++) {
489                    int index = in.readInt();
490                    String line = in.readString();
491                    a.mAddressLines.put(index, line);
492                    a.mMaxAddressLineIndex =
493                        Math.max(a.mMaxAddressLineIndex, index);
494                }
495            } else {
496                a.mAddressLines = null;
497                a.mMaxAddressLineIndex = -1;
498            }
499            a.mFeatureName = in.readString();
500            a.mAdminArea = in.readString();
501            a.mSubAdminArea = in.readString();
502            a.mLocality = in.readString();
503            a.mSubLocality = in.readString();
504            a.mThoroughfare = in.readString();
505            a.mSubThoroughfare = in.readString();
506            a.mPremises = in.readString();
507            a.mPostalCode = in.readString();
508            a.mCountryCode = in.readString();
509            a.mCountryName = in.readString();
510            a.mHasLatitude = in.readInt() == 0 ? false : true;
511            if (a.mHasLatitude) {
512                a.mLatitude = in.readDouble();
513            }
514            a.mHasLongitude = in.readInt() == 0 ? false : true;
515            if (a.mHasLongitude) {
516                a.mLongitude = in.readDouble();
517            }
518            a.mPhone = in.readString();
519            a.mUrl = in.readString();
520            a.mExtras = in.readBundle();
521            return a;
522        }
523
524        public Address[] newArray(int size) {
525            return new Address[size];
526        }
527    };
528
529    public int describeContents() {
530        return (mExtras != null) ? mExtras.describeContents() : 0;
531    }
532
533    public void writeToParcel(Parcel parcel, int flags) {
534        parcel.writeString(mLocale.getLanguage());
535        parcel.writeString(mLocale.getCountry());
536        if (mAddressLines == null) {
537            parcel.writeInt(0);
538        } else {
539            Set<Map.Entry<Integer, String>> entries = mAddressLines.entrySet();
540            parcel.writeInt(entries.size());
541            for (Map.Entry<Integer, String> e : entries) {
542                parcel.writeInt(e.getKey());
543                parcel.writeString(e.getValue());
544            }
545        }
546        parcel.writeString(mFeatureName);
547        parcel.writeString(mAdminArea);
548        parcel.writeString(mSubAdminArea);
549        parcel.writeString(mLocality);
550        parcel.writeString(mSubLocality);
551        parcel.writeString(mThoroughfare);
552        parcel.writeString(mSubThoroughfare);
553        parcel.writeString(mPremises);
554        parcel.writeString(mPostalCode);
555        parcel.writeString(mCountryCode);
556        parcel.writeString(mCountryName);
557        parcel.writeInt(mHasLatitude ? 1 : 0);
558        if (mHasLatitude) {
559            parcel.writeDouble(mLatitude);
560        }
561        parcel.writeInt(mHasLongitude ? 1 : 0);
562        if (mHasLongitude){
563            parcel.writeDouble(mLongitude);
564        }
565        parcel.writeString(mPhone);
566        parcel.writeString(mUrl);
567        parcel.writeBundle(mExtras);
568    }
569}
570