diff --git a/.github/scripts/generate-quality-report.py b/.github/scripts/generate-quality-report.py index f2716f2835..de5014bb9f 100755 --- a/.github/scripts/generate-quality-report.py +++ b/.github/scripts/generate-quality-report.py @@ -759,7 +759,8 @@ def main() -> None: if spotbugs: forbidden_rules = { "RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE", - "RCN_REDUNDANT_NULLCHECK_OF_NULL_VALUE" + "RCN_REDUNDANT_NULLCHECK_OF_NULL_VALUE", + "UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR" } violations = [ f for f in spotbugs.findings diff --git a/CodenameOne/src/com/codename1/charts/transitions/XYMultiSeriesTransition.java b/CodenameOne/src/com/codename1/charts/transitions/XYMultiSeriesTransition.java index 91d2c635e7..e9b84d648b 100644 --- a/CodenameOne/src/com/codename1/charts/transitions/XYMultiSeriesTransition.java +++ b/CodenameOne/src/com/codename1/charts/transitions/XYMultiSeriesTransition.java @@ -69,9 +69,11 @@ public XYMultiSeriesTransition(ChartComponent chart, XYMultipleSeriesDataset dat protected void initTransition() { getBuffer(); // initializes the buffer and seriesTranslations - int len = seriesTransitions.length; - for (int i = 0; i < len; i++) { - seriesTransitions[i].initTransition(); + if (seriesTransitions != null) { + int len = seriesTransitions.length; + for (int i = 0; i < len; i++) { + seriesTransitions[i].initTransition(); + } } super.initTransition(); @@ -86,9 +88,11 @@ protected void initTransition() { @Override protected void update(int progress) { getBuffer(); // initializes the buffer and seriesTranslations - int len = seriesTransitions.length; - for (int i = 0; i < len; i++) { - seriesTransitions[i].update(progress); + if (seriesTransitions != null) { + int len = seriesTransitions.length; + for (int i = 0; i < len; i++) { + seriesTransitions[i].update(progress); + } } } @@ -99,9 +103,11 @@ protected void update(int progress) { protected void cleanup() { super.cleanup(); getBuffer(); // initializes the buffer and seriesTranslations - int len = seriesTransitions.length; - for (int i = 0; i < len; i++) { - seriesTransitions[i].cleanup(); + if (seriesTransitions != null) { + int len = seriesTransitions.length; + for (int i = 0; i < len; i++) { + seriesTransitions[i].cleanup(); + } } } diff --git a/CodenameOne/src/com/codename1/charts/transitions/XYSeriesTransition.java b/CodenameOne/src/com/codename1/charts/transitions/XYSeriesTransition.java index d11f2d54f5..f9939bc1f1 100644 --- a/CodenameOne/src/com/codename1/charts/transitions/XYSeriesTransition.java +++ b/CodenameOne/src/com/codename1/charts/transitions/XYSeriesTransition.java @@ -108,7 +108,9 @@ private void copyValues(XYSeries source, XYSeries target) { @Override protected void cleanup() { super.cleanup(); - this.cachedSeries.clear(); + if (cachedSeries != null) { + this.cachedSeries.clear(); + } } @@ -119,6 +121,7 @@ protected void cleanup() { */ protected void update(int progress) { double dProgress = progress; + if (endVals == null || startVals == null) return; int len = endVals.getItemCount(); // PMD Fix: UnusedLocalVariable removed unused endindex for (int i = 0; i < len; i++) { double x = endVals.getX(i); diff --git a/CodenameOne/src/com/codename1/charts/transitions/XYValueSeriesTransition.java b/CodenameOne/src/com/codename1/charts/transitions/XYValueSeriesTransition.java index 7e1cd12917..41d2e814c6 100644 --- a/CodenameOne/src/com/codename1/charts/transitions/XYValueSeriesTransition.java +++ b/CodenameOne/src/com/codename1/charts/transitions/XYValueSeriesTransition.java @@ -108,7 +108,9 @@ private void copyValues(XYValueSeries source, XYValueSeries target) { @Override protected void cleanup() { super.cleanup(); - this.cachedSeries.clear(); + if (cachedSeries != null) { + this.cachedSeries.clear(); + } } @@ -119,6 +121,7 @@ protected void cleanup() { */ protected void update(int progress) { double dProgress = progress; + if (endVals == null || startVals == null) return; int len = endVals.getItemCount(); // PMD Fix: UnusedLocalVariable removed unused endindex for (int i = 0; i < len; i++) { double x = endVals.getX(i); diff --git a/CodenameOne/src/com/codename1/charts/views/XYChart.java b/CodenameOne/src/com/codename1/charts/views/XYChart.java index a3f4f3149d..5b3acbe4ec 100644 --- a/CodenameOne/src/com/codename1/charts/views/XYChart.java +++ b/CodenameOne/src/com/codename1/charts/views/XYChart.java @@ -687,6 +687,7 @@ protected void drawText(Canvas canvas, String text, float x, float y, Paint pain * @param inverse if the inverse transform needs to be applied */ private void transform(Canvas canvas, float angle, boolean inverse) { + if (mCenter == null) return; if (inverse) { canvas.scale(1 / mScale, mScale); canvas.translate(mTranslate, -mTranslate); diff --git a/CodenameOne/src/com/codename1/components/InfiniteScrollAdapter.java b/CodenameOne/src/com/codename1/components/InfiniteScrollAdapter.java index 4268f4f98b..3ff2c59e23 100644 --- a/CodenameOne/src/com/codename1/components/InfiniteScrollAdapter.java +++ b/CodenameOne/src/com/codename1/components/InfiniteScrollAdapter.java @@ -133,10 +133,14 @@ public static void continueFetching(Container cnt) { } void reachedEnd() { - infiniteContainer.removeComponent(endMarker); - infiniteContainer.addComponent(ip); - infiniteContainer.revalidate(); - Display.getInstance().callSerially(fetchMore); + if (infiniteContainer != null) { + infiniteContainer.removeComponent(endMarker); + infiniteContainer.addComponent(ip); + infiniteContainer.revalidate(); + } + if (fetchMore != null) { + Display.getInstance().callSerially(fetchMore); + } } /** @@ -147,6 +151,9 @@ void reachedEnd() { * @param areThereMore whether additional components exist */ public void addMoreComponents(Component[] components, boolean areThereMore) { + if (infiniteContainer == null) { + return; + } infiniteContainer.removeComponent(ip); infiniteContainer.removeComponent(endMarker); for (Component c : components) { @@ -177,7 +184,7 @@ public void addMoreComponents(Component[] components, boolean areThereMore) { * user interaction see https://github.com/codenameone/CodenameOne/issues/2721 */ public void continueFetching() { - if (endMarker.getParent() == null) { + if (endMarker.getParent() == null && fetchMore != null) { fetchMore.run(); } } diff --git a/CodenameOne/src/com/codename1/facebook/FaceBookAccess.java b/CodenameOne/src/com/codename1/facebook/FaceBookAccess.java index 773374f367..41e8619a1f 100644 --- a/CodenameOne/src/com/codename1/facebook/FaceBookAccess.java +++ b/CodenameOne/src/com/codename1/facebook/FaceBookAccess.java @@ -1292,7 +1292,9 @@ public void search(String objectType, String query, DefaultListModel results, Ac * Kills the current request. */ public void killCurrentRequest() { - current.kill(); + if (current != null) { + current.kill(); + } } /** diff --git a/CodenameOne/src/com/codename1/impl/CodenameOneImplementation.java b/CodenameOne/src/com/codename1/impl/CodenameOneImplementation.java index 7a555f992e..5805eea316 100644 --- a/CodenameOne/src/com/codename1/impl/CodenameOneImplementation.java +++ b/CodenameOne/src/com/codename1/impl/CodenameOneImplementation.java @@ -5636,7 +5636,10 @@ protected boolean isLogged() { * @param content content of the message */ protected void log(String content) { - logger.actionPerformed(new ActionEvent(content, ActionEvent.Type.Log)); + ActionListener l = logger; + if(l != null) { + l.actionPerformed(new ActionEvent(content, ActionEvent.Type.Log)); + } } /** diff --git a/CodenameOne/src/com/codename1/io/NetworkManager.java b/CodenameOne/src/com/codename1/io/NetworkManager.java index baa5baf4d9..f477b45395 100644 --- a/CodenameOne/src/com/codename1/io/NetworkManager.java +++ b/CodenameOne/src/com/codename1/io/NetworkManager.java @@ -325,7 +325,9 @@ public void shutdown() { running = false; if (networkThreads != null) { for (NetworkThread n : networkThreads) { - n.stopped = true; + if(n != null) { + n.stopped = true; + } } } networkThreads = null; @@ -793,7 +795,10 @@ public ConnectionRequest getCurrentRequest() { public void join() { try { - threadInstance.join(); + Thread t = threadInstance; + if(t != null) { + t.join(); + } } catch (InterruptedException ex) { ex.printStackTrace(); } diff --git a/CodenameOne/src/com/codename1/io/WebServiceProxyCall.java b/CodenameOne/src/com/codename1/io/WebServiceProxyCall.java index 2671f39026..f40591b5e6 100644 --- a/CodenameOne/src/com/codename1/io/WebServiceProxyCall.java +++ b/CodenameOne/src/com/codename1/io/WebServiceProxyCall.java @@ -298,6 +298,7 @@ protected void handleException(Exception err) { protected void readResponse(InputStream input) throws IOException { DataInputStream dis = new DataInputStream(input); + if (def == null) return; switch (def.returnType) { case TYPE_VOID: return; @@ -512,6 +513,7 @@ protected void buildRequestBody(OutputStream os) throws IOException { dos.writeUTF(def.name); int alen = arguments.length; for (int iter = 0; iter < alen; iter++) { + if (def == null || def.arguments == null) continue; switch (def.arguments[iter]) { case TYPE_BYTE: dos.writeByte(((Byte) arguments[iter]).byteValue()); diff --git a/CodenameOne/src/com/codename1/io/gzip/Inflate.java b/CodenameOne/src/com/codename1/io/gzip/Inflate.java index 69b2a20f9f..fc367225e3 100644 --- a/CodenameOne/src/com/codename1/io/gzip/Inflate.java +++ b/CodenameOne/src/com/codename1/io/gzip/Inflate.java @@ -114,7 +114,9 @@ int inflateReset() { z.msg = null; this.mode = HEAD; this.need_bytes = -1; - this.blocks.reset(); + if(this.blocks != null) { + this.blocks.reset(); + } return Z_OK; } @@ -311,7 +313,9 @@ int inflate(int f) { this.marker = 0; // can try inflateSync return Z_STREAM_ERROR; case BLOCKS: - r = this.blocks.proc(r); + if (this.blocks != null) { + r = this.blocks.proc(r); + } if (r == Z_DATA_ERROR) { this.mode = BAD; this.marker = 0; // can try inflateSync @@ -595,7 +599,9 @@ int inflateSetDictionary(byte[] dictionary, int dictLength) { length = (1 << this.wbits) - 1; index = dictLength - length; } - this.blocks.set_dictionary(dictionary, index, length); + if (this.blocks != null) { + this.blocks.set_dictionary(dictionary, index, length); + } this.mode = BLOCKS; return Z_OK; } diff --git a/CodenameOne/src/com/codename1/io/gzip/Tree.java b/CodenameOne/src/com/codename1/io/gzip/Tree.java index 5797e0f7bd..6adbdf3fee 100644 --- a/CodenameOne/src/com/codename1/io/gzip/Tree.java +++ b/CodenameOne/src/com/codename1/io/gzip/Tree.java @@ -201,10 +201,10 @@ private static int bi_reverse( // not null. void gen_bitlen(Deflate s) { short[] tree = dyn_tree; - short[] stree = stat_desc.static_tree; - int[] extra = stat_desc.extra_bits; - int base = stat_desc.extra_base; - int max_length = stat_desc.max_length; + short[] stree = stat_desc != null ? stat_desc.static_tree : null; + int[] extra = stat_desc != null ? stat_desc.extra_bits : null; + int base = stat_desc != null ? stat_desc.extra_base : 0; + int max_length = stat_desc != null ? stat_desc.max_length : 0; int h; // heap index int n, m; // iterate over the tree elements int bits; // bit length @@ -275,8 +275,8 @@ void gen_bitlen(Deflate s) { // also updated if stree is not null. The field max_code is set. void build_tree(Deflate s) { short[] tree = dyn_tree; - short[] stree = stat_desc.static_tree; - int elems = stat_desc.elems; + short[] stree = stat_desc != null ? stat_desc.static_tree : null; + int elems = stat_desc != null ? stat_desc.elems : 0; int n, m; // iterate over heap elements int max_code = -1; // largest code with non zero frequency int node; // new node being created diff --git a/CodenameOne/src/com/codename1/io/rest/RequestBuilder.java b/CodenameOne/src/com/codename1/io/rest/RequestBuilder.java index 1b7e064205..9af248d59f 100644 --- a/CodenameOne/src/com/codename1/io/rest/RequestBuilder.java +++ b/CodenameOne/src/com/codename1/io/rest/RequestBuilder.java @@ -784,6 +784,9 @@ public void actionPerformed(NetworkEvent evt) { } Response res = null; Map response = (Map) evt.getMetaData(); + if (response == null) { + return; + } List lst = (List) response.get(root); if (lst == null) { return; @@ -834,7 +837,13 @@ public Response> getAsPropertyList(Class type, Stri CN.addToQueueAndWait(request); Map response = ((Connection) request).json; try { + if (response == null) { + return null; + } List lst = (List) response.get(root); + if (lst == null) { + return null; + } List result = new ArrayList(); for (Map m : lst) { PropertyBusinessObject pb = (PropertyBusinessObject) type.newInstance(); diff --git a/CodenameOne/src/com/codename1/properties/PreferencesObject.java b/CodenameOne/src/com/codename1/properties/PreferencesObject.java index 6f1144686e..24c4fb78ec 100644 --- a/CodenameOne/src/com/codename1/properties/PreferencesObject.java +++ b/CodenameOne/src/com/codename1/properties/PreferencesObject.java @@ -59,6 +59,7 @@ public static PreferencesObject create(PropertyBusinessObject bo) { * @return this to enable builder pattern binding */ public PreferencesObject bind() { + if (bo == null || bo.getPropertyIndex() == null) return this; for (PropertyBase pb : bo.getPropertyIndex()) { String name = (String) pb.getClientProperty("cn1-po-name"); if (name == null) { diff --git a/CodenameOne/src/com/codename1/share/ShareService.java b/CodenameOne/src/com/codename1/share/ShareService.java index 26df451447..8a53861c5f 100644 --- a/CodenameOne/src/com/codename1/share/ShareService.java +++ b/CodenameOne/src/com/codename1/share/ShareService.java @@ -110,7 +110,9 @@ public Form getOriginal() { * method */ public void finish() { - original.showBack(); + if (original != null) { + original.showBack(); + } } } diff --git a/CodenameOne/src/com/codename1/ui/Component.java b/CodenameOne/src/com/codename1/ui/Component.java index f48a8b5e6e..c1b000017d 100644 --- a/CodenameOne/src/com/codename1/ui/Component.java +++ b/CodenameOne/src/com/codename1/ui/Component.java @@ -8024,25 +8024,33 @@ public void paint(Graphics g, Rectangle rect) { int oAlpha = g.getAlpha(); if (alpha == 0) { unSelectedStyle = originalStyle; - original.paint(g, rect); + if(original != null) { + original.paint(g, rect); + } return; } if (alpha == 255) { unSelectedStyle = destStyle; - dest.paint(g, rect); + if(dest != null) { + dest.paint(g, rect); + } unSelectedStyle = originalStyle; return; } int opa = unSelectedStyle.getBgTransparency() & 0xff; unSelectedStyle.setBgTransparency(255 - alpha); g.setAlpha(255 - alpha); - original.paint(g, rect); + if(original != null) { + original.paint(g, rect); + } unSelectedStyle.setBgTransparency(opa); unSelectedStyle = destStyle; opa = unSelectedStyle.getBgTransparency() & 0xff; g.setAlpha(alpha); unSelectedStyle.setBgTransparency(alpha); - dest.paint(g, rect); + if(dest != null) { + dest.paint(g, rect); + } unSelectedStyle.setBgTransparency(opa); unSelectedStyle = originalStyle; g.setAlpha(oAlpha); diff --git a/CodenameOne/src/com/codename1/ui/FontImage.java b/CodenameOne/src/com/codename1/ui/FontImage.java index 1eb6698f13..8afe8b0ece 100644 --- a/CodenameOne/src/com/codename1/ui/FontImage.java +++ b/CodenameOne/src/com/codename1/ui/FontImage.java @@ -11880,10 +11880,12 @@ protected void drawImage(Graphics g, Object nativeGraphics, int x, int y) { g.fillRect(x, y, width, height, backgroundOpacity); } g.setColor(color); - g.setFont(fnt); - int w = fnt.stringWidth(text); - int h = Math.round(fnt.getPixelSize()); - if (h <= 0) h = fnt.getHeight(); + if (fnt != null) { + g.setFont(fnt); + } + int w = fnt != null ? fnt.stringWidth(text) : 0; + int h = fnt != null ? Math.round(fnt.getPixelSize()) : 0; + if (h <= 0 && fnt != null) h = fnt.getHeight(); //int paddingPixels = Display.getInstance().convertToPixels(padding, true); if (fgAlpha < 255) g.concatenateAlpha(fgAlpha); if (rotated != 0) { diff --git a/CodenameOne/src/com/codename1/ui/SideMenuBar.java b/CodenameOne/src/com/codename1/ui/SideMenuBar.java index 6bfcf9576e..bfa9758c56 100644 --- a/CodenameOne/src/com/codename1/ui/SideMenuBar.java +++ b/CodenameOne/src/com/codename1/ui/SideMenuBar.java @@ -1648,7 +1648,7 @@ public void cleanup() { public void paint(Graphics g) { if (Display.getInstance().areMutableImagesFast()) { // workaround for Android issue where the VKB breaks on screen size change - if (buffer.getHeight() != Display.getInstance().getDisplayHeight()) { + if (buffer == null || buffer.getHeight() != Display.getInstance().getDisplayHeight()) { if (fwd) { buffer = updateRightPanelBgImage(placement, getSource()); } else { diff --git a/CodenameOne/src/com/codename1/ui/animations/AnimationObject.java b/CodenameOne/src/com/codename1/ui/animations/AnimationObject.java index 6a71c56ec0..2d73e3887a 100644 --- a/CodenameOne/src/com/codename1/ui/animations/AnimationObject.java +++ b/CodenameOne/src/com/codename1/ui/animations/AnimationObject.java @@ -197,7 +197,10 @@ Image getImage() { img = null; } } - long time = motionX.getCurrentMotionTime(); + long time = 0; + if(motionX != null) { + time = motionX.getCurrentMotionTime(); + } int frameCount = Math.max(1, frames.length); int frame = Math.min(Math.max(0, (int) ((time / Math.max(1, frameDelay)) % frameCount)), frameCount - 1); return frames[frame]; @@ -212,8 +215,8 @@ private void setTimeNotNull(Motion m, int time) { } void setTime(int time) { - motionX.setCurrentMotionTime(time); - motionY.setCurrentMotionTime(time); + setTimeNotNull(motionX, time); + setTimeNotNull(motionY, time); setTimeNotNull(orientation, time); setTimeNotNull(width, time); setTimeNotNull(height, time); @@ -322,6 +325,9 @@ private Motion createMotion(int motionType, int startTime, int duration, int sta } int getX() { + if(motionX == null) { + return 0; + } return motionX.getValue(); } @@ -329,6 +335,9 @@ int getX() { * @return the motionY */ int getY() { + if(motionY == null) { + return 0; + } return motionY.getValue(); } diff --git a/CodenameOne/src/com/codename1/ui/animations/CommonTransitions.java b/CodenameOne/src/com/codename1/ui/animations/CommonTransitions.java index f8a8a011b5..79ff249a7e 100644 --- a/CodenameOne/src/com/codename1/ui/animations/CommonTransitions.java +++ b/CodenameOne/src/com/codename1/ui/animations/CommonTransitions.java @@ -506,7 +506,7 @@ public void initTransition() { g.setClip(0, 0, buffer.getWidth() + source.getAbsoluteX(), buffer.getHeight() + source.getAbsoluteY()); - if (timeline.getWidth() != buffer.getWidth() || timeline.getHeight() != buffer.getHeight()) { + if (timeline != null && buffer != null && (timeline.getWidth() != buffer.getWidth() || timeline.getHeight() != buffer.getHeight())) { timeline = timeline.scaled(buffer.getWidth(), buffer.getHeight()); } @@ -722,11 +722,13 @@ public void paint(Graphics g) { } case TYPE_UNCOVER: hideInterformContainers(); - int p = motion.getDestinationValue() - position; - if (slideType == SLIDE_HORIZONTAL) { - paintCoverAtPosition(g, p, 0); - } else { - paintCoverAtPosition(g, 0, p); + if (motion != null) { + int p = motion.getDestinationValue() - position; + if (slideType == SLIDE_HORIZONTAL) { + paintCoverAtPosition(g, p, 0); + } else { + paintCoverAtPosition(g, 0, p); + } } paintInterformContainers(g); @@ -747,9 +749,11 @@ public void paint(Graphics g) { return; case TYPE_TIMELINE: hideInterformContainers(); - Object mask = timeline.createMask(); - paint(g, getSource(), 0, 0); - g.drawImage(buffer.applyMask(mask), 0, 0); + if (timeline != null && buffer != null) { + Object mask = timeline.createMask(); + paint(g, getSource(), 0, 0); + g.drawImage(buffer.applyMask(mask), 0, 0); + } paintInterformContainers(g); return; case TYPE_SLIDE_AND_FADE: { @@ -760,7 +764,9 @@ public void paint(Graphics g) { Container destTitleArea = destForm.getTitleArea(); if (titleArea == null || titleArea.isHidden(true) || destTitleArea == null || destTitleArea.isHidden(true)) { hideInterformContainers(); - paintSlideAtPosition(g, motion2.getValue(), 0); + if (motion2 != null) { + paintSlideAtPosition(g, motion2.getValue(), 0); + } paintInterformContainers(g); return; diff --git a/CodenameOne/src/com/codename1/ui/animations/MorphTransition.java b/CodenameOne/src/com/codename1/ui/animations/MorphTransition.java index 966331bc99..0e572208b6 100644 --- a/CodenameOne/src/com/codename1/ui/animations/MorphTransition.java +++ b/CodenameOne/src/com/codename1/ui/animations/MorphTransition.java @@ -180,21 +180,23 @@ public final void initTransition() { public boolean animate() { if (!finished) { // animate one last time - if (animationMotion.isFinished()) { + if (animationMotion != null && animationMotion.isFinished()) { finished = true; // restore forms to orignial states - for (CC c : fromToComponents) { - if (c == null) { - continue; - } - Container p = c.placeholderDest.getParent(); - c.dest.getParent().removeComponent(c.dest); - p.replace(c.placeholderDest, c.dest, null); + if(fromToComponents != null) { + for (CC c : fromToComponents) { + if (c == null) { + continue; + } + Container p = c.placeholderDest.getParent(); + c.dest.getParent().removeComponent(c.dest); + p.replace(c.placeholderDest, c.dest, null); - p = c.placeholderSrc.getParent(); - c.source.getParent().removeComponent(c.source); - p.replace(c.placeholderSrc, c.source, null); + p = c.placeholderSrc.getParent(); + c.source.getParent().removeComponent(c.source); + p.replace(c.placeholderSrc, c.source, null); + } } // remove potential memory leak @@ -202,22 +204,24 @@ public boolean animate() { return true; } - for (CC c : fromToComponents) { - if (c == null) { - continue; + if(fromToComponents != null) { + for (CC c : fromToComponents) { + if (c == null) { + continue; + } + int x = c.xMotion.getValue(); + int y = c.yMotion.getValue(); + int w = c.wMotion.getValue(); + int h = c.hMotion.getValue(); + c.source.setX(x); + c.source.setY(y); + c.source.setWidth(w); + c.source.setHeight(h); + c.dest.setX(x); + c.dest.setY(y); + c.dest.setWidth(w); + c.dest.setHeight(h); } - int x = c.xMotion.getValue(); - int y = c.yMotion.getValue(); - int w = c.wMotion.getValue(); - int h = c.hMotion.getValue(); - c.source.setX(x); - c.source.setY(y); - c.source.setWidth(w); - c.source.setHeight(h); - c.dest.setX(x); - c.dest.setY(y); - c.dest.setWidth(w); - c.dest.setHeight(h); } return true; @@ -231,7 +235,10 @@ public boolean animate() { */ public void paint(Graphics g) { int oldAlpha = g.getAlpha(); - int alpha = animationMotion.getValue(); + int alpha = 0; + if(animationMotion != null) { + alpha = animationMotion.getValue(); + } if (alpha < 255) { g.setAlpha(255 - alpha); getSource().paintComponent(g); diff --git a/CodenameOne/src/com/codename1/ui/layouts/GroupLayout.java b/CodenameOne/src/com/codename1/ui/layouts/GroupLayout.java index 6098cc6544..fdd761b779 100644 --- a/CodenameOne/src/com/codename1/ui/layouts/GroupLayout.java +++ b/CodenameOne/src/com/codename1/ui/layouts/GroupLayout.java @@ -2142,7 +2142,7 @@ int getBaseline() { int getBaselineResizeBehavior() { if (isResizable(VERTICAL)) { - if (!baselineSpring.isResizable(VERTICAL)) { + if (baselineSpring != null && !baselineSpring.isResizable(VERTICAL)) { // Spring to use for baseline isn't resizable. In this case // baseline resize behavior can be determined based on how // preceding springs resize. @@ -2175,7 +2175,10 @@ int getBaselineResizeBehavior() { // If we get here, both leading and trailing springs are // resizable. Fall through to OTHER. } else { - int brb = baselineSpring.getBaselineResizeBehavior(); + int brb = 0; + if(baselineSpring != null) { + brb = baselineSpring.getBaselineResizeBehavior(); + } if (brb == Component.BRB_CONSTANT_ASCENT) { for (int i = 0, max = springs.size(); i < max; i++) { Spring spring = getSpring(i); diff --git a/CodenameOne/src/com/codename1/ui/plaf/StyleParser.java b/CodenameOne/src/com/codename1/ui/plaf/StyleParser.java index 0917f2059b..e350ddf4e1 100644 --- a/CodenameOne/src/com/codename1/ui/plaf/StyleParser.java +++ b/CodenameOne/src/com/codename1/ui/plaf/StyleParser.java @@ -484,7 +484,9 @@ private static BorderInfo parseRoundBorder(BorderInfo out, String args, String[] out.color = Integer.parseInt(colorStr, 16) & 0xffffff; out.setOpacity(255); } - rem = rem.substring(colorStr.length()); + if (rem.length() >= colorStr.length()) { + rem = rem.substring(colorStr.length()); + } } @@ -2022,7 +2024,7 @@ private void strokeToString(StringBuilder sb) { } private void colorToString(StringBuilder sb) { - String hex = Integer.toHexString(color & 0xffffff); + String hex = color != null ? Integer.toHexString(color & 0xffffff) : "000000"; while (hex.length() < 6) hex = "0" + hex; if (getOpacity() != null) { @@ -2516,7 +2518,7 @@ public void setWidth(Float width) { * @return The thickness of the border. Used with line, dashed, dotted, underline, and round borders. */ public ScalarValue getThickness() { - return new ScalarValue(width, widthUnit); + return new ScalarValue(width == null ? 0 : width, widthUnit); } /** diff --git a/CodenameOne/src/com/codename1/ui/scene/Node.java b/CodenameOne/src/com/codename1/ui/scene/Node.java index 01d0ea6228..7df89729b7 100644 --- a/CodenameOne/src/com/codename1/ui/scene/Node.java +++ b/CodenameOne/src/com/codename1/ui/scene/Node.java @@ -409,10 +409,12 @@ public Collection findNodesWithTag(String tag) { } public Transform getLocalToScreenTransform() { - Transform newT = Transform.isPerspectiveSupported() && scene.camera.get() != null ? + Transform newT = Transform.isPerspectiveSupported() && scene != null && scene.camera.get() != null ? scene.camera.get().getTransform() : Transform.makeIdentity(); - newT.translate(getScene().getAbsoluteX(), getScene().getAbsoluteY()); - newT.concatenate(getLocalToSceneTransform()); + if (getScene() != null) { + newT.translate(getScene().getAbsoluteX(), getScene().getAbsoluteY()); + newT.concatenate(getLocalToSceneTransform()); + } return newT; } @@ -428,12 +430,14 @@ public void render(Graphics g) { Transform existingT = Transform.makeIdentity(); g.getTransform(existingT); - Transform newT = Transform.isPerspectiveSupported() && scene.camera.get() != null ? + Transform newT = Transform.isPerspectiveSupported() && scene != null && scene.camera.get() != null ? scene.camera.get().getTransform() : Transform.makeIdentity(); - newT.translate(getScene().getAbsoluteX(), getScene().getAbsoluteY()); - newT.concatenate(getLocalToSceneTransform()); - newT.translate(-scene.getAbsoluteX(), -scene.getAbsoluteY()); + if (getScene() != null) { + newT.translate(getScene().getAbsoluteX(), getScene().getAbsoluteY()); + newT.concatenate(getLocalToSceneTransform()); + newT.translate(-scene.getAbsoluteX(), -scene.getAbsoluteY()); + } g.setTransform(newT); int alpha = g.getAlpha(); int nodeAlpha = (int) Math.round(alpha * opacity.get()); diff --git a/CodenameOne/src/com/codename1/ui/spinner/DateSpinner.java b/CodenameOne/src/com/codename1/ui/spinner/DateSpinner.java index 39c55feced..051591aa35 100644 --- a/CodenameOne/src/com/codename1/ui/spinner/DateSpinner.java +++ b/CodenameOne/src/com/codename1/ui/spinner/DateSpinner.java @@ -172,6 +172,9 @@ public void setCurrentYear(int currentYear) { * @return the currentDay */ public int getCurrentDay() { + if(day == null || day.getValue() == null) { + return 1; + } return ((Integer) day.getValue()).intValue(); } diff --git a/CodenameOne/src/com/codename1/ui/util/SwipeBackSupport.java b/CodenameOne/src/com/codename1/ui/util/SwipeBackSupport.java index 868da28e8b..36deae6d90 100644 --- a/CodenameOne/src/com/codename1/ui/util/SwipeBackSupport.java +++ b/CodenameOne/src/com/codename1/ui/util/SwipeBackSupport.java @@ -123,10 +123,15 @@ public boolean animate() { currentX += increments; if (currentX > 0 && currentX >= destNumber || currentX < 0 && currentX <= destNumber) { currentX = destNumber; - Transition t = destinationForm.getTransitionInAnimator(); - destinationForm.setTransitionInAnimator(CommonTransitions.createEmpty()); - destinationForm.show(); - destinationForm.setTransitionInAnimator(t); + Transition t = null; + if(destinationForm != null) { + t = destinationForm.getTransitionInAnimator(); + } + if(destinationForm != null) { + destinationForm.setTransitionInAnimator(CommonTransitions.createEmpty()); + destinationForm.show(); + destinationForm.setTransitionInAnimator(t); + } destinationForm = null; dragActivated = false; transitionRunning = false;