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,
});
}