1 /*
2  * Copyright (C) 2015 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;
18 
19 import com.android.inputmethod.annotations.UsedForTesting;
20 
21 import java.util.ArrayList;
22 import java.util.List;
23 
24 import javax.annotation.Nonnull;
25 
26 /**
27  * KeyboardLayout maintains the keyboard layout information.
28  */
29 public class KeyboardLayout {
30 
31     private final int[] mKeyCodes;
32 
33     private final int[] mKeyXCoordinates;
34     private final int[] mKeyYCoordinates;
35 
36     private final int[] mKeyWidths;
37     private final int[] mKeyHeights;
38 
39     public final int mMostCommonKeyWidth;
40     public final int mMostCommonKeyHeight;
41 
42     public final int mKeyboardWidth;
43     public final int mKeyboardHeight;
44 
KeyboardLayout(ArrayList<Key> layoutKeys, int mostCommonKeyWidth, int mostCommonKeyHeight, int keyboardWidth, int keyboardHeight)45     public KeyboardLayout(ArrayList<Key> layoutKeys, int mostCommonKeyWidth,
46             int mostCommonKeyHeight, int keyboardWidth, int keyboardHeight) {
47         mMostCommonKeyWidth = mostCommonKeyWidth;
48         mMostCommonKeyHeight = mostCommonKeyHeight;
49         mKeyboardWidth = keyboardWidth;
50         mKeyboardHeight = keyboardHeight;
51 
52         mKeyCodes = new int[layoutKeys.size()];
53         mKeyXCoordinates = new int[layoutKeys.size()];
54         mKeyYCoordinates = new int[layoutKeys.size()];
55         mKeyWidths = new int[layoutKeys.size()];
56         mKeyHeights = new int[layoutKeys.size()];
57 
58         for (int i = 0; i < layoutKeys.size(); i++) {
59             Key key = layoutKeys.get(i);
60             mKeyCodes[i] = Character.toLowerCase(key.getCode());
61             mKeyXCoordinates[i] = key.getX();
62             mKeyYCoordinates[i] = key.getY();
63             mKeyWidths[i] = key.getWidth();
64             mKeyHeights[i] = key.getHeight();
65         }
66     }
67 
68     @UsedForTesting
getKeyCodes()69     public int[] getKeyCodes() {
70         return mKeyCodes;
71     }
72 
73     /**
74      * The x-coordinate for the top-left corner of the keys.
75      *
76      */
getKeyXCoordinates()77     public int[] getKeyXCoordinates() {
78         return mKeyXCoordinates;
79     }
80 
81     /**
82      * The y-coordinate for the top-left corner of the keys.
83      */
getKeyYCoordinates()84     public int[] getKeyYCoordinates() {
85         return mKeyYCoordinates;
86     }
87 
88     /**
89      * The widths of the keys which are smaller than the true hit-area due to the gaps
90      * between keys. The mostCommonKey(Width/Height) represents the true key width/height
91      * including the gaps.
92      */
getKeyWidths()93     public int[] getKeyWidths() {
94         return mKeyWidths;
95     }
96 
97     /**
98      * The heights of the keys which are smaller than the true hit-area due to the gaps
99      * between keys. The mostCommonKey(Width/Height) represents the true key width/height
100      * including the gaps.
101      */
getKeyHeights()102     public int[] getKeyHeights() {
103         return mKeyHeights;
104     }
105 
106     /**
107      * Factory method to create {@link KeyboardLayout} objects.
108      */
newKeyboardLayout(@onnull final List<Key> sortedKeys, int mostCommonKeyWidth, int mostCommonKeyHeight, int occupiedWidth, int occupiedHeight)109     public static KeyboardLayout newKeyboardLayout(@Nonnull final List<Key> sortedKeys,
110             int mostCommonKeyWidth, int mostCommonKeyHeight,
111             int occupiedWidth, int occupiedHeight) {
112         final ArrayList<Key> layoutKeys = new ArrayList<Key>();
113         for (final Key key : sortedKeys) {
114             if (!ProximityInfo.needsProximityInfo(key)) {
115                 continue;
116             }
117             if (key.getCode() != ',') {
118                 layoutKeys.add(key);
119             }
120         }
121         return new KeyboardLayout(layoutKeys, mostCommonKeyWidth,
122                 mostCommonKeyHeight, occupiedWidth, occupiedHeight);
123     }
124 }
125