diff --git a/app/src/main/java/com/termux/app/TermuxActivity.java b/app/src/main/java/com/termux/app/TermuxActivity.java index 12989539..593c7726 100644 --- a/app/src/main/java/com/termux/app/TermuxActivity.java +++ b/app/src/main/java/com/termux/app/TermuxActivity.java @@ -38,6 +38,7 @@ import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; +import android.view.autofill.AutofillManager; import android.view.inputmethod.InputMethodManager; import android.widget.ArrayAdapter; import android.widget.EditText; @@ -92,6 +93,7 @@ public final class TermuxActivity extends Activity implements ServiceConnection private static final int CONTEXTMENU_STYLING_ID = 6; private static final int CONTEXTMENU_HELP_ID = 8; private static final int CONTEXTMENU_TOGGLE_KEEP_SCREEN_ON = 9; + private static final int CONTEXTMENU_AUTOFILL_ID = 10; private static final int MAX_SESSIONS = 8; @@ -655,6 +657,12 @@ public final class TermuxActivity extends Activity implements ServiceConnection menu.add(Menu.NONE, CONTEXTMENU_SELECT_URL_ID, Menu.NONE, R.string.select_url); menu.add(Menu.NONE, CONTEXTMENU_SHARE_TRANSCRIPT_ID, Menu.NONE, R.string.select_all_and_share); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + AutofillManager autofillManager = getSystemService(AutofillManager.class); + if (autofillManager != null && autofillManager.isEnabled()) { + menu.add(Menu.NONE, CONTEXTMENU_AUTOFILL_ID, Menu.NONE, R.string.autofill_password); + } + } menu.add(Menu.NONE, CONTEXTMENU_RESET_TERMINAL_ID, Menu.NONE, R.string.reset_terminal); menu.add(Menu.NONE, CONTEXTMENU_KILL_PROCESS_ID, Menu.NONE, getResources().getString(R.string.kill_process, getCurrentTermSession().getPid())).setEnabled(currentSession.isRunning()); menu.add(Menu.NONE, CONTEXTMENU_STYLING_ID, Menu.NONE, R.string.style_terminal); @@ -870,6 +878,14 @@ public final class TermuxActivity extends Activity implements ServiceConnection } return true; } + case CONTEXTMENU_AUTOFILL_ID: { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + AutofillManager autofillManager = getSystemService(AutofillManager.class); + if (autofillManager != null && autofillManager.isEnabled()) { + autofillManager.requestAutofill(mTerminalView); + } + } + } default: return super.onContextItemSelected(item); } diff --git a/app/src/main/res/layout/drawer_layout.xml b/app/src/main/res/layout/drawer_layout.xml index c5117f14..71d36996 100644 --- a/app/src/main/res/layout/drawer_layout.xml +++ b/app/src/main/res/layout/drawer_layout.xml @@ -19,7 +19,9 @@ android:layout_marginLeft="3dp" android:focusableInTouchMode="true" android:scrollbarThumbVertical="@drawable/terminal_scroll_shape" - android:scrollbars="vertical" /> + android:scrollbars="vertical" + android:importantForAutofill="no" + android:autofillHints="password" /> Terminal transcript Help Keep screen on + Autofill password Installing… Unable to install diff --git a/terminal-view/src/main/java/com/termux/view/TerminalView.java b/terminal-view/src/main/java/com/termux/view/TerminalView.java index b612c510..301f33fe 100644 --- a/terminal-view/src/main/java/com/termux/view/TerminalView.java +++ b/terminal-view/src/main/java/com/termux/view/TerminalView.java @@ -31,12 +31,15 @@ import android.view.ViewParent; import android.view.ViewTreeObserver; import android.view.WindowManager; import android.view.accessibility.AccessibilityManager; +import android.view.autofill.AutofillValue; import android.view.inputmethod.BaseInputConnection; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputConnection; import android.widget.PopupWindow; import android.widget.Scroller; +import androidx.annotation.RequiresApi; + import com.termux.terminal.EmulatorDebug; import com.termux.terminal.KeyHandler; import com.termux.terminal.TerminalBuffer; @@ -1540,4 +1543,24 @@ public final class TerminalView extends View { } } } + + @RequiresApi(api = Build.VERSION_CODES.O) + @Override + public void autofill(AutofillValue value) { + if (value.isText()) { + mTermSession.write(value.getTextValue().toString()); + } + } + + @RequiresApi(api = Build.VERSION_CODES.O) + @Override + public int getAutofillType() { + return AUTOFILL_TYPE_TEXT; + } + + @RequiresApi(api = Build.VERSION_CODES.O) + @Override + public AutofillValue getAutofillValue() { + return AutofillValue.forText(""); + } }