1f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov/* 2f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov * Copyright (C) 2010 The Android Open Source Project 3f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov * 4f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov * use this file except in compliance with the License. You may obtain a copy of 6f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov * the License at 7f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov * 8f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov * http://www.apache.org/licenses/LICENSE-2.0 9f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov * 10f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov * Unless required by applicable law or agreed to in writing, software 11f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov * License for the specific language governing permissions and limitations under 14f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov * the License 15f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov */ 16f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikovpackage com.android.providers.contacts; 17f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov 18f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikovimport android.content.ContentValues; 196d9702cec82fd27a1c3093c64df9dcc22744899aDmitri Plotnikovimport android.content.Context; 20f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikovimport android.database.Cursor; 21f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikovimport android.database.sqlite.SQLiteDatabase; 22f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.StructuredName; 23f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikovimport android.provider.ContactsContract.FullNameStyle; 24f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikovimport android.text.TextUtils; 25f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov 2638210445730ee04c351c7cc1b3800cfe23e34325Makoto Onukiimport com.android.providers.contacts.SearchIndexManager.IndexBuilder; 2738210445730ee04c351c7cc1b3800cfe23e34325Makoto Onukiimport com.android.providers.contacts.aggregation.ContactAggregator; 2838210445730ee04c351c7cc1b3800cfe23e34325Makoto Onuki 29f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov/** 30f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov * Handler for email address data rows. 31f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov */ 32f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikovpublic class DataRowHandlerForStructuredName extends DataRowHandler { 33f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov private final NameSplitter mSplitter; 34f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov private final NameLookupBuilder mNameLookupBuilder; 35eeeed5669d98897501bf2b18c88579c7effd0955Dmitri Plotnikov private final StringBuilder mSb = new StringBuilder(); 36f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov 376d9702cec82fd27a1c3093c64df9dcc22744899aDmitri Plotnikov public DataRowHandlerForStructuredName(Context context, ContactsDatabaseHelper dbHelper, 38f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov ContactAggregator aggregator, NameSplitter splitter, 39f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov NameLookupBuilder nameLookupBuilder) { 406d9702cec82fd27a1c3093c64df9dcc22744899aDmitri Plotnikov super(context, dbHelper, aggregator, StructuredName.CONTENT_ITEM_TYPE); 41f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov mSplitter = splitter; 42f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov mNameLookupBuilder = nameLookupBuilder; 43f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov } 44f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov 45f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov @Override 46f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov public long insert(SQLiteDatabase db, TransactionContext txContext, long rawContactId, 47f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov ContentValues values) { 48f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov fixStructuredNameComponents(values, values); 49f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov 50f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov long dataId = super.insert(db, txContext, rawContactId, values); 51f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov 52f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov String name = values.getAsString(StructuredName.DISPLAY_NAME); 53f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov Integer fullNameStyle = values.getAsInteger(StructuredName.FULL_NAME_STYLE); 54f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov mNameLookupBuilder.insertNameLookup(rawContactId, dataId, name, 55f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov fullNameStyle != null 56f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov ? mSplitter.getAdjustedFullNameStyle(fullNameStyle) 57f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov : FullNameStyle.UNDEFINED); 58f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov insertNameLookupForPhoneticName(rawContactId, dataId, values); 59f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov fixRawContactDisplayName(db, txContext, rawContactId); 60bd9abbb6b03b4ec1e28ad3fa2fcba5d1eb8609eaDmitri Plotnikov triggerAggregation(txContext, rawContactId); 61f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov return dataId; 62f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov } 63f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov 64f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov @Override 65f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov public boolean update(SQLiteDatabase db, TransactionContext txContext, ContentValues values, 66f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov Cursor c, boolean callerIsSyncAdapter) { 67f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov final long dataId = c.getLong(DataUpdateQuery._ID); 68f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov final long rawContactId = c.getLong(DataUpdateQuery.RAW_CONTACT_ID); 69f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov 70f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov final ContentValues augmented = getAugmentedValues(db, dataId, values); 71f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov if (augmented == null) { // No change 72f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov return false; 73f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov } 74f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov 75f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov fixStructuredNameComponents(augmented, values); 76f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov 77f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov super.update(db, txContext, values, c, callerIsSyncAdapter); 78f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov if (values.containsKey(StructuredName.DISPLAY_NAME) || 79f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov values.containsKey(StructuredName.PHONETIC_FAMILY_NAME) || 80f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov values.containsKey(StructuredName.PHONETIC_MIDDLE_NAME) || 81f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov values.containsKey(StructuredName.PHONETIC_GIVEN_NAME)) { 82f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov augmented.putAll(values); 83f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov String name = augmented.getAsString(StructuredName.DISPLAY_NAME); 84f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov mDbHelper.deleteNameLookup(dataId); 85f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov Integer fullNameStyle = augmented.getAsInteger(StructuredName.FULL_NAME_STYLE); 86f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov mNameLookupBuilder.insertNameLookup(rawContactId, dataId, name, 87f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov fullNameStyle != null 88f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov ? mSplitter.getAdjustedFullNameStyle(fullNameStyle) 89f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov : FullNameStyle.UNDEFINED); 90f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov insertNameLookupForPhoneticName(rawContactId, dataId, augmented); 91f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov } 92f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov fixRawContactDisplayName(db, txContext, rawContactId); 93bd9abbb6b03b4ec1e28ad3fa2fcba5d1eb8609eaDmitri Plotnikov triggerAggregation(txContext, rawContactId); 94f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov return true; 95f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov } 96f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov 97f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov @Override 98f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov public int delete(SQLiteDatabase db, TransactionContext txContext, Cursor c) { 99f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov long dataId = c.getLong(DataDeleteQuery._ID); 100f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov long rawContactId = c.getLong(DataDeleteQuery.RAW_CONTACT_ID); 101f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov 102f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov int count = super.delete(db, txContext, c); 103f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov 104f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov mDbHelper.deleteNameLookup(dataId); 105f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov fixRawContactDisplayName(db, txContext, rawContactId); 106bd9abbb6b03b4ec1e28ad3fa2fcba5d1eb8609eaDmitri Plotnikov triggerAggregation(txContext, rawContactId); 107f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov return count; 108f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov } 109f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov 110f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov /** 111f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov * Specific list of structured fields. 112f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov */ 113f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov private final String[] STRUCTURED_FIELDS = new String[] { 114f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov StructuredName.PREFIX, StructuredName.GIVEN_NAME, StructuredName.MIDDLE_NAME, 115f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov StructuredName.FAMILY_NAME, StructuredName.SUFFIX 116f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov }; 117f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov 118f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov /** 119f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov * Parses the supplied display name, but only if the incoming values do 120f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov * not already contain structured name parts. Also, if the display name 121f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov * is not provided, generate one by concatenating first name and last 122f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov * name. 123f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov */ 124f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov public void fixStructuredNameComponents(ContentValues augmented, ContentValues update) { 125f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov final String unstruct = update.getAsString(StructuredName.DISPLAY_NAME); 126f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov 127f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov final boolean touchedUnstruct = !TextUtils.isEmpty(unstruct); 128f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov final boolean touchedStruct = !areAllEmpty(update, STRUCTURED_FIELDS); 129f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov 130f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov if (touchedUnstruct && !touchedStruct) { 131f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov NameSplitter.Name name = new NameSplitter.Name(); 132f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov mSplitter.split(name, unstruct); 133f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov name.toValues(update); 134f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov } else if (!touchedUnstruct 135f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov && (touchedStruct || areAnySpecified(update, STRUCTURED_FIELDS))) { 136f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov // We need to update the display name when any structured components 137f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov // are specified, even when they are null, which is why we are checking 138f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov // areAnySpecified. The touchedStruct in the condition is an optimization: 139f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov // if there are non-null values, we know for a fact that some values are present. 140f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov NameSplitter.Name name = new NameSplitter.Name(); 141f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov name.fromValues(augmented); 142f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov // As the name could be changed, let's guess the name style again. 143f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov name.fullNameStyle = FullNameStyle.UNDEFINED; 144f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov mSplitter.guessNameStyle(name); 145f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov int unadjustedFullNameStyle = name.fullNameStyle; 146f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov name.fullNameStyle = mSplitter.getAdjustedFullNameStyle(name.fullNameStyle); 14755e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov final String joined = mSplitter.join(name, true, true); 148f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov update.put(StructuredName.DISPLAY_NAME, joined); 149f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov 150f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov update.put(StructuredName.FULL_NAME_STYLE, unadjustedFullNameStyle); 151f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov update.put(StructuredName.PHONETIC_NAME_STYLE, name.phoneticNameStyle); 152f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov } else if (touchedUnstruct && touchedStruct){ 153f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov if (!update.containsKey(StructuredName.FULL_NAME_STYLE)) { 154f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov update.put(StructuredName.FULL_NAME_STYLE, 155f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov mSplitter.guessFullNameStyle(unstruct)); 156f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov } 157f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov if (!update.containsKey(StructuredName.PHONETIC_NAME_STYLE)) { 158f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov update.put(StructuredName.PHONETIC_NAME_STYLE, 159f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov mSplitter.guessPhoneticNameStyle(unstruct)); 160f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov } 161f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov } 162f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov } 163f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov 164f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov public void insertNameLookupForPhoneticName(long rawContactId, long dataId, 165f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov ContentValues values) { 166f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov if (values.containsKey(StructuredName.PHONETIC_FAMILY_NAME) 167f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov || values.containsKey(StructuredName.PHONETIC_GIVEN_NAME) 168f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov || values.containsKey(StructuredName.PHONETIC_MIDDLE_NAME)) { 169f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov mDbHelper.insertNameLookupForPhoneticName(rawContactId, dataId, 170f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov values.getAsString(StructuredName.PHONETIC_FAMILY_NAME), 171f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov values.getAsString(StructuredName.PHONETIC_MIDDLE_NAME), 172f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov values.getAsString(StructuredName.PHONETIC_GIVEN_NAME)); 173f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov } 174f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov } 175eeeed5669d98897501bf2b18c88579c7effd0955Dmitri Plotnikov 176eeeed5669d98897501bf2b18c88579c7effd0955Dmitri Plotnikov @Override 177eeeed5669d98897501bf2b18c88579c7effd0955Dmitri Plotnikov public boolean hasSearchableData() { 178eeeed5669d98897501bf2b18c88579c7effd0955Dmitri Plotnikov return true; 179eeeed5669d98897501bf2b18c88579c7effd0955Dmitri Plotnikov } 180eeeed5669d98897501bf2b18c88579c7effd0955Dmitri Plotnikov 181eeeed5669d98897501bf2b18c88579c7effd0955Dmitri Plotnikov @Override 182eeeed5669d98897501bf2b18c88579c7effd0955Dmitri Plotnikov public boolean containsSearchableColumns(ContentValues values) { 183eeeed5669d98897501bf2b18c88579c7effd0955Dmitri Plotnikov return values.containsKey(StructuredName.FAMILY_NAME) 184eeeed5669d98897501bf2b18c88579c7effd0955Dmitri Plotnikov || values.containsKey(StructuredName.GIVEN_NAME) 185eeeed5669d98897501bf2b18c88579c7effd0955Dmitri Plotnikov || values.containsKey(StructuredName.MIDDLE_NAME) 186eeeed5669d98897501bf2b18c88579c7effd0955Dmitri Plotnikov || values.containsKey(StructuredName.PHONETIC_FAMILY_NAME) 187eeeed5669d98897501bf2b18c88579c7effd0955Dmitri Plotnikov || values.containsKey(StructuredName.PHONETIC_GIVEN_NAME) 188eeeed5669d98897501bf2b18c88579c7effd0955Dmitri Plotnikov || values.containsKey(StructuredName.PHONETIC_MIDDLE_NAME) 189eeeed5669d98897501bf2b18c88579c7effd0955Dmitri Plotnikov || values.containsKey(StructuredName.PREFIX) 190eeeed5669d98897501bf2b18c88579c7effd0955Dmitri Plotnikov || values.containsKey(StructuredName.SUFFIX); 191eeeed5669d98897501bf2b18c88579c7effd0955Dmitri Plotnikov } 192eeeed5669d98897501bf2b18c88579c7effd0955Dmitri Plotnikov 193eeeed5669d98897501bf2b18c88579c7effd0955Dmitri Plotnikov @Override 194eeeed5669d98897501bf2b18c88579c7effd0955Dmitri Plotnikov public void appendSearchableData(IndexBuilder builder) { 19592ddc5cdc4d89ee2c6e861ae7b3a3a913ffa0100Dmitri Plotnikov String name = builder.getString(StructuredName.DISPLAY_NAME); 19692ddc5cdc4d89ee2c6e861ae7b3a3a913ffa0100Dmitri Plotnikov Integer fullNameStyle = builder.getInt(StructuredName.FULL_NAME_STYLE); 19792ddc5cdc4d89ee2c6e861ae7b3a3a913ffa0100Dmitri Plotnikov 19892ddc5cdc4d89ee2c6e861ae7b3a3a913ffa0100Dmitri Plotnikov mNameLookupBuilder.appendToSearchIndex(builder, name, fullNameStyle != null 19992ddc5cdc4d89ee2c6e861ae7b3a3a913ffa0100Dmitri Plotnikov ? mSplitter.getAdjustedFullNameStyle(fullNameStyle) 20092ddc5cdc4d89ee2c6e861ae7b3a3a913ffa0100Dmitri Plotnikov : FullNameStyle.UNDEFINED); 20130cc766756461da8d53933f88ea01dd2272a90ebDmitri Plotnikov 20230cc766756461da8d53933f88ea01dd2272a90ebDmitri Plotnikov String phoneticFamily = builder.getString(StructuredName.PHONETIC_FAMILY_NAME); 20330cc766756461da8d53933f88ea01dd2272a90ebDmitri Plotnikov String phoneticMiddle = builder.getString(StructuredName.PHONETIC_MIDDLE_NAME); 20430cc766756461da8d53933f88ea01dd2272a90ebDmitri Plotnikov String phoneticGiven = builder.getString(StructuredName.PHONETIC_GIVEN_NAME); 20530cc766756461da8d53933f88ea01dd2272a90ebDmitri Plotnikov 20630cc766756461da8d53933f88ea01dd2272a90ebDmitri Plotnikov // Phonetic name is often spelled without spaces 20730cc766756461da8d53933f88ea01dd2272a90ebDmitri Plotnikov if (!TextUtils.isEmpty(phoneticFamily) || !TextUtils.isEmpty(phoneticMiddle) 20830cc766756461da8d53933f88ea01dd2272a90ebDmitri Plotnikov || !TextUtils.isEmpty(phoneticGiven)) { 20930cc766756461da8d53933f88ea01dd2272a90ebDmitri Plotnikov mSb.setLength(0); 21030cc766756461da8d53933f88ea01dd2272a90ebDmitri Plotnikov if (!TextUtils.isEmpty(phoneticFamily)) { 211155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov builder.appendName(phoneticFamily); 21230cc766756461da8d53933f88ea01dd2272a90ebDmitri Plotnikov mSb.append(phoneticFamily); 21330cc766756461da8d53933f88ea01dd2272a90ebDmitri Plotnikov } 21430cc766756461da8d53933f88ea01dd2272a90ebDmitri Plotnikov if (!TextUtils.isEmpty(phoneticMiddle)) { 215155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov builder.appendName(phoneticMiddle); 21630cc766756461da8d53933f88ea01dd2272a90ebDmitri Plotnikov mSb.append(phoneticMiddle); 21730cc766756461da8d53933f88ea01dd2272a90ebDmitri Plotnikov } 21830cc766756461da8d53933f88ea01dd2272a90ebDmitri Plotnikov if (!TextUtils.isEmpty(phoneticGiven)) { 219155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov builder.appendName(phoneticGiven); 22030cc766756461da8d53933f88ea01dd2272a90ebDmitri Plotnikov mSb.append(phoneticGiven); 22130cc766756461da8d53933f88ea01dd2272a90ebDmitri Plotnikov } 222155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov builder.appendName(mSb.toString().trim()); 22330cc766756461da8d53933f88ea01dd2272a90ebDmitri Plotnikov } 224eeeed5669d98897501bf2b18c88579c7effd0955Dmitri Plotnikov } 225f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov} 226