From d6000a5184d064650c93da2658c9ee4045fdea43 Mon Sep 17 00:00:00 2001 From: Steve Hannah Date: Sun, 25 Feb 2024 14:42:02 -0800 Subject: [PATCH 01/11] fix: Android browser component now works with multi-file selection. (#3788) Ticket: https://github.com/codenameone/CodenameOne/issues/3787 --- .../impl/android/AndroidImplementation.java | 25 ++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/Ports/Android/src/com/codename1/impl/android/AndroidImplementation.java b/Ports/Android/src/com/codename1/impl/android/AndroidImplementation.java index ff2792fa3e..fea1347972 100644 --- a/Ports/Android/src/com/codename1/impl/android/AndroidImplementation.java +++ b/Ports/Android/src/com/codename1/impl/android/AndroidImplementation.java @@ -7982,10 +7982,29 @@ public void onActivityResult(int requestCode, int resultCode, Intent intent) { if (requestCode == REQUEST_SELECT_FILE || requestCode == FILECHOOSER_RESULTCODE) { if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { if (requestCode == REQUEST_SELECT_FILE) { - if (uploadMessage == null) { - return; + if (uploadMessage == null) return; + Uri[] results = null; + + // Check that the response is a good one + if (resultCode == Activity.RESULT_OK) { + if (intent != null) { + // If there is not data, then we may have taken a photo + String dataString = intent.getDataString(); + ClipData clipData = intent.getClipData(); + + if (clipData != null) { + results = new Uri[clipData.getItemCount()]; + for (int i = 0; i < clipData.getItemCount(); i++) { + ClipData.Item item = clipData.getItemAt(i); + results[i] = item.getUri(); + } + } else if (dataString != null) { + results = new Uri[]{Uri.parse(dataString)}; + } + } } - uploadMessage.onReceiveValue(WebChromeClient.FileChooserParams.parseResult(resultCode, intent)); + + uploadMessage.onReceiveValue(results); uploadMessage = null; } } From 50cbaf48bccd31ff1274a11342a0a24901aa4dcb Mon Sep 17 00:00:00 2001 From: Steve Hannah Date: Sun, 25 Feb 2024 14:55:06 -0800 Subject: [PATCH 02/11] feat: Enable gradle 8 by default in android local builds. (#3789) --- .../java/com/codename1/builders/AndroidGradleBuilder.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/maven/codenameone-maven-plugin/src/main/java/com/codename1/builders/AndroidGradleBuilder.java b/maven/codenameone-maven-plugin/src/main/java/com/codename1/builders/AndroidGradleBuilder.java index 5efebda60d..de5d801bed 100644 --- a/maven/codenameone-maven-plugin/src/main/java/com/codename1/builders/AndroidGradleBuilder.java +++ b/maven/codenameone-maven-plugin/src/main/java/com/codename1/builders/AndroidGradleBuilder.java @@ -86,7 +86,7 @@ public class AndroidGradleBuilder extends Executor { private String gradle8DistributionUrl = "https://services.gradle.org/distributions/gradle-8.1-bin.zip"; public boolean PREFER_MANAGED_GRADLE=true; - private boolean useGradle8 = false; + private boolean useGradle8 = true; private boolean extendAppCompatActivity = false; @@ -474,7 +474,7 @@ private static String escape(String str, String chars) { @Override public boolean build(File sourceZip, final BuildRequest request) throws BuildException { boolean facebookSupported = request.getArg("facebook.appId", null) != null; - newFirebaseMessaging = request.getArg("android.newFirebaseMessaging", "false").equals("true"); + newFirebaseMessaging = request.getArg("android.newFirebaseMessaging", "true").equals("true"); useGradle8 = request.getArg("android.useGradle8", ""+(useGradle8 || newFirebaseMessaging || facebookSupported)).equals("true"); extendAppCompatActivity = request.getArg("android.extendAppCompatActivity", "false").equals("true"); useJava8SourceLevel = request.getArg("android.java8", ""+useJava8SourceLevel).equals("true"); From 892fa4c2b87737b7feb54d48decd09a341797d7d Mon Sep 17 00:00:00 2001 From: Steve Hannah Date: Sat, 2 Mar 2024 12:37:15 -0800 Subject: [PATCH 03/11] fix: Kotlin support when using gradle 8 (#3792) When using gradle 8, kotlin is included automatically so it needs to be stripped from user classes if they are provided. --- .../builders/AndroidGradleBuilder.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/maven/codenameone-maven-plugin/src/main/java/com/codename1/builders/AndroidGradleBuilder.java b/maven/codenameone-maven-plugin/src/main/java/com/codename1/builders/AndroidGradleBuilder.java index de5d801bed..76a949cba9 100644 --- a/maven/codenameone-maven-plugin/src/main/java/com/codename1/builders/AndroidGradleBuilder.java +++ b/maven/codenameone-maven-plugin/src/main/java/com/codename1/builders/AndroidGradleBuilder.java @@ -88,6 +88,11 @@ public class AndroidGradleBuilder extends Executor { private boolean useGradle8 = true; + // Flag to indicate whether we should strip kotlin from user classes + // Necessary for using gradle 8 because kotlin seems to be included by default, + // so we get duplicate class errors. + private boolean stripKotlinFromUserClasses = true; + private boolean extendAppCompatActivity = false; private boolean useJava8SourceLevel = true; @@ -477,6 +482,8 @@ public boolean build(File sourceZip, final BuildRequest request) throws BuildExc newFirebaseMessaging = request.getArg("android.newFirebaseMessaging", "true").equals("true"); useGradle8 = request.getArg("android.useGradle8", ""+(useGradle8 || newFirebaseMessaging || facebookSupported)).equals("true"); extendAppCompatActivity = request.getArg("android.extendAppCompatActivity", "false").equals("true"); + // When using gradle 8 we need to strip kotlin files from user classes otherwise we get duplicate class errors + stripKotlinFromUserClasses = useGradle8; useJava8SourceLevel = request.getArg("android.java8", ""+useJava8SourceLevel).equals("true"); if (useGradle8) { getGradleJavaHome(); // will throw build exception if JAVA17_HOME is not set @@ -976,6 +983,9 @@ public boolean build(File sourceZip, final BuildRequest request) throws BuildExc } catch (Exception ex) { throw new BuildException("Failed to extract source zip "+sourceZip, ex); } + if (stripKotlinFromUserClasses) { + stripKotlin(dummyClassesDir); + } File appDir = buildToolsVersionInt >= 27 ? new File(srcDir.getParentFile(), "app") : @@ -4445,4 +4455,19 @@ private void initPlayServiceVersions(BuildRequest request) { } } } + + private void stripKotlin(File dummyClassesDir) { + String[] skipDirectories = new String[] { + "org" + File.separator + "jetbrains" + File.separator + "annotations", + "org" + File.separator + "intellij" + File.separator + "lang" + File.separator + "annotations", + "kotlin" + }; + for (String path : skipDirectories) { + File directory = new File(dummyClassesDir, path); + if (directory.isDirectory()) { + log("Deleting directory " + directory); + delTree(directory, true); + } + } + } } From 4f1aca8db42921c2c6f3de6a5d4480f3593d6155 Mon Sep 17 00:00:00 2001 From: Steve Hannah Date: Mon, 4 Mar 2024 04:55:52 -0800 Subject: [PATCH 04/11] Removed firefase-core dependency when using fcm Not necessary for messaging, and also triggers imports of other libs that can cause problems during approval. E.g. ADs ID. --- .../com/codename1/builders/AndroidGradleBuilder.java | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/maven/codenameone-maven-plugin/src/main/java/com/codename1/builders/AndroidGradleBuilder.java b/maven/codenameone-maven-plugin/src/main/java/com/codename1/builders/AndroidGradleBuilder.java index 76a949cba9..087f759bb9 100644 --- a/maven/codenameone-maven-plugin/src/main/java/com/codename1/builders/AndroidGradleBuilder.java +++ b/maven/codenameone-maven-plugin/src/main/java/com/codename1/builders/AndroidGradleBuilder.java @@ -1330,19 +1330,7 @@ public void usesClassMethod(String cls, String method) { if (!request.getArg("android.xgradle", "").contains("apply plugin: 'com.google.gms.google-services'")) { request.putArgument("android.xgradle", request.getArg("android.xgradle", "") + "\napply plugin: 'com.google.gms.google-services'\n"); } - if (!request.getArg("gradleDependencies", "").contains("com.google.firebase:firebase-core")) { - debug("Adding firebase core to gradle dependencies."); - debug("Play services version: " + request.getArg("var.android.playServicesVersion", "")); - debug("gradleDependencies before: "+request.getArg("gradleDependencies", "")); - request.putArgument( - "gradleDependencies", - request.getArg("gradleDependencies", "") + - "\n"+compile+" \"com.google.firebase:firebase-core:" + - request.getArg("android.firebaseCoreVersion", playServicesVersion) + "\"\n" - ); - debug("gradleDependencies after: "+request.getArg("gradleDependencies", "")); - } if (!request.getArg("gradleDependencies", "").contains("com.google.firebase:firebase-messaging")) { request.putArgument( "gradleDependencies", From 0d2110a97fb8b84956d5926eeea2cec6501cb644 Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Wed, 6 Mar 2024 04:26:29 +0200 Subject: [PATCH 05/11] Fix for boolean properties in request builder As discussed in this thread: https://www.reddit.com/r/cn1/comments/1b6dwav/comment/ktfem6q/?context=3 --- .../com/codename1/io/rest/RequestBuilder.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/CodenameOne/src/com/codename1/io/rest/RequestBuilder.java b/CodenameOne/src/com/codename1/io/rest/RequestBuilder.java index ad03196e41..d84dac70e1 100644 --- a/CodenameOne/src/com/codename1/io/rest/RequestBuilder.java +++ b/CodenameOne/src/com/codename1/io/rest/RequestBuilder.java @@ -87,6 +87,7 @@ public class RequestBuilder { private Boolean postParameters; private Byte priority; private boolean insecure; + private Boolean useBoolean; RequestBuilder(String method, String url) { this.method = method; @@ -110,6 +111,17 @@ public RequestBuilder insecure(boolean insecure) { return this; } + /** + * Indicates if JSON should treat boolean values as Boolean. This values is set implicitly to true when reading property business objects + * + * @param useBoolean true to return Boolean objects in JSON Maps + * @return this request builder + */ + public RequestBuilder useBoolean(boolean useBoolean) { + this.useBoolean = useBoolean; + return this; + } + /** * Sets the caching mode for this request, see {@link com.codename1.io.ConnectionRequest#getCacheMode()} * @param cache the cache mode @@ -584,6 +596,7 @@ public void actionPerformed(NetworkEvent evt) { * @return returns the Connection Request object so it can be killed if necessary */ public ConnectionRequest fetchAsProperties(final OnComplete> callback, final Class type) { + useBoolean(true); final Connection request = createRequest(true); request.addResponseListener(new ActionListener() { @Override @@ -702,6 +715,7 @@ public Response getAsJsonMap() { * @return Response Object */ public Response getAsProperties(Class type) { + useBoolean(true); ConnectionRequest request = createRequest(true); fetched = true; CN.addToQueueAndWait(request); @@ -725,6 +739,7 @@ public Response getAsProperties(Class type) { * @return returns the Connection Request object so it can be killed if necessary */ public ConnectionRequest fetchAsPropertyList(final OnComplete>> callback, final Class type, final String root) { + useBoolean(true); final Connection request = createRequest(true); request.addResponseListener(new ActionListener() { @Override @@ -777,6 +792,7 @@ public ConnectionRequest fetchAsPropertyList(final OnComplete> getAsPropertyList(Class type, String root) { + useBoolean(true); ConnectionRequest request = createRequest(true); fetched = true; CN.addToQueueAndWait(request); @@ -848,6 +864,9 @@ protected void readUnzipedResponse(InputStream input) throws IOException { } if(jsonErrorCallback != null) { JSONParser jp = new JSONParser(); + if(useBoolean != null) { + jp.setUseBoolean(useBoolean); + } errorObject = jp.parseJSON(new InputStreamReader(input, "UTF-8")); errorHandler = jsonErrorCallback; return; @@ -855,6 +874,9 @@ protected void readUnzipedResponse(InputStream input) throws IOException { if(propertyErrorCallback != null) { try { JSONParser jp = new JSONParser(); + if(useBoolean != null) { + jp.setUseBoolean(useBoolean); + } Map m = jp.parseJSON(new InputStreamReader(input, "UTF-8")); PropertyBusinessObject pb = (PropertyBusinessObject)errorHandlerPropertyType.newInstance(); pb.getPropertyIndex().populateFromMap(m); @@ -872,6 +894,9 @@ protected void readUnzipedResponse(InputStream input) throws IOException { } if(parseJSON) { JSONParser parser = new JSONParser(); + if(useBoolean != null) { + jp.setUseBoolean(useBoolean); + } json = parser.parseJSON(new InputStreamReader(input, "UTF-8")); if(hasResponseListeners() && !isKilled()) { fireResponseListener(new NetworkEvent(this, json)); From 5910e84ebd97b99353841c552382e3d69275372a Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Wed, 6 Mar 2024 04:29:53 +0200 Subject: [PATCH 06/11] Fixed compilation error in previous commit --- CodenameOne/src/com/codename1/io/rest/RequestBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CodenameOne/src/com/codename1/io/rest/RequestBuilder.java b/CodenameOne/src/com/codename1/io/rest/RequestBuilder.java index d84dac70e1..d3f21b889a 100644 --- a/CodenameOne/src/com/codename1/io/rest/RequestBuilder.java +++ b/CodenameOne/src/com/codename1/io/rest/RequestBuilder.java @@ -895,7 +895,7 @@ protected void readUnzipedResponse(InputStream input) throws IOException { if(parseJSON) { JSONParser parser = new JSONParser(); if(useBoolean != null) { - jp.setUseBoolean(useBoolean); + parser.setUseBoolean(useBoolean); } json = parser.parseJSON(new InputStreamReader(input, "UTF-8")); if(hasResponseListeners() && !isKilled()) { From 4bdbf3d1b6ed3dddee5f8d2b10a1a95a89ea8fa7 Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Thu, 7 Mar 2024 18:13:38 +0200 Subject: [PATCH 07/11] Fixed regression in text editing This was caused by https://github.com/codenameone/CodenameOne/commit/cb2244b281838b15b23ebbaa483e0d63471180a5 --- .../codename1/impl/android/CodenameOneView.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/Ports/Android/src/com/codename1/impl/android/CodenameOneView.java b/Ports/Android/src/com/codename1/impl/android/CodenameOneView.java index bcdcf1b7d8..d93595ab4b 100644 --- a/Ports/Android/src/com/codename1/impl/android/CodenameOneView.java +++ b/Ports/Android/src/com/codename1/impl/android/CodenameOneView.java @@ -277,12 +277,16 @@ public boolean onKeyUpDown(boolean down, int keyCode, KeyEvent event) { case KeyEvent.KEYCODE_SYM: return false; case KeyEvent.KEYCODE_ENTER: - if (down) { - Display.getInstance().keyPressed(keyCode); - } else { - Display.getInstance().keyReleased(keyCode); + if(Display.getInstance().getProperty("sendEnterKey", "false").equals("true")) { + if (down) { + Display.getInstance().keyPressed(keyCode); + } else { + Display.getInstance().keyReleased(keyCode); + } + return false; } - return false; + break; + default: } From 4a0c7f587de212c2e3aa3fc88d322f58fa46b5c2 Mon Sep 17 00:00:00 2001 From: Steve Hannah Date: Sat, 9 Mar 2024 06:38:39 -0800 Subject: [PATCH 08/11] Use ditto instead of unzip to extract embedded .framework.zip files --- .../src/main/java/com/codename1/builders/IPhoneBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maven/codenameone-maven-plugin/src/main/java/com/codename1/builders/IPhoneBuilder.java b/maven/codenameone-maven-plugin/src/main/java/com/codename1/builders/IPhoneBuilder.java index b1aebf11a5..7c4cb7a434 100644 --- a/maven/codenameone-maven-plugin/src/main/java/com/codename1/builders/IPhoneBuilder.java +++ b/maven/codenameone-maven-plugin/src/main/java/com/codename1/builders/IPhoneBuilder.java @@ -427,7 +427,7 @@ public boolean build(File sourceZip, BuildRequest request) throws BuildException if (child.getName().endsWith(".framework.zip")) { log("Found framework "+child+". Attempting extract it and generate podspec for it"); try { - if (!exec(resDir, "unzip", child.getName(), "-d", new File(tmpDir, "dist").getAbsolutePath())) { + if (!exec(resDir, "ditto", "-x", "-k", child.getAbsolutePath(), new File(tmpDir, "dist").getAbsolutePath())) { log("Failed to unzip " + child.getName()); return false; } From ce5411882d83de9acd529a849ae91e2fb2b90bf8 Mon Sep 17 00:00:00 2001 From: Steve Hannah Date: Sun, 10 Mar 2024 06:16:52 -0700 Subject: [PATCH 09/11] fix: incorrect ios safe areas (#3794) Ticket: https://github.com/codenameone/CodenameOne/issues/3793 Co-authored-by: Steve Hannah --- .../CodenameOne_GLViewController.m | 31 ++++++++++++++++ Ports/iOSPort/nativeSources/IOSNative.m | 37 +++++-------------- 2 files changed, 40 insertions(+), 28 deletions(-) diff --git a/Ports/iOSPort/nativeSources/CodenameOne_GLViewController.m b/Ports/iOSPort/nativeSources/CodenameOne_GLViewController.m index adab25135a..b227897dc4 100644 --- a/Ports/iOSPort/nativeSources/CodenameOne_GLViewController.m +++ b/Ports/iOSPort/nativeSources/CodenameOne_GLViewController.m @@ -124,6 +124,26 @@ int nextPowerOf2(int val) { BOOL CN1_blockPaste=NO; BOOL CN1_blockCut=NO; BOOL CN1_blockCopy=NO; +JAVA_INT safeLeft = 0; +JAVA_INT safeRight = 0; +JAVA_INT safeTop = 0; +JAVA_INT safeBottom = 0; + +JAVA_INT getSafeLeft() { + return safeLeft; +} + +JAVA_INT getSafeRight() { + return safeRight; +} + +JAVA_INT getSafeBottom() { + return safeBottom; +} + +JAVA_INT getSafeTop() { + return safeTop; +} UIView *editingComponent; @@ -2644,6 +2664,17 @@ -(void) viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id)coor #endif } +- (void)viewSafeAreaInsetsDidChange { + [super viewSafeAreaInsetsDidChange]; + safeLeft = (JAVA_INT)self.view.window.safeAreaInsets.left * scaleValue; + safeRight = (JAVA_INT)self.view.window.safeAreaInsets.right * scaleValue; + safeTop = (JAVA_INT)self.view.window.safeAreaInsets.top * scaleValue; + safeBottom = (JAVA_INT)self.view.window.safeAreaInsets.bottom * scaleValue; + + lockDrawing = NO; + repaintUI(); +} + -(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { [[self eaglView] updateFrameBufferSize:(int)self.view.bounds.size.width h:(int)self.view.bounds.size.height]; diff --git a/Ports/iOSPort/nativeSources/IOSNative.m b/Ports/iOSPort/nativeSources/IOSNative.m index 86337ef276..476bdcfd7c 100644 --- a/Ports/iOSPort/nativeSources/IOSNative.m +++ b/Ports/iOSPort/nativeSources/IOSNative.m @@ -136,6 +136,11 @@ JAVA_OBJECT fromNSString(NSString* str) extern int Java_com_codename1_impl_ios_IOSImplementation_getDisplayHeightImpl(); +extern JAVA_INT getSafeTop(); +extern JAVA_INT getSafeLeft(); +extern JAVA_INT getSafeBottom(); +extern JAVA_INT getSafeRight(); + extern void Java_com_codename1_impl_ios_IOSImplementation_flushBufferImpl (void* peer, int x, int y, int width, int height); @@ -8284,43 +8289,19 @@ JAVA_BOOLEAN com_codename1_impl_ios_IOSNative_nativeIsAlphaMaskSupportedGlobal__ } JAVA_INT com_codename1_impl_ios_IOSNative_getDisplaySafeInsetLeft___R_int(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT instanceObject) { - if (@available(iOS 11.0, *)) { - UIWindow *window = UIApplication.sharedApplication.keyWindow; - if(window != nil) { - return (JAVA_INT)(window.safeAreaInsets.left * scaleValue); - } - } - return 0; + return getSafeLeft(); } JAVA_INT com_codename1_impl_ios_IOSNative_getDisplaySafeInsetTop___R_int(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT instanceObject) { - if (@available(iOS 11.0, *)) { - UIWindow *window = UIApplication.sharedApplication.keyWindow; - if(window != nil) { - return (JAVA_INT)(window.safeAreaInsets.top * scaleValue); - } - } - return 0; + return getSafeTop(); } JAVA_INT com_codename1_impl_ios_IOSNative_getDisplaySafeInsetRight___R_int(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT instanceObject) { - if (@available(iOS 11.0, *)) { - UIWindow *window = UIApplication.sharedApplication.keyWindow; - if(window != nil) { - return (JAVA_INT)(window.safeAreaInsets.right * scaleValue); - } - } - return 0; + return getSafeRight(); } JAVA_INT com_codename1_impl_ios_IOSNative_getDisplaySafeInsetBottom___R_int(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT instanceObject) { - if (@available(iOS 11.0, *)) { - UIWindow *window = UIApplication.sharedApplication.keyWindow; - if(window != nil) { - return (JAVA_INT)(window.safeAreaInsets.bottom * scaleValue); - } - } - return 0; + return getSafeBottom(); } JAVA_INT com_codename1_impl_ios_IOSNative_getDisplayWidth___R_int(CN1_THREAD_STATE_MULTI_ARG JAVA_OBJECT instanceObject) { From c7f843da2babd8a46dbf680bae4ab69018b0b467 Mon Sep 17 00:00:00 2001 From: Nick Price Date: Tue, 12 Mar 2024 02:35:01 +0000 Subject: [PATCH 10/11] Use JSONParser.setUseLongsInstance and JSONParser.setUseBooleanInstance (#3796) --- .../com/codename1/io/rest/RequestBuilder.java | 40 +++++++++++++------ 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/CodenameOne/src/com/codename1/io/rest/RequestBuilder.java b/CodenameOne/src/com/codename1/io/rest/RequestBuilder.java index d3f21b889a..1d7262e764 100644 --- a/CodenameOne/src/com/codename1/io/rest/RequestBuilder.java +++ b/CodenameOne/src/com/codename1/io/rest/RequestBuilder.java @@ -32,7 +32,6 @@ import com.codename1.properties.PropertyBusinessObject; import com.codename1.ui.CN; import com.codename1.ui.events.ActionListener; -import com.codename1.ui.util.EventDispatcher; import com.codename1.util.Base64; import com.codename1.util.Callback; import com.codename1.util.FailureCallback; @@ -88,6 +87,7 @@ public class RequestBuilder { private Byte priority; private boolean insecure; private Boolean useBoolean; + private Boolean useLongs; RequestBuilder(String method, String url) { this.method = method; @@ -121,6 +121,18 @@ public RequestBuilder useBoolean(boolean useBoolean) { this.useBoolean = useBoolean; return this; } + + /** + * Indicates if JSON should treat non-decimal numeric values as Long. If not set, uses the current default + * from the static value in JSONParser.isUseLongs + * + * @param useLongs true to return Long objects in JSON Maps + * @return this request builder + */ + public RequestBuilder useLongs(boolean useLongs) { + this.useLongs = useLongs; + return this; + } /** * Sets the caching mode for this request, see {@link com.codename1.io.ConnectionRequest#getCacheMode()} @@ -863,20 +875,14 @@ protected void readUnzipedResponse(InputStream input) throws IOException { return; } if(jsonErrorCallback != null) { - JSONParser jp = new JSONParser(); - if(useBoolean != null) { - jp.setUseBoolean(useBoolean); - } + JSONParser jp = createJSONParser(); errorObject = jp.parseJSON(new InputStreamReader(input, "UTF-8")); errorHandler = jsonErrorCallback; return; } if(propertyErrorCallback != null) { try { - JSONParser jp = new JSONParser(); - if(useBoolean != null) { - jp.setUseBoolean(useBoolean); - } + JSONParser jp = createJSONParser(); Map m = jp.parseJSON(new InputStreamReader(input, "UTF-8")); PropertyBusinessObject pb = (PropertyBusinessObject)errorHandlerPropertyType.newInstance(); pb.getPropertyIndex().populateFromMap(m); @@ -893,10 +899,7 @@ protected void readUnzipedResponse(InputStream input) throws IOException { return; } if(parseJSON) { - JSONParser parser = new JSONParser(); - if(useBoolean != null) { - parser.setUseBoolean(useBoolean); - } + JSONParser parser = createJSONParser(); json = parser.parseJSON(new InputStreamReader(input, "UTF-8")); if(hasResponseListeners() && !isKilled()) { fireResponseListener(new NetworkEvent(this, json)); @@ -915,6 +918,17 @@ protected void postResponse() { } + private JSONParser createJSONParser() { + JSONParser jp = new JSONParser(); + if (useBoolean != null) { + jp.setUseBooleanInstance(useBoolean); + } + if (useLongs != null) { + jp.setUseLongsInstance(useLongs); + } + return jp; + } + private Connection createRequest(boolean parseJson) { Connection req = new Connection(parseJson); for (String key : pathParams.keySet()) { From cf4a235a718588478988a0467c36d618ec4db3d9 Mon Sep 17 00:00:00 2001 From: Nick Price Date: Tue, 12 Mar 2024 15:20:48 +0000 Subject: [PATCH 11/11] Use JSONParser.setUseLongsInstance and JSONParser.setUseBooleanInstance in PropertyIndex (#3797) --- .../src/com/codename1/properties/PropertyIndex.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/CodenameOne/src/com/codename1/properties/PropertyIndex.java b/CodenameOne/src/com/codename1/properties/PropertyIndex.java index 306c7d232e..a80272df85 100644 --- a/CodenameOne/src/com/codename1/properties/PropertyIndex.java +++ b/CodenameOne/src/com/codename1/properties/PropertyIndex.java @@ -701,8 +701,8 @@ public List loadJSONList(String name) { public List loadJSONList(InputStream stream) throws IOException { JSONParser jp = new JSONParser(); - JSONParser.setUseBoolean(true); - JSONParser.setUseLongs(true); + jp.setUseBooleanInstance(true); + jp.setUseLongsInstance(true); List response = new ArrayList(); Map result = jp.parseJSON(new InputStreamReader(stream, "UTF-8")); List entries = (List)result.get("root"); @@ -735,8 +735,8 @@ public void fromJSON(String jsonString) { try { StringReader r = new StringReader(jsonString); JSONParser jp = new JSONParser(); - JSONParser.setUseBoolean(true); - JSONParser.setUseLongs(true); + jp.setUseBooleanInstance(true); + jp.setUseLongsInstance(true); populateFromMap(jp.parseJSON(r), parent.getClass()); } catch(IOException err) { Log.e(err); @@ -774,8 +774,8 @@ public void loadJSON(String name) { */ public void loadJSON(InputStream stream) throws IOException { JSONParser jp = new JSONParser(); - JSONParser.setUseBoolean(true); - JSONParser.setUseLongs(true); + jp.setUseBooleanInstance(true); + jp.setUseLongsInstance(true); populateFromMap(jp.parseJSON(new InputStreamReader(stream, "UTF-8")), parent.getClass()); }