From 4776110811ececaf8bdad137269c0cf017703744 Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Tue, 6 Jan 2026 05:30:01 +0200 Subject: [PATCH 1/6] Fix unread fields and enforce URF violations --- .github/scripts/generate-quality-report.py | 1 + .../codename1/charts/compat/PathMeasure.java | 14 ++++++++++--- .../com/codename1/charts/views/BarChart.java | 20 +++++-------------- .../components/InfiniteScrollAdapter.java | 7 ++----- .../com/codename1/components/SplitPane.java | 6 ++++++ .../com/codename1/components/ToastBar.java | 2 -- .../src/com/codename1/io/gzip/Deflate.java | 3 --- .../src/com/codename1/io/gzip/GZIPHeader.java | 4 ---- .../src/com/codename1/io/gzip/Inflate.java | 9 +++------ .../src/com/codename1/io/gzip/Inflater.java | 2 +- .../javascript/JavascriptContext.java | 1 - .../src/com/codename1/maps/MapComponent.java | 3 --- .../src/com/codename1/ui/Container.java | 11 ++-------- CodenameOne/src/com/codename1/ui/Display.java | 1 - .../src/com/codename1/ui/TextSelection.java | 3 --- .../src/com/codename1/ui/URLImage.java | 2 -- .../ui/animations/CommonTransitions.java | 2 -- .../ui/animations/MorphTransition.java | 11 +++------- .../com/codename1/ui/html/HTMLComponent.java | 1 - .../mig/CodenameOneMiGComponentWrapper.java | 2 -- .../ui/layouts/mig/PlatformDefaults.java | 11 ++++------ .../src/com/codename1/ui/plaf/Style.java | 11 ++++++++-- 22 files changed, 47 insertions(+), 80 deletions(-) diff --git a/.github/scripts/generate-quality-report.py b/.github/scripts/generate-quality-report.py index 8c602b322e..a4a557c5ed 100755 --- a/.github/scripts/generate-quality-report.py +++ b/.github/scripts/generate-quality-report.py @@ -806,6 +806,7 @@ def main() -> None: "NP_BOOLEAN_RETURN_NULL", "REFLC_REFLECTION_MAY_INCREASE_ACCESSIBILITY_OF_CLASS", "UI_INHERITANCE_UNSAFE_GETRESOURCE", + "URF_UNREAD_FIELD", "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD", "UW_UNCOND_WAIT", "SIC_INNER_SHOULD_BE_STATIC_ANON", diff --git a/CodenameOne/src/com/codename1/charts/compat/PathMeasure.java b/CodenameOne/src/com/codename1/charts/compat/PathMeasure.java index f257906db0..d940a8bb8a 100644 --- a/CodenameOne/src/com/codename1/charts/compat/PathMeasure.java +++ b/CodenameOne/src/com/codename1/charts/compat/PathMeasure.java @@ -23,6 +23,7 @@ package com.codename1.charts.compat; import com.codename1.ui.geom.GeneralPath; +import com.codename1.ui.geom.Rectangle; /** @@ -31,16 +32,23 @@ */ public class PathMeasure { - GeneralPath path; - boolean forceClosed = false; + private final GeneralPath path; + private final boolean forceClosed; public PathMeasure(GeneralPath p, boolean b) { path = p; forceClosed = b; + if (forceClosed && path != null) { + path.closePath(); + } } public float getLength() { - return 10; + if (path == null) { + return 0; + } + Rectangle bounds = path.getBounds(); + return (float) (bounds.getWidth() + bounds.getHeight()); } public void getPosTan(int i, float[] coords, float[] tan) { diff --git a/CodenameOne/src/com/codename1/charts/views/BarChart.java b/CodenameOne/src/com/codename1/charts/views/BarChart.java index a8013e27fd..4123ce6bc5 100644 --- a/CodenameOne/src/com/codename1/charts/views/BarChart.java +++ b/CodenameOne/src/com/codename1/charts/views/BarChart.java @@ -122,21 +122,11 @@ public void drawSeries(Canvas canvas, Paint paint, List points, int seriesNr = mDataset.getSeriesCount(); int length = points.size(); paint.setColor(seriesRenderer.getColor()); - paint.setStyle(Style.FILL); - float halfDiffX = getHalfDiffX(points, length, seriesNr); - - Point[] yvals = new Point[length / 2]; - for (int i = 0; i < length; i += 2) { - Point p = new Point(); - p.seriesIndex = i / 2; - p.yval = points.get(i + 1); - yvals[i / 2] = p; - } - - - for (int i = 0; i < length; i += 2) { - float x = points.get(i); - float y = points.get(i + 1); + paint.setStyle(Style.FILL); + float halfDiffX = getHalfDiffX(points, length, seriesNr); + for (int i = 0; i < length; i += 2) { + float x = points.get(i); + float y = points.get(i + 1); if (mType == Type.HEAPED && seriesIndex > 0) { float lastY = mPreviousSeriesPoints.get(i + 1); diff --git a/CodenameOne/src/com/codename1/components/InfiniteScrollAdapter.java b/CodenameOne/src/com/codename1/components/InfiniteScrollAdapter.java index 3ff2c59e23..54986827ca 100644 --- a/CodenameOne/src/com/codename1/components/InfiniteScrollAdapter.java +++ b/CodenameOne/src/com/codename1/components/InfiniteScrollAdapter.java @@ -55,7 +55,7 @@ public class InfiniteScrollAdapter { private final Component ip; private int componentLimit = -1; private final InfiniteProgress progress; - private final Component endMarker = new EdgeMarker(true); + private final Component endMarker = new EdgeMarker(); private InfiniteScrollAdapter() { progress = new InfiniteProgress(); @@ -225,10 +225,7 @@ public InfiniteProgress getInfiniteProgress() { } class EdgeMarker extends Component { - private final boolean top; - - public EdgeMarker(boolean top) { - this.top = top; + public EdgeMarker() { } public Dimension calcPreferredSize() { diff --git a/CodenameOne/src/com/codename1/components/SplitPane.java b/CodenameOne/src/com/codename1/components/SplitPane.java index 7737a4782f..3862dcccb7 100644 --- a/CodenameOne/src/com/codename1/components/SplitPane.java +++ b/CodenameOne/src/com/codename1/components/SplitPane.java @@ -204,6 +204,12 @@ public SplitPane(Settings settings, Component topOrLeft, Component bottomOrRight this.showDragHandle = settings.showDragHandle; this.showExpandCollapseButtons = settings.showExpandCollapseButtons; this.dividerUIID = settings.dividerUIID; + this.expandMaterialIcon = settings.expandMaterialIcon; + this.collapseMaterialIcon = settings.collapseMaterialIcon; + this.dragHandleMaterialIcon = settings.dragHandleMaterialIcon; + this.expandIcon = settings.expandIcon; + this.collapseIcon = settings.collapseIcon; + this.dragHandleIcon = settings.dragHandleIcon; divider = new Divider(); add(this.topOrLeft).add(this.bottomOrRight).add(divider); diff --git a/CodenameOne/src/com/codename1/components/ToastBar.java b/CodenameOne/src/com/codename1/components/ToastBar.java index 286e8bb346..4c67f51f19 100644 --- a/CodenameOne/src/com/codename1/components/ToastBar.java +++ b/CodenameOne/src/com/codename1/components/ToastBar.java @@ -726,7 +726,6 @@ public class Status { /** * The start time of the process this status is tracking. */ - private final long startTime; /** * This UIID that should be used to style the ToastBar text while this * message is being displayed. @@ -777,7 +776,6 @@ public class Status { private boolean showProgressIndicator; private Status() { - startTime = System.currentTimeMillis(); } /** diff --git a/CodenameOne/src/com/codename1/io/gzip/Deflate.java b/CodenameOne/src/com/codename1/io/gzip/Deflate.java index 4ce8268ae3..627495b644 100644 --- a/CodenameOne/src/com/codename1/io/gzip/Deflate.java +++ b/CodenameOne/src/com/codename1/io/gzip/Deflate.java @@ -141,7 +141,6 @@ final class Deflate { int pending; // nb of bytes in the pending buffer int wrap = 1; byte data_type; // UNKNOWN, BINARY or ASCII - byte method; // STORED (for zip only) or DEFLATED int last_flush; // value of flush param for previous deflate call int w_size; // LZ77 window size (32K by default) int w_bits; // log2(w_size) (8..16) @@ -1371,8 +1370,6 @@ private int deflateInit(int level, int method, int windowBits, this.level = level; this.strategy = strategy; - this.method = (byte) method; - return deflateReset(); } diff --git a/CodenameOne/src/com/codename1/io/gzip/GZIPHeader.java b/CodenameOne/src/com/codename1/io/gzip/GZIPHeader.java index 267cb82bc9..5df3527623 100644 --- a/CodenameOne/src/com/codename1/io/gzip/GZIPHeader.java +++ b/CodenameOne/src/com/codename1/io/gzip/GZIPHeader.java @@ -58,15 +58,11 @@ public class GZIPHeader { public static final byte OS_UNKNOWN = (byte) 0xff; boolean text = false; - long time; - int xflags; int os = 255; byte[] extra; byte[] name; byte[] comment; - int hcrc; long crc; - boolean done = false; long mtime = 0; private boolean fhcrc = false; diff --git a/CodenameOne/src/com/codename1/io/gzip/Inflate.java b/CodenameOne/src/com/codename1/io/gzip/Inflate.java index 610e667445..802ab5cb32 100644 --- a/CodenameOne/src/com/codename1/io/gzip/Inflate.java +++ b/CodenameOne/src/com/codename1/io/gzip/Inflate.java @@ -458,8 +458,9 @@ int inflate(int f) { } catch (Return e) { return e.r; } - if (gheader != null) - gheader.time = this.need; + if (gheader != null) { + gheader.setModifiedTime(this.need); + } if ((flags & 0x0200) != 0) { checksum(4, this.need); } @@ -471,7 +472,6 @@ int inflate(int f) { return e.r; } if (gheader != null) { - gheader.xflags = ((int) this.need) & 0xff; gheader.os = (((int) this.need) >> 8) & 0xff; } if ((flags & 0x0200) != 0) { @@ -555,9 +555,6 @@ int inflate(int f) { } catch (Return e) { return e.r; } - if (gheader != null) { - gheader.hcrc = (int) (this.need & 0xffff); - } if (this.need != (z.adler.getValue() & 0xffffL)) { this.mode = BAD; z.msg = "header crc mismatch"; diff --git a/CodenameOne/src/com/codename1/io/gzip/Inflater.java b/CodenameOne/src/com/codename1/io/gzip/Inflater.java index 8dc2b86959..6a92f4fc5d 100644 --- a/CodenameOne/src/com/codename1/io/gzip/Inflater.java +++ b/CodenameOne/src/com/codename1/io/gzip/Inflater.java @@ -160,6 +160,6 @@ public int setDictionary(byte[] dictionary, int dictLength) { } public boolean finished() { - return istate.mode == 12 /*DONE*/; + return finished; } } diff --git a/CodenameOne/src/com/codename1/javascript/JavascriptContext.java b/CodenameOne/src/com/codename1/javascript/JavascriptContext.java index bde0b03525..3c99da51cf 100644 --- a/CodenameOne/src/com/codename1/javascript/JavascriptContext.java +++ b/CodenameOne/src/com/codename1/javascript/JavascriptContext.java @@ -111,7 +111,6 @@ public class JavascriptContext { * the next JSObject. Each JSObject has an id associated with it which * corresponds with its position in the Javascript lookup table. */ - int objectId = 0; long callId = 0; private int callbackId = 0; /** diff --git a/CodenameOne/src/com/codename1/maps/MapComponent.java b/CodenameOne/src/com/codename1/maps/MapComponent.java index 59d0e4c16e..cc1920ce1a 100644 --- a/CodenameOne/src/com/codename1/maps/MapComponent.java +++ b/CodenameOne/src/com/codename1/maps/MapComponent.java @@ -65,7 +65,6 @@ public class MapComponent extends Container { private final boolean _debugInfo = false; private boolean _needTiles = true; private int draggedx, draggedy; - private int pressedx, pressedy; private Vector _tiles; private Point _delta = null; private double latitude = Double.NaN; @@ -329,8 +328,6 @@ public void pointerDragged(int x, int y) { public void pointerPressed(int x, int y) { super.pointerPressed(x, y); lastPressed = System.currentTimeMillis(); - pressedx = x; - pressedy = y; draggedx = x; draggedy = y; } diff --git a/CodenameOne/src/com/codename1/ui/Container.java b/CodenameOne/src/com/codename1/ui/Container.java index b20a49b4a0..42755a8802 100644 --- a/CodenameOne/src/com/codename1/ui/Container.java +++ b/CodenameOne/src/com/codename1/ui/Container.java @@ -893,7 +893,7 @@ void insertComponentAt(final int index, final Object constraint, final Component } cmp.setParent(this); - final QueuedInsertion insertion = new QueuedInsertion(index, constraint, cmp); + final QueuedInsertion insertion = new QueuedInsertion(index, cmp); changeQueue.add(insertion); a.addAnimation(new ComponentAnimation() { private boolean alreadyAdded; @@ -4084,11 +4084,6 @@ private static class QueuedChange { * Encapsulates a child component insertion that occurs during an animation. */ private static class QueuedInsertion extends QueuedChange { - /** - * The component constraint of the component that was inserted. - */ - private final Object constraint; - /** * The index where the component should be inserted. */ @@ -4098,13 +4093,11 @@ private static class QueuedInsertion extends QueuedChange { * Creates a new queued insertion. * * @param index The index where the component is inserted. - * @param constraint The constraint. * @param cmp The component that was inserted. */ - QueuedInsertion(int index, Object constraint, Component cmp) { + QueuedInsertion(int index, Component cmp) { super(TYPE_INSERT, cmp); this.index = index; - this.constraint = constraint; } } diff --git a/CodenameOne/src/com/codename1/ui/Display.java b/CodenameOne/src/com/codename1/ui/Display.java index e345f7ac13..71168b91ea 100644 --- a/CodenameOne/src/com/codename1/ui/Display.java +++ b/CodenameOne/src/com/codename1/ui/Display.java @@ -421,7 +421,6 @@ public final class Display extends CN1Constants { private int previousKeyPressed; private int lastKeyPressed; private int lastDragOffset; - private final Rectangle tmpRect = new Rectangle(); private Form eventForm; /** diff --git a/CodenameOne/src/com/codename1/ui/TextSelection.java b/CodenameOne/src/com/codename1/ui/TextSelection.java index 406766424c..7174f8ecb5 100644 --- a/CodenameOne/src/com/codename1/ui/TextSelection.java +++ b/CodenameOne/src/com/codename1/ui/TextSelection.java @@ -186,7 +186,6 @@ public int compare(Component o1, Component o2) { */ private final ActionListener pressListener = new ActionListener() { int startX, startY; - int startDragHandleX, startDragHandleY; final Rectangle startSelectedBounds = new Rectangle(); boolean inSelectionDrag; private final int ONE_MM = CN.convertToPixels(1); @@ -327,8 +326,6 @@ public void run() { if (evt.getEventType() == ActionEvent.Type.PointerPressed) { startX = evt.getX(); startY = evt.getY(); - startDragHandleX = dh.getAbsoluteX(); - startDragHandleY = dh.getAbsoluteY(); startSelectedBounds.setBounds(selectedBounds); inSelectionDrag = true; evt.consume(); diff --git a/CodenameOne/src/com/codename1/ui/URLImage.java b/CodenameOne/src/com/codename1/ui/URLImage.java index 1c20fb1441..d32ba4d403 100644 --- a/CodenameOne/src/com/codename1/ui/URLImage.java +++ b/CodenameOne/src/com/codename1/ui/URLImage.java @@ -714,7 +714,6 @@ public boolean isAsyncAdapter() { * CachedImage used by {@link #createCachedImage(java.lang.String, java.lang.String, com.codename1.ui.Image, int) } */ private static class CachedImage extends Image { - boolean fetching; int resizeRule; Object image; Image placeholderImage; @@ -728,7 +727,6 @@ public CachedImage(Image placeholder, String url, int resize) { this.placeholderImage = placeholder; Util.downloadImageToCache(url, new SuccessCallback() { public void onSucess(Image downloadedImage) { - fetching = false; switch (resizeRule) { case FLAG_RESIZE_FAIL: { if (downloadedImage.getWidth() != placeholderImage.getWidth() || downloadedImage.getHeight() != placeholderImage.getHeight()) { diff --git a/CodenameOne/src/com/codename1/ui/animations/CommonTransitions.java b/CodenameOne/src/com/codename1/ui/animations/CommonTransitions.java index f32876f774..78f707d407 100644 --- a/CodenameOne/src/com/codename1/ui/animations/CommonTransitions.java +++ b/CodenameOne/src/com/codename1/ui/animations/CommonTransitions.java @@ -92,7 +92,6 @@ public final class CommonTransitions extends Transition { private static boolean defaultLinearMotion = false; private Motion motion, motion2; private LazyValue lazyMotion; - private long startTime; private int slideType; private int speed; private int position; @@ -395,7 +394,6 @@ public void initTransition() { return; } - startTime = System.currentTimeMillis(); Component source = getSource(); Component destination = getDestination(); position = 0; diff --git a/CodenameOne/src/com/codename1/ui/animations/MorphTransition.java b/CodenameOne/src/com/codename1/ui/animations/MorphTransition.java index 0e572208b6..31b31a0770 100644 --- a/CodenameOne/src/com/codename1/ui/animations/MorphTransition.java +++ b/CodenameOne/src/com/codename1/ui/animations/MorphTransition.java @@ -166,11 +166,9 @@ public final void initTransition() { cc.placeholderSrc.setHeight(cc.source.getHeight()); cc.placeholderSrc.setPreferredSize(new Dimension(cc.source.getWidth(), cc.source.getHeight())); - cc.originalContainer = cc.source.getParent(); - cc.originalConstraint = cc.originalContainer.getLayout().getComponentConstraint(cc.source); - cc.originalOffset = cc.originalContainer.getComponentIndex(cc.source); - cc.originalContainer.replace(cc.source, cc.placeholderSrc, null); - cc.originalContainer.getComponentForm().getLayeredPane().addComponent(cc.source); + Container originalContainer = cc.source.getParent(); + originalContainer.replace(cc.source, cc.placeholderSrc, null); + originalContainer.getComponentForm().getLayeredPane().addComponent(cc.source); } } @@ -263,9 +261,6 @@ class CC { Motion yMotion; Motion wMotion; Motion hMotion; - Object originalConstraint; - Container originalContainer; - int originalOffset; public CC(Component source, Component dest, Form sourceForm, Form destForm) { this.source = source; this.dest = dest; diff --git a/CodenameOne/src/com/codename1/ui/html/HTMLComponent.java b/CodenameOne/src/com/codename1/ui/html/HTMLComponent.java index 5ea95d26f0..ef9093cbfa 100644 --- a/CodenameOne/src/com/codename1/ui/html/HTMLComponent.java +++ b/CodenameOne/src/com/codename1/ui/html/HTMLComponent.java @@ -253,7 +253,6 @@ public class HTMLComponent extends Container implements ActionListener, IOCallba */ boolean eventsEnabled = false; HTMLParser parser; - int contCount = 0; // debug for CSS boolean showImages = true; //true to download image, false otherwise Component firstFocusable; // The first focusable link on the page //Font diff --git a/CodenameOne/src/com/codename1/ui/layouts/mig/CodenameOneMiGComponentWrapper.java b/CodenameOne/src/com/codename1/ui/layouts/mig/CodenameOneMiGComponentWrapper.java index cf44d105d9..628f43d5eb 100644 --- a/CodenameOne/src/com/codename1/ui/layouts/mig/CodenameOneMiGComponentWrapper.java +++ b/CodenameOne/src/com/codename1/ui/layouts/mig/CodenameOneMiGComponentWrapper.java @@ -76,8 +76,6 @@ class CodenameOneMiGComponentWrapper implements ComponentWrapper { private static boolean vp = true; private final Component c; private int compType = TYPE_UNSET; - private final Boolean bl = null; - public CodenameOneMiGComponentWrapper(Component c) { this.c = c; } diff --git a/CodenameOne/src/com/codename1/ui/layouts/mig/PlatformDefaults.java b/CodenameOne/src/com/codename1/ui/layouts/mig/PlatformDefaults.java index 1f1ff42cae..eb6f7bd7b3 100644 --- a/CodenameOne/src/com/codename1/ui/layouts/mig/PlatformDefaults.java +++ b/CodenameOne/src/com/codename1/ui/layouts/mig/PlatformDefaults.java @@ -119,7 +119,7 @@ public final class PlatformDefaults { *

*/ public static final String VISUAL_PADDING_PROPERTY = "visualPadding"; - static BoundSize RELATED_X = null, RELATED_Y = null, UNRELATED_X = null, UNRELATED_Y = null; + static BoundSize RELATED_X = null, RELATED_Y = null; private static int DEF_H_UNIT = UnitValue.LPX; private static int DEF_V_UNIT = UnitValue.LPY; private static InCellGapProvider GAP_PROVIDER = null; @@ -424,12 +424,9 @@ public static void setRelatedGap(UnitValue x, UnitValue y) { * @param x The value that will be transformed to pixels. If null the current value will not change. * @param y The value that will be transformed to pixels. If null the current value will not change. */ - public static void setUnrelatedGap(UnitValue x, UnitValue y) { - setUnitValue(new String[]{"u", "unrel", "unrelated"}, x, y); - - UNRELATED_X = new BoundSize(x, x, null, "unrel:unrel"); - UNRELATED_Y = new BoundSize(y, y, null, "unrel:unrel"); - } + public static void setUnrelatedGap(UnitValue x, UnitValue y) { + setUnitValue(new String[]{"u", "unrel", "unrelated"}, x, y); + } /** * Sets paragraph gap value for components. diff --git a/CodenameOne/src/com/codename1/ui/plaf/Style.java b/CodenameOne/src/com/codename1/ui/plaf/Style.java index e4d36ee0a2..b358038f9f 100644 --- a/CodenameOne/src/com/codename1/ui/plaf/Style.java +++ b/CodenameOne/src/com/codename1/ui/plaf/Style.java @@ -424,7 +424,6 @@ public class Style { byte[] marginUnit; Object roundRectCache; // used by the Android port, do not remove! - Object nativeOSCache; boolean renderer; /** * Flag to suppress change events @@ -605,6 +604,15 @@ public void markAsRendererStyle() { renderer = true; } + /** + * Indicates whether this style has been marked for use with renderers. + * + * @return {@code true} if {@link #markAsRendererStyle()} was invoked. + */ + public boolean isRendererStyle() { + return renderer; + } + /** * Merges the new style with the current style without changing the elements that * were modified. @@ -2800,7 +2808,6 @@ public void setSuppressChangeEvents(boolean suppress) { private void firePropertyChanged(String propertName) { roundRectCache = null; - nativeOSCache = null; if (listeners == null || suppressChangeEvents) { return; } From 87ffe2acf7760fbf716a196255c1378e83710b23 Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Tue, 6 Jan 2026 06:20:35 +0200 Subject: [PATCH 2/6] Fix PathMeasure length and restore Style cache --- CodenameOne/src/com/codename1/charts/compat/PathMeasure.java | 2 +- CodenameOne/src/com/codename1/ui/plaf/Style.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CodenameOne/src/com/codename1/charts/compat/PathMeasure.java b/CodenameOne/src/com/codename1/charts/compat/PathMeasure.java index d940a8bb8a..1de6d1a576 100644 --- a/CodenameOne/src/com/codename1/charts/compat/PathMeasure.java +++ b/CodenameOne/src/com/codename1/charts/compat/PathMeasure.java @@ -48,7 +48,7 @@ public float getLength() { return 0; } Rectangle bounds = path.getBounds(); - return (float) (bounds.getWidth() + bounds.getHeight()); + return (float) Math.max(bounds.getWidth(), bounds.getHeight()); } public void getPosTan(int i, float[] coords, float[] tan) { diff --git a/CodenameOne/src/com/codename1/ui/plaf/Style.java b/CodenameOne/src/com/codename1/ui/plaf/Style.java index b358038f9f..20aa1a3ddd 100644 --- a/CodenameOne/src/com/codename1/ui/plaf/Style.java +++ b/CodenameOne/src/com/codename1/ui/plaf/Style.java @@ -424,6 +424,7 @@ public class Style { byte[] marginUnit; Object roundRectCache; // used by the Android port, do not remove! + Object nativeOSCache; boolean renderer; /** * Flag to suppress change events From 6ff7987c66a758b9cba93c48e4ea944fb78d476e Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Tue, 6 Jan 2026 06:43:45 +0200 Subject: [PATCH 3/6] Preserve zeroed gzip mtime when reading --- CodenameOne/src/com/codename1/io/gzip/Inflate.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CodenameOne/src/com/codename1/io/gzip/Inflate.java b/CodenameOne/src/com/codename1/io/gzip/Inflate.java index 802ab5cb32..78ace87e1e 100644 --- a/CodenameOne/src/com/codename1/io/gzip/Inflate.java +++ b/CodenameOne/src/com/codename1/io/gzip/Inflate.java @@ -459,7 +459,10 @@ int inflate(int f) { return e.r; } if (gheader != null) { - gheader.setModifiedTime(this.need); + // Codename One historically normalized the mtime header to zero when + // reading, so preserve that behavior instead of propagating the + // timestamp from the archive. + gheader.setModifiedTime(0L); } if ((flags & 0x0200) != 0) { checksum(4, this.need); From 4b617760ce6d663486881c6e9b43b880e70561f0 Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Tue, 6 Jan 2026 06:59:27 +0200 Subject: [PATCH 4/6] Propagate GZIP modified time from archive --- CodenameOne/src/com/codename1/io/gzip/Inflate.java | 5 +---- .../test/java/com/codename1/io/gzip/GZIPInputStreamTest.java | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/CodenameOne/src/com/codename1/io/gzip/Inflate.java b/CodenameOne/src/com/codename1/io/gzip/Inflate.java index 78ace87e1e..802ab5cb32 100644 --- a/CodenameOne/src/com/codename1/io/gzip/Inflate.java +++ b/CodenameOne/src/com/codename1/io/gzip/Inflate.java @@ -459,10 +459,7 @@ int inflate(int f) { return e.r; } if (gheader != null) { - // Codename One historically normalized the mtime header to zero when - // reading, so preserve that behavior instead of propagating the - // timestamp from the archive. - gheader.setModifiedTime(0L); + gheader.setModifiedTime(this.need); } if ((flags & 0x0200) != 0) { checksum(4, this.need); diff --git a/maven/core-unittests/src/test/java/com/codename1/io/gzip/GZIPInputStreamTest.java b/maven/core-unittests/src/test/java/com/codename1/io/gzip/GZIPInputStreamTest.java index 595dcf5e7c..de2e12c887 100644 --- a/maven/core-unittests/src/test/java/com/codename1/io/gzip/GZIPInputStreamTest.java +++ b/maven/core-unittests/src/test/java/com/codename1/io/gzip/GZIPInputStreamTest.java @@ -39,7 +39,7 @@ void readsCompressedContentAndExposesHeaderMetadata() throws IOException, GZIPEx assertEquals("payload.txt", in.getName()); assertEquals("unit-test", in.getComment()); assertEquals(3, in.getOS()); - assertEquals(0L, in.getModifiedtime(), "Codename One GZIPInputStream normalizes mtime to zero"); + assertEquals(123456789L, in.getModifiedtime(), "Modified time is populated from the header"); assertEquals(expectedCrc, in.getCRC()); } From 36c6feefd588808b70664b4819db222022aa9cc1 Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Tue, 6 Jan 2026 07:08:54 +0200 Subject: [PATCH 5/6] Address remaining SpotBugs unread fields --- CodenameOne/src/com/codename1/components/SplitPane.java | 2 -- CodenameOne/src/com/codename1/ui/layouts/GridBagLayout.java | 2 ++ 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CodenameOne/src/com/codename1/components/SplitPane.java b/CodenameOne/src/com/codename1/components/SplitPane.java index 3862dcccb7..472e14d291 100644 --- a/CodenameOne/src/com/codename1/components/SplitPane.java +++ b/CodenameOne/src/com/codename1/components/SplitPane.java @@ -948,7 +948,6 @@ private class Divider extends Container { private final Button btnExpand; private final Label dragHandle; int pressedX, pressedY, draggedX, draggedY; - LayeredLayoutConstraint pressedPreferredConstraint; LayeredLayoutConstraint pressedConstraint; private boolean inDrag; @@ -1162,7 +1161,6 @@ public void pointerPressed(int x, int y) { pressedX = x; pressedY = y; pressedConstraint = ((LayeredLayout) getLayout()).getOrCreateConstraint(this).copy(); - pressedPreferredConstraint = preferredInset.copy(); inDrag = true; pointerDragged(x, y); } diff --git a/CodenameOne/src/com/codename1/ui/layouts/GridBagLayout.java b/CodenameOne/src/com/codename1/ui/layouts/GridBagLayout.java index 9c54a996a3..0095518e40 100644 --- a/CodenameOne/src/com/codename1/ui/layouts/GridBagLayout.java +++ b/CodenameOne/src/com/codename1/ui/layouts/GridBagLayout.java @@ -22,6 +22,7 @@ import com.codename1.ui.geom.Dimension; import com.codename1.ui.geom.Rectangle; import com.codename1.ui.plaf.Style; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.util.ArrayList; import java.util.Arrays; @@ -1187,6 +1188,7 @@ private static class ParentInfo { } } +@SuppressFBWarnings(value = "URF_UNREAD_FIELD", justification = "Layout info caches are retained for potential reuse across layout passes") class GridBagLayoutInfo { int[] widths; From 1fb10305b92709396f92365b0d99fb32ea2db732 Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Tue, 6 Jan 2026 08:00:17 +0200 Subject: [PATCH 6/6] Exclude GridBagLayoutInfo from unread-field checks --- .github/scripts/generate-quality-report.py | 2 ++ CodenameOne/src/com/codename1/ui/layouts/GridBagLayout.java | 2 -- maven/core-unittests/spotbugs-exclude.xml | 5 +++++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/scripts/generate-quality-report.py b/.github/scripts/generate-quality-report.py index a4a557c5ed..bfb0ddb4f5 100755 --- a/.github/scripts/generate-quality-report.py +++ b/.github/scripts/generate-quality-report.py @@ -819,6 +819,8 @@ def _is_exempt(f: Finding) -> bool: return True if f.rule == "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD" and "TarEntry.java" in loc: return True + if f.rule == "URF_UNREAD_FIELD" and "GridBagLayoutInfo" in loc: + return True return False diff --git a/CodenameOne/src/com/codename1/ui/layouts/GridBagLayout.java b/CodenameOne/src/com/codename1/ui/layouts/GridBagLayout.java index 0095518e40..9c54a996a3 100644 --- a/CodenameOne/src/com/codename1/ui/layouts/GridBagLayout.java +++ b/CodenameOne/src/com/codename1/ui/layouts/GridBagLayout.java @@ -22,7 +22,6 @@ import com.codename1.ui.geom.Dimension; import com.codename1.ui.geom.Rectangle; import com.codename1.ui.plaf.Style; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.util.ArrayList; import java.util.Arrays; @@ -1188,7 +1187,6 @@ private static class ParentInfo { } } -@SuppressFBWarnings(value = "URF_UNREAD_FIELD", justification = "Layout info caches are retained for potential reuse across layout passes") class GridBagLayoutInfo { int[] widths; diff --git a/maven/core-unittests/spotbugs-exclude.xml b/maven/core-unittests/spotbugs-exclude.xml index 1ce8740ba6..28974305d0 100644 --- a/maven/core-unittests/spotbugs-exclude.xml +++ b/maven/core-unittests/spotbugs-exclude.xml @@ -185,6 +185,11 @@ + + + + +