PhoneticNameEditorView.java revision 428f008513d1591cc08fcfe2cf0c9237fb313241
15ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov/* 25ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov * Copyright (C) 2010 The Android Open Source Project 35ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov * 45ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov * Licensed under the Apache License, Version 2.0 (the "License"); 55ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov * you may not use this file except in compliance with the License. 65ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov * You may obtain a copy of the License at 75ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov * 85ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov * http://www.apache.org/licenses/LICENSE-2.0 95ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov * 105ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov * Unless required by applicable law or agreed to in writing, software 115ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov * distributed under the License is distributed on an "AS IS" BASIS, 125ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov * See the License for the specific language governing permissions and 145ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov * limitations under the License. 155ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov */ 165ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov 175ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikovpackage com.android.contacts.editor; 185ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov 195ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikovimport android.content.Context; 205ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.StructuredName; 215ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikovimport android.text.TextUtils; 225ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikovimport android.util.AttributeSet; 235ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov 24851222a96b5d68602fb361ea3527101e893f67e3Maurice Chuimport com.android.contacts.model.RawContactDelta; 25851222a96b5d68602fb361ea3527101e893f67e3Maurice Chuimport com.android.contacts.model.RawContactDelta.ValuesDelta; 26428f008513d1591cc08fcfe2cf0c9237fb313241Chiao Chengimport com.android.contacts.common.model.dataitem.DataKind; 27851222a96b5d68602fb361ea3527101e893f67e3Maurice Chuimport com.android.contacts.model.dataitem.StructuredNameDataItem; 28e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Cheng 295ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov/** 305ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov * A dedicated editor for phonetic name. It is similar to {@link StructuredNameEditorView}. 315ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov */ 325ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikovpublic class PhoneticNameEditorView extends TextFieldsEditorView { 335ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov 345ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov private static class PhoneticValuesDelta extends ValuesDelta { 355ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov private ValuesDelta mValues; 365ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov private String mPhoneticName; 375ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov 385ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov public PhoneticValuesDelta(ValuesDelta values) { 395ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov mValues = values; 405ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov buildPhoneticName(); 415ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov } 425ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov 435ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov @Override 445ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov public void put(String key, String value) { 455ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov if (key.equals(DataKind.PSEUDO_COLUMN_PHONETIC_NAME)) { 465ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov mPhoneticName = value; 475ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov parsePhoneticName(value); 485ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov } else { 495ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov mValues.put(key, value); 505ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov buildPhoneticName(); 515ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov } 525ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov } 535ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov 545ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov @Override 555ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov public String getAsString(String key) { 565ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov if (key.equals(DataKind.PSEUDO_COLUMN_PHONETIC_NAME)) { 575ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov return mPhoneticName; 585ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov } else { 595ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov return mValues.getAsString(key); 605ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov } 615ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov } 625ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov 635ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov private void parsePhoneticName(String value) { 64851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu StructuredNameDataItem dataItem = PhoneticNameEditorView.parsePhoneticName(value, null); 65851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu mValues.setPhoneticFamilyName(dataItem.getPhoneticFamilyName()); 66851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu mValues.setPhoneticMiddleName(dataItem.getPhoneticMiddleName()); 67851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu mValues.setPhoneticGivenName(dataItem.getPhoneticGivenName()); 685ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov } 695ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov 705ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov private void buildPhoneticName() { 71851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu String family = mValues.getPhoneticFamilyName(); 72851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu String middle = mValues.getPhoneticMiddleName(); 73851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu String given = mValues.getPhoneticGivenName(); 74d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa mPhoneticName = PhoneticNameEditorView.buildPhoneticName(family, middle, given); 755ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov } 765ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov 775ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov @Override 785ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov public Long getId() { 795ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov return mValues.getId(); 805ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov } 815ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov 825ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov @Override 835ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov public boolean isVisible() { 845ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov return mValues.isVisible(); 855ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov } 865ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov } 875ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov 88d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa /** 89d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa * Parses phonetic name and returns parsed data (family, middle, given) as ContentValues. 90d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa * Parsed data should be {@link StructuredName#PHONETIC_FAMILY_NAME}, 91d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa * {@link StructuredName#PHONETIC_MIDDLE_NAME}, and 92d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa * {@link StructuredName#PHONETIC_GIVEN_NAME}. 93d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa * If this method cannot parse given phoneticName, null values will be stored. 94d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa * 95d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa * @param phoneticName Phonetic name to be parsed 96d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa * @param values ContentValues to be used for storing data. If null, new instance will be 97d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa * created. 98d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa * @return ContentValues with parsed data. Those data can be null. 99d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa */ 100851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu public static StructuredNameDataItem parsePhoneticName(String phoneticName, 101851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu StructuredNameDataItem item) { 102d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa String family = null; 103d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa String middle = null; 104d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa String given = null; 105d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa 106d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa if (!TextUtils.isEmpty(phoneticName)) { 107d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa String[] strings = phoneticName.split(" ", 3); 108d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa switch (strings.length) { 109d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa case 1: 110d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa family = strings[0]; 111d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa break; 112d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa case 2: 113d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa family = strings[0]; 114d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa given = strings[1]; 115d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa break; 116d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa case 3: 117d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa family = strings[0]; 118d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa middle = strings[1]; 119d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa given = strings[2]; 120d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa break; 121d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa } 122d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa } 123d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa 124851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu if (item == null) { 125851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu item = new StructuredNameDataItem(); 126d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa } 127851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu item.setPhoneticFamilyName(family); 128851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu item.setPhoneticMiddleName(middle); 129851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu item.setPhoneticGivenName(given); 130851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu return item; 131d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa } 132d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa 133d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa /** 134d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa * Constructs and returns a phonetic full name from given parts. 135d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa */ 136d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa public static String buildPhoneticName(String family, String middle, String given) { 137d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa if (!TextUtils.isEmpty(family) || !TextUtils.isEmpty(middle) 138d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa || !TextUtils.isEmpty(given)) { 139d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa StringBuilder sb = new StringBuilder(); 140d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa if (!TextUtils.isEmpty(family)) { 141d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa sb.append(family.trim()).append(' '); 142d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa } 143d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa if (!TextUtils.isEmpty(middle)) { 144d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa sb.append(middle.trim()).append(' '); 145d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa } 146d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa if (!TextUtils.isEmpty(given)) { 147d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa sb.append(given.trim()).append(' '); 148d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa } 149d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa sb.setLength(sb.length() - 1); // Yank the last space 150d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa return sb.toString(); 151d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa } else { 152d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa return null; 153d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa } 154d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa } 155d37a891cb44cd17083c06d7be693c469403d16dfDaisuke Miyakawa 1561a7f42494dbde3c268bc0763ebd62d55d43027aeKatherine Kuan public static boolean isUnstructuredPhoneticNameColumn(String column) { 1571a7f42494dbde3c268bc0763ebd62d55d43027aeKatherine Kuan return DataKind.PSEUDO_COLUMN_PHONETIC_NAME.equals(column); 1581a7f42494dbde3c268bc0763ebd62d55d43027aeKatherine Kuan } 1591a7f42494dbde3c268bc0763ebd62d55d43027aeKatherine Kuan 1605ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov public PhoneticNameEditorView(Context context) { 1615ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov super(context); 1625ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov } 1635ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov 1645ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov public PhoneticNameEditorView(Context context, AttributeSet attrs) { 1655ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov super(context, attrs); 1665ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov } 1675ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov 1685ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov public PhoneticNameEditorView(Context context, AttributeSet attrs, int defStyle) { 1695ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov super(context, attrs, defStyle); 1705ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov } 1715ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov 1725ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov @Override 173851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu public void setValues(DataKind kind, ValuesDelta entry, RawContactDelta state, boolean readOnly, 1745ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov ViewIdGenerator vig) { 1755ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov if (!(entry instanceof PhoneticValuesDelta)) { 1765ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov entry = new PhoneticValuesDelta(entry); 1775ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov } 1785ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov super.setValues(kind, entry, state, readOnly, vig); 1795ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov } 1805ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov 1811a7f42494dbde3c268bc0763ebd62d55d43027aeKatherine Kuan @Override 1821a7f42494dbde3c268bc0763ebd62d55d43027aeKatherine Kuan public void onFieldChanged(String column, String value) { 1831a7f42494dbde3c268bc0763ebd62d55d43027aeKatherine Kuan if (!isFieldChanged(column, value)) { 1841a7f42494dbde3c268bc0763ebd62d55d43027aeKatherine Kuan return; 1851a7f42494dbde3c268bc0763ebd62d55d43027aeKatherine Kuan } 1861a7f42494dbde3c268bc0763ebd62d55d43027aeKatherine Kuan 1871a7f42494dbde3c268bc0763ebd62d55d43027aeKatherine Kuan if (hasShortAndLongForms()) { 1881a7f42494dbde3c268bc0763ebd62d55d43027aeKatherine Kuan PhoneticValuesDelta entry = (PhoneticValuesDelta) getEntry(); 1891a7f42494dbde3c268bc0763ebd62d55d43027aeKatherine Kuan 1901a7f42494dbde3c268bc0763ebd62d55d43027aeKatherine Kuan // Determine whether the user is modifying the structured or unstructured phonetic 1911a7f42494dbde3c268bc0763ebd62d55d43027aeKatherine Kuan // name field. See a similar approach in {@link StructuredNameEditor#onFieldChanged}. 1921a7f42494dbde3c268bc0763ebd62d55d43027aeKatherine Kuan // This is because on device rotation, a hidden TextView's onRestoreInstanceState() will 1931a7f42494dbde3c268bc0763ebd62d55d43027aeKatherine Kuan // be called and incorrectly restore a null value for the hidden field, which ultimately 1941a7f42494dbde3c268bc0763ebd62d55d43027aeKatherine Kuan // modifies the underlying phonetic name. Hence, ignore onFieldChanged() update requests 1951a7f42494dbde3c268bc0763ebd62d55d43027aeKatherine Kuan // from fields that aren't visible. 1961a7f42494dbde3c268bc0763ebd62d55d43027aeKatherine Kuan boolean isEditingUnstructuredPhoneticName = !areOptionalFieldsVisible(); 1971a7f42494dbde3c268bc0763ebd62d55d43027aeKatherine Kuan 1981a7f42494dbde3c268bc0763ebd62d55d43027aeKatherine Kuan if (isEditingUnstructuredPhoneticName == isUnstructuredPhoneticNameColumn(column)) { 1991a7f42494dbde3c268bc0763ebd62d55d43027aeKatherine Kuan // Call into the superclass to update the field and rebuild the underlying 2001a7f42494dbde3c268bc0763ebd62d55d43027aeKatherine Kuan // phonetic name. 2011a7f42494dbde3c268bc0763ebd62d55d43027aeKatherine Kuan super.onFieldChanged(column, value); 2021a7f42494dbde3c268bc0763ebd62d55d43027aeKatherine Kuan } 203223dea3e59ebd7ec41db5583a9c911d2298e8dc4Katherine Kuan } else { 204223dea3e59ebd7ec41db5583a9c911d2298e8dc4Katherine Kuan // All fields are always visible, so we don't have to worry about blocking updates 205223dea3e59ebd7ec41db5583a9c911d2298e8dc4Katherine Kuan // from onRestoreInstanceState() from hidden fields. Always call into the superclass 206223dea3e59ebd7ec41db5583a9c911d2298e8dc4Katherine Kuan // to update the field and rebuild the underlying phonetic name. 207223dea3e59ebd7ec41db5583a9c911d2298e8dc4Katherine Kuan super.onFieldChanged(column, value); 2081a7f42494dbde3c268bc0763ebd62d55d43027aeKatherine Kuan } 2091a7f42494dbde3c268bc0763ebd62d55d43027aeKatherine Kuan } 2101a7f42494dbde3c268bc0763ebd62d55d43027aeKatherine Kuan 2115ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov public boolean hasData() { 2125ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov ValuesDelta entry = getEntry(); 2135ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov 214851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu String family = entry.getPhoneticFamilyName(); 215851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu String middle = entry.getPhoneticMiddleName(); 216851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu String given = entry.getPhoneticGivenName(); 2175ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov 2185ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov return !TextUtils.isEmpty(family) || !TextUtils.isEmpty(middle) 2195ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov || !TextUtils.isEmpty(given); 2205ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov } 2215ec40b04041818bc042c0671cb1a43b54f650e25Dmitri Plotnikov} 222