| /* | |
| * Copyright (C) 2007 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 android.location; | |
| import java.util.HashMap; | |
| import java.util.Locale; | |
| import java.util.Map; | |
| import java.util.Set; | |
| import android.os.Bundle; | |
| import android.os.Parcel; | |
| import android.os.Parcelable; | |
| /** | |
| * A class representing an Address, i.e, a set of Strings describing a location. | |
| * | |
| * The address format is a simplified version of xAL (eXtensible Address Language) | |
| * http://www.oasis-open.org/committees/ciq/ciq.html#6 | |
| */ | |
| public class Address implements Parcelable { | |
| private Locale mLocale; | |
| private String mFeatureName; | |
| private HashMap<Integer, String> mAddressLines; | |
| private int mMaxAddressLineIndex = -1; | |
| private String mAdminArea; | |
| private String mSubAdminArea; | |
| private String mLocality; | |
| private String mSubLocality; | |
| private String mThoroughfare; | |
| private String mSubThoroughfare; | |
| private String mPremises; | |
| private String mPostalCode; | |
| private String mCountryCode; | |
| private String mCountryName; | |
| private double mLatitude; | |
| private double mLongitude; | |
| private boolean mHasLatitude = false; | |
| private boolean mHasLongitude = false; | |
| private String mPhone; | |
| private String mUrl; | |
| private Bundle mExtras = null; | |
| /** | |
| * Constructs a new Address object set to the given Locale and with all | |
| * other fields initialized to null or false. | |
| */ | |
| public Address(Locale locale) { | |
| mLocale = locale; | |
| } | |
| /** | |
| * Returns the Locale associated with this address. | |
| */ | |
| public Locale getLocale() { | |
| return mLocale; | |
| } | |
| /** | |
| * Returns the largest index currently in use to specify an address line. | |
| * If no address lines are specified, -1 is returned. | |
| */ | |
| public int getMaxAddressLineIndex() { | |
| return mMaxAddressLineIndex; | |
| } | |
| /** | |
| * Returns a line of the address numbered by the given index | |
| * (starting at 0), or null if no such line is present. | |
| * | |
| * @throws IllegalArgumentException if index < 0 | |
| */ | |
| public String getAddressLine(int index) { | |
| if (index < 0) { | |
| throw new IllegalArgumentException("index = " + index + " < 0"); | |
| } | |
| return mAddressLines == null? null : mAddressLines.get(index); | |
| } | |
| /** | |
| * Sets the line of the address numbered by index (starting at 0) to the | |
| * given String, which may be null. | |
| * | |
| * @throws IllegalArgumentException if index < 0 | |
| */ | |
| public void setAddressLine(int index, String line) { | |
| if (index < 0) { | |
| throw new IllegalArgumentException("index = " + index + " < 0"); | |
| } | |
| if (mAddressLines == null) { | |
| mAddressLines = new HashMap<Integer, String>(); | |
| } | |
| mAddressLines.put(index, line); | |
| if (line == null) { | |
| // We've eliminated a line, recompute the max index | |
| mMaxAddressLineIndex = -1; | |
| for (Integer i : mAddressLines.keySet()) { | |
| mMaxAddressLineIndex = Math.max(mMaxAddressLineIndex, i); | |
| } | |
| } else { | |
| mMaxAddressLineIndex = Math.max(mMaxAddressLineIndex, index); | |
| } | |
| } | |
| /** | |
| * Returns the feature name of the address, for example, "Golden Gate Bridge", or null | |
| * if it is unknown | |
| */ | |
| public String getFeatureName() { | |
| return mFeatureName; | |
| } | |
| /** | |
| * Sets the feature name of the address to the given String, which may be null | |
| */ | |
| public void setFeatureName(String featureName) { | |
| mFeatureName = featureName; | |
| } | |
| /** | |
| * Returns the administrative area name of the address, for example, "CA", or null if | |
| * it is unknown | |
| */ | |
| public String getAdminArea() { | |
| return mAdminArea; | |
| } | |
| /** | |
| * Sets the administrative area name of the address to the given String, which may be null | |
| */ | |
| public void setAdminArea(String adminArea) { | |
| this.mAdminArea = adminArea; | |
| } | |
| /** | |
| * Returns the sub-administrative area name of the address, for example, "Santa Clara County", | |
| * or null if it is unknown | |
| */ | |
| public String getSubAdminArea() { | |
| return mSubAdminArea; | |
| } | |
| /** | |
| * Sets the sub-administrative area name of the address to the given String, which may be null | |
| */ | |
| public void setSubAdminArea(String subAdminArea) { | |
| this.mSubAdminArea = subAdminArea; | |
| } | |
| /** | |
| * Returns the locality of the address, for example "Mountain View", or null if it is unknown. | |
| */ | |
| public String getLocality() { | |
| return mLocality; | |
| } | |
| /** | |
| * Sets the locality of the address to the given String, which may be null. | |
| */ | |
| public void setLocality(String locality) { | |
| mLocality = locality; | |
| } | |
| /** | |
| * Returns the sub-locality of the address, or null if it is unknown. | |
| * For example, this may correspond to the neighborhood of the locality. | |
| */ | |
| public String getSubLocality() { | |
| return mSubLocality; | |
| } | |
| /** | |
| * Sets the sub-locality of the address to the given String, which may be null. | |
| */ | |
| public void setSubLocality(String sublocality) { | |
| mSubLocality = sublocality; | |
| } | |
| /** | |
| * Returns the thoroughfare name of the address, for example, "1600 Ampitheater Parkway", | |
| * which may be null | |
| */ | |
| public String getThoroughfare() { | |
| return mThoroughfare; | |
| } | |
| /** | |
| * Sets the thoroughfare name of the address, which may be null. | |
| */ | |
| public void setThoroughfare(String thoroughfare) { | |
| this.mThoroughfare = thoroughfare; | |
| } | |
| /** | |
| * Returns the sub-thoroughfare name of the address, which may be null. | |
| * This may correspond to the street number of the address. | |
| */ | |
| public String getSubThoroughfare() { | |
| return mSubThoroughfare; | |
| } | |
| /** | |
| * Sets the sub-thoroughfare name of the address, which may be null. | |
| */ | |
| public void setSubThoroughfare(String subthoroughfare) { | |
| this.mSubThoroughfare = subthoroughfare; | |
| } | |
| /** | |
| * Returns the premises of the address, or null if it is unknown. | |
| */ | |
| public String getPremises() { | |
| return mPremises; | |
| } | |
| /** | |
| * Sets the premises of the address to the given String, which may be null. | |
| */ | |
| public void setPremises(String premises) { | |
| mPremises = premises; | |
| } | |
| /** | |
| * Returns the postal code of the address, for example "94110", | |
| * or null if it is unknown. | |
| */ | |
| public String getPostalCode() { | |
| return mPostalCode; | |
| } | |
| /** | |
| * Sets the postal code of the address to the given String, which may | |
| * be null. | |
| */ | |
| public void setPostalCode(String postalCode) { | |
| mPostalCode = postalCode; | |
| } | |
| /** | |
| * Returns the country code of the address, for example "US", | |
| * or null if it is unknown. | |
| */ | |
| public String getCountryCode() { | |
| return mCountryCode; | |
| } | |
| /** | |
| * Sets the country code of the address to the given String, which may | |
| * be null. | |
| */ | |
| public void setCountryCode(String countryCode) { | |
| mCountryCode = countryCode; | |
| } | |
| /** | |
| * Returns the localized country name of the address, for example "Iceland", | |
| * or null if it is unknown. | |
| */ | |
| public String getCountryName() { | |
| return mCountryName; | |
| } | |
| /** | |
| * Sets the country name of the address to the given String, which may | |
| * be null. | |
| */ | |
| public void setCountryName(String countryName) { | |
| mCountryName = countryName; | |
| } | |
| /** | |
| * Returns true if a latitude has been assigned to this Address, | |
| * false otherwise. | |
| */ | |
| public boolean hasLatitude() { | |
| return mHasLatitude; | |
| } | |
| /** | |
| * Returns the latitude of the address if known. | |
| * | |
| * @throws IllegalStateException if this Address has not been assigned | |
| * a latitude. | |
| */ | |
| public double getLatitude() { | |
| if (mHasLatitude) { | |
| return mLatitude; | |
| } else { | |
| throw new IllegalStateException(); | |
| } | |
| } | |
| /** | |
| * Sets the latitude associated with this address. | |
| */ | |
| public void setLatitude(double latitude) { | |
| mLatitude = latitude; | |
| mHasLatitude = true; | |
| } | |
| /** | |
| * Removes any latitude associated with this address. | |
| */ | |
| public void clearLatitude() { | |
| mHasLatitude = false; | |
| } | |
| /** | |
| * Returns true if a longitude has been assigned to this Address, | |
| * false otherwise. | |
| */ | |
| public boolean hasLongitude() { | |
| return mHasLongitude; | |
| } | |
| /** | |
| * Returns the longitude of the address if known. | |
| * | |
| * @throws IllegalStateException if this Address has not been assigned | |
| * a longitude. | |
| */ | |
| public double getLongitude() { | |
| if (mHasLongitude) { | |
| return mLongitude; | |
| } else { | |
| throw new IllegalStateException(); | |
| } | |
| } | |
| /** | |
| * Sets the longitude associated with this address. | |
| */ | |
| public void setLongitude(double longitude) { | |
| mLongitude = longitude; | |
| mHasLongitude = true; | |
| } | |
| /** | |
| * Removes any longitude associated with this address. | |
| */ | |
| public void clearLongitude() { | |
| mHasLongitude = false; | |
| } | |
| /** | |
| * Returns the phone number of the address if known, | |
| * or null if it is unknown. | |
| * | |
| * @throws IllegalStateException if this Address has not been assigned | |
| * a phone number. | |
| */ | |
| public String getPhone() { | |
| return mPhone; | |
| } | |
| /** | |
| * Sets the phone number associated with this address. | |
| */ | |
| public void setPhone(String phone) { | |
| mPhone = phone; | |
| } | |
| /** | |
| * Returns the public URL for the address if known, | |
| * or null if it is unknown. | |
| */ | |
| public String getUrl() { | |
| return mUrl; | |
| } | |
| /** | |
| * Sets the public URL associated with this address. | |
| */ | |
| public void setUrl(String Url) { | |
| mUrl = Url; | |
| } | |
| /** | |
| * Returns additional provider-specific information about the | |
| * address as a Bundle. The keys and values are determined | |
| * by the provider. If no additional information is available, | |
| * null is returned. | |
| * | |
| * <!-- | |
| * <p> A number of common key/value pairs are listed | |
| * below. Providers that use any of the keys on this list must | |
| * provide the corresponding value as described below. | |
| * | |
| * <ul> | |
| * </ul> | |
| * --> | |
| */ | |
| public Bundle getExtras() { | |
| return mExtras; | |
| } | |
| /** | |
| * Sets the extra information associated with this fix to the | |
| * given Bundle. | |
| */ | |
| public void setExtras(Bundle extras) { | |
| mExtras = (extras == null) ? null : new Bundle(extras); | |
| } | |
| @Override | |
| public String toString() { | |
| StringBuilder sb = new StringBuilder(); | |
| sb.append("Address[addressLines=["); | |
| for (int i = 0; i <= mMaxAddressLineIndex; i++) { | |
| if (i > 0) { | |
| sb.append(','); | |
| } | |
| sb.append(i); | |
| sb.append(':'); | |
| String line = mAddressLines.get(i); | |
| if (line == null) { | |
| sb.append("null"); | |
| } else { | |
| sb.append('\"'); | |
| sb.append(line); | |
| sb.append('\"'); | |
| } | |
| } | |
| sb.append(']'); | |
| sb.append(",feature="); | |
| sb.append(mFeatureName); | |
| sb.append(",admin="); | |
| sb.append(mAdminArea); | |
| sb.append(",sub-admin="); | |
| sb.append(mSubAdminArea); | |
| sb.append(",locality="); | |
| sb.append(mLocality); | |
| sb.append(",thoroughfare="); | |
| sb.append(mThoroughfare); | |
| sb.append(",postalCode="); | |
| sb.append(mPostalCode); | |
| sb.append(",countryCode="); | |
| sb.append(mCountryCode); | |
| sb.append(",countryName="); | |
| sb.append(mCountryName); | |
| sb.append(",hasLatitude="); | |
| sb.append(mHasLatitude); | |
| sb.append(",latitude="); | |
| sb.append(mLatitude); | |
| sb.append(",hasLongitude="); | |
| sb.append(mHasLongitude); | |
| sb.append(",longitude="); | |
| sb.append(mLongitude); | |
| sb.append(",phone="); | |
| sb.append(mPhone); | |
| sb.append(",url="); | |
| sb.append(mUrl); | |
| sb.append(",extras="); | |
| sb.append(mExtras); | |
| sb.append(']'); | |
| return sb.toString(); | |
| } | |
| public static final @android.annotation.NonNull Parcelable.Creator<Address> CREATOR = | |
| new Parcelable.Creator<Address>() { | |
| public Address createFromParcel(Parcel in) { | |
| String language = in.readString(); | |
| String country = in.readString(); | |
| Locale locale = country.length() > 0 ? | |
| new Locale(language, country) : | |
| new Locale(language); | |
| Address a = new Address(locale); | |
| int N = in.readInt(); | |
| if (N > 0) { | |
| a.mAddressLines = new HashMap<Integer, String>(N); | |
| for (int i = 0; i < N; i++) { | |
| int index = in.readInt(); | |
| String line = in.readString(); | |
| a.mAddressLines.put(index, line); | |
| a.mMaxAddressLineIndex = | |
| Math.max(a.mMaxAddressLineIndex, index); | |
| } | |
| } else { | |
| a.mAddressLines = null; | |
| a.mMaxAddressLineIndex = -1; | |
| } | |
| a.mFeatureName = in.readString(); | |
| a.mAdminArea = in.readString(); | |
| a.mSubAdminArea = in.readString(); | |
| a.mLocality = in.readString(); | |
| a.mSubLocality = in.readString(); | |
| a.mThoroughfare = in.readString(); | |
| a.mSubThoroughfare = in.readString(); | |
| a.mPremises = in.readString(); | |
| a.mPostalCode = in.readString(); | |
| a.mCountryCode = in.readString(); | |
| a.mCountryName = in.readString(); | |
| a.mHasLatitude = in.readInt() == 0 ? false : true; | |
| if (a.mHasLatitude) { | |
| a.mLatitude = in.readDouble(); | |
| } | |
| a.mHasLongitude = in.readInt() == 0 ? false : true; | |
| if (a.mHasLongitude) { | |
| a.mLongitude = in.readDouble(); | |
| } | |
| a.mPhone = in.readString(); | |
| a.mUrl = in.readString(); | |
| a.mExtras = in.readBundle(); | |
| return a; | |
| } | |
| public Address[] newArray(int size) { | |
| return new Address[size]; | |
| } | |
| }; | |
| public int describeContents() { | |
| return (mExtras != null) ? mExtras.describeContents() : 0; | |
| } | |
| public void writeToParcel(Parcel parcel, int flags) { | |
| parcel.writeString(mLocale.getLanguage()); | |
| parcel.writeString(mLocale.getCountry()); | |
| if (mAddressLines == null) { | |
| parcel.writeInt(0); | |
| } else { | |
| Set<Map.Entry<Integer, String>> entries = mAddressLines.entrySet(); | |
| parcel.writeInt(entries.size()); | |
| for (Map.Entry<Integer, String> e : entries) { | |
| parcel.writeInt(e.getKey()); | |
| parcel.writeString(e.getValue()); | |
| } | |
| } | |
| parcel.writeString(mFeatureName); | |
| parcel.writeString(mAdminArea); | |
| parcel.writeString(mSubAdminArea); | |
| parcel.writeString(mLocality); | |
| parcel.writeString(mSubLocality); | |
| parcel.writeString(mThoroughfare); | |
| parcel.writeString(mSubThoroughfare); | |
| parcel.writeString(mPremises); | |
| parcel.writeString(mPostalCode); | |
| parcel.writeString(mCountryCode); | |
| parcel.writeString(mCountryName); | |
| parcel.writeInt(mHasLatitude ? 1 : 0); | |
| if (mHasLatitude) { | |
| parcel.writeDouble(mLatitude); | |
| } | |
| parcel.writeInt(mHasLongitude ? 1 : 0); | |
| if (mHasLongitude){ | |
| parcel.writeDouble(mLongitude); | |
| } | |
| parcel.writeString(mPhone); | |
| parcel.writeString(mUrl); | |
| parcel.writeBundle(mExtras); | |
| } | |
| } |