summaryrefslogtreecommitdiff
path: root/platform/android/java
diff options
context:
space:
mode:
authorPouleyKetchoupp <pouleyketchoup@gmail.com>2020-07-24 17:59:57 +0200
committerPouleyKetchoupp <pouleyketchoup@gmail.com>2020-07-24 19:54:06 +0200
commita2dd96630100cd3dec7c402176ed96b55dc884db (patch)
treebf0a64b610b935677bc46e3a400bf03300489e22 /platform/android/java
parentf6b6d51052b64c9ce11039db7a35e75e374e6ef3 (diff)
Fix virtual keyboard height regression
Disabling virtual keyboard focus adjustement caused get_keyboard_height to always return 0 because it was calculated when the view is resized. In order to fix it, a PopupWindow is now created on top of the main view and is set for focus adjustments so the keyboard size can be calculated based on this popup without affecting the main view.
Diffstat (limited to 'platform/android/java')
-rw-r--r--platform/android/java/lib/src/org/godotengine/godot/Godot.java40
-rw-r--r--platform/android/java/lib/src/org/godotengine/godot/input/GodotEditText.java10
2 files changed, 43 insertions, 7 deletions
diff --git a/platform/android/java/lib/src/org/godotengine/godot/Godot.java b/platform/android/java/lib/src/org/godotengine/godot/Godot.java
index 1ae400abb5..72746e06f7 100644
--- a/platform/android/java/lib/src/org/godotengine/godot/Godot.java
+++ b/platform/android/java/lib/src/org/godotengine/godot/Godot.java
@@ -70,6 +70,7 @@ import android.os.VibrationEffect;
import android.os.Vibrator;
import android.provider.Settings.Secure;
import android.view.Display;
+import android.view.Gravity;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.MotionEvent;
@@ -82,6 +83,7 @@ import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.FrameLayout;
+import android.widget.PopupWindow;
import android.widget.ProgressBar;
import android.widget.TextView;
@@ -163,6 +165,8 @@ public class Godot extends Fragment implements SensorEventListener, IDownloaderC
public GodotRenderView mRenderView;
private boolean godot_initialized = false;
+ private PopupWindow mKeyboardWindow;
+
private SensorManager mSensorManager;
private Sensor mAccelerometer;
private Sensor mGravity;
@@ -219,11 +223,23 @@ public class Godot extends Fragment implements SensorEventListener, IDownloaderC
containerLayout = new FrameLayout(activity);
containerLayout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
+ // Create a popup window with an invisible layout for the virtual keyboard,
+ // so the view can be resized to get the vk height without resizing the main godot view.
+ final FrameLayout keyboardLayout = new FrameLayout(activity);
+ keyboardLayout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
+ keyboardLayout.setVisibility(View.INVISIBLE);
+ mKeyboardWindow = new PopupWindow(keyboardLayout, LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
+ mKeyboardWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
+ mKeyboardWindow.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED);
+ mKeyboardWindow.setFocusable(true); // for the text edit to work
+ mKeyboardWindow.setTouchable(false); // inputs need to go through
+
// GodotEditText layout
GodotEditText editText = new GodotEditText(activity);
- editText.setLayoutParams(new ViewGroup.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
- // ...add to FrameLayout
- containerLayout.addView(editText);
+ editText.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
+ editText.setKeyboardView(keyboardLayout);
+ // ...add to keyboard layout
+ keyboardLayout.addView(editText);
GodotLib.setup(command_line);
@@ -240,13 +256,13 @@ public class Godot extends Fragment implements SensorEventListener, IDownloaderC
editText.setView(mRenderView);
io.setEdit(editText);
- view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
+ keyboardLayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Point fullSize = new Point();
activity.getWindowManager().getDefaultDisplay().getSize(fullSize);
Rect gameSize = new Rect();
- mRenderView.getView().getWindowVisibleDisplayFrame(gameSize);
+ mKeyboardWindow.getContentView().getWindowVisibleDisplayFrame(gameSize);
final int keyboardHeight = fullSize.y - gameSize.bottom;
GodotLib.setVirtualKeyboardHeight(keyboardHeight);
@@ -604,7 +620,21 @@ public class Godot extends Fragment implements SensorEventListener, IDownloaderC
}
@Override
+ public void onStart() {
+ super.onStart();
+
+ mRenderView.getView().post(new Runnable() {
+ @Override
+ public void run() {
+ mKeyboardWindow.showAtLocation(getActivity().getWindow().getDecorView(), Gravity.NO_GRAVITY, 0, 0);
+ }
+ });
+ }
+
+ @Override
public void onDestroy() {
+ mKeyboardWindow.dismiss();
+
for (GodotPlugin plugin : pluginRegistry.getAllPlugins()) {
plugin.onMainDestroy();
}
diff --git a/platform/android/java/lib/src/org/godotengine/godot/input/GodotEditText.java b/platform/android/java/lib/src/org/godotengine/godot/input/GodotEditText.java
index 7f596575a8..d93bf69602 100644
--- a/platform/android/java/lib/src/org/godotengine/godot/input/GodotEditText.java
+++ b/platform/android/java/lib/src/org/godotengine/godot/input/GodotEditText.java
@@ -38,6 +38,7 @@ import android.os.Message;
import android.text.InputFilter;
import android.util.AttributeSet;
import android.view.KeyEvent;
+import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
@@ -55,6 +56,7 @@ public class GodotEditText extends EditText {
// Fields
// ===========================================================
private GodotRenderView mRenderView;
+ private View mKeyboardView;
private GodotTextInputWrapper mInputWrapper;
private EditHandler sHandler = new EditHandler(this);
private String mOriginText;
@@ -117,7 +119,7 @@ public class GodotEditText extends EditText {
edit.mInputWrapper.setOriginText(text);
edit.addTextChangedListener(edit.mInputWrapper);
- final InputMethodManager imm = (InputMethodManager)mRenderView.getView().getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
+ final InputMethodManager imm = (InputMethodManager)mKeyboardView.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(edit, 0);
}
} break;
@@ -126,7 +128,7 @@ public class GodotEditText extends EditText {
GodotEditText edit = (GodotEditText)msg.obj;
edit.removeTextChangedListener(mInputWrapper);
- final InputMethodManager imm = (InputMethodManager)mRenderView.getView().getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
+ final InputMethodManager imm = (InputMethodManager)mKeyboardView.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(edit.getWindowToken(), 0);
edit.mRenderView.getView().requestFocus();
} break;
@@ -150,6 +152,10 @@ public class GodotEditText extends EditText {
view.getView().requestFocus();
}
+ public void setKeyboardView(final View keyboardView) {
+ mKeyboardView = keyboardView;
+ }
+
// ===========================================================
// Methods for/from SuperClass/Interfaces
// ===========================================================