Home | History | Annotate | Download | only in expected
      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.expected;
     18 
     19 import com.android.inputmethod.keyboard.Key;
     20 import com.android.inputmethod.keyboard.internal.KeyboardIconsSet;
     21 import com.android.inputmethod.keyboard.internal.MoreKeySpec;
     22 import com.android.inputmethod.latin.common.StringUtils;
     23 
     24 import java.util.Locale;
     25 
     26 /**
     27  * This class represents an expected visual outlook of a key.
     28  *
     29  * There are two types of expected visual, an integer icon id and a string label.
     30  */
     31 public abstract class ExpectedKeyVisual {
     32     public static ExpectedKeyVisual newInstance(final String label) {
     33         return new Label(label);
     34     }
     35 
     36     public static ExpectedKeyVisual newInstance(final int iconId) {
     37         return new Icon(iconId);
     38     }
     39 
     40     public abstract int getIconId();
     41     public abstract String getLabel();
     42     abstract ExpectedKeyVisual toUpperCase(final Locale locale);
     43     abstract ExpectedKeyVisual preserveCase();
     44     abstract boolean hasSameKeyVisual(final String text);
     45     abstract boolean hasSameKeyVisual(final Key key);
     46     abstract boolean hasSameKeyVisual(final MoreKeySpec moreKeySpec);
     47     abstract boolean hasSameKeyVisual(final ExpectedKeyOutput output);
     48     abstract boolean hasSameKeyVisual(final ExpectedKeyVisual visual);
     49 
     50     /**
     51      * This class represents an integer icon id.
     52      */
     53     private static class Icon extends ExpectedKeyVisual {
     54         private final int mIconId;
     55 
     56         Icon(final int iconId) {
     57             mIconId = iconId;
     58         }
     59 
     60         @Override
     61         public int getIconId() {
     62             return mIconId;
     63         }
     64 
     65         @Override
     66         public String getLabel() {
     67             return null;
     68         }
     69 
     70         @Override
     71         ExpectedKeyVisual toUpperCase(final Locale locale) {
     72             return this;
     73         }
     74 
     75         @Override
     76         ExpectedKeyVisual preserveCase() {
     77             return this;
     78         }
     79 
     80         @Override
     81         boolean hasSameKeyVisual(final String text) {
     82             return false;
     83         }
     84 
     85         @Override
     86         boolean hasSameKeyVisual(final Key key) {
     87             // If the actual key has an icon as its visual, a label has to be null.
     88             // See {@link KeyboardView#onDrawKeyTopVisuals(Key,Canvas,Paint,KeyDrawParams).
     89             return mIconId == key.getIconId() && key.getLabel() == null;
     90         }
     91 
     92         @Override
     93         boolean hasSameKeyVisual(final MoreKeySpec moreKeySpec) {
     94             // If the actual more key has an icon as its visual, a label has to be null.
     95             // See {@link KeySpecParser#getIconId(String)} and
     96             // {@link KeySpecParser#getLabel(String)}.
     97             return mIconId == moreKeySpec.mIconId && moreKeySpec.mLabel == null;
     98         }
     99 
    100         @Override
    101         boolean hasSameKeyVisual(final ExpectedKeyOutput output) {
    102             return false;
    103         }
    104 
    105         @Override
    106         boolean hasSameKeyVisual(final ExpectedKeyVisual visual) {
    107             return (visual instanceof Icon) && mIconId == ((Icon)visual).mIconId;
    108         }
    109 
    110         @Override
    111         public String toString() {
    112             return KeyboardIconsSet.getIconName(mIconId);
    113         }
    114     }
    115 
    116     /**
    117      * This class represents a string label.
    118      */
    119     private static class Label extends ExpectedKeyVisual {
    120         private final String mLabel;
    121 
    122         Label(final String label) {
    123             mLabel = label;
    124         }
    125 
    126         @Override
    127         public int getIconId() {
    128             return KeyboardIconsSet.ICON_UNDEFINED;
    129         }
    130 
    131         @Override
    132         public String getLabel() {
    133             return mLabel;
    134         }
    135 
    136         @Override
    137         ExpectedKeyVisual toUpperCase(final Locale locale) {
    138             return new Label(StringUtils.toTitleCaseOfKeyLabel(mLabel, locale));
    139         }
    140 
    141         @Override
    142         ExpectedKeyVisual preserveCase() {
    143             return new CasePreservedLabel(mLabel);
    144         }
    145 
    146         @Override
    147         boolean hasSameKeyVisual(final String text) {
    148             return mLabel.equals(text);
    149         }
    150 
    151         @Override
    152         boolean hasSameKeyVisual(final Key key) {
    153             // If the actual key has a label as its visual, an icon has to be undefined.
    154             // See {@link KeyboardView#onDrawKeyTopVisuals(Key,Canvas,Paint,KeyDrawParams).
    155             return mLabel.equals(key.getLabel())
    156                     && key.getIconId() == KeyboardIconsSet.ICON_UNDEFINED;
    157         }
    158 
    159         @Override
    160         boolean hasSameKeyVisual(final MoreKeySpec moreKeySpec) {
    161             // If the actual more key has a label as its visual, an icon has to be undefined.
    162             // See {@link KeySpecParser#getIconId(String)} and
    163             // {@link KeySpecParser#getLabel(String)}.
    164             return mLabel.equals(moreKeySpec.mLabel)
    165                     && moreKeySpec.mIconId == KeyboardIconsSet.ICON_UNDEFINED;
    166         }
    167 
    168         @Override
    169         boolean hasSameKeyVisual(final ExpectedKeyOutput output) {
    170             return output.hasSameKeyOutput(mLabel);
    171         }
    172 
    173         @Override
    174         boolean hasSameKeyVisual(final ExpectedKeyVisual visual) {
    175             return (visual instanceof Label) && mLabel.equals(((Label)visual).mLabel);
    176         }
    177 
    178         @Override
    179         public String toString() {
    180             return mLabel;
    181         }
    182 
    183         private static class CasePreservedLabel extends Label {
    184             CasePreservedLabel(final String label) { super(label); }
    185 
    186             @Override
    187             ExpectedKeyVisual toUpperCase(final Locale locale) { return this; }
    188 
    189             @Override
    190             ExpectedKeyVisual preserveCase() { return this; }
    191         }
    192     }
    193 }
    194