android ICS2 google帐户的联系人无法搜索出来问题
2013-02-17 17:35 setsail_wu 阅读(206) 评论(0) 收藏 举报
BUG现象:
1:恢复出厂设置,重启开机后在设置向导中设置为中文,打开wifi,同步google联系人,此时可以搜索出联系人,同步完成后拔电池重新开机,进入拨号盘或联系人,此时搜索不出联系人。
2:恢复出厂设置,重启开机后在设置向导中设置为中文,此时可以搜索出卡中的联系人,放置一段时间后,约半个小时(吃个午饭),进入拨号盘或联系人,此时搜索不出联系人。(此时与google帐户联系人无关)
原因:
电话号码的搜索关键字的编码与Locale相关,Locale变化后手机中的搜索索引表的name字段的编码没有更新,与搜索关键字的编码不对应。
导入对策:
1、google的修改方案,切换语言时重建搜索索引表。
2、开机时检查Locale,搜索索引表中编码与关键字编码不一致时重建搜索索引表。
3、每次搜索时,搜索索引表中编码与关键字编码不一致时重建搜索索引表。
影响范围:
修改的内容均为联系人的数据支持部分
以下为修改代码的patch:
commit f054692f0d2cf09dbfed7ff0bcc391baf9295576
Author: wutuo <wutuo@e89ae1c7-cfc9-4d8c-8e5a-bd7b9746a3ba>
Date: Sun Feb 17 09:25:50 2013 +0000
解决问题:google帐户同步后重启搜索不到联系人
git-svn-id: svn://XXX.XXX.XXX.XXX/XXX@2103 e89ae1c7-cfc9-4d8c-8e5a-bd7b9746a3ba
diff --git a/alps/packages/providers/ContactsProvider/src/com/android/providers/contacts/ContactsDatabaseHelper.java b/alps/packages/providers/ContactsProvider/src/com/android/providers/contacts/ContactsDatabaseHelper.java
index 3392b38..40430dd 100644
--- a/alps/packages/providers/ContactsProvider/src/com/android/providers/contacts/ContactsDatabaseHelper.java
+++ b/alps/packages/providers/ContactsProvider/src/com/android/providers/contacts/ContactsDatabaseHelper.java
@@ -2597,6 +2597,7 @@ public class ContactsDatabaseHelper extends SQLiteOpenHelper {
if (upgradeSearchIndex) {
createSearchIndexTable(db);
setProperty(db, SearchIndexManager.PROPERTY_SEARCH_INDEX_VERSION, "0");
+ setProperty(db, SearchIndexManager.PROPERTY_SEARCH_INDEX_LOCALE, "");
}
if (rescanDirectories) {
diff --git a/alps/packages/providers/ContactsProvider/src/com/android/providers/contacts/ContactsProvider2.java b/alps/packages/providers/ContactsProvider/src/com/android/providers/contacts/ContactsProvider2.java
index 040cc79..8fc4e54 100644
--- a/alps/packages/providers/ContactsProvider/src/com/android/providers/contacts/ContactsProvider2.java
+++ b/alps/packages/providers/ContactsProvider/src/com/android/providers/contacts/ContactsProvider2.java
@@ -1791,6 +1791,7 @@ public class ContactsProvider2 extends AbstractContactsProvider
setProviderStatus(ProviderStatus.STATUS_CHANGING_LOCALE);
mContactsHelper.setLocale(this, currentLocale);
mProfileHelper.setLocale(this, currentLocale);
+ mSearchIndexManager.updateIndex(true);
prefs.edit().putString(PREF_LOCALE, currentLocale.toString()).apply();
invalidateFastScrollingIndexCache();
setProviderStatus(providerStatus);
@@ -1821,7 +1822,7 @@ public class ContactsProvider2 extends AbstractContactsProvider
}
protected void updateSearchIndexInBackground() {
- mSearchIndexManager.updateIndex();
+ mSearchIndexManager.updateIndex(false);
}
protected void updateDirectoriesInBackground(boolean rescan) {
@@ -5792,6 +5793,10 @@ public class ContactsProvider2 extends AbstractContactsProvider
case PHONES_FILTER:
case CALLABLES_FILTER: {
+ if(!mSearchIndexManager.getSearchIndexLocale().equals(NameNormalizer.getLocale().toString()))
+ {
+ scheduleBackgroundTask(BACKGROUND_TASK_UPDATE_SEARCH_INDEX);
+ }
final String mimeTypeIsPhoneExpression =
DataColumns.MIMETYPE_ID + "=" + mDbHelper.get().getMimeTypeIdForPhone();
final String mimeTypeIsSipExpression =
diff --git a/alps/packages/providers/ContactsProvider/src/com/android/providers/contacts/NameNormalizer.java b/alps/packages/providers/ContactsProvider/src/com/android/providers/contacts/NameNormalizer.java
index d91bd7c..193f449 100644
--- a/alps/packages/providers/ContactsProvider/src/com/android/providers/contacts/NameNormalizer.java
+++ b/alps/packages/providers/ContactsProvider/src/com/android/providers/contacts/NameNormalizer.java
@@ -29,11 +29,13 @@ import java.text.RuleBasedCollator;
public class NameNormalizer {
private static final RuleBasedCollator sCompressingCollator;
+ private static final Locale mLocale;
static {
sCompressingCollator = (RuleBasedCollator)Collator.getInstance(Locale.getDefault());
sCompressingCollator.setStrength(Collator.PRIMARY);
sCompressingCollator.setDecomposition(Collator.CANONICAL_DECOMPOSITION);
+ mLocale = Locale.getDefault();
}
private static final RuleBasedCollator sComplexityCollator;
static {
@@ -41,6 +43,10 @@ public class NameNormalizer {
sComplexityCollator.setStrength(Collator.SECONDARY);
}
+ public static Locale getLocale() {
+ return mLocale;
+ }
+
/**
* Converts the supplied name to a string that can be used to perform approximate matching
* of names. It ignores non-letter, non-digit characters, and removes accents.
diff --git a/alps/packages/providers/ContactsProvider/src/com/android/providers/contacts/SearchIndexManager.java b/alps/packages/providers/ContactsProvider/src/com/android/providers/contacts/SearchIndexManager.java
index bd4e1cc..c9d6fe3 100644
--- a/alps/packages/providers/ContactsProvider/src/com/android/providers/contacts/SearchIndexManager.java
+++ b/alps/packages/providers/ContactsProvider/src/com/android/providers/contacts/SearchIndexManager.java
@@ -42,6 +42,7 @@ import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.regex.Pattern;
+import java.util.Locale;
/**
* Maintains a search index for comprehensive contact search.
@@ -52,6 +53,7 @@ public class SearchIndexManager {
private static final boolean VERBOSE_LOGGING = Log.isLoggable(TAG, Log.VERBOSE);
public static final String PROPERTY_SEARCH_INDEX_VERSION = "search_index";
+ public static final String PROPERTY_SEARCH_INDEX_LOCALE = "search_index_locale";
private static final int SEARCH_INDEX_VERSION = 1;
private static final class ContactIndexQuery {
@@ -243,16 +245,26 @@ public class SearchIndexManager {
mDbHelper = (ContactsDatabaseHelper) mContactsProvider.getDatabaseHelper();
}
- public void updateIndex() {
- if (getSearchIndexVersion() == SEARCH_INDEX_VERSION) {
- return;
- }
+ public void updateIndex(boolean force) {
+ if(!getSearchIndexLocale().equals(NameNormalizer.getLocale().toString()))
+ {
+ setSearchIndexVersion(0);
+ }
+ if(force) {
+ setSearchIndexVersion(0);
+ }
+ else {
+ if (getSearchIndexVersion() == SEARCH_INDEX_VERSION) {
+ return;
+ }
+ }
SQLiteDatabase db = mDbHelper.getWritableDatabase();
db.beginTransaction();
try {
if (getSearchIndexVersion() != SEARCH_INDEX_VERSION) {
rebuildIndex(db);
setSearchIndexVersion(SEARCH_INDEX_VERSION);
+ setSearchIndexLocale(NameNormalizer.getLocale().toString());
db.setTransactionSuccessful();
}
} finally {
@@ -394,6 +406,14 @@ public class SearchIndexManager {
mDbHelper.setProperty(PROPERTY_SEARCH_INDEX_VERSION, String.valueOf(version));
}
+ public String getSearchIndexLocale() {
+ return mDbHelper.getProperty(PROPERTY_SEARCH_INDEX_LOCALE , "0");
+ }
+
+ public void setSearchIndexLocale(String locale) {
+ mDbHelper.setProperty(PROPERTY_SEARCH_INDEX_LOCALE , locale);
+ }
+
/**
* Token separator that matches SQLite's "simple" tokenizer.
* - Unicode codepoints >= 128: Everything
浙公网安备 33010602011771号