Loading java/AndroidManifest.xml +0 −1 Original line number Diff line number Diff line Loading @@ -5,7 +5,6 @@ <uses-permission android:name="android.permission.VIBRATE"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.READ_USER_DICTIONARY" /> <uses-permission android:name="android.permission.WRITE_USER_DICTIONARY" /> <uses-permission android:name="android.permission.READ_CONTACTS" /> <application android:label="@string/english_ime_name" Loading java/src/com/android/inputmethod/latin/SuggestionsView.java +1 −27 Original line number Diff line number Diff line Loading @@ -672,34 +672,8 @@ public class SuggestionsView extends RelativeLayout implements OnClickListener, mPreviewPopup.dismiss(); } private void showPreview(View view, CharSequence word) { if (TextUtils.isEmpty(word)) return; final TextView previewText = mPreviewText; previewText.setTextColor(mParams.mColorTypedWord); previewText.setText(word); previewText.measure( ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); final int[] offsetInWindow = new int[2]; view.getLocationInWindow(offsetInWindow); final int posX = offsetInWindow[0]; final int posY = offsetInWindow[1] - previewText.getMeasuredHeight(); final PopupWindow previewPopup = mPreviewPopup; if (previewPopup.isShowing()) { previewPopup.update(posX, posY, previewPopup.getWidth(), previewPopup.getHeight()); } else { previewPopup.showAtLocation(this, Gravity.NO_GRAVITY, posX, posY); } previewText.setVisibility(VISIBLE); mHandler.postHidePreview(); } private void addToDictionary(CharSequence word) { if (mListener.addWordToDictionary(word.toString())) { final CharSequence message = getContext().getString(R.string.added_word, word); showPreview(mParams.mWordToSaveView, message); } mListener.addWordToDictionary(word.toString()); } private final KeyboardActionListener mMoreSuggestionsListener = Loading java/src/com/android/inputmethod/latin/UserDictionary.java +12 −48 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import android.content.ContentProviderClient; import android.content.ContentResolver; import android.content.ContentValues; import android.content.Context; import android.content.Intent; import android.database.ContentObserver; import android.database.Cursor; import android.net.Uri; Loading @@ -38,11 +39,9 @@ public class UserDictionary extends ExpandableDictionary { Words.FREQUENCY, }; private static final String[] PROJECTION_ADD = { Words._ID, Words.FREQUENCY, Words.LOCALE, }; // This is not exported by the framework so we pretty much have to write it here verbatim private static final String ACTION_USER_DICTIONARY_INSERT = "com.android.settings.USER_DICTIONARY_INSERT"; private ContentObserver mObserver; final private String mLocale; Loading Loading @@ -164,54 +163,19 @@ public class UserDictionary extends ExpandableDictionary { public synchronized void addWord(final String word, final int frequency) { // Force load the dictionary here synchronously if (getRequiresReload()) loadDictionaryAsync(); // TODO: do something for the UI. With the following, any sufficiently long word will // look like it will go to the user dictionary but it won't. // Safeguard against adding long words. Can cause stack overflow. if (word.length() >= getMaxWordLength()) return; super.addWord(word, frequency); // Update the user dictionary provider final ContentValues values = new ContentValues(5); values.put(Words.WORD, word); values.put(Words.FREQUENCY, frequency); values.put(Words.LOCALE, mLocale); values.put(Words.APP_ID, 0); final ContentResolver contentResolver = getContext().getContentResolver(); final ContentProviderClient client = contentResolver.acquireContentProviderClient(Words.CONTENT_URI); if (null == client) return; new Thread("addWord") { @Override public void run() { Cursor cursor = null; try { cursor = client.query(Words.CONTENT_URI, PROJECTION_ADD, "word=? and ((locale IS NULL) or (locale=?))", new String[] { word, mLocale }, null); if (cursor != null && cursor.moveToFirst()) { final String locale = cursor.getString(cursor.getColumnIndex(Words.LOCALE)); // If locale is null, we will not override the entry. if (locale != null && locale.equals(mLocale.toString())) { final long id = cursor.getLong(cursor.getColumnIndex(Words._ID)); final Uri uri = Uri.withAppendedPath(Words.CONTENT_URI, Long.toString(id)); // Update the entry with new frequency value. client.update(uri, values, null, null); } } else { // Insert new entry. client.insert(Words.CONTENT_URI, values); } } catch (RemoteException e) { // If we come here, the activity is already about to be killed, and we // have no means of contacting the content provider any more. // See ContentResolver#insert, inside the catch(){} } finally { if (null != cursor) cursor.close(); client.release(); } } }.start(); // TODO: Add an argument to the intent to specify the frequency. Intent intent = new Intent(ACTION_USER_DICTIONARY_INSERT); intent.putExtra(Words.WORD, word); intent.putExtra(Words.LOCALE, mLocale); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); getContext().startActivity(intent); // In case the above does a synchronous callback of the change observer setRequiresReload(false); Loading Loading
java/AndroidManifest.xml +0 −1 Original line number Diff line number Diff line Loading @@ -5,7 +5,6 @@ <uses-permission android:name="android.permission.VIBRATE"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.READ_USER_DICTIONARY" /> <uses-permission android:name="android.permission.WRITE_USER_DICTIONARY" /> <uses-permission android:name="android.permission.READ_CONTACTS" /> <application android:label="@string/english_ime_name" Loading
java/src/com/android/inputmethod/latin/SuggestionsView.java +1 −27 Original line number Diff line number Diff line Loading @@ -672,34 +672,8 @@ public class SuggestionsView extends RelativeLayout implements OnClickListener, mPreviewPopup.dismiss(); } private void showPreview(View view, CharSequence word) { if (TextUtils.isEmpty(word)) return; final TextView previewText = mPreviewText; previewText.setTextColor(mParams.mColorTypedWord); previewText.setText(word); previewText.measure( ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); final int[] offsetInWindow = new int[2]; view.getLocationInWindow(offsetInWindow); final int posX = offsetInWindow[0]; final int posY = offsetInWindow[1] - previewText.getMeasuredHeight(); final PopupWindow previewPopup = mPreviewPopup; if (previewPopup.isShowing()) { previewPopup.update(posX, posY, previewPopup.getWidth(), previewPopup.getHeight()); } else { previewPopup.showAtLocation(this, Gravity.NO_GRAVITY, posX, posY); } previewText.setVisibility(VISIBLE); mHandler.postHidePreview(); } private void addToDictionary(CharSequence word) { if (mListener.addWordToDictionary(word.toString())) { final CharSequence message = getContext().getString(R.string.added_word, word); showPreview(mParams.mWordToSaveView, message); } mListener.addWordToDictionary(word.toString()); } private final KeyboardActionListener mMoreSuggestionsListener = Loading
java/src/com/android/inputmethod/latin/UserDictionary.java +12 −48 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import android.content.ContentProviderClient; import android.content.ContentResolver; import android.content.ContentValues; import android.content.Context; import android.content.Intent; import android.database.ContentObserver; import android.database.Cursor; import android.net.Uri; Loading @@ -38,11 +39,9 @@ public class UserDictionary extends ExpandableDictionary { Words.FREQUENCY, }; private static final String[] PROJECTION_ADD = { Words._ID, Words.FREQUENCY, Words.LOCALE, }; // This is not exported by the framework so we pretty much have to write it here verbatim private static final String ACTION_USER_DICTIONARY_INSERT = "com.android.settings.USER_DICTIONARY_INSERT"; private ContentObserver mObserver; final private String mLocale; Loading Loading @@ -164,54 +163,19 @@ public class UserDictionary extends ExpandableDictionary { public synchronized void addWord(final String word, final int frequency) { // Force load the dictionary here synchronously if (getRequiresReload()) loadDictionaryAsync(); // TODO: do something for the UI. With the following, any sufficiently long word will // look like it will go to the user dictionary but it won't. // Safeguard against adding long words. Can cause stack overflow. if (word.length() >= getMaxWordLength()) return; super.addWord(word, frequency); // Update the user dictionary provider final ContentValues values = new ContentValues(5); values.put(Words.WORD, word); values.put(Words.FREQUENCY, frequency); values.put(Words.LOCALE, mLocale); values.put(Words.APP_ID, 0); final ContentResolver contentResolver = getContext().getContentResolver(); final ContentProviderClient client = contentResolver.acquireContentProviderClient(Words.CONTENT_URI); if (null == client) return; new Thread("addWord") { @Override public void run() { Cursor cursor = null; try { cursor = client.query(Words.CONTENT_URI, PROJECTION_ADD, "word=? and ((locale IS NULL) or (locale=?))", new String[] { word, mLocale }, null); if (cursor != null && cursor.moveToFirst()) { final String locale = cursor.getString(cursor.getColumnIndex(Words.LOCALE)); // If locale is null, we will not override the entry. if (locale != null && locale.equals(mLocale.toString())) { final long id = cursor.getLong(cursor.getColumnIndex(Words._ID)); final Uri uri = Uri.withAppendedPath(Words.CONTENT_URI, Long.toString(id)); // Update the entry with new frequency value. client.update(uri, values, null, null); } } else { // Insert new entry. client.insert(Words.CONTENT_URI, values); } } catch (RemoteException e) { // If we come here, the activity is already about to be killed, and we // have no means of contacting the content provider any more. // See ContentResolver#insert, inside the catch(){} } finally { if (null != cursor) cursor.close(); client.release(); } } }.start(); // TODO: Add an argument to the intent to specify the frequency. Intent intent = new Intent(ACTION_USER_DICTIONARY_INSERT); intent.putExtra(Words.WORD, word); intent.putExtra(Words.LOCALE, mLocale); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); getContext().startActivity(intent); // In case the above does a synchronous callback of the change observer setRequiresReload(false); Loading