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
18eeeed5669d98897501bf2b18c88579c7effd0955Dmitri Plotnikovimport com.android.providers.contacts.SearchIndexManager.IndexBuilder;
19eeeed5669d98897501bf2b18c88579c7effd0955Dmitri Plotnikov
20f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikovimport android.content.ContentValues;
216d9702cec82fd27a1c3093c64df9dcc22744899aDmitri Plotnikovimport android.content.Context;
22f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikovimport android.database.Cursor;
23f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikovimport android.database.sqlite.SQLiteDatabase;
24f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.StructuredName;
25f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikovimport android.provider.ContactsContract.FullNameStyle;
26f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikovimport android.text.TextUtils;
27f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov
28f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov/**
29f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov * Handler for email address data rows.
30f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov */
31f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikovpublic class DataRowHandlerForStructuredName extends DataRowHandler {
32f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov    private final NameSplitter mSplitter;
33f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov    private final NameLookupBuilder mNameLookupBuilder;
34eeeed5669d98897501bf2b18c88579c7effd0955Dmitri Plotnikov    private final StringBuilder mSb = new StringBuilder();
35f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov
366d9702cec82fd27a1c3093c64df9dcc22744899aDmitri Plotnikov    public DataRowHandlerForStructuredName(Context context, ContactsDatabaseHelper dbHelper,
37f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov            ContactAggregator aggregator, NameSplitter splitter,
38f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov            NameLookupBuilder nameLookupBuilder) {
396d9702cec82fd27a1c3093c64df9dcc22744899aDmitri Plotnikov        super(context, dbHelper, aggregator, StructuredName.CONTENT_ITEM_TYPE);
40f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov        mSplitter = splitter;
41f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov        mNameLookupBuilder = nameLookupBuilder;
42f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov    }
43f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov
44f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov    @Override
45f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov    public long insert(SQLiteDatabase db, TransactionContext txContext, long rawContactId,
46f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov            ContentValues values) {
47f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov        fixStructuredNameComponents(values, values);
48f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov
49f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov        long dataId = super.insert(db, txContext, rawContactId, values);
50f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov
51f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov        String name = values.getAsString(StructuredName.DISPLAY_NAME);
52f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov        Integer fullNameStyle = values.getAsInteger(StructuredName.FULL_NAME_STYLE);
53f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov        mNameLookupBuilder.insertNameLookup(rawContactId, dataId, name,
54f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov                fullNameStyle != null
55f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov                        ? mSplitter.getAdjustedFullNameStyle(fullNameStyle)
56f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov                        : FullNameStyle.UNDEFINED);
57f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov        insertNameLookupForPhoneticName(rawContactId, dataId, values);
58f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov        fixRawContactDisplayName(db, txContext, rawContactId);
59bd9abbb6b03b4ec1e28ad3fa2fcba5d1eb8609eaDmitri Plotnikov        triggerAggregation(txContext, rawContactId);
60f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov        return dataId;
61f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov    }
62f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov
63f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov    @Override
64f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov    public boolean update(SQLiteDatabase db, TransactionContext txContext, ContentValues values,
65f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov            Cursor c, boolean callerIsSyncAdapter) {
66f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov        final long dataId = c.getLong(DataUpdateQuery._ID);
67f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov        final long rawContactId = c.getLong(DataUpdateQuery.RAW_CONTACT_ID);
68f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov
69f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov        final ContentValues augmented = getAugmentedValues(db, dataId, values);
70f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov        if (augmented == null) {  // No change
71f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov            return false;
72f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov        }
73f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov
74f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov        fixStructuredNameComponents(augmented, values);
75f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov
76f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov        super.update(db, txContext, values, c, callerIsSyncAdapter);
77f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov        if (values.containsKey(StructuredName.DISPLAY_NAME) ||
78f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov                values.containsKey(StructuredName.PHONETIC_FAMILY_NAME) ||
79f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov                values.containsKey(StructuredName.PHONETIC_MIDDLE_NAME) ||
80f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov                values.containsKey(StructuredName.PHONETIC_GIVEN_NAME)) {
81f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov            augmented.putAll(values);
82f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov            String name = augmented.getAsString(StructuredName.DISPLAY_NAME);
83f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov            mDbHelper.deleteNameLookup(dataId);
84f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov            Integer fullNameStyle = augmented.getAsInteger(StructuredName.FULL_NAME_STYLE);
85f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov            mNameLookupBuilder.insertNameLookup(rawContactId, dataId, name,
86f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov                    fullNameStyle != null
87f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov                            ? mSplitter.getAdjustedFullNameStyle(fullNameStyle)
88f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov                            : FullNameStyle.UNDEFINED);
89f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov            insertNameLookupForPhoneticName(rawContactId, dataId, augmented);
90f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov        }
91f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov        fixRawContactDisplayName(db, txContext, rawContactId);
92bd9abbb6b03b4ec1e28ad3fa2fcba5d1eb8609eaDmitri Plotnikov        triggerAggregation(txContext, rawContactId);
93f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov        return true;
94f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov    }
95f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov
96f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov    @Override
97f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov    public int delete(SQLiteDatabase db, TransactionContext txContext, Cursor c) {
98f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov        long dataId = c.getLong(DataDeleteQuery._ID);
99f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov        long rawContactId = c.getLong(DataDeleteQuery.RAW_CONTACT_ID);
100f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov
101f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov        int count = super.delete(db, txContext, c);
102f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov
103f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov        mDbHelper.deleteNameLookup(dataId);
104f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov        fixRawContactDisplayName(db, txContext, rawContactId);
105bd9abbb6b03b4ec1e28ad3fa2fcba5d1eb8609eaDmitri Plotnikov        triggerAggregation(txContext, rawContactId);
106f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov        return count;
107f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov    }
108f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov
109f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov    /**
110f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov     * Specific list of structured fields.
111f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov     */
112f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov    private final String[] STRUCTURED_FIELDS = new String[] {
113f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov            StructuredName.PREFIX, StructuredName.GIVEN_NAME, StructuredName.MIDDLE_NAME,
114f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov            StructuredName.FAMILY_NAME, StructuredName.SUFFIX
115f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov    };
116f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov
117f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov    /**
118f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov     * Parses the supplied display name, but only if the incoming values do
119f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov     * not already contain structured name parts. Also, if the display name
120f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov     * is not provided, generate one by concatenating first name and last
121f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov     * name.
122f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov     */
123f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov    public void fixStructuredNameComponents(ContentValues augmented, ContentValues update) {
124f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov        final String unstruct = update.getAsString(StructuredName.DISPLAY_NAME);
125f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov
126f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov        final boolean touchedUnstruct = !TextUtils.isEmpty(unstruct);
127f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov        final boolean touchedStruct = !areAllEmpty(update, STRUCTURED_FIELDS);
128f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov
129f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov        if (touchedUnstruct && !touchedStruct) {
130f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov            NameSplitter.Name name = new NameSplitter.Name();
131f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov            mSplitter.split(name, unstruct);
132f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov            name.toValues(update);
133f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov        } else if (!touchedUnstruct
134f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov                && (touchedStruct || areAnySpecified(update, STRUCTURED_FIELDS))) {
135f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov            // We need to update the display name when any structured components
136f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov            // are specified, even when they are null, which is why we are checking
137f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov            // areAnySpecified.  The touchedStruct in the condition is an optimization:
138f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov            // if there are non-null values, we know for a fact that some values are present.
139f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov            NameSplitter.Name name = new NameSplitter.Name();
140f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov            name.fromValues(augmented);
141f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov            // As the name could be changed, let's guess the name style again.
142f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov            name.fullNameStyle = FullNameStyle.UNDEFINED;
143f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov            mSplitter.guessNameStyle(name);
144f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov            int unadjustedFullNameStyle = name.fullNameStyle;
145f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov            name.fullNameStyle = mSplitter.getAdjustedFullNameStyle(name.fullNameStyle);
14655e5cbf566edd89fc55f4a7f0ef2847084da9b16Dmitri Plotnikov            final String joined = mSplitter.join(name, true, true);
147f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov            update.put(StructuredName.DISPLAY_NAME, joined);
148f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov
149f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov            update.put(StructuredName.FULL_NAME_STYLE, unadjustedFullNameStyle);
150f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov            update.put(StructuredName.PHONETIC_NAME_STYLE, name.phoneticNameStyle);
151f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov        } else if (touchedUnstruct && touchedStruct){
152f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov            if (!update.containsKey(StructuredName.FULL_NAME_STYLE)) {
153f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov                update.put(StructuredName.FULL_NAME_STYLE,
154f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov                        mSplitter.guessFullNameStyle(unstruct));
155f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov            }
156f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov            if (!update.containsKey(StructuredName.PHONETIC_NAME_STYLE)) {
157f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov                update.put(StructuredName.PHONETIC_NAME_STYLE,
158f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov                        mSplitter.guessPhoneticNameStyle(unstruct));
159f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov            }
160f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov        }
161f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov    }
162f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov
163f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov    public void insertNameLookupForPhoneticName(long rawContactId, long dataId,
164f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov            ContentValues values) {
165f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov        if (values.containsKey(StructuredName.PHONETIC_FAMILY_NAME)
166f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov                || values.containsKey(StructuredName.PHONETIC_GIVEN_NAME)
167f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov                || values.containsKey(StructuredName.PHONETIC_MIDDLE_NAME)) {
168f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov            mDbHelper.insertNameLookupForPhoneticName(rawContactId, dataId,
169f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov                    values.getAsString(StructuredName.PHONETIC_FAMILY_NAME),
170f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov                    values.getAsString(StructuredName.PHONETIC_MIDDLE_NAME),
171f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov                    values.getAsString(StructuredName.PHONETIC_GIVEN_NAME));
172f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov        }
173f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov    }
174eeeed5669d98897501bf2b18c88579c7effd0955Dmitri Plotnikov
175eeeed5669d98897501bf2b18c88579c7effd0955Dmitri Plotnikov    @Override
176eeeed5669d98897501bf2b18c88579c7effd0955Dmitri Plotnikov    public boolean hasSearchableData() {
177eeeed5669d98897501bf2b18c88579c7effd0955Dmitri Plotnikov        return true;
178eeeed5669d98897501bf2b18c88579c7effd0955Dmitri Plotnikov    }
179eeeed5669d98897501bf2b18c88579c7effd0955Dmitri Plotnikov
180eeeed5669d98897501bf2b18c88579c7effd0955Dmitri Plotnikov    @Override
181eeeed5669d98897501bf2b18c88579c7effd0955Dmitri Plotnikov    public boolean containsSearchableColumns(ContentValues values) {
182eeeed5669d98897501bf2b18c88579c7effd0955Dmitri Plotnikov        return values.containsKey(StructuredName.FAMILY_NAME)
183eeeed5669d98897501bf2b18c88579c7effd0955Dmitri Plotnikov                || values.containsKey(StructuredName.GIVEN_NAME)
184eeeed5669d98897501bf2b18c88579c7effd0955Dmitri Plotnikov                || values.containsKey(StructuredName.MIDDLE_NAME)
185eeeed5669d98897501bf2b18c88579c7effd0955Dmitri Plotnikov                || values.containsKey(StructuredName.PHONETIC_FAMILY_NAME)
186eeeed5669d98897501bf2b18c88579c7effd0955Dmitri Plotnikov                || values.containsKey(StructuredName.PHONETIC_GIVEN_NAME)
187eeeed5669d98897501bf2b18c88579c7effd0955Dmitri Plotnikov                || values.containsKey(StructuredName.PHONETIC_MIDDLE_NAME)
188eeeed5669d98897501bf2b18c88579c7effd0955Dmitri Plotnikov                || values.containsKey(StructuredName.PREFIX)
189eeeed5669d98897501bf2b18c88579c7effd0955Dmitri Plotnikov                || values.containsKey(StructuredName.SUFFIX);
190eeeed5669d98897501bf2b18c88579c7effd0955Dmitri Plotnikov    }
191eeeed5669d98897501bf2b18c88579c7effd0955Dmitri Plotnikov
192eeeed5669d98897501bf2b18c88579c7effd0955Dmitri Plotnikov    @Override
193eeeed5669d98897501bf2b18c88579c7effd0955Dmitri Plotnikov    public void appendSearchableData(IndexBuilder builder) {
19492ddc5cdc4d89ee2c6e861ae7b3a3a913ffa0100Dmitri Plotnikov        String name = builder.getString(StructuredName.DISPLAY_NAME);
19592ddc5cdc4d89ee2c6e861ae7b3a3a913ffa0100Dmitri Plotnikov        Integer fullNameStyle = builder.getInt(StructuredName.FULL_NAME_STYLE);
19692ddc5cdc4d89ee2c6e861ae7b3a3a913ffa0100Dmitri Plotnikov
19792ddc5cdc4d89ee2c6e861ae7b3a3a913ffa0100Dmitri Plotnikov        mNameLookupBuilder.appendToSearchIndex(builder, name, fullNameStyle != null
19892ddc5cdc4d89ee2c6e861ae7b3a3a913ffa0100Dmitri Plotnikov                        ? mSplitter.getAdjustedFullNameStyle(fullNameStyle)
19992ddc5cdc4d89ee2c6e861ae7b3a3a913ffa0100Dmitri Plotnikov                        : FullNameStyle.UNDEFINED);
20030cc766756461da8d53933f88ea01dd2272a90ebDmitri Plotnikov
20130cc766756461da8d53933f88ea01dd2272a90ebDmitri Plotnikov        String phoneticFamily = builder.getString(StructuredName.PHONETIC_FAMILY_NAME);
20230cc766756461da8d53933f88ea01dd2272a90ebDmitri Plotnikov        String phoneticMiddle = builder.getString(StructuredName.PHONETIC_MIDDLE_NAME);
20330cc766756461da8d53933f88ea01dd2272a90ebDmitri Plotnikov        String phoneticGiven = builder.getString(StructuredName.PHONETIC_GIVEN_NAME);
20430cc766756461da8d53933f88ea01dd2272a90ebDmitri Plotnikov
20530cc766756461da8d53933f88ea01dd2272a90ebDmitri Plotnikov        // Phonetic name is often spelled without spaces
20630cc766756461da8d53933f88ea01dd2272a90ebDmitri Plotnikov        if (!TextUtils.isEmpty(phoneticFamily) || !TextUtils.isEmpty(phoneticMiddle)
20730cc766756461da8d53933f88ea01dd2272a90ebDmitri Plotnikov                || !TextUtils.isEmpty(phoneticGiven)) {
20830cc766756461da8d53933f88ea01dd2272a90ebDmitri Plotnikov            mSb.setLength(0);
20930cc766756461da8d53933f88ea01dd2272a90ebDmitri Plotnikov            if (!TextUtils.isEmpty(phoneticFamily)) {
210155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov                builder.appendName(phoneticFamily);
21130cc766756461da8d53933f88ea01dd2272a90ebDmitri Plotnikov                mSb.append(phoneticFamily);
21230cc766756461da8d53933f88ea01dd2272a90ebDmitri Plotnikov            }
21330cc766756461da8d53933f88ea01dd2272a90ebDmitri Plotnikov            if (!TextUtils.isEmpty(phoneticMiddle)) {
214155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov                builder.appendName(phoneticMiddle);
21530cc766756461da8d53933f88ea01dd2272a90ebDmitri Plotnikov                mSb.append(phoneticMiddle);
21630cc766756461da8d53933f88ea01dd2272a90ebDmitri Plotnikov            }
21730cc766756461da8d53933f88ea01dd2272a90ebDmitri Plotnikov            if (!TextUtils.isEmpty(phoneticGiven)) {
218155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov                builder.appendName(phoneticGiven);
21930cc766756461da8d53933f88ea01dd2272a90ebDmitri Plotnikov                mSb.append(phoneticGiven);
22030cc766756461da8d53933f88ea01dd2272a90ebDmitri Plotnikov            }
221155accbcb95fc13b984cf0ea8e5498a9c619cbf5Dmitri Plotnikov            builder.appendName(mSb.toString().trim());
22230cc766756461da8d53933f88ea01dd2272a90ebDmitri Plotnikov        }
223eeeed5669d98897501bf2b18c88579c7effd0955Dmitri Plotnikov    }
224f6d4922f664127d0455b45b1f7444c4553581282Dmitri Plotnikov}
225