9e8f83db6d
If they were null, then the Parcelable would fail to work. Bug: 126726802 Test: manual Change-Id: I7929ffa2f20e5de1c8e68e8263cca99496e9d014 Exempt-From-Owner-Approval: Trivial API annotations
570 lines
16 KiB
Java
570 lines
16 KiB
Java
/*
|
|
* 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);
|
|
}
|
|
}
|