diff --git a/android/KMAPro/kMAPro/src/main/AndroidManifest.xml b/android/KMAPro/kMAPro/src/main/AndroidManifest.xml
index 7196abdb229..3ba7eaf9fca 100644
--- a/android/KMAPro/kMAPro/src/main/AndroidManifest.xml
+++ b/android/KMAPro/kMAPro/src/main/AndroidManifest.xml
@@ -297,6 +297,11 @@
android:configChanges="orientation"
android:label="@string/app_name"
android:theme="@style/AppTheme.Base" />
+
diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/AdjustLongpressDelayActivity.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/AdjustLongpressDelayActivity.java
new file mode 100644
index 00000000000..e45d2a2fb22
--- /dev/null
+++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/AdjustLongpressDelayActivity.java
@@ -0,0 +1,151 @@
+/*
+ * Keyman is copyright (C) SIL International. MIT License.
+ *
+ * (Optional description of this file)
+ */
+package com.tavultesoft.kmapro;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.graphics.drawable.ColorDrawable;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.SeekBar;
+import android.widget.TextView;
+
+import androidx.appcompat.app.ActionBar;
+import androidx.appcompat.widget.Toolbar;
+import androidx.core.content.ContextCompat;
+
+import com.keyman.engine.BaseActivity;
+import com.keyman.engine.KMManager;
+
+/**
+ * Settings menu for adjusting the longpress delay time. The value for the current longpress delay time
+ * is saved in shared preferences as an integer (milliseconds).
+ */
+public class AdjustLongpressDelayActivity extends BaseActivity {
+ private static final String TAG = "AdjustLongpressDelay";
+ public static final String adjustLongpressDelayKey = "AdjustLongpressDelay";
+ private static SharedPreferences.Editor editor = null;
+
+ // Keeps track of the adjusted longpress delay time for saving.
+ // Internally use milliseconds, but GUI displays seconds
+ private static int currentDelayTime = 500; // ms
+ private static int minLongpressTime = 300; // ms
+ private static int maxLongpressTime = 1500; // ms
+ private static int delayTimeIncrement = 200; // ms
+
+ /**
+ * Convert currentDelayTime to progress
+ * @return int
+ */
+ private int delayTimeToProgress() {
+ return (currentDelayTime / delayTimeIncrement) - 1;
+ }
+
+ /**
+ * Convert progress to currentDelayTime
+ * @param progress
+ * @return int (milliseconds)
+ */
+ private int progressToDelayTime(int progress) {
+ return (progress + 1) * delayTimeIncrement + 100;
+ }
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ final Context context = this;
+
+ setContentView(R.layout.activity_adjust_longpress_delay);
+ Toolbar toolbar = (Toolbar) findViewById(R.id.titlebar);
+ setSupportActionBar(toolbar);
+ ActionBar actionBar = getSupportActionBar();
+ if (actionBar != null) {
+ actionBar.setTitle(null);
+ actionBar.setDisplayUseLogoEnabled(false);
+ actionBar.setDisplayHomeAsUpEnabled(true);
+ actionBar.setDisplayShowHomeEnabled(true);
+ actionBar.setDisplayShowTitleEnabled(false);
+ actionBar.setDisplayShowCustomEnabled(true);
+ actionBar.setBackgroundDrawable(new ColorDrawable(ContextCompat.getColor(this, R.color.keyman_blue)));
+ }
+
+ TextView adjustLongpressDelayActivityTitle = (TextView) findViewById(R.id.bar_title);
+
+ String titleStr = getString(R.string.adjust_longpress_delay);
+ adjustLongpressDelayActivityTitle.setTextColor(ContextCompat.getColor(this, R.color.ms_white));
+ adjustLongpressDelayActivityTitle.setText(titleStr);
+
+ SharedPreferences prefs = context.getSharedPreferences(context.getString(R.string.kma_prefs_name), Context.MODE_PRIVATE);
+ editor = prefs.edit();
+ currentDelayTime = KMManager.getLongpressDelay(this);
+
+ TextView adjustLongpressDelayText = (TextView) findViewById(R.id.delayTimeText);
+ String longpressDelayText = String.format(getString(R.string.longpress_delay_time), (float)(currentDelayTime/1000.0));
+ adjustLongpressDelayText.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
+ adjustLongpressDelayText.setText(longpressDelayText);
+
+ final SeekBar seekBar = (SeekBar) findViewById(R.id.seekBar);
+ seekBar.setProgress(delayTimeToProgress());
+ seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
+
+ @Override
+ public void onStopTrackingTouch(SeekBar seekBar) {
+ // Do nothing
+ }
+
+ @Override
+ public void onStartTrackingTouch(SeekBar seekBar) {
+ // Do nothing
+ }
+
+ @Override
+ public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
+ currentDelayTime = progressToDelayTime(progress);
+ String longpressDelayText = String.format(getString(R.string.longpress_delay_time), (float)(currentDelayTime/1000.0));
+ adjustLongpressDelayText.setText(longpressDelayText);
+
+ editor.putInt(KMManager.KMKey_LongpressDelay, currentDelayTime);
+ editor.commit();
+ }
+ });
+
+ findViewById(R.id.delayTimeDownButton).setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if (currentDelayTime > minLongpressTime) {
+ currentDelayTime -= delayTimeIncrement;
+ seekBar.setProgress(delayTimeToProgress());
+ }
+ }
+ });
+
+ findViewById(R.id.delayTimeUpButton).setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if (currentDelayTime < maxLongpressTime) {
+ currentDelayTime += delayTimeIncrement;
+ seekBar.setProgress(delayTimeToProgress());
+ }
+ }
+ });
+ }
+
+ @Override
+ public void onBackPressed() {
+ // Apply the adjusted longpress delay on exit
+ KMManager.setLongpressDelay(currentDelayTime);
+
+ super.onBackPressed();
+ }
+
+ @Override
+ public boolean onSupportNavigateUp() {
+ onBackPressed();
+ return true;
+ }
+
+}
diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsFragment.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsFragment.java
index 72c54aa0d02..95bb7774b0b 100644
--- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsFragment.java
+++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsFragment.java
@@ -28,7 +28,7 @@ public class KeymanSettingsFragment extends PreferenceFragmentCompat {
private static Context context;
private Preference languagesPreference, installKeyboardOrDictionary, displayLanguagePreference,
- adjustKeyboardHeight;
+ adjustKeyboardHeight, adjustLongpressDelay;
private ListPreference spacebarTextPreference;
private CheckBoxPreference setSystemKeyboardPreference;
private CheckBoxPreference setDefaultKeyboardPreference;
@@ -99,6 +99,7 @@ public boolean onPreferenceClick(Preference preference) {
});
setDefaultKeyboardPreference.setOnPreferenceChangeListener(checkBlocker);
+
adjustKeyboardHeight = new Preference(context);
adjustKeyboardHeight.setKey(AdjustKeyboardHeightActivity.adjustKeyboardHeightKey);
adjustKeyboardHeight.setTitle(getString(R.string.adjust_keyboard_height));
@@ -106,6 +107,13 @@ public boolean onPreferenceClick(Preference preference) {
Intent adjustKeyboardHeightIntent = new Intent(context, AdjustKeyboardHeightActivity.class);
adjustKeyboardHeight.setIntent(adjustKeyboardHeightIntent);
+ adjustLongpressDelay = new Preference(context);
+ adjustLongpressDelay.setKey(AdjustLongpressDelayActivity.adjustLongpressDelayKey);
+ adjustLongpressDelay.setTitle(getString(R.string.adjust_longpress_delay));
+ adjustLongpressDelay.setWidgetLayoutResource(R.layout.preference_duration_icon_layout);
+ Intent adjustLongpressDelayIntent = new Intent(context, AdjustLongpressDelayActivity.class);
+ adjustLongpressDelay.setIntent(adjustLongpressDelayIntent);
+
/* Spacebar Caption Preference */
spacebarTextPreference = new ListPreference(context);
@@ -188,8 +196,6 @@ as part of the default onClick() used by SwitchPreference.
sendCrashReportPreference.setSummaryOff(getString(R.string.show_send_crash_report_off));
sendCrashReportPreference.setDefaultValue(true);
-
-
screen.addPreference(languagesPreference);
screen.addPreference(installKeyboardOrDictionary);
screen.addPreference(displayLanguagePreference);
@@ -197,6 +203,7 @@ as part of the default onClick() used by SwitchPreference.
screen.addPreference(setDefaultKeyboardPreference);
screen.addPreference(adjustKeyboardHeight);
+ screen.addPreference(adjustLongpressDelay);
screen.addPreference(spacebarTextPreference);
screen.addPreference(hapticFeedbackPreference);
diff --git a/android/KMAPro/kMAPro/src/main/res/drawable/ic_action_timelapse.xml b/android/KMAPro/kMAPro/src/main/res/drawable/ic_action_timelapse.xml
new file mode 100644
index 00000000000..80dc29e33f9
--- /dev/null
+++ b/android/KMAPro/kMAPro/src/main/res/drawable/ic_action_timelapse.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/android/KMAPro/kMAPro/src/main/res/layout/activity_adjust_longpress_delay.xml b/android/KMAPro/kMAPro/src/main/res/layout/activity_adjust_longpress_delay.xml
new file mode 100644
index 00000000000..ed0bed54a9b
--- /dev/null
+++ b/android/KMAPro/kMAPro/src/main/res/layout/activity_adjust_longpress_delay.xml
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/android/KMAPro/kMAPro/src/main/res/layout/preference_duration_icon_layout.xml b/android/KMAPro/kMAPro/src/main/res/layout/preference_duration_icon_layout.xml
new file mode 100644
index 00000000000..c8fd3a48f98
--- /dev/null
+++ b/android/KMAPro/kMAPro/src/main/res/layout/preference_duration_icon_layout.xml
@@ -0,0 +1,5 @@
+
+
diff --git a/android/KMAPro/kMAPro/src/main/res/values/dimens.xml b/android/KMAPro/kMAPro/src/main/res/values/dimens.xml
index cfcc2f4917f..60e89def04b 100644
--- a/android/KMAPro/kMAPro/src/main/res/values/dimens.xml
+++ b/android/KMAPro/kMAPro/src/main/res/values/dimens.xml
@@ -23,4 +23,5 @@
32dp
16dp
0dp
+ 24sp
diff --git a/android/KMAPro/kMAPro/src/main/res/values/strings.xml b/android/KMAPro/kMAPro/src/main/res/values/strings.xml
index 3cec4f2558c..a1f9e7240d7 100644
--- a/android/KMAPro/kMAPro/src/main/res/values/strings.xml
+++ b/android/KMAPro/kMAPro/src/main/res/values/strings.xml
@@ -113,6 +113,9 @@
Adjust keyboard height
+
+ Adjust longpress delay
+
Spacebar caption
@@ -198,6 +201,17 @@
Reset to Defaults
+
+ Delay Time: %1$.1f seconds
+
+
+ Delay time longer
+
+
+ Delay time shorter
+
+
+ Longpress delay time slider
Search or type URL
diff --git a/android/KMEA/app/src/main/assets/android-host.js b/android/KMEA/app/src/main/assets/android-host.js
index 9c786e17770..93ee0e4b0d3 100644
--- a/android/KMEA/app/src/main/assets/android-host.js
+++ b/android/KMEA/app/src/main/assets/android-host.js
@@ -112,6 +112,11 @@ function notifyHost(event, params) {
}, 10);
}
+// Update the KeymanWeb longpress delay
+// delay is in milliseconds
+function setLongpressDelay(delay) {
+}
+
// Update the KMW banner height
// h is in dpi (different from iOS)
function setBannerHeight(h) {
diff --git a/android/KMEA/app/src/main/java/com/keyman/engine/KMManager.java b/android/KMEA/app/src/main/java/com/keyman/engine/KMManager.java
index 0bbe93b9320..8bb20981262 100644
--- a/android/KMEA/app/src/main/java/com/keyman/engine/KMManager.java
+++ b/android/KMEA/app/src/main/java/com/keyman/engine/KMManager.java
@@ -263,6 +263,8 @@ public enum EnterModeType {
public static final String KMKey_KeyboardHeightPortrait = "keyboardHeightPortrait";
public static final String KMKey_KeyboardHeightLandscape = "keyboardHeightLandscape";
+ public static final String KMKey_LongpressDelay = "longpressDelay";
+
public static final String KMKey_CustomHelpLink = "CustomHelpLink";
public static final String KMKey_KMPLink = "kmp";
public static final String KMKey_UserKeyboardIndex = "UserKeyboardIndex";
@@ -2080,6 +2082,32 @@ public static int getOrientation(Context context) {
return Configuration.ORIENTATION_UNDEFINED;
}
+ /**
+ * Get the long-press delay (in milliseconds)
+ * @param context
+ * @return int - long-press delay in milliseconds
+ */
+ public static int getLongpressDelay(Context context) {
+ int defaultDelay = 500; // default longpress delay in KeymanWeb (ms)
+ SharedPreferences prefs = context.getSharedPreferences(context.getString(R.string.kma_prefs_name), Context.MODE_PRIVATE);
+
+ return prefs.getInt(KMManager.KMKey_LongpressDelay, defaultDelay);
+ }
+
+ /**
+ * Update KeymanWeb with the long-press delay (in milliseconds)
+ * @param longpressDelay - int long-press delay in milliseconds
+ */
+ public static void setLongpressDelay(int longpressDelay) {
+ if (isKeyboardLoaded(KeyboardType.KEYBOARD_TYPE_INAPP)) {
+ InAppKeyboard.loadJavascript(KMString.format("setLongpressDelay(%d)", longpressDelay));
+ }
+
+ if (SystemKeyboard != null) {
+ SystemKeyboard.loadJavascript(KMString.format("setLongpressDelay(%d)", longpressDelay));
+ }
+ }
+
public static int getBannerHeight(Context context) {
int bannerHeight = 0;
if (InAppKeyboard != null && InAppKeyboard.getBanner() != BannerType.BLANK) {