aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMakoto Onuki <omakoto@google.com>2019-05-30 13:56:20 -0700
committerandroid-build-merger <android-build-merger@google.com>2019-05-30 13:56:20 -0700
commitc1d54f1bc7b3285a6940fc83ce0ba0bb6782e727 (patch)
treebf05d64ee659c82e6b9ed4d2b56178bd4922d61a
parentdb6c6d0ce35cb3074836d64c1a61d0d39a236a95 (diff)
parent4387625574c26c8431d23d0f94018264046c866b (diff)
downloadContactsProvider-c1d54f1bc7b3285a6940fc83ce0ba0bb6782e727.tar.gz
Merge "Detect country change at runtime too" into qt-dev
am: 4387625574 Change-Id: I5b86792f56490c4684e352d8c7f1b86f15bc14b7
-rw-r--r--src/com/android/providers/contacts/ContactsDatabaseHelper.java119
-rw-r--r--src/com/android/providers/contacts/ContactsProvider2.java6
-rw-r--r--src/com/android/providers/contacts/CountryMonitor.java27
-rw-r--r--src/com/android/providers/contacts/ProfileDatabaseHelper.java10
4 files changed, 130 insertions, 32 deletions
diff --git a/src/com/android/providers/contacts/ContactsDatabaseHelper.java b/src/com/android/providers/contacts/ContactsDatabaseHelper.java
index 01a08728..4c521f40 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.ApplicationInfo;
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.DeletedContactsTableUtil;
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 @@ public class ContactsDatabaseHelper extends SQLiteOpenHelper {
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 @@ public class ContactsDatabaseHelper extends SQLiteOpenHelper {
}
}
- 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 @@ public class ContactsDatabaseHelper extends SQLiteOpenHelper {
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 class ContactsDatabaseHelper extends SQLiteOpenHelper {
}
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 @@ public class ContactsDatabaseHelper extends SQLiteOpenHelper {
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 4104e37e..02c8bf00 100644
--- a/src/com/android/providers/contacts/ContactsProvider2.java
+++ b/src/com/android/providers/contacts/ContactsProvider2.java
@@ -9848,13 +9848,9 @@ public class ContactsProvider2 extends AbstractContactsProvider
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 7796849c..134a4ef7 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 @@ import java.util.Locale;
*/
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 @@ public class CountryMonitor {
}
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 966ee7e8..7cb0ff7e 100644
--- a/src/com/android/providers/contacts/ProfileDatabaseHelper.java
+++ b/src/com/android/providers/contacts/ProfileDatabaseHelper.java
@@ -88,4 +88,14 @@ public class ProfileDatabaseHelper extends ContactsDatabaseHelper {
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.
+ }
}