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

Commit 43149e45 authored by Yusuke Nojima's avatar Yusuke Nojima Committed by Android (Google) Code Review
Browse files

Merge "Pass the touch position correction data to native."

parents 4866758a ad35835b
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -50,6 +50,7 @@ $(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/app/LatinIME.apk)
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/SHARED_LIBRARIES/libjni_latinime_intermediates)
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/SHARED_LIBRARIES/libjni_latinime_intermediates)
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/SHARED_LIBRARIES/libjni_latinime_intermediates)
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/SHARED_LIBRARIES/libjni_latinime_intermediates)
# ************************************************
# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
# ************************************************
+1 −1
Original line number Diff line number Diff line
@@ -138,7 +138,7 @@ public class Keyboard {

        mProximityInfo = new ProximityInfo(
                params.GRID_WIDTH, params.GRID_HEIGHT, mOccupiedWidth, mOccupiedHeight,
                mMostCommonKeyWidth, mKeys, params.mTouchPositionCorrectionXs,
                mMostCommonKeyWidth, mMostCommonKeyHeight, mKeys, params.mTouchPositionCorrectionXs,
                params.mTouchPositionCorrectionYs, params.mTouchPositionCorrectionRadii);
    }

+58 −13
Original line number Diff line number Diff line
@@ -16,6 +16,9 @@

package com.android.inputmethod.keyboard;

import android.graphics.Rect;

import com.android.inputmethod.keyboard.Key;
import com.android.inputmethod.latin.Utils;
import com.android.inputmethod.latin.spellcheck.SpellCheckerProximityInfo;

@@ -27,9 +30,9 @@ public class ProximityInfo {
    public static final int MAX_PROXIMITY_CHARS_SIZE = 16;
    /** Number of key widths from current touch point to search for nearest keys. */
    private static float SEARCH_DISTANCE = 1.2f;
    private static final int UNKNOWN_THEME = -1;
    private static final int[] EMPTY_INT_ARRAY = new int[0];

    private final int mKeyHeight;
    private final int mGridWidth;
    private final int mGridHeight;
    private final int mGridSize;
@@ -45,8 +48,8 @@ public class ProximityInfo {
    private final float[] mTouchPositionCorrectionRadii;

    ProximityInfo(int gridWidth, int gridHeight, int minWidth, int height, int keyWidth,
            List<Key> keys, float[] touchPositionCorrectionXs, float[] touchPositionCorrectionYs,
            float[] touchPositionCorrectionRadii) {
            int keyHeight, List<Key> keys, float[] touchPositionCorrectionXs,
            float[] touchPositionCorrectionYs, float[] touchPositionCorrectionRadii) {
        mGridWidth = gridWidth;
        mGridHeight = gridHeight;
        mGridSize = mGridWidth * mGridHeight;
@@ -54,6 +57,7 @@ public class ProximityInfo {
        mCellHeight = (height + mGridHeight - 1) / mGridHeight;
        mKeyboardMinWidth = minWidth;
        mKeyboardHeight = height;
        mKeyHeight = keyHeight;
        mTouchPositionCorrectionXs = touchPositionCorrectionXs;
        mTouchPositionCorrectionYs = touchPositionCorrectionYs;
        mTouchPositionCorrectionRadii = touchPositionCorrectionRadii;
@@ -66,7 +70,7 @@ public class ProximityInfo {
    }

    public static ProximityInfo createDummyProximityInfo() {
        return new ProximityInfo(1, 1, 1, 1, 1, Collections.<Key>emptyList(), null, null, null);
        return new ProximityInfo(1, 1, 1, 1, 1, 1, Collections.<Key>emptyList(), null, null, null);
    }

    public static ProximityInfo createSpellCheckerProximityInfo() {
@@ -75,7 +79,7 @@ public class ProximityInfo {
                spellCheckerProximityInfo.setProximityInfoNative(
                        SpellCheckerProximityInfo.ROW_SIZE,
                        480, 300, 10, 3, SpellCheckerProximityInfo.PROXIMITY,
                        0, null, null, null, null, null, UNKNOWN_THEME);
                        0, null, null, null, null, null, null, null, null);
        return spellCheckerProximityInfo;
    }

@@ -86,7 +90,8 @@ public class ProximityInfo {
    private native int setProximityInfoNative(int maxProximityCharsSize, int displayWidth,
            int displayHeight, int gridWidth, int gridHeight, int[] proximityCharsArray,
            int keyCount, int[] keyXCoordinates, int[] keyYCoordinates,
            int[] keyWidths, int[] keyHeights, int[] keyCharCodes, int themeId);
            int[] keyWidths, int[] keyHeights, int[] keyCharCodes,
            float[] sweetSpotCenterX, float[] sweetSpotCenterY, float[] sweetSpotRadii);
    private native void releaseProximityInfoNative(int nativeProximityInfo);

    private final void setProximityInfo(int[][] gridNeighborKeyIndexes, int keyboardWidth,
@@ -101,12 +106,11 @@ public class ProximityInfo {
            }
        }
        final int keyCount = keys.size();
        int[] keyXCoordinates = new int[keyCount];
        int[] keyYCoordinates = new int[keyCount];
        int[] keyWidths = new int[keyCount];
        int[] keyHeights = new int[keyCount];
        int[] keyCharCodes = new int[keyCount];
        final int themeId = 5;    // TODO: Use real theme id.
        final int[] keyXCoordinates = new int[keyCount];
        final int[] keyYCoordinates = new int[keyCount];
        final int[] keyWidths = new int[keyCount];
        final int[] keyHeights = new int[keyCount];
        final int[] keyCharCodes = new int[keyCount];
        for (int i = 0; i < keyCount; ++i) {
            final Key key = keys.get(i);
            keyXCoordinates[i] = key.mX;
@@ -115,10 +119,51 @@ public class ProximityInfo {
            keyHeights[i] = key.mHeight;
            keyCharCodes[i] = key.mCode;
        }

        final boolean hasTouchPositionCorrectionData =
                mTouchPositionCorrectionXs != null
                && mTouchPositionCorrectionYs != null
                && mTouchPositionCorrectionRadii != null
                && mTouchPositionCorrectionXs.length > 0
                && mTouchPositionCorrectionYs.length > 0
                && mTouchPositionCorrectionRadii.length > 0;
        final float[] sweetSpotCenterXs =
                hasTouchPositionCorrectionData ? new float[keyCount] : null;
        final float[] sweetSpotCenterYs =
                hasTouchPositionCorrectionData ? new float[keyCount] : null;
        final float[] sweetSpotRadii =
                hasTouchPositionCorrectionData ? new float[keyCount] : null;
        if (hasTouchPositionCorrectionData) {
            calculateSweetSpot(keys, sweetSpotCenterXs, sweetSpotCenterYs, sweetSpotRadii);
        }

        mNativeProximityInfo = setProximityInfoNative(MAX_PROXIMITY_CHARS_SIZE,
                keyboardWidth, keyboardHeight, mGridWidth, mGridHeight, proximityCharsArray,
                keyCount, keyXCoordinates, keyYCoordinates, keyWidths, keyHeights, keyCharCodes,
                themeId);
                sweetSpotCenterXs, sweetSpotCenterYs, sweetSpotRadii);
    }

    private void calculateSweetSpot(List<Key> keys, float[] sweetSpotCenterXs,
            float[] sweetSpotCenterYs, float[] sweetSpotRadii) {
        final int keyCount = keys.size();
        for (int i = 0; i < keyCount; ++i) {
            final Key key = keys.get(i);
            final Rect hitBox = key.mHitBox;
            final int row = hitBox.top / mKeyHeight;
            if (row < mTouchPositionCorrectionRadii.length) {
                final float hitBoxCenterX = (hitBox.left + hitBox.right) * 0.5f;
                final float hitBoxCenterY = (hitBox.top + hitBox.bottom) * 0.5f;
                final float hitBoxWidth = hitBox.right - hitBox.left;
                final float hitBoxHeight = hitBox.bottom - hitBox.top;
                final float x = mTouchPositionCorrectionXs[row];
                final float y = mTouchPositionCorrectionYs[row];
                final float radius = mTouchPositionCorrectionRadii[row];
                sweetSpotCenterXs[i] = hitBoxCenterX + x * hitBoxWidth;
                sweetSpotCenterYs[i] = hitBoxCenterY + y * hitBoxHeight;
                sweetSpotRadii[i] = radius
                        * (float)Math.sqrt(hitBoxWidth * hitBoxWidth + hitBoxHeight * hitBoxHeight);
            }
        }
    }

    public int getNativeProximityInfo() {
+13 −3
Original line number Diff line number Diff line
@@ -32,18 +32,27 @@ static jint latinime_Keyboard_setProximityInfo(JNIEnv *env, jobject object,
        jint maxProximityCharsSize, jint displayWidth, jint displayHeight, jint gridWidth,
        jint gridHeight, jintArray proximityCharsArray, jint keyCount,
        jintArray keyXCoordinateArray, jintArray keyYCoordinateArray, jintArray keyWidthArray,
        jintArray keyHeightArray, jintArray keyCharCodeArray, jint themeId) {
        jintArray keyHeightArray, jintArray keyCharCodeArray,
        jfloatArray sweetSpotCenterXArray, jfloatArray sweetSpotCenterYArray,
        jfloatArray sweetSpotRadiusArray) {
    jint *proximityChars = env->GetIntArrayElements(proximityCharsArray, NULL);
    jint *keyXCoordinates = safeGetIntArrayElements(env, keyXCoordinateArray);
    jint *keyYCoordinates = safeGetIntArrayElements(env, keyYCoordinateArray);
    jint *keyWidths = safeGetIntArrayElements(env, keyWidthArray);
    jint *keyHeights = safeGetIntArrayElements(env, keyHeightArray);
    jint *keyCharCodes = safeGetIntArrayElements(env, keyCharCodeArray);
    jfloat *sweetSpotCenterXs = safeGetFloatArrayElements(env, sweetSpotCenterXArray);
    jfloat *sweetSpotCenterYs = safeGetFloatArrayElements(env, sweetSpotCenterYArray);
    jfloat *sweetSpotRadii = safeGetFloatArrayElements(env, sweetSpotRadiusArray);
    ProximityInfo *proximityInfo = new ProximityInfo(maxProximityCharsSize, displayWidth,
            displayHeight, gridWidth, gridHeight, (const uint32_t*)proximityChars,
            keyCount, (const int32_t*)keyXCoordinates, (const int32_t*)keyYCoordinates,
            (const int32_t*)keyWidths, (const int32_t*)keyHeights, (const int32_t*)keyCharCodes,
            themeId);
            (const float*)sweetSpotCenterXs, (const float*)sweetSpotCenterYs,
            (const float*)sweetSpotRadii);
    safeReleaseFloatArrayElements(env, sweetSpotRadiusArray, sweetSpotRadii);
    safeReleaseFloatArrayElements(env, sweetSpotCenterYArray, sweetSpotCenterYs);
    safeReleaseFloatArrayElements(env, sweetSpotCenterXArray, sweetSpotCenterXs);
    safeReleaseIntArrayElements(env, keyCharCodeArray, keyCharCodes);
    safeReleaseIntArrayElements(env, keyHeightArray, keyHeights);
    safeReleaseIntArrayElements(env, keyWidthArray, keyWidths);
@@ -60,7 +69,8 @@ static void latinime_Keyboard_release(JNIEnv *env, jobject object, jint proximit
}

static JNINativeMethod sKeyboardMethods[] = {
    {"setProximityInfoNative", "(IIIII[II[I[I[I[I[II)I", (void*)latinime_Keyboard_setProximityInfo},
    {"setProximityInfoNative", "(IIIII[II[I[I[I[I[I[F[F[F)I",
            (void*)latinime_Keyboard_setProximityInfo},
    {"releaseProximityInfoNative", "(I)V", (void*)latinime_Keyboard_release}
};

+14 −0
Original line number Diff line number Diff line
@@ -35,12 +35,26 @@ inline jint *safeGetIntArrayElements(JNIEnv *env, jintArray jArray) {
    }
}

inline jfloat *safeGetFloatArrayElements(JNIEnv *env, jfloatArray jArray) {
    if (jArray) {
        return env->GetFloatArrayElements(jArray, NULL);
    } else {
        return NULL;
    }
}

inline void safeReleaseIntArrayElements(JNIEnv *env, jintArray jArray, jint *cArray) {
    if (jArray) {
        env->ReleaseIntArrayElements(jArray, cArray, 0);
    }
}

inline void safeReleaseFloatArrayElements(JNIEnv *env, jfloatArray jArray, jfloat *cArray) {
    if (jArray) {
        env->ReleaseFloatArrayElements(jArray, cArray, 0);
    }
}

} // namespace latinime

#endif // LATINIME_JNI_COMMON_H
Loading