diff options
4 files changed, 107 insertions, 15 deletions
diff --git a/src/com/android/dialer/DialtactsActivity.java b/src/com/android/dialer/DialtactsActivity.java index 962986194..4b56c6a7a 100644 --- a/src/com/android/dialer/DialtactsActivity.java +++ b/src/com/android/dialer/DialtactsActivity.java @@ -22,6 +22,7 @@ import android.app.FragmentTransaction; import android.content.ActivityNotFoundException; import android.content.Context; import android.content.Intent; +import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.res.Configuration; @@ -29,6 +30,10 @@ import android.content.res.Resources; import android.net.Uri; import android.os.Bundle; import android.os.SystemProperties; +import android.os.RemoteException; +import android.os.ServiceManager; +import android.preference.PreferenceManager; +import android.provider.CallLog.Calls; import android.provider.ContactsContract.Contacts; import android.provider.ContactsContract.Intents; import android.speech.RecognizerIntent; @@ -90,6 +95,7 @@ import com.android.dialer.widget.SearchEditTextLayout.OnBackButtonClickedListene import com.android.dialerbind.DatabaseHelperManager; import com.android.incallui.CallCardFragment; import com.android.phone.common.animation.AnimUtils; +import com.android.phone.common.util.SettingsUtil; import com.android.ims.ImsManager; import com.android.internal.telephony.TelephonyProperties; import com.android.phone.common.animation.AnimationListenerAdapter; @@ -97,6 +103,7 @@ import com.android.phone.common.animation.AnimationListenerAdapter; import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import java.util.Locale; /** * The dialer tab's title is 'phone', a more common name (see strings.xml). @@ -118,6 +125,7 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O public static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); public static final String SHARED_PREFS_NAME = "com.android.dialer_preferences"; + private static final String PREF_LAST_T9_LOCALE = "smart_dial_prefix_last_t9_locale"; /** @see #getCallOrigin() */ private static final String CALL_ORIGIN_DIALTACTS = @@ -456,7 +464,6 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O setupActivityOverlay(); mDialerDatabaseHelper = DatabaseHelperManager.getDatabaseHelper(this); - SmartDialPrefix.initializeNanpSettings(this); } private void setupActivityOverlay() { @@ -491,7 +498,24 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O setConferenceDialButtonImage(false); setConferenceDialButtonVisibility(true); + // make this call on resume in case user changed t9 locale in settings SmartDialPrefix.initializeNanpSettings(this); + + // if locale has changed since last time, refresh the smart dial db + Locale locale = SettingsUtil.getT9SearchInputLocale(this); + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); + String prevLocale = prefs.getString(PREF_LAST_T9_LOCALE, null); + + if (!TextUtils.equals(locale.toString(), prevLocale)) { + mDialerDatabaseHelper.recreateSmartDialDatabaseInBackground(); + if (mDialpadFragment != null) + mDialpadFragment.refreshKeypad(); + + prefs.edit().putString(PREF_LAST_T9_LOCALE, locale.toString()).apply(); + } + else { + mDialerDatabaseHelper.startSmartDialUpdateThread(); + } } @Override diff --git a/src/com/android/dialer/database/DialerDatabaseHelper.java b/src/com/android/dialer/database/DialerDatabaseHelper.java index 737999707..b4ca31d6a 100644 --- a/src/com/android/dialer/database/DialerDatabaseHelper.java +++ b/src/com/android/dialer/database/DialerDatabaseHelper.java @@ -546,6 +546,48 @@ public class DialerDatabaseHelper extends SQLiteOpenHelper { super.onPostExecute(o); } } + + /** + * Deletes all smart dial data and recreates it from contacts + */ + public void recreateSmartDialDatabaseInBackground() { new SmartDialRecreateAsyncTask().execute(); } + + private class SmartDialRecreateAsyncTask extends AsyncTask { + @Override + protected Object doInBackground(Object[] objects) { + if (DEBUG) { + Log.v(TAG, "Recreating database"); + } + + // reset last updated so that we query for all contacts + resetSmartDialLastUpdatedTime(); + + // clear all contacts + final SQLiteDatabase db = getWritableDatabase(); + removeAllContacts(db); + + // repopulate + updateSmartDialDatabase(); + return null; + } + + @Override + protected void onCancelled() { + if (DEBUG) { + Log.v(TAG, "Recreate Cancelled"); + } + super.onCancelled(); + } + + @Override + protected void onPostExecute(Object o) { + if (DEBUG) { + Log.v(TAG, "Recreate Finished"); + } + super.onPostExecute(o); + } + } + /** * Removes rows in the smartdial database that matches the contacts that have been deleted * by other apps since last update. diff --git a/src/com/android/dialer/dialpad/DialpadFragment.java b/src/com/android/dialer/dialpad/DialpadFragment.java index ac86ae7ea..c0ac5e957 100644 --- a/src/com/android/dialer/dialpad/DialpadFragment.java +++ b/src/com/android/dialer/dialpad/DialpadFragment.java @@ -25,6 +25,7 @@ import android.content.ContentResolver; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; +import android.content.res.Configuration; import android.content.res.Resources; import android.database.Cursor; import android.graphics.Bitmap; @@ -94,6 +95,7 @@ import com.android.phone.common.dialpad.DialpadView; import com.google.common.annotations.VisibleForTesting; import java.util.HashSet; +import java.util.Locale; /** * Fragment that displays a twelve-key phone dialpad. @@ -619,6 +621,12 @@ public class DialpadFragment extends AnalyticsFragment pound.setOnLongClickListener(this); } + public void refreshKeypad() { + if (mDialpadView != null) { + mDialpadView.refreshKeypad(); + } + } + @Override public void onResume() { super.onResume(); diff --git a/src/com/android/dialer/dialpad/SmartDialPrefix.java b/src/com/android/dialer/dialpad/SmartDialPrefix.java index 6d2893b71..e80e133e3 100644 --- a/src/com/android/dialer/dialpad/SmartDialPrefix.java +++ b/src/com/android/dialer/dialpad/SmartDialPrefix.java @@ -23,12 +23,20 @@ import android.preference.PreferenceManager; import android.telephony.TelephonyManager; import android.text.TextUtils; +import com.android.dialer.database.DialerDatabaseHelper; +import com.android.dialerbind.DatabaseHelperManager; +import com.android.phone.common.util.SettingsUtil; import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.Lists; import java.util.ArrayList; import java.util.HashSet; import java.util.Set; +import java.util.Locale; +import java.util.Map; +import java.util.HashMap; + +import android.util.Log; /** * Smart Dial utility class to find prefixes of contacts. It contains both methods to find supported @@ -69,6 +77,24 @@ public class SmartDialPrefix { private static boolean sNanpInitialized = false; + private static final Map<String, SmartDialMap> languageToSmartDialMap = new HashMap<String, SmartDialMap>(); + static { + languageToSmartDialMap.put("ko", new KoreanSmartDialMap()); + languageToSmartDialMap.put("el", new GreekSmartDialMap()); + languageToSmartDialMap.put("ru", new RussianSmartDialMap()); + languageToSmartDialMap.put("he", new HebrewSmartDialMap()); + languageToSmartDialMap.put("zh", new ChineseSmartDialMap()); + } + + private static final Map<String, SmartDialMap> countryToSmartDialMap = new HashMap<String, SmartDialMap>(); + static { + languageToSmartDialMap.put("KR", new KoreanSmartDialMap()); + languageToSmartDialMap.put("GR", new GreekSmartDialMap()); + languageToSmartDialMap.put("RU", new RussianSmartDialMap()); + languageToSmartDialMap.put("IL", new HebrewSmartDialMap()); + languageToSmartDialMap.put("CN", new ChineseSmartDialMap()); + } + /** Initializes the Nanp settings, and finds out whether user is in a NANP region.*/ public static void initializeNanpSettings(Context context){ final TelephonyManager manager = (TelephonyManager) context.getSystemService( @@ -90,21 +116,13 @@ public class SmartDialPrefix { /** Queries the NANP country list to find out whether user is in a NANP region.*/ sUserInNanpRegion = isCountryNanp(sUserSimCountryCode); - /** Sets a layout for SmartDial depending on current UI language.*/ - String locale = context.getResources().getConfiguration().locale.getCountry(); - if (locale.equals("RU")) { - mMap = new RussianSmartDialMap(); - } else if (locale.equals("GR")) { - mMap = new GreekSmartDialMap(); - } else if (locale.equals("IL")) { - mMap = new HebrewSmartDialMap(); - } else if (locale.equals("KR")) { - mMap = new KoreanSmartDialMap(); - } else if (locale.equals("CN")) { - mMap = new ChineseSmartDialMap(); - } else { + /** Sets a layout for SmartDial based on locale. Lookup by language first and fallback to country */ + Locale locale = SettingsUtil.getT9SearchInputLocale(context); + mMap = languageToSmartDialMap.get(locale.getLanguage()); + if (mMap == null) + mMap = countryToSmartDialMap.get(locale.getCountry()); + if (mMap == null) mMap = new LatinSmartDialMap(); - } sNanpInitialized = true; } |