mirror of
https://github.com/fankes/termux-app.git
synced 2025-09-07 03:05:18 +08:00
Allow users to enable/disable keyboard instead of just show/hide with keyboard toggle buttons
This `soft-keyboard-toggle-behaviour` key can be used to change the behaviour. The default behaviour is `show/hide`. The user can set the value to `enable/disable` in `termux.properties` file to change default behaviour of keyboard toggle buttons to enable/disable. In this mode, tapping the keyboard toggle button will disable (and hide) the keyboard and tapping on the terminal view will not open the keybaord automatically, until the keyboard toggle button is pressed again manually. This applies to split screen and floating keyboard as well. The keyboard can also be enabled from Settings -> Keyboard I/O -> Soft Keyboard toggle. Running `termux-reload-settings` command will also update the behaviour instantaneously if changed. Fixed issue where "hide-soft-keyboard-on-startup" property wouldn't work if Termux app was switched back from another app. Fixes #1098 Fixed issue where soft keyboard may not show on startup on some devices but it still may fail sometimes. The `TermuxPropertyConstants` class has been updated to `v0.7.0`. Check its Changelog sections for info on changes.
This commit is contained in:
@@ -236,7 +236,7 @@ public final class TermuxActivity extends Activity implements ServiceConnection
|
|||||||
public void onResume() {
|
public void onResume() {
|
||||||
super.onResume();
|
super.onResume();
|
||||||
|
|
||||||
mTermuxTerminalViewClient.setSoftKeyboardState(true);
|
mTermuxTerminalViewClient.setSoftKeyboardState(true, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -768,7 +768,7 @@ public final class TermuxActivity extends Activity implements ServiceConnection
|
|||||||
|
|
||||||
setTerminalToolbarHeight();
|
setTerminalToolbarHeight();
|
||||||
|
|
||||||
mTermuxTerminalViewClient.setSoftKeyboardState(true);
|
mTermuxTerminalViewClient.setSoftKeyboardState(false, true);
|
||||||
|
|
||||||
// To change the activity and drawer theme, activity needs to be recreated.
|
// To change the activity and drawer theme, activity needs to be recreated.
|
||||||
// But this will destroy the activity, and will call the onCreate() again.
|
// But this will destroy the activity, and will call the onCreate() again.
|
||||||
|
@@ -54,6 +54,8 @@ public class TermuxTerminalViewClient extends TermuxTerminalViewClientBase {
|
|||||||
/** Keeping track of the special keys acting as Ctrl and Fn for the soft keyboard and other hardware keys. */
|
/** Keeping track of the special keys acting as Ctrl and Fn for the soft keyboard and other hardware keys. */
|
||||||
boolean mVirtualControlKeyDown, mVirtualFnKeyDown;
|
boolean mVirtualControlKeyDown, mVirtualFnKeyDown;
|
||||||
|
|
||||||
|
private Runnable mShowSoftKeyboardRunnable;
|
||||||
|
|
||||||
private static final String LOG_TAG = "TermuxTerminalViewClient";
|
private static final String LOG_TAG = "TermuxTerminalViewClient";
|
||||||
|
|
||||||
public TermuxTerminalViewClient(TermuxActivity activity, TermuxTerminalSessionClient termuxTerminalSessionClient) {
|
public TermuxTerminalViewClient(TermuxActivity activity, TermuxTerminalSessionClient termuxTerminalSessionClient) {
|
||||||
@@ -77,6 +79,8 @@ public class TermuxTerminalViewClient extends TermuxTerminalViewClientBase {
|
|||||||
public void onSingleTapUp(MotionEvent e) {
|
public void onSingleTapUp(MotionEvent e) {
|
||||||
if (!KeyboardUtils.areDisableSoftKeyboardFlagsSet(mActivity))
|
if (!KeyboardUtils.areDisableSoftKeyboardFlagsSet(mActivity))
|
||||||
KeyboardUtils.showSoftKeyboard(mActivity, mActivity.getTerminalView());
|
KeyboardUtils.showSoftKeyboard(mActivity, mActivity.getTerminalView());
|
||||||
|
else
|
||||||
|
Logger.logVerbose(LOG_TAG, "Not showing keyboard onSingleTapUp since its disabled");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -342,23 +346,40 @@ public class TermuxTerminalViewClient extends TermuxTerminalViewClientBase {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called when user requests the soft keyboard to be toggled via "KEYBOARD" toggle button in
|
* Called when user requests the soft keyboard to be toggled via "KEYBOARD" toggle button in
|
||||||
* drawer or extra keys, or with ctrl+alt+k hardware keyboard shortcut.
|
* drawer or extra keys, or with ctrl+alt+k hardware keyboard shortcut.
|
||||||
*/
|
*/
|
||||||
public void onToggleSoftKeyboardRequest() {
|
public void onToggleSoftKeyboardRequest() {
|
||||||
// If soft keyboard is disabled by user for Termux
|
// If soft keyboard toggle behaviour is enable/disabled
|
||||||
if (!mActivity.getPreferences().getSoftKeyboardEnabled()) {
|
if (mActivity.getProperties().shouldEnableDisableSoftKeyboardOnToggle()) {
|
||||||
|
// If soft keyboard is visible
|
||||||
|
if (!KeyboardUtils.areDisableSoftKeyboardFlagsSet(mActivity)) {
|
||||||
|
Logger.logVerbose(LOG_TAG, "Disabling soft keyboard on toggle");
|
||||||
|
mActivity.getPreferences().setSoftKeyboardEnabled(false);
|
||||||
KeyboardUtils.disableSoftKeyboard(mActivity, mActivity.getTerminalView());
|
KeyboardUtils.disableSoftKeyboard(mActivity, mActivity.getTerminalView());
|
||||||
} else {
|
} else {
|
||||||
|
Logger.logVerbose(LOG_TAG, "Enabling soft keyboard on toggle");
|
||||||
|
mActivity.getPreferences().setSoftKeyboardEnabled(true);
|
||||||
|
KeyboardUtils.clearDisableSoftKeyboardFlags(mActivity);
|
||||||
|
KeyboardUtils.showSoftKeyboard(mActivity, mActivity.getTerminalView());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// If soft keyboard toggle behaviour is show/hide
|
||||||
|
else {
|
||||||
|
// If soft keyboard is disabled by user for Termux
|
||||||
|
if (!mActivity.getPreferences().getSoftKeyboardEnabled()) {
|
||||||
|
Logger.logVerbose(LOG_TAG, "Maintaining disabled soft keyboard on toggle");
|
||||||
|
KeyboardUtils.disableSoftKeyboard(mActivity, mActivity.getTerminalView());
|
||||||
|
} else {
|
||||||
|
Logger.logVerbose(LOG_TAG, "Showing/Hiding soft keyboard on toggle");
|
||||||
KeyboardUtils.clearDisableSoftKeyboardFlags(mActivity);
|
KeyboardUtils.clearDisableSoftKeyboardFlags(mActivity);
|
||||||
KeyboardUtils.toggleSoftKeyboard(mActivity);
|
KeyboardUtils.toggleSoftKeyboard(mActivity);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setSoftKeyboardState(boolean isStartup) {
|
public void setSoftKeyboardState(boolean isStartup, boolean isReloadTermuxProperties) {
|
||||||
// If soft keyboard is disabled by user for Termux
|
// If soft keyboard is disabled by user for Termux
|
||||||
if (!mActivity.getPreferences().getSoftKeyboardEnabled()) {
|
if (!mActivity.getPreferences().getSoftKeyboardEnabled()) {
|
||||||
Logger.logVerbose(LOG_TAG, "Maintaining disabled soft keyboard");
|
Logger.logVerbose(LOG_TAG, "Maintaining disabled soft keyboard");
|
||||||
@@ -374,19 +395,25 @@ public class TermuxTerminalViewClient extends TermuxTerminalViewClientBase {
|
|||||||
if (isStartup && mActivity.getProperties().shouldSoftKeyboardBeHiddenOnStartup()) {
|
if (isStartup && mActivity.getProperties().shouldSoftKeyboardBeHiddenOnStartup()) {
|
||||||
Logger.logVerbose(LOG_TAG, "Hiding soft keyboard on startup");
|
Logger.logVerbose(LOG_TAG, "Hiding soft keyboard on startup");
|
||||||
KeyboardUtils.hideSoftKeyboard(mActivity, mActivity.getTerminalView());
|
KeyboardUtils.hideSoftKeyboard(mActivity, mActivity.getTerminalView());
|
||||||
|
// Required to keep keyboard hidden when Termux app is switched back from another app
|
||||||
|
KeyboardUtils.setSoftKeyboardAlwaysHiddenFlags(mActivity);
|
||||||
} else {
|
} else {
|
||||||
// Force show soft keyboard
|
// Do not force show soft keyboard if termux-reload-settings command was run with hardware keyboard
|
||||||
Logger.logVerbose(LOG_TAG, "Showing soft keyboard");
|
if (isReloadTermuxProperties)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (mShowSoftKeyboardRunnable == null) {
|
||||||
|
mShowSoftKeyboardRunnable = () -> {
|
||||||
|
Logger.logVerbose(LOG_TAG, "Showing soft keyboard on focus change");
|
||||||
KeyboardUtils.showSoftKeyboard(mActivity, mActivity.getTerminalView());
|
KeyboardUtils.showSoftKeyboard(mActivity, mActivity.getTerminalView());
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
mActivity.getTerminalView().setOnFocusChangeListener(new View.OnFocusChangeListener() {
|
mActivity.getTerminalView().setOnFocusChangeListener(new View.OnFocusChangeListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onFocusChange(View view, boolean hasFocus) {
|
public void onFocusChange(View view, boolean hasFocus) {
|
||||||
if (hasFocus) {
|
// Force show soft keyboard if TerminalView has focus and close it if it doesn't
|
||||||
KeyboardUtils.showSoftKeyboard(mActivity, mActivity.getTerminalView());
|
KeyboardUtils.setSoftKeyboardVisibility(mShowSoftKeyboardRunnable, mActivity, mActivity.getTerminalView(), hasFocus);
|
||||||
} else {
|
|
||||||
KeyboardUtils.hideSoftKeyboard(mActivity, mActivity.getTerminalView());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@@ -10,7 +10,7 @@ import java.util.HashSet;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Version: v0.6.0
|
* Version: v0.7.0
|
||||||
*
|
*
|
||||||
* Changelog
|
* Changelog
|
||||||
*
|
*
|
||||||
@@ -33,6 +33,9 @@ import java.util.Set;
|
|||||||
*
|
*
|
||||||
* - 0.6.0 (2021-04-07)
|
* - 0.6.0 (2021-04-07)
|
||||||
* - Updated javadocs.
|
* - Updated javadocs.
|
||||||
|
*
|
||||||
|
* - 0.7.0 (2021-05-09)
|
||||||
|
* - Add `*SOFT_KEYBOARD_TOGGLE_BEHAVIOUR*`.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -166,6 +169,15 @@ public final class TermuxPropertyConstants {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** Defines the key for whether toggle soft keyboard request will show/hide or enable/disable keyboard */
|
||||||
|
public static final String SOFT_KEYBOARD_TOGGLE_BEHAVIOUR = "soft-keyboard-toggle-behaviour"; // Default: "soft-keyboard-toggle-behaviour"
|
||||||
|
|
||||||
|
public static final String IVALUE_SOFT_KEYBOARD_TOGGLE_BEHAVIOUR_SHOW_HIDE = "show/hide";
|
||||||
|
public static final String IVALUE_SOFT_KEYBOARD_TOGGLE_BEHAVIOUR_ENABLE_DISABLE = "enable/disable";
|
||||||
|
public static final String DEFAULT_IVALUE_SOFT_KEYBOARD_TOGGLE_BEHAVIOUR = IVALUE_SOFT_KEYBOARD_TOGGLE_BEHAVIOUR_SHOW_HIDE;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** Defines the set for keys loaded by termux
|
/** Defines the set for keys loaded by termux
|
||||||
@@ -198,7 +210,8 @@ public final class TermuxPropertyConstants {
|
|||||||
// String
|
// String
|
||||||
KEY_DEFAULT_WORKING_DIRECTORY,
|
KEY_DEFAULT_WORKING_DIRECTORY,
|
||||||
KEY_EXTRA_KEYS,
|
KEY_EXTRA_KEYS,
|
||||||
KEY_EXTRA_KEYS_STYLE
|
KEY_EXTRA_KEYS_STYLE,
|
||||||
|
SOFT_KEYBOARD_TOGGLE_BEHAVIOUR
|
||||||
));
|
));
|
||||||
|
|
||||||
/** Defines the set for keys loaded by termux that have default boolean behaviour
|
/** Defines the set for keys loaded by termux that have default boolean behaviour
|
||||||
|
@@ -211,6 +211,8 @@ public class TermuxSharedProperties implements SharedPropertiesParser {
|
|||||||
return (String) getExtraKeysInternalPropertyValueFromValue(value);
|
return (String) getExtraKeysInternalPropertyValueFromValue(value);
|
||||||
case TermuxPropertyConstants.KEY_EXTRA_KEYS_STYLE:
|
case TermuxPropertyConstants.KEY_EXTRA_KEYS_STYLE:
|
||||||
return (String) getExtraKeysStyleInternalPropertyValueFromValue(value);
|
return (String) getExtraKeysStyleInternalPropertyValueFromValue(value);
|
||||||
|
case TermuxPropertyConstants.SOFT_KEYBOARD_TOGGLE_BEHAVIOUR:
|
||||||
|
return (String) getSoftKeyboardToggleBehaviourInternalPropertyValueFromValue(value);
|
||||||
default:
|
default:
|
||||||
// default boolean behaviour
|
// default boolean behaviour
|
||||||
if (TermuxPropertyConstants.TERMUX_DEFAULT_BOOLEAN_BEHAVIOUR_PROPERTIES_LIST.contains(key))
|
if (TermuxPropertyConstants.TERMUX_DEFAULT_BOOLEAN_BEHAVIOUR_PROPERTIES_LIST.contains(key))
|
||||||
@@ -373,6 +375,16 @@ public class TermuxSharedProperties implements SharedPropertiesParser {
|
|||||||
return SharedProperties.getDefaultIfNull(value, TermuxPropertyConstants.DEFAULT_IVALUE_EXTRA_KEYS_STYLE);
|
return SharedProperties.getDefaultIfNull(value, TermuxPropertyConstants.DEFAULT_IVALUE_EXTRA_KEYS_STYLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the value itself if it is not {@code null}, otherwise returns {@link TermuxPropertyConstants#DEFAULT_IVALUE_SOFT_KEYBOARD_TOGGLE_BEHAVIOUR}.
|
||||||
|
*
|
||||||
|
* @param value {@link String} value to convert.
|
||||||
|
* @return Returns the internal value for value.
|
||||||
|
*/
|
||||||
|
public static String getSoftKeyboardToggleBehaviourInternalPropertyValueFromValue(String value) {
|
||||||
|
return SharedProperties.getDefaultIfNull(value, TermuxPropertyConstants.DEFAULT_IVALUE_SOFT_KEYBOARD_TOGGLE_BEHAVIOUR);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -421,6 +433,10 @@ public class TermuxSharedProperties implements SharedPropertiesParser {
|
|||||||
return (String) getInternalPropertyValue(TermuxPropertyConstants.KEY_DEFAULT_WORKING_DIRECTORY, true);
|
return (String) getInternalPropertyValue(TermuxPropertyConstants.KEY_DEFAULT_WORKING_DIRECTORY, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean shouldEnableDisableSoftKeyboardOnToggle() {
|
||||||
|
return (boolean) TermuxPropertyConstants.IVALUE_SOFT_KEYBOARD_TOGGLE_BEHAVIOUR_ENABLE_DISABLE.equals(getInternalPropertyValue(TermuxPropertyConstants.SOFT_KEYBOARD_TOGGLE_BEHAVIOUR, true));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@@ -19,7 +19,9 @@ public class KeyboardUtils {
|
|||||||
|
|
||||||
public static void setSoftKeyboardVisibility(@NonNull final Runnable showSoftKeyboardRunnable, final Activity activity, final View view, final boolean visible) {
|
public static void setSoftKeyboardVisibility(@NonNull final Runnable showSoftKeyboardRunnable, final Activity activity, final View view, final boolean visible) {
|
||||||
if (visible) {
|
if (visible) {
|
||||||
view.postDelayed(showSoftKeyboardRunnable, 1000);
|
// A Runnable with a delay is used, otherwise soft keyboard may not automatically open
|
||||||
|
// on some devices, but still may fail
|
||||||
|
view.postDelayed(showSoftKeyboardRunnable, 500);
|
||||||
} else {
|
} else {
|
||||||
view.removeCallbacks(showSoftKeyboardRunnable);
|
view.removeCallbacks(showSoftKeyboardRunnable);
|
||||||
hideSoftKeyboard(activity, view);
|
hideSoftKeyboard(activity, view);
|
||||||
|
Reference in New Issue
Block a user