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