diff --git a/.gitignore b/.gitignore index 1b5e163b47..64bb3d1da2 100644 --- a/.gitignore +++ b/.gitignore @@ -9,4 +9,5 @@ crashreporting.properties keystore.properties key.jks java/res/raw/mozc.data -.cxx \ No newline at end of file +.cxx +java/src/org/futo/inputmethod/keyboard/internal/KeyboardTextsTable.java \ No newline at end of file diff --git a/.gitmodules b/.gitmodules index d9a71aca8b..ef9b2cefb4 100644 --- a/.gitmodules +++ b/.gitmodules @@ -16,3 +16,6 @@ [submodule "java/res-large"] path = java/res-large url = https://gitlab.futo.org/keyboard/keyboard-large-resources.git +[submodule "java/assets/futo-swipe"] + path = java/assets/futo-swipe + url = https://huggingface.co/futo-org/futo-swipe diff --git a/build.gradle b/build.gradle index 7c2dd8e0ac..ff935b94b2 100644 --- a/build.gradle +++ b/build.gradle @@ -366,6 +366,12 @@ android { mlModelBinding true buildConfig true } + + packagingOptions { + jniLibs { + useLegacyPackaging = true + } + } } dependencies { @@ -375,7 +381,7 @@ dependencies { implementation 'androidx.lifecycle:lifecycle-runtime-compose:2.8.4' implementation 'androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4' implementation 'androidx.activity:activity-compose:1.9.1' - implementation platform('androidx.compose:compose-bom:2024.06.00') + implementation platform('androidx.compose:compose-bom:2025.06.00') implementation 'androidx.compose.ui:ui' implementation 'androidx.compose.ui:ui-graphics' implementation 'androidx.compose.ui:ui-tooling-preview' @@ -383,7 +389,7 @@ dependencies { implementation 'com.google.android.material:material:1.12.0' implementation 'androidx.appcompat:appcompat:1.7.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' - implementation 'androidx.navigation:navigation-compose:2.7.7' + implementation 'androidx.navigation:navigation-compose:2.10.0-alpha02' implementation 'com.google.code.findbugs:jsr305:3.0.2' @@ -396,7 +402,7 @@ dependencies { unstableImplementation 'ch.acra:acra-mail:5.11.1' unstableImplementation 'ch.acra:acra-dialog:5.11.1' - implementation 'sh.calvin.reorderable:reorderable:2.2.0' + implementation 'sh.calvin.reorderable:reorderable:3.0.0' //implementation 'com.squareup.okhttp3:okhttp:4.11.0' implementation 'org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.1' @@ -420,6 +426,8 @@ dependencies { implementation files('libs/rime-release.aar') // End for RIME + implementation files('libs/futo-swipe-release.aar') + debugImplementation 'androidx.compose.ui:ui-tooling' debugImplementation 'androidx.compose.ui:ui-test-manifest' diff --git a/common/src/org/futo/inputmethod/latin/common/InputPointers.java b/common/src/org/futo/inputmethod/latin/common/InputPointers.java index a66e020d99..57d62651e0 100644 --- a/common/src/org/futo/inputmethod/latin/common/InputPointers.java +++ b/common/src/org/futo/inputmethod/latin/common/InputPointers.java @@ -16,19 +16,41 @@ package org.futo.inputmethod.latin.common; +import android.util.Log; + import org.futo.inputmethod.annotations.UsedForTesting; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + import javax.annotation.Nonnull; +import kotlin.Pair; + // TODO: This class is not thread-safe. public final class InputPointers { + public static final class GestureSegment { + public final int pointerId; + public final ResizableIntArray x = new ResizableIntArray(0); + public final ResizableIntArray y = new ResizableIntArray(0); + public final ResizableIntArray t = new ResizableIntArray(0); + + public GestureSegment(int pointerId) { + this.pointerId = pointerId; + } + } private static final boolean DEBUG_TIME = false; + private static final boolean DEBUG_TRACE = false; + private static final String TAG = "InputPointers"; private final int mDefaultCapacity; private final ResizableIntArray mXCoordinates; private final ResizableIntArray mYCoordinates; private final ResizableIntArray mPointerIds; private final ResizableIntArray mTimes; + private final ArrayList mGestureSegments = new ArrayList<>(); + private final HashMap mActivePointerSegments = new HashMap<>(); public InputPointers(final int defaultCapacity) { mDefaultCapacity = defaultCapacity; @@ -73,17 +95,27 @@ public void addPointer(final int x, final int y, final int pointerId, final int } public void set(@Nonnull final InputPointers ip) { + if(DEBUG_TRACE) Log.d(TAG, "set " + System.identityHashCode(this) + " ip=" + System.identityHashCode(ip)); mXCoordinates.set(ip.mXCoordinates); mYCoordinates.set(ip.mYCoordinates); mPointerIds.set(ip.mPointerIds); mTimes.set(ip.mTimes); + + mGestureSegments.clear(); + mGestureSegments.addAll(ip.getGestureSegments()); + mActivePointerSegments.clear(); } public void copy(@Nonnull final InputPointers ip) { + if(DEBUG_TRACE) Log.d(TAG, "copy " + System.identityHashCode(this) + " ip=" + System.identityHashCode(ip)); mXCoordinates.copy(ip.mXCoordinates); mYCoordinates.copy(ip.mYCoordinates); mPointerIds.copy(ip.mPointerIds); mTimes.copy(ip.mTimes); + + mGestureSegments.clear(); + mGestureSegments.addAll(ip.getGestureSegments()); + mActivePointerSegments.clear(); } /** @@ -99,6 +131,12 @@ public void copy(@Nonnull final InputPointers ip) { public void append(final int pointerId, @Nonnull final ResizableIntArray times, @Nonnull final ResizableIntArray xCoordinates, @Nonnull final ResizableIntArray yCoordinates, final int startPos, final int length) { + if(DEBUG_TRACE) { + Log.d(TAG, "add " + pointerId + " " + length + " " + System.identityHashCode(this) + " " + Thread.currentThread().getId()); + Log.d(TAG, " x:" + xCoordinates.get(startPos) + "->" + xCoordinates.get(startPos + length - 1)); + Log.d(TAG, " y:" + yCoordinates.get(startPos) + "->" + yCoordinates.get(startPos + length - 1)); + Log.d(TAG, " t:" + times.get(startPos) + "->" + times.get(startPos + length - 1)); + } if (length == 0) { return; } @@ -106,6 +144,27 @@ public void append(final int pointerId, @Nonnull final ResizableIntArray times, mYCoordinates.append(yCoordinates, startPos, length); mPointerIds.fill(pointerId, mPointerIds.getLength(), length); mTimes.append(times, startPos, length); + + GestureSegment seg = mActivePointerSegments.get(pointerId); + if(seg == null) { + Log.e(TAG, "Attempting to append points to pointerId " + pointerId + " which was not pressed down!!"); + return; + } + seg.x.append(xCoordinates, startPos, length); + seg.y.append(yCoordinates, startPos, length); + seg.t.append(times, startPos, length); + } + + public void onPointerDown(final int pointerId) { + if(DEBUG_TRACE) Log.d(TAG, "down " + pointerId + " " + System.identityHashCode(this)); + GestureSegment seg = new GestureSegment(pointerId); + mActivePointerSegments.put(pointerId, seg); + mGestureSegments.add(seg); + + } + public void onPointerUp(final int pointerId) { + if(DEBUG_TRACE) Log.d(TAG, "up " + pointerId + " " + System.identityHashCode(this)); + //mActivePointerSegments.remove(pointerId); } /** @@ -118,9 +177,18 @@ public void shift(final int elementCount) { mYCoordinates.shift(elementCount); mPointerIds.shift(elementCount); mTimes.shift(elementCount); + + for(int i=0; i getGestureSegments() { return mGestureSegments; } + /** * Gets the time each point was registered, in milliseconds, relative to the first event in the * sequence. diff --git a/java/AndroidManifest.xml b/java/AndroidManifest.xml index 4e35aa3b63..f6fc23d292 100644 --- a/java/AndroidManifest.xml +++ b/java/AndroidManifest.xml @@ -27,6 +27,12 @@ + + + + @@ -182,13 +189,20 @@ + tools:node="remove" + tools:ignore="MissingClass" /> + + diff --git a/java/assets/fonts/NotoColorEmoji_api24.ttf b/java/assets/fonts/NotoColorEmoji_api24.ttf new file mode 100644 index 0000000000..f8ac129609 Binary files /dev/null and b/java/assets/fonts/NotoColorEmoji_api24.ttf differ diff --git a/java/assets/futo-swipe b/java/assets/futo-swipe new file mode 160000 index 0000000000..a504628aa1 --- /dev/null +++ b/java/assets/futo-swipe @@ -0,0 +1 @@ +Subproject commit a504628aa184913a1bc23296933e76db113712d3 diff --git a/java/assets/layouts b/java/assets/layouts index 18717a7c84..e382094f56 160000 --- a/java/assets/layouts +++ b/java/assets/layouts @@ -1 +1 @@ -Subproject commit 18717a7c8451da6240df2d6fcb087d9c7b3eab90 +Subproject commit e382094f5635c4bfade2aed55fb60ede3ec3bb82 diff --git a/java/res/values-ar-sw600dp/donottranslate-config-spacing-and-punctuations.xml b/java/assets/spacing-and-punctuations/ar-sw600dp.xml similarity index 100% rename from java/res/values-ar-sw600dp/donottranslate-config-spacing-and-punctuations.xml rename to java/assets/spacing-and-punctuations/ar-sw600dp.xml diff --git a/java/res/values-ar/donottranslate-config-spacing-and-punctuations.xml b/java/assets/spacing-and-punctuations/ar.xml similarity index 100% rename from java/res/values-ar/donottranslate-config-spacing-and-punctuations.xml rename to java/assets/spacing-and-punctuations/ar.xml diff --git a/java/res/values-sw600dp/donottranslate-config-spacing-and-punctuations.xml b/java/assets/spacing-and-punctuations/default-sw600dp.xml similarity index 100% rename from java/res/values-sw600dp/donottranslate-config-spacing-and-punctuations.xml rename to java/assets/spacing-and-punctuations/default-sw600dp.xml diff --git a/java/res/values/donottranslate-config-spacing-and-punctuations.xml b/java/assets/spacing-and-punctuations/default.xml similarity index 100% rename from java/res/values/donottranslate-config-spacing-and-punctuations.xml rename to java/assets/spacing-and-punctuations/default.xml diff --git a/java/res/values-el/donottranslate-config-spacing-and-punctuations.xml b/java/assets/spacing-and-punctuations/el.xml similarity index 100% rename from java/res/values-el/donottranslate-config-spacing-and-punctuations.xml rename to java/assets/spacing-and-punctuations/el.xml diff --git a/java/res/values-fa-sw600dp/donottranslate-config-spacing-and-punctuations.xml b/java/assets/spacing-and-punctuations/fa-sw600dp.xml similarity index 100% rename from java/res/values-fa-sw600dp/donottranslate-config-spacing-and-punctuations.xml rename to java/assets/spacing-and-punctuations/fa-sw600dp.xml diff --git a/java/res/values-fa/donottranslate-config-spacing-and-punctuations.xml b/java/assets/spacing-and-punctuations/fa.xml similarity index 100% rename from java/res/values-fa/donottranslate-config-spacing-and-punctuations.xml rename to java/assets/spacing-and-punctuations/fa.xml diff --git a/java/res/values-fr-rCA/donottranslate-config-spacing-and-punctuations.xml b/java/assets/spacing-and-punctuations/fr-rCA.xml similarity index 100% rename from java/res/values-fr-rCA/donottranslate-config-spacing-and-punctuations.xml rename to java/assets/spacing-and-punctuations/fr-rCA.xml diff --git a/java/res/values-fr/donottranslate-config-spacing-and-punctuations.xml b/java/assets/spacing-and-punctuations/fr.xml similarity index 100% rename from java/res/values-fr/donottranslate-config-spacing-and-punctuations.xml rename to java/assets/spacing-and-punctuations/fr.xml diff --git a/java/res/values-hi/donottranslate-config-spacing-and-punctuations.xml b/java/assets/spacing-and-punctuations/hi.xml similarity index 100% rename from java/res/values-hi/donottranslate-config-spacing-and-punctuations.xml rename to java/assets/spacing-and-punctuations/hi.xml diff --git a/java/res/values-hy/donottranslate-config-spacing-and-punctuations.xml b/java/assets/spacing-and-punctuations/hy.xml similarity index 100% rename from java/res/values-hy/donottranslate-config-spacing-and-punctuations.xml rename to java/assets/spacing-and-punctuations/hy.xml diff --git a/java/res/values-iw-sw600dp/donottranslate-config-spacing-and-punctuations.xml b/java/assets/spacing-and-punctuations/iw-sw600dp.xml similarity index 100% rename from java/res/values-iw-sw600dp/donottranslate-config-spacing-and-punctuations.xml rename to java/assets/spacing-and-punctuations/iw-sw600dp.xml diff --git a/java/res/values-iw/donottranslate-config-spacing-and-punctuations.xml b/java/assets/spacing-and-punctuations/iw.xml similarity index 100% rename from java/res/values-iw/donottranslate-config-spacing-and-punctuations.xml rename to java/assets/spacing-and-punctuations/iw.xml diff --git a/java/res/values-km/donottranslate-config-spacing-and-punctuations.xml b/java/assets/spacing-and-punctuations/km.xml similarity index 100% rename from java/res/values-km/donottranslate-config-spacing-and-punctuations.xml rename to java/assets/spacing-and-punctuations/km.xml diff --git a/java/res/values-lo/donottranslate-config-spacing-and-punctuations.xml b/java/assets/spacing-and-punctuations/lo.xml similarity index 100% rename from java/res/values-lo/donottranslate-config-spacing-and-punctuations.xml rename to java/assets/spacing-and-punctuations/lo.xml diff --git a/java/res/values-th/donottranslate-config-spacing-and-punctuations.xml b/java/assets/spacing-and-punctuations/th.xml similarity index 100% rename from java/res/values-th/donottranslate-config-spacing-and-punctuations.xml rename to java/assets/spacing-and-punctuations/th.xml diff --git a/java/res-large b/java/res-large index 17f3030148..d87d9dbdf3 160000 --- a/java/res-large +++ b/java/res-large @@ -1 +1 @@ -Subproject commit 17f303014869d7a8ea1bef72489bae2141cdbdf8 +Subproject commit d87d9dbdf3966bbe18413be375dab2f6c7bbdfdd diff --git a/java/res/drawable/ripple_emoji_view.xml b/java/res/drawable/ripple_emoji_view.xml index f42fea4aa6..4fcd196066 100644 --- a/java/res/drawable/ripple_emoji_view.xml +++ b/java/res/drawable/ripple_emoji_view.xml @@ -15,7 +15,7 @@ --> + android:color="@android:color/white"> diff --git a/java/res/drawable/swipemodel_indicator.xml b/java/res/drawable/swipemodel_indicator.xml new file mode 100644 index 0000000000..22d90419dd --- /dev/null +++ b/java/res/drawable/swipemodel_indicator.xml @@ -0,0 +1,26 @@ + + + + + diff --git a/java/res/layout/emoji_category.xml b/java/res/layout/emoji_category.xml index 9c3203ffb9..e998741b6b 100644 --- a/java/res/layout/emoji_category.xml +++ b/java/res/layout/emoji_category.xml @@ -4,8 +4,9 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#00000000" - android:paddingTop="24dp" - android:paddingBottom="8dp" - android:paddingLeft="16dp" - android:paddingRight="16dp" - android:textSize="22sp"/> \ No newline at end of file + android:paddingTop="16dp" + android:paddingBottom="4dp" + android:paddingLeft="0dp" + android:paddingRight="0dp" + android:textSize="16sp" + android:fontFamily="sans-serif-medium"/> \ No newline at end of file diff --git a/java/res/raw/gemoji.jsongz b/java/res/raw/gemoji.jsongz index b1a5826cf8..42d112d031 100644 Binary files a/java/res/raw/gemoji.jsongz and b/java/res/raw/gemoji.jsongz differ diff --git a/java/res/values-h1200dp-port/setup-dimens-large-tablet-port.xml b/java/res/values-h1200dp-port/setup-dimens-large-tablet-port.xml deleted file mode 100644 index 59f17d713a..0000000000 --- a/java/res/values-h1200dp-port/setup-dimens-large-tablet-port.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - 72sp - 38sp - 24sp - 24dp - 24sp - 18sp - 20sp - 96dp - 144dp - 48dp - 24dp - 12dp - 16dp - 2dp - 40 - 60 - 24dp - 12dp - 24dp - 24dp - 70 - 30 - diff --git a/java/res/values-h330dp-land/setup-dimens-large-phone-land.xml b/java/res/values-h330dp-land/setup-dimens-large-phone-land.xml deleted file mode 100644 index ae6754cb51..0000000000 --- a/java/res/values-h330dp-land/setup-dimens-large-phone-land.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - 40sp - 22sp - 22sp - 24dp - 20sp - 16sp - 18sp - 16dp - 16dp - 48dp - 24dp - 12dp - 16dp - 2dp - 40 - 60 - 24dp - 10dp - 0dp - 12dp - 70 - 30 - diff --git a/java/res/values-h520dp-land/setup-dimens-small-tablet-land.xml b/java/res/values-h520dp-land/setup-dimens-small-tablet-land.xml deleted file mode 100644 index ed25ae0a6e..0000000000 --- a/java/res/values-h520dp-land/setup-dimens-small-tablet-land.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - 60sp - 32sp - 24sp - 24dp - 24sp - 18sp - 20sp - 32dp - 96dp - 48dp - 24dp - 12dp - 16dp - 2dp - 50 - 50 - 24dp - 12dp - 0dp - 24dp - 80 - 20 - diff --git a/java/res/values-h540dp-port/setup-dimens-large-phone-port.xml b/java/res/values-h540dp-port/setup-dimens-large-phone-port.xml deleted file mode 100644 index 2494060065..0000000000 --- a/java/res/values-h540dp-port/setup-dimens-large-phone-port.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - 48sp - 26sp - 22sp - 24dp - 20sp - 16sp - 18sp - 8dp - 16dp - 48dp - 24dp - 12dp - 16dp - 2dp - 40 - 60 - 24dp - 6dp - 12dp - 12dp - 70 - 30 - diff --git a/java/res/values-h720dp-land/setup-dimens-large-tablet-land.xml b/java/res/values-h720dp-land/setup-dimens-large-tablet-land.xml deleted file mode 100644 index f748983180..0000000000 --- a/java/res/values-h720dp-land/setup-dimens-large-tablet-land.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - 72sp - 38sp - 24sp - 24dp - 24sp - 18sp - 20sp - 96dp - 160dp - 48dp - 24dp - 12dp - 16dp - 2dp - 50 - 50 - 24dp - 12dp - 0dp - 24dp - 80 - 20 - diff --git a/java/res/values-h800dp-port/setup-dimens-small-tablet-port.xml b/java/res/values-h800dp-port/setup-dimens-small-tablet-port.xml deleted file mode 100644 index 9104cad63a..0000000000 --- a/java/res/values-h800dp-port/setup-dimens-small-tablet-port.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - 72sp - 36sp - 24sp - 24dp - 24sp - 18sp - 20sp - 32dp - 64dp - 48dp - 24dp - 12dp - 16dp - 2dp - 40 - 60 - 24dp - 12dp - 24dp - 24dp - 70 - 30 - diff --git a/java/res/values-land/setup-dimens-small-phone-land.xml b/java/res/values-land/setup-dimens-small-phone-land.xml deleted file mode 100644 index ddff86760d..0000000000 --- a/java/res/values-land/setup-dimens-small-phone-land.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - 32sp - 18sp - 18sp - 18dp - 18sp - 14sp - 16sp - 16dp - 12dp - 42dp - 20dp - 10dp - 12dp - 2dp - 40 - 60 - 12dp - 12dp - 0dp - 12dp - 70 - 30 - diff --git a/java/res/values-port/setup-dimens-small-phone-port.xml b/java/res/values-port/setup-dimens-small-phone-port.xml deleted file mode 100644 index 10ee49db82..0000000000 --- a/java/res/values-port/setup-dimens-small-phone-port.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - 40sp - 20sp - 18sp - 18dp - 18sp - 14sp - 16sp - 2dp - 12dp - 42dp - 20dp - 10dp - 12dp - 2dp - 40 - 60 - 16dp - 4dp - 12dp - 12dp - 70 - 30 - diff --git a/java/res/values-v17/setup-styles.xml b/java/res/values-v17/setup-styles.xml deleted file mode 100644 index 8a9d664778..0000000000 --- a/java/res/values-v17/setup-styles.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - diff --git a/java/res/values/setup-styles-common.xml b/java/res/values/setup-styles-common.xml deleted file mode 100644 index 686decfba5..0000000000 --- a/java/res/values/setup-styles-common.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/java/res/values/setup-styles.xml b/java/res/values/setup-styles.xml deleted file mode 100644 index 2d54f2a88b..0000000000 --- a/java/res/values/setup-styles.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - -