From 5f3a282a7c99f7d9d61881a2b2ecba0bc5bce58f Mon Sep 17 00:00:00 2001 From: Igor Pozdeev Date: Tue, 19 Jan 2021 16:39:16 +0400 Subject: [PATCH] Fix issue #50 keyboard height calculation now consider navigation bar --- .../mobileinput/KeyboardProvider.java | 68 ++++++++++++++---- Unity/Assets/Plugins/Android/Common.aar | Bin 2605 -> 2603 bytes Unity/Assets/Plugins/Android/Mobileinput.aar | Bin 30982 -> 31510 bytes .../Scripts/UnityMobileInput/MobileInput.cs | 4 -- 4 files changed, 54 insertions(+), 18 deletions(-) diff --git a/Android/UnityMobileInput/mobileinput/src/main/java/ru/mopsicus/mobileinput/KeyboardProvider.java b/Android/UnityMobileInput/mobileinput/src/main/java/ru/mopsicus/mobileinput/KeyboardProvider.java index 0333cbd..084e50a 100644 --- a/Android/UnityMobileInput/mobileinput/src/main/java/ru/mopsicus/mobileinput/KeyboardProvider.java +++ b/Android/UnityMobileInput/mobileinput/src/main/java/ru/mopsicus/mobileinput/KeyboardProvider.java @@ -19,6 +19,11 @@ import android.view.ViewTreeObserver; import android.view.WindowManager; import android.widget.PopupWindow; +import android.util.Log; +import android.view.Display; +import android.view.Window; +import android.content.Context; +import android.util.DisplayMetrics; public class KeyboardProvider extends PopupWindow { @@ -47,6 +52,9 @@ public KeyboardProvider(Activity activity, ViewGroup parent, KeyboardObserver li setHeight(WindowManager.LayoutParams.MATCH_PARENT); setBackgroundDrawable(new ColorDrawable(0)); showAtLocation(parentView, Gravity.NO_GRAVITY, 0, 0); + + navBarHeight = getNavigationBarHeight(); + popupView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { @@ -67,30 +75,62 @@ private int getScreenOrientation() { return activity.getResources().getConfiguration().orientation; } + private int heightMax; + private int navBarHeight; + // Handler to get keyboard height private void handleOnGlobalLayout() { - Point screenSize = new Point(); - activity.getWindowManager().getDefaultDisplay().getSize(screenSize); - Rect rect = new Rect(); + + Rect rect = new Rect(); popupView.getWindowVisibleDisplayFrame(rect); + if (rect.bottom > heightMax) { + heightMax = rect.bottom; + } + int keyboardHeight = heightMax - rect.bottom; + if (keyboardHeight > 0) + { + keyboardHeight += navBarHeight; + } int orientation = getScreenOrientation(); - int keyboardHeight = screenSize.y - rect.bottom; - float height = keyboardHeight / (float) screenSize.y; - if (keyboardHeight == 0) { - notifyKeyboardHeight(0, 0, orientation); - } else if (orientation == Configuration.ORIENTATION_PORTRAIT) { - this.keyboardPortraitHeight = keyboardHeight; - notifyKeyboardHeight(height, keyboardPortraitHeight, orientation); - } else { - this.keyboardLandscapeHeight = keyboardHeight; - notifyKeyboardHeight(height, keyboardLandscapeHeight, orientation); + notifyKeyboardHeight(keyboardHeight, keyboardHeight, orientation); + } + + private int getNavigationBarHeight() { + if (!hasSoftKeys()) + { + return 0; + } + Resources resources = activity.getResources(); + int resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android"); + if (resourceId > 0) { + return resources.getDimensionPixelSize(resourceId); } + return 0; } + public boolean hasSoftKeys() { + Display d = activity.getWindowManager().getDefaultDisplay(); + + DisplayMetrics realDisplayMetrics = new DisplayMetrics(); + d.getRealMetrics(realDisplayMetrics); + + int realHeight = realDisplayMetrics.heightPixels; + int realWidth = realDisplayMetrics.widthPixels; + + DisplayMetrics displayMetrics = new DisplayMetrics(); + d.getMetrics(displayMetrics); + + int displayHeight = displayMetrics.heightPixels; + int displayWidth = displayMetrics.widthPixels; + + boolean hasSoftwareKeys = (realWidth - displayWidth) > 0 || (realHeight - displayHeight) > 0; + return hasSoftwareKeys; + } + // Send data observer private void notifyKeyboardHeight(float height, int keyboardHeight, int orientation) { if (observer != null) { observer.onKeyboardHeight(height, keyboardHeight, orientation); } } -} +} \ No newline at end of file diff --git a/Unity/Assets/Plugins/Android/Common.aar b/Unity/Assets/Plugins/Android/Common.aar index b028160e9d33bf0d76b76e8655093907dbc8596f..f498bef08f9748ac0d805d6624d24fae71fb2865 100644 GIT binary patch delta 1052 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