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