diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index c6630e1..7b2e9b6 100755
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -5,7 +5,6 @@
     <uses-permission android:name="android.permission.READ_USER_DICTIONARY" />
     <uses-permission android:name="android.permission.WRITE_USER_DICTIONARY" />
     <uses-permission android:name="android.permission.BACKUP_DATA" />
-    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
 
     <application android:label="@string/english_ime_name"
             android:backupAgent="LatinIMEBackupAgent"
diff --git a/src/com/android/inputmethod/latin/Hints.java b/src/com/android/inputmethod/latin/Hints.java
index 109d3f0..689c8d8 100644
--- a/src/com/android/inputmethod/latin/Hints.java
+++ b/src/com/android/inputmethod/latin/Hints.java
@@ -1,12 +1,12 @@
 /*
  * Copyright (C) 2009 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -16,7 +16,7 @@
 
 package com.android.inputmethod.latin;
 
-import com.android.inputmethod.voice.GoogleSettingsUtil;
+import com.android.inputmethod.voice.SettingsUtil;
 
 import android.content.ContentResolver;
 import android.content.Context;
@@ -66,15 +66,15 @@
     public Hints(Context context, Display display) {
         mContext = context;
         mDisplay = display;
-        
+
         ContentResolver cr = mContext.getContentResolver();
-        mSwipeHintMaxDaysToShow = GoogleSettingsUtil.getGservicesInt(
+        mSwipeHintMaxDaysToShow = SettingsUtil.getSettingsInt(
                 cr,
-                GoogleSettingsUtil.LATIN_IME_VOICE_INPUT_SWIPE_HINT_MAX_DAYS,
+                SettingsUtil.LATIN_IME_VOICE_INPUT_SWIPE_HINT_MAX_DAYS,
                 DEFAULT_SWIPE_HINT_MAX_DAYS_TO_SHOW);
-        mPunctuationHintMaxDisplays = GoogleSettingsUtil.getGservicesInt(
+        mPunctuationHintMaxDisplays = SettingsUtil.getSettingsInt(
                 cr,
-                GoogleSettingsUtil.LATIN_IME_VOICE_INPUT_PUNCTUATION_HINT_MAX_DISPLAYS,
+                SettingsUtil.LATIN_IME_VOICE_INPUT_PUNCTUATION_HINT_MAX_DISPLAYS,
                 DEFAULT_PUNCTUATION_HINT_MAX_DISPLAYS);
     }
 
@@ -108,7 +108,7 @@
                 PreferenceManager.getDefaultSharedPreferences(mContext).edit();
         editor.putLong(PREF_VOICE_INPUT_LAST_TIME_USED, System.currentTimeMillis());
         editor.commit();
-        
+
         mVoiceResultContainedPunctuation = false;
         for (CharSequence s : SPEAKABLE_PUNCTUATION.keySet()) {
             if (text.indexOf(s.toString()) >= 0) {
@@ -117,40 +117,40 @@
             }
         }
     }
-    
+
     private boolean shouldShowSwipeHint() {
         SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mContext);
 
         int numUniqueDaysShown = sp.getInt(PREF_VOICE_HINT_NUM_UNIQUE_DAYS_SHOWN, 0);
-        
+
         // If we've already shown the hint for enough days, we'll return false.
-        if (numUniqueDaysShown < mSwipeHintMaxDaysToShow) {    
+        if (numUniqueDaysShown < mSwipeHintMaxDaysToShow) {
 
             long lastTimeVoiceWasUsed = sp.getLong(PREF_VOICE_INPUT_LAST_TIME_USED, 0);
-            
+
             // If the user has used voice today, we'll return false. (We don't show the hint on
             // any day that the user has already used voice.)
-            if (!isFromToday(lastTimeVoiceWasUsed)) {                
+            if (!isFromToday(lastTimeVoiceWasUsed)) {
                 return true;
             }
         }
-        
+
         return false;
     }
-    
+
     /**
      * Determines whether the provided time is from some time today (i.e., this day, month,
      * and year).
      */
     private boolean isFromToday(long timeInMillis) {
         if (timeInMillis == 0) return false;
-        
+
         Calendar today = Calendar.getInstance();
         today.setTimeInMillis(System.currentTimeMillis());
-        
+
         Calendar timestamp = Calendar.getInstance();
         timestamp.setTimeInMillis(timeInMillis);
-        
+
         return (today.get(Calendar.YEAR) == timestamp.get(Calendar.YEAR) &&
                 today.get(Calendar.DAY_OF_MONTH) == timestamp.get(Calendar.DAY_OF_MONTH) &&
                 today.get(Calendar.MONTH) == timestamp.get(Calendar.MONTH));
@@ -158,7 +158,7 @@
 
     private void showHint(int hintViewResource) {
         SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mContext);
-        
+
         int numUniqueDaysShown = sp.getInt(PREF_VOICE_HINT_NUM_UNIQUE_DAYS_SHOWN, 0);
         long lastTimeHintWasShown = sp.getLong(PREF_VOICE_HINT_LAST_TIME_SHOWN, 0);
 
@@ -176,7 +176,7 @@
             mDisplay.showHint(hintViewResource);
         }
     }
-    
+
     private int getAndIncrementPref(String pref) {
         SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mContext);
         int value = sp.getInt(pref, 0);
diff --git a/src/com/android/inputmethod/latin/LatinIME.java b/src/com/android/inputmethod/latin/LatinIME.java
index 5faac5f..5d9b5e9 100644
--- a/src/com/android/inputmethod/latin/LatinIME.java
+++ b/src/com/android/inputmethod/latin/LatinIME.java
@@ -1,12 +1,12 @@
 /*
  * Copyright (C) 2008-2009 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -60,7 +60,7 @@
 
 import com.android.inputmethod.voice.EditingUtil;
 import com.android.inputmethod.voice.FieldContext;
-import com.android.inputmethod.voice.GoogleSettingsUtil;
+import com.android.inputmethod.voice.SettingsUtil;
 import com.android.inputmethod.voice.VoiceInput;
 
 import java.io.FileDescriptor;
@@ -83,7 +83,7 @@
     static final boolean TRACE = false;
     static final boolean VOICE_INSTALLED = true;
     static final boolean ENABLE_VOICE_BUTTON = true;
-    
+
     private static final String PREF_VIBRATE_ON = "vibrate_on";
     private static final String PREF_SOUND_ON = "sound_on";
     private static final String PREF_AUTO_CAP = "auto_cap";
@@ -95,9 +95,9 @@
     private static final String PREF_VOICE_MAIN = "voice_on_main";
 
     // Whether or not the user has used voice input before (and thus, whether to show the
-    // first-run warning dialog or not). 
+    // first-run warning dialog or not).
     private static final String PREF_HAS_USED_VOICE_INPUT = "has_used_voice_input";
-    
+
     // Whether or not the user has used voice input from an unsupported locale UI before.
     // For example, the user has a Chinese UI but activates voice input.
     private static final String PREF_HAS_USED_VOICE_INPUT_UNSUPPORTED_LOCALE =
@@ -116,12 +116,12 @@
             "en_NZ " +
             "en_SG " +
             "en_ZA ";
-    
+
     // The private IME option used to indicate that no microphone should be shown for a
     // given text field. For instance this is specified by the search dialog when the
     // dialog is already showing a voice search button.
     private static final String IME_OPTION_NO_MICROPHONE = "nm";
-    
+
     public static final String PREF_SELECTED_LANGUAGES = "selected_languages";
     public static final String PREF_INPUT_LANGUAGE = "input_language";
 
@@ -138,7 +138,7 @@
     // If we detect a swipe gesture, and the user types N ms later, cancel the
     // swipe since it was probably a false trigger.
     private static final long MIN_MILLIS_AFTER_SWIPE_TO_WAIT_FOR_TYPING = 500;
-    
+
     // How many continuous deletes at which to start deleting at a higher speed.
     private static final int DELETE_ACCELERATE_AT = 20;
     // Key events coming any faster than this are long-presses.
@@ -150,7 +150,7 @@
     // A word that is frequently typed and get's promoted to the user dictionary, uses this
     // frequency.
     static final int FREQUENCY_FOR_AUTO_ADD = 250;
-    
+
     static final int KEYCODE_ENTER = '\n';
     static final int KEYCODE_SPACE = ' ';
 
@@ -163,18 +163,18 @@
     private CandidateView mCandidateView;
     private Suggest mSuggest;
     private CompletionInfo[] mCompletions;
-    
+
     private AlertDialog mOptionsDialog;
     private AlertDialog mVoiceWarningDialog;
-    
+
     KeyboardSwitcher mKeyboardSwitcher;
-    
+
     private UserDictionary mUserDictionary;
     private ContactsDictionary mContactsDictionary;
     private ExpandableDictionary mAutoDictionary;
 
     private Hints mHints;
-    
+
     Resources mResources;
 
     private String mLocale;
@@ -214,13 +214,13 @@
     private boolean mEnableVoice = true;
     private boolean mVoiceOnPrimary;
     private int     mOrientation;
-    
+
     // Indicates whether the suggestion strip is to be on in landscape
     private boolean mJustAccepted;
     private CharSequence mJustRevertedSeparator;
     private int mDeleteCount;
     private long mLastKeyTime;
-    
+
     private Tutorial mTutorial;
 
     private Vibrator mVibrator;
@@ -420,7 +420,7 @@
         return mCandidateViewContainer;
     }
 
-    @Override 
+    @Override
     public void onStartInputView(EditorInfo attribute, boolean restarting) {
         // In landscape mode, this method gets called without the input view being created.
         if (mInputView == null) {
@@ -445,7 +445,7 @@
                 variation == EditorInfo.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD) {
             mPasswordText = true;
         }
-        
+
         mEnableVoiceButton = shouldShowVoiceButton(makeFieldContext(), attribute);
         final boolean enableVoiceButton = mEnableVoiceButton && mEnableVoice;
 
@@ -565,11 +565,11 @@
     @Override
     public void onFinishInput() {
         super.onFinishInput();
-        
+
         if (mAfterVoiceInput) mVoiceInput.logInputEnded();
-        
+
         mVoiceInput.flushLogs();
-        
+
         if (mInputView != null) {
             mInputView.closing();
         }
@@ -692,7 +692,7 @@
                 setSuggestions(null, false, false, false);
                 return;
             }
-            
+
             List<CharSequence> stringList = new ArrayList<CharSequence>();
             for (int i=0; i<(completions != null ? completions.length : 0); i++) {
                 CompletionInfo ci = completions[i];
@@ -712,7 +712,7 @@
             super.setCandidatesViewShown(shown);
         }
     }
-    
+
     @Override
     public void onComputeInsets(InputMethodService.Insets outInsets) {
         super.onComputeInsets(outInsets);
@@ -720,7 +720,7 @@
             outInsets.contentTopInsets = outInsets.visibleTopInsets;
         }
     }
-    
+
     @Override
     public boolean onKeyDown(int keyCode, KeyEvent event) {
         switch (keyCode) {
@@ -760,7 +760,7 @@
                 }
                 // Enable shift key and DPAD to do selections
                 if (mInputView != null && mInputView.isShown() && mInputView.isShifted()) {
-                    event = new KeyEvent(event.getDownTime(), event.getEventTime(), 
+                    event = new KeyEvent(event.getDownTime(), event.getEventTime(),
                             event.getAction(), event.getKeyCode(), event.getRepeatCount(),
                             event.getDeviceId(), event.getScanCode(),
                             KeyEvent.META_SHIFT_LEFT_ON | KeyEvent.META_SHIFT_ON);
@@ -864,7 +864,7 @@
             updateShiftKeyState(getCurrentInputEditorInfo());
         }
     }
-    
+
     public boolean addWordToDictionary(String word) {
         mUserDictionary.addWord(word, 128);
         return true;
@@ -877,12 +877,12 @@
             return false;
         }
     }
-    
+
     // Implementation of KeyboardViewListener
 
     public void onKey(int primaryCode, int[] keyCodes) {
         long when = SystemClock.uptimeMillis();
-        if (primaryCode != Keyboard.KEYCODE_DELETE || 
+        if (primaryCode != Keyboard.KEYCODE_DELETE ||
                 when > mLastKeyTime + QUICK_PRESS) {
             mDeleteCount = 0;
         }
@@ -937,7 +937,7 @@
             changeKeyboardMode();
         }
     }
-    
+
     public void onText(CharSequence text) {
         InputConnection ic = getCurrentInputConnection();
         if (ic == null) return;
@@ -999,7 +999,7 @@
             mKeyboardSwitcher.toggleShift();
         }
     }
-    
+
     private void handleCharacter(int primaryCode, int[] keyCodes) {
         if (VOICE_INSTALLED && mVoiceInputHighlighted) {
             commitVoiceInput();
@@ -1055,12 +1055,12 @@
         }
         if (mPredicting) {
             // In certain languages where single quote is a separator, it's better
-            // not to auto correct, but accept the typed word. For instance, 
+            // not to auto correct, but accept the typed word. For instance,
             // in Italian dov' should not be expanded to dove' because the elision
             // requires the last vowel to be removed.
-            if (mAutoCorrectOn && primaryCode != '\'' && 
-                    (mJustRevertedSeparator == null 
-                            || mJustRevertedSeparator.length() == 0 
+            if (mAutoCorrectOn && primaryCode != '\'' &&
+                    (mJustRevertedSeparator == null
+                            || mJustRevertedSeparator.length() == 0
                             || mJustRevertedSeparator.charAt(0) != primaryCode)) {
                 pickDefaultSuggestion();
                 pickedDefault = true;
@@ -1070,10 +1070,10 @@
         }
         sendKeyChar((char)primaryCode);
         TextEntryState.typedCharacter((char) primaryCode, true);
-        if (TextEntryState.getState() == TextEntryState.STATE_PUNCTUATION_AFTER_ACCEPTED 
+        if (TextEntryState.getState() == TextEntryState.STATE_PUNCTUATION_AFTER_ACCEPTED
                 && primaryCode != KEYCODE_ENTER) {
             swapPunctuationAndSpace();
-        } else if (isPredictionOn() && primaryCode == ' ') { 
+        } else if (isPredictionOn() && primaryCode == ' ') {
         //else if (TextEntryState.STATE_SPACE_AFTER_ACCEPTED) {
             doubleSpace();
         }
@@ -1101,7 +1101,7 @@
             toggleCapsLock();
         }
     }
-    
+
     private void toggleCapsLock() {
         mCapsLock = !mCapsLock;
         if (mKeyboardSwitcher.isAlphabetMode()) {
@@ -1113,13 +1113,13 @@
         mHandler.removeMessages(MSG_UPDATE_SUGGESTIONS);
         mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_UPDATE_SUGGESTIONS), 100);
     }
-    
+
     private boolean isPredictionOn() {
         boolean predictionOn = mPredictionOn;
         //if (isFullscreenMode()) predictionOn &= mPredictionLandscape;
         return predictionOn;
     }
-    
+
     private boolean isCandidateStripVisible() {
         return isPredictionOn() && mShowSuggestions;
     }
@@ -1159,7 +1159,7 @@
             reallyStartListening(swipe);
         }
     }
-    
+
     private void reallyStartListening(boolean swipe) {
         if (!mHasUsedVoiceInput) {
             // The user has started a voice input, so remember that in the
@@ -1170,7 +1170,7 @@
             editor.commit();
             mHasUsedVoiceInput = true;
         }
-        
+
         if (!mLocaleSupportedForVoiceInput && !mHasUsedVoiceInputUnsupportedLocale) {
             // The user has started a voice input from an unsupported locale, so remember that
             // in the future (so we don't show the warning dialog the next time they do this).
@@ -1180,7 +1180,7 @@
             editor.commit();
             mHasUsedVoiceInputUnsupportedLocale = true;
         }
-        
+
         // Clear N-best suggestions
         setSuggestions(null, false, false, true);
 
@@ -1189,7 +1189,7 @@
         mVoiceInput.startListening(context, swipe);
         switchToRecognitionStatusView();
     }
-    
+
     private void showVoiceWarningDialog(final boolean swipe) {
         AlertDialog.Builder builder = new AlertDialog.Builder(this);
         builder.setCancelable(true);
@@ -1205,7 +1205,7 @@
                 mVoiceInput.logKeyboardWarningDialogCancel();
             }
         });
-        
+
         if (mLocaleSupportedForVoiceInput) {
             String message = getString(R.string.voice_warning_may_not_understand) + "\n\n" +
                     getString(R.string.voice_warning_how_to_turn_off);
@@ -1216,10 +1216,10 @@
                     getString(R.string.voice_warning_how_to_turn_off);
             builder.setMessage(message);
         }
-        
+
         builder.setTitle(R.string.voice_warning_title);
         mVoiceWarningDialog = builder.create();
-        
+
         Window window = mVoiceWarningDialog.getWindow();
         WindowManager.LayoutParams lp = window.getAttributes();
         lp.token = mInputView.getWindowToken();
@@ -1391,11 +1391,11 @@
         // Fool the state watcher so that a subsequent backspace will not do a revert
         TextEntryState.typedCharacter((char) KEYCODE_SPACE, true);
     }
-    
+
     private void pickSuggestion(CharSequence suggestion) {
         if (mCapsLock) {
             suggestion = suggestion.toString().toUpperCase();
-        } else if (preferCapitalization() 
+        } else if (preferCapitalization()
                 || (mKeyboardSwitcher.isAlphabetMode() && mInputView.isShifted())) {
             suggestion = suggestion.toString().toUpperCase().charAt(0)
                     + suggestion.subSequence(1, suggestion.length()).toString();
@@ -1428,13 +1428,13 @@
                 && !isWordSeparator(toLeft.charAt(0))) {
             return true;
         }
-        if (!TextUtils.isEmpty(toRight) 
+        if (!TextUtils.isEmpty(toRight)
                 && !isWordSeparator(toRight.charAt(0))) {
             return true;
         }
         return false;
     }
-    
+
     public void revertLastWord(boolean deleteChar) {
         final int length = mComposing.length();
         if (!mPredicting && length > 0) {
@@ -1445,7 +1445,7 @@
             if (deleteChar) ic.deleteSurroundingText(1, 0);
             int toDelete = mCommittedLength;
             CharSequence toTheLeft = ic.getTextBeforeCursor(mCommittedLength, 0);
-            if (toTheLeft != null && toTheLeft.length() > 0 
+            if (toTheLeft != null && toTheLeft.length() > 0
                     && isWordSeparator(toTheLeft.charAt(0))) {
                 toDelete--;
             }
@@ -1463,7 +1463,7 @@
     protected String getWordSeparators() {
         return mWordSeparators;
     }
-    
+
     public boolean isWordSeparator(int code) {
         String separators = getWordSeparators();
         return separators.contains(String.valueOf((char)code));
@@ -1542,11 +1542,11 @@
     public void onRelease(int primaryCode) {
         //vibrate();
     }
-    
+
     private FieldContext makeFieldContext() {
         return new FieldContext(getCurrentInputConnection(), getCurrentInputEditorInfo());
     }
-    
+
     private boolean fieldCanDoVoice(FieldContext fieldContext) {
         return !mPasswordText
                 && mVoiceInput != null
@@ -1564,7 +1564,7 @@
                 && !(attribute != null && attribute.privateImeOptions != null
                         && attribute.privateImeOptions.equals(IME_OPTION_NO_MICROPHONE));
     }
-    
+
     // receive ringer mode changes to detect silent mode
     private BroadcastReceiver mReceiver = new BroadcastReceiver() {
         @Override
@@ -1652,7 +1652,7 @@
             }
         }
     }
-    
+
     private void startTutorial() {
         mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_START_TUTORIAL), 500);
     }
@@ -1700,21 +1700,21 @@
         mHasUsedVoiceInput = sp.getBoolean(PREF_HAS_USED_VOICE_INPUT, false);
         mHasUsedVoiceInputUnsupportedLocale =
                 sp.getBoolean(PREF_HAS_USED_VOICE_INPUT_UNSUPPORTED_LOCALE, false);
-        
+
         // Get the current list of supported locales and check the current locale against that
         // list. We cache this value so as not to check it every time the user starts a voice
         // input. Because this method is called by onStartInputView, this should mean that as
         // long as the locale doesn't change while the user is keeping the IME open, the
         // value should never be stale.
-        String supportedLocalesString = GoogleSettingsUtil.getGservicesString(
+        String supportedLocalesString = SettingsUtil.getSettingsString(
                 getContentResolver(),
-                GoogleSettingsUtil.LATIN_IME_VOICE_INPUT_SUPPORTED_LOCALES,
+                SettingsUtil.LATIN_IME_VOICE_INPUT_SUPPORTED_LOCALES,
                 DEFAULT_VOICE_INPUT_SUPPORTED_LOCALES);
         ArrayList<String> voiceInputSupportedLocales =
                 Lists.newArrayList(supportedLocalesString.split("\\s+"));
-        
+
         mLocaleSupportedForVoiceInput = voiceInputSupportedLocales.contains(mLocale);
-        
+
         // If there is no auto text data, then quickfix is forced to "on", so that the other options
         // will continue to work
 
@@ -1809,7 +1809,7 @@
 
     @Override protected void dump(FileDescriptor fd, PrintWriter fout, String[] args) {
         super.dump(fd, fout, args);
-        
+
         final Printer p = new PrintWriterPrinter(fout);
         p.println("LatinIME state :");
         p.println("  Keyboard mode = " + mKeyboardSwitcher.getKeyboardMode());
@@ -1827,14 +1827,14 @@
     }
 
     // Characters per second measurement
-    
+
     private static final boolean PERF_DEBUG = false;
     private long mLastCpsTime;
     private static final int CPS_BUFFER_SIZE = 16;
     private long[] mCpsIntervals = new long[CPS_BUFFER_SIZE];
     private int mCpsIndex;
     private boolean mInputTypeNoAutoCorrect;
-    
+
     private void measureCps() {
         if (!LatinIME.PERF_DEBUG) return;
         long now = System.currentTimeMillis();
diff --git a/src/com/android/inputmethod/latin/LatinIMESettings.java b/src/com/android/inputmethod/latin/LatinIMESettings.java
index 97833e0..98a0af9 100644
--- a/src/com/android/inputmethod/latin/LatinIMESettings.java
+++ b/src/com/android/inputmethod/latin/LatinIMESettings.java
@@ -1,12 +1,12 @@
 /*
  * Copyright (C) 2008-2009 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -33,7 +33,7 @@
 
 import com.google.android.collect.Lists;
 
-import com.android.inputmethod.voice.GoogleSettingsUtil;
+import com.android.inputmethod.voice.SettingsUtil;
 import com.android.inputmethod.voice.VoiceInputLogger;
 
 import java.util.ArrayList;
@@ -49,20 +49,20 @@
     private static final String PREDICTION_SETTINGS_KEY = "prediction_settings";
     private static final String VOICE_SETTINGS_KEY = "enable_voice_input";
     private static final String VOICE_SERVER_KEY = "voice_server_url";
-    
+
     private static final String TAG = "LatinIMESettings";
-    
+
     // Dialog ids
     private static final int VOICE_INPUT_CONFIRM_DIALOG = 0;
-    
+
     private CheckBoxPreference mQuickFixes;
     private CheckBoxPreference mShowSuggestions;
     private CheckBoxPreference mVoicePreference;
-    
+
     private VoiceInputLogger mLogger;
-    
+
     private boolean mOkClicked = false;
-    
+
     @Override
     protected void onCreate(Bundle icicle) {
         super.onCreate(icicle);
@@ -70,14 +70,14 @@
         mQuickFixes = (CheckBoxPreference) findPreference(QUICK_FIXES_KEY);
         mShowSuggestions = (CheckBoxPreference) findPreference(SHOW_SUGGESTIONS_KEY);
         mVoicePreference = (CheckBoxPreference) findPreference(VOICE_SETTINGS_KEY);
-        
+
         SharedPreferences prefs = getPreferenceManager().getSharedPreferences();
         prefs.registerOnSharedPreferenceChangeListener(this);
-        
+
         mVoicePreference.setOnPreferenceClickListener(this);
         mVoicePreference.setChecked(prefs.getBoolean(
                 VOICE_SETTINGS_KEY, getResources().getBoolean(R.bool.voice_input_default)));
-        
+
         mLogger = VoiceInputLogger.getLogger(this);
     }
 
@@ -95,7 +95,7 @@
                 || !RecognitionManager.isRecognitionAvailable(this)) {
             getPreferenceScreen().removePreference(mVoicePreference);
         }
-        
+
         mVoicePreference.setChecked(
                 getPreferenceManager().getSharedPreferences().getBoolean(VOICE_SETTINGS_KEY, true));
     }
@@ -123,7 +123,7 @@
         }
         return false;
     }
-    
+
     @Override
     protected Dialog onCreateDialog(int id) {
         switch (id) {
@@ -144,13 +144,13 @@
                         .setTitle(R.string.voice_warning_title)
                         .setPositiveButton(android.R.string.ok, listener)
                         .setNegativeButton(android.R.string.cancel, listener);
-                
+
                 // Get the current list of supported locales and check the current locale against
                 // that list, to decide whether to put a warning that voice input will not work in
                 // the current language as part of the pop-up confirmation dialog.
-                String supportedLocalesString = GoogleSettingsUtil.getGservicesString(
+                String supportedLocalesString = SettingsUtil.getSettingsString(
                         getContentResolver(),
-                        GoogleSettingsUtil.LATIN_IME_VOICE_INPUT_SUPPORTED_LOCALES,
+                        SettingsUtil.LATIN_IME_VOICE_INPUT_SUPPORTED_LOCALES,
                         LatinIME.DEFAULT_VOICE_INPUT_SUPPORTED_LOCALES);
                 ArrayList<String> voiceInputSupportedLocales =
                         Lists.newArrayList(supportedLocalesString.split("\\s+"));
@@ -167,7 +167,7 @@
                             getString(R.string.voice_hint_dialog_message);
                     builder.setMessage(message);
                 }
-                
+
                 AlertDialog dialog = builder.create();
                 dialog.setOnDismissListener(this);
                 mLogger.settingsWarningDialogShown();
@@ -177,7 +177,7 @@
                 return null;
         }
     }
-    
+
     public void onDismiss(DialogInterface dialog) {
         mLogger.settingsWarningDialogDismissed();
         if (!mOkClicked) {
@@ -186,7 +186,7 @@
             mVoicePreference.setChecked(false);
         }
     }
-        
+
     private void updateVoicePreference() {
         SharedPreferences.Editor editor = getPreferenceManager().getSharedPreferences().edit();
         boolean isChecked = mVoicePreference.isChecked();
diff --git a/src/com/android/inputmethod/voice/GoogleSettingsUtil.java b/src/com/android/inputmethod/voice/GoogleSettingsUtil.java
deleted file mode 100644
index d238579..0000000
--- a/src/com/android/inputmethod/voice/GoogleSettingsUtil.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * Copyright (C) 2009 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.android.inputmethod.voice;
-
-import android.content.ContentResolver;
-import android.database.Cursor;
-import android.net.Uri;
-import android.util.Log;
-
-/**
- * Utility for getting Google-specific settings from GoogleSettings.Partner or
- * Gservices. Retrieving such settings may fail on a non-Google Experience
- * Device (GED)
- */
-public class GoogleSettingsUtil {
-    /**
-     * A whitespace-separated list of supported locales for voice input from the keyboard.
-     */
-    public static final String LATIN_IME_VOICE_INPUT_SUPPORTED_LOCALES =
-            "latin_ime_voice_input_supported_locales";
-    
-    /**
-     * A whitespace-separated list of recommended app packages for voice input from the
-     * keyboard.
-     */
-    public static final String LATIN_IME_VOICE_INPUT_RECOMMENDED_PACKAGES =
-            "latin_ime_voice_input_recommended_packages";
-
-    /**
-     * The maximum number of unique days to show the swipe hint for voice input.
-     */
-    public static final String LATIN_IME_VOICE_INPUT_SWIPE_HINT_MAX_DAYS =
-            "latin_ime_voice_input_swipe_hint_max_days";
-    
-    /**
-     * The maximum number of times to show the punctuation hint for voice input.
-     */
-    public static final String LATIN_IME_VOICE_INPUT_PUNCTUATION_HINT_MAX_DISPLAYS =
-            "latin_ime_voice_input_punctuation_hint_max_displays";
-
-    /**
-     * Endpointer parameters for voice input from the keyboard.
-     */
-    public static final String LATIN_IME_SPEECH_MINIMUM_LENGTH_MILLIS =
-            "latin_ime_speech_minimum_length_millis";
-    public static final String LATIN_IME_SPEECH_INPUT_COMPLETE_SILENCE_LENGTH_MILLIS =
-            "latin_ime_speech_input_complete_silence_length_millis";
-    public static final String LATIN_IME_SPEECH_INPUT_POSSIBLY_COMPLETE_SILENCE_LENGTH_MILLIS =
-            "latin_ime_speech_input_possibly_complete_silence_length_millis";    
-
-    /**
-     * Min and max volume levels that can be displayed on the "speak now" screen.
-     */
-    public static final String LATIN_IME_MIN_MICROPHONE_LEVEL =
-            "latin_ime_min_microphone_level";
-    public static final String LATIN_IME_MAX_MICROPHONE_LEVEL =
-            "latin_ime_max_microphone_level";
-
-    /**
-     * The number of sentence-level alternates to request of the server.
-     */
-    public static final String LATIN_IME_MAX_VOICE_RESULTS = "latin_ime_max_voice_results";
-
-    /**
-     * Uri to use to access gservices settings
-     */
-    private static final Uri GSERVICES_URI = Uri.parse("content://settings/gservices");
-
-    private static final String TAG = GoogleSettingsUtil.class.getSimpleName();
-
-    private static final boolean DBG = false;
-
-    /**
-     * Safely query for a Gservices string setting, which may not be available if this
-     * is not a Google Experience Device.
-     * 
-     * @param cr The content resolver to use
-     * @param key The setting to look up
-     * @param defaultValue The default value to use if none can be found
-     * @return The value of the setting, or defaultValue if it couldn't be found
-     */
-    public static String getGservicesString(ContentResolver cr, String key, String defaultValue) {
-        return getSettingString(GSERVICES_URI, cr, key, defaultValue);
-    }
-    
-    /**
-     * Safely query for a Gservices int setting, which may not be available if this
-     * is not a Google Experience Device.
-     * 
-     * @param cr The content resolver to use
-     * @param key The setting to look up
-     * @param defaultValue The default value to use if the setting couldn't be found or parsed
-     * @return The value of the setting, or defaultValue if it couldn't be found or parsed
-     */
-    public static int getGservicesInt(ContentResolver cr, String key, int defaultValue) {
-        try {
-            return Integer.parseInt(getGservicesString(cr, key, String.valueOf(defaultValue)));
-        } catch (NumberFormatException e) {
-            return defaultValue;
-        }
-    }
-
-    /**
-     * Safely query for a Gservices float setting, which may not be available if this
-     * is not a Google Experience Device.
-     * 
-     * @param cr The content resolver to use
-     * @param key The setting to look up
-     * @param defaultValue The default value to use if the setting couldn't be found or parsed
-     * @return The value of the setting, or defaultValue if it couldn't be found or parsed
-     */
-    public static float getGservicesFloat(ContentResolver cr, String key, float defaultValue) {
-        try {
-            return Float.parseFloat(getGservicesString(cr, key, String.valueOf(defaultValue)));
-        } catch (NumberFormatException e) {
-            return defaultValue;
-        }
-    }
-
-    /**
-     * A safe way to query for a setting on both Google Experience and
-     * non-Google Experience devices, (code adapted from maps application
-     * examples)
-     * 
-     * @param uri The uri to provide to the content resolver
-     * @param cr The content resolver to use
-     * @param key The setting to look up
-     * @param defaultValue The default value to use if none can be found
-     * @return The value of the setting, or defaultValue if it couldn't be found
-     */
-    private static String getSettingString(Uri uri, ContentResolver cr, String key,
-            String defaultValue) {
-        String value = null;
-
-        Cursor cursor = null;
-        try {
-            cursor = cr.query(uri, new String[] {
-                "value"
-            }, "name='" + key + "'", null, null);
-            if ((cursor != null) && cursor.moveToFirst()) {
-                value = cursor.getString(cursor.getColumnIndexOrThrow("value"));
-            }
-        } catch (Throwable t) {
-            // This happens because we're probably running a non Type 1 aka
-            // Google Experience device which doesn't have the Google libraries.
-            if (DBG) {
-                Log.d(TAG, "Error getting setting from " + uri + " for key " + key + ": " + t);
-            }
-        } finally {
-            if (cursor != null) {
-                cursor.close();
-            }
-        }
-
-        if (DBG && value == null) {
-            Log.i(TAG, "no setting found from " + uri + " for key " + key + ", returning default");
-        }
-        
-        return (value != null) ? value : defaultValue;
-    }
-}
diff --git a/src/com/android/inputmethod/voice/RecognitionView.java b/src/com/android/inputmethod/voice/RecognitionView.java
index 97acb11..fd3d6d0 100644
--- a/src/com/android/inputmethod/voice/RecognitionView.java
+++ b/src/com/android/inputmethod/voice/RecognitionView.java
@@ -1,12 +1,12 @@
 /*
  * Copyright (C) 2009 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -36,7 +36,7 @@
 import android.widget.TextView;
 
 import com.android.inputmethod.latin.R;
-import com.android.inputmethod.voice.GoogleSettingsUtil;
+import com.android.inputmethod.voice.SettingsUtil;
 
 import java.io.ByteArrayOutputStream;
 import java.nio.ByteBuffer;
@@ -112,10 +112,10 @@
         mView = inflater.inflate(R.layout.recognition_status, null);
 
         ContentResolver cr = context.getContentResolver();
-        mMinMicrophoneLevel = GoogleSettingsUtil.getGservicesFloat(
-                cr, GoogleSettingsUtil.LATIN_IME_MIN_MICROPHONE_LEVEL, 15.f);
-        mMaxMicrophoneLevel = GoogleSettingsUtil.getGservicesFloat(
-                cr, GoogleSettingsUtil.LATIN_IME_MAX_MICROPHONE_LEVEL, 30.f);
+        mMinMicrophoneLevel = SettingsUtil.getSettingsFloat(
+                cr, SettingsUtil.LATIN_IME_MIN_MICROPHONE_LEVEL, 15.f);
+        mMaxMicrophoneLevel = SettingsUtil.getSettingsFloat(
+                cr, SettingsUtil.LATIN_IME_MAX_MICROPHONE_LEVEL, 30.f);
 
         // Pre-load volume level images
         Resources r = context.getResources();
@@ -131,7 +131,7 @@
 
         mInitializing = r.getDrawable(R.drawable.mic_slash);
         mError = r.getDrawable(R.drawable.caution);
- 
+
         mImage = (ImageView) mView.findViewById(R.id.image);
         mButton = mView.findViewById(R.id.button);
         mButton.setOnClickListener(clickListener);
@@ -207,12 +207,12 @@
               final ShortBuffer buf = ByteBuffer.wrap(waveBuffer.toByteArray())
                       .order(ByteOrder.nativeOrder()).asShortBuffer();
               buf.position(0);
-              waveBuffer.reset(); 
+              waveBuffer.reset();
               showWave(buf, speechStartPosition / 2, speechEndPosition / 2);
             }
           });
     }
-    
+
     /**
      * @return an average abs of the specified buffer.
      */
@@ -295,15 +295,15 @@
         MarginLayoutParams mProgressParams = (MarginLayoutParams)mProgress.getLayoutParams();
         mProgressParams.topMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
                 -h / 2 - 18, mContext.getResources().getDisplayMetrics());
-                
+
         // Tweak the padding manually to fill out the whole view horizontally.
         // TODO: Do this in the xml layout instead.
-        ((View) mImage.getParent()).setPadding(4, ((View) mImage.getParent()).getPaddingTop(), 3, 
+        ((View) mImage.getParent()).setPadding(4, ((View) mImage.getParent()).getPaddingTop(), 3,
                 ((View) mImage.getParent()).getPaddingBottom());
-        mProgress.setLayoutParams(mProgressParams);       
+        mProgress.setLayoutParams(mProgressParams);
     }
 
-    
+
     public void finish() {
         mState = State.READY;
         mUiHandler.post(new Runnable() {
diff --git a/src/com/android/inputmethod/voice/SettingsUtil.java b/src/com/android/inputmethod/voice/SettingsUtil.java
new file mode 100644
index 0000000..abf5204
--- /dev/null
+++ b/src/com/android/inputmethod/voice/SettingsUtil.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2009 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.android.inputmethod.voice;
+
+import android.content.ContentResolver;
+import android.database.Cursor;
+import android.net.Uri;
+import android.provider.Settings;
+import android.util.Log;
+
+/**
+ * Utility for retrieving settings from Settings.Secure.
+ */
+public class SettingsUtil {
+    /**
+     * A whitespace-separated list of supported locales for voice input from the keyboard.
+     */
+    public static final String LATIN_IME_VOICE_INPUT_SUPPORTED_LOCALES =
+            "latin_ime_voice_input_supported_locales";
+
+    /**
+     * A whitespace-separated list of recommended app packages for voice input from the
+     * keyboard.
+     */
+    public static final String LATIN_IME_VOICE_INPUT_RECOMMENDED_PACKAGES =
+            "latin_ime_voice_input_recommended_packages";
+
+    /**
+     * The maximum number of unique days to show the swipe hint for voice input.
+     */
+    public static final String LATIN_IME_VOICE_INPUT_SWIPE_HINT_MAX_DAYS =
+            "latin_ime_voice_input_swipe_hint_max_days";
+
+    /**
+     * The maximum number of times to show the punctuation hint for voice input.
+     */
+    public static final String LATIN_IME_VOICE_INPUT_PUNCTUATION_HINT_MAX_DISPLAYS =
+            "latin_ime_voice_input_punctuation_hint_max_displays";
+
+    /**
+     * Endpointer parameters for voice input from the keyboard.
+     */
+    public static final String LATIN_IME_SPEECH_MINIMUM_LENGTH_MILLIS =
+            "latin_ime_speech_minimum_length_millis";
+    public static final String LATIN_IME_SPEECH_INPUT_COMPLETE_SILENCE_LENGTH_MILLIS =
+            "latin_ime_speech_input_complete_silence_length_millis";
+    public static final String LATIN_IME_SPEECH_INPUT_POSSIBLY_COMPLETE_SILENCE_LENGTH_MILLIS =
+            "latin_ime_speech_input_possibly_complete_silence_length_millis";
+
+    /**
+     * Min and max volume levels that can be displayed on the "speak now" screen.
+     */
+    public static final String LATIN_IME_MIN_MICROPHONE_LEVEL =
+            "latin_ime_min_microphone_level";
+    public static final String LATIN_IME_MAX_MICROPHONE_LEVEL =
+            "latin_ime_max_microphone_level";
+
+    /**
+     * The number of sentence-level alternates to request of the server.
+     */
+    public static final String LATIN_IME_MAX_VOICE_RESULTS = "latin_ime_max_voice_results";
+
+    /**
+     * Get a string-valued setting.
+     *
+     * @param cr The content resolver to use
+     * @param key The setting to look up
+     * @param defaultValue The default value to use if none can be found
+     * @return The value of the setting, or defaultValue if it couldn't be found
+     */
+    public static String getSettingsString(ContentResolver cr, String key, String defaultValue) {
+        String result = Settings.Secure.getString(cr, key);
+        return (result == null) ? defaultValue : result;
+    }
+
+    /**
+     * Get an int-valued setting.
+     *
+     * @param cr The content resolver to use
+     * @param key The setting to look up
+     * @param defaultValue The default value to use if the setting couldn't be found or parsed
+     * @return The value of the setting, or defaultValue if it couldn't be found or parsed
+     */
+    public static int getSettingsInt(ContentResolver cr, String key, int defaultValue) {
+        return Settings.Secure.getInt(cr, key, defaultValue);
+    }
+
+    /**
+     * Get a float-valued setting.
+     *
+     * @param cr The content resolver to use
+     * @param key The setting to look up
+     * @param defaultValue The default value to use if the setting couldn't be found or parsed
+     * @return The value of the setting, or defaultValue if it couldn't be found or parsed
+     */
+    public static float getSettingsFloat(ContentResolver cr, String key, float defaultValue) {
+        return Settings.Secure.getFloat(cr, key, defaultValue);
+    }
+}
diff --git a/src/com/android/inputmethod/voice/VoiceInput.java b/src/com/android/inputmethod/voice/VoiceInput.java
index c39992a..a468b33 100644
--- a/src/com/android/inputmethod/voice/VoiceInput.java
+++ b/src/com/android/inputmethod/voice/VoiceInput.java
@@ -1,12 +1,12 @@
 /*
  * Copyright (C) 2009 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -81,13 +81,13 @@
             "android.speech.extras.SPEECH_INPUT_COMPLETE_SILENCE_LENGTH_MILLIS";
     private static final String EXTRA_SPEECH_INPUT_POSSIBLY_COMPLETE_SILENCE_LENGTH_MILLIS =
             "android.speech.extras.SPEECH_INPUT_POSSIBLY_COMPLETE_SILENCE_LENGTH_MILLIS";
-    
+
     // The usual endpointer default value for input complete silence length is 0.5 seconds,
     // but that's used for things like voice search. For dictation-like voice input like this,
     // we go with a more liberal value of 1 second. This value will only be used if a value
     // is not provided from Gservices.
     private static final String INPUT_COMPLETE_SILENCE_LENGTH_DEFAULT_VALUE_MILLIS = "1000";
-    
+
     // Used to record part of that state for logging purposes.
     public static final int DEFAULT = 0;
     public static final int LISTENING = 1;
@@ -145,11 +145,11 @@
         mContext = context;
         newView();
 
-        String recommendedPackages = GoogleSettingsUtil.getGservicesString(
+        String recommendedPackages = SettingsUtil.getSettingsString(
                 context.getContentResolver(),
-                GoogleSettingsUtil.LATIN_IME_VOICE_INPUT_RECOMMENDED_PACKAGES,
+                SettingsUtil.LATIN_IME_VOICE_INPUT_RECOMMENDED_PACKAGES,
                 DEFAULT_RECOMMENDED_PACKAGES);
-        
+
         mRecommendedList = new Whitelist();
         for (String recommendedPackage : recommendedPackages.split("\\s+")) {
             mRecommendedList.addApp(recommendedPackage);
@@ -167,10 +167,10 @@
     public boolean isBlacklistedField(FieldContext context) {
         return mBlacklist.matches(context);
     }
-    
+
     /**
      * Used to decide whether to show voice input hints for this field, etc.
-     * 
+     *
      * @return true if field is recommended for voice
      */
     public boolean isRecommendedField(FieldContext context) {
@@ -190,7 +190,7 @@
 
         Locale locale = Locale.getDefault();
         String localeString = locale.getLanguage() + "-" + locale.getCountry();
-        
+
         mLogger.start(localeString, swipe);
 
         mState = LISTENING;
@@ -215,9 +215,9 @@
         intent.putExtra(EXTRA_RECOGNITION_CONTEXT, context.getBundle());
         intent.putExtra(EXTRA_CALLING_PACKAGE, "VoiceIME");
         intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS,
-                GoogleSettingsUtil.getGservicesInt(
+                SettingsUtil.getSettingsInt(
                         mContext.getContentResolver(),
-                        GoogleSettingsUtil.LATIN_IME_MAX_VOICE_RESULTS,
+                        SettingsUtil.LATIN_IME_MAX_VOICE_RESULTS,
                         1));
 
         // Get endpointer params from Gservices.
@@ -226,27 +226,27 @@
         putEndpointerExtra(
                 cr,
                 intent,
-                GoogleSettingsUtil.LATIN_IME_SPEECH_MINIMUM_LENGTH_MILLIS,
+                SettingsUtil.LATIN_IME_SPEECH_MINIMUM_LENGTH_MILLIS,
                 EXTRA_SPEECH_MINIMUM_LENGTH_MILLIS,
                 null  /* rely on endpointer default */);
         putEndpointerExtra(
                 cr,
                 intent,
-                GoogleSettingsUtil.LATIN_IME_SPEECH_INPUT_COMPLETE_SILENCE_LENGTH_MILLIS,
+                SettingsUtil.LATIN_IME_SPEECH_INPUT_COMPLETE_SILENCE_LENGTH_MILLIS,
                 EXTRA_SPEECH_INPUT_COMPLETE_SILENCE_LENGTH_MILLIS,
                 INPUT_COMPLETE_SILENCE_LENGTH_DEFAULT_VALUE_MILLIS
                 /* our default value is different from the endpointer's */);
         putEndpointerExtra(
                 cr,
                 intent,
-                GoogleSettingsUtil.
+                SettingsUtil.
                         LATIN_IME_SPEECH_INPUT_POSSIBLY_COMPLETE_SILENCE_LENGTH_MILLIS,
                 EXTRA_SPEECH_INPUT_POSSIBLY_COMPLETE_SILENCE_LENGTH_MILLIS,
                 null  /* rely on endpointer default */);
 
         mRecognitionManager.startListening(intent);
     }
-    
+
     /**
      * Gets the value of the provided Gservices key, attempts to parse it into a long,
      * and if successful, puts the long value as an extra in the provided intent.
@@ -254,15 +254,15 @@
     private void putEndpointerExtra(ContentResolver cr, Intent i,
             String gservicesKey, String intentExtraKey, String defaultValue) {
         long l = -1;
-        String s = GoogleSettingsUtil.getGservicesString(cr, gservicesKey, defaultValue);
+        String s = SettingsUtil.getSettingsString(cr, gservicesKey, defaultValue);
         if (s != null) {
             try {
                 l = Long.valueOf(s);
             } catch (NumberFormatException e) {
                 Log.e(TAG, "could not parse value for " + gservicesKey + ": " + s);
-            }          
+            }
         }
-        
+
         if (l != -1) i.putExtra(intentExtraKey, l);
     }
 
@@ -302,35 +302,35 @@
     public void logTextModified() {
         mLogger.textModified();
     }
-    
+
     public void logKeyboardWarningDialogShown() {
         mLogger.keyboardWarningDialogShown();
     }
-    
+
     public void logKeyboardWarningDialogDismissed() {
         mLogger.keyboardWarningDialogDismissed();
     }
-    
+
     public void logKeyboardWarningDialogOk() {
         mLogger.keyboardWarningDialogOk();
     }
-    
+
     public void logKeyboardWarningDialogCancel() {
         mLogger.keyboardWarningDialogCancel();
     }
-    
+
     public void logSwipeHintDisplayed() {
         mLogger.swipeHintDisplayed();
     }
-    
+
     public void logPunctuationHintDisplayed() {
         mLogger.punctuationHintDisplayed();
     }
-    
+
     public void logVoiceInputDelivered() {
         mLogger.voiceInputDelivered();
     }
-    
+
     public void logNBestChoose(int index) {
         mLogger.nBestChoose(index);
     }
@@ -338,11 +338,11 @@
     public void logInputEnded() {
         mLogger.inputEnded();
     }
-    
+
     public void flushLogs() {
         mLogger.flush();
     }
-    
+
     private static Intent makeIntent() {
         Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
 
