Index.java revision 3b2269567004d47a287e3fc7a711557802424c54
16f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio/*
26f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio * Copyright (C) 2014 The Android Open Source Project
36f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio *
46f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio * Licensed under the Apache License, Version 2.0 (the "License");
56f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio * you may not use this file except in compliance with the License.
66f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio * You may obtain a copy of the License at
76f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio *
86f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio *      http://www.apache.org/licenses/LICENSE-2.0
96f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio *
106f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio * Unless required by applicable law or agreed to in writing, software
116f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio * distributed under the License is distributed on an "AS IS" BASIS,
126f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio * See the License for the specific language governing permissions and
146f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio * limitations under the License.
156f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio */
166f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio
17fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Megliopackage com.android.settings.search;
186f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio
19fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglioimport android.content.ContentResolver;
206f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglioimport android.content.ContentValues;
216f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglioimport android.content.Context;
22fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglioimport android.content.Intent;
23fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglioimport android.content.pm.PackageManager;
24fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglioimport android.content.pm.ResolveInfo;
256f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglioimport android.content.res.TypedArray;
266f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglioimport android.content.res.XmlResourceParser;
276f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglioimport android.database.Cursor;
286f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglioimport android.database.DatabaseUtils;
296f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglioimport android.database.sqlite.SQLiteDatabase;
30fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglioimport android.net.Uri;
316f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglioimport android.os.AsyncTask;
32fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglioimport android.provider.SearchIndexableData;
33fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglioimport android.provider.SearchIndexableResource;
34fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglioimport android.provider.SearchIndexablesContract;
356f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglioimport android.text.TextUtils;
366f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglioimport android.util.AttributeSet;
376f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglioimport android.util.Log;
386f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglioimport android.util.TypedValue;
396f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglioimport android.util.Xml;
406f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglioimport com.android.settings.R;
416f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglioimport org.xmlpull.v1.XmlPullParser;
426f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglioimport org.xmlpull.v1.XmlPullParserException;
436f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio
446f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglioimport java.io.IOException;
45b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglioimport java.lang.reflect.Field;
466f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglioimport java.util.ArrayList;
476f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglioimport java.util.List;
486f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglioimport java.util.Locale;
496f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglioimport java.util.concurrent.ExecutionException;
506f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglioimport java.util.concurrent.atomic.AtomicBoolean;
516f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio
52fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglioimport static com.android.settings.search.IndexDatabaseHelper.Tables;
53fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglioimport static com.android.settings.search.IndexDatabaseHelper.IndexColumns;
546f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio
556f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Megliopublic class Index {
566f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio
57b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio    private static final String LOG_TAG = "Index";
586f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio
596f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio    // Those indices should match the indices of SELECT_COLUMNS !
606f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio    public static final int COLUMN_INDEX_TITLE = 1;
619593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio    public static final int COLUMN_INDEX_SUMMARY_ON = 2;
629593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio    public static final int COLUMN_INDEX_SUMMARY_OFF = 3;
63a41707200b6628376e8fb575e782d8228c0d32a2Fabrice Di Meglio    public static final int COLUMN_INDEX_ENTRIES = 4;
64dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio    public static final int COLUMN_INDEX_SWITCH_ON = 5;
65dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio    public static final int COLUMN_INDEX_SWITCH_OFF = 6;
66dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio    public static final int COLUMN_INDEX_KEYWORDS = 7;
67dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio    public static final int COLUMN_INDEX_CLASS_NAME = 8;
68dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio    public static final int COLUMN_INDEX_SCREEN_TITLE = 9;
69dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio    public static final int COLUMN_INDEX_ICON = 10;
70dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio    public static final int COLUMN_INDEX_INTENT_ACTION = 11;
71dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio    public static final int COLUMN_INDEX_INTENT_ACTION_TARGET_PACKAGE = 12;
72dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio    public static final int COLUMN_INDEX_INTENT_ACTION_TARGET_CLASS = 13;
73dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio    public static final int COLUMN_INDEX_ENABLED = 14;
74c1457323d271309d5d1955743cd806417c84b9d6Fabrice Di Meglio    public static final int COLUMN_INDEX_KEY = 15;
756f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio
766f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio    // If you change the order of columns here, you SHOULD change the COLUMN_INDEX_XXX values
776f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio    private static final String[] SELECT_COLUMNS = new String[] {
789593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio            IndexColumns.DATA_RANK,               // 0
799593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio            IndexColumns.DATA_TITLE,              // 1
809593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio            IndexColumns.DATA_SUMMARY_ON,         // 2
819593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio            IndexColumns.DATA_SUMMARY_OFF,        // 3
82a41707200b6628376e8fb575e782d8228c0d32a2Fabrice Di Meglio            IndexColumns.DATA_ENTRIES,            // 4
83dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio            IndexColumns.DATA_SWITCH_ON,          // 5
84dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio            IndexColumns.DATA_SWITCH_OFF,         // 6
85dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio            IndexColumns.DATA_KEYWORDS,           // 7
86dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio            IndexColumns.CLASS_NAME,              // 8
87dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio            IndexColumns.SCREEN_TITLE,            // 9
88dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio            IndexColumns.ICON,                    // 10
89dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio            IndexColumns.INTENT_ACTION,           // 11
90dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio            IndexColumns.INTENT_TARGET_PACKAGE,   // 12
91c1457323d271309d5d1955743cd806417c84b9d6Fabrice Di Meglio            IndexColumns.INTENT_TARGET_CLASS,     // 13
92c1457323d271309d5d1955743cd806417c84b9d6Fabrice Di Meglio            IndexColumns.ENABLED,                 // 14
93c1457323d271309d5d1955743cd806417c84b9d6Fabrice Di Meglio            IndexColumns.DATA_KEY_REF             // 15
946f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio    };
956f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio
960d4005a1c755c4233bdf75d30a1b6ebc99856ec7Fabrice Di Meglio    private static final String[] MATCH_COLUMNS = {
970d4005a1c755c4233bdf75d30a1b6ebc99856ec7Fabrice Di Meglio            IndexColumns.DATA_TITLE,
98489362c83c11f7d531c8c0c08c285499cd2b3869Fabrice Di Meglio            IndexColumns.DATA_TITLE_NORMALIZED,
999593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio            IndexColumns.DATA_SUMMARY_ON,
1009593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio            IndexColumns.DATA_SUMMARY_ON_NORMALIZED,
1019593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio            IndexColumns.DATA_SUMMARY_OFF,
1029593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio            IndexColumns.DATA_SUMMARY_OFF_NORMALIZED,
103dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio            IndexColumns.DATA_SWITCH_ON,
104dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio            IndexColumns.DATA_SWITCH_ON_NORMALIZED,
105dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio            IndexColumns.DATA_SWITCH_OFF,
106dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio            IndexColumns.DATA_SWITCH_OFF_NORMALIZED,
107a41707200b6628376e8fb575e782d8228c0d32a2Fabrice Di Meglio            IndexColumns.DATA_ENTRIES,
1080d4005a1c755c4233bdf75d30a1b6ebc99856ec7Fabrice Di Meglio            IndexColumns.DATA_KEYWORDS
1090d4005a1c755c4233bdf75d30a1b6ebc99856ec7Fabrice Di Meglio    };
1100d4005a1c755c4233bdf75d30a1b6ebc99856ec7Fabrice Di Meglio
1116f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio    private static final String EMPTY = "";
1126f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio    private static final String NON_BREAKING_HYPHEN = "\u2011";
1136f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio    private static final String HYPHEN = "-";
1146f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio
1159593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio    private static final String FIELD_NAME_SEARCH_INDEX_DATA_PROVIDER =
1169593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio            "SEARCH_INDEX_DATA_PROVIDER";
1179593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio
1189593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio    private static final String NODE_NAME_PREFERENCE_SCREEN = "PreferenceScreen";
1199593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio    private static final String NODE_NAME_CHECK_BOX_PREFERENCE = "CheckBoxPreference";
120a41707200b6628376e8fb575e782d8228c0d32a2Fabrice Di Meglio    private static final String NODE_NAME_LIST_PREFERENCE = "ListPreference";
121dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio    private static final String NODE_NAME_SWITCH_PREFERENCE = "SwitchPreference";
1229593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio
1236f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio    private static Index sInstance;
1246f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio    private final AtomicBoolean mIsAvailable = new AtomicBoolean(false);
12551bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio    private final UpdateData mDataToProcess = new UpdateData();
126d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio    private Context mContext;
127b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio
12851bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio    /**
12951bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio     * A private class to describe the update data for the Index database
13051bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio     */
13151bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio    private class UpdateData {
13251bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        public List<SearchIndexableData> dataToUpdate;
13351bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        public List<String> dataToDelete;
13451bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        public boolean forceUpdate = false;
1356f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio
13651bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        public UpdateData() {
13751bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            dataToUpdate = new ArrayList<SearchIndexableData>();
13851bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            dataToDelete = new ArrayList<String>();
13951bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        }
14051bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio
14151bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        public void clear() {
14251bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            dataToUpdate.clear();
14351bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            dataToDelete.clear();
14451bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            forceUpdate = false;
14551bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        }
14651bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio    }
1476f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio
1486f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio    /**
1496f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio     * A basic singleton
1506f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio     */
1516f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio    public static Index getInstance(Context context) {
1526f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        if (sInstance == null) {
1536f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio            sInstance = new Index(context);
154d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio        } else {
155d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio            sInstance.setContext(context);
1566f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        }
1576f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        return sInstance;
1586f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio    }
1596f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio
1606f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio    public Index(Context context) {
1616f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        mContext = context;
1626f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio    }
1636f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio
164d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio    public void setContext(Context context) {
165d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio        mContext = context;
166d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio    }
167d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio
1686f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio    public boolean isAvailable() {
1696f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        return mIsAvailable.get();
1706f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio    }
1716f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio
17251bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio    public Cursor search(String query) {
17351bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        final String sql = buildSQL(query);
17451bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        Log.d(LOG_TAG, "Query: " + sql);
17551bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        return getReadableDatabase().rawQuery(sql, null);
17651bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio    }
17751bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio
178fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio    public void addIndexableData(SearchIndexableData data) {
17951bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        synchronized (mDataToProcess) {
18051bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            mDataToProcess.dataToUpdate.add(data);
181fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio        }
182fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio    }
183fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio
184fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio    public void addIndexableData(SearchIndexableResource[] array) {
18551bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        synchronized (mDataToProcess) {
186b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio            final int count = array.length;
187b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio            for (int n = 0; n < count; n++) {
18851bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                mDataToProcess.dataToUpdate.add(array[n]);
189b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio            }
190b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio        }
191b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio    }
192b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio
193b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio    public void deleteIndexableData(String[] array) {
19451bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        synchronized (mDataToProcess) {
195b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio            final int count = array.length;
196b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio            for (int n = 0; n < count; n++) {
19751bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                mDataToProcess.dataToDelete.add(array[n]);
198b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio            }
199b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio        }
200b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio    }
201b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio
202b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio    public boolean update() {
203fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio        final Intent intent = new Intent(SearchIndexablesContract.PROVIDER_INTERFACE);
204fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio        List<ResolveInfo> list =
205fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio                mContext.getPackageManager().queryIntentContentProviders(intent, 0);
206fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio
207fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio        final int size = list.size();
208fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio        for (int n = 0; n < size; n++) {
209fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio            final ResolveInfo info = list.get(n);
210fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio            final String authority = info.providerInfo.authority;
211fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio            final String packageName = info.providerInfo.packageName;
21251bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            addIndexablesFromRemoteProvider(packageName, authority);
21351bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        }
21451bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio
21551bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        return updateInternal();
21651bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio    }
21751bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio
21851bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio    public boolean updateFromRemoteProvider(String packageName, String authority) {
21951bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        if (!addIndexablesFromRemoteProvider(packageName, authority)) {
22051bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            return false;
22151bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        }
22251bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        return updateInternal();
22351bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio    }
22451bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio
22551bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio    public boolean updateFromClassNameResource(String className, boolean includeInSearchResults) {
22651bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        if (className == null) {
22751bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            throw new IllegalArgumentException("class name cannot be null!");
22851bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        }
22951bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        final SearchIndexableResource res = SearchIndexableResources.getResourceByName(className);
23051bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        if (res == null ) {
23151bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            Log.e(LOG_TAG, "Cannot find SearchIndexableResources for class name: " + className);
23251bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            return false;
233fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio        }
23451bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        res.enabled = includeInSearchResults;
23551bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        addIndexableData(res);
23651bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        mDataToProcess.forceUpdate = true;
23751bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        boolean result = updateInternal();
23851bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        res.enabled = false;
23951bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        return result;
24051bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio    }
241fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio
2423b2269567004d47a287e3fc7a711557802424c54Fabrice Di Meglio    public boolean updateFromSearchIndexableData(SearchIndexableData data) {
24351bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        addIndexableData(data);
2443b2269567004d47a287e3fc7a711557802424c54Fabrice Di Meglio        mDataToProcess.forceUpdate = true;
245fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio        return updateInternal();
246fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio    }
247fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio
24851bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio    private SQLiteDatabase getReadableDatabase() {
24951bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        return IndexDatabaseHelper.getInstance(mContext).getReadableDatabase();
25051bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio    }
25151bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio
25251bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio    private SQLiteDatabase getWritableDatabase() {
25351bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        return IndexDatabaseHelper.getInstance(mContext).getWritableDatabase();
25451bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio    }
25551bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio
25651bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio    private boolean addIndexablesFromRemoteProvider(String packageName, String authority) {
25751bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        final Context packageContext;
25851bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        try {
25951bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            packageContext = mContext.createPackageContext(packageName, 0);
26051bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio
26151bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            final Uri uriForResources = buildUriForXmlResources(authority);
26251bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            addIndexablesForXmlResourceUri(packageContext, packageName, uriForResources,
26351bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                    SearchIndexablesContract.INDEXABLES_XML_RES_COLUMNS);
26451bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio
26551bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            final Uri uriForRawData = buildUriForRawData(authority);
26651bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            addIndexablesForRawDataUri(packageContext, packageName, uriForRawData,
26751bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                    SearchIndexablesContract.INDEXABLES_RAW_COLUMNS);
26851bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            return true;
26951bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        } catch (PackageManager.NameNotFoundException e) {
27051bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            Log.w(LOG_TAG, "Could not create context for " + packageName + ": "
27151bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                    + Log.getStackTraceString(e));
27251bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            return false;
27351bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        }
27451bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio    }
27551bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio
276fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio    private static Uri buildUriForXmlResources(String authority) {
277fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio        return Uri.parse("content://" + authority + "/" +
278fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio                SearchIndexablesContract.INDEXABLES_XML_RES_PATH);
279fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio    }
280fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio
281fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio    private static Uri buildUriForRawData(String authority) {
282fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio        return Uri.parse("content://" + authority + "/" +
283fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio                SearchIndexablesContract.INDEXABLES_RAW_PATH);
284fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio    }
285fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio
28651bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio    private boolean updateInternal() {
28751bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        synchronized (mDataToProcess) {
28851bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            final UpdateIndexTask task = new UpdateIndexTask();
28951bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            task.execute(mDataToProcess);
29051bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            try {
29151bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                final boolean result = task.get();
29251bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                mDataToProcess.clear();
29351bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                return result;
29451bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            } catch (InterruptedException e) {
29551bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                Log.e(LOG_TAG, "Cannot update index: " + e.getMessage());
29651bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                return false;
29751bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            } catch (ExecutionException e) {
29851bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                Log.e(LOG_TAG, "Cannot update index: " + e.getMessage());
29951bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                return false;
30051bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            }
30151bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        }
30251bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio    }
303fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio
30451bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio    private void addIndexablesForXmlResourceUri(Context packageContext, String packageName,
30551bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            Uri uri, String[] projection) {
30651bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio
30751bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        final ContentResolver resolver = packageContext.getContentResolver();
308fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio        final Cursor cursor = resolver.query(uri, projection,
309fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio                null, null, null);
310fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio
311fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio        if (cursor == null) {
312fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio            Log.w(LOG_TAG, "Cannot add index data for Uri: " + uri.toString());
313fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio            return;
314fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio        }
315fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio
316fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio        try {
317fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio            final int count = cursor.getCount();
318fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio            if (count > 0) {
319fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio                while (cursor.moveToNext()) {
320fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio                    final int rank = cursor.getInt(0);
321fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio                    final int xmlResId = cursor.getInt(1);
322fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio
323fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio                    final String className = cursor.getString(2);
324fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio                    final int iconResId = cursor.getInt(3);
325fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio
326fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio                    final String action = cursor.getString(4);
327fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio                    final String targetPackage = cursor.getString(5);
328fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio                    final String targetClass = cursor.getString(6);
329fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio
3305135dce1429facfd764f4afffe69d60c19589750Fabrice Di Meglio                    SearchIndexableResource sir = new SearchIndexableResource(packageContext);
331fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio                    sir.rank = rank;
332fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio                    sir.xmlResId = xmlResId;
333fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio                    sir.className = className;
334fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio                    sir.packageName = packageName;
335fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio                    sir.iconResId = iconResId;
336fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio                    sir.intentAction = action;
337fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio                    sir.intentTargetPackage = targetPackage;
338fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio                    sir.intentTargetClass = targetClass;
339fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio
340fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio                    addIndexableData(sir);
341fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio                }
342fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio            }
343fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio        } finally {
344fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio            cursor.close();
345fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio        }
346fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio    }
347fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio
34851bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio    private void addIndexablesForRawDataUri(Context packageContext, String packageName,
34951bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            Uri uri, String[] projection) {
350fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio
35151bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        final ContentResolver resolver = packageContext.getContentResolver();
352fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio        final Cursor cursor = resolver.query(uri, projection,
353fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio                null, null, null);
354fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio
355fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio        if (cursor == null) {
356fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio            Log.w(LOG_TAG, "Cannot add index data for Uri: " + uri.toString());
357fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio            return;
358fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio        }
359fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio
360fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio        try {
361fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio            final int count = cursor.getCount();
362fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio            if (count > 0) {
363fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio                while (cursor.moveToNext()) {
364fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio                    final int rank = cursor.getInt(0);
365fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio                    final String title = cursor.getString(1);
3669593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio                    final String summaryOn = cursor.getString(2);
3679593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio                    final String summaryOff = cursor.getString(3);
368a41707200b6628376e8fb575e782d8228c0d32a2Fabrice Di Meglio                    final String entries = cursor.getString(4);
369dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio                    final String switchOn = cursor.getString(5);
370dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio                    final String switchOff = cursor.getString(6);
371dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio                    final String keywords = cursor.getString(7);
372fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio
373dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio                    final String screenTitle = cursor.getString(8);
374fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio
375dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio                    final String className = cursor.getString(9);
376dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio                    final int iconResId = cursor.getInt(10);
377fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio
378dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio                    final String action = cursor.getString(11);
379dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio                    final String targetPackage = cursor.getString(12);
380dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio                    final String targetClass = cursor.getString(13);
381fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio
382c1457323d271309d5d1955743cd806417c84b9d6Fabrice Di Meglio                    final String key = cursor.getString(15);
383c1457323d271309d5d1955743cd806417c84b9d6Fabrice Di Meglio
3845135dce1429facfd764f4afffe69d60c19589750Fabrice Di Meglio                    SearchIndexableRaw data = new SearchIndexableRaw(packageContext);
385fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio                    data.rank = rank;
386fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio                    data.title = title;
3879593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio                    data.summaryOn = summaryOn;
3889593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio                    data.summaryOff = summaryOff;
389a41707200b6628376e8fb575e782d8228c0d32a2Fabrice Di Meglio                    data.entries = entries;
390dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio                    data.switchOn = switchOn;
391dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio                    data.switchOff = switchOff;
392fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio                    data.keywords = keywords;
393fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio                    data.screenTitle = screenTitle;
394fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio                    data.className = className;
395fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio                    data.packageName = packageName;
396fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio                    data.iconResId = iconResId;
397fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio                    data.intentAction = action;
398fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio                    data.intentTargetPackage = targetPackage;
399fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio                    data.intentTargetClass = targetClass;
400c1457323d271309d5d1955743cd806417c84b9d6Fabrice Di Meglio                    data.key = key;
401fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio
402fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio                    addIndexableData(data);
403fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio                }
404fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio            }
405fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio        } finally {
406fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio            cursor.close();
407fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio        }
408fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio    }
409fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio
4106f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio    private String buildSQL(String query) {
4116f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        StringBuilder sb = new StringBuilder();
4120d4005a1c755c4233bdf75d30a1b6ebc99856ec7Fabrice Di Meglio        sb.append(buildSQLForColumn(query, MATCH_COLUMNS));
4136f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        sb.append(" ORDER BY ");
4146f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        sb.append(IndexColumns.DATA_RANK);
4156f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        return sb.toString();
4166f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio    }
4176f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio
4180d4005a1c755c4233bdf75d30a1b6ebc99856ec7Fabrice Di Meglio    private String buildSQLForColumn(String query, String[] columnNames) {
4196f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        StringBuilder sb = new StringBuilder();
4206f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        sb.append("SELECT ");
4216f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        for (int n = 0; n < SELECT_COLUMNS.length; n++) {
4226f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio            sb.append(SELECT_COLUMNS[n]);
4236f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio            if (n < SELECT_COLUMNS.length - 1) {
4246f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio                sb.append(", ");
4256f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio            }
4266f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        }
4276f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        sb.append(" FROM ");
4286f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        sb.append(Tables.TABLE_PREFS_INDEX);
4296f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        sb.append(" WHERE ");
4300d4005a1c755c4233bdf75d30a1b6ebc99856ec7Fabrice Di Meglio        sb.append(buildWhereStringForColumns(query, columnNames));
4316f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio
4326f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        return sb.toString();
4336f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio    }
4346f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio
4350d4005a1c755c4233bdf75d30a1b6ebc99856ec7Fabrice Di Meglio    private String buildWhereStringForColumns(String query, String[] columnNames) {
4360d4005a1c755c4233bdf75d30a1b6ebc99856ec7Fabrice Di Meglio        final StringBuilder sb = new StringBuilder(Tables.TABLE_PREFS_INDEX);
4376f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        sb.append(" MATCH ");
4380d4005a1c755c4233bdf75d30a1b6ebc99856ec7Fabrice Di Meglio        DatabaseUtils.appendEscapedSQLString(sb, buildMatchStringForColumns(query, columnNames));
4396f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        sb.append(" AND ");
4406f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        sb.append(IndexColumns.LOCALE);
4416f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        sb.append(" = ");
4426f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        DatabaseUtils.appendEscapedSQLString(sb, Locale.getDefault().toString());
44351bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        sb.append(" AND ");
44451bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        sb.append(IndexColumns.ENABLED);
44551bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        sb.append(" = 1");
4466f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        return sb.toString();
4476f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio    }
4486f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio
4490d4005a1c755c4233bdf75d30a1b6ebc99856ec7Fabrice Di Meglio    private String buildMatchStringForColumns(String query, String[] columnNames) {
4500d4005a1c755c4233bdf75d30a1b6ebc99856ec7Fabrice Di Meglio        final String value = query + "*";
4510d4005a1c755c4233bdf75d30a1b6ebc99856ec7Fabrice Di Meglio        StringBuilder sb = new StringBuilder();
4520d4005a1c755c4233bdf75d30a1b6ebc99856ec7Fabrice Di Meglio        final int count = columnNames.length;
4530d4005a1c755c4233bdf75d30a1b6ebc99856ec7Fabrice Di Meglio        for (int n = 0; n < count; n++) {
4540d4005a1c755c4233bdf75d30a1b6ebc99856ec7Fabrice Di Meglio            sb.append(columnNames[n]);
4550d4005a1c755c4233bdf75d30a1b6ebc99856ec7Fabrice Di Meglio            sb.append(":");
4560d4005a1c755c4233bdf75d30a1b6ebc99856ec7Fabrice Di Meglio            sb.append(value);
4570d4005a1c755c4233bdf75d30a1b6ebc99856ec7Fabrice Di Meglio            if (n < count - 1) {
4580d4005a1c755c4233bdf75d30a1b6ebc99856ec7Fabrice Di Meglio                sb.append(" OR ");
4590d4005a1c755c4233bdf75d30a1b6ebc99856ec7Fabrice Di Meglio            }
4600d4005a1c755c4233bdf75d30a1b6ebc99856ec7Fabrice Di Meglio        }
4610d4005a1c755c4233bdf75d30a1b6ebc99856ec7Fabrice Di Meglio        return sb.toString();
4620d4005a1c755c4233bdf75d30a1b6ebc99856ec7Fabrice Di Meglio    }
4630d4005a1c755c4233bdf75d30a1b6ebc99856ec7Fabrice Di Meglio
46451bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio    private void indexOneSearchIndexableData(SQLiteDatabase database, String localeStr,
46551bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                                             SearchIndexableData data) {
46651bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        if (data instanceof SearchIndexableResource) {
46751bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            indexOneResource(database, localeStr, (SearchIndexableResource) data);
46851bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        } else if (data instanceof SearchIndexableRaw) {
46951bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            indexOneRaw(database, localeStr, (SearchIndexableRaw) data);
47051bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        }
4716f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio    }
4726f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio
47351bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio    private void indexOneResource(SQLiteDatabase database, String localeStr,
47451bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                                  SearchIndexableResource sir) {
47551bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        if (sir.xmlResId > 0) {
47651bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            indexFromResource(sir.context, database, localeStr,
47751bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                    sir.xmlResId, sir.className, sir.iconResId, sir.rank,
47851bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                    sir.intentAction, sir.intentTargetPackage, sir.intentTargetClass);
47951bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        } else if (!TextUtils.isEmpty(sir.className)) {
48051bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            sir.context = mContext;
48151bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            indexFromLocalProvider(database, localeStr, sir);
48251bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        }
4836f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio    }
4846f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio
48551bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio    private void indexFromResource(Context context, SQLiteDatabase database, String localeStr,
48651bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            int xmlResId, String fragmentName, int iconResId, int rank,
48751bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            String intentAction, String intentTargetPackage, String intentTargetClass) {
488b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio
48951bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        XmlResourceParser parser = null;
49051bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        try {
49151bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            parser = context.getResources().getXml(xmlResId);
49251bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio
49351bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            int type;
49451bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
49551bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                    && type != XmlPullParser.START_TAG) {
49651bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                // Parse next until start tag is found
49751bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            }
49851bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio
49951bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            String nodeName = parser.getName();
5009593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio            if (!NODE_NAME_PREFERENCE_SCREEN.equals(nodeName)) {
50151bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                throw new RuntimeException(
50251bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                        "XML document must start with <PreferenceScreen> tag; found"
50351bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                                + nodeName + " at " + parser.getPositionDescription());
50451bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            }
50551bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio
50651bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            final int outerDepth = parser.getDepth();
50751bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            final AttributeSet attrs = Xml.asAttributeSet(parser);
50851bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            final String screenTitle = getDataTitle(context, attrs);
50951bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio
51051bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            String title = getDataTitle(context, attrs);
51151bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            String summary = getDataSummary(context, attrs);
51251bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            String keywords = getDataKeywords(context, attrs);
513c1457323d271309d5d1955743cd806417c84b9d6Fabrice Di Meglio            String key = getDataKey(context, attrs);
51451bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio
51551bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            // Insert rows for the main PreferenceScreen node. Rewrite the data for removing
51651bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            // hyphens.
517a41707200b6628376e8fb575e782d8228c0d32a2Fabrice Di Meglio            updateOneRowWithFilteredData(database, localeStr, title, summary, null, null,
518c1457323d271309d5d1955743cd806417c84b9d6Fabrice Di Meglio                    null, null, fragmentName, screenTitle, iconResId, rank,
519c1457323d271309d5d1955743cd806417c84b9d6Fabrice Di Meglio                    keywords, intentAction, intentTargetPackage, intentTargetClass, true, key);
52051bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio
52151bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
52251bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                    && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
52351bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
52451bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                    continue;
52551bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                }
52651bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio
5279593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio                nodeName = parser.getName();
5289593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio
52951bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                title = getDataTitle(context, attrs);
53051bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                keywords = getDataKeywords(context, attrs);
531c1457323d271309d5d1955743cd806417c84b9d6Fabrice Di Meglio                key = getDataKey(context, attrs);
53251bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio
5339593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio                if (!nodeName.equals(NODE_NAME_CHECK_BOX_PREFERENCE)) {
5349593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio                    summary = getDataSummary(context, attrs);
5359593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio
536a41707200b6628376e8fb575e782d8228c0d32a2Fabrice Di Meglio                    String entries = null;
537dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio                    String switchOn = null;
538dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio                    String switchOff = null;
539dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio
540a41707200b6628376e8fb575e782d8228c0d32a2Fabrice Di Meglio                    if (nodeName.endsWith(NODE_NAME_LIST_PREFERENCE)) {
541a41707200b6628376e8fb575e782d8228c0d32a2Fabrice Di Meglio                        entries = getDataEntries(context, attrs);
542dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio                    } else if (nodeName.endsWith(NODE_NAME_SWITCH_PREFERENCE)) {
543dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio                        switchOn = getDataSwitchOn(context, attrs);
544dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio                        switchOff = getDataSwitchOff(context, attrs);
545a41707200b6628376e8fb575e782d8228c0d32a2Fabrice Di Meglio                    }
546a41707200b6628376e8fb575e782d8228c0d32a2Fabrice Di Meglio
5479593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio                    // Insert rows for the child nodes of PreferenceScreen
548a41707200b6628376e8fb575e782d8228c0d32a2Fabrice Di Meglio                    updateOneRowWithFilteredData(database, localeStr, title, summary, null, entries,
549c1457323d271309d5d1955743cd806417c84b9d6Fabrice Di Meglio                            switchOn, switchOff, fragmentName, screenTitle, iconResId, rank,
550c1457323d271309d5d1955743cd806417c84b9d6Fabrice Di Meglio                            keywords, intentAction, intentTargetPackage, intentTargetClass,
551c1457323d271309d5d1955743cd806417c84b9d6Fabrice Di Meglio                            true, key);
552c1457323d271309d5d1955743cd806417c84b9d6Fabrice Di Meglio                } else {
5539593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio                    final String summaryOn = getDataSummaryOn(context, attrs);
5549593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio                    final String summaryOff = getDataSummaryOff(context, attrs);
5559593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio
5569593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio                    updateOneRowWithFilteredData(database, localeStr, title, summaryOn, summaryOff,
557c1457323d271309d5d1955743cd806417c84b9d6Fabrice Di Meglio                            null, null, null, fragmentName, screenTitle, iconResId, rank,
558c1457323d271309d5d1955743cd806417c84b9d6Fabrice Di Meglio                            keywords, intentAction, intentTargetPackage, intentTargetClass,
559c1457323d271309d5d1955743cd806417c84b9d6Fabrice Di Meglio                            true, key);
5609593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio                }
56151bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            }
56251bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio
56351bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        } catch (XmlPullParserException e) {
56451bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            throw new RuntimeException("Error parsing PreferenceScreen", e);
56551bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        } catch (IOException e) {
56651bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            throw new RuntimeException("Error parsing PreferenceScreen", e);
56751bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        } finally {
56851bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            if (parser != null) parser.close();
569b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio        }
57051bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio    }
571b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio
57251bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio    private void indexOneRaw(SQLiteDatabase database, String localeStr,
57351bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                             SearchIndexableRaw raw) {
57451bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        // Should be the same locale as the one we are processing
57551bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        if (!raw.locale.toString().equalsIgnoreCase(localeStr)) {
57651bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            return;
57751bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        }
57851bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio
57951bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        updateOneRowWithFilteredData(database, localeStr,
58051bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                raw.title,
5819593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio                raw.summaryOn,
5829593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio                raw.summaryOff,
583a41707200b6628376e8fb575e782d8228c0d32a2Fabrice Di Meglio                raw.entries,
584dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio                raw.switchOn,
585dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio                raw.switchOff,
58651bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                raw.className,
58751bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                raw.screenTitle,
58851bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                raw.iconResId,
58951bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                raw.rank,
59051bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                raw.keywords,
59151bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                raw.intentAction,
59251bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                raw.intentTargetPackage,
59351bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                raw.intentTargetClass,
594c1457323d271309d5d1955743cd806417c84b9d6Fabrice Di Meglio                raw.enabled,
595c1457323d271309d5d1955743cd806417c84b9d6Fabrice Di Meglio                raw.key);
59651bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio    }
59751bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio
59851bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio    private void indexFromLocalProvider(SQLiteDatabase database, String localeStr,
59951bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                                        SearchIndexableResource sir) {
60051bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        try {
60151bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            final Class<?> clazz = Class.forName(sir.className);
60251bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            if (Indexable.class.isAssignableFrom(clazz)) {
6039593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio                final Field f = clazz.getField(FIELD_NAME_SEARCH_INDEX_DATA_PROVIDER);
60451bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                final Indexable.SearchIndexProvider provider =
60551bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                        (Indexable.SearchIndexProvider) f.get(null);
60651bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio
60751bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                final List<SearchIndexableRaw> rawList =
60851bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                        provider.getRawDataToIndex(sir.context, sir.enabled);
60951bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                if (rawList != null) {
61051bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                    final int rawSize = rawList.size();
61151bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                    for (int i = 0; i < rawSize; i++) {
61251bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                        SearchIndexableRaw raw = rawList.get(i);
61351bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio
61451bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                        // Should be the same locale as the one we are processing
61551bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                        if (!raw.locale.toString().equalsIgnoreCase(localeStr)) {
61651bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                            continue;
61751bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                        }
61851bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio
61951bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                        updateOneRowWithFilteredData(database, localeStr,
62051bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                                raw.title,
6219593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio                                raw.summaryOn,
6229593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio                                raw.summaryOff,
623a41707200b6628376e8fb575e782d8228c0d32a2Fabrice Di Meglio                                raw.entries,
624dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio                                raw.switchOn,
625dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio                                raw.switchOff,
62651bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                                sir.className,
62751bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                                raw.screenTitle,
62851bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                                sir.iconResId,
62951bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                                sir.rank,
63051bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                                raw.keywords,
63151bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                                raw.intentAction,
63251bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                                raw.intentTargetPackage,
63351bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                                raw.intentTargetClass,
634c1457323d271309d5d1955743cd806417c84b9d6Fabrice Di Meglio                                raw.enabled,
635c1457323d271309d5d1955743cd806417c84b9d6Fabrice Di Meglio                                raw.key);
63651bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                    }
63751bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                }
63851bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio
63951bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                final List<SearchIndexableResource> resList =
64051bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                        provider.getXmlResourcesToIndex(sir.context, sir.enabled);
64151bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                if (resList != null) {
64251bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                    final int resSize = resList.size();
64351bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                    for (int i = 0; i < resSize; i++) {
64451bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                        SearchIndexableResource item = resList.get(i);
64551bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio
64651bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                        // Should be the same locale as the one we are processing
64751bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                        if (!item.locale.toString().equalsIgnoreCase(localeStr)) {
64851bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                            continue;
64951bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                        }
65051bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio
65151bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                        indexFromResource(sir.context, database, localeStr,
65251bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                                item.xmlResId, item.className, item.iconResId, item.rank,
65351bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                                item.intentAction, item.intentTargetPackage,
65451bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                                item.intentTargetClass);
65551bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                    }
65651bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                }
65751bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            }
65851bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        } catch (ClassNotFoundException e) {
65951bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            Log.e(LOG_TAG, "Cannot find class: " + sir.className, e);
66051bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        } catch (NoSuchFieldException e) {
6619593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio            Log.e(LOG_TAG, "Cannot find field '" + FIELD_NAME_SEARCH_INDEX_DATA_PROVIDER + "'", e);
66251bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        } catch (IllegalAccessException e) {
6639593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio            Log.e(LOG_TAG,
6649593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio                    "Illegal access to field '" + FIELD_NAME_SEARCH_INDEX_DATA_PROVIDER + "'", e);
66551bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        }
66651bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio    }
66751bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio
66851bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio    private void updateOneRowWithFilteredData(SQLiteDatabase database, String locale,
669dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio            String title, String summaryOn, String summaryOff, String entries,
670dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio            String switchOn, String switchOff, String className,
671a41707200b6628376e8fb575e782d8228c0d32a2Fabrice Di Meglio            String screenTitle, int iconResId, int rank, String keywords,
67251bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            String intentAction, String intentTargetPackage, String intentTargetClass,
673c1457323d271309d5d1955743cd806417c84b9d6Fabrice Di Meglio            boolean enabled, String key) {
67451bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio
67551bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        String updatedTitle;
67651bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        if (title != null) {
67751bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            updatedTitle = title.replaceAll(NON_BREAKING_HYPHEN, HYPHEN);
67851bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        }
67951bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        else {
68051bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            updatedTitle = EMPTY;
68151bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        }
68251bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio
6839593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio        String updatedSummaryOn;
6849593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio        if (summaryOn != null) {
6859593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio            updatedSummaryOn = summaryOn.replaceAll(NON_BREAKING_HYPHEN, HYPHEN);
68651bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        } else {
6879593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio            updatedSummaryOn = EMPTY;
6889593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio        }
6899593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio
6909593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio        String updatedSummaryOff;
6919593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio        if (summaryOff != null) {
6929593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio            updatedSummaryOff = summaryOff.replaceAll(NON_BREAKING_HYPHEN, HYPHEN);
6939593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio        } else {
6949593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio            updatedSummaryOff = EMPTY;
69551bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        }
69651bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio
697dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio        String updatedSwitchOn;
698dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio        if (switchOn != null) {
699dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio            updatedSwitchOn = switchOn.replaceAll(NON_BREAKING_HYPHEN, HYPHEN);
700dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio        } else {
701dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio            updatedSwitchOn = EMPTY;
702dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio        }
703dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio
704dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio        String updatedSwitchOff;
705dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio        if (switchOff != null) {
706dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio            updatedSwitchOff = switchOff.replaceAll(NON_BREAKING_HYPHEN, HYPHEN);
707dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio        } else {
708dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio            updatedSwitchOff = EMPTY;
709dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio        }
710dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio
71151bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        String normalizedTitle = updatedTitle.replaceAll(HYPHEN, EMPTY);
7129593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio        String normalizedSummaryOn = updatedSummaryOn.replaceAll(HYPHEN, EMPTY);
7139593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio        String normalizedSummaryOff = updatedSummaryOff.replaceAll(HYPHEN, EMPTY);
714dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio        String normalizedSwitchOn = updatedSwitchOn.replaceAll(HYPHEN, EMPTY);
715dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio        String normalizedSwitchOff = updatedSwitchOff.replaceAll(HYPHEN, EMPTY);
71651bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio
71751bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        updateOneRow(database, locale,
7189593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio                updatedTitle, normalizedTitle, updatedSummaryOn, normalizedSummaryOn,
719dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio                updatedSummaryOff, normalizedSummaryOff, entries,
720dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio                updatedSwitchOn, normalizedSwitchOn, updatedSwitchOff, normalizedSwitchOff,
721dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio                className, screenTitle, iconResId,
722c1457323d271309d5d1955743cd806417c84b9d6Fabrice Di Meglio                rank, keywords, intentAction, intentTargetPackage, intentTargetClass, enabled, key);
72351bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio    }
72451bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio
72551bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio    private void updateOneRow(SQLiteDatabase database, String locale,
72651bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            String updatedTitle, String normalizedTitle,
7279593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio            String updatedSummaryOn, String normalizedSummaryOn,
728dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio            String updatedSummaryOff, String normalizedSummaryOff, String entries,
729dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio            String updatedSwitchOn, String normalizedSwitchOn,
730dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio            String updatedSwitchOff, String normalizedSwitchOff,
731dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio            String className, String screenTitle, int iconResId, int rank, String keywords,
73251bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            String intentAction, String intentTargetPackage, String intentTargetClass,
733c1457323d271309d5d1955743cd806417c84b9d6Fabrice Di Meglio            boolean enabled, String key) {
73451bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio
73551bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        if (TextUtils.isEmpty(updatedTitle)) {
73651bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            return;
73751bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        }
73851bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio
73951bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        ContentValues values = new ContentValues();
74051bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        values.put(IndexColumns.DOCID, updatedTitle.hashCode());
74151bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        values.put(IndexColumns.LOCALE, locale);
74251bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        values.put(IndexColumns.DATA_RANK, rank);
74351bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        values.put(IndexColumns.DATA_TITLE, updatedTitle);
74451bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        values.put(IndexColumns.DATA_TITLE_NORMALIZED, normalizedTitle);
7459593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio        values.put(IndexColumns.DATA_SUMMARY_ON, updatedSummaryOn);
7469593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio        values.put(IndexColumns.DATA_SUMMARY_ON_NORMALIZED, normalizedSummaryOn);
7479593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio        values.put(IndexColumns.DATA_SUMMARY_OFF, updatedSummaryOff);
7489593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio        values.put(IndexColumns.DATA_SUMMARY_OFF_NORMALIZED, normalizedSummaryOff);
749a41707200b6628376e8fb575e782d8228c0d32a2Fabrice Di Meglio        values.put(IndexColumns.DATA_ENTRIES, entries);
750dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio        values.put(IndexColumns.DATA_SWITCH_ON, updatedSwitchOn);
751dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio        values.put(IndexColumns.DATA_SWITCH_ON_NORMALIZED, normalizedSwitchOn);
752dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio        values.put(IndexColumns.DATA_SWITCH_OFF, updatedSwitchOff);
753dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio        values.put(IndexColumns.DATA_SWITCH_OFF_NORMALIZED, normalizedSwitchOff);
75451bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        values.put(IndexColumns.DATA_KEYWORDS, keywords);
75551bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        values.put(IndexColumns.CLASS_NAME, className);
75651bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        values.put(IndexColumns.SCREEN_TITLE, screenTitle);
75751bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        values.put(IndexColumns.INTENT_ACTION, intentAction);
75851bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        values.put(IndexColumns.INTENT_TARGET_PACKAGE, intentTargetPackage);
75951bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        values.put(IndexColumns.INTENT_TARGET_CLASS, intentTargetClass);
76051bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        values.put(IndexColumns.ICON, iconResId);
76151bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        values.put(IndexColumns.ENABLED, enabled);
762c1457323d271309d5d1955743cd806417c84b9d6Fabrice Di Meglio        values.put(IndexColumns.DATA_KEY_REF, key);
76351bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio
76451bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        database.replaceOrThrow(Tables.TABLE_PREFS_INDEX, null, values);
76551bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio    }
76651bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio
767c1457323d271309d5d1955743cd806417c84b9d6Fabrice Di Meglio    private String getDataKey(Context context, AttributeSet attrs) {
768c1457323d271309d5d1955743cd806417c84b9d6Fabrice Di Meglio        return getData(context, attrs,
769c1457323d271309d5d1955743cd806417c84b9d6Fabrice Di Meglio                com.android.internal.R.styleable.Preference,
770c1457323d271309d5d1955743cd806417c84b9d6Fabrice Di Meglio                com.android.internal.R.styleable.Preference_key);
771c1457323d271309d5d1955743cd806417c84b9d6Fabrice Di Meglio    }
772c1457323d271309d5d1955743cd806417c84b9d6Fabrice Di Meglio
77351bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio    private String getDataTitle(Context context, AttributeSet attrs) {
77451bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        return getData(context, attrs,
77551bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                com.android.internal.R.styleable.Preference,
77651bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                com.android.internal.R.styleable.Preference_title);
77751bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio    }
77851bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio
77951bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio    private String getDataSummary(Context context, AttributeSet attrs) {
78051bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        return getData(context, attrs,
78151bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                com.android.internal.R.styleable.Preference,
78251bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                com.android.internal.R.styleable.Preference_summary);
78351bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio    }
78451bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio
7859593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio    private String getDataSummaryOn(Context context, AttributeSet attrs) {
7869593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio        return getData(context, attrs,
7879593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio                com.android.internal.R.styleable.CheckBoxPreference,
7889593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio                com.android.internal.R.styleable.CheckBoxPreference_summaryOn);
7899593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio    }
7909593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio
7919593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio    private String getDataSummaryOff(Context context, AttributeSet attrs) {
7929593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio        return getData(context, attrs,
7939593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio                com.android.internal.R.styleable.CheckBoxPreference,
7949593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio                com.android.internal.R.styleable.CheckBoxPreference_summaryOff);
7959593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio    }
7969593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio
797a41707200b6628376e8fb575e782d8228c0d32a2Fabrice Di Meglio    private String getDataEntries(Context context, AttributeSet attrs) {
798a41707200b6628376e8fb575e782d8228c0d32a2Fabrice Di Meglio        return getDataEntries(context, attrs,
799a41707200b6628376e8fb575e782d8228c0d32a2Fabrice Di Meglio                com.android.internal.R.styleable.ListPreference,
800a41707200b6628376e8fb575e782d8228c0d32a2Fabrice Di Meglio                com.android.internal.R.styleable.ListPreference_entries);
801a41707200b6628376e8fb575e782d8228c0d32a2Fabrice Di Meglio    }
802a41707200b6628376e8fb575e782d8228c0d32a2Fabrice Di Meglio
803dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio    private String getDataSwitchOn(Context context, AttributeSet attrs) {
804dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio        return getData(context, attrs,
805dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio                com.android.internal.R.styleable.SwitchPreference,
806dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio                com.android.internal.R.styleable.SwitchPreference_switchTextOn);
807dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio    }
808dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio
809dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio    private String getDataSwitchOff(Context context, AttributeSet attrs) {
810dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio        return getData(context, attrs,
811dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio                com.android.internal.R.styleable.SwitchPreference,
812dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio                com.android.internal.R.styleable.SwitchPreference_switchTextOff);
813dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio    }
814dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio
81551bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio    private String getDataKeywords(Context context, AttributeSet attrs) {
81651bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        return getData(context, attrs, R.styleable.Preference, R.styleable.Preference_keywords);
81751bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio    }
81851bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio
81951bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio    private String getData(Context context, AttributeSet set, int[] attrs, int resId) {
82051bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        final TypedArray sa = context.obtainStyledAttributes(set, attrs);
82151bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        final TypedValue tv = sa.peekValue(resId);
82251bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio
82351bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        CharSequence data = null;
82451bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        if (tv != null && tv.type == TypedValue.TYPE_STRING) {
82551bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            if (tv.resourceId != 0) {
82651bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                data = context.getText(tv.resourceId);
82751bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            } else {
82851bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                data = tv.string;
82951bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            }
830b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio        }
83151bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        return (data != null) ? data.toString() : null;
832b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio    }
833b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio
834a41707200b6628376e8fb575e782d8228c0d32a2Fabrice Di Meglio    private String getDataEntries(Context context, AttributeSet set, int[] attrs, int resId) {
835a41707200b6628376e8fb575e782d8228c0d32a2Fabrice Di Meglio        final TypedArray sa = context.obtainStyledAttributes(set, attrs);
836a41707200b6628376e8fb575e782d8228c0d32a2Fabrice Di Meglio        final TypedValue tv = sa.peekValue(resId);
837a41707200b6628376e8fb575e782d8228c0d32a2Fabrice Di Meglio
838a41707200b6628376e8fb575e782d8228c0d32a2Fabrice Di Meglio        String[] data = null;
839a41707200b6628376e8fb575e782d8228c0d32a2Fabrice Di Meglio        if (tv != null && tv.type == TypedValue.TYPE_REFERENCE) {
840a41707200b6628376e8fb575e782d8228c0d32a2Fabrice Di Meglio            if (tv.resourceId != 0) {
841a41707200b6628376e8fb575e782d8228c0d32a2Fabrice Di Meglio                data = context.getResources().getStringArray(tv.resourceId);
842a41707200b6628376e8fb575e782d8228c0d32a2Fabrice Di Meglio            }
843a41707200b6628376e8fb575e782d8228c0d32a2Fabrice Di Meglio        }
844a41707200b6628376e8fb575e782d8228c0d32a2Fabrice Di Meglio        final int count = (data == null ) ? 0 : data.length;
845a41707200b6628376e8fb575e782d8228c0d32a2Fabrice Di Meglio        if (count == 0) {
846a41707200b6628376e8fb575e782d8228c0d32a2Fabrice Di Meglio            return null;
847a41707200b6628376e8fb575e782d8228c0d32a2Fabrice Di Meglio        }
848a41707200b6628376e8fb575e782d8228c0d32a2Fabrice Di Meglio        final StringBuilder result = new StringBuilder();
849a41707200b6628376e8fb575e782d8228c0d32a2Fabrice Di Meglio        for (int n = 0; n < count; n++) {
850a41707200b6628376e8fb575e782d8228c0d32a2Fabrice Di Meglio            result.append(data[n]);
851a41707200b6628376e8fb575e782d8228c0d32a2Fabrice Di Meglio            result.append(" ");
852a41707200b6628376e8fb575e782d8228c0d32a2Fabrice Di Meglio        }
853a41707200b6628376e8fb575e782d8228c0d32a2Fabrice Di Meglio        return result.toString();
854a41707200b6628376e8fb575e782d8228c0d32a2Fabrice Di Meglio    }
855a41707200b6628376e8fb575e782d8228c0d32a2Fabrice Di Meglio
856d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio    private int getResId(Context context, AttributeSet set, int[] attrs, int resId) {
857d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio        final TypedArray sa = context.obtainStyledAttributes(set, attrs);
858d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio        final TypedValue tv = sa.peekValue(resId);
859d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio
860d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio        if (tv != null && tv.type == TypedValue.TYPE_STRING) {
861d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio            return tv.resourceId;
862d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio        } else {
863d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio            return 0;
864d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio        }
865d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio   }
866d25314d3305ed1a07b53991a978cd71219ef2a10Fabrice Di Meglio
867b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio    /**
8686f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio     * A private class for updating the Index database
8696f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio     */
870b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio    private class UpdateIndexTask extends AsyncTask<UpdateData, Integer, Boolean> {
8716f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio
8726f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        @Override
8736f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        protected void onPreExecute() {
8746f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio            super.onPreExecute();
8756f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio            mIsAvailable.set(false);
8766f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        }
8776f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio
8786f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        @Override
8796f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        protected void onPostExecute(Boolean aBoolean) {
8806f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio            super.onPostExecute(aBoolean);
8816f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio            mIsAvailable.set(true);
8826f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        }
8836f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio
8846f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        @Override
885b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio        protected Boolean doInBackground(UpdateData... params) {
8866f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio            boolean result = false;
887b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio
88851bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            final List<SearchIndexableData> dataToUpdate = params[0].dataToUpdate;
889b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio            final List<String> dataToDelete = params[0].dataToDelete;
89051bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            final boolean forceUpdate = params[0].forceUpdate;
8912f4556e31b5d69e508ab9431eef4fea5f8d89e4fFabrice Di Meglio            final SQLiteDatabase database = getWritableDatabase();
892b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio            final String localeStr = Locale.getDefault().toString();
893b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio
8946f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio            try {
8956f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio                database.beginTransaction();
89651bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                if (dataToUpdate.size() > 0) {
89751bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                    processDataToUpdate(database, localeStr, dataToUpdate, forceUpdate);
898b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio                }
899b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio                if (dataToDelete.size() > 0) {
900b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio                    processDataToDelete(database, localeStr, dataToDelete);
9016f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio                }
9026f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio                database.setTransactionSuccessful();
9036f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio                result = true;
9046f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio            } finally {
9056f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio                database.endTransaction();
9066f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio            }
907b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio            return result;
908b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio        }
909b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio
91051bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        private boolean processDataToUpdate(SQLiteDatabase database, String localeStr,
91151bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                List<SearchIndexableData> dataToUpdate, boolean forceUpdate) {
91251bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio
91351bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            if (!forceUpdate && isLocaleAlreadyIndexed(database, localeStr)) {
91451bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                Log.d(LOG_TAG, "Locale '" + localeStr + "' is already indexed");
91551bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                return true;
91651bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            }
917b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio
918b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio            boolean result = false;
919b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio            final long current = System.currentTimeMillis();
920b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio
92151bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            final int count = dataToUpdate.size();
922b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio            for (int n = 0; n < count; n++) {
92351bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                final SearchIndexableData data = dataToUpdate.get(n);
92451bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                indexOneSearchIndexableData(database, localeStr, data);
925b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio            }
926b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio
927b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio            final long now = System.currentTimeMillis();
92851bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            Log.d(LOG_TAG, "Indexing locale '" + localeStr + "' took " +
929b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio                    (now - current) + " millis");
930b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio            return result;
931b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio        }
932b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio
93351bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        private boolean processDataToDelete(SQLiteDatabase database, String localeStr,
93451bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                                            List<String> dataToDelete) {
935b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio
936b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio            boolean result = false;
937b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio            final long current = System.currentTimeMillis();
938b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio
93951bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            final int count = dataToDelete.size();
940b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio            for (int n = 0; n < count; n++) {
94151bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                final String data = dataToDelete.get(n);
94251bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                delete(database, data);
943b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio            }
944b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio
9456f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio            final long now = System.currentTimeMillis();
94651bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            Log.d(LOG_TAG, "Deleting data for locale '" + localeStr + "' took " +
9476f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio                    (now - current) + " millis");
9486f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio            return result;
9496f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        }
9506f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio
95151bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        private int delete(SQLiteDatabase database, String title) {
95251bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            final String whereClause = IndexColumns.DATA_TITLE + "=?";
95351bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            final String[] whereArgs = new String[] { title };
954fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio
95551bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio            return database.delete(Tables.TABLE_PREFS_INDEX, whereClause, whereArgs);
956fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio        }
957fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio
958b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio        private boolean isLocaleAlreadyIndexed(SQLiteDatabase database, String locale) {
9596f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio            Cursor cursor = null;
9606f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio            boolean result = false;
9616f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio            final StringBuilder sb = new StringBuilder(IndexColumns.LOCALE);
9626f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio            sb.append(" = ");
963b8dfbf140986a9c0781f268ea40914063f026436Fabrice Di Meglio            DatabaseUtils.appendEscapedSQLString(sb, locale);
9646f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio            try {
9656f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio                // We care only for 1 row
9666f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio                cursor = database.query(Tables.TABLE_PREFS_INDEX, null,
9676f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio                        sb.toString(), null, null, null, null, "1");
9686f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio                final int count = cursor.getCount();
9696f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio                result = (count >= 1);
9706f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio            } finally {
9716f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio                if (cursor != null) {
9726f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio                    cursor.close();
9736f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio                }
9746f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio            }
9756f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio            return result;
9766f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        }
9776f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio    }
9786f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio}
979