From 8ab2727da0b80b96cd880f5b29dad0b996904087 Mon Sep 17 00:00:00 2001 From: Michael Gangolf Date: Mon, 20 Jan 2025 12:57:39 +0100 Subject: [PATCH 1/4] feat(android): softwareRendering property for WebView --- .../ti/modules/titanium/ui/WebViewProxy.java | 17 +++++++++++++++++ .../titanium/ui/widget/webview/TiUIWebView.java | 14 ++++++++++++++ apidoc/Titanium/UI/WebView.yml | 10 ++++++++++ 3 files changed, 41 insertions(+) diff --git a/android/modules/ui/src/java/ti/modules/titanium/ui/WebViewProxy.java b/android/modules/ui/src/java/ti/modules/titanium/ui/WebViewProxy.java index d0506b36a19..d781c496d32 100644 --- a/android/modules/ui/src/java/ti/modules/titanium/ui/WebViewProxy.java +++ b/android/modules/ui/src/java/ti/modules/titanium/ui/WebViewProxy.java @@ -75,6 +75,7 @@ public class WebViewProxy extends ViewProxy implements Handler.Callback, OnLifec private static String fpassword; PrintManager printManager; private Message postCreateMessage; + private boolean softwareMode = false; public WebViewProxy() { @@ -244,6 +245,22 @@ public HashMap getRequestHeaders() return new HashMap(); } + @Kroll.setProperty + public void setSoftwareMode(Boolean value) + { + TiUIWebView currWebView = getWebView(); + if (currWebView != null) { + softwareMode = value; + currWebView.setSoftwareMode(value); + } + } + + @Kroll.getProperty + public boolean getSoftwareMode() + { + return softwareMode; + } + @Kroll.setProperty public void setRequestHeaders(HashMap params) { diff --git a/android/modules/ui/src/java/ti/modules/titanium/ui/widget/webview/TiUIWebView.java b/android/modules/ui/src/java/ti/modules/titanium/ui/widget/webview/TiUIWebView.java index ef191355591..d0ea7312ba2 100644 --- a/android/modules/ui/src/java/ti/modules/titanium/ui/widget/webview/TiUIWebView.java +++ b/android/modules/ui/src/java/ti/modules/titanium/ui/widget/webview/TiUIWebView.java @@ -308,6 +308,7 @@ public TiUIWebView(TiViewProxy proxy) WebSettings settings = webView.getSettings(); settings.setUseWideViewPort(true); settings.setJavaScriptEnabled(true); +// webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); settings.setSupportMultipleWindows(true); settings.setJavaScriptCanOpenWindowsAutomatically(true); settings.setLoadsImagesAutomatically(true); @@ -1070,4 +1071,17 @@ protected void disableHWAcceleration() { Log.d(TAG, "Do not disable HW acceleration for WebView.", Log.DEBUG_MODE); } + + public void setSoftwareMode(Boolean value) + { + WebView webView = getWebView(); + if (webView != null) { + if (value) { + webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); + } else { + webView.setLayerType(View.LAYER_TYPE_HARDWARE, null); + } + } + } + } diff --git a/apidoc/Titanium/UI/WebView.yml b/apidoc/Titanium/UI/WebView.yml index 3b447f95fb3..b879d80a2d8 100644 --- a/apidoc/Titanium/UI/WebView.yml +++ b/apidoc/Titanium/UI/WebView.yml @@ -1020,6 +1020,16 @@ properties: platforms: [iphone, ipad, macos] since: {iphone: "2.0.0", ipad: "2.0.0", macos: "9.2.0"} + - name: softwareMode + summary: A Boolean value indicating the render mode of the WebView + description: | + Set to `true` (software rendering) if you use `Ti.Media.takeScreensho()` or `toImage()` and the WebView contains local HTML files. + Otherwise the WebView might be empty in the screenshot/image. + type: Boolean + default: false + platforms: [android] + since: {android: "12.7.0"} + - name: enableZoomControls summary: If `true`, zoom controls are enabled. type: Boolean From 982bf1734491b972a24ce2a92260da78b0b3ca5d Mon Sep 17 00:00:00 2001 From: Michael Gangolf Date: Mon, 20 Jan 2025 12:58:22 +0100 Subject: [PATCH 2/4] feat(android): softwareRendering property for WebView --- .../java/ti/modules/titanium/ui/widget/webview/TiUIWebView.java | 1 - 1 file changed, 1 deletion(-) diff --git a/android/modules/ui/src/java/ti/modules/titanium/ui/widget/webview/TiUIWebView.java b/android/modules/ui/src/java/ti/modules/titanium/ui/widget/webview/TiUIWebView.java index d0ea7312ba2..94c09614e47 100644 --- a/android/modules/ui/src/java/ti/modules/titanium/ui/widget/webview/TiUIWebView.java +++ b/android/modules/ui/src/java/ti/modules/titanium/ui/widget/webview/TiUIWebView.java @@ -308,7 +308,6 @@ public TiUIWebView(TiViewProxy proxy) WebSettings settings = webView.getSettings(); settings.setUseWideViewPort(true); settings.setJavaScriptEnabled(true); -// webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); settings.setSupportMultipleWindows(true); settings.setJavaScriptCanOpenWindowsAutomatically(true); settings.setLoadsImagesAutomatically(true); From fa05d041d52817b2898a2f4236b85193d174051b Mon Sep 17 00:00:00 2001 From: Michael Gangolf Date: Mon, 20 Jan 2025 13:43:12 +0100 Subject: [PATCH 3/4] update code --- .../ui/src/java/ti/modules/titanium/ui/WebViewProxy.java | 8 +++++--- .../modules/titanium/ui/widget/webview/TiUIWebView.java | 7 +++++++ .../titanium/src/java/org/appcelerator/titanium/TiC.java | 1 + 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/android/modules/ui/src/java/ti/modules/titanium/ui/WebViewProxy.java b/android/modules/ui/src/java/ti/modules/titanium/ui/WebViewProxy.java index d781c496d32..127f823f131 100644 --- a/android/modules/ui/src/java/ti/modules/titanium/ui/WebViewProxy.java +++ b/android/modules/ui/src/java/ti/modules/titanium/ui/WebViewProxy.java @@ -75,7 +75,6 @@ public class WebViewProxy extends ViewProxy implements Handler.Callback, OnLifec private static String fpassword; PrintManager printManager; private Message postCreateMessage; - private boolean softwareMode = false; public WebViewProxy() { @@ -250,7 +249,6 @@ public void setSoftwareMode(Boolean value) { TiUIWebView currWebView = getWebView(); if (currWebView != null) { - softwareMode = value; currWebView.setSoftwareMode(value); } } @@ -258,7 +256,11 @@ public void setSoftwareMode(Boolean value) @Kroll.getProperty public boolean getSoftwareMode() { - return softwareMode; + TiUIWebView currWebView = getWebView(); + if (currWebView != null) { + return currWebView.softwareMode; + } + return false; } @Kroll.setProperty diff --git a/android/modules/ui/src/java/ti/modules/titanium/ui/widget/webview/TiUIWebView.java b/android/modules/ui/src/java/ti/modules/titanium/ui/widget/webview/TiUIWebView.java index 94c09614e47..ee39f978458 100644 --- a/android/modules/ui/src/java/ti/modules/titanium/ui/widget/webview/TiUIWebView.java +++ b/android/modules/ui/src/java/ti/modules/titanium/ui/widget/webview/TiUIWebView.java @@ -64,6 +64,8 @@ public class TiUIWebView extends TiUIView private float zoomLevel = TiApplication.getInstance().getResources().getDisplayMetrics().density; private float initScale = zoomLevel; + public boolean softwareMode = false; + public static final int PLUGIN_STATE_OFF = 0; public static final int PLUGIN_STATE_ON = 1; public static final int PLUGIN_STATE_ON_DEMAND = 2; @@ -466,6 +468,10 @@ public void processProperties(KrollDict d) webView.setHorizontalScrollBarEnabled(scrollbarValue == AndroidModule.WEBVIEW_SCROLLBARS_DEFAULT || scrollbarValue == AndroidModule.WEBVIEW_SCROLLBARS_HIDE_VERTICAL); } + + if (d.containsKeyAndNotNull(TiC.PROPERTY_SOFTWARE_MODE)) { + setSoftwareMode(TiConvert.toBoolean(d, TiC.PROPERTY_SOFTWARE_MODE)); + } } @Override @@ -1075,6 +1081,7 @@ public void setSoftwareMode(Boolean value) { WebView webView = getWebView(); if (webView != null) { + softwareMode = value; if (value) { webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); } else { diff --git a/android/titanium/src/java/org/appcelerator/titanium/TiC.java b/android/titanium/src/java/org/appcelerator/titanium/TiC.java index 767b79e64fc..285d9bbb113 100644 --- a/android/titanium/src/java/org/appcelerator/titanium/TiC.java +++ b/android/titanium/src/java/org/appcelerator/titanium/TiC.java @@ -863,6 +863,7 @@ public class TiC public static final String PROPERTY_DEPARTMENT = "department"; public static final String PROPERTY_FIXED_SIZE = "fixedSize"; public static final String PROPERTY_UI_FLAGS = "uiFlags"; + public static final String PROPERTY_SOFTWARE_MODE = "softwareMode"; public static final String SIZE_AUTO = "auto"; public static final String URL_APP_PREFIX = "app://"; From 878f525d443cac5edf7203ded40ffe02a58e37cd Mon Sep 17 00:00:00 2001 From: Michael Gangolf Date: Mon, 20 Jan 2025 19:55:32 +0100 Subject: [PATCH 4/4] docs --- apidoc/Titanium/UI/WebView.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apidoc/Titanium/UI/WebView.yml b/apidoc/Titanium/UI/WebView.yml index b879d80a2d8..17cff86a16e 100644 --- a/apidoc/Titanium/UI/WebView.yml +++ b/apidoc/Titanium/UI/WebView.yml @@ -1024,7 +1024,7 @@ properties: summary: A Boolean value indicating the render mode of the WebView description: | Set to `true` (software rendering) if you use `Ti.Media.takeScreensho()` or `toImage()` and the WebView contains local HTML files. - Otherwise the WebView might be empty in the screenshot/image. + Otherwise the WebView might be empty in the screenshot/image. If you change the setting you will have to assing the HTML content again. type: Boolean default: false platforms: [android]