Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f9a5bfa1 authored by satok's avatar satok Committed by Android (Google) Code Review
Browse files

Merge "Add the suggestion algorithm of words with space proximity" into honeycomb-mr1

parents 5ac85462 817e517e
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -174,7 +174,7 @@ public class Keyboard {
        mDefaultHeight = mDefaultWidth;
        mId = id;
        loadKeyboard(context, xmlLayoutResId);
        mProximityInfo = new ProximityInfo(mDisplayWidth, mDisplayHeight, GRID_WIDTH, GRID_HEIGHT);
        mProximityInfo = new ProximityInfo(GRID_WIDTH, GRID_HEIGHT);
    }

    public int getProximityInfo() {
@@ -378,7 +378,7 @@ public class Keyboard {
                mGridNeighbors[(y / mCellHeight) * GRID_WIDTH + (x / mCellWidth)] = cell;
            }
        }
        mProximityInfo.setProximityInfo(mGridNeighbors);
        mProximityInfo.setProximityInfo(mGridNeighbors, getMinWidth(), getHeight(), mKeys);
    }

    public boolean isInside(Key key, int x, int y) {
+12 −14
Original line number Diff line number Diff line
@@ -18,18 +18,17 @@ package com.android.inputmethod.keyboard;

import com.android.inputmethod.latin.Utils;

import java.util.Arrays;
import java.util.List;

public class ProximityInfo {
    public static final int MAX_PROXIMITY_CHARS_SIZE = 16;

    private final int mDisplayWidth;
    private final int mDisplayHeight;
    private final int mGridWidth;
    private final int mGridHeight;
    private final int mGridSize;

    ProximityInfo(int displayWidth, int displayHeight, int gridWidth, int gridHeight) {
        mDisplayWidth = displayWidth;
        mDisplayHeight = displayHeight;
    ProximityInfo(int gridWidth, int gridHeight) {
        mGridWidth = gridWidth;
        mGridHeight = gridHeight;
        mGridSize = mGridWidth * mGridHeight;
@@ -43,20 +42,19 @@ public class ProximityInfo {
            int displayHeight, int gridWidth, int gridHeight, int[] proximityCharsArray);
    private native void releaseProximityInfoNative(int nativeProximityInfo);

    public final void setProximityInfo(int[][] gridNeighbors) {
    public final void setProximityInfo(int[][] gridNeighborKeyIndexes, int keyboardWidth,
            int keyboardHeight, List<Key> keys) {
        int[] proximityCharsArray = new int[mGridSize * MAX_PROXIMITY_CHARS_SIZE];
        Arrays.fill(proximityCharsArray, KeyDetector.NOT_A_CODE);
        for (int i = 0; i < mGridSize; ++i) {
            final int proximityCharsLength = gridNeighbors[i].length;
            for (int j = 0; j < MAX_PROXIMITY_CHARS_SIZE; ++j) {
                int charCode = KeyDetector.NOT_A_KEY;
                if (j < proximityCharsLength) {
                    charCode = gridNeighbors[i][j];
                }
                proximityCharsArray[i * MAX_PROXIMITY_CHARS_SIZE + j] = charCode;
            final int proximityCharsLength = gridNeighborKeyIndexes[i].length;
            for (int j = 0; j < proximityCharsLength; ++j) {
                proximityCharsArray[i * MAX_PROXIMITY_CHARS_SIZE + j] =
                        keys.get(gridNeighborKeyIndexes[i][j]).mCode;
            }
        }
        mNativeProximityInfo = setProximityInfoNative(MAX_PROXIMITY_CHARS_SIZE,
                mDisplayWidth, mDisplayHeight, mGridWidth, mGridHeight, proximityCharsArray);
                keyboardWidth, keyboardHeight, mGridWidth, mGridHeight, proximityCharsArray);
    }

    // TODO: Get rid of this function's input (keyboard).
+3 −0
Original line number Diff line number Diff line
@@ -129,10 +129,13 @@ static void prof_out(void) {
#define DICTIONARY_HEADER_SIZE 2
#define NOT_VALID_WORD -99

#define KEYCODE_SPACE ' '

#define SUGGEST_WORDS_WITH_MISSING_CHARACTER true
#define SUGGEST_WORDS_WITH_MISSING_SPACE_CHARACTER true
#define SUGGEST_WORDS_WITH_EXCESSIVE_CHARACTER true
#define SUGGEST_WORDS_WITH_TRANSPOSED_CHARACTERS true
#define SUGGEST_WORDS_WITH_SPACE_PROXIMITY true

// The following "rate"s are used as a multiplier before dividing by 100, so they are in percent.
#define WORDS_WITH_MISSING_CHARACTER_DEMOTION_RATE 75
+36 −6
Original line number Diff line number Diff line
@@ -17,18 +17,48 @@
#include <stdio.h>
#include <string.h>

#define LOG_TAG "LatinIME: proximity_info.cpp"

#include "proximity_info.h"

namespace latinime {
ProximityInfo::ProximityInfo(int maxProximityCharsSize, int displayWidth, int displayHeight,
        int gridWidth, int gridHeight, uint32_t const *proximityCharsArray)
        : MAX_PROXIMITY_CHARS_SIZE(maxProximityCharsSize), DISPLAY_WIDTH(displayWidth),
          DISPLAY_HEIGHT(displayHeight), GRID_WIDTH(gridWidth), GRID_HEIGHT(gridHeight) {
    mProximityCharsArray = new uint32_t[GRID_WIDTH * GRID_HEIGHT * MAX_PROXIMITY_CHARS_SIZE];
    memcpy(mProximityCharsArray, proximityCharsArray, sizeof(mProximityCharsArray));
ProximityInfo::ProximityInfo(const int maxProximityCharsSize, const int keyboardWidth,
        const int keyboardHeight, const int gridWidth, const int gridHeight,
        const uint32_t *proximityCharsArray)
        : MAX_PROXIMITY_CHARS_SIZE(maxProximityCharsSize), KEYBOARD_WIDTH(keyboardWidth),
          KEYBOARD_HEIGHT(keyboardHeight), GRID_WIDTH(gridWidth), GRID_HEIGHT(gridHeight),
          CELL_WIDTH((keyboardWidth + gridWidth - 1) / gridWidth),
          CELL_HEIGHT((keyboardHeight + gridHeight - 1) / gridHeight) {
    const int len = GRID_WIDTH * GRID_HEIGHT * MAX_PROXIMITY_CHARS_SIZE;
    mProximityCharsArray = new uint32_t[len];
    if (DEBUG_PROXIMITY_INFO) {
        LOGI("Create proximity info array %d", len);
    }
    memcpy(mProximityCharsArray, proximityCharsArray, len * sizeof(mProximityCharsArray[0]));
}

ProximityInfo::~ProximityInfo() {
    delete[] mProximityCharsArray;
}

inline int ProximityInfo::getStartIndexFromCoordinates(const int x, const int y) const {
    return (y / CELL_HEIGHT) * GRID_WIDTH + (x / CELL_WIDTH)
            * MAX_PROXIMITY_CHARS_SIZE;
}

bool ProximityInfo::hasSpaceProximity(const int x, const int y) const {
    const int startIndex = getStartIndexFromCoordinates(x, y);
    if (DEBUG_PROXIMITY_INFO) {
        LOGI("hasSpaceProximity: index %d", startIndex);
    }
    for (int i = 0; i < MAX_PROXIMITY_CHARS_SIZE; ++i) {
        if (DEBUG_PROXIMITY_INFO) {
            LOGI("Index: %d", mProximityCharsArray[startIndex + i]);
        }
        if (mProximityCharsArray[startIndex + i] == KEYCODE_SPACE) {
            return true;
        }
    }
    return false;
}
}  // namespace latinime
+10 −5
Original line number Diff line number Diff line
@@ -25,15 +25,20 @@ namespace latinime {

class ProximityInfo {
public:
    ProximityInfo(int maxProximityCharsSize, int displayWidth, int displayHeight, int gridWidth,
            int gridHeight, uint32_t const *proximityCharsArray);
    ProximityInfo(const int maxProximityCharsSize, const int keyboardWidth,
            const int keybaordHeight, const int gridWidth, const int gridHeight,
            const uint32_t *proximityCharsArray);
    ~ProximityInfo();
    bool hasSpaceProximity(const int x, const int y) const;
private:
    const int MAX_PROXIMITY_CHARS_SIZE;
    const int DISPLAY_WIDTH;
    const int DISPLAY_HEIGHT;
    int getStartIndexFromCoordinates(const int x, const int y) const;
    const int CELL_WIDTH;
    const int CELL_HEIGHT;
    const int KEYBOARD_WIDTH;
    const int KEYBOARD_HEIGHT;
    const int GRID_WIDTH;
    const int GRID_HEIGHT;
    const int MAX_PROXIMITY_CHARS_SIZE;
    uint32_t *mProximityCharsArray;
};
}; // namespace latinime
Loading