Home | History | Annotate | Download | only in layout
      1 /*
      2  * Copyright (C) 2014 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.inputmethod.keyboard.layout;
     18 
     19 import com.android.inputmethod.keyboard.KeyboardId;
     20 import com.android.inputmethod.keyboard.layout.customizer.LayoutCustomizer;
     21 import com.android.inputmethod.keyboard.layout.expected.ExpectedKey;
     22 import com.android.inputmethod.keyboard.layout.expected.ExpectedKeyboardBuilder;
     23 
     24 /**
     25  * The PC QWERTY alphabet keyboard.
     26  */
     27 public final class PcQwerty extends LayoutBase {
     28     private static final String LAYOUT_NAME = "pcqwerty";
     29 
     30     public PcQwerty(final LayoutCustomizer customizer) {
     31         super(customizer, Symbols.class, SymbolsShifted.class);
     32     }
     33 
     34     @Override
     35     public String getName() { return LAYOUT_NAME; }
     36 
     37     @Override
     38     ExpectedKey[][] getCommonAlphabetLayout(final boolean isPhone) {
     39         final LayoutCustomizer customizer = getCustomizer();
     40         final ExpectedKeyboardBuilder builder = new ExpectedKeyboardBuilder(ALPHABET_COMMON);
     41         customizer.setAccentedLetters(builder);
     42         builder.replaceKeyOfLabel(ROW1_1, key("`", moreKey("~")))
     43                 .replaceKeyOfLabel(ROW2_11, key("[", moreKey("{")))
     44                 .replaceKeyOfLabel(ROW2_12, key("]", moreKey("}")))
     45                 .replaceKeyOfLabel(ROW2_13, key("\\", moreKey("|")))
     46                 .replaceKeyOfLabel(ROW3_10, key(";", moreKey(":")))
     47                 .replaceKeyOfLabel(ROW3_11, key("'", joinMoreKeys(additionalMoreKey("\""),
     48                         customizer.getDoubleQuoteMoreKeys(),
     49                         customizer.getSingleQuoteMoreKeys())))
     50                 .setAdditionalMoreKeysPositionOf("'", 4)
     51                 .replaceKeyOfLabel(ROW4_8, key(",", moreKey("<")))
     52                 .replaceKeyOfLabel(ROW4_9, key(".", moreKey(">")))
     53                 // U+00BF: "" INVERTED QUESTION MARK
     54                 .replaceKeyOfLabel(ROW4_10, key("/", joinMoreKeys("?", "\u00BF")));
     55         if (isPhone) {
     56             // U+221E: "" INFINITY
     57             // U+2260: "" NOT EQUAL TO
     58             // U+2248: "" ALMOST EQUAL TO
     59             builder.replaceKeyOfLabel(ROW1_13, key("=",
     60                     joinMoreKeys("\u221E", "\u2260", "\u2248", "+")));
     61         } else {
     62             // U+221E: "" INFINITY
     63             // U+2260: "" NOT EQUAL TO
     64             // U+2248: "" ALMOST EQUAL TO
     65             builder.replaceKeyOfLabel(ROW1_13, key("=",
     66                     joinMoreKeys("+", "\u221E", "\u2260", "\u2248")));
     67         }
     68         return builder.build();
     69     }
     70 
     71     @Override
     72     ExpectedKey[][] getCommonAlphabetShiftLayout(final boolean isPhone, final int elementId) {
     73         final ExpectedKeyboardBuilder builder;
     74         if (elementId == KeyboardId.ELEMENT_ALPHABET_AUTOMATIC_SHIFTED
     75                 || elementId == KeyboardId.ELEMENT_ALPHABET_SHIFT_LOCKED) {
     76             builder = new ExpectedKeyboardBuilder(getCommonAlphabetLayout(isPhone));
     77         } else {
     78             builder = new ExpectedKeyboardBuilder(ALPHABET_COMMON);
     79             final LayoutCustomizer customizer = getCustomizer();
     80             customizer.setAccentedLetters(builder);
     81             builder.setKeysOfRow(1,
     82                     "~",
     83                     // U+00A1: "" INVERTED EXCLAMATION MARK
     84                     key("!", moreKey("\u00A1")),
     85                     "@", "#",
     86                     customizer.getCurrencyKey(),
     87                     // U+2030: "" PER MILLE SIGN
     88                     key("%", moreKey("\u2030")),
     89                     "^", "&",
     90                     // U+2020: "" DAGGER
     91                     // U+2021: "" DOUBLE DAGGER
     92                     // U+2605: "" BLACK STAR
     93                     key("*", joinMoreKeys("\u2020", "\u2021", "\u2605")),
     94                     "(", ")", "_",
     95                     // U+00B1: "" PLUS-MINUS SIGN
     96                     // U+00D7: "" MULTIPLICATION SIGN
     97                     // U+00F7: "" DIVISION SIGN
     98                     // U+221A: "" SQUARE ROOT
     99                     key("+", joinMoreKeys("\u00B1", "\u00D7", "\u00F7", "\u221A")))
    100                     .replaceKeyOfLabel(ROW2_11, key("{"))
    101                     .replaceKeyOfLabel(ROW2_12, key("}"))
    102                     .replaceKeyOfLabel(ROW2_13, key("|"))
    103                     .replaceKeyOfLabel(ROW3_10, key(":"))
    104                     .replaceKeyOfLabel(ROW3_11, key("\"", joinMoreKeys(
    105                             customizer.getDoubleQuoteMoreKeys(),
    106                             customizer.getSingleQuoteMoreKeys())))
    107                     // U+2039: "" SINGLE LEFT-POINTING ANGLE QUOTATION MARK
    108                     // U+2264: "" LESS-THAN OR EQUAL TO
    109                     // U+00AB: "" LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
    110                     .replaceKeyOfLabel(ROW4_8, key("<", joinMoreKeys("\u2039", "\u2264", "\u00AB")))
    111                     // U+203A: "" SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
    112                     // U+2265: "" GREATER-THAN EQUAL TO
    113                     // U+00BB: "" RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
    114                     .replaceKeyOfLabel(ROW4_9, key(">", joinMoreKeys("\u203A", "\u2265", "\u00BB")))
    115                     // U+00BF: "" INVERTED QUESTION MARK
    116                     .replaceKeyOfLabel(ROW4_10, key("?", moreKey("\u00BF")));
    117         }
    118         builder.toUpperCase(getLocale());
    119         return builder.build();
    120     }
    121 
    122     // Helper method to create alphabet layout by adding special function keys.
    123     @Override
    124     ExpectedKeyboardBuilder convertCommonLayoutToKeyboard(final ExpectedKeyboardBuilder builder,
    125             final boolean isPhone) {
    126         final LayoutCustomizer customizer = getCustomizer();
    127         builder.setKeysOfRow(5, (Object[])customizer.getSpaceKeys(isPhone));
    128         builder.addKeysOnTheLeftOfRow(5, (Object[])customizer.getKeysLeftToSpacebar(isPhone));
    129         builder.addKeysOnTheRightOfRow(5, (Object[])customizer.getKeysRightToSpacebar(isPhone));
    130         if (isPhone) {
    131             builder.addKeysOnTheRightOfRow(3, DELETE_KEY);
    132         } else {
    133             builder.addKeysOnTheRightOfRow(1, DELETE_KEY)
    134                     .addKeysOnTheLeftOfRow(2, TAB_KEY)
    135                     .addKeysOnTheRightOfRow(3, ENTER_KEY);
    136         }
    137         builder.addKeysOnTheLeftOfRow(4, (Object[])customizer.getLeftShiftKeys(isPhone))
    138                 .addKeysOnTheRightOfRow(4, (Object[])customizer.getRightShiftKeys(isPhone));
    139         return builder;
    140     }
    141 
    142     @Override
    143     public ExpectedKey[][] getLayout(final boolean isPhone, final int elementId) {
    144         if (elementId == KeyboardId.ELEMENT_SYMBOLS
    145                 || elementId == KeyboardId.ELEMENT_SYMBOLS_SHIFTED) {
    146             return null;
    147         }
    148         return super.getLayout(isPhone, elementId);
    149     }
    150 
    151     private static final String ROW1_1 = "ROW1_1";
    152     private static final String ROW1_13 = "ROW1_13";
    153     private static final String ROW2_11 = "ROW2_11";
    154     private static final String ROW2_12 = "ROW2_12";
    155     private static final String ROW2_13 = "ROW2_13";
    156     private static final String ROW3_10 = "ROW3_10";
    157     private static final String ROW3_11 = "ROW3_11";
    158     private static final String ROW4_8 = "ROW4_8";
    159     private static final String ROW4_9 = "ROW4_9";
    160     private static final String ROW4_10 = "ROW4_10";
    161 
    162     private static final ExpectedKey[][] ALPHABET_COMMON = new ExpectedKeyboardBuilder()
    163             .setKeysOfRow(1,
    164                     ROW1_1,
    165                     // U+00A1: "" INVERTED EXCLAMATION MARK
    166                     // U+00B9: "" SUPERSCRIPT ONE
    167                     // U+00BD: "" VULGAR FRACTION ONE HALF
    168                     // U+2153: "" VULGAR FRACTION ONE THIRD
    169                     // U+00BC: "" VULGAR FRACTION ONE QUARTER
    170                     // U+215B: "" VULGAR FRACTION ONE EIGHTH
    171                     key("1", joinMoreKeys(
    172                             "!", "\u00A1", "\u00B9", "\u00BD", "\u2153", "\u00BC", "\u215B")),
    173                     // U+00B2: "" SUPERSCRIPT TWO
    174                     // U+2154: "" VULGAR FRACTION TWO THIRDS
    175                     key("2", joinMoreKeys("@", "\u00B2", "\u2154")),
    176                     // U+00B3: "" SUPERSCRIPT THREE
    177                     // U+00BE: "" VULGAR FRACTION THREE QUARTERS
    178                     // U+215C: "" VULGAR FRACTION THREE EIGHTHS
    179                     key("3", joinMoreKeys("#", "\u00B3", "\u00BE", "\u215C")),
    180                     // U+2074: "" SUPERSCRIPT FOUR
    181                     key("4", joinMoreKeys("$", "\u2074")),
    182                     // U+215D: "" VULGAR FRACTION FIVE EIGHTHS
    183                     key("5", joinMoreKeys("%", "\u215D")),
    184                     key("6", moreKey("^")),
    185                     // U+215E: "" VULGAR FRACTION SEVEN EIGHTHS
    186                     key("7", joinMoreKeys("&", "\u215E")),
    187                     key("8", moreKey("*")),
    188                     key("9", moreKey("(")),
    189                     // U+207F: "" SUPERSCRIPT LATIN SMALL LETTER N
    190                     // U+2205: "" EMPTY SET
    191                     key("0", joinMoreKeys(")", "\u207F", "\u2205")),
    192                     // U+2013: "" EN DASH
    193                     // U+2014: "" EM DASH
    194                     // U+00B7: "" MIDDLE DOT
    195                     key("-", joinMoreKeys("_", "\u2013", "\u2014", "\u00B7")),
    196                     ROW1_13)
    197             .setKeysOfRow(2, "q", "w", "e", "r", "t", "y", "u", "i", "o", "p",
    198                     ROW2_11, ROW2_12, ROW2_13)
    199             .setKeysOfRow(3, "a", "s", "d", "f", "g", "h", "j", "k", "l", ROW3_10, ROW3_11)
    200             .setKeysOfRow(4, "z", "x", "c", "v", "b", "n", "m", ROW4_8, ROW4_9, ROW4_10)
    201             .build();
    202 }
    203