diff --git a/app/src/main/java/com/trianguloy/urlchecker/modules/list/TextInputModule.java b/app/src/main/java/com/trianguloy/urlchecker/modules/list/TextInputModule.java index b434967..3e93797 100644 --- a/app/src/main/java/com/trianguloy/urlchecker/modules/list/TextInputModule.java +++ b/app/src/main/java/com/trianguloy/urlchecker/modules/list/TextInputModule.java @@ -1,7 +1,9 @@ package com.trianguloy.urlchecker.modules.list; +import android.content.Context; import android.text.Editable; import android.view.View; +import android.view.inputmethod.InputMethodManager; import android.widget.EditText; import android.widget.TextView; @@ -13,12 +15,11 @@ import com.trianguloy.urlchecker.modules.AModuleData; import com.trianguloy.urlchecker.modules.AModuleDialog; import com.trianguloy.urlchecker.modules.DescriptionConfig; import com.trianguloy.urlchecker.url.UrlData; +import com.trianguloy.urlchecker.utilities.methods.AndroidUtils; import com.trianguloy.urlchecker.utilities.wrappers.DefaultTextWatcher; import com.trianguloy.urlchecker.utilities.wrappers.DoubleEvent; -/** - * This module shows the current url and allows manual editing - */ +/** This module shows the current url and allows manual editing */ public class TextInputModule extends AModuleData { @Override @@ -45,6 +46,7 @@ public class TextInputModule extends AModuleData { class TextInputDialog extends AModuleDialog { private final DoubleEvent doubleEdit = new DoubleEvent(1000); // if two updates happens in less than this milliseconds, they are considered as the same + private final InputMethodManager inputMethodManager; private boolean skipUpdate = false; private TextView txt_url; @@ -52,6 +54,7 @@ class TextInputDialog extends AModuleDialog { public TextInputDialog(MainDialog dialog) { super(dialog); + inputMethodManager = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); } @Override @@ -81,21 +84,28 @@ class TextInputDialog extends AModuleDialog { } }); - txt_url.setOnClickListener(v -> { - txt_url.setVisibility(View.GONE); - edtxt_url.setVisibility(View.VISIBLE); - edtxt_url.requestFocus(); + + AndroidUtils.setOnClickWithPositionListener(txt_url, position -> { + edtxt_url.setSelection(txt_url.getOffsetForPosition(position.first, position.second)); + txt_url.setVisibility(View.GONE); + edtxt_url.setVisibility(View.VISIBLE); + // force open the keyboard + edtxt_url.requestFocus(); + inputMethodManager.showSoftInput(edtxt_url, 0); }); } - @Override public void onDisplayUrl(UrlData urlData) { // setText fires the afterTextChanged listener, so we need to skip it skipUpdate = true; txt_url.setText(urlData.url); edtxt_url.setText(urlData.url); + txt_url.setVisibility(View.VISIBLE); + edtxt_url.setVisibility(View.GONE); + // force close the keyboard + inputMethodManager.hideSoftInputFromWindow(edtxt_url.getWindowToken(), 0); skipUpdate = false; doubleEdit.reset(); // next user update, even if immediately after, will be considered new } diff --git a/app/src/main/java/com/trianguloy/urlchecker/utilities/methods/AndroidUtils.java b/app/src/main/java/com/trianguloy/urlchecker/utilities/methods/AndroidUtils.java index 45d35c9..38b3b1e 100644 --- a/app/src/main/java/com/trianguloy/urlchecker/utilities/methods/AndroidUtils.java +++ b/app/src/main/java/com/trianguloy/urlchecker/utilities/methods/AndroidUtils.java @@ -11,6 +11,7 @@ import android.os.Build; import android.text.SpannableStringBuilder; import android.text.style.ClickableSpan; import android.util.Log; +import android.util.Pair; import android.util.Patterns; import android.util.TypedValue; import android.view.MenuItem; @@ -213,4 +214,16 @@ public interface AndroidUtils { StreamUtils.inputStream2File(in, file); } } + + /** OnClickListener that reports the click position */ + static void setOnClickWithPositionListener(View view, JavaUtils.Consumer> listener) { + var xy = new float[2]; + view.setOnTouchListener((v, event) -> { + // store any interaction and continue + xy[0] = event.getX(); + xy[1] = event.getY(); + return false; + }); + view.setOnClickListener(v -> listener.accept(Pair.create(xy[0], xy[1]))); + } } diff --git a/app/src/main/res/layout/dialog_text.xml b/app/src/main/res/layout/dialog_text.xml index cb7f98e..fd6da5c 100644 --- a/app/src/main/res/layout/dialog_text.xml +++ b/app/src/main/res/layout/dialog_text.xml @@ -1,9 +1,9 @@ + android:focusableInTouchMode="true" + android:orientation="vertical"> + android:textAppearance="@android:style/TextAppearance.DeviceDefault.Large" + android:visibility="gone" /> \ No newline at end of file