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) {