From f31e0b75b9a7d90ed62cfc00108e4b354ede1f2e Mon Sep 17 00:00:00 2001 From: m1ga Date: Sat, 21 Jan 2023 13:39:30 +0100 Subject: [PATCH 01/15] feat(android): add keyboard show/hide event --- .../appcelerator/titanium/TiBaseActivity.java | 16 ++++++++++++++++ .../titanium/view/TiActivitySafeAreaMonitor.java | 5 +++++ 2 files changed, 21 insertions(+) diff --git a/android/titanium/src/java/org/appcelerator/titanium/TiBaseActivity.java b/android/titanium/src/java/org/appcelerator/titanium/TiBaseActivity.java index 4f168e70d2f..8a570edebaa 100644 --- a/android/titanium/src/java/org/appcelerator/titanium/TiBaseActivity.java +++ b/android/titanium/src/java/org/appcelerator/titanium/TiBaseActivity.java @@ -100,6 +100,7 @@ public abstract class TiBaseActivity extends AppCompatActivity implements TiActi private TiActionBarStyleHandler actionBarStyleHandler; private TiActivitySafeAreaMonitor safeAreaMonitor; private Context baseContext; + private boolean oldKeyboardValue = false; /** * Callback to be invoked when the TiBaseActivity.onRequestPermissionsResult() has been called, * providing the results of a requestPermissions() call. Instances of this interface are to @@ -760,6 +761,21 @@ public void onChanged(TiActivitySafeAreaMonitor monitor) windowProxy.fireSafeAreaChangedEvent(); } } + + @Override + public void onKeyboardChanged(boolean keyboardVisible) + { + if (keyboardVisible != oldKeyboardValue) { + KrollDict kd = new KrollDict(); + kd.put("keyboardVisible", keyboardVisible); + TiWindowProxy windowProxy = TiBaseActivity.this.window; + if (windowProxy != null) { + windowProxy.fireSafeAreaChangedEvent(); + } + windowProxy.fireEvent("keyboardChanged", kd); + oldKeyboardValue = keyboardVisible; + } + } }); this.safeAreaMonitor.start(); diff --git a/android/titanium/src/java/org/appcelerator/titanium/view/TiActivitySafeAreaMonitor.java b/android/titanium/src/java/org/appcelerator/titanium/view/TiActivitySafeAreaMonitor.java index 61a75fadac9..0f197e84376 100644 --- a/android/titanium/src/java/org/appcelerator/titanium/view/TiActivitySafeAreaMonitor.java +++ b/android/titanium/src/java/org/appcelerator/titanium/view/TiActivitySafeAreaMonitor.java @@ -27,6 +27,7 @@ public class TiActivitySafeAreaMonitor */ public interface OnChangedListener { void onChanged(TiActivitySafeAreaMonitor monitor); + void onKeyboardChanged(boolean keyboardVisible); } /** The activity to be monitored. */ @@ -105,6 +106,10 @@ public void onLayoutChange(View view, int left, int top, int right, int bottom, @Override public WindowInsets onApplyWindowInsets(View view, WindowInsets insets) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + boolean keyboardVisible = insets.isVisible(WindowInsets.Type.ime()); + changeListener.onKeyboardChanged(keyboardVisible); + } // Validate. if (view == null) { return insets; From 64b4ece4f38779de057ac97b23d680a91d1fd41b Mon Sep 17 00:00:00 2001 From: m1ga Date: Sat, 21 Jan 2023 13:42:10 +0100 Subject: [PATCH 02/15] docs --- apidoc/Titanium/UI/Window.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/apidoc/Titanium/UI/Window.yml b/apidoc/Titanium/UI/Window.yml index f0abf6be547..0ccfe92ec11 100644 --- a/apidoc/Titanium/UI/Window.yml +++ b/apidoc/Titanium/UI/Window.yml @@ -739,6 +739,14 @@ events: The listener for this event must be defined before this window is opened. + - name: keyboardChanged + summary: Fired when the soft keyboard is shown or hidden. + description: | + Will fire on Android R and up if the keyboard is shown or hidden. Check + `keyboardVisible` in the event for the status. + platforms: [android] + since: '12.1.0' + properties: - name: activity summary: | From a2ee315d5235cafbddf9d97fda466d8b208beaf9 Mon Sep 17 00:00:00 2001 From: m1ga Date: Sat, 21 Jan 2023 13:47:29 +0100 Subject: [PATCH 03/15] use Android version --- apidoc/Titanium/UI/Window.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apidoc/Titanium/UI/Window.yml b/apidoc/Titanium/UI/Window.yml index 0ccfe92ec11..d88fc3c4c74 100644 --- a/apidoc/Titanium/UI/Window.yml +++ b/apidoc/Titanium/UI/Window.yml @@ -742,7 +742,7 @@ events: - name: keyboardChanged summary: Fired when the soft keyboard is shown or hidden. description: | - Will fire on Android R and up if the keyboard is shown or hidden. Check + Will fire on Android 11 and up if the keyboard is shown or hidden. Check `keyboardVisible` in the event for the status. platforms: [android] since: '12.1.0' From 0a9c121a2ede8c882b09f2939880bfd3be546c39 Mon Sep 17 00:00:00 2001 From: m1ga Date: Mon, 23 Jan 2023 18:46:27 +0100 Subject: [PATCH 04/15] move to app event --- .../java/ti/modules/titanium/app/AppModule.java | 11 +++++++++++ .../org/appcelerator/titanium/TiBaseActivity.java | 15 ++++++++------- apidoc/Titanium/App/App.yml | 9 +++++---- apidoc/Titanium/UI/Window.yml | 8 -------- 4 files changed, 24 insertions(+), 19 deletions(-) diff --git a/android/modules/app/src/java/ti/modules/titanium/app/AppModule.java b/android/modules/app/src/java/ti/modules/titanium/app/AppModule.java index 268140ac4b8..b55af21617f 100644 --- a/android/modules/app/src/java/ti/modules/titanium/app/AppModule.java +++ b/android/modules/app/src/java/ti/modules/titanium/app/AppModule.java @@ -13,6 +13,7 @@ import org.appcelerator.kroll.common.Log; import org.appcelerator.titanium.ITiAppInfo; import org.appcelerator.titanium.TiApplication; +import org.appcelerator.titanium.TiBaseActivity; import org.appcelerator.titanium.TiC; import org.appcelerator.titanium.util.TiConvert; import org.appcelerator.titanium.util.TiSensorHelper; @@ -155,6 +156,16 @@ public boolean getAccessibilityEnabled() return TiApplication.getInstance().getAccessibilityManager().isEnabled(); } + @Kroll.getProperty + public boolean getKeyboardVisible() + { + TiBaseActivity activity = (TiBaseActivity) TiApplication.getAppCurrentActivity(); + if (activity == null) { + return false; + } + return TiConvert.toBoolean(activity.keyboardVisible, false); + } + @Kroll.method(name = "_restart") public void restart() { diff --git a/android/titanium/src/java/org/appcelerator/titanium/TiBaseActivity.java b/android/titanium/src/java/org/appcelerator/titanium/TiBaseActivity.java index 8a570edebaa..1a42717a2c2 100644 --- a/android/titanium/src/java/org/appcelerator/titanium/TiBaseActivity.java +++ b/android/titanium/src/java/org/appcelerator/titanium/TiBaseActivity.java @@ -100,7 +100,7 @@ public abstract class TiBaseActivity extends AppCompatActivity implements TiActi private TiActionBarStyleHandler actionBarStyleHandler; private TiActivitySafeAreaMonitor safeAreaMonitor; private Context baseContext; - private boolean oldKeyboardValue = false; + public boolean keyboardVisible = false; /** * Callback to be invoked when the TiBaseActivity.onRequestPermissionsResult() has been called, * providing the results of a requestPermissions() call. Instances of this interface are to @@ -763,17 +763,18 @@ public void onChanged(TiActivitySafeAreaMonitor monitor) } @Override - public void onKeyboardChanged(boolean keyboardVisible) + public void onKeyboardChanged(boolean isVisible) { - if (keyboardVisible != oldKeyboardValue) { - KrollDict kd = new KrollDict(); - kd.put("keyboardVisible", keyboardVisible); + if (isVisible != keyboardVisible) { TiWindowProxy windowProxy = TiBaseActivity.this.window; if (windowProxy != null) { windowProxy.fireSafeAreaChangedEvent(); } - windowProxy.fireEvent("keyboardChanged", kd); - oldKeyboardValue = keyboardVisible; + KrollDict kd = new KrollDict(); + kd.put("keyboardFrame", null); + kd.put("animationDuration", 0); + tiApp.fireAppEvent("keyboardframechanged", kd); + keyboardVisible = isVisible; } } }); diff --git a/apidoc/Titanium/App/App.yml b/apidoc/Titanium/App/App.yml index 94fc3cc3756..078b54e85cb 100644 --- a/apidoc/Titanium/App/App.yml +++ b/apidoc/Titanium/App/App.yml @@ -378,7 +378,7 @@ events: summary: Fired when the soft keyboard is presented, on and off the screen. description: | This event fires when the application presents the soft keyboard on/off the screen . The - event returns the dictionary `keyboardFrame` containing `x`, `y`, `height` and `width` keys, + event on iOS returns the dictionary `keyboardFrame` containing `x`, `y`, `height` and `width` keys, corresponding to the frame of the keyboard with respect to the screen coordinates. On Titanium SDK 4.0.0 and later the event also contains a second parameter `animationDuration` representing @@ -394,8 +394,8 @@ events: - name: animationDuration summary: The duration of the keyboard animation. This parameter is only available on Titanium SDK 4.0.0 and later. type: Number - platforms: [iphone, ipad, macos] - since: {iphone: "3.0.0", ipad: "3.0.0", macos: "9.2.0"} + platforms: [android, iphone, ipad, macos] + since: {android: "12.1.0", iphone: "3.0.0", ipad: "3.0.0", macos: "9.2.0"} - name: significanttimechange summary: Fired when there is a significant change in the time. @@ -611,7 +611,8 @@ properties: summary: Indicates whether or not the soft keyboard is visible. type: Boolean permission: read-only - platforms: [iphone, ipad, macos] + since: {android: "12.1.0", iphone: "7.5.0", ipad: "7.5.0", macos: "9.2.0"} + platforms: [android, iphone, ipad, macos] - name: trackUserInteraction summary: Indicates whether or not the user interaction shoud be tracked. diff --git a/apidoc/Titanium/UI/Window.yml b/apidoc/Titanium/UI/Window.yml index d88fc3c4c74..f0abf6be547 100644 --- a/apidoc/Titanium/UI/Window.yml +++ b/apidoc/Titanium/UI/Window.yml @@ -739,14 +739,6 @@ events: The listener for this event must be defined before this window is opened. - - name: keyboardChanged - summary: Fired when the soft keyboard is shown or hidden. - description: | - Will fire on Android 11 and up if the keyboard is shown or hidden. Check - `keyboardVisible` in the event for the status. - platforms: [android] - since: '12.1.0' - properties: - name: activity summary: | From 21dab2aa33c3a4c2306c823f0b7d9551cade3412 Mon Sep 17 00:00:00 2001 From: m1ga Date: Mon, 23 Jan 2023 18:49:52 +0100 Subject: [PATCH 05/15] move to app event --- apidoc/Titanium/App/App.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/apidoc/Titanium/App/App.yml b/apidoc/Titanium/App/App.yml index 078b54e85cb..cf174cd43ed 100644 --- a/apidoc/Titanium/App/App.yml +++ b/apidoc/Titanium/App/App.yml @@ -386,6 +386,9 @@ events: Note that the keyboard `height` and `width` properties will not be accurate when the keyboard is being dissmissed. + + For Android it will only work using Android 11 and up. The return values are empty but you can use + `keyboardVisible` to check if the keyboard is visible or not. properties: - name: keyboardFrame summary: A dictionary with keys x, y, width and height representing the frame of keyboard on screen. @@ -609,6 +612,8 @@ properties: - name: keyboardVisible summary: Indicates whether or not the soft keyboard is visible. + description: | + On Android it will only work using Android 11 and up. Otherwise it will always be false. type: Boolean permission: read-only since: {android: "12.1.0", iphone: "7.5.0", ipad: "7.5.0", macos: "9.2.0"} From 89fe70f978f926a7fd348cedc1b52250382c38a5 Mon Sep 17 00:00:00 2001 From: m1ga Date: Mon, 23 Jan 2023 20:45:21 +0100 Subject: [PATCH 06/15] size return value --- .../appcelerator/titanium/TiBaseActivity.java | 37 ++++++++++++++----- .../view/TiActivitySafeAreaMonitor.java | 8 +++- 2 files changed, 33 insertions(+), 12 deletions(-) diff --git a/android/titanium/src/java/org/appcelerator/titanium/TiBaseActivity.java b/android/titanium/src/java/org/appcelerator/titanium/TiBaseActivity.java index 1a42717a2c2..0fe7537de56 100644 --- a/android/titanium/src/java/org/appcelerator/titanium/TiBaseActivity.java +++ b/android/titanium/src/java/org/appcelerator/titanium/TiBaseActivity.java @@ -54,6 +54,7 @@ import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.content.res.Configuration; +import android.graphics.Insets; import android.graphics.PixelFormat; import android.graphics.Rect; import android.os.Build; @@ -763,18 +764,34 @@ public void onChanged(TiActivitySafeAreaMonitor monitor) } @Override - public void onKeyboardChanged(boolean isVisible) + public void onKeyboardChanged(boolean isVisible, int width, int height, Insets keyboardSize) { - if (isVisible != keyboardVisible) { - TiWindowProxy windowProxy = TiBaseActivity.this.window; - if (windowProxy != null) { - windowProxy.fireSafeAreaChangedEvent(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + if (isVisible != keyboardVisible) { + TiWindowProxy windowProxy = TiBaseActivity.this.window; + if (windowProxy != null) { + windowProxy.fireSafeAreaChangedEvent(); + } + KrollDict kdAll = new KrollDict(); + KrollDict kdFrame = new KrollDict(); + + KrollDict kdX = new KrollDict(); + kdX.put("left", keyboardSize.left); + kdX.put("right", keyboardSize.right); + + KrollDict kdY = new KrollDict(); + kdX.put("top", keyboardSize.top); + kdX.put("bottom", keyboardSize.bottom); + kdFrame.put("x", kdX); + kdFrame.put("y", kdY); + kdFrame.put("height", keyboardSize.bottom); + kdFrame.put("width", width - keyboardSize.left - keyboardSize.right); + kdAll.put("keyboardFrame", kdFrame); + kdAll.put("animationDuration", 0); + + tiApp.fireAppEvent("keyboardframechanged", kdAll); + keyboardVisible = isVisible; } - KrollDict kd = new KrollDict(); - kd.put("keyboardFrame", null); - kd.put("animationDuration", 0); - tiApp.fireAppEvent("keyboardframechanged", kd); - keyboardVisible = isVisible; } } }); diff --git a/android/titanium/src/java/org/appcelerator/titanium/view/TiActivitySafeAreaMonitor.java b/android/titanium/src/java/org/appcelerator/titanium/view/TiActivitySafeAreaMonitor.java index 0f197e84376..e6c257790d3 100644 --- a/android/titanium/src/java/org/appcelerator/titanium/view/TiActivitySafeAreaMonitor.java +++ b/android/titanium/src/java/org/appcelerator/titanium/view/TiActivitySafeAreaMonitor.java @@ -7,10 +7,12 @@ package org.appcelerator.titanium.view; +import android.graphics.Insets; import android.graphics.Rect; import android.os.Build; import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AppCompatActivity; + import android.view.View; import android.view.Window; import android.view.WindowInsets; @@ -27,7 +29,7 @@ public class TiActivitySafeAreaMonitor */ public interface OnChangedListener { void onChanged(TiActivitySafeAreaMonitor monitor); - void onKeyboardChanged(boolean keyboardVisible); + void onKeyboardChanged(boolean keyboardVisible, int width, int height, Insets keyboardSize); } /** The activity to be monitored. */ @@ -108,7 +110,9 @@ public WindowInsets onApplyWindowInsets(View view, WindowInsets insets) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { boolean keyboardVisible = insets.isVisible(WindowInsets.Type.ime()); - changeListener.onKeyboardChanged(keyboardVisible); + Insets keyboardSize = insets.getInsets(WindowInsets.Type.ime()); + + changeListener.onKeyboardChanged(keyboardVisible, view.getWidth(), view.getHeight(), keyboardSize); } // Validate. if (view == null) { From 88d11b973728297368d475455fca44ed53f3556a Mon Sep 17 00:00:00 2001 From: m1ga Date: Tue, 24 Jan 2023 15:45:36 +0100 Subject: [PATCH 07/15] check for listener --- .../src/java/org/appcelerator/titanium/TiApplication.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/android/titanium/src/java/org/appcelerator/titanium/TiApplication.java b/android/titanium/src/java/org/appcelerator/titanium/TiApplication.java index b1d3d9223bb..b12d8cf66f4 100644 --- a/android/titanium/src/java/org/appcelerator/titanium/TiApplication.java +++ b/android/titanium/src/java/org/appcelerator/titanium/TiApplication.java @@ -679,9 +679,10 @@ public boolean fireAppEvent(String eventName, KrollDict data) if (appEventProxy == null) { continue; } - - boolean proxyHandled = appEventProxy.fireEvent(eventName, data); - handled = handled || proxyHandled; + if (appEventProxy.hasListeners(eventName)) { + boolean proxyHandled = appEventProxy.fireEvent(eventName, data); + handled = handled || proxyHandled; + } } return handled; From c161d9f96c0e1940ed7a9eda0d65cd887740aa88 Mon Sep 17 00:00:00 2001 From: m1ga Date: Tue, 24 Jan 2023 18:24:16 +0100 Subject: [PATCH 08/15] remove extra check, simplify if statement --- .../appcelerator/titanium/TiApplication.java | 6 +-- .../appcelerator/titanium/TiBaseActivity.java | 47 +++++++++---------- 2 files changed, 23 insertions(+), 30 deletions(-) diff --git a/android/titanium/src/java/org/appcelerator/titanium/TiApplication.java b/android/titanium/src/java/org/appcelerator/titanium/TiApplication.java index b12d8cf66f4..a994bfce516 100644 --- a/android/titanium/src/java/org/appcelerator/titanium/TiApplication.java +++ b/android/titanium/src/java/org/appcelerator/titanium/TiApplication.java @@ -679,10 +679,8 @@ public boolean fireAppEvent(String eventName, KrollDict data) if (appEventProxy == null) { continue; } - if (appEventProxy.hasListeners(eventName)) { - boolean proxyHandled = appEventProxy.fireEvent(eventName, data); - handled = handled || proxyHandled; - } + boolean proxyHandled = appEventProxy.fireEvent(eventName, data); + handled = handled || proxyHandled; } return handled; diff --git a/android/titanium/src/java/org/appcelerator/titanium/TiBaseActivity.java b/android/titanium/src/java/org/appcelerator/titanium/TiBaseActivity.java index 0fe7537de56..fda44b8e3e6 100644 --- a/android/titanium/src/java/org/appcelerator/titanium/TiBaseActivity.java +++ b/android/titanium/src/java/org/appcelerator/titanium/TiBaseActivity.java @@ -766,32 +766,27 @@ public void onChanged(TiActivitySafeAreaMonitor monitor) @Override public void onKeyboardChanged(boolean isVisible, int width, int height, Insets keyboardSize) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - if (isVisible != keyboardVisible) { - TiWindowProxy windowProxy = TiBaseActivity.this.window; - if (windowProxy != null) { - windowProxy.fireSafeAreaChangedEvent(); - } - KrollDict kdAll = new KrollDict(); - KrollDict kdFrame = new KrollDict(); - - KrollDict kdX = new KrollDict(); - kdX.put("left", keyboardSize.left); - kdX.put("right", keyboardSize.right); - - KrollDict kdY = new KrollDict(); - kdX.put("top", keyboardSize.top); - kdX.put("bottom", keyboardSize.bottom); - kdFrame.put("x", kdX); - kdFrame.put("y", kdY); - kdFrame.put("height", keyboardSize.bottom); - kdFrame.put("width", width - keyboardSize.left - keyboardSize.right); - kdAll.put("keyboardFrame", kdFrame); - kdAll.put("animationDuration", 0); - - tiApp.fireAppEvent("keyboardframechanged", kdAll); - keyboardVisible = isVisible; - } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q + && isVisible != keyboardVisible + && tiApp != null) { + KrollDict kdAll = new KrollDict(); + KrollDict kdFrame = new KrollDict(); + + KrollDict kdX = new KrollDict(); + kdX.put("left", keyboardSize.left); + kdX.put("right", keyboardSize.right); + + KrollDict kdY = new KrollDict(); + kdX.put("top", keyboardSize.top); + kdX.put("bottom", keyboardSize.bottom); + kdFrame.put("x", kdX); + kdFrame.put("y", kdY); + kdFrame.put("height", keyboardSize.bottom); + kdFrame.put("width", width - keyboardSize.left - keyboardSize.right); + kdAll.put("keyboardFrame", kdFrame); + kdAll.put("animationDuration", 0); + tiApp.fireAppEvent("keyboardframechanged", kdAll); + keyboardVisible = isVisible; } } }); From dc213e33d01b124e9b32bafb04a6715600bc5fa6 Mon Sep 17 00:00:00 2001 From: m1ga Date: Tue, 24 Jan 2023 18:27:42 +0100 Subject: [PATCH 09/15] some more null checks for safety --- .../titanium/view/TiActivitySafeAreaMonitor.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/android/titanium/src/java/org/appcelerator/titanium/view/TiActivitySafeAreaMonitor.java b/android/titanium/src/java/org/appcelerator/titanium/view/TiActivitySafeAreaMonitor.java index e6c257790d3..459441347d3 100644 --- a/android/titanium/src/java/org/appcelerator/titanium/view/TiActivitySafeAreaMonitor.java +++ b/android/titanium/src/java/org/appcelerator/titanium/view/TiActivitySafeAreaMonitor.java @@ -111,8 +111,9 @@ public WindowInsets onApplyWindowInsets(View view, WindowInsets insets) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { boolean keyboardVisible = insets.isVisible(WindowInsets.Type.ime()); Insets keyboardSize = insets.getInsets(WindowInsets.Type.ime()); - - changeListener.onKeyboardChanged(keyboardVisible, view.getWidth(), view.getHeight(), keyboardSize); + if (changeListener != null && view != null) { + changeListener.onKeyboardChanged(keyboardVisible, view.getWidth(), view.getHeight(), keyboardSize); + } } // Validate. if (view == null) { From ea52729e8dd01ba461ece97b825258f55742b838 Mon Sep 17 00:00:00 2001 From: m1ga Date: Tue, 24 Jan 2023 18:33:46 +0100 Subject: [PATCH 10/15] lint --- .../appcelerator/titanium/view/TiActivitySafeAreaMonitor.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/android/titanium/src/java/org/appcelerator/titanium/view/TiActivitySafeAreaMonitor.java b/android/titanium/src/java/org/appcelerator/titanium/view/TiActivitySafeAreaMonitor.java index 459441347d3..98ddc26e3d5 100644 --- a/android/titanium/src/java/org/appcelerator/titanium/view/TiActivitySafeAreaMonitor.java +++ b/android/titanium/src/java/org/appcelerator/titanium/view/TiActivitySafeAreaMonitor.java @@ -112,7 +112,8 @@ public WindowInsets onApplyWindowInsets(View view, WindowInsets insets) boolean keyboardVisible = insets.isVisible(WindowInsets.Type.ime()); Insets keyboardSize = insets.getInsets(WindowInsets.Type.ime()); if (changeListener != null && view != null) { - changeListener.onKeyboardChanged(keyboardVisible, view.getWidth(), view.getHeight(), keyboardSize); + changeListener.onKeyboardChanged(keyboardVisible, view.getWidth(), + view.getHeight(), keyboardSize); } } // Validate. From fec7cc73a90984c2c32dce535da8d4d674c8bfcd Mon Sep 17 00:00:00 2001 From: m1ga Date: Tue, 24 Jan 2023 20:59:17 +0100 Subject: [PATCH 11/15] hasListener check --- .../org/appcelerator/titanium/TiApplication.java | 15 +++++++++++++++ .../org/appcelerator/titanium/TiBaseActivity.java | 3 ++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/android/titanium/src/java/org/appcelerator/titanium/TiApplication.java b/android/titanium/src/java/org/appcelerator/titanium/TiApplication.java index a994bfce516..90f27e784d4 100644 --- a/android/titanium/src/java/org/appcelerator/titanium/TiApplication.java +++ b/android/titanium/src/java/org/appcelerator/titanium/TiApplication.java @@ -671,6 +671,21 @@ public void removeAppEventProxy(KrollProxy appEventProxy) appEventProxies.remove(appEventProxy); } + public boolean hasListener(String eventName) + { + for (WeakReference weakProxy : appEventProxies) { + KrollProxy appEventProxy = weakProxy.get(); + if (appEventProxy == null) { + continue; + } + if (appEventProxy.hasListeners(eventName)) { + return true; + } + + } + return false; + } + public boolean fireAppEvent(String eventName, KrollDict data) { boolean handled = false; diff --git a/android/titanium/src/java/org/appcelerator/titanium/TiBaseActivity.java b/android/titanium/src/java/org/appcelerator/titanium/TiBaseActivity.java index fda44b8e3e6..4a52094da20 100644 --- a/android/titanium/src/java/org/appcelerator/titanium/TiBaseActivity.java +++ b/android/titanium/src/java/org/appcelerator/titanium/TiBaseActivity.java @@ -768,7 +768,8 @@ public void onKeyboardChanged(boolean isVisible, int width, int height, Insets k { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && isVisible != keyboardVisible - && tiApp != null) { + && tiApp != null + && tiApp.hasListener("keyboardframechanged")) { KrollDict kdAll = new KrollDict(); KrollDict kdFrame = new KrollDict(); From 8e75df1648685a21f17984c7f727d6848e6b5a79 Mon Sep 17 00:00:00 2001 From: m1ga Date: Mon, 6 Feb 2023 21:31:11 +0100 Subject: [PATCH 12/15] check app listener in safearea --- .../org/appcelerator/titanium/TiBaseActivity.java | 9 +++++---- .../titanium/view/TiActivitySafeAreaMonitor.java | 13 +++++++++++-- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/android/titanium/src/java/org/appcelerator/titanium/TiBaseActivity.java b/android/titanium/src/java/org/appcelerator/titanium/TiBaseActivity.java index 4a52094da20..d36a5ae002d 100644 --- a/android/titanium/src/java/org/appcelerator/titanium/TiBaseActivity.java +++ b/android/titanium/src/java/org/appcelerator/titanium/TiBaseActivity.java @@ -649,7 +649,11 @@ protected void onCreate(Bundle savedInstanceState) this.inForeground = true; this.launchIntent = getIntent(); - this.safeAreaMonitor = new TiActivitySafeAreaMonitor(this); + + TiApplication tiApp = getTiApp(); + TiApplication.addToActivityStack(this); + + this.safeAreaMonitor = new TiActivitySafeAreaMonitor(this, tiApp); // Fetch the current UI mode flags. Used to determine light/dark theme being used. Configuration config = getResources().getConfiguration(); @@ -670,9 +674,6 @@ protected void onCreate(Bundle savedInstanceState) } } - TiApplication tiApp = getTiApp(); - TiApplication.addToActivityStack(this); - // Increment the Titanium activity reference count. To be decremented in onDestroy() method. // Titanium's JavaScript runtime is created when we have at least 1 activity and destroyed when we have 0. KrollRuntime.incrementActivityRefCount(); diff --git a/android/titanium/src/java/org/appcelerator/titanium/view/TiActivitySafeAreaMonitor.java b/android/titanium/src/java/org/appcelerator/titanium/view/TiActivitySafeAreaMonitor.java index 98ddc26e3d5..07d142f5804 100644 --- a/android/titanium/src/java/org/appcelerator/titanium/view/TiActivitySafeAreaMonitor.java +++ b/android/titanium/src/java/org/appcelerator/titanium/view/TiActivitySafeAreaMonitor.java @@ -16,6 +16,9 @@ import android.view.View; import android.view.Window; import android.view.WindowInsets; + +import org.appcelerator.titanium.TiApplication; + import java.util.ArrayList; /** Tracks safe-area inset changes for a given activity. */ @@ -71,11 +74,13 @@ public interface OnChangedListener { /** Region between the screen insets in pixels, relative to the root decor view. */ private Rect safeArea; + private TiApplication tiApp; + /** * Creates an object used to track safe-area region changes for the given activity. * @param activity The activity to be monitored. Cannot be null. */ - public TiActivitySafeAreaMonitor(AppCompatActivity activity) + public TiActivitySafeAreaMonitor(AppCompatActivity activity, TiApplication app) { // Validate. if (activity == null) { @@ -83,6 +88,7 @@ public TiActivitySafeAreaMonitor(AppCompatActivity activity) } // Initialize member variables. + this.tiApp = app; this.activity = activity; this.isActionBarAddedAsInset = true; this.insetsProviderCollection = new ArrayList<>(8); @@ -108,7 +114,10 @@ public void onLayoutChange(View view, int left, int top, int right, int bottom, @Override public WindowInsets onApplyWindowInsets(View view, WindowInsets insets) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R + && tiApp != null + && tiApp.hasListener("keyboardframechanged") + ) { boolean keyboardVisible = insets.isVisible(WindowInsets.Type.ime()); Insets keyboardSize = insets.getInsets(WindowInsets.Type.ime()); if (changeListener != null && view != null) { From 1c19345d7d2eda0ac7f452dd74a9cb9ae975fd78 Mon Sep 17 00:00:00 2001 From: Michael Gangolf Date: Mon, 25 Dec 2023 11:43:34 +0100 Subject: [PATCH 13/15] Update apidoc/Titanium/App/App.yml --- apidoc/Titanium/App/App.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apidoc/Titanium/App/App.yml b/apidoc/Titanium/App/App.yml index cf174cd43ed..7d700cdd2f0 100644 --- a/apidoc/Titanium/App/App.yml +++ b/apidoc/Titanium/App/App.yml @@ -398,7 +398,7 @@ events: summary: The duration of the keyboard animation. This parameter is only available on Titanium SDK 4.0.0 and later. type: Number platforms: [android, iphone, ipad, macos] - since: {android: "12.1.0", iphone: "3.0.0", ipad: "3.0.0", macos: "9.2.0"} + since: {android: "12.3.0", iphone: "3.0.0", ipad: "3.0.0", macos: "9.2.0"} - name: significanttimechange summary: Fired when there is a significant change in the time. From a816eed8c2027d5f280840af215c18d014726443 Mon Sep 17 00:00:00 2001 From: Michael Gangolf Date: Mon, 25 Dec 2023 11:43:40 +0100 Subject: [PATCH 14/15] Update apidoc/Titanium/App/App.yml --- apidoc/Titanium/App/App.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apidoc/Titanium/App/App.yml b/apidoc/Titanium/App/App.yml index 7d700cdd2f0..8940b6f05f0 100644 --- a/apidoc/Titanium/App/App.yml +++ b/apidoc/Titanium/App/App.yml @@ -616,7 +616,7 @@ properties: On Android it will only work using Android 11 and up. Otherwise it will always be false. type: Boolean permission: read-only - since: {android: "12.1.0", iphone: "7.5.0", ipad: "7.5.0", macos: "9.2.0"} + since: {android: "12.3.0", iphone: "7.5.0", ipad: "7.5.0", macos: "9.2.0"} platforms: [android, iphone, ipad, macos] - name: trackUserInteraction From 2e58044a8c96ba5d299be4af1979a1214199a93c Mon Sep 17 00:00:00 2001 From: Michael Gangolf Date: Sat, 14 Sep 2024 18:08:48 +0200 Subject: [PATCH 15/15] update docs --- apidoc/Titanium/App/App.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apidoc/Titanium/App/App.yml b/apidoc/Titanium/App/App.yml index 9c6fa549b82..ea4b8540d12 100644 --- a/apidoc/Titanium/App/App.yml +++ b/apidoc/Titanium/App/App.yml @@ -398,7 +398,7 @@ events: summary: The duration of the keyboard animation. This parameter is only available on Titanium SDK 4.0.0 and later. type: Number platforms: [android, iphone, ipad, macos] - since: {android: "12.3.0", iphone: "3.0.0", ipad: "3.0.0", macos: "9.2.0"} + since: {android: "12.6.0", iphone: "3.0.0", ipad: "3.0.0", macos: "9.2.0"} - name: significanttimechange summary: Fired when there is a significant change in the time. @@ -616,7 +616,7 @@ properties: On Android it will only work using Android 11 and up. Otherwise it will always be false. type: Boolean permission: read-only - since: {android: "12.3.0", iphone: "7.5.0", ipad: "7.5.0", macos: "9.2.0"} + since: {android: "12.6.0", iphone: "7.5.0", ipad: "7.5.0", macos: "9.2.0"} platforms: [android, iphone, ipad, macos] - name: trackUserInteraction