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