1d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik/*
2d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik * Copyright (C) 2015 The Android Open Source Project
3d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik *
4d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik * Licensed under the Apache License, Version 2.0 (the "License");
5d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik * you may not use this file except in compliance with the License.
6d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik * You may obtain a copy of the License at
7d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik *
8d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik *      http://www.apache.org/licenses/LICENSE-2.0
9d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik *
10d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik * Unless required by applicable law or agreed to in writing, software
11d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik * distributed under the License is distributed on an "AS IS" BASIS,
12d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik * See the License for the specific language governing permissions and
14d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik * limitations under the License
15d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik */
16d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik
17d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheikpackage com.android.inputmethod.keyboard;
18d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik
19d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheikimport com.android.inputmethod.annotations.UsedForTesting;
20d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik
21d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheikimport java.util.ArrayList;
22d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheikimport java.util.List;
23d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik
24d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheikimport javax.annotation.Nonnull;
25d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik
26d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik/**
27d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik * KeyboardLayout maintains the keyboard layout information.
28d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik */
29d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheikpublic class KeyboardLayout {
30d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik
31d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik    private final int[] mKeyCodes;
32d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik
33d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik    private final int[] mKeyXCoordinates;
34d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik    private final int[] mKeyYCoordinates;
35d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik
36d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik    private final int[] mKeyWidths;
37d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik    private final int[] mKeyHeights;
38d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik
39d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik    public final int mMostCommonKeyWidth;
40d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik    public final int mMostCommonKeyHeight;
41d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik
42d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik    public final int mKeyboardWidth;
43d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik    public final int mKeyboardHeight;
44d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik
45d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik    public KeyboardLayout(ArrayList<Key> layoutKeys, int mostCommonKeyWidth,
46d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik            int mostCommonKeyHeight, int keyboardWidth, int keyboardHeight) {
47d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik        mMostCommonKeyWidth = mostCommonKeyWidth;
48d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik        mMostCommonKeyHeight = mostCommonKeyHeight;
49d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik        mKeyboardWidth = keyboardWidth;
50d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik        mKeyboardHeight = keyboardHeight;
51d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik
52d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik        mKeyCodes = new int[layoutKeys.size()];
53d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik        mKeyXCoordinates = new int[layoutKeys.size()];
54d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik        mKeyYCoordinates = new int[layoutKeys.size()];
55d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik        mKeyWidths = new int[layoutKeys.size()];
56d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik        mKeyHeights = new int[layoutKeys.size()];
57d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik
58d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik        for (int i = 0; i < layoutKeys.size(); i++) {
59d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik            Key key = layoutKeys.get(i);
60d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik            mKeyCodes[i] = Character.toLowerCase(key.getCode());
61d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik            mKeyXCoordinates[i] = key.getX();
62d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik            mKeyYCoordinates[i] = key.getY();
63d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik            mKeyWidths[i] = key.getWidth();
64d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik            mKeyHeights[i] = key.getHeight();
65d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik        }
66d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik    }
67d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik
68d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik    @UsedForTesting
69d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik    public int[] getKeyCodes() {
70d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik        return mKeyCodes;
71d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik    }
72d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik
73d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik    /**
74d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik     * The x-coordinate for the top-left corner of the keys.
75d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik     *
76d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik     */
77d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik    public int[] getKeyXCoordinates() {
78d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik        return mKeyXCoordinates;
79d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik    }
80d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik
81d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik    /**
82d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik     * The y-coordinate for the top-left corner of the keys.
83d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik     */
84d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik    public int[] getKeyYCoordinates() {
85d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik        return mKeyYCoordinates;
86d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik    }
87d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik
88d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik    /**
89d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik     * The widths of the keys which are smaller than the true hit-area due to the gaps
90d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik     * between keys. The mostCommonKey(Width/Height) represents the true key width/height
91d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik     * including the gaps.
92d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik     */
93d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik    public int[] getKeyWidths() {
94d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik        return mKeyWidths;
95d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik    }
96d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik
97d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik    /**
98d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik     * The heights of the keys which are smaller than the true hit-area due to the gaps
99d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik     * between keys. The mostCommonKey(Width/Height) represents the true key width/height
100d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik     * including the gaps.
101d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik     */
102d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik    public int[] getKeyHeights() {
103d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik        return mKeyHeights;
104d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik    }
105d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik
106d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik    /**
107d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik     * Factory method to create {@link KeyboardLayout} objects.
108d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik     */
109d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik    public static KeyboardLayout newKeyboardLayout(@Nonnull final List<Key> sortedKeys,
110d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik            int mostCommonKeyWidth, int mostCommonKeyHeight,
111d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik            int occupiedWidth, int occupiedHeight) {
112d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik        final ArrayList<Key> layoutKeys = new ArrayList<Key>();
113d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik        for (final Key key : sortedKeys) {
114d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik            if (!ProximityInfo.needsProximityInfo(key)) {
115d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik                continue;
116d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik            }
117d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik            if (key.getCode() != ',') {
118d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik                layoutKeys.add(key);
119d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik            }
120d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik        }
121d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik        return new KeyboardLayout(layoutKeys, mostCommonKeyWidth,
122d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik                mostCommonKeyHeight, occupiedWidth, occupiedHeight);
123d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik    }
124d543984d2ecfdf200754e1b7e96261611d0e29fbMohammadinamul Sheik}
125