Snap for 5626642 from e206d8a15d1f50b1ee3c9ba076d70ba779e58b44 to qt-c2f2-release

Change-Id: Ic25b2ede8f596b070c1b9fb8c5081425274e4aa6
diff --git a/src/com/android/providers/contacts/ContactsDatabaseHelper.java b/src/com/android/providers/contacts/ContactsDatabaseHelper.java
index 01a0872..4c521f4 100644
--- a/src/com/android/providers/contacts/ContactsDatabaseHelper.java
+++ b/src/com/android/providers/contacts/ContactsDatabaseHelper.java
@@ -16,6 +16,7 @@
 
 package com.android.providers.contacts;
 
+import com.android.internal.R.bool;
 import com.android.providers.contacts.sqlite.DatabaseAnalyzer;
 import com.android.providers.contacts.sqlite.SqlChecker;
 import com.android.providers.contacts.sqlite.SqlChecker.InvalidSqlException;
@@ -30,7 +31,6 @@
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.NameNotFoundException;
 import android.content.pm.UserInfo;
-import android.content.res.Resources;
 import android.database.CharArrayBuffer;
 import android.database.Cursor;
 import android.database.DatabaseUtils;
@@ -105,11 +105,16 @@
 import com.android.providers.contacts.database.MoreDatabaseUtils;
 import com.android.providers.contacts.util.NeededForTesting;
 
+import java.io.PrintWriter;
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
 import java.util.ArrayList;
 import java.util.Locale;
 import java.util.Set;
+import java.util.concurrent.Executor;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
 
 /**
  * Database helper for contacts. Designed as a singleton to make sure that all
@@ -151,10 +156,14 @@
     private static final String USE_STRICT_PHONE_NUMBER_COMPARISON_KEY
             = "use_strict_phone_number_comparison";
 
-    private static final String USE_STRICT_PHONE_NUMBER_COMPARISON_FOR_RUSSIAN_KEY
-            = "use_strict_phone_number_comparison_for_russian";
+    private static final String USE_STRICT_PHONE_NUMBER_COMPARISON_FOR_RUSSIA_KEY
+            = "use_strict_phone_number_comparison_for_russia";
 
-    private static final String RUSSIAN_COUNTRY_CODE = "RU";
+    private static final String USE_STRICT_PHONE_NUMBER_COMPARISON_FOR_KAZAKHSTAN_KEY
+            = "use_strict_phone_number_comparison_for_kazakhstan";
+
+    private static final String RUSSIA_COUNTRY_CODE = "RU";
+    private static final String KAZAKHSTAN_COUNTRY_CODE = "KZ";
 
     public interface Tables {
         public static final String CONTACTS = "contacts";
@@ -965,13 +974,23 @@
         }
     }
 
-    private boolean mUseStrictPhoneNumberComparison;
+    // We access it from multiple threads, so mark as volatile.
+    private volatile boolean mUseStrictPhoneNumberComparison;
+
+    // They're basically accessed only in one method, as well as in dump(), so technically
+    // they should be volatile too, but it's not really needed in practice.
+    private boolean mUseStrictPhoneNumberComparisonBase;
+    private boolean mUseStrictPhoneNumberComparisonForRussia;
+    private boolean mUseStrictPhoneNumberComparisonForKazakhstan;
 
     private String[] mSelectionArgs1 = new String[1];
     private NameSplitter.Name mName = new NameSplitter.Name();
     private CharArrayBuffer mCharArrayBuffer = new CharArrayBuffer(128);
     private NameSplitter mNameSplitter;
 
+    private final Executor mLazilyCreatedExecutor =
+            new ThreadPoolExecutor(0, 1, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<>());
+
     public static synchronized ContactsDatabaseHelper getInstance(Context context) {
         if (sSingleton == null) {
             sSingleton = new ContactsDatabaseHelper(context, DATABASE_NAME, true,
@@ -1002,28 +1021,64 @@
         setIdleConnectionTimeout(IDLE_CONNECTION_TIMEOUT_MS);
         mDatabaseOptimizationEnabled = optimizationEnabled;
         mIsTestInstance = isTestInstance;
-        Resources resources = context.getResources();
         mContext = context;
         mSyncState = new SyncStateContentProviderHelper();
-        mCountryMonitor = new CountryMonitor(context);
 
-        if (RUSSIAN_COUNTRY_CODE.equals(getCurrentCountryIso())) {
-            mUseStrictPhoneNumberComparison =
-                    DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_CONTACTS_PROVIDER,
-                            USE_STRICT_PHONE_NUMBER_COMPARISON_FOR_RUSSIAN_KEY,
-                    resources.getBoolean(
-                            com.android.internal.R.
-                                    bool.config_use_strict_phone_number_comparation_for_russian));
+        mCountryMonitor = new CountryMonitor(context, this::updateUseStrictPhoneNumberComparison);
+
+        startListeningToDeviceConfigUpdates();
+
+        updateUseStrictPhoneNumberComparison();
+    }
+
+    protected void startListeningToDeviceConfigUpdates() {
+        // Note we override this method in the profile helper to skip it.
+
+        DeviceConfig.addOnPropertiesChangedListener(DeviceConfig.NAMESPACE_CONTACTS_PROVIDER,
+                mLazilyCreatedExecutor, (props) -> onDeviceConfigUpdated());
+    }
+
+    private void onDeviceConfigUpdated() {
+        updateUseStrictPhoneNumberComparison();
+    }
+
+    protected void updateUseStrictPhoneNumberComparison() {
+        // Note we override this method in the profile helper to skip it.
+
+        final String country = getCurrentCountryIso();
+
+        Log.i(TAG, "updateUseStrictPhoneNumberComparison: " + country);
+
+        // Load all the configs so we can show them in dumpsys.
+        mUseStrictPhoneNumberComparisonBase = getConfig(
+                USE_STRICT_PHONE_NUMBER_COMPARISON_KEY,
+                bool.config_use_strict_phone_number_comparation);
+
+        mUseStrictPhoneNumberComparisonForRussia = getConfig(
+                USE_STRICT_PHONE_NUMBER_COMPARISON_FOR_RUSSIA_KEY,
+                bool.config_use_strict_phone_number_comparation_for_russia);
+
+        mUseStrictPhoneNumberComparisonForKazakhstan = getConfig(
+                USE_STRICT_PHONE_NUMBER_COMPARISON_FOR_KAZAKHSTAN_KEY,
+                bool.config_use_strict_phone_number_comparation_for_kazakhstan);
+
+        if (RUSSIA_COUNTRY_CODE.equals(country)) {
+            mUseStrictPhoneNumberComparison = mUseStrictPhoneNumberComparisonForRussia;
+
+        } else if (KAZAKHSTAN_COUNTRY_CODE.equals(country)) {
+            mUseStrictPhoneNumberComparison = mUseStrictPhoneNumberComparisonForKazakhstan;
+
         } else {
-            mUseStrictPhoneNumberComparison =
-                    DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_CONTACTS_PROVIDER,
-                            USE_STRICT_PHONE_NUMBER_COMPARISON_KEY,
-                    resources.getBoolean(
-                            com.android.internal.R.
-                                    bool.config_use_strict_phone_number_comparation));
+            mUseStrictPhoneNumberComparison = mUseStrictPhoneNumberComparisonBase;
         }
     }
 
+    private boolean getConfig(String configKey, int defaultResId) {
+        return DeviceConfig.getBoolean(
+                DeviceConfig.NAMESPACE_CONTACTS_PROVIDER, configKey,
+                mContext.getResources().getBoolean(defaultResId));
+    }
+
     public SQLiteDatabase getDatabase(boolean writable) {
         return writable ? getWritableDatabase() : getReadableDatabase();
     }
@@ -4883,6 +4938,9 @@
     }
 
     public String getCurrentCountryIso() {
+        // For debugging.
+        // String injected = android.os.SystemProperties.get("debug.cp2.injectedCountryIso");
+        // if (!TextUtils.isEmpty(injected)) return injected;
         return mCountryMonitor.getCountryIso();
     }
 
@@ -5036,4 +5094,23 @@
             Slog.wtfStack(TAG, message);
         }
     }
+
+    public void dump(PrintWriter pw) {
+        pw.print("CountryISO: ");
+        pw.println(getCurrentCountryIso());
+
+        pw.print("UseStrictPhoneNumberComparison: ");
+        pw.println(mUseStrictPhoneNumberComparison);
+
+        pw.print("UseStrictPhoneNumberComparisonBase: ");
+        pw.println(mUseStrictPhoneNumberComparisonBase);
+
+        pw.print("UseStrictPhoneNumberComparisonRU: ");
+        pw.println(mUseStrictPhoneNumberComparisonForRussia);
+
+        pw.print("UseStrictPhoneNumberComparisonKZ: ");
+        pw.println(mUseStrictPhoneNumberComparisonForKazakhstan);
+
+        pw.println();
+    }
 }
diff --git a/src/com/android/providers/contacts/ContactsProvider2.java b/src/com/android/providers/contacts/ContactsProvider2.java
index 4104e37..02c8bf0 100644
--- a/src/com/android/providers/contacts/ContactsProvider2.java
+++ b/src/com/android/providers/contacts/ContactsProvider2.java
@@ -9848,13 +9848,9 @@
                 safeDiv(mTotalTimeFastScrollingIndexGenerate, mFastScrollingIndexCacheMissCount));
         pw.println();
 
-        pw.print("mUseStrictPhoneNumberComparison=");
         if (mContactsHelper != null) {
-            pw.println(mContactsHelper.getUseStrictPhoneNumberComparisonParameter());
+            mContactsHelper.dump(pw);
         }
-        pw.println();
-
-        pw.println();
 
         // DB queries may be blocked and timed out, so do it at the end.
 
diff --git a/src/com/android/providers/contacts/CountryMonitor.java b/src/com/android/providers/contacts/CountryMonitor.java
index 7796849..134a4ef 100644
--- a/src/com/android/providers/contacts/CountryMonitor.java
+++ b/src/com/android/providers/contacts/CountryMonitor.java
@@ -16,6 +16,8 @@
 
 package com.android.providers.contacts;
 
+import android.annotation.NonNull;
+import android.annotation.Nullable;
 import android.content.Context;
 import android.location.Country;
 import android.location.CountryDetector;
@@ -32,10 +34,20 @@
  */
 public class CountryMonitor {
     private String mCurrentCountryIso;
-    private Context mContext;
 
-    public CountryMonitor(Context context) {
+    @NonNull
+    private final Context mContext;
+
+    @Nullable
+    private final Runnable mUpdateCallback;
+
+    public CountryMonitor(@NonNull Context context) {
+        this(context, null);
+    }
+
+    public CountryMonitor(@NonNull Context context, @Nullable Runnable updateCallback) {
         mContext = context;
+        mUpdateCallback = updateCallback;
     }
 
     /**
@@ -56,11 +68,14 @@
             }
 
             mCurrentCountryIso = country.getCountryIso();
-                countryDetector.addCountryListener(new CountryListener() {
-                    public void onCountryDetected(Country country) {
-                        mCurrentCountryIso = country.getCountryIso();
+            countryDetector.addCountryListener(new CountryListener() {
+                public void onCountryDetected(Country country) {
+                    mCurrentCountryIso = country.getCountryIso();
+                    if (mUpdateCallback != null) {
+                        mUpdateCallback.run();
                     }
-                }, Looper.getMainLooper());
+                }
+            }, Looper.getMainLooper());
         }
         return mCurrentCountryIso;
     }
diff --git a/src/com/android/providers/contacts/ProfileDatabaseHelper.java b/src/com/android/providers/contacts/ProfileDatabaseHelper.java
index 966ee7e..7cb0ff7 100644
--- a/src/com/android/providers/contacts/ProfileDatabaseHelper.java
+++ b/src/com/android/providers/contacts/ProfileDatabaseHelper.java
@@ -88,4 +88,14 @@
     protected void loadDatabaseCreationTime(SQLiteDatabase db) {
         // We don't need the creation time for the profile DB.
     }
+
+    @Override
+    protected void startListeningToDeviceConfigUpdates() {
+        // Do nothing for the profile DB.
+    }
+
+    @Override
+    protected void updateUseStrictPhoneNumberComparison() {
+        // Do nothing for the profile DB.
+    }
 }
diff --git a/src/com/android/providers/contacts/VoicemailPermissions.java b/src/com/android/providers/contacts/VoicemailPermissions.java
index ed3815d..7e409ea 100644
--- a/src/com/android/providers/contacts/VoicemailPermissions.java
+++ b/src/com/android/providers/contacts/VoicemailPermissions.java
@@ -124,8 +124,7 @@
                 (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
         String[] packages = mContext.getPackageManager().getPackagesForUid(Binder.getCallingUid());
         for (String packageName : packages) {
-            if (tm.checkCarrierPrivilegesForPackageAnyPhone(packageName)
-                    == TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS) {
+            if (packageHasCarrierPrivileges(tm, packageName)) {
                 return true;
             }
         }
@@ -136,6 +135,11 @@
     private boolean packageHasCarrierPrivileges(String packageName) {
         TelephonyManager tm =
                 (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
-        return tm.getPackagesWithCarrierPrivileges().contains(packageName);
+        return packageHasCarrierPrivileges(tm, packageName);
+    }
+
+    private static boolean packageHasCarrierPrivileges(TelephonyManager tm, String packageName) {
+        return tm.checkCarrierPrivilegesForPackageAnyPhone(packageName)
+                == TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS;
     }
 }
diff --git a/tests/src/com/android/providers/contacts/CallLogProviderTest.java b/tests/src/com/android/providers/contacts/CallLogProviderTest.java
index babfaff..93806e0 100644
--- a/tests/src/com/android/providers/contacts/CallLogProviderTest.java
+++ b/tests/src/com/android/providers/contacts/CallLogProviderTest.java
@@ -202,8 +202,7 @@
         values.put(Calls.NUMBER_PRESENTATION, Calls.PRESENTATION_ALLOWED);
         values.put(Calls.DATE, 2000);
         values.put(Calls.DURATION, 40);
-        // Cached values should not be updated immediately by the framework when inserting the call.
-        values.put(Calls.CACHED_NAME, (String) null);
+        values.put(Calls.CACHED_NAME, ci.name);
         values.put(Calls.CACHED_NUMBER_TYPE, (String) null);
         values.put(Calls.CACHED_NUMBER_LABEL, (String) null);
         values.put(Calls.COUNTRY_ISO, "us");
diff --git a/tests/src/com/android/providers/contacts/ContactsProvider2Test.java b/tests/src/com/android/providers/contacts/ContactsProvider2Test.java
index 88e32e6..32a0306 100644
--- a/tests/src/com/android/providers/contacts/ContactsProvider2Test.java
+++ b/tests/src/com/android/providers/contacts/ContactsProvider2Test.java
@@ -743,6 +743,8 @@
                 PhoneLookup.TYPE,
                 PhoneLookup.LABEL,
                 PhoneLookup.NORMALIZED_NUMBER,
+                Data.PREFERRED_PHONE_ACCOUNT_COMPONENT_NAME,
+                Data.PREFERRED_PHONE_ACCOUNT_ID,
         });
     }
 
@@ -777,6 +779,8 @@
                         PhoneLookup.TYPE,
                         PhoneLookup.LABEL,
                         PhoneLookup.NORMALIZED_NUMBER,
+                        Data.PREFERRED_PHONE_ACCOUNT_COMPONENT_NAME,
+                        Data.PREFERRED_PHONE_ACCOUNT_ID,
                 });
     }