allow loading external gesture typing library

This commit is contained in:
Helium314 2023-06-28 09:27:07 +02:00
parent ac7ac4f907
commit 8123c79523
38 changed files with 187 additions and 61 deletions

View file

@ -16,11 +16,11 @@ Plan / to do:
* test whether it works reasonably well in non-latin scripts * test whether it works reasonably well in non-latin scripts
* ~suggestion fixes, https://github.com/openboard-team/openboard/pull/694, https://github.com/openboard-team/openboard/issues/795, https://github.com/openboard-team/openboard/issues/660~ * ~suggestion fixes, https://github.com/openboard-team/openboard/pull/694, https://github.com/openboard-team/openboard/issues/795, https://github.com/openboard-team/openboard/issues/660~
* ~improve auto-space insertion, https://github.com/openboard-team/openboard/pull/576~ * ~improve auto-space insertion, https://github.com/openboard-team/openboard/pull/576~
* emoji prediction/search, either https://github.com/openboard-team/openboard/pull/749 or use dictionaries * emoji prediction/search, either https://github.com/openboard-team/openboard/pull/749 (using emoji dictionaries already possible)
* theming, https://github.com/openboard-team/openboard/issues/124 * theming, https://github.com/openboard-team/openboard/issues/124
* delete suggestions, https://github.com/openboard-team/openboard/issues/106 * delete suggestions, https://github.com/openboard-team/openboard/issues/106
* glide typing, https://github.com/openboard-team/openboard/issues/3 * ~gesture typing, https://github.com/openboard-team/openboard/issues/3~
* license issues, maybe allow using an external library * ~license issues, require using an external library~
* re-consider preferring lowercase word for typed history in some cases (DictionaryFacilitatorImpl.addWordToUserHistory) * re-consider preferring lowercase word for typed history in some cases (DictionaryFacilitatorImpl.addWordToUserHistory)
Changes: Changes:
@ -38,6 +38,9 @@ Changes:
* Reduce amount of unwanted automatic space insertions, https://github.com/openboard-team/openboard/pull/576 * Reduce amount of unwanted automatic space insertions, https://github.com/openboard-team/openboard/pull/576
* Exit shift-symbol view on space (same as normal symbol view) * Exit shift-symbol view on space (same as normal symbol view)
* Add multi-lingual typing, slightly modified from https://github.com/openboard-team/openboard/pull/586, https://github.com/openboard-team/openboard/pull/593 * Add multi-lingual typing, slightly modified from https://github.com/openboard-team/openboard/pull/586, https://github.com/openboard-team/openboard/pull/593
* Allow loading an external library to enable gesture typing, https://github.com/openboard-team/openboard/issues/3
* based on wordmage's work https://github.com/openboard-team/openboard/tree/57d33791d7674e3fe0600eddb72f6b4317b5df00
* tested with Google libraries and [others](https://github.com/openboard-team/openboard/issues/3#issuecomment-1200456262) (when building with the [rename](https://github.com/openboard-team/openboard/tree/57d33791d7674e3fe0600eddb72f6b4317b5df00))
----- -----

View file

@ -14,11 +14,12 @@
* limitations under the License. * limitations under the License.
*/ */
package org.dslul.openboard.inputmethod.keyboard; package com.android.inputmethod.keyboard;
import android.graphics.Rect; import android.graphics.Rect;
import android.util.Log; import android.util.Log;
import org.dslul.openboard.inputmethod.keyboard.Key;
import org.dslul.openboard.inputmethod.keyboard.internal.TouchPositionCorrection; import org.dslul.openboard.inputmethod.keyboard.internal.TouchPositionCorrection;
import org.dslul.openboard.inputmethod.latin.common.Constants; import org.dslul.openboard.inputmethod.latin.common.Constants;
import org.dslul.openboard.inputmethod.latin.utils.JniUtils; import org.dslul.openboard.inputmethod.latin.utils.JniUtils;
@ -58,7 +59,7 @@ public class ProximityInfo {
private final List<Key>[] mGridNeighbors; private final List<Key>[] mGridNeighbors;
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
ProximityInfo(final int gridWidth, final int gridHeight, final int minWidth, final int height, public ProximityInfo(final int gridWidth, final int gridHeight, final int minWidth, final int height,
final int mostCommonKeyWidth, final int mostCommonKeyHeight, final int mostCommonKeyWidth, final int mostCommonKeyHeight,
@Nonnull final List<Key> sortedKeys, @Nonnull final List<Key> sortedKeys,
@Nonnull final TouchPositionCorrection touchPositionCorrection) { @Nonnull final TouchPositionCorrection touchPositionCorrection) {
@ -95,7 +96,7 @@ public class ProximityInfo {
private static native void releaseProximityInfoNative(long nativeProximityInfo); private static native void releaseProximityInfoNative(long nativeProximityInfo);
static boolean needsProximityInfo(final Key key) { public static boolean needsProximityInfo(final Key key) {
// Don't include special keys into ProximityInfo. // Don't include special keys into ProximityInfo.
return key.getCode() >= Constants.CODE_SPACE; return key.getCode() >= Constants.CODE_SPACE;
} }

View file

@ -14,13 +14,15 @@
* limitations under the License. * limitations under the License.
*/ */
package org.dslul.openboard.inputmethod.latin; package com.android.inputmethod.latin;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import android.util.SparseArray; import android.util.SparseArray;
import org.dslul.openboard.inputmethod.annotations.UsedForTesting; import org.dslul.openboard.inputmethod.annotations.UsedForTesting;
import org.dslul.openboard.inputmethod.latin.Dictionary;
import org.dslul.openboard.inputmethod.latin.NgramContext;
import org.dslul.openboard.inputmethod.latin.SuggestedWords.SuggestedWordInfo; import org.dslul.openboard.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
import org.dslul.openboard.inputmethod.latin.common.ComposedData; import org.dslul.openboard.inputmethod.latin.common.ComposedData;
import org.dslul.openboard.inputmethod.latin.common.Constants; import org.dslul.openboard.inputmethod.latin.common.Constants;
@ -33,9 +35,9 @@ import org.dslul.openboard.inputmethod.latin.makedict.FormatSpec.DictionaryOptio
import org.dslul.openboard.inputmethod.latin.makedict.UnsupportedFormatException; import org.dslul.openboard.inputmethod.latin.makedict.UnsupportedFormatException;
import org.dslul.openboard.inputmethod.latin.makedict.WordProperty; import org.dslul.openboard.inputmethod.latin.makedict.WordProperty;
import org.dslul.openboard.inputmethod.latin.settings.SettingsValuesForSuggestion; import org.dslul.openboard.inputmethod.latin.settings.SettingsValuesForSuggestion;
import org.dslul.openboard.inputmethod.latin.utils.BinaryDictionaryUtils; import com.android.inputmethod.latin.utils.BinaryDictionaryUtils;
import org.dslul.openboard.inputmethod.latin.utils.JniUtils; import org.dslul.openboard.inputmethod.latin.utils.JniUtils;
import org.dslul.openboard.inputmethod.latin.utils.WordInputEventForPersonalization; import com.android.inputmethod.latin.utils.WordInputEventForPersonalization;
import java.io.File; import java.io.File;
import java.util.ArrayList; import java.util.ArrayList;

View file

@ -14,7 +14,7 @@
* limitations under the License. * limitations under the License.
*/ */
package org.dslul.openboard.inputmethod.latin; package com.android.inputmethod.latin;
import org.dslul.openboard.inputmethod.latin.common.NativeSuggestOptions; import org.dslul.openboard.inputmethod.latin.common.NativeSuggestOptions;
import org.dslul.openboard.inputmethod.latin.define.DecoderSpecificConstants; import org.dslul.openboard.inputmethod.latin.define.DecoderSpecificConstants;

View file

@ -14,13 +14,14 @@
* limitations under the License. * limitations under the License.
*/ */
package org.dslul.openboard.inputmethod.latin.utils; package com.android.inputmethod.latin.utils;
import org.dslul.openboard.inputmethod.annotations.UsedForTesting; import org.dslul.openboard.inputmethod.annotations.UsedForTesting;
import org.dslul.openboard.inputmethod.latin.BinaryDictionary; import com.android.inputmethod.latin.BinaryDictionary;
import org.dslul.openboard.inputmethod.latin.common.StringUtils; import org.dslul.openboard.inputmethod.latin.common.StringUtils;
import org.dslul.openboard.inputmethod.latin.makedict.DictionaryHeader; import org.dslul.openboard.inputmethod.latin.makedict.DictionaryHeader;
import org.dslul.openboard.inputmethod.latin.makedict.UnsupportedFormatException; import org.dslul.openboard.inputmethod.latin.makedict.UnsupportedFormatException;
import org.dslul.openboard.inputmethod.latin.utils.JniUtils;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;

View file

@ -14,7 +14,7 @@
* limitations under the License. * limitations under the License.
*/ */
package org.dslul.openboard.inputmethod.latin.utils; package com.android.inputmethod.latin.utils;
import android.util.Log; import android.util.Log;
@ -23,6 +23,7 @@ import org.dslul.openboard.inputmethod.latin.NgramContext;
import org.dslul.openboard.inputmethod.latin.common.StringUtils; import org.dslul.openboard.inputmethod.latin.common.StringUtils;
import org.dslul.openboard.inputmethod.latin.define.DecoderSpecificConstants; import org.dslul.openboard.inputmethod.latin.define.DecoderSpecificConstants;
import org.dslul.openboard.inputmethod.latin.settings.SpacingAndPunctuations; import org.dslul.openboard.inputmethod.latin.settings.SpacingAndPunctuations;
import org.dslul.openboard.inputmethod.latin.utils.DictionaryInfoUtils;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;

View file

@ -18,6 +18,8 @@ package org.dslul.openboard.inputmethod.keyboard;
import android.util.SparseArray; import android.util.SparseArray;
import com.android.inputmethod.keyboard.ProximityInfo;
import org.dslul.openboard.inputmethod.keyboard.internal.KeyVisualAttributes; import org.dslul.openboard.inputmethod.keyboard.internal.KeyVisualAttributes;
import org.dslul.openboard.inputmethod.keyboard.internal.KeyboardIconsSet; import org.dslul.openboard.inputmethod.keyboard.internal.KeyboardIconsSet;
import org.dslul.openboard.inputmethod.keyboard.internal.KeyboardParams; import org.dslul.openboard.inputmethod.keyboard.internal.KeyboardParams;

View file

@ -16,6 +16,8 @@
package org.dslul.openboard.inputmethod.keyboard; package org.dslul.openboard.inputmethod.keyboard;
import com.android.inputmethod.keyboard.ProximityInfo;
import org.dslul.openboard.inputmethod.annotations.UsedForTesting; import org.dslul.openboard.inputmethod.annotations.UsedForTesting;
import java.util.ArrayList; import java.util.ArrayList;

View file

@ -26,7 +26,7 @@ import org.dslul.openboard.inputmethod.latin.common.LocaleUtils;
import org.dslul.openboard.inputmethod.latin.define.DecoderSpecificConstants; import org.dslul.openboard.inputmethod.latin.define.DecoderSpecificConstants;
import org.dslul.openboard.inputmethod.latin.makedict.DictionaryHeader; import org.dslul.openboard.inputmethod.latin.makedict.DictionaryHeader;
import org.dslul.openboard.inputmethod.latin.makedict.UnsupportedFormatException; import org.dslul.openboard.inputmethod.latin.makedict.UnsupportedFormatException;
import org.dslul.openboard.inputmethod.latin.utils.BinaryDictionaryUtils; import com.android.inputmethod.latin.utils.BinaryDictionaryUtils;
import org.dslul.openboard.inputmethod.latin.utils.DictionaryInfoUtils; import org.dslul.openboard.inputmethod.latin.utils.DictionaryInfoUtils;
import java.io.File; import java.io.File;

View file

@ -23,6 +23,8 @@ import android.provider.ContactsContract;
import android.provider.ContactsContract.Contacts; import android.provider.ContactsContract.Contacts;
import android.util.Log; import android.util.Log;
import com.android.inputmethod.latin.BinaryDictionary;
import org.dslul.openboard.inputmethod.annotations.ExternallyReferenced; import org.dslul.openboard.inputmethod.annotations.ExternallyReferenced;
import org.dslul.openboard.inputmethod.latin.ContactsManager.ContactsChangedListener; import org.dslul.openboard.inputmethod.latin.ContactsManager.ContactsChangedListener;
import org.dslul.openboard.inputmethod.latin.common.StringUtils; import org.dslul.openboard.inputmethod.latin.common.StringUtils;

View file

@ -19,6 +19,8 @@ package org.dslul.openboard.inputmethod.latin;
import android.content.Context; import android.content.Context;
import android.util.Log; import android.util.Log;
import com.android.inputmethod.latin.BinaryDictionary;
import org.dslul.openboard.inputmethod.annotations.UsedForTesting; import org.dslul.openboard.inputmethod.annotations.UsedForTesting;
import org.dslul.openboard.inputmethod.latin.SuggestedWords.SuggestedWordInfo; import org.dslul.openboard.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
import org.dslul.openboard.inputmethod.latin.common.ComposedData; import org.dslul.openboard.inputmethod.latin.common.ComposedData;
@ -32,7 +34,7 @@ import org.dslul.openboard.inputmethod.latin.settings.SettingsValuesForSuggestio
import org.dslul.openboard.inputmethod.latin.utils.AsyncResultHolder; import org.dslul.openboard.inputmethod.latin.utils.AsyncResultHolder;
import org.dslul.openboard.inputmethod.latin.utils.CombinedFormatUtils; import org.dslul.openboard.inputmethod.latin.utils.CombinedFormatUtils;
import org.dslul.openboard.inputmethod.latin.utils.ExecutorUtils; import org.dslul.openboard.inputmethod.latin.utils.ExecutorUtils;
import org.dslul.openboard.inputmethod.latin.utils.WordInputEventForPersonalization; import com.android.inputmethod.latin.utils.WordInputEventForPersonalization;
import java.io.File; import java.io.File;
import java.util.ArrayList; import java.util.ArrayList;

View file

@ -16,6 +16,8 @@
package org.dslul.openboard.inputmethod.latin; package org.dslul.openboard.inputmethod.latin;
import com.android.inputmethod.latin.BinaryDictionary;
import org.dslul.openboard.inputmethod.latin.SuggestedWords.SuggestedWordInfo; import org.dslul.openboard.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
import org.dslul.openboard.inputmethod.latin.common.ComposedData; import org.dslul.openboard.inputmethod.latin.common.ComposedData;
import org.dslul.openboard.inputmethod.latin.settings.SettingsValuesForSuggestion; import org.dslul.openboard.inputmethod.latin.settings.SettingsValuesForSuggestion;

View file

@ -17,7 +17,6 @@
package org.dslul.openboard.inputmethod.latin; package org.dslul.openboard.inputmethod.latin;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log;
import org.dslul.openboard.inputmethod.keyboard.Keyboard; import org.dslul.openboard.inputmethod.keyboard.Keyboard;
import org.dslul.openboard.inputmethod.keyboard.KeyboardId; import org.dslul.openboard.inputmethod.keyboard.KeyboardId;
@ -27,7 +26,7 @@ import org.dslul.openboard.inputmethod.latin.common.StringUtils;
import org.dslul.openboard.inputmethod.latin.define.DebugFlags; import org.dslul.openboard.inputmethod.latin.define.DebugFlags;
import org.dslul.openboard.inputmethod.latin.settings.SettingsValuesForSuggestion; import org.dslul.openboard.inputmethod.latin.settings.SettingsValuesForSuggestion;
import org.dslul.openboard.inputmethod.latin.utils.AutoCorrectionUtils; import org.dslul.openboard.inputmethod.latin.utils.AutoCorrectionUtils;
import org.dslul.openboard.inputmethod.latin.utils.BinaryDictionaryUtils; import com.android.inputmethod.latin.utils.BinaryDictionaryUtils;
import org.dslul.openboard.inputmethod.latin.utils.SuggestionResults; import org.dslul.openboard.inputmethod.latin.utils.SuggestionResults;
import java.util.ArrayList; import java.util.ArrayList;

View file

@ -26,6 +26,8 @@ import android.provider.UserDictionary.Words;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import com.android.inputmethod.latin.BinaryDictionary;
import org.dslul.openboard.inputmethod.annotations.ExternallyReferenced; import org.dslul.openboard.inputmethod.annotations.ExternallyReferenced;
import org.dslul.openboard.inputmethod.latin.utils.SubtypeLocaleUtils; import org.dslul.openboard.inputmethod.latin.utils.SubtypeLocaleUtils;

View file

@ -2,4 +2,6 @@ package org.dslul.openboard.inputmethod.latin.define
object JniLibName { object JniLibName {
const val JNI_LIB_NAME = "jni_latinime" const val JNI_LIB_NAME = "jni_latinime"
const val JNI_LIB_NAME_GOOGLE = "jni_latinimegoogle"
const val JNI_LIB_IMPORT_FILE_NAME = "libjni_latinime.so"
} }

View file

@ -17,7 +17,7 @@
package org.dslul.openboard.inputmethod.latin.makedict; package org.dslul.openboard.inputmethod.latin.makedict;
import org.dslul.openboard.inputmethod.annotations.UsedForTesting; import org.dslul.openboard.inputmethod.annotations.UsedForTesting;
import org.dslul.openboard.inputmethod.latin.BinaryDictionary; import com.android.inputmethod.latin.BinaryDictionary;
import org.dslul.openboard.inputmethod.latin.utils.CombinedFormatUtils; import org.dslul.openboard.inputmethod.latin.utils.CombinedFormatUtils;
import java.util.Arrays; import java.util.Arrays;

View file

@ -17,7 +17,7 @@
package org.dslul.openboard.inputmethod.latin.makedict; package org.dslul.openboard.inputmethod.latin.makedict;
import org.dslul.openboard.inputmethod.annotations.UsedForTesting; import org.dslul.openboard.inputmethod.annotations.UsedForTesting;
import org.dslul.openboard.inputmethod.latin.BinaryDictionary; import com.android.inputmethod.latin.BinaryDictionary;
import org.dslul.openboard.inputmethod.latin.Dictionary; import org.dslul.openboard.inputmethod.latin.Dictionary;
import org.dslul.openboard.inputmethod.latin.NgramContext; import org.dslul.openboard.inputmethod.latin.NgramContext;
import org.dslul.openboard.inputmethod.latin.NgramContext.WordInfo; import org.dslul.openboard.inputmethod.latin.NgramContext.WordInfo;

View file

@ -20,7 +20,7 @@ import android.content.Context;
import org.dslul.openboard.inputmethod.annotations.ExternallyReferenced; import org.dslul.openboard.inputmethod.annotations.ExternallyReferenced;
import org.dslul.openboard.inputmethod.annotations.UsedForTesting; import org.dslul.openboard.inputmethod.annotations.UsedForTesting;
import org.dslul.openboard.inputmethod.latin.BinaryDictionary; import com.android.inputmethod.latin.BinaryDictionary;
import org.dslul.openboard.inputmethod.latin.Dictionary; import org.dslul.openboard.inputmethod.latin.Dictionary;
import org.dslul.openboard.inputmethod.latin.ExpandableBinaryDictionary; import org.dslul.openboard.inputmethod.latin.ExpandableBinaryDictionary;
import org.dslul.openboard.inputmethod.latin.NgramContext; import org.dslul.openboard.inputmethod.latin.NgramContext;

View file

@ -16,14 +16,25 @@
package org.dslul.openboard.inputmethod.latin.settings; package org.dslul.openboard.inputmethod.latin.settings;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.content.res.Resources; import android.content.res.Resources;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.preference.Preference;
import org.dslul.openboard.inputmethod.latin.AudioAndHapticFeedbackManager; import org.dslul.openboard.inputmethod.latin.AudioAndHapticFeedbackManager;
import org.dslul.openboard.inputmethod.latin.R; import org.dslul.openboard.inputmethod.latin.R;
import org.dslul.openboard.inputmethod.latin.SystemBroadcastReceiver; import org.dslul.openboard.inputmethod.latin.SystemBroadcastReceiver;
import org.dslul.openboard.inputmethod.latin.define.JniLibName;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
/** /**
* "Advanced" settings sub screen. * "Advanced" settings sub screen.
@ -37,6 +48,8 @@ import org.dslul.openboard.inputmethod.latin.SystemBroadcastReceiver;
* - Debug settings * - Debug settings
*/ */
public final class AdvancedSettingsFragment extends SubScreenFragment { public final class AdvancedSettingsFragment extends SubScreenFragment {
private final int REQUEST_CODE_GESTURE_LIBRARY = 570289;
File libfile = null;
@Override @Override
public void onCreate(final Bundle icicle) { public void onCreate(final Bundle icicle) {
super.onCreate(icicle); super.onCreate(icicle);
@ -57,6 +70,66 @@ public final class AdvancedSettingsFragment extends SubScreenFragment {
} }
setupKeyLongpressTimeoutSettings(); setupKeyLongpressTimeoutSettings();
final Preference bla = findPreference("load_gesture_library");
if (bla != null) {
bla.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
// get architecture for telling user which file to use
String abi;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
abi = Build.SUPPORTED_ABIS[0];
} else {
abi = Build.CPU_ABI;
}
// show delete / add dialog
final AlertDialog.Builder builder = new AlertDialog.Builder(context)
.setTitle(R.string.load_gesture_library)
.setMessage(context.getString(R.string.load_gesture_library_message, abi))
.setPositiveButton(R.string.load_gesture_library_button_load, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
final Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT)
.addCategory(Intent.CATEGORY_OPENABLE)
.setType("application/octet-stream");
startActivityForResult(intent, REQUEST_CODE_GESTURE_LIBRARY);
}
})
.setNegativeButton(android.R.string.cancel, null);
libfile = new File(context.getFilesDir().getAbsolutePath() + File.separator + JniLibName.JNI_LIB_IMPORT_FILE_NAME);
if (libfile.exists())
builder.setNeutralButton(R.string.load_gesture_library_button_delete, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
libfile.delete();
Runtime.getRuntime().exit(0);
}
});
builder.show();
return true;
}
});
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent resultData) {
if (requestCode != REQUEST_CODE_GESTURE_LIBRARY || resultCode != Activity.RESULT_OK || resultData == null) return;
if (resultData.getData() != null && libfile != null) {
try {
FileOutputStream out = new FileOutputStream(libfile);
final InputStream in = getActivity().getContentResolver().openInputStream(resultData.getData());
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
out.flush();
Runtime.getRuntime().exit(0);
} catch (IOException e) {
// should inform user
}
}
} }

View file

@ -1,19 +1,3 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.dslul.openboard.inputmethod.latin.settings; package org.dslul.openboard.inputmethod.latin.settings;
import android.app.AlertDialog; import android.app.AlertDialog;

View file

@ -37,7 +37,7 @@ import org.dslul.openboard.inputmethod.latin.common.Constants;
import org.dslul.openboard.inputmethod.latin.common.LocaleUtils; import org.dslul.openboard.inputmethod.latin.common.LocaleUtils;
import org.dslul.openboard.inputmethod.latin.common.StringUtils; import org.dslul.openboard.inputmethod.latin.common.StringUtils;
import org.dslul.openboard.inputmethod.latin.define.DebugFlags; import org.dslul.openboard.inputmethod.latin.define.DebugFlags;
import org.dslul.openboard.inputmethod.latin.utils.BinaryDictionaryUtils; import com.android.inputmethod.latin.utils.BinaryDictionaryUtils;
import org.dslul.openboard.inputmethod.latin.utils.ScriptUtils; import org.dslul.openboard.inputmethod.latin.utils.ScriptUtils;
import org.dslul.openboard.inputmethod.latin.utils.StatsUtils; import org.dslul.openboard.inputmethod.latin.utils.StatsUtils;
import org.dslul.openboard.inputmethod.latin.utils.SuggestionResults; import org.dslul.openboard.inputmethod.latin.utils.SuggestionResults;

View file

@ -18,6 +18,8 @@ package org.dslul.openboard.inputmethod.latin.utils;
import android.util.Log; import android.util.Log;
import com.android.inputmethod.latin.utils.BinaryDictionaryUtils;
import org.dslul.openboard.inputmethod.latin.SuggestedWords.SuggestedWordInfo; import org.dslul.openboard.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
import org.dslul.openboard.inputmethod.latin.define.DebugFlags; import org.dslul.openboard.inputmethod.latin.define.DebugFlags;

View file

@ -24,6 +24,8 @@ import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import android.view.inputmethod.InputMethodSubtype; import android.view.inputmethod.InputMethodSubtype;
import com.android.inputmethod.latin.utils.BinaryDictionaryUtils;
import org.dslul.openboard.inputmethod.annotations.UsedForTesting; import org.dslul.openboard.inputmethod.annotations.UsedForTesting;
import org.dslul.openboard.inputmethod.latin.AssetFileAddress; import org.dslul.openboard.inputmethod.latin.AssetFileAddress;
import org.dslul.openboard.inputmethod.latin.BinaryDictionaryGetter; import org.dslul.openboard.inputmethod.latin.BinaryDictionaryGetter;

View file

@ -16,21 +16,49 @@
package org.dslul.openboard.inputmethod.latin.utils; package org.dslul.openboard.inputmethod.latin.utils;
import android.app.Application;
import android.util.Log; import android.util.Log;
import org.dslul.openboard.inputmethod.latin.define.JniLibName; import org.dslul.openboard.inputmethod.latin.define.JniLibName;
import java.io.File;
public final class JniUtils { public final class JniUtils {
private static final String TAG = JniUtils.class.getSimpleName(); private static final String TAG = JniUtils.class.getSimpleName();
// try loading keyboard libraries
// first try user-provided library
// then try google library for gesture typing (needs library in system, and app as system app)
// finally fall back to internal library
public static boolean sHaveGestureLib = false; public static boolean sHaveGestureLib = false;
static { static {
try {
// first try loading imported library, and fall back to default
String filesDir;
try {
// try using reflection to get (app)context: https://stackoverflow.com/a/38967293
final Application app = (Application) Class.forName("android.app.ActivityThread")
.getMethod("currentApplication").invoke(null, (Object[]) null);
filesDir = app.getFilesDir().getAbsolutePath();
} catch (Exception e) {
// fall back to hardcoded default path, may not work on all phones
filesDir = "/data/data/org.dslul.openboard.inputmethod.latin/files";
}
System.load(filesDir + File.separator + JniLibName.JNI_LIB_IMPORT_FILE_NAME);
sHaveGestureLib = true; // this is an assumption, any way to actually check?
} catch (Throwable t) { // catch everything, maybe provided library simply doesn't work
Log.e(TAG, "Could not load native library " + JniLibName.JNI_LIB_IMPORT_FILE_NAME, t);
try {
System.loadLibrary(JniLibName.JNI_LIB_NAME_GOOGLE);
sHaveGestureLib = true;
} catch (UnsatisfiedLinkError ul) {
Log.e(TAG, "Could not load native library " + JniLibName.JNI_LIB_NAME_GOOGLE, ul);
try { try {
System.loadLibrary(JniLibName.JNI_LIB_NAME); System.loadLibrary(JniLibName.JNI_LIB_NAME);
} catch (UnsatisfiedLinkError ule) { } catch (UnsatisfiedLinkError ule) {
Log.e(TAG, "Could not load native library " + JniLibName.JNI_LIB_NAME, ule); Log.e(TAG, "Could not load native library " + JniLibName.JNI_LIB_NAME, ule);
} }
}
}
} }
private JniUtils() { private JniUtils() {

View file

@ -13,10 +13,10 @@
# limitations under the License. # limitations under the License.
LATIN_IME_JNI_SRC_FILES := \ LATIN_IME_JNI_SRC_FILES := \
org_dslul_openboard_inputmethod_keyboard_ProximityInfo.cpp \ com_android_inputmethod_keyboard_ProximityInfo.cpp \
org_dslul_openboard_inputmethod_latin_BinaryDictionary.cpp \ com_android_inputmethod_latin_BinaryDictionary.cpp \
org_dslul_openboard_inputmethod_latin_BinaryDictionaryUtils.cpp \ com_android_inputmethod_latin_BinaryDictionaryUtils.cpp \
org_dslul_openboard_inputmethod_latin_DicTraverseSession.cpp \ com_android_inputmethod_latin_DicTraverseSession.cpp \
jni_common.cpp jni_common.cpp
LATIN_IME_CORE_SRC_FILES := \ LATIN_IME_CORE_SRC_FILES := \

View file

@ -16,7 +16,7 @@
#define LOG_TAG "LatinIME: jni: ProximityInfo" #define LOG_TAG "LatinIME: jni: ProximityInfo"
#include "org_dslul_openboard_inputmethod_keyboard_ProximityInfo.h" #include "com_android_inputmethod_keyboard_ProximityInfo.h"
#include "defines.h" #include "defines.h"
#include "jni.h" #include "jni.h"
@ -57,7 +57,7 @@ static const JNINativeMethod sMethods[] = {
}; };
int register_ProximityInfo(JNIEnv *env) { int register_ProximityInfo(JNIEnv *env) {
const char *const kClassPathName = "org/dslul/openboard/inputmethod/keyboard/ProximityInfo"; const char *const kClassPathName = "com/android/inputmethod/keyboard/ProximityInfo";
return registerNativeMethods(env, kClassPathName, sMethods, NELEMS(sMethods)); return registerNativeMethods(env, kClassPathName, sMethods, NELEMS(sMethods));
} }
} // namespace latinime } // namespace latinime

View file

@ -16,7 +16,7 @@
#define LOG_TAG "LatinIME: jni: BinaryDictionary" #define LOG_TAG "LatinIME: jni: BinaryDictionary"
#include "org_dslul_openboard_inputmethod_latin_BinaryDictionary.h" #include "com_android_inputmethod_latin_BinaryDictionary.h"
#include <cstring> // for memset() #include <cstring> // for memset()
#include <vector> #include <vector>
@ -717,7 +717,7 @@ static const JNINativeMethod sMethods[] = {
{ {
const_cast<char *>("updateEntriesForInputEventsNative"), const_cast<char *>("updateEntriesForInputEventsNative"),
const_cast<char *>( const_cast<char *>(
"(J[Lorg/dslul/openboard/inputmethod/latin/utils/WordInputEventForPersonalization;I)I"), "(J[Lcom/android/inputmethod/latin/utils/WordInputEventForPersonalization;I)I"),
reinterpret_cast<void *>(latinime_BinaryDictionary_updateEntriesForInputEvents) reinterpret_cast<void *>(latinime_BinaryDictionary_updateEntriesForInputEvents)
}, },
{ {
@ -738,7 +738,7 @@ static const JNINativeMethod sMethods[] = {
}; };
int register_BinaryDictionary(JNIEnv *env) { int register_BinaryDictionary(JNIEnv *env) {
const char *const kClassPathName = "org/dslul/openboard/inputmethod/latin/BinaryDictionary"; const char *const kClassPathName = "com/android/inputmethod/latin/BinaryDictionary";
return registerNativeMethods(env, kClassPathName, sMethods, NELEMS(sMethods)); return registerNativeMethods(env, kClassPathName, sMethods, NELEMS(sMethods));
} }
} // namespace latinime } // namespace latinime

View file

@ -16,7 +16,7 @@
#define LOG_TAG "LatinIME: jni: BinaryDictionaryUtils" #define LOG_TAG "LatinIME: jni: BinaryDictionaryUtils"
#include "org_dslul_openboard_inputmethod_latin_BinaryDictionaryUtils.h" #include "com_android_inputmethod_latin_BinaryDictionaryUtils.h"
#include "defines.h" #include "defines.h"
#include "dictionary/utils/dict_file_writing_utils.h" #include "dictionary/utils/dict_file_writing_utils.h"
@ -99,7 +99,7 @@ static const JNINativeMethod sMethods[] = {
}; };
int register_BinaryDictionaryUtils(JNIEnv *env) { int register_BinaryDictionaryUtils(JNIEnv *env) {
const char *const kClassPathName = "org/dslul/openboard/inputmethod/latin/utils/BinaryDictionaryUtils"; const char *const kClassPathName = "com/android/inputmethod/latin/utils/BinaryDictionaryUtils";
return registerNativeMethods(env, kClassPathName, sMethods, NELEMS(sMethods)); return registerNativeMethods(env, kClassPathName, sMethods, NELEMS(sMethods));
} }
} // namespace latinime } // namespace latinime

View file

@ -16,7 +16,7 @@
#define LOG_TAG "LatinIME: jni: Session" #define LOG_TAG "LatinIME: jni: Session"
#include "org_dslul_openboard_inputmethod_latin_DicTraverseSession.h" #include "com_android_inputmethod_latin_DicTraverseSession.h"
#include "defines.h" #include "defines.h"
#include "dictionary/property/ngram_context.h" #include "dictionary/property/ngram_context.h"
@ -74,7 +74,7 @@ static const JNINativeMethod sMethods[] = {
}; };
int register_DicTraverseSession(JNIEnv *env) { int register_DicTraverseSession(JNIEnv *env) {
const char *const kClassPathName = "org/dslul/openboard/inputmethod/latin/DicTraverseSession"; const char *const kClassPathName = "com/android/inputmethod/latin/DicTraverseSession";
return registerNativeMethods(env, kClassPathName, sMethods, NELEMS(sMethods)); return registerNativeMethods(env, kClassPathName, sMethods, NELEMS(sMethods));
} }
} // namespace latinime } // namespace latinime

View file

@ -18,10 +18,10 @@
#include "jni_common.h" #include "jni_common.h"
#include "org_dslul_openboard_inputmethod_keyboard_ProximityInfo.h" #include "com_android_inputmethod_keyboard_ProximityInfo.h"
#include "org_dslul_openboard_inputmethod_latin_BinaryDictionary.h" #include "com_android_inputmethod_latin_BinaryDictionary.h"
#include "org_dslul_openboard_inputmethod_latin_BinaryDictionaryUtils.h" #include "com_android_inputmethod_latin_BinaryDictionaryUtils.h"
#include "org_dslul_openboard_inputmethod_latin_DicTraverseSession.h" #include "com_android_inputmethod_latin_DicTraverseSession.h"
#include "defines.h" #include "defines.h"
/* /*

View file

@ -29,7 +29,7 @@
name="touch_position_correction_data_default" name="touch_position_correction_data_default"
translatable="false" translatable="false"
> >
<!-- The default touch position data (See org.dslul.openboard.inputmethod.keyboard.ProximityInfo) <!-- The default touch position data (See com.android.inputmethod.keyboard.ProximityInfo)
correctionX = 0.0f correctionX = 0.0f
correctionY = 0.0f correctionY = 0.0f
correctionR = DEFAULT_TOUCH_POSITION_CORRECTION_RADIUS correctionR = DEFAULT_TOUCH_POSITION_CORRECTION_RADIUS
@ -40,7 +40,7 @@
name="touch_position_correction_data_holo" name="touch_position_correction_data_holo"
translatable="false" translatable="false"
> >
<!-- The default touch position data (See org.dslul.openboard.inputmethod.keyboard.ProximityInfo) <!-- The default touch position data (See com.android.inputmethod.keyboard.ProximityInfo)
correctionX = 0.0f correctionX = 0.0f
correctionY = 0.0f correctionY = 0.0f
correctionR = DEFAULT_TOUCH_POSITION_CORRECTION_RADIUS correctionR = DEFAULT_TOUCH_POSITION_CORRECTION_RADIUS

View file

@ -194,6 +194,17 @@
<string name="secondary_locale_none">None</string> <string name="secondary_locale_none">None</string>
<!-- Message shown when no secondary locales available --> <!-- Message shown when no secondary locales available -->
<string name="no_secondary_locales">No secondary dictionaries available</string> <string name="no_secondary_locales">No secondary dictionaries available</string>
<!-- Preferences item for loading an external gesture typing library -->
<string name="load_gesture_library">Load gesture typing library</string>
<!-- Description for "load_gesture_library" option -->
<string name="load_gesture_library_summary">Provide a native library to enable gesture typing</string>
<!-- Message in load gesture library dialog -->
<string name="load_gesture_library_message">You will need the library for \'%s\'. Incompatible libraries may crash when using gesture typing.
\n\nWarning: loading external code can be a security risk. Only use a library from a source you trust.</string>
<!-- Button text for loading gesture library -->
<string name="load_gesture_library_button_load">Load library</string>
<!-- Button text for deleting gesture library -->
<string name="load_gesture_library_button_delete">Delete library</string>
<!-- Description for "space_trackpad" option. --> <!-- Description for "space_trackpad" option. -->
<string name="space_trackpad_summary">Swipe on the spacebar to move the cursor</string> <string name="space_trackpad_summary">Swipe on the spacebar to move the cursor</string>
<!-- Preferences item for enabling inserting more spaces key --> <!-- Preferences item for enabling inserting more spaces key -->

View file

@ -29,7 +29,7 @@
name="touch_position_correction_data_default" name="touch_position_correction_data_default"
translatable="false" translatable="false"
> >
<!-- The default touch position data (See org.dslul.openboard.inputmethod.keyboard.ProximityInfo) <!-- The default touch position data (See com.android.inputmethod.keyboard.ProximityInfo)
correctionX = 0.0f correctionX = 0.0f
correctionY = 0.0f correctionY = 0.0f
correctionR = DEFAULT_TOUCH_POSITION_CORRECTION_RADIUS correctionR = DEFAULT_TOUCH_POSITION_CORRECTION_RADIUS

View file

@ -88,6 +88,11 @@
android:title="@string/secondary_locale" android:title="@string/secondary_locale"
android:summary="@string/secondary_locale_summary" /> android:summary="@string/secondary_locale_summary" />
<Preference
android:key="load_gesture_library"
android:title="@string/load_gesture_library"
android:summary="@string/load_gesture_library_summary" />
</PreferenceCategory> </PreferenceCategory>
</PreferenceScreen> </PreferenceScreen>