diff options
Diffstat (limited to 'java/src')
5 files changed, 138 insertions, 86 deletions
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.java index 9dc1786c7..1b516755f 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.java +++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.java @@ -234,6 +234,7 @@ public final class KeyboardTextsSet { /* 118 */ "label_to_phone_symbols_key", /* 119 */ "label_time_am", /* 120 */ "label_time_pm", + /* 121 */ "label_to_symbol_key_pcqwerty", }; private static final String EMPTY = ""; @@ -381,6 +382,8 @@ public final class KeyboardTextsSet { /* 119 */ "AM", // Key label for "post meridiem" /* 120 */ "PM", + // Label for "switch to symbols" key on PC QWERTY layout + /* 121 */ "Sym", }; /* Language ar: Arabic */ @@ -427,8 +430,6 @@ public final class KeyboardTextsSet { // http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt // U+FD3E: "﴾" ORNATE LEFT PARENTHESIS // U+FD3F: "﴿" ORNATE RIGHT PARENTHESIS - // TODO: DroidSansArabic lacks the glyph of U+FD3E ORNATE LEFT PARENTHESIS - // TODO: DroidSansArabic lacks the glyph of U+FD3F ORNATE RIGHT PARENTHESIS /* 53 */ "!fixedColumnOrder!4,\uFD3E|\uFD3F,<|>,{|},[|]", /* 54 */ "!fixedColumnOrder!4,\uFD3F|\uFD3E,>|<,}|{,]|[", // U+2264: "≤" LESS-THAN OR EQUAL TO @@ -495,7 +496,7 @@ public final class KeyboardTextsSet { /* 94 */ "?", /* 95 */ ";", // U+2030: "‰" PER MILLE SIGN - /* 96 */ "%,\u2030", + /* 96 */ "\\%,\u2030", /* 97~ */ null, null, null, null, null, /* ~101 */ @@ -1031,8 +1032,6 @@ public final class KeyboardTextsSet { // http://www.unicode.org/Public/6.1.0/ucd/BidiMirroring.txt // U+FD3E: "﴾" ORNATE LEFT PARENTHESIS // U+FD3F: "﴿" ORNATE RIGHT PARENTHESIS - // TODO: DroidSansArabic lacks the glyph of U+FD3E ORNATE LEFT PARENTHESIS - // TODO: DroidSansArabic lacks the glyph of U+FD3F ORNATE RIGHT PARENTHESIS /* 53 */ "!fixedColumnOrder!4,\uFD3E|\uFD3F,<|>,{|},[|]", /* 54 */ "!fixedColumnOrder!4,\uFD3F|\uFD3E,>|<,}|{,]|[", // U+2264: "≤" LESS-THAN OR EQUAL TO @@ -1099,7 +1098,7 @@ public final class KeyboardTextsSet { /* 94 */ "?", /* 95 */ ";", // U+2030: "‰" PER MILLE SIGN - /* 96 */ "%,\u2030", + /* 96 */ "\\%,\u2030", // U+060C: "،" ARABIC COMMA // U+061B: "؛" ARABIC SEMICOLON // U+061F: "؟" ARABIC QUESTION MARK diff --git a/java/src/com/android/inputmethod/latin/AdditionalSubtype.java b/java/src/com/android/inputmethod/latin/AdditionalSubtype.java index 458d9ee14..b9023aef9 100644 --- a/java/src/com/android/inputmethod/latin/AdditionalSubtype.java +++ b/java/src/com/android/inputmethod/latin/AdditionalSubtype.java @@ -22,6 +22,7 @@ import static com.android.inputmethod.latin.Constants.Subtype.ExtraValue.KEYBOAR import android.view.inputmethod.InputMethodSubtype; +import java.util.ArrayList; public class AdditionalSubtype { @@ -41,9 +42,8 @@ public class AdditionalSubtype { final String layoutExtraValue = KEYBOARD_LAYOUT_SET + "=" + keyboardLayoutSetName; final String filteredExtraValue = StringUtils.appendToCsvIfNotExists( IS_ADDITIONAL_SUBTYPE, extraValue); - Integer nameId = SubtypeLocale.getSubtypeNameIdFromKeyboardLayoutName( + final int nameId = SubtypeLocale.getSubtypeNameIdFromKeyboardLayoutName( keyboardLayoutSetName); - if (nameId == null) nameId = R.string.subtype_generic; return new InputMethodSubtype(nameId, R.drawable.ic_subtype_keyboard, localeString, KEYBOARD_MODE, layoutExtraValue + "," + filteredExtraValue, false, false); @@ -74,10 +74,17 @@ public class AdditionalSubtype { public static InputMethodSubtype[] createAdditionalSubtypesArray(String prefSubtypes) { final String[] prefSubtypeArray = prefSubtypes.split(PREF_SUBTYPE_SEPARATOR); - final InputMethodSubtype[] subtypesArray = new InputMethodSubtype[prefSubtypeArray.length]; + final ArrayList<InputMethodSubtype> subtypesList = + new ArrayList<InputMethodSubtype>(prefSubtypeArray.length); for (int i = 0; i < prefSubtypeArray.length; i++) { - subtypesArray[i] = createAdditionalSubtype(prefSubtypeArray[i]); + final InputMethodSubtype subtype = createAdditionalSubtype(prefSubtypeArray[i]); + if (subtype.getNameResId() == SubtypeLocale.UNKNOWN_KEYBOARD_LAYOUT) { + // Skip unknown keyboard layout subtype. This may happen when predefined keyboard + // layout has been removed. + continue; + } + subtypesList.add(subtype); } - return subtypesArray; + return subtypesList.toArray(new InputMethodSubtype[subtypesList.size()]); } } diff --git a/java/src/com/android/inputmethod/latin/AdditionalSubtypeSettings.java b/java/src/com/android/inputmethod/latin/AdditionalSubtypeSettings.java index 994b917a7..8ce91fd2d 100644 --- a/java/src/com/android/inputmethod/latin/AdditionalSubtypeSettings.java +++ b/java/src/com/android/inputmethod/latin/AdditionalSubtypeSettings.java @@ -19,6 +19,7 @@ package com.android.inputmethod.latin; import static com.android.inputmethod.latin.Constants.Subtype.ExtraValue.ASCII_CAPABLE; import android.app.AlertDialog; +import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.content.SharedPreferences; @@ -29,9 +30,7 @@ import android.preference.DialogPreference; import android.preference.Preference; import android.preference.PreferenceFragment; import android.preference.PreferenceGroup; -import android.preference.PreferenceScreen; import android.util.Pair; -import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; @@ -50,9 +49,10 @@ public class AdditionalSubtypeSettings extends PreferenceFragment { private SubtypeLocaleAdapter mSubtypeLocaleAdapter; private KeyboardLayoutSetAdapter mKeyboardLayoutSetAdapter; - private PreferenceGroup mSubtypePrefGroup; + private boolean mIsAddingNewSubtype; private static final int MENU_ADD_SUBTYPE = Menu.FIRST; + private static final String SAVE_IS_ADDING_NEW_SUBTYPE = "is_adding_new_subtype"; static class SubtypeLocaleItem extends Pair<String, String> implements Comparable<SubtypeLocaleItem> { @@ -141,16 +141,26 @@ public class AdditionalSubtypeSettings extends PreferenceFragment { public KeyboardLayoutSetAdapter getKeyboardLayoutSetAdapter(); } - static class SubtypePreference extends DialogPreference { + static class SubtypePreference extends DialogPreference + implements DialogInterface.OnCancelListener { + private static final String KEY_PREFIX = "subtype_pref_"; + private static final String KEY_NEW_SUBTYPE = KEY_PREFIX + "new"; + private InputMethodSubtype mSubtype; private final SubtypeDialogProxy mProxy; private Spinner mSubtypeLocaleSpinner; private Spinner mKeyboardLayoutSetSpinner; + public static SubtypePreference newIncompleteSubtypePreference( + Context context, SubtypeDialogProxy proxy) { + return new SubtypePreference(context, null, proxy); + } + public SubtypePreference(Context context, InputMethodSubtype subtype, - SubtypeDialogProxy proxy) { + SubtypeDialogProxy proxy) { super(context, null); + setDialogLayoutResource(R.layout.additional_subtype_dialog); setPersistent(false); mProxy = proxy; setSubtype(subtype); @@ -160,34 +170,44 @@ public class AdditionalSubtypeSettings extends PreferenceFragment { showDialog(null); } + public final boolean isIncomplete() { + return mSubtype == null; + } + public InputMethodSubtype getSubtype() { return mSubtype; } public void setSubtype(InputMethodSubtype subtype) { mSubtype = subtype; - if (subtype == null) { + if (isIncomplete()) { setTitle(null); setDialogTitle(R.string.add_style); + setKey(KEY_NEW_SUBTYPE); } else { final String displayName = SubtypeLocale.getFullDisplayName(subtype); setTitle(displayName); setDialogTitle(displayName); + setKey(KEY_PREFIX + subtype.getLocale() + "_" + + SubtypeLocale.getKeyboardLayoutSetName(subtype)); } } @Override - protected void onPrepareDialogBuilder(AlertDialog.Builder builder) { - final Context context = builder.getContext(); - final View v = LayoutInflater.from(context).inflate( - R.layout.additional_subtype_dialog, null); - builder.setView(v); + protected View onCreateDialogView() { + final View v = super.onCreateDialogView(); mSubtypeLocaleSpinner = (Spinner) v.findViewById(R.id.subtype_locale_spinner); mSubtypeLocaleSpinner.setAdapter(mProxy.getSubtypeLocaleAdapter()); mKeyboardLayoutSetSpinner = (Spinner) v.findViewById(R.id.keyboard_layout_set_spinner); mKeyboardLayoutSetSpinner.setAdapter(mProxy.getKeyboardLayoutSetAdapter()); + return v; + } - if (mSubtype == null) { + @Override + protected void onPrepareDialogBuilder(AlertDialog.Builder builder) { + final Context context = builder.getContext(); + builder.setCancelable(true).setOnCancelListener(this); + if (isIncomplete()) { builder.setPositiveButton(R.string.add, this) .setNegativeButton(android.R.string.cancel, this); } else { @@ -215,6 +235,13 @@ public class AdditionalSubtypeSettings extends PreferenceFragment { } @Override + public void onCancel(DialogInterface dialog) { + if (isIncomplete()) { + mProxy.onRemovePressed(this); + } + } + + @Override public void onClick(DialogInterface dialog, int which) { super.onClick(dialog, which); switch (which) { @@ -237,28 +264,49 @@ public class AdditionalSubtypeSettings extends PreferenceFragment { } } + private static int getSpinnerPosition(Spinner spinner) { + if (spinner == null) return -1; + return spinner.getSelectedItemPosition(); + } + + private static void setSpinnerPosition(Spinner spinner, int position) { + if (spinner == null || position < 0) return; + spinner.setSelection(position); + } + @Override protected Parcelable onSaveInstanceState() { - final SavedState myState = new SavedState(super.onSaveInstanceState()); + final Parcelable superState = super.onSaveInstanceState(); + final Dialog dialog = getDialog(); + if (dialog == null || !dialog.isShowing()) { + return superState; + } + + final SavedState myState = new SavedState(superState); myState.mSubtype = mSubtype; + myState.mSubtypeLocaleSelectedPos = getSpinnerPosition(mSubtypeLocaleSpinner); + myState.mKeyboardLayoutSetSelectedPos = getSpinnerPosition(mKeyboardLayoutSetSpinner); return myState; } @Override protected void onRestoreInstanceState(Parcelable state) { - if (state instanceof SavedState) { - final SavedState myState = (SavedState) state; - super.onRestoreInstanceState(state); - setSubtype(myState.mSubtype); - } else { + if (!(state instanceof SavedState)) { super.onRestoreInstanceState(state); + return; } + + final SavedState myState = (SavedState) state; + super.onRestoreInstanceState(myState.getSuperState()); + setSpinnerPosition(mSubtypeLocaleSpinner, myState.mSubtypeLocaleSelectedPos); + setSpinnerPosition(mKeyboardLayoutSetSpinner, myState.mKeyboardLayoutSetSelectedPos); + setSubtype(myState.mSubtype); } static class SavedState extends Preference.BaseSavedState { InputMethodSubtype mSubtype; - private static final byte VALID = 1; - private static final byte INVALID = 0; + int mSubtypeLocaleSelectedPos; + int mKeyboardLayoutSetSelectedPos; public SavedState(Parcelable superState) { super(superState); @@ -267,23 +315,19 @@ public class AdditionalSubtypeSettings extends PreferenceFragment { @Override public void writeToParcel(Parcel dest, int flags) { super.writeToParcel(dest, flags); - if (mSubtype != null) { - dest.writeByte(VALID); - mSubtype.writeToParcel(dest, 0); - } else { - dest.writeByte(INVALID); - } + dest.writeInt(mSubtypeLocaleSelectedPos); + dest.writeInt(mKeyboardLayoutSetSelectedPos); + dest.writeParcelable(mSubtype, 0); } public SavedState(Parcel source) { super(source); - if (source.readByte() == VALID) { - mSubtype = source.readParcelable(null); - } else { - mSubtype = null; - } + mSubtypeLocaleSelectedPos = source.readInt(); + mKeyboardLayoutSetSelectedPos = source.readInt(); + mSubtype = (InputMethodSubtype)source.readParcelable(null); } + @SuppressWarnings("hiding") public static final Parcelable.Creator<SavedState> CREATOR = new Parcelable.Creator<SavedState>() { @Override @@ -309,26 +353,43 @@ public class AdditionalSubtypeSettings extends PreferenceFragment { addPreferencesFromResource(R.xml.additional_subtype_settings); setHasOptionsMenu(true); - mSubtypePrefGroup = getPreferenceScreen(); mPrefs = getPreferenceManager().getSharedPreferences(); } @Override public void onActivityCreated(Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); - final Context context = getActivity(); mSubtypeLocaleAdapter = new SubtypeLocaleAdapter(context); mKeyboardLayoutSetAdapter = new KeyboardLayoutSetAdapter(context); - // TODO: Restore editing dialog if any. + final String prefSubtypes = + SettingsValues.getPrefAdditionalSubtypes(mPrefs, getResources()); + setPrefSubtypes(prefSubtypes, context); + + mIsAddingNewSubtype = (savedInstanceState != null) + && savedInstanceState.containsKey(SAVE_IS_ADDING_NEW_SUBTYPE); + if (mIsAddingNewSubtype) { + getPreferenceScreen().addPreference( + SubtypePreference.newIncompleteSubtypePreference(context, mSubtypeProxy)); + } + + super.onActivityCreated(savedInstanceState); + } + + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + if (mIsAddingNewSubtype) { + outState.putBoolean(SAVE_IS_ADDING_NEW_SUBTYPE, true); + } } private final SubtypeDialogProxy mSubtypeProxy = new SubtypeDialogProxy() { @Override public void onRemovePressed(SubtypePreference subtypePref) { - final PreferenceGroup group = mSubtypePrefGroup; + mIsAddingNewSubtype = false; + final PreferenceGroup group = getPreferenceScreen(); if (group != null) { group.removePreference(subtypePref); } @@ -346,13 +407,11 @@ public class AdditionalSubtypeSettings extends PreferenceFragment { }; private void setPrefSubtypes(String prefSubtypes, Context context) { - final PreferenceGroup group = mSubtypePrefGroup; + final PreferenceGroup group = getPreferenceScreen(); group.removeAll(); - final String[] prefSubtypeArray = prefSubtypes.split( - AdditionalSubtype.PREF_SUBTYPE_SEPARATOR); - for (final String prefSubtype : prefSubtypeArray) { - final InputMethodSubtype subtype = - AdditionalSubtype.createAdditionalSubtype(prefSubtype); + final InputMethodSubtype[] subtypesArray = + AdditionalSubtype.createAdditionalSubtypesArray(prefSubtypes); + for (final InputMethodSubtype subtype : subtypesArray) { final SubtypePreference pref = new SubtypePreference( context, subtype, mSubtypeProxy); group.addPreference(pref); @@ -360,13 +419,16 @@ public class AdditionalSubtypeSettings extends PreferenceFragment { } private String getPrefSubtypes() { + final PreferenceGroup group = getPreferenceScreen(); final StringBuilder sb = new StringBuilder(); - final int count = mSubtypePrefGroup.getPreferenceCount(); + final int count = group.getPreferenceCount(); for (int i = 0; i < count; i++) { - final Preference pref = mSubtypePrefGroup.getPreference(i); + final Preference pref = group.getPreference(i); if (pref instanceof SubtypePreference) { - final InputMethodSubtype subtype = ((SubtypePreference)pref).getSubtype(); - if (subtype == null) continue; + final SubtypePreference subtypePref = (SubtypePreference)pref; + // We should not save newly adding subtype to preference because it is incomplete. + if (subtypePref.isIncomplete()) continue; + final InputMethodSubtype subtype = subtypePref.getSubtype(); if (sb.length() > 0) { sb.append(AdditionalSubtype.PREF_SUBTYPE_SEPARATOR); } @@ -377,15 +439,6 @@ public class AdditionalSubtypeSettings extends PreferenceFragment { } @Override - public void onResume() { - super.onResume(); - - final String prefSubtypes = - SettingsValues.getPrefAdditionalSubtypes(mPrefs, getResources()); - setPrefSubtypes(prefSubtypes, getActivity()); - } - - @Override public void onPause() { super.onPause(); final String oldSubtypes = SettingsValues.getPrefAdditionalSubtypes(mPrefs, getResources()); @@ -406,20 +459,6 @@ public class AdditionalSubtypeSettings extends PreferenceFragment { } @Override - public void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - // TODO: save editing dialog state. - } - - @Override - public boolean onPreferenceTreeClick(PreferenceScreen prefScreen, Preference pref) { - if (pref instanceof SubtypePreference) { - return true; - } - return super.onPreferenceTreeClick(prefScreen, pref); - } - - @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { final MenuItem addSubtypeMenu = menu.add(0, MENU_ADD_SUBTYPE, 0, R.string.add_style); addSubtypeMenu.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); @@ -429,10 +468,11 @@ public class AdditionalSubtypeSettings extends PreferenceFragment { public boolean onOptionsItemSelected(MenuItem item) { final int itemId = item.getItemId(); if (itemId == MENU_ADD_SUBTYPE) { - final SubtypePreference subtypePref = new SubtypePreference( - getActivity(), null, mSubtypeProxy); - mSubtypePrefGroup.addPreference(subtypePref); - subtypePref.show(); + final SubtypePreference newSubtype = + SubtypePreference.newIncompleteSubtypePreference(getActivity(), mSubtypeProxy); + getPreferenceScreen().addPreference(newSubtype); + newSubtype.show(); + mIsAddingNewSubtype = true; return true; } return super.onOptionsItemSelected(item); diff --git a/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java b/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java index 7d2ccdf5f..9dcffd4e2 100644 --- a/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java +++ b/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java @@ -288,13 +288,16 @@ abstract public class ExpandableBinaryDictionary extends Dictionary { loadDictionaryAsync(); + final String tempFileName = mFilename + ".temp"; final File file = new File(mContext.getFilesDir(), mFilename); + final File tempFile = new File(mContext.getFilesDir(), tempFileName); FileOutputStream out = null; try { - out = new FileOutputStream(file); + out = new FileOutputStream(tempFile); BinaryDictInputOutput.writeDictionaryBinary(out, mFusionDictionary, 1); out.flush(); out.close(); + tempFile.renameTo(file); clearFusionDictionary(); } catch (IOException e) { Log.e(TAG, "IO exception while writing file: " + e); diff --git a/java/src/com/android/inputmethod/latin/SubtypeLocale.java b/java/src/com/android/inputmethod/latin/SubtypeLocale.java index 33ad23a60..88d3c3f4f 100644 --- a/java/src/com/android/inputmethod/latin/SubtypeLocale.java +++ b/java/src/com/android/inputmethod/latin/SubtypeLocale.java @@ -36,6 +36,8 @@ public class SubtypeLocale { public static final String QWERTY = "qwerty"; + public static final int UNKNOWN_KEYBOARD_LAYOUT = R.string.subtype_generic; + private static String[] sPredefinedKeyboardLayoutSet; // Keyboard layout to its display name map. private static final HashMap<String, String> sKeyboardKayoutToDisplayNameMap = @@ -81,7 +83,8 @@ public class SubtypeLocale { } public static int getSubtypeNameIdFromKeyboardLayoutName(String keyboardLayoutName) { - return sKeyboardLayoutToNameIdsMap.get(keyboardLayoutName); + final Integer nameId = sKeyboardLayoutToNameIdsMap.get(keyboardLayoutName); + return nameId == null ? UNKNOWN_KEYBOARD_LAYOUT : nameId; } // Get InputMethodSubtype's display name in its locale. |