现在的位置: 首页 > 综合 > 正文

android ICS2 google帐户的联系人无法搜索出来问题

2013年09月10日 ⁄ 综合 ⁄ 共 6254字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.