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

Commit 1caff47e authored by satok's avatar satok
Browse files

Calculate proximity characters in the native code

Bug: 4343280

Change-Id: I6adaf560f7a4f1f96dcb6ec2f61f20ee3001167e
parent 9945f364
Loading
Loading
Loading
Loading
+11 −4
Original line number Diff line number Diff line
@@ -260,12 +260,19 @@ public class KeyDetector {
        final int touchX = getTouchX(x);
        final int touchY = getTouchY(y);

        int minDistance = Integer.MAX_VALUE;
        Key primaryKey = null;
        for (final Key key: mKeyboard.getNearestKeys(touchX, touchY)) {
            if (key.isOnKey(touchX, touchY)) {
                return key;
            final boolean isOnKey = key.isOnKey(touchX, touchY);
            final int distance = key.squaredDistanceToEdge(touchX, touchY);
            // TODO: need to take care of hitbox overlaps
            if (primaryKey == null || distance < minDistance
                    || (distance == minDistance && isOnKey)) {
                minDistance = distance;
                primaryKey = key;
            }
        }
        return null;
        return primaryKey;
    }

    public static String printableCode(Key key) {
+2 −2
Original line number Diff line number Diff line
@@ -140,8 +140,8 @@ public class WordComposer {
            keyX = x;
            keyY = y;
        } else {
            codes = keyDetector.newCodeArray();
            keyDetector.getNearbyCodes(x, y, codes);
            final Key key = keyDetector.detectHitKey(x, y);
            codes = new int[] { key != null ? key.mCode : NOT_A_CODE };
            keyX = keyDetector.getTouchX(x);
            keyY = keyDetector.getTouchY(y);
        }
+57 −18
Original line number Diff line number Diff line
@@ -55,6 +55,7 @@ ProximityInfo::ProximityInfo(const std::string localeStr, const int maxProximity
          mTouchPositionCorrectionEnabled(false) {
    const int proximityGridLength = GRID_WIDTH * GRID_HEIGHT * MAX_PROXIMITY_CHARS_SIZE;
    mProximityCharsArray = new int32_t[proximityGridLength];
    mInputCodes = new int32_t[MAX_PROXIMITY_CHARS_SIZE * MAX_WORD_LENGTH_INTERNAL];
    if (DEBUG_PROXIMITY_INFO) {
        AKLOGI("Create proximity info array %d", proximityGridLength);
    }
@@ -96,6 +97,7 @@ void ProximityInfo::initializeCodeToKeyIndex() {
ProximityInfo::~ProximityInfo() {
    delete[] mNormalizedSquaredDistances;
    delete[] mProximityCharsArray;
    delete[] mInputCodes;
}

inline int ProximityInfo::getStartIndexFromCoordinates(const int x, const int y) const {
@@ -138,7 +140,7 @@ bool ProximityInfo::isOnKey(const int keyId, const int x, const int y) {
int ProximityInfo::squaredDistanceToEdge(const int keyId, const int x, const int y) {
    const int left = mKeyXCoordinates[keyId];
    const int top = mKeyYCoordinates[keyId];
    const int right = left + mKeyWidths[keyId] + 1;
    const int right = left + mKeyWidths[keyId];
    const int bottom = top + mKeyHeights[keyId];
    const int edgeX = x < left ? left : (x > right ? right : x);
    const int edgeY = y < top ? top : (y > bottom ? bottom : y);
@@ -157,10 +159,10 @@ void ProximityInfo::calculateNearbyKeyCodes(
        if (c < KEYCODE_SPACE || c == primaryKey) {
            continue;
        }
        int keyIndex = getKeyIndex(c);
        const int keyIndex = getKeyIndex(c);
        const bool onKey = isOnKey(keyIndex, x, y);
        const int distance = squaredDistanceToEdge(keyIndex, x, y);
        if (onKey || distance < MOST_COMMON_KEY_WIDTH_SQUARE) {
        if (c >= KEYCODE_SPACE && (onKey || distance < MOST_COMMON_KEY_WIDTH_SQUARE)) {
            inputCodes[insertPos++] = c;
            if (insertPos >= MAX_PROXIMITY_CHARS_SIZE) {
                if (DEBUG_DICT) {
@@ -170,6 +172,9 @@ void ProximityInfo::calculateNearbyKeyCodes(
            }
        }
    }
    const int additionalProximitySize =
            AdditionalProximityChars::getAdditionalCharsSize(&mLocaleStr, primaryKey);
    if (additionalProximitySize > 0) {
        inputCodes[insertPos++] = ADDITIONAL_PROXIMITY_CHAR_DELIMITER_CODE;
        if (insertPos >= MAX_PROXIMITY_CHARS_SIZE) {
            if (DEBUG_DICT) {
@@ -178,9 +183,6 @@ void ProximityInfo::calculateNearbyKeyCodes(
            return;
        }

    const int additionalProximitySize =
            AdditionalProximityChars::getAdditionalCharsSize(&mLocaleStr, primaryKey);
    if (additionalProximitySize > 0) {
        const int32_t* additionalProximityChars =
                AdditionalProximityChars::getAdditionalChars(&mLocaleStr, primaryKey);
        for (int j = 0; j < additionalProximitySize; ++j) {
@@ -204,13 +206,46 @@ void ProximityInfo::calculateNearbyKeyCodes(
        }
    }
    // Add a delimiter for the proximity characters
    inputCodes[insertPos] = 0;
    for (int i = insertPos; i < MAX_PROXIMITY_CHARS_SIZE; ++i) {
        inputCodes[i] = NOT_A_CODE;
    }
}

// TODO: Calculate nearby codes here.
void ProximityInfo::setInputParams(const int* inputCodes, const int inputLength,
void ProximityInfo::setInputParams(const int32_t* inputCodes, const int inputLength,
        const int* xCoordinates, const int* yCoordinates) {
    mInputCodes = inputCodes;
    memset(mInputCodes, 0,
            MAX_WORD_LENGTH_INTERNAL * MAX_PROXIMITY_CHARS_SIZE * sizeof(mInputCodes[0]));

    for (int i = 0; i < inputLength; ++i) {
        const int32_t primaryKey = inputCodes[i * MAX_PROXIMITY_CHARS_SIZE];
        const int x = xCoordinates[i];
        const int y = yCoordinates[i];
        int *proximities = &mInputCodes[i * MAX_PROXIMITY_CHARS_SIZE];
        calculateNearbyKeyCodes(x, y, primaryKey, proximities);
    }

    if (DEBUG_PROXIMITY_CHARS) {
        for (int i = 0; i < inputLength; ++i) {
            AKLOGI("---");
            for (int j = 0; j < MAX_PROXIMITY_CHARS_SIZE; ++j) {
                int icc = mInputCodes[i * MAX_PROXIMITY_CHARS_SIZE + j];
                int icfjc = inputCodes[i * MAX_PROXIMITY_CHARS_SIZE + j];
                icc+= 0;
                icfjc += 0;
                AKLOGI("--- (%d)%c,%c", i, icc, icfjc);
                AKLOGI("---             A<%d>,B<%d>", icc, icfjc);
            }
        }
    }
    //Keep for debug, sorry
    //for (int i = 0; i < MAX_WORD_LENGTH_INTERNAL * MAX_PROXIMITY_CHARS_SIZE; ++i) {
    //if (i < inputLength * MAX_PROXIMITY_CHARS_SIZE) {
    //mInputCodes[i] = mInputCodesFromJava[i];
    //} else {
    // mInputCodes[i] = 0;
    // }
    //}
    mInputXCoordinates = xCoordinates;
    mInputYCoordinates = yCoordinates;
    mTouchPositionCorrectionEnabled =
@@ -246,8 +281,9 @@ void ProximityInfo::setInputParams(const int* inputCodes, const int inputLength,
        }
        for (int j = 0; j < MAX_PROXIMITY_CHARS_SIZE && proximityChars[j] > 0; ++j) {
            const int currentChar = proximityChars[j];
            const int keyIndex = getKeyIndex(currentChar);
            const float squaredDistance = calculateNormalizedSquaredDistance(keyIndex, i);
            const float squaredDistance = hasInputCoordinates()
                    ? calculateNormalizedSquaredDistance(getKeyIndex(currentChar), i)
                    : NOT_A_DISTANCE_FLOAT;
            if (squaredDistance >= 0.0f) {
                mNormalizedSquaredDistances[i * MAX_PROXIMITY_CHARS_SIZE + j] =
                        (int)(squaredDistance * NORMALIZED_SQUARED_DISTANCE_SCALING_FACTOR);
@@ -267,7 +303,6 @@ inline float square(const float x) { return x * x; }

float ProximityInfo::calculateNormalizedSquaredDistance(
        const int keyIndex, const int inputIndex) const {
    static const float NOT_A_DISTANCE_FLOAT = -1.0f;
    if (keyIndex == NOT_A_INDEX) {
        return NOT_A_DISTANCE_FLOAT;
    }
@@ -282,8 +317,12 @@ float ProximityInfo::calculateNormalizedSquaredDistance(
    return squaredDistance / squaredRadius;
}

bool ProximityInfo::hasInputCoordinates() const {
    return mInputXCoordinates && mInputYCoordinates;
}

int ProximityInfo::getKeyIndex(const int c) const {
    if (KEY_COUNT == 0 || !mInputXCoordinates || !mInputYCoordinates) {
    if (KEY_COUNT == 0) {
        // We do not have the coordinate data
        return NOT_A_INDEX;
    }
+7 −2
Original line number Diff line number Diff line
@@ -53,7 +53,7 @@ class ProximityInfo {
            const float *sweetSpotCenterYs, const float *sweetSpotRadii);
    ~ProximityInfo();
    bool hasSpaceProximity(const int x, const int y) const;
    void setInputParams(const int *inputCodes, const int inputLength,
    void setInputParams(const int32_t *inputCodes, const int inputLength,
            const int *xCoordinates, const int *yCoordinates);
    const int* getProximityCharsAt(const int index) const;
    unsigned short getPrimaryCharAt(const int index) const;
@@ -77,12 +77,15 @@ class ProximityInfo {
    static const int MAX_KEY_COUNT_IN_A_KEYBOARD = 64;
    // The upper limit of the char code in mCodeToKeyIndex
    static const int MAX_CHAR_CODE = 127;
    static const float NOT_A_DISTANCE_FLOAT = -1.0f;
    static const int NOT_A_CODE = -1;

    int getStartIndexFromCoordinates(const int x, const int y) const;
    void initializeCodeToKeyIndex();
    float calculateNormalizedSquaredDistance(const int keyIndex, const int inputIndex) const;
    float calculateSquaredDistanceFromSweetSpotCenter(
            const int keyIndex, const int inputIndex) const;
    bool hasInputCoordinates() const;
    int getKeyIndex(const int c) const;
    bool hasSweetSpotData(const int keyIndex) const {
        // When there are no calibration data for a key,
@@ -105,7 +108,9 @@ class ProximityInfo {
    const int KEY_COUNT;
    const bool HAS_TOUCH_POSITION_CORRECTION_DATA;
    const std::string mLocaleStr;
    const int *mInputCodes;
    // TODO: remove this
    const int *mInputCodesFromJava;
    int32_t *mInputCodes;
    const int *mInputXCoordinates;
    const int *mInputYCoordinates;
    bool mTouchPositionCorrectionEnabled;