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

Commit 817e517e authored by satok's avatar satok
Browse files

Add the suggestion algorithm of words with space proximity

Bug: 3311719

Change-Id: Ide12a4a6280103c092fa0f563dd5b9e3f7f5c89b
parent d465e2aa
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