blob: 812c34d97424672f5a3e9ea267f3a80572758f42 [file] [log] [blame]
/*
* Copyright (C) 2009 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 com.android.providers.contacts;
import android.content.ContentValues;
import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
import android.text.TextUtils;
import java.util.Locale;
/**
* Split and join {@link StructuredPostal} fields.
*/
public class PostalSplitter {
private static final String JAPANESE_LANGUAGE = Locale.JAPANESE.getLanguage().toLowerCase();
private final Locale mLocale;
public static class Postal {
public String street;
public String pobox;
public String neighborhood;
public String city;
public String region;
public String postcode;
public String country;
public void fromValues(ContentValues values) {
street = values.getAsString(StructuredPostal.STREET);
pobox = values.getAsString(StructuredPostal.POBOX);
neighborhood = values.getAsString(StructuredPostal.NEIGHBORHOOD);
city = values.getAsString(StructuredPostal.CITY);
region = values.getAsString(StructuredPostal.REGION);
postcode = values.getAsString(StructuredPostal.POSTCODE);
country = values.getAsString(StructuredPostal.COUNTRY);
}
public void toValues(ContentValues values) {
values.put(StructuredPostal.STREET, street);
values.put(StructuredPostal.POBOX, pobox);
values.put(StructuredPostal.NEIGHBORHOOD, neighborhood);
values.put(StructuredPostal.CITY, city);
values.put(StructuredPostal.REGION, region);
values.put(StructuredPostal.POSTCODE, postcode);
values.put(StructuredPostal.COUNTRY, country);
}
}
public PostalSplitter(Locale locale) {
mLocale = locale;
}
/**
* Parses {@link StructuredPostal#FORMATTED_ADDRESS} and returns parsed
* components in the {@link Postal} object.
*/
public void split(Postal postal, String formattedAddress) {
if (!TextUtils.isEmpty(formattedAddress)) {
postal.street = formattedAddress;
}
}
private static final String NEWLINE = "\n";
private static final String COMMA = ",";
private static final String SPACE = " ";
/**
* Flattens the given {@link Postal} into a single field, usually for
* storage in {@link StructuredPostal#FORMATTED_ADDRESS}.
*/
public String join(Postal postal) {
final String[] values = new String[] {
postal.street, postal.pobox, postal.neighborhood, postal.city,
postal.region, postal.postcode, postal.country
};
// TODO: split off to handle various locales
if (mLocale != null &&
JAPANESE_LANGUAGE.equals(mLocale.getLanguage()) &&
!arePrintableAsciiOnly(values)) {
return joinJaJp(postal);
} else {
return joinEnUs(postal);
}
}
private String joinJaJp(final Postal postal) {
final boolean hasStreet = !TextUtils.isEmpty(postal.street);
final boolean hasPobox = !TextUtils.isEmpty(postal.pobox);
final boolean hasNeighborhood = !TextUtils.isEmpty(postal.neighborhood);
final boolean hasCity = !TextUtils.isEmpty(postal.city);
final boolean hasRegion = !TextUtils.isEmpty(postal.region);
final boolean hasPostcode = !TextUtils.isEmpty(postal.postcode);
final boolean hasCountry = !TextUtils.isEmpty(postal.country);
// First block: [country][ ][postcode]
// Second block: [region][ ][city][ ][neighborhood]
// Third block: [street][ ][pobox]
final StringBuilder builder = new StringBuilder();
final boolean hasFirstBlock = hasCountry || hasPostcode;
final boolean hasSecondBlock = hasRegion || hasCity || hasNeighborhood;
final boolean hasThirdBlock = hasStreet || hasPobox;
if (hasFirstBlock) {
if (hasCountry) {
builder.append(postal.country);
}
if (hasPostcode) {
if (hasCountry) builder.append(SPACE);
builder.append(postal.postcode);
}
}
if (hasSecondBlock) {
if (hasFirstBlock) {
builder.append(NEWLINE);
}
if (hasRegion) {
builder.append(postal.region);
}
if (hasCity) {
if (hasRegion) builder.append(SPACE);
builder.append(postal.city);
}
if (hasNeighborhood) {
if (hasRegion || hasCity) builder.append(SPACE);
builder.append(postal.neighborhood);
}
}
if (hasThirdBlock) {
if (hasFirstBlock || hasSecondBlock) {
builder.append(NEWLINE);
}
if (hasStreet) {
builder.append(postal.street);
}
if (hasPobox) {
if (hasStreet) builder.append(SPACE);
builder.append(postal.pobox);
}
}
if (builder.length() > 0) {
return builder.toString();
} else {
return null;
}
}
private String joinEnUs(final Postal postal) {
final boolean hasStreet = !TextUtils.isEmpty(postal.street);
final boolean hasPobox = !TextUtils.isEmpty(postal.pobox);
final boolean hasNeighborhood = !TextUtils.isEmpty(postal.neighborhood);
final boolean hasCity = !TextUtils.isEmpty(postal.city);
final boolean hasRegion = !TextUtils.isEmpty(postal.region);
final boolean hasPostcode = !TextUtils.isEmpty(postal.postcode);
final boolean hasCountry = !TextUtils.isEmpty(postal.country);
// First block: [street][\n][pobox][\n][neighborhood]
// Second block: [city][, ][region][ ][postcode]
// Third block: [country]
final StringBuilder builder = new StringBuilder();
final boolean hasFirstBlock = hasStreet || hasPobox || hasNeighborhood;
final boolean hasSecondBlock = hasCity || hasRegion || hasPostcode;
final boolean hasThirdBlock = hasCountry;
if (hasFirstBlock) {
if (hasStreet) {
builder.append(postal.street);
}
if (hasPobox) {
if (hasStreet) builder.append(NEWLINE);
builder.append(postal.pobox);
}
if (hasNeighborhood) {
if (hasStreet || hasPobox) builder.append(NEWLINE);
builder.append(postal.neighborhood);
}
}
if (hasSecondBlock) {
if (hasFirstBlock) {
builder.append(NEWLINE);
}
if (hasCity) {
builder.append(postal.city);
}
if (hasRegion) {
if (hasCity) builder.append(COMMA + SPACE);
builder.append(postal.region);
}
if (hasPostcode) {
if (hasCity || hasRegion) builder.append(SPACE);
builder.append(postal.postcode);
}
}
if (hasThirdBlock) {
if (hasFirstBlock || hasSecondBlock) {
builder.append(NEWLINE);
}
if (hasCountry) {
builder.append(postal.country);
}
}
if (builder.length() > 0) {
return builder.toString();
} else {
return null;
}
}
private static boolean arePrintableAsciiOnly(final String[] values) {
if (values == null) {
return true;
}
for (final String value : values) {
if (TextUtils.isEmpty(value)) {
continue;
}
if (!TextUtils.isPrintableAsciiOnly(value)) {
return false;
}
}
return true;
}
}