diff --git a/app/src/main/java/com/termux/app/TermuxActivity.java b/app/src/main/java/com/termux/app/TermuxActivity.java
index 0c9f74125b..e6429aa3c4 100644
--- a/app/src/main/java/com/termux/app/TermuxActivity.java
+++ b/app/src/main/java/com/termux/app/TermuxActivity.java
@@ -6,6 +6,7 @@
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
+import android.content.res.Configuration;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
@@ -53,6 +54,7 @@
import com.termux.shared.termux.settings.properties.TermuxAppSharedProperties;
import com.termux.shared.termux.theme.TermuxThemeUtils;
import com.termux.shared.theme.NightMode;
+import com.termux.shared.view.KeyboardUtils;
import com.termux.shared.view.ViewUtils;
import com.termux.terminal.TerminalSession;
import com.termux.terminal.TerminalSessionClient;
@@ -322,6 +324,12 @@ public void onResume() {
mIsOnResumeAfterOnCreate = false;
}
+ @Override
+ public void onConfigurationChanged(@NonNull Configuration newConfig) {
+ super.onConfigurationChanged(newConfig);
+ updateExtraKeysVisibility();
+ }
+
@Override
protected void onStop() {
super.onStop();
@@ -512,7 +520,7 @@ private void setTerminalToolbarView(Bundle savedInstanceState) {
mTermuxTerminalViewClient, mTermuxTerminalSessionActivityClient);
final ViewPager terminalToolbarViewPager = getTerminalToolbarViewPager();
- if (mPreferences.shouldShowTerminalToolbar()) terminalToolbarViewPager.setVisibility(View.VISIBLE);
+ if (shouldExtraKeysBeVisible()) terminalToolbarViewPager.setVisibility(View.VISIBLE);
ViewGroup.LayoutParams layoutParams = terminalToolbarViewPager.getLayoutParams();
mTerminalToolbarDefaultHeight = layoutParams.height;
@@ -544,13 +552,32 @@ public void toggleTerminalToolbar() {
final boolean showNow = mPreferences.toogleShowTerminalToolbar();
Logger.showToast(this, (showNow ? getString(R.string.msg_enabling_terminal_toolbar) : getString(R.string.msg_disabling_terminal_toolbar)), true);
- terminalToolbarViewPager.setVisibility(showNow ? View.VISIBLE : View.GONE);
- if (showNow && isTerminalToolbarTextInputViewSelected()) {
+ boolean visible = showNow && !(mPreferences.isExtraKeysOnlyIfNoHardware() && KeyboardUtils.isHardKeyboardConnected(this));
+ terminalToolbarViewPager.setVisibility(visible ? View.VISIBLE : View.GONE);
+ if (visible && isTerminalToolbarTextInputViewSelected()) {
// Focus the text input view if just revealed.
findViewById(R.id.terminal_toolbar_text_input).requestFocus();
}
}
+ /**
+ * Whether the extra keys toolbar should be visible, considering both the user toolbar toggle
+ * and the "extra keys only if no hardware" setting.
+ */
+ public boolean shouldExtraKeysBeVisible() {
+ return mPreferences.shouldShowTerminalToolbar()
+ && !(mPreferences.isExtraKeysOnlyIfNoHardware() && KeyboardUtils.isHardKeyboardConnected(this));
+ }
+
+ /**
+ * Update extra keys toolbar visibility based on current hardware keyboard state and preferences.
+ */
+ public void updateExtraKeysVisibility() {
+ final ViewPager terminalToolbarViewPager = getTerminalToolbarViewPager();
+ if (terminalToolbarViewPager == null) return;
+ terminalToolbarViewPager.setVisibility(shouldExtraKeysBeVisible() ? View.VISIBLE : View.GONE);
+ }
+
private void saveTerminalToolbarTextInput(Bundle savedInstanceState) {
if (savedInstanceState == null) return;
diff --git a/app/src/main/java/com/termux/app/fragments/settings/termux/TerminalIOPreferencesFragment.java b/app/src/main/java/com/termux/app/fragments/settings/termux/TerminalIOPreferencesFragment.java
index f8504f43fd..96aa676557 100644
--- a/app/src/main/java/com/termux/app/fragments/settings/termux/TerminalIOPreferencesFragment.java
+++ b/app/src/main/java/com/termux/app/fragments/settings/termux/TerminalIOPreferencesFragment.java
@@ -60,6 +60,9 @@ public void putBoolean(String key, boolean value) {
case "soft_keyboard_enabled_only_if_no_hardware":
mPreferences.setSoftKeyboardEnabledOnlyIfNoHardware(value);
break;
+ case "extra_keys_only_if_no_hardware":
+ mPreferences.setExtraKeysOnlyIfNoHardware(value);
+ break;
default:
break;
}
@@ -74,6 +77,8 @@ public boolean getBoolean(String key, boolean defValue) {
return mPreferences.isSoftKeyboardEnabled();
case "soft_keyboard_enabled_only_if_no_hardware":
return mPreferences.isSoftKeyboardEnabledOnlyIfNoHardware();
+ case "extra_keys_only_if_no_hardware":
+ return mPreferences.isExtraKeysOnlyIfNoHardware();
default:
return false;
}
diff --git a/app/src/main/java/com/termux/app/terminal/TermuxTerminalViewClient.java b/app/src/main/java/com/termux/app/terminal/TermuxTerminalViewClient.java
index 700c5e5098..9f2646406d 100644
--- a/app/src/main/java/com/termux/app/terminal/TermuxTerminalViewClient.java
+++ b/app/src/main/java/com/termux/app/terminal/TermuxTerminalViewClient.java
@@ -113,6 +113,9 @@ public void onResume() {
// Show the soft keyboard if required
setSoftKeyboardState(true, mActivity.isActivityRecreated());
+ // Update extra keys visibility based on hardware keyboard state
+ mActivity.updateExtraKeysVisibility();
+
mTerminalCursorBlinkerStateAlreadySet = false;
if (mActivity.getTerminalView().mEmulator != null) {
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index cbd2992ba1..b5c22dd95c 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -188,6 +188,11 @@
Soft keyboard will be enabled only if
no hardware keyboard is connected.
+
+ Extra Keys Only If No Hardware
+ Extra keys will be shown regardless of hardware keyboard. (Default)
+ Extra keys will be hidden when hardware keyboard is connected.
+
Terminal View
diff --git a/app/src/main/res/xml/termux_terminal_io_preferences.xml b/app/src/main/res/xml/termux_terminal_io_preferences.xml
index ea9a0eb509..1f26fad721 100644
--- a/app/src/main/res/xml/termux_terminal_io_preferences.xml
+++ b/app/src/main/res/xml/termux_terminal_io_preferences.xml
@@ -16,6 +16,12 @@
app:summaryOn="@string/termux_soft_keyboard_enabled_only_if_no_hardware_on"
app:title="@string/termux_soft_keyboard_enabled_only_if_no_hardware_title" />
+
+
diff --git a/termux-shared/src/main/java/com/termux/shared/termux/settings/preferences/TermuxAppSharedPreferences.java b/termux-shared/src/main/java/com/termux/shared/termux/settings/preferences/TermuxAppSharedPreferences.java
index cd3812fe49..7fd2b7e447 100644
--- a/termux-shared/src/main/java/com/termux/shared/termux/settings/preferences/TermuxAppSharedPreferences.java
+++ b/termux-shared/src/main/java/com/termux/shared/termux/settings/preferences/TermuxAppSharedPreferences.java
@@ -110,6 +110,14 @@ public void setSoftKeyboardEnabledOnlyIfNoHardware(boolean value) {
SharedPreferenceUtils.setBoolean(mSharedPreferences, TERMUX_APP.KEY_SOFT_KEYBOARD_ENABLED_ONLY_IF_NO_HARDWARE, value, false);
}
+ public boolean isExtraKeysOnlyIfNoHardware() {
+ return SharedPreferenceUtils.getBoolean(mSharedPreferences, TERMUX_APP.KEY_EXTRA_KEYS_ONLY_IF_NO_HARDWARE, TERMUX_APP.DEFAULT_VALUE_EXTRA_KEYS_ONLY_IF_NO_HARDWARE);
+ }
+
+ public void setExtraKeysOnlyIfNoHardware(boolean value) {
+ SharedPreferenceUtils.setBoolean(mSharedPreferences, TERMUX_APP.KEY_EXTRA_KEYS_ONLY_IF_NO_HARDWARE, value, false);
+ }
+
public boolean shouldKeepScreenOn() {
diff --git a/termux-shared/src/main/java/com/termux/shared/termux/settings/preferences/TermuxPreferenceConstants.java b/termux-shared/src/main/java/com/termux/shared/termux/settings/preferences/TermuxPreferenceConstants.java
index 15bc74c9f2..eda702fc10 100644
--- a/termux-shared/src/main/java/com/termux/shared/termux/settings/preferences/TermuxPreferenceConstants.java
+++ b/termux-shared/src/main/java/com/termux/shared/termux/settings/preferences/TermuxPreferenceConstants.java
@@ -117,6 +117,13 @@ public static final class TERMUX_APP {
public static final String KEY_SOFT_KEYBOARD_ENABLED_ONLY_IF_NO_HARDWARE = "soft_keyboard_enabled_only_if_no_hardware";
public static final boolean DEFAULT_VALUE_KEY_SOFT_KEYBOARD_ENABLED_ONLY_IF_NO_HARDWARE = false;
+ /**
+ * Defines the key for whether the extra keys toolbar will be shown only if no hardware keyboard
+ * attached, for cases where users want to use a hardware keyboard instead.
+ */
+ public static final String KEY_EXTRA_KEYS_ONLY_IF_NO_HARDWARE = "extra_keys_only_if_no_hardware";
+ public static final boolean DEFAULT_VALUE_EXTRA_KEYS_ONLY_IF_NO_HARDWARE = false;
+
/**
* Defines the key for whether to always keep screen on.