@@ -153,20 +153,26 @@ public class KeyCharacterMap implements Parcelable {
153153 private static final int ACCENT_BREVE = '\u02D8' ;
154154 private static final int ACCENT_CARON = '\u02C7' ;
155155 private static final int ACCENT_CEDILLA = '\u00B8' ;
156+ private static final int ACCENT_CIRCUMFLEX = '\u02C6' ;
156157 private static final int ACCENT_COMMA_ABOVE = '\u1FBD' ;
157158 private static final int ACCENT_COMMA_ABOVE_RIGHT = '\u02BC' ;
158159 private static final int ACCENT_DOT_ABOVE = '\u02D9' ;
160+ private static final int ACCENT_DOT_BELOW = '.' ; // approximate
159161 private static final int ACCENT_DOUBLE_ACUTE = '\u02DD' ;
160162 private static final int ACCENT_GRAVE = '\u02CB' ;
161- private static final int ACCENT_CIRCUMFLEX = '\u02C6' ;
163+ private static final int ACCENT_HOOK_ABOVE = '\u02C0' ;
164+ private static final int ACCENT_HORN = '\'' ; // approximate
162165 private static final int ACCENT_MACRON = '\u00AF' ;
163166 private static final int ACCENT_MACRON_BELOW = '\u02CD' ;
164167 private static final int ACCENT_OGONEK = '\u02DB' ;
165168 private static final int ACCENT_REVERSED_COMMA_ABOVE = '\u02BD' ;
166169 private static final int ACCENT_RING_ABOVE = '\u02DA' ;
170+ private static final int ACCENT_STROKE = '-' ; // approximate
167171 private static final int ACCENT_TILDE = '\u02DC' ;
168172 private static final int ACCENT_TURNED_COMMA_ABOVE = '\u02BB' ;
169173 private static final int ACCENT_UMLAUT = '\u00A8' ;
174+ private static final int ACCENT_VERTICAL_LINE_ABOVE = '\u02C8' ;
175+ private static final int ACCENT_VERTICAL_LINE_BELOW = '\u02CC' ;
170176
171177 /* Legacy dead key display characters used in previous versions of the API.
172178 * We still support these characters by mapping them to their non-legacy version. */
@@ -188,11 +194,11 @@ public class KeyCharacterMap implements Parcelable {
188194 addCombining ('\u0306' , ACCENT_BREVE );
189195 addCombining ('\u0307' , ACCENT_DOT_ABOVE );
190196 addCombining ('\u0308' , ACCENT_UMLAUT );
191- // addCombining('\u0309', ACCENT_HOOK_ABOVE);
197+ addCombining ('\u0309' , ACCENT_HOOK_ABOVE );
192198 addCombining ('\u030A' , ACCENT_RING_ABOVE );
193199 addCombining ('\u030B' , ACCENT_DOUBLE_ACUTE );
194200 addCombining ('\u030C' , ACCENT_CARON );
195- // addCombining('\u030D', ACCENT_VERTICAL_LINE_ABOVE);
201+ addCombining ('\u030D' , ACCENT_VERTICAL_LINE_ABOVE );
196202 //addCombining('\u030E', ACCENT_DOUBLE_VERTICAL_LINE_ABOVE);
197203 //addCombining('\u030F', ACCENT_DOUBLE_GRAVE);
198204 //addCombining('\u0310', ACCENT_CANDRABINDU);
@@ -201,13 +207,14 @@ public class KeyCharacterMap implements Parcelable {
201207 addCombining ('\u0313' , ACCENT_COMMA_ABOVE );
202208 addCombining ('\u0314' , ACCENT_REVERSED_COMMA_ABOVE );
203209 addCombining ('\u0315' , ACCENT_COMMA_ABOVE_RIGHT );
204- // addCombining('\u031B', ACCENT_HORN);
205- // addCombining('\u0323', ACCENT_DOT_BELOW);
210+ addCombining ('\u031B' , ACCENT_HORN );
211+ addCombining ('\u0323' , ACCENT_DOT_BELOW );
206212 //addCombining('\u0326', ACCENT_COMMA_BELOW);
207213 addCombining ('\u0327' , ACCENT_CEDILLA );
208214 addCombining ('\u0328' , ACCENT_OGONEK );
209- // addCombining('\u0329', ACCENT_VERTICAL_LINE_BELOW);
215+ addCombining ('\u0329' , ACCENT_VERTICAL_LINE_BELOW );
210216 addCombining ('\u0331' , ACCENT_MACRON_BELOW );
217+ addCombining ('\u0335' , ACCENT_STROKE );
211218 //addCombining('\u0342', ACCENT_PERISPOMENI);
212219 //addCombining('\u0344', ACCENT_DIALYTIKA_TONOS);
213220 //addCombining('\u0345', ACCENT_YPOGEGRAMMENI);
@@ -235,6 +242,33 @@ private static void addCombining(int combining, int accent) {
235242 */
236243 private static final SparseIntArray sDeadKeyCache = new SparseIntArray ();
237244 private static final StringBuilder sDeadKeyBuilder = new StringBuilder ();
245+ static {
246+ // Non-standard decompositions.
247+ // Stroke modifier for Finnish multilingual keyboard and others.
248+ addDeadKey (ACCENT_STROKE , 'D' , '\u0110' );
249+ addDeadKey (ACCENT_STROKE , 'G' , '\u01e4' );
250+ addDeadKey (ACCENT_STROKE , 'H' , '\u0126' );
251+ addDeadKey (ACCENT_STROKE , 'I' , '\u0197' );
252+ addDeadKey (ACCENT_STROKE , 'L' , '\u0141' );
253+ addDeadKey (ACCENT_STROKE , 'O' , '\u00d8' );
254+ addDeadKey (ACCENT_STROKE , 'T' , '\u0166' );
255+ addDeadKey (ACCENT_STROKE , 'd' , '\u0111' );
256+ addDeadKey (ACCENT_STROKE , 'g' , '\u01e5' );
257+ addDeadKey (ACCENT_STROKE , 'h' , '\u0127' );
258+ addDeadKey (ACCENT_STROKE , 'i' , '\u0268' );
259+ addDeadKey (ACCENT_STROKE , 'l' , '\u0142' );
260+ addDeadKey (ACCENT_STROKE , 'o' , '\u00f8' );
261+ addDeadKey (ACCENT_STROKE , 't' , '\u0167' );
262+ }
263+
264+ private static void addDeadKey (int accent , int c , int result ) {
265+ final int combining = sAccentToCombining .get (accent );
266+ if (combining == 0 ) {
267+ throw new IllegalStateException ("Invalid dead key declaration." );
268+ }
269+ final int combination = (combining << 16 ) | c ;
270+ sDeadKeyCache .put (combination , result );
271+ }
238272
239273 public static final Parcelable .Creator <KeyCharacterMap > CREATOR =
240274 new Parcelable .Creator <KeyCharacterMap >() {
0 commit comments