From a4425cd37427e79ed9233c5cf733d36285db5f97 Mon Sep 17 00:00:00 2001 From: Jonathan Jackson Date: Fri, 19 May 2017 13:01:40 -0500 Subject: [PATCH 01/55] Corrected documentation for `OrderedXYSeries` --- .../src/main/java/com/androidplot/xy/OrderedXYSeries.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/androidplot-core/src/main/java/com/androidplot/xy/OrderedXYSeries.java b/androidplot-core/src/main/java/com/androidplot/xy/OrderedXYSeries.java index 659e38ea..820e4330 100644 --- a/androidplot-core/src/main/java/com/androidplot/xy/OrderedXYSeries.java +++ b/androidplot-core/src/main/java/com/androidplot/xy/OrderedXYSeries.java @@ -9,13 +9,13 @@ public interface OrderedXYSeries extends XYSeries { enum XOrder { /** * XVals are in strict ascending order such that: - * x(i) > x(i+1) == true + * x(i) < x(i+1) == true */ ASCENDING, /** * XVals are in strict descending order such that: - * x(i) < x(i+1) == true + * x(i) > x(i+1) == true */ DESCENDING, From fba2074c291216131119789b476fa6bce4f8fa1d Mon Sep 17 00:00:00 2001 From: Jonathan Jackson Date: Mon, 22 May 2017 09:59:42 -0500 Subject: [PATCH 02/55] Rename local variable in SeriesUtils.java to better describe its contents. Android studio also replaced wildcards in imports probably to match AOSP style guides https://source.android.com/source/code-style#fully-qualify-imports --- .../com/androidplot/util/SeriesUtils.java | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/androidplot-core/src/main/java/com/androidplot/util/SeriesUtils.java b/androidplot-core/src/main/java/com/androidplot/util/SeriesUtils.java index a9f09192..e74a8f3b 100644 --- a/androidplot-core/src/main/java/com/androidplot/util/SeriesUtils.java +++ b/androidplot-core/src/main/java/com/androidplot/util/SeriesUtils.java @@ -16,10 +16,14 @@ package com.androidplot.util; -import com.androidplot.*; -import com.androidplot.xy.*; +import com.androidplot.Region; +import com.androidplot.xy.FastXYSeries; +import com.androidplot.xy.OrderedXYSeries; +import com.androidplot.xy.RectRegion; +import com.androidplot.xy.XYConstraints; +import com.androidplot.xy.XYSeries; -import java.util.*; +import java.util.List; /** * Utilities for dealing with Series data. @@ -83,18 +87,18 @@ public static RectRegion minMax(XYConstraints constraints, XYSeries... seriesArr // if this is an advanced xy series then minMax have already been calculated for us: if(series instanceof FastXYSeries) { - final RectRegion b = ((FastXYSeries) series).minMax(); - if(b == null) { + final RectRegion seriesBounds = ((FastXYSeries) series).minMax(); + if (seriesBounds == null) { continue; } if(constraints == null) { - bounds.union(b); + bounds.union(seriesBounds); } else { - if(constraints.contains(b.getMinX(), b.getMinY())) { - bounds.union(b.getMinX(), b.getMinY()); + if (constraints.contains(seriesBounds.getMinX(), seriesBounds.getMinY())) { + bounds.union(seriesBounds.getMinX(), seriesBounds.getMinY()); } - if(constraints.contains(b.getMaxX(), b.getMaxY())) { - bounds.union(b.getMaxX(), b.getMaxY()); + if (constraints.contains(seriesBounds.getMaxX(), seriesBounds.getMaxY())) { + bounds.union(seriesBounds.getMaxX(), seriesBounds.getMaxY()); } } From 0cf9e0013de5359f0c351e414da2a184244cb3ae Mon Sep 17 00:00:00 2001 From: Jonathan Jackson Date: Mon, 22 May 2017 10:14:28 -0500 Subject: [PATCH 03/55] Implements `toString` methods for `RectRegion` and related classes for easier debugging. --- .../src/main/java/com/androidplot/Region.java | 18 +++++++++++++++++- .../java/com/androidplot/util/FastNumber.java | 5 +++++ .../java/com/androidplot/xy/RectRegion.java | 10 ++++++++++ .../java/com/androidplot/xy/XYConstraints.java | 17 +++++++++++++++++ 4 files changed, 49 insertions(+), 1 deletion(-) diff --git a/androidplot-core/src/main/java/com/androidplot/Region.java b/androidplot-core/src/main/java/com/androidplot/Region.java index 2ace04a7..c8820f59 100644 --- a/androidplot-core/src/main/java/com/androidplot/Region.java +++ b/androidplot-core/src/main/java/com/androidplot/Region.java @@ -17,7 +17,7 @@ package com.androidplot; -import com.androidplot.util.*; +import com.androidplot.util.FastNumber; /** * A one dimensional region represented by a starting and ending value. @@ -249,4 +249,20 @@ public void setMax(Number max) { public boolean isDefined() { return min != null && max != null; } + + @Override + public String toString() { + final StringBuffer sb = new StringBuffer("Region{"); + sb.append("min=").append(min); + sb.append(", max=").append(max); + sb.append(", cachedLength=").append(cachedLength); + sb.append(", defaults="); + if (defaults != this) { + sb.append(defaults); + } else { + sb.append("this"); + } + sb.append('}'); + return sb.toString(); + } } diff --git a/androidplot-core/src/main/java/com/androidplot/util/FastNumber.java b/androidplot-core/src/main/java/com/androidplot/util/FastNumber.java index 049431b3..d54daca4 100644 --- a/androidplot-core/src/main/java/com/androidplot/util/FastNumber.java +++ b/androidplot-core/src/main/java/com/androidplot/util/FastNumber.java @@ -63,4 +63,9 @@ public double doubleValue() { } return doublePrimitive; } + + @Override + public String toString() { + return String.valueOf(doubleValue()); + } } diff --git a/androidplot-core/src/main/java/com/androidplot/xy/RectRegion.java b/androidplot-core/src/main/java/com/androidplot/xy/RectRegion.java index 7eeb0d73..5a1433f7 100644 --- a/androidplot-core/src/main/java/com/androidplot/xy/RectRegion.java +++ b/androidplot-core/src/main/java/com/androidplot/xy/RectRegion.java @@ -20,6 +20,7 @@ import android.graphics.RectF; import com.androidplot.Region; + import java.util.ArrayList; import java.util.List; @@ -344,4 +345,13 @@ public boolean isFullyDefined() { public boolean contains(Number x, Number y) { return getxRegion().contains(x) && getyRegion().contains(y); } + + @Override + public String toString() { + return "RectRegion{" + + "xRegion=" + xRegion + + ", yRegion=" + yRegion + + ", label='" + label + '\'' + + '}'; + } } diff --git a/androidplot-core/src/main/java/com/androidplot/xy/XYConstraints.java b/androidplot-core/src/main/java/com/androidplot/xy/XYConstraints.java index ae22a4ea..e1980bf6 100644 --- a/androidplot-core/src/main/java/com/androidplot/xy/XYConstraints.java +++ b/androidplot-core/src/main/java/com/androidplot/xy/XYConstraints.java @@ -153,4 +153,21 @@ public void setMinY(Number minY) { public void setMaxY(Number maxY) { this.maxY = maxY; } + + @Override + public String toString() { + final StringBuffer sb = new StringBuffer("XYConstraints{"); + sb.append("domainFramingModel=").append(domainFramingModel); + sb.append(", rangeFramingModel=").append(rangeFramingModel); + sb.append(", domainUpperBoundaryMode=").append(domainUpperBoundaryMode); + sb.append(", domainLowerBoundaryMode=").append(domainLowerBoundaryMode); + sb.append(", rangeUpperBoundaryMode=").append(rangeUpperBoundaryMode); + sb.append(", rangeLowerBoundaryMode=").append(rangeLowerBoundaryMode); + sb.append(", minX=").append(minX); + sb.append(", maxX=").append(maxX); + sb.append(", minY=").append(minY); + sb.append(", maxY=").append(maxY); + sb.append('}'); + return sb.toString(); + } } From 31b3c47d5137cb70ceda23095fbd90654301c35d Mon Sep 17 00:00:00 2001 From: Jonathan Jackson Date: Mon, 22 May 2017 10:32:03 -0500 Subject: [PATCH 04/55] Refactoring only - reduced nesting in XYConstraints.java --- .../com/androidplot/xy/XYConstraints.java | 35 ++++++++++--------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/androidplot-core/src/main/java/com/androidplot/xy/XYConstraints.java b/androidplot-core/src/main/java/com/androidplot/xy/XYConstraints.java index e1980bf6..2ee06adf 100644 --- a/androidplot-core/src/main/java/com/androidplot/xy/XYConstraints.java +++ b/androidplot-core/src/main/java/com/androidplot/xy/XYConstraints.java @@ -18,6 +18,7 @@ /** * Calculates the min/max constraints for an xy plane. + * * @since 0.9.7 */ public class XYConstraints { @@ -52,26 +53,26 @@ public XYConstraints(Number minX, Number maxX, Number minY, Number maxY) { } public boolean contains(Number x, Number y) { - if(x == null || y == null) { + if (x == null || y == null) { // this is essentially an invisible point: return false; - } else { - final double dx = x.doubleValue(); - - if(minX != null && dx < minX.doubleValue()) { - return false; - } else if(maxX != null && dx > maxX.doubleValue()) { - return false; - } else { - final double dy = y.doubleValue(); - if(minY != null && dy < minY.doubleValue()) { - return false; - } else if(maxY != null && dy > maxY.doubleValue()) { - return false; - } - } - return true; } + + final double dx = x.doubleValue(); + if (minX != null && dx < minX.doubleValue()) { + return false; + } else if (maxX != null && dx > maxX.doubleValue()) { + return false; + } + + final double dy = y.doubleValue(); + if (minY != null && dy < minY.doubleValue()) { + return false; + } else if (maxY != null && dy > maxY.doubleValue()) { + return false; + } + + return true; } public Number getMinX() { From 5ec9222af38c7eebc7e0de440a8c2fe6fab764d0 Mon Sep 17 00:00:00 2001 From: Jonathan Jackson Date: Mon, 22 May 2017 09:59:42 -0500 Subject: [PATCH 05/55] Rename local variable in SeriesUtils.java to better describe its contents. Android studio also replaced wildcards in imports probably to match AOSP style guides https://source.android.com/source/code-style#fully-qualify-imports --- .../com/androidplot/util/SeriesUtils.java | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/androidplot-core/src/main/java/com/androidplot/util/SeriesUtils.java b/androidplot-core/src/main/java/com/androidplot/util/SeriesUtils.java index a9f09192..e74a8f3b 100644 --- a/androidplot-core/src/main/java/com/androidplot/util/SeriesUtils.java +++ b/androidplot-core/src/main/java/com/androidplot/util/SeriesUtils.java @@ -16,10 +16,14 @@ package com.androidplot.util; -import com.androidplot.*; -import com.androidplot.xy.*; +import com.androidplot.Region; +import com.androidplot.xy.FastXYSeries; +import com.androidplot.xy.OrderedXYSeries; +import com.androidplot.xy.RectRegion; +import com.androidplot.xy.XYConstraints; +import com.androidplot.xy.XYSeries; -import java.util.*; +import java.util.List; /** * Utilities for dealing with Series data. @@ -83,18 +87,18 @@ public static RectRegion minMax(XYConstraints constraints, XYSeries... seriesArr // if this is an advanced xy series then minMax have already been calculated for us: if(series instanceof FastXYSeries) { - final RectRegion b = ((FastXYSeries) series).minMax(); - if(b == null) { + final RectRegion seriesBounds = ((FastXYSeries) series).minMax(); + if (seriesBounds == null) { continue; } if(constraints == null) { - bounds.union(b); + bounds.union(seriesBounds); } else { - if(constraints.contains(b.getMinX(), b.getMinY())) { - bounds.union(b.getMinX(), b.getMinY()); + if (constraints.contains(seriesBounds.getMinX(), seriesBounds.getMinY())) { + bounds.union(seriesBounds.getMinX(), seriesBounds.getMinY()); } - if(constraints.contains(b.getMaxX(), b.getMaxY())) { - bounds.union(b.getMaxX(), b.getMaxY()); + if (constraints.contains(seriesBounds.getMaxX(), seriesBounds.getMaxY())) { + bounds.union(seriesBounds.getMaxX(), seriesBounds.getMaxY()); } } From 0434ae43d41e85e596db48065afb347ac1471764 Mon Sep 17 00:00:00 2001 From: Jonathan Jackson Date: Mon, 22 May 2017 10:14:28 -0500 Subject: [PATCH 06/55] Implements `toString` methods for `RectRegion` and related classes for easier debugging. --- .../src/main/java/com/androidplot/Region.java | 18 +++++++++++++++++- .../java/com/androidplot/util/FastNumber.java | 5 +++++ .../java/com/androidplot/xy/RectRegion.java | 10 ++++++++++ .../java/com/androidplot/xy/XYConstraints.java | 17 +++++++++++++++++ 4 files changed, 49 insertions(+), 1 deletion(-) diff --git a/androidplot-core/src/main/java/com/androidplot/Region.java b/androidplot-core/src/main/java/com/androidplot/Region.java index 2ace04a7..c8820f59 100644 --- a/androidplot-core/src/main/java/com/androidplot/Region.java +++ b/androidplot-core/src/main/java/com/androidplot/Region.java @@ -17,7 +17,7 @@ package com.androidplot; -import com.androidplot.util.*; +import com.androidplot.util.FastNumber; /** * A one dimensional region represented by a starting and ending value. @@ -249,4 +249,20 @@ public void setMax(Number max) { public boolean isDefined() { return min != null && max != null; } + + @Override + public String toString() { + final StringBuffer sb = new StringBuffer("Region{"); + sb.append("min=").append(min); + sb.append(", max=").append(max); + sb.append(", cachedLength=").append(cachedLength); + sb.append(", defaults="); + if (defaults != this) { + sb.append(defaults); + } else { + sb.append("this"); + } + sb.append('}'); + return sb.toString(); + } } diff --git a/androidplot-core/src/main/java/com/androidplot/util/FastNumber.java b/androidplot-core/src/main/java/com/androidplot/util/FastNumber.java index 049431b3..d54daca4 100644 --- a/androidplot-core/src/main/java/com/androidplot/util/FastNumber.java +++ b/androidplot-core/src/main/java/com/androidplot/util/FastNumber.java @@ -63,4 +63,9 @@ public double doubleValue() { } return doublePrimitive; } + + @Override + public String toString() { + return String.valueOf(doubleValue()); + } } diff --git a/androidplot-core/src/main/java/com/androidplot/xy/RectRegion.java b/androidplot-core/src/main/java/com/androidplot/xy/RectRegion.java index 7eeb0d73..5a1433f7 100644 --- a/androidplot-core/src/main/java/com/androidplot/xy/RectRegion.java +++ b/androidplot-core/src/main/java/com/androidplot/xy/RectRegion.java @@ -20,6 +20,7 @@ import android.graphics.RectF; import com.androidplot.Region; + import java.util.ArrayList; import java.util.List; @@ -344,4 +345,13 @@ public boolean isFullyDefined() { public boolean contains(Number x, Number y) { return getxRegion().contains(x) && getyRegion().contains(y); } + + @Override + public String toString() { + return "RectRegion{" + + "xRegion=" + xRegion + + ", yRegion=" + yRegion + + ", label='" + label + '\'' + + '}'; + } } diff --git a/androidplot-core/src/main/java/com/androidplot/xy/XYConstraints.java b/androidplot-core/src/main/java/com/androidplot/xy/XYConstraints.java index ae22a4ea..e1980bf6 100644 --- a/androidplot-core/src/main/java/com/androidplot/xy/XYConstraints.java +++ b/androidplot-core/src/main/java/com/androidplot/xy/XYConstraints.java @@ -153,4 +153,21 @@ public void setMinY(Number minY) { public void setMaxY(Number maxY) { this.maxY = maxY; } + + @Override + public String toString() { + final StringBuffer sb = new StringBuffer("XYConstraints{"); + sb.append("domainFramingModel=").append(domainFramingModel); + sb.append(", rangeFramingModel=").append(rangeFramingModel); + sb.append(", domainUpperBoundaryMode=").append(domainUpperBoundaryMode); + sb.append(", domainLowerBoundaryMode=").append(domainLowerBoundaryMode); + sb.append(", rangeUpperBoundaryMode=").append(rangeUpperBoundaryMode); + sb.append(", rangeLowerBoundaryMode=").append(rangeLowerBoundaryMode); + sb.append(", minX=").append(minX); + sb.append(", maxX=").append(maxX); + sb.append(", minY=").append(minY); + sb.append(", maxY=").append(maxY); + sb.append('}'); + return sb.toString(); + } } From 03399b87a2ac3a1e537155e6b44a8c5abc204561 Mon Sep 17 00:00:00 2001 From: Jonathan Jackson Date: Mon, 22 May 2017 10:32:03 -0500 Subject: [PATCH 07/55] Refactoring only - reduced nesting in XYConstraints.java --- .../com/androidplot/xy/XYConstraints.java | 35 ++++++++++--------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/androidplot-core/src/main/java/com/androidplot/xy/XYConstraints.java b/androidplot-core/src/main/java/com/androidplot/xy/XYConstraints.java index e1980bf6..2ee06adf 100644 --- a/androidplot-core/src/main/java/com/androidplot/xy/XYConstraints.java +++ b/androidplot-core/src/main/java/com/androidplot/xy/XYConstraints.java @@ -18,6 +18,7 @@ /** * Calculates the min/max constraints for an xy plane. + * * @since 0.9.7 */ public class XYConstraints { @@ -52,26 +53,26 @@ public XYConstraints(Number minX, Number maxX, Number minY, Number maxY) { } public boolean contains(Number x, Number y) { - if(x == null || y == null) { + if (x == null || y == null) { // this is essentially an invisible point: return false; - } else { - final double dx = x.doubleValue(); - - if(minX != null && dx < minX.doubleValue()) { - return false; - } else if(maxX != null && dx > maxX.doubleValue()) { - return false; - } else { - final double dy = y.doubleValue(); - if(minY != null && dy < minY.doubleValue()) { - return false; - } else if(maxY != null && dy > maxY.doubleValue()) { - return false; - } - } - return true; } + + final double dx = x.doubleValue(); + if (minX != null && dx < minX.doubleValue()) { + return false; + } else if (maxX != null && dx > maxX.doubleValue()) { + return false; + } + + final double dy = y.doubleValue(); + if (minY != null && dy < minY.doubleValue()) { + return false; + } else if (maxY != null && dy > maxY.doubleValue()) { + return false; + } + + return true; } public Number getMinX() { From d3249e48ac96713f0761f23da5f0ab953a41f249 Mon Sep 17 00:00:00 2001 From: Jonathan Jackson Date: Tue, 23 May 2017 16:24:42 -0500 Subject: [PATCH 08/55] Added shortcut to XYConstraints.java#contains for situations where there are no defined constraints. This avoids getting the double value of two numbers. --- .../src/main/java/com/androidplot/xy/XYConstraints.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/androidplot-core/src/main/java/com/androidplot/xy/XYConstraints.java b/androidplot-core/src/main/java/com/androidplot/xy/XYConstraints.java index 2ee06adf..14aea42a 100644 --- a/androidplot-core/src/main/java/com/androidplot/xy/XYConstraints.java +++ b/androidplot-core/src/main/java/com/androidplot/xy/XYConstraints.java @@ -58,6 +58,11 @@ public boolean contains(Number x, Number y) { return false; } + if (minX == null && maxX == null && minY == null && maxY == null) { + //there are no constraints + return true; + } + final double dx = x.doubleValue(); if (minX != null && dx < minX.doubleValue()) { return false; From eaed7f84530aedf289c2510a1289eb0404a31c22 Mon Sep 17 00:00:00 2001 From: Jonathan Jackson Date: Tue, 23 May 2017 16:27:33 -0500 Subject: [PATCH 09/55] Removed redundant array creation in Redrawer.java --- .../src/main/java/com/androidplot/util/Redrawer.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/androidplot-core/src/main/java/com/androidplot/util/Redrawer.java b/androidplot-core/src/main/java/com/androidplot/util/Redrawer.java index 00174027..2eaa5c4e 100644 --- a/androidplot-core/src/main/java/com/androidplot/util/Redrawer.java +++ b/androidplot-core/src/main/java/com/androidplot/util/Redrawer.java @@ -17,11 +17,12 @@ package com.androidplot.util; import android.util.Log; + import com.androidplot.Plot; import java.lang.ref.WeakReference; import java.util.ArrayList; -import java.util.Arrays; +import java.util.Collections; import java.util.List; /** @@ -65,7 +66,7 @@ public Redrawer(List plots, float maxRefreshRate, boolean startImmediately } public Redrawer(Plot plot, float maxRefreshRate, boolean startImmediately) { - this(Arrays.asList(new Plot[]{plot}), maxRefreshRate, startImmediately); + this(Collections.singletonList(plot), maxRefreshRate, startImmediately); } /** @@ -121,7 +122,7 @@ public void run() { } } } - } catch(InterruptedException e) { + } catch (InterruptedException ignored) { } finally { Log.d(TAG, "Redrawer thread exited."); From aa57f8237e3db154109ffcaef4288af12b844708 Mon Sep 17 00:00:00 2001 From: Jonathan Jackson Date: Tue, 23 May 2017 16:30:56 -0500 Subject: [PATCH 10/55] Replaced manual array copy operations with possibly faster method (will vary by android device) --- .../com/androidplot/xy/SimpleXYSeries.java | 11 ++++--- .../com/androidplot/xy/XYGraphWidget.java | 31 +++++++++++++------ 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/androidplot-core/src/main/java/com/androidplot/xy/SimpleXYSeries.java b/androidplot-core/src/main/java/com/androidplot/xy/SimpleXYSeries.java index f346694a..e099315d 100644 --- a/androidplot-core/src/main/java/com/androidplot/xy/SimpleXYSeries.java +++ b/androidplot-core/src/main/java/com/androidplot/xy/SimpleXYSeries.java @@ -17,10 +17,15 @@ package com.androidplot.xy; import android.graphics.Canvas; + import com.androidplot.Plot; import com.androidplot.PlotListener; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; +import java.util.NoSuchElementException; import java.util.concurrent.locks.ReentrantReadWriteLock; @@ -83,9 +88,7 @@ public void onAfterDraw(Plot source, Canvas canvas) { protected static List asNumberList(Number... model) { List numbers = new ArrayList<>(); - for(Number n : model) { - numbers.add(n); - } + Collections.addAll(numbers, model); return numbers; } diff --git a/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java b/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java index 21c512f6..e705feda 100644 --- a/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java +++ b/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java @@ -16,19 +16,32 @@ package com.androidplot.xy; -import android.content.res.*; -import android.graphics.*; - -import com.androidplot.*; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.PointF; +import android.graphics.RectF; + +import com.androidplot.R; import com.androidplot.Region; import com.androidplot.exception.PlotRenderException; -import com.androidplot.ui.*; +import com.androidplot.ui.Insets; +import com.androidplot.ui.LayoutManager; +import com.androidplot.ui.RenderStack; +import com.androidplot.ui.Size; import com.androidplot.ui.widget.Widget; -import com.androidplot.util.*; +import com.androidplot.util.AttrUtils; +import com.androidplot.util.FontUtils; +import com.androidplot.util.PixelUtils; +import com.androidplot.util.RectFUtils; import java.text.DecimalFormat; import java.text.Format; -import java.util.*; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Set; /** * Displays graphical data (lines, points, etc.) annotated with domain and range tick markers. @@ -1147,9 +1160,7 @@ public boolean isLineLabelEnabled(Edge position) { public void setLineLabelEdges(Edge... positions) { Set positionSet = new HashSet<>(); if(positions != null) { - for(Edge position : positions) { - positionSet.add(position); - } + Collections.addAll(positionSet, positions); } setLineLabelEdges(positionSet); } From b7ef79115f9bd088b055a87b5699a677eb48db55 Mon Sep 17 00:00:00 2001 From: Jonathan Jackson Date: Tue, 23 May 2017 16:35:46 -0500 Subject: [PATCH 11/55] Fixed `FastLineAndPointRenderer` allocating many extra instances of `PointF` which hurts android performance. --- .../androidplot/xy/FastLineAndPointRenderer.java | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/androidplot-core/src/main/java/com/androidplot/xy/FastLineAndPointRenderer.java b/androidplot-core/src/main/java/com/androidplot/xy/FastLineAndPointRenderer.java index 7aaa58a8..4e117252 100644 --- a/androidplot-core/src/main/java/com/androidplot/xy/FastLineAndPointRenderer.java +++ b/androidplot-core/src/main/java/com/androidplot/xy/FastLineAndPointRenderer.java @@ -16,12 +16,16 @@ package com.androidplot.xy; -import android.graphics.*; +import android.graphics.Canvas; +import android.graphics.PointF; +import android.graphics.RectF; + import com.androidplot.exception.PlotRenderException; import com.androidplot.ui.RenderStack; import com.androidplot.ui.SeriesRenderer; -import java.util.*; +import java.util.ArrayList; +import java.util.List; /** * A faster implementation of of {@link LineAndPointRenderer}. For performance reasons, has these constraints: @@ -53,11 +57,11 @@ protected void onRender(Canvas canvas, RectF plotArea, XYSeries series, Formatte int segmentLen = 0; boolean isLastPointNull = true; + PointF resultPoint = new PointF(); for (int i = 0, j = 0; i < series.size(); i++, j+=2) { Number y = series.getY(i); Number x = series.getX(i); - PointF thisPoint; if (y != null && x != null) { if(isLastPointNull) { segmentOffsets.add(j); @@ -65,9 +69,9 @@ protected void onRender(Canvas canvas, RectF plotArea, XYSeries series, Formatte isLastPointNull = false; } - thisPoint = getPlot().getBounds().transformScreen(x, y, plotArea); - points[j] = thisPoint.x; - points[j+1] = thisPoint.y; + getPlot().getBounds().transformScreen(resultPoint, x, y, plotArea); + points[j] = resultPoint.x; + points[j + 1] = resultPoint.y; segmentLen+=2; // if this is the last point, account for it in segment lengths: From 2057d869ba9ed701025f3ba2b32ee5badf5b6c63 Mon Sep 17 00:00:00 2001 From: Jonathan Jackson Date: Tue, 23 May 2017 17:17:57 -0500 Subject: [PATCH 12/55] Prevent creation of a new instance of `FastNumber` when setting the min or max of a `Region` --- .../src/main/java/com/androidplot/Region.java | 4 +- .../java/com/androidplot/util/FastNumber.java | 49 +++++++++++++++++++ 2 files changed, 51 insertions(+), 2 deletions(-) diff --git a/androidplot-core/src/main/java/com/androidplot/Region.java b/androidplot-core/src/main/java/com/androidplot/Region.java index c8820f59..0fc6b518 100644 --- a/androidplot-core/src/main/java/com/androidplot/Region.java +++ b/androidplot-core/src/main/java/com/androidplot/Region.java @@ -215,7 +215,7 @@ public void setMin(Number min) { } else { this.min = null; } - } else { + } else if (this.min == null || !this.min.equals(min)) { this.min = new FastNumber(min); } } @@ -237,7 +237,7 @@ public void setMax(Number max) { } else { this.max = null; } - } else { + } else if (this.max == null || !this.max.equals(max)) { this.max = new FastNumber(max); } } diff --git a/androidplot-core/src/main/java/com/androidplot/util/FastNumber.java b/androidplot-core/src/main/java/com/androidplot/util/FastNumber.java index d54daca4..c29b06a8 100644 --- a/androidplot-core/src/main/java/com/androidplot/util/FastNumber.java +++ b/androidplot-core/src/main/java/com/androidplot/util/FastNumber.java @@ -64,6 +64,55 @@ public double doubleValue() { return doublePrimitive; } + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + FastNumber that = (FastNumber) o; + + if (hasDoublePrimitive != that.hasDoublePrimitive) { + return false; + } + if (hasFloatPrimitive != that.hasFloatPrimitive) { + return false; + } + if (hasIntPrimitive != that.hasIntPrimitive) { + return false; + } + if (Double.compare(that.doublePrimitive, doublePrimitive) != 0) { + return false; + } + if (Float.compare(that.floatPrimitive, floatPrimitive) != 0) { + return false; + } + //noinspection SimplifiableIfStatement + if (intPrimitive != that.intPrimitive) { + return false; + } + return number != null ? number.equals(that.number) : that.number == null; + + } + + @Override + public int hashCode() { + int result; + long temp; + result = number != null ? number.hashCode() : 0; + result = 31 * result + (hasDoublePrimitive ? 1 : 0); + result = 31 * result + (hasFloatPrimitive ? 1 : 0); + result = 31 * result + (hasIntPrimitive ? 1 : 0); + temp = Double.doubleToLongBits(doublePrimitive); + result = 31 * result + (int) (temp ^ (temp >>> 32)); + result = 31 * result + (floatPrimitive != +0.0f ? Float.floatToIntBits(floatPrimitive) : 0); + result = 31 * result + intPrimitive; + return result; + } + @Override public String toString() { return String.valueOf(doubleValue()); From ee684712b6b567546b82409d85430af2edbaef50 Mon Sep 17 00:00:00 2001 From: Jonathan Jackson Date: Tue, 23 May 2017 17:18:53 -0500 Subject: [PATCH 13/55] Replaced empty string concatenation with more efficient `String.valueOf` --- .../main/java/com/androidplot/xy/BubbleFormatter.java | 11 ++++++----- .../java/com/androidplot/xy/XYSeriesFormatter.java | 4 ++-- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/androidplot-core/src/main/java/com/androidplot/xy/BubbleFormatter.java b/androidplot-core/src/main/java/com/androidplot/xy/BubbleFormatter.java index b351358b..3a794b5c 100644 --- a/androidplot-core/src/main/java/com/androidplot/xy/BubbleFormatter.java +++ b/androidplot-core/src/main/java/com/androidplot/xy/BubbleFormatter.java @@ -16,11 +16,12 @@ package com.androidplot.xy; -import android.content.*; -import android.graphics.*; +import android.content.Context; +import android.graphics.Color; +import android.graphics.Paint; -import com.androidplot.ui.*; -import com.androidplot.util.*; +import com.androidplot.ui.SeriesRenderer; +import com.androidplot.util.PixelUtils; /** * Format for drawing a value using {@link BubbleRenderer}. @@ -51,7 +52,7 @@ public class BubbleFormatter extends XYSeriesFormatter { setPointLabeler(new PointLabeler() { @Override public String getLabel(BubbleSeries series, int index) { - return series.getZ(index) + ""; + return String.valueOf(series.getZ(index)); } }); } diff --git a/androidplot-core/src/main/java/com/androidplot/xy/XYSeriesFormatter.java b/androidplot-core/src/main/java/com/androidplot/xy/XYSeriesFormatter.java index 0c18d2e9..27924ab1 100644 --- a/androidplot-core/src/main/java/com/androidplot/xy/XYSeriesFormatter.java +++ b/androidplot-core/src/main/java/com/androidplot/xy/XYSeriesFormatter.java @@ -16,7 +16,7 @@ package com.androidplot.xy; -import android.content.*; +import android.content.Context; import com.androidplot.ui.Formatter; import com.androidplot.util.LayerHash; @@ -28,7 +28,7 @@ public abstract class XYSeriesFormatter Date: Tue, 23 May 2017 17:24:09 -0500 Subject: [PATCH 14/55] Replaced HashMaps with EnumMaps where possible in XYGraphWidget.java --- .../java/com/androidplot/xy/XYGraphWidget.java | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java b/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java index e705feda..703f4425 100644 --- a/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java +++ b/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java @@ -39,8 +39,9 @@ import java.text.DecimalFormat; import java.text.Format; import java.util.Collections; -import java.util.HashMap; +import java.util.EnumMap; import java.util.HashSet; +import java.util.Map; import java.util.Set; /** @@ -140,8 +141,8 @@ public class XYGraphWidget extends Widget { private CursorLabelFormatter cursorLabelFormatter; - private HashMap lineLabelStyles = getDefaultLineLabelStyles(); - private HashMap lineLabelRenderers = getDefaultLineLabelRenderers(); + private Map lineLabelStyles = getDefaultLineLabelStyles(); + private Map lineLabelRenderers = getDefaultLineLabelRenderers(); public static class LineLabelRenderer { @@ -1064,8 +1065,8 @@ public void setLineExtensionRight(float lineExtensionRight) { this.lineExtensionRight = lineExtensionRight; } - protected HashMap getDefaultLineLabelStyles() { - HashMap defaults = new HashMap<>(); + protected Map getDefaultLineLabelStyles() { + EnumMap defaults = new EnumMap<>(Edge.class); defaults.put(Edge.TOP, new LineLabelStyle()); defaults.put(Edge.BOTTOM, new LineLabelStyle()); defaults.put(Edge.LEFT, new LineLabelStyle()); @@ -1073,8 +1074,8 @@ protected HashMap getDefaultLineLabelStyles() { return defaults; } - protected HashMap getDefaultLineLabelRenderers() { - HashMap defaults = new HashMap<>(); + protected Map getDefaultLineLabelRenderers() { + EnumMap defaults = new EnumMap<>(Edge.class); defaults.put(Edge.TOP, new LineLabelRenderer()); defaults.put(Edge.BOTTOM, new LineLabelRenderer()); defaults.put(Edge.LEFT, new LineLabelRenderer()); From 71abe37d39bfbcfbc44e2753063c840fe58867bd Mon Sep 17 00:00:00 2001 From: Jonathan Jackson Date: Tue, 23 May 2017 17:43:17 -0500 Subject: [PATCH 15/55] Replaced stringbuffer with string in XYConstraints.java#toString() --- .../com/androidplot/xy/XYConstraints.java | 24 +++++++++---------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/androidplot-core/src/main/java/com/androidplot/xy/XYConstraints.java b/androidplot-core/src/main/java/com/androidplot/xy/XYConstraints.java index 14aea42a..705ae635 100644 --- a/androidplot-core/src/main/java/com/androidplot/xy/XYConstraints.java +++ b/androidplot-core/src/main/java/com/androidplot/xy/XYConstraints.java @@ -162,18 +162,16 @@ public void setMaxY(Number maxY) { @Override public String toString() { - final StringBuffer sb = new StringBuffer("XYConstraints{"); - sb.append("domainFramingModel=").append(domainFramingModel); - sb.append(", rangeFramingModel=").append(rangeFramingModel); - sb.append(", domainUpperBoundaryMode=").append(domainUpperBoundaryMode); - sb.append(", domainLowerBoundaryMode=").append(domainLowerBoundaryMode); - sb.append(", rangeUpperBoundaryMode=").append(rangeUpperBoundaryMode); - sb.append(", rangeLowerBoundaryMode=").append(rangeLowerBoundaryMode); - sb.append(", minX=").append(minX); - sb.append(", maxX=").append(maxX); - sb.append(", minY=").append(minY); - sb.append(", maxY=").append(maxY); - sb.append('}'); - return sb.toString(); + return "XYConstraints{" + "domainFramingModel=" + domainFramingModel + + ", rangeFramingModel=" + rangeFramingModel + + ", domainUpperBoundaryMode=" + domainUpperBoundaryMode + + ", domainLowerBoundaryMode=" + domainLowerBoundaryMode + + ", rangeUpperBoundaryMode=" + rangeUpperBoundaryMode + + ", rangeLowerBoundaryMode=" + rangeLowerBoundaryMode + + ", minX=" + minX + + ", maxX=" + maxX + + ", minY=" + minY + + ", maxY=" + maxY + + '}'; } } From bbd053c479b487242056fc55fa90327de7964106 Mon Sep 17 00:00:00 2001 From: Jonathan Jackson Date: Tue, 23 May 2017 17:43:44 -0500 Subject: [PATCH 16/55] Replaced HashSet with EnumSet --- .../java/com/androidplot/xy/XYGraphWidget.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java b/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java index 703f4425..a6460799 100644 --- a/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java +++ b/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java @@ -38,11 +38,11 @@ import java.text.DecimalFormat; import java.text.Format; +import java.util.Collection; import java.util.Collections; import java.util.EnumMap; -import java.util.HashSet; +import java.util.EnumSet; import java.util.Map; -import java.util.Set; /** * Displays graphical data (lines, points, etc.) annotated with domain and range tick markers. @@ -135,7 +135,7 @@ public class XYGraphWidget extends Widget { /** * Set of edges for which line labels should be displayed */ - private Set lineLabelEdges = new HashSet<>(); + private EnumSet lineLabelEdges = EnumSet.noneOf(Edge.class); private RenderStack renderStack; @@ -1159,15 +1159,15 @@ public boolean isLineLabelEnabled(Edge position) { } public void setLineLabelEdges(Edge... positions) { - Set positionSet = new HashSet<>(); + EnumSet positionSet = EnumSet.noneOf(Edge.class); if(positions != null) { Collections.addAll(positionSet, positions); } - setLineLabelEdges(positionSet); + this.lineLabelEdges = positionSet; } - public void setLineLabelEdges(Set positions) { - this.lineLabelEdges = positions; + public void setLineLabelEdges(Collection positions) { + this.lineLabelEdges = EnumSet.copyOf(positions); } protected void setLineLabelEdges(int bitfield) { From 8b203630d2bc382fdb57529b47daac397b500628 Mon Sep 17 00:00:00 2001 From: Jonathan Jackson Date: Tue, 23 May 2017 17:56:26 -0500 Subject: [PATCH 17/55] Replace float new instance with Float.valueOf --- .../src/main/java/com/androidplot/ui/DynamicTableModel.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/androidplot-core/src/main/java/com/androidplot/ui/DynamicTableModel.java b/androidplot-core/src/main/java/com/androidplot/ui/DynamicTableModel.java index c7c7f066..ff973b9d 100644 --- a/androidplot-core/src/main/java/com/androidplot/ui/DynamicTableModel.java +++ b/androidplot-core/src/main/java/com/androidplot/ui/DynamicTableModel.java @@ -149,10 +149,10 @@ public TableModelIterator(DynamicTableModel dynamicTableModel, RectF tableRect, calculatedRows = dynamicTableModel.getNumRows(); // round up: - calculatedColumns = new Float((totalElements / (float) calculatedRows) + 0.5).intValue(); + calculatedColumns = Float.valueOf((totalElements / (float) calculatedRows) + 0.5f).intValue(); } else if(dynamicTableModel.getNumRows() == 0 && dynamicTableModel.getNumColumns() >= 1) { calculatedColumns = dynamicTableModel.getNumColumns(); - calculatedRows = new Float((totalElements / (float) calculatedColumns) + 0.5).intValue(); + calculatedRows = Float.valueOf((totalElements / (float) calculatedColumns) + 0.5f).intValue(); // unlimited rows and columns (impossible) so default a single row with n columns: }else if(dynamicTableModel.getNumColumns() == 0 && dynamicTableModel.getNumRows() == 0) { calculatedRows = 1; From 25de70b266f09488ac316826154c976742e11252 Mon Sep 17 00:00:00 2001 From: Jonathan Jackson Date: Tue, 23 May 2017 18:05:58 -0500 Subject: [PATCH 18/55] Replaced StringBuffer with StringBuilder --- androidplot-core/src/main/java/com/androidplot/Region.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/androidplot-core/src/main/java/com/androidplot/Region.java b/androidplot-core/src/main/java/com/androidplot/Region.java index 0fc6b518..3f67bb09 100644 --- a/androidplot-core/src/main/java/com/androidplot/Region.java +++ b/androidplot-core/src/main/java/com/androidplot/Region.java @@ -252,7 +252,7 @@ public boolean isDefined() { @Override public String toString() { - final StringBuffer sb = new StringBuffer("Region{"); + final StringBuilder sb = new StringBuilder("Region{"); sb.append("min=").append(min); sb.append(", max=").append(max); sb.append(", cachedLength=").append(cachedLength); From fcf103a07daec5fc6882d09947a6f133d02a76da Mon Sep 17 00:00:00 2001 From: Jonathan Jackson Date: Tue, 23 May 2017 18:21:09 -0500 Subject: [PATCH 19/55] set initial array sizes --- .../src/main/java/com/androidplot/SeriesRegistry.java | 4 ++-- .../src/main/java/com/androidplot/util/Redrawer.java | 2 +- .../src/main/java/com/androidplot/xy/SimpleXYSeries.java | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/androidplot-core/src/main/java/com/androidplot/SeriesRegistry.java b/androidplot-core/src/main/java/com/androidplot/SeriesRegistry.java index 78f3d805..7a7b3023 100644 --- a/androidplot-core/src/main/java/com/androidplot/SeriesRegistry.java +++ b/androidplot-core/src/main/java/com/androidplot/SeriesRegistry.java @@ -19,7 +19,7 @@ import com.androidplot.ui.Formatter; import com.androidplot.ui.SeriesBundle; -import java.io.*; +import java.io.Serializable; import java.util.ArrayList; import java.util.Iterator; import java.util.List; @@ -38,7 +38,7 @@ public List getSeriesAndFormatterList() { return registry; } public List getSeriesList() { - List result = new ArrayList<>(); + List result = new ArrayList<>(registry.size()); for(SeriesBundle sfPair : registry) { result.add(sfPair.getSeries()); } diff --git a/androidplot-core/src/main/java/com/androidplot/util/Redrawer.java b/androidplot-core/src/main/java/com/androidplot/util/Redrawer.java index 2eaa5c4e..6cf3b4eb 100644 --- a/androidplot-core/src/main/java/com/androidplot/util/Redrawer.java +++ b/androidplot-core/src/main/java/com/androidplot/util/Redrawer.java @@ -53,7 +53,7 @@ public class Redrawer implements Runnable { * @param startImmediately If true, invokes run() immediately after construction. */ public Redrawer(List plots, float maxRefreshRate, boolean startImmediately) { - this.plots = new ArrayList<>(); + this.plots = new ArrayList<>(plots.size()); for(Plot plot : plots) { this.plots.add(new WeakReference<>(plot)); } diff --git a/androidplot-core/src/main/java/com/androidplot/xy/SimpleXYSeries.java b/androidplot-core/src/main/java/com/androidplot/xy/SimpleXYSeries.java index e099315d..4d3ebaac 100644 --- a/androidplot-core/src/main/java/com/androidplot/xy/SimpleXYSeries.java +++ b/androidplot-core/src/main/java/com/androidplot/xy/SimpleXYSeries.java @@ -87,7 +87,7 @@ public void onAfterDraw(Plot source, Canvas canvas) { } protected static List asNumberList(Number... model) { - List numbers = new ArrayList<>(); + List numbers = new ArrayList<>(model.length); Collections.addAll(numbers, model); return numbers; } From 24e184fbbab124f2e3db381427cd630feece0e10 Mon Sep 17 00:00:00 2001 From: Jonathan Jackson Date: Tue, 23 May 2017 18:25:28 -0500 Subject: [PATCH 20/55] Removed the primative cache from FastNumber#equals and FastNumber#hashcode() and made the number field final --- .../java/com/androidplot/util/FastNumber.java | 33 ++----------------- 1 file changed, 2 insertions(+), 31 deletions(-) diff --git a/androidplot-core/src/main/java/com/androidplot/util/FastNumber.java b/androidplot-core/src/main/java/com/androidplot/util/FastNumber.java index c29b06a8..ba09dd5b 100644 --- a/androidplot-core/src/main/java/com/androidplot/util/FastNumber.java +++ b/androidplot-core/src/main/java/com/androidplot/util/FastNumber.java @@ -5,7 +5,7 @@ */ public class FastNumber extends Number { - private Number number; + private final Number number; private boolean hasDoublePrimitive; private boolean hasFloatPrimitive; private boolean hasIntPrimitive; @@ -75,42 +75,13 @@ public boolean equals(Object o) { FastNumber that = (FastNumber) o; - if (hasDoublePrimitive != that.hasDoublePrimitive) { - return false; - } - if (hasFloatPrimitive != that.hasFloatPrimitive) { - return false; - } - if (hasIntPrimitive != that.hasIntPrimitive) { - return false; - } - if (Double.compare(that.doublePrimitive, doublePrimitive) != 0) { - return false; - } - if (Float.compare(that.floatPrimitive, floatPrimitive) != 0) { - return false; - } - //noinspection SimplifiableIfStatement - if (intPrimitive != that.intPrimitive) { - return false; - } return number != null ? number.equals(that.number) : that.number == null; } @Override public int hashCode() { - int result; - long temp; - result = number != null ? number.hashCode() : 0; - result = 31 * result + (hasDoublePrimitive ? 1 : 0); - result = 31 * result + (hasFloatPrimitive ? 1 : 0); - result = 31 * result + (hasIntPrimitive ? 1 : 0); - temp = Double.doubleToLongBits(doublePrimitive); - result = 31 * result + (int) (temp ^ (temp >>> 32)); - result = 31 * result + (floatPrimitive != +0.0f ? Float.floatToIntBits(floatPrimitive) : 0); - result = 31 * result + intPrimitive; - return result; + return number != null ? number.hashCode() : 0; } @Override From 0532512b57ceeff51c447c38ad4abaeb75b498f6 Mon Sep 17 00:00:00 2001 From: Jonathan Jackson Date: Tue, 23 May 2017 22:29:48 -0500 Subject: [PATCH 21/55] Made methods static where possible --- .../java/com/androidplot/ui/LayoutManager.java | 10 ++++++++-- .../main/java/com/androidplot/xy/RectRegion.java | 2 +- .../src/main/java/com/androidplot/xy/XYPlot.java | 14 ++++++++++---- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/androidplot-core/src/main/java/com/androidplot/ui/LayoutManager.java b/androidplot-core/src/main/java/com/androidplot/ui/LayoutManager.java index d9107442..9e66e80c 100644 --- a/androidplot-core/src/main/java/com/androidplot/ui/LayoutManager.java +++ b/androidplot-core/src/main/java/com/androidplot/ui/LayoutManager.java @@ -16,9 +16,15 @@ package com.androidplot.ui; -import android.graphics.*; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.PointF; +import android.graphics.RectF; +import android.graphics.Region; import android.view.MotionEvent; import android.view.View; + import com.androidplot.exception.PlotRenderException; import com.androidplot.ui.widget.Widget; import com.androidplot.util.DisplayDimensions; @@ -132,7 +138,7 @@ public void draw(Canvas canvas) throws PlotRenderException { } } - private void drawSpacing(Canvas canvas, RectF outer, RectF inner, Paint paint) { + private static void drawSpacing(Canvas canvas, RectF outer, RectF inner, Paint paint) { try { canvas.save(Canvas.ALL_SAVE_FLAG); canvas.clipRect(inner, Region.Op.DIFFERENCE); diff --git a/androidplot-core/src/main/java/com/androidplot/xy/RectRegion.java b/androidplot-core/src/main/java/com/androidplot/xy/RectRegion.java index 5a1433f7..0bb8988d 100644 --- a/androidplot-core/src/main/java/com/androidplot/xy/RectRegion.java +++ b/androidplot-core/src/main/java/com/androidplot/xy/RectRegion.java @@ -245,7 +245,7 @@ public Number getHeight() { * @param y * @return */ - private Number distanceBetween(Number x, Number y) { + private static Number distanceBetween(Number x, Number y) { return Math.abs(x.doubleValue() - y.doubleValue()); } diff --git a/androidplot-core/src/main/java/com/androidplot/xy/XYPlot.java b/androidplot-core/src/main/java/com/androidplot/xy/XYPlot.java index 33769886..9c131fa6 100644 --- a/androidplot-core/src/main/java/com/androidplot/xy/XYPlot.java +++ b/androidplot-core/src/main/java/com/androidplot/xy/XYPlot.java @@ -25,9 +25,15 @@ import android.support.annotation.NonNull; import android.util.AttributeSet; -import com.androidplot.*; -import com.androidplot.ui.*; +import com.androidplot.Plot; +import com.androidplot.R; +import com.androidplot.ui.Anchor; +import com.androidplot.ui.DynamicTableModel; +import com.androidplot.ui.HorizontalPositioning; +import com.androidplot.ui.Size; +import com.androidplot.ui.SizeMode; import com.androidplot.ui.TextOrientation; +import com.androidplot.ui.VerticalPositioning; import com.androidplot.ui.widget.TextLabelWidget; import com.androidplot.util.AttrUtils; import com.androidplot.util.PixelUtils; @@ -581,7 +587,7 @@ protected Number getCalculatedLowerBoundary(BoundaryMode mode, Number previousMi * @param min * @param max */ - private Number applyUserMinMax(Number value, Number min, Number max) { + private static Number applyUserMinMax(Number value, Number min, Number max) { value = (((min == null) || (value == null) || (value.doubleValue() > min.doubleValue())) ? value : min); @@ -678,7 +684,7 @@ protected Number[] getOriginMinMax(BoundaryMode mode, Number origin, Number exte * @param y * @return */ - private double distance(double x, double y) { + private static double distance(double x, double y) { if (x > y) { return x - y; } else { From fb03dc4e679cb585063cfc680b978fc3cef88d89 Mon Sep 17 00:00:00 2001 From: Jonathan Jackson Date: Wed, 24 May 2017 10:04:16 -0500 Subject: [PATCH 22/55] Update android gradle plugin version to 2.3.2 --- build.gradle | 2 +- demoapp-wearable/build.gradle | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index dd84178e..f6deec86 100644 --- a/build.gradle +++ b/build.gradle @@ -38,7 +38,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:2.3.1' + classpath 'com.android.tools.build:gradle:2.3.2' classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5' classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7' classpath 'com.vanniktech:gradle-android-junit-jacoco-plugin:0.5.0' diff --git a/demoapp-wearable/build.gradle b/demoapp-wearable/build.gradle index dd1d8926..37406aaa 100644 --- a/demoapp-wearable/build.gradle +++ b/demoapp-wearable/build.gradle @@ -19,7 +19,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.3.1' + classpath 'com.android.tools.build:gradle:2.3.2' } } apply plugin: 'com.android.application' From 8e0c2fb60ea41fd47feb19784d0d41e40d623fb7 Mon Sep 17 00:00:00 2001 From: Jonathan Jackson Date: Wed, 24 May 2017 10:44:28 -0500 Subject: [PATCH 23/55] Add documentation and parameter annotations to `FastLineAndPointRenderer.java` --- .../xy/FastLineAndPointRenderer.java | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/androidplot-core/src/main/java/com/androidplot/xy/FastLineAndPointRenderer.java b/androidplot-core/src/main/java/com/androidplot/xy/FastLineAndPointRenderer.java index 4e117252..d1e3fc8e 100644 --- a/androidplot-core/src/main/java/com/androidplot/xy/FastLineAndPointRenderer.java +++ b/androidplot-core/src/main/java/com/androidplot/xy/FastLineAndPointRenderer.java @@ -17,8 +17,10 @@ package com.androidplot.xy; import android.graphics.Canvas; +import android.graphics.Paint; import android.graphics.PointF; import android.graphics.RectF; +import android.support.annotation.NonNull; import com.androidplot.exception.PlotRenderException; import com.androidplot.ui.RenderStack; @@ -36,6 +38,11 @@ */ public class FastLineAndPointRenderer extends XYSeriesRenderer { + /** + * A line drawn by {@link Canvas#drawLines(float[], int, int, Paint)} must be defined by at + * least four points {@code x0, y0, x1, y1} + */ + private static final int MINIMUM_NUMBER_OF_POINTS_TO_DEFINE_A_LINE = 4; private float[] points; List segmentOffsets = new ArrayList<>(); List segmentLengths = new ArrayList<>(); @@ -94,10 +101,14 @@ protected void onRender(Canvas canvas, RectF plotArea, XYSeries series, Formatte } } - protected void drawSegment(Canvas canvas, float[] points, int offset, int len, Formatter formatter) { + protected void drawSegment(@NonNull Canvas canvas, + @NonNull float[] points, + int offset, + int len, + Formatter formatter) { if(formatter.linePaint != null) { // draw lines: - if (len >= 4) { + if (len >= MINIMUM_NUMBER_OF_POINTS_TO_DEFINE_A_LINE) { // optimization to avoid using 2x storage space to represent the full path: if ((len & 2) != 0) { canvas.drawLines(points, offset, len - 2, formatter.linePaint); @@ -116,7 +127,9 @@ protected void drawSegment(Canvas canvas, float[] points, int offset, int len, F } @Override - protected void doDrawLegendIcon(Canvas canvas, RectF rect, Formatter formatter) { + protected void doDrawLegendIcon(@NonNull Canvas canvas, + @NonNull RectF rect, + @NonNull Formatter formatter) { if(formatter.hasLinePaint()) { canvas.drawLine(rect.left, rect.bottom, rect.right, rect.top, formatter.getLinePaint()); } From aedff0d2f0b858c806a6e451ff4b4aedbd014b1d Mon Sep 17 00:00:00 2001 From: Jonathan Jackson Date: Thu, 25 May 2017 11:17:55 -0500 Subject: [PATCH 24/55] Add Unit Tests for FastNumber.java#equals and FastNumber.java#hashCode --- .../java/com/androidplot/util/FastNumber.java | 6 + .../com/androidplot/util/FastNumberTest.java | 172 ++++++++++++++++++ 2 files changed, 178 insertions(+) create mode 100644 androidplot-core/src/test/java/com/androidplot/util/FastNumberTest.java diff --git a/androidplot-core/src/main/java/com/androidplot/util/FastNumber.java b/androidplot-core/src/main/java/com/androidplot/util/FastNumber.java index ba09dd5b..4f484f56 100644 --- a/androidplot-core/src/main/java/com/androidplot/util/FastNumber.java +++ b/androidplot-core/src/main/java/com/androidplot/util/FastNumber.java @@ -64,6 +64,12 @@ public double doubleValue() { return doublePrimitive; } + /** + * To be equal, two instances must both be instances of {@link FastNumber}. The inner {@link + * #number} field must also be a common type. Numbers which are mathematically equal are not + * necessarily equal. This keeps with the java implementation of common Number classes where for + * instance {@code new Integer(0).equals(new Double(0))} returns {@code false} + */ @Override public boolean equals(Object o) { if (this == o) { diff --git a/androidplot-core/src/test/java/com/androidplot/util/FastNumberTest.java b/androidplot-core/src/test/java/com/androidplot/util/FastNumberTest.java new file mode 100644 index 00000000..fa09d0cf --- /dev/null +++ b/androidplot-core/src/test/java/com/androidplot/util/FastNumberTest.java @@ -0,0 +1,172 @@ +package com.androidplot.util; + +import android.annotation.SuppressLint; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertTrue; + +@SuppressWarnings({"UnnecessaryBoxing", "ObjectEqualsNull", "EqualsBetweenInconvertibleTypes", "EqualsWithItself", "NumberEquality"}) +@SuppressLint("UseValueOf") +public class FastNumberTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + + } + + @Test + public void testEquals() { + assertEquals(new FastNumber(null), new FastNumber(null)); + assertEquals(new FastNumber(new Double(0)), new FastNumber(new Double(0))); + assertNotEquals(new FastNumber(new Double(0)), new FastNumber(new Long(0))); + } + + + @Test + public void testEqualsInteger() { + assertEquals(new Integer(0), Integer.valueOf(0)); + assertEquals(new Integer(1), Integer.valueOf(1)); + assertEquals(new Integer(-1), Integer.valueOf(-1)); + + Integer fixture = new Integer(25); + assertEquals(fixture, fixture); + assertFalse(fixture.equals(null)); + assertFalse(fixture.equals("Not a Integer")); + } + + @Test + public void testEqualsInteger2() { + // Test for method boolean java.lang.Integer.equals(java.lang.Object) + FastNumber i1 = new FastNumber(new Integer(1000)); + FastNumber i2 = new FastNumber(new Integer(1000)); + FastNumber i3 = new FastNumber(new Integer(-1000)); + assertTrue("Equality test failed", i1.equals(i2) && !(i1.equals(i3))); + } + + @Test + public void testEqualsLong() { + assertEquals(new FastNumber(new Long(0)), new FastNumber(Long.valueOf(0))); + assertEquals(new FastNumber(new Long(1)), new FastNumber(Long.valueOf(1))); + assertEquals(new FastNumber(new Long(-1)), new FastNumber(Long.valueOf(-1))); + + FastNumber fixture = new FastNumber(new Long(25)); + assertEquals(fixture, fixture); + assertFalse(fixture.equals(null)); + assertFalse(fixture.equals("Not a Long")); + } + + @Test + public void testEqualsDouble() { + FastNumber d1 = new FastNumber(new Double(87654321.12345d)); + FastNumber d2 = new FastNumber(new Double(87654321.12345d)); + FastNumber d3 = new FastNumber(new Double(0.0002f)); + assertTrue("Assert 0: Equality test failed", d1.equals(d2) && !(d1.equals(d3))); + + assertTrue("Assert 2: NaN should not be == Nan", Double.NaN != Double.NaN); + assertTrue("Assert 3: NaN should not be == Nan", new FastNumber(new Double(Double.NaN)) + .equals(new FastNumber(new Double(Double.NaN)))); + assertTrue("Assert 4: -0d should be == 0d", 0d == -0d); + assertTrue("Assert 5: -0d should not be equals() 0d", !new FastNumber(new Double(0d)) + .equals(new FastNumber(new Double(-0d)))); + + FastNumber dmax = new FastNumber(new Double(Double.MAX_VALUE)); + FastNumber dmax1 = new FastNumber(new Double(Double.MAX_VALUE)); + + assertTrue("Equality test failed", dmax.equals(dmax1) && !(dmax.equals(new Object()))); + } + + @Test + public void testEqualsFloat() { + FastNumber f1 = new FastNumber(new Float(8765.4321f)); + FastNumber f2 = new FastNumber(new Float(8765.4321f)); + FastNumber f3 = new FastNumber(new Float(-1.0f)); + assertTrue("Assert 0: Equality test failed", f1.equals(f2) && !(f1.equals(f3))); + + assertTrue("Assert 1: NaN should not be == Nan", Float.NaN != Float.NaN); + assertTrue("Assert 2: NaN should not be == Nan", new FastNumber(new Float(Float.NaN)).equals(new FastNumber(new Float( + Float.NaN)))); + assertTrue("Assert 3: -0f should be == 0f", 0f == -0f); + assertTrue("Assert 4: -0f should not be equals() 0f", !new FastNumber(new Float(0f)).equals(new FastNumber(new Float( + -0f)))); + + f1 = new FastNumber(new Float(1098.576f)); + f2 = new FastNumber(new Float(1098.576f)); + f3 = new FastNumber(new Float(1.0f)); + assertTrue("Equality test failed", f1.equals(f2) && !(f1.equals(f3))); + + assertTrue("NaN should not be == Nan", Float.NaN != Float.NaN); + assertTrue("NaN should not be == Nan", new FastNumber(new Float(Float.NaN)) + .equals(new FastNumber(new Float(Float.NaN)))); + assertTrue("-0f should be == 0f", 0f == -0f); + assertTrue("-0f should not be equals() 0f", !new FastNumber(new Float(0f)).equals(new FastNumber(new Float(-0f)))); + } + + @Test + public void testHashCodeInteger() { + assertEquals(1, new FastNumber(new Integer(1)).hashCode()); + assertEquals(2, new FastNumber(new Integer(2)).hashCode()); + assertEquals(0, new FastNumber(new Integer(0)).hashCode()); + assertEquals(-1, new FastNumber(new Integer(-1)).hashCode()); + } + + @Test + public void testHashCodeInteger2() { + // Test for method int java.lang.Integer.hashCode() + + FastNumber i1 = new FastNumber(new Integer(1000)); + FastNumber i2 = new FastNumber(new Integer(-1000)); + assertTrue("Returned incorrect hashcode", i1.hashCode() == 1000 + && (i2.hashCode() == -1000)); + } + + @SuppressWarnings("PointlessBitwiseExpression") + @Test + public void testHashCodeLong() { + assertEquals((int) (1L ^ (1L >>> 32)), new FastNumber(new Long(1)).hashCode()); + assertEquals((int) (2L ^ (2L >>> 32)), new FastNumber(new Long(2)).hashCode()); + assertEquals((int) (0L ^ (0L >>> 32)), new FastNumber(new Long(0)).hashCode()); + assertEquals((int) (-1L ^ (-1L >>> 32)), new FastNumber(new Long(-1)).hashCode()); + } + + @Test + public void testHashCodeDouble() { + // Test for method int java.lang.Double.hashCode() + for (int i = -1000; i < 1000; i++) { + FastNumber d = new FastNumber(new Double(i)); + FastNumber dd = new FastNumber(new Double(i)); + assertTrue("Should not be identical ", d != dd); + assertTrue("Should be equals 1 ", d.equals(dd)); + assertTrue("Should be equals 2 ", dd.equals(d)); + assertTrue("Should have identical values ", dd.doubleValue() == d.doubleValue()); + assertTrue("Invalid hash for equal but not identical doubles ", d.hashCode() == dd + .hashCode()); + } + assertEquals("Magic assumption hasCode (0.0) = 0 failed", 0, new FastNumber(new Double(0.0)).hashCode()); + } + + @Test + public void testHashCodeFloat() { + // Test for method int java.lang.Float.hashCode() + FastNumber f = new FastNumber(new Float(1908.8786f)); + assertTrue("Returned invalid hash code for 1908.8786f", f.hashCode() == Float + .floatToIntBits(1908.8786f)); + + f = new FastNumber(new Float(-1.112f)); + assertTrue("Returned invalid hash code for -1.112", f.hashCode() == Float + .floatToIntBits(-1.112f)); + + f = new FastNumber(new Float(0f)); + assertTrue("Returned invalid hash code for 0", f.hashCode() == Float.floatToIntBits(0f)); + } + +} \ No newline at end of file From 411489665ee6818e4b2a92f874aadd27688d77d6 Mon Sep 17 00:00:00 2001 From: Jonathan Jackson Date: Fri, 26 May 2017 11:06:39 -0500 Subject: [PATCH 25/55] FastNumber.java does not allow null --- .../main/java/com/androidplot/util/FastNumber.java | 13 ++++++++++--- .../java/com/androidplot/util/FastNumberTest.java | 7 ++++++- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/androidplot-core/src/main/java/com/androidplot/util/FastNumber.java b/androidplot-core/src/main/java/com/androidplot/util/FastNumber.java index 4f484f56..9841fb0c 100644 --- a/androidplot-core/src/main/java/com/androidplot/util/FastNumber.java +++ b/androidplot-core/src/main/java/com/androidplot/util/FastNumber.java @@ -1,10 +1,13 @@ package com.androidplot.util; +import android.support.annotation.NonNull; + /** * An extension of {@link Number} optimized for speed at the cost of memory. */ public class FastNumber extends Number { + @NonNull private final Number number; private boolean hasDoublePrimitive; private boolean hasFloatPrimitive; @@ -14,7 +17,11 @@ public class FastNumber extends Number { private float floatPrimitive; private int intPrimitive; - public FastNumber(Number number) { + public FastNumber(@NonNull Number number) { + //noinspection ConstantConditions //in case someone ignores the @NonNull annotation + if (number == null) { + throw new IllegalArgumentException("number parameter cannot be null"); + } // avoid nested instances of FastNumber : if(number instanceof FastNumber) { @@ -81,13 +88,13 @@ public boolean equals(Object o) { FastNumber that = (FastNumber) o; - return number != null ? number.equals(that.number) : that.number == null; + return number.equals(that.number); } @Override public int hashCode() { - return number != null ? number.hashCode() : 0; + return number.hashCode(); } @Override diff --git a/androidplot-core/src/test/java/com/androidplot/util/FastNumberTest.java b/androidplot-core/src/test/java/com/androidplot/util/FastNumberTest.java index fa09d0cf..c7900804 100644 --- a/androidplot-core/src/test/java/com/androidplot/util/FastNumberTest.java +++ b/androidplot-core/src/test/java/com/androidplot/util/FastNumberTest.java @@ -24,9 +24,14 @@ public void tearDown() throws Exception { } + @Test(expected = IllegalArgumentException.class) + public void testNullConstructor() { + //noinspection ConstantConditions + new FastNumber(null); + } + @Test public void testEquals() { - assertEquals(new FastNumber(null), new FastNumber(null)); assertEquals(new FastNumber(new Double(0)), new FastNumber(new Double(0))); assertNotEquals(new FastNumber(new Double(0)), new FastNumber(new Long(0))); } From ad4b167a9c3da4d5e6b21c40ae7616f311f539a2 Mon Sep 17 00:00:00 2001 From: Jonathan Jackson Date: Fri, 26 May 2017 11:14:38 -0500 Subject: [PATCH 26/55] Annotated all method/parameters in overrides which aren't annotated as the method/parameter they override. --- .../com/androidplot/ui/PositionMetrics.java | 4 ++- .../demos/AnimatedXYPlotActivity.java | 7 +++-- .../demos/CandlestickChartActivity.java | 29 ++++++++++++++----- .../androidplot/demos/DualScaleActivity.java | 20 ++++++------- .../androidplot/demos/ListViewActivity.java | 11 +++++-- .../demos/SimpleXYPlotActivity.java | 17 +++++++---- .../demos/StepChartExampleActivity.java | 18 ++++++++---- .../androidplot/demos/TimeSeriesActivity.java | 26 ++++++++++++----- 8 files changed, 92 insertions(+), 40 deletions(-) diff --git a/androidplot-core/src/main/java/com/androidplot/ui/PositionMetrics.java b/androidplot-core/src/main/java/com/androidplot/ui/PositionMetrics.java index 3381f20f..88efddcb 100644 --- a/androidplot-core/src/main/java/com/androidplot/ui/PositionMetrics.java +++ b/androidplot-core/src/main/java/com/androidplot/ui/PositionMetrics.java @@ -16,6 +16,8 @@ package com.androidplot.ui; +import android.support.annotation.NonNull; + public class PositionMetrics implements Comparable { private HorizontalPosition horizontalPosition; @@ -47,7 +49,7 @@ public void setAnchor(Anchor anchor) { } @Override - public int compareTo(PositionMetrics o) { + public int compareTo(@NonNull PositionMetrics o) { if(this.layerDepth < o.layerDepth) { return -1; } else if(this.layerDepth == o.layerDepth) { diff --git a/demoapp/src/main/java/com/androidplot/demos/AnimatedXYPlotActivity.java b/demoapp/src/main/java/com/androidplot/demos/AnimatedXYPlotActivity.java index 7c2cdaee..75d9553b 100644 --- a/demoapp/src/main/java/com/androidplot/demos/AnimatedXYPlotActivity.java +++ b/demoapp/src/main/java/com/androidplot/demos/AnimatedXYPlotActivity.java @@ -21,6 +21,7 @@ import android.app.Activity; import android.graphics.Color; import android.os.Bundle; +import android.support.annotation.NonNull; import android.view.animation.AccelerateDecelerateInterpolator; import com.androidplot.xy.BoundaryMode; @@ -96,12 +97,14 @@ public void onCreate(Bundle savedInstanceState) plot.getGraph().getLineLabelStyle(XYGraphWidget.Edge.BOTTOM).setFormat(new Format() { @Override - public StringBuffer format(Object obj, StringBuffer toAppendTo, FieldPosition pos) { + public StringBuffer format(Object obj, + @NonNull StringBuffer toAppendTo, + @NonNull FieldPosition pos) { int i = Math.round(((Number) obj).floatValue()); return toAppendTo.append(domainLabels[i]); } @Override - public Object parseObject(String source, ParsePosition pos) { + public Object parseObject(String source, @NonNull ParsePosition pos) { return null; } }); diff --git a/demoapp/src/main/java/com/androidplot/demos/CandlestickChartActivity.java b/demoapp/src/main/java/com/androidplot/demos/CandlestickChartActivity.java index 432b16ed..2c37580a 100644 --- a/demoapp/src/main/java/com/androidplot/demos/CandlestickChartActivity.java +++ b/demoapp/src/main/java/com/androidplot/demos/CandlestickChartActivity.java @@ -21,15 +21,28 @@ import android.graphics.DashPathEffect; import android.graphics.Paint; import android.os.Bundle; +import android.support.annotation.NonNull; -import com.androidplot.*; -import com.androidplot.util.*; +import com.androidplot.Region; +import com.androidplot.util.PixelUtils; +import com.androidplot.util.SeriesUtils; +import com.androidplot.xy.BoundaryMode; import com.androidplot.xy.CandlestickFormatter; import com.androidplot.xy.CandlestickMaker; import com.androidplot.xy.CandlestickSeries; -import com.androidplot.xy.*; - -import java.text.*; +import com.androidplot.xy.CatmullRomInterpolator; +import com.androidplot.xy.LineAndPointFormatter; +import com.androidplot.xy.PointLabelFormatter; +import com.androidplot.xy.PointLabeler; +import com.androidplot.xy.StepMode; +import com.androidplot.xy.XYGraphWidget; +import com.androidplot.xy.XYPlot; +import com.androidplot.xy.XYSeries; + +import java.text.DecimalFormat; +import java.text.FieldPosition; +import java.text.Format; +import java.text.ParsePosition; /** * A simple example of a candlestick chart rendered on an {@link XYPlot}. @@ -98,8 +111,8 @@ public void onCreate(Bundle savedInstanceState) { plot.setDomainStep(StepMode.INCREMENT_BY_VAL, 1); plot.getGraph().getLineLabelStyle(XYGraphWidget.Edge.BOTTOM).setFormat(new Format() { @Override - public StringBuffer format(Object object, StringBuffer buffer, - FieldPosition field) { + public StringBuffer format(Object object, @NonNull StringBuffer buffer, + @NonNull FieldPosition field) { int day = ((Number) object).intValue() % 7; switch (day) { case 0: @@ -130,7 +143,7 @@ public StringBuffer format(Object object, StringBuffer buffer, } @Override - public Object parseObject(String string, ParsePosition position) { + public Object parseObject(String string, @NonNull ParsePosition position) { return null; } }); diff --git a/demoapp/src/main/java/com/androidplot/demos/DualScaleActivity.java b/demoapp/src/main/java/com/androidplot/demos/DualScaleActivity.java index 492fe332..d164710a 100644 --- a/demoapp/src/main/java/com/androidplot/demos/DualScaleActivity.java +++ b/demoapp/src/main/java/com/androidplot/demos/DualScaleActivity.java @@ -20,6 +20,7 @@ import android.graphics.Color; import android.graphics.DashPathEffect; import android.os.Bundle; +import android.support.annotation.NonNull; import com.androidplot.util.PixelUtils; import com.androidplot.xy.BoundaryMode; @@ -30,7 +31,6 @@ import com.androidplot.xy.StepMode; import com.androidplot.xy.XYGraphWidget; import com.androidplot.xy.XYPlot; -import com.androidplot.xy.XYSeries; import java.text.DecimalFormat; import java.text.FieldPosition; @@ -105,15 +105,15 @@ public void onCreate(Bundle savedInstanceState) final DecimalFormat df = new DecimalFormat("$#,###"); @Override - public StringBuffer format(Object o, StringBuffer stringBuffer, - FieldPosition fieldPosition) { + public StringBuffer format(Object o, @NonNull StringBuffer stringBuffer, + @NonNull FieldPosition fieldPosition) { final Number cost = costsSeries.denormalizeYVal((Number) o); stringBuffer.append(df.format(cost.doubleValue())); return stringBuffer; } @Override - public Object parseObject(String s, ParsePosition parsePosition) { + public Object parseObject(String s, @NonNull ParsePosition parsePosition) { return null; } }); @@ -124,15 +124,15 @@ public Object parseObject(String s, ParsePosition parsePosition) { final DecimalFormat df = new DecimalFormat("$#.##"); @Override - public StringBuffer format(Object o, StringBuffer stringBuffer, - FieldPosition fieldPosition) { + public StringBuffer format(Object o, @NonNull StringBuffer stringBuffer, + @NonNull FieldPosition fieldPosition) { Number minWage = minWageSeries.denormalizeYVal((Number) o); stringBuffer.append(df.format(minWage.doubleValue())); return stringBuffer; } @Override - public Object parseObject(String s, ParsePosition parsePosition) { + public Object parseObject(String s, @NonNull ParsePosition parsePosition) { return null; } }); @@ -141,8 +141,8 @@ public Object parseObject(String s, ParsePosition parsePosition) { plot.getGraph().getLineLabelStyle(XYGraphWidget.Edge.BOTTOM).setFormat(new Format() { @Override - public StringBuffer format(Object o, StringBuffer stringBuffer, - FieldPosition fieldPosition) { + public StringBuffer format(Object o, @NonNull StringBuffer stringBuffer, + @NonNull FieldPosition fieldPosition) { Number year = ((Number) o).intValue() + 2012; stringBuffer.append(year); @@ -150,7 +150,7 @@ public StringBuffer format(Object o, StringBuffer stringBuffer, } @Override - public Object parseObject(String s, ParsePosition parsePosition) { + public Object parseObject(String s, @NonNull ParsePosition parsePosition) { return null; } }); diff --git a/demoapp/src/main/java/com/androidplot/demos/ListViewActivity.java b/demoapp/src/main/java/com/androidplot/demos/ListViewActivity.java index 47acf1cb..9d640053 100644 --- a/demoapp/src/main/java/com/androidplot/demos/ListViewActivity.java +++ b/demoapp/src/main/java/com/androidplot/demos/ListViewActivity.java @@ -20,15 +20,21 @@ import android.content.Context; import android.graphics.Color; import android.os.Bundle; +import android.support.annotation.NonNull; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.ListView; + import com.androidplot.Plot; import com.androidplot.ui.SeriesBundle; import com.androidplot.util.PixelUtils; -import com.androidplot.xy.*; +import com.androidplot.xy.CatmullRomInterpolator; +import com.androidplot.xy.LineAndPointFormatter; +import com.androidplot.xy.SimpleXYSeries; +import com.androidplot.xy.XYPlot; +import com.androidplot.xy.XYSeries; import java.util.ArrayList; import java.util.List; @@ -100,8 +106,9 @@ public int getCount() { return NUM_PLOTS; } + @NonNull @Override - public View getView(int pos, View convertView, ViewGroup parent) { + public View getView(int pos, View convertView, @NonNull ViewGroup parent) { LayoutInflater inf = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); View v = convertView; diff --git a/demoapp/src/main/java/com/androidplot/demos/SimpleXYPlotActivity.java b/demoapp/src/main/java/com/androidplot/demos/SimpleXYPlotActivity.java index 8cff7fed..69326b2e 100644 --- a/demoapp/src/main/java/com/androidplot/demos/SimpleXYPlotActivity.java +++ b/demoapp/src/main/java/com/androidplot/demos/SimpleXYPlotActivity.java @@ -15,19 +15,24 @@ */ package com.androidplot.demos; + import android.app.Activity; -import android.graphics.*; +import android.graphics.DashPathEffect; import android.os.Bundle; +import android.support.annotation.NonNull; import com.androidplot.util.PixelUtils; +import com.androidplot.xy.CatmullRomInterpolator; +import com.androidplot.xy.LineAndPointFormatter; import com.androidplot.xy.SimpleXYSeries; +import com.androidplot.xy.XYGraphWidget; +import com.androidplot.xy.XYPlot; import com.androidplot.xy.XYSeries; -import com.androidplot.xy.*; import java.text.FieldPosition; import java.text.Format; import java.text.ParsePosition; -import java.util.*; +import java.util.Arrays; /** * A simple XYPlot @@ -86,12 +91,14 @@ public void onCreate(Bundle savedInstanceState) plot.getGraph().getLineLabelStyle(XYGraphWidget.Edge.BOTTOM).setFormat(new Format() { @Override - public StringBuffer format(Object obj, StringBuffer toAppendTo, FieldPosition pos) { + public StringBuffer format(Object obj, + @NonNull StringBuffer toAppendTo, + @NonNull FieldPosition pos) { int i = Math.round(((Number) obj).floatValue()); return toAppendTo.append(domainLabels[i]); } @Override - public Object parseObject(String source, ParsePosition pos) { + public Object parseObject(String source, @NonNull ParsePosition pos) { return null; } }); diff --git a/demoapp/src/main/java/com/androidplot/demos/StepChartExampleActivity.java b/demoapp/src/main/java/com/androidplot/demos/StepChartExampleActivity.java index 5caf8651..79b8272f 100644 --- a/demoapp/src/main/java/com/androidplot/demos/StepChartExampleActivity.java +++ b/demoapp/src/main/java/com/androidplot/demos/StepChartExampleActivity.java @@ -18,12 +18,20 @@ import android.app.Activity; -import android.graphics.*; +import android.graphics.Color; +import android.graphics.LinearGradient; +import android.graphics.Paint; +import android.graphics.Shader; import android.os.Bundle; +import android.support.annotation.NonNull; + import com.androidplot.util.PixelUtils; import com.androidplot.xy.SimpleXYSeries; +import com.androidplot.xy.StepFormatter; +import com.androidplot.xy.StepMode; +import com.androidplot.xy.XYGraphWidget; +import com.androidplot.xy.XYPlot; import com.androidplot.xy.XYSeries; -import com.androidplot.xy.*; import java.text.DecimalFormat; import java.text.FieldPosition; @@ -82,8 +90,8 @@ public void onCreate(Bundle savedInstanceState) // create a custom getFormatter to draw our state names as range tick labels: mySimpleXYPlot.getGraph().getLineLabelStyle(XYGraphWidget.Edge.LEFT).setFormat(new Format() { @Override - public StringBuffer format(Object obj, StringBuffer toAppendTo, - FieldPosition pos) { + public StringBuffer format(Object obj, @NonNull StringBuffer toAppendTo, + @NonNull FieldPosition pos) { Number num = (Number) obj; switch (num.intValue()) { case 1: @@ -106,7 +114,7 @@ public StringBuffer format(Object obj, StringBuffer toAppendTo, } @Override - public Object parseObject(String source, ParsePosition pos) { + public Object parseObject(String source, @NonNull ParsePosition pos) { return null; } }); diff --git a/demoapp/src/main/java/com/androidplot/demos/TimeSeriesActivity.java b/demoapp/src/main/java/com/androidplot/demos/TimeSeriesActivity.java index 684d9388..c5811bfc 100644 --- a/demoapp/src/main/java/com/androidplot/demos/TimeSeriesActivity.java +++ b/demoapp/src/main/java/com/androidplot/demos/TimeSeriesActivity.java @@ -17,15 +17,25 @@ package com.androidplot.demos; import android.app.Activity; -import android.graphics.*; +import android.graphics.Color; +import android.graphics.DashPathEffect; +import android.graphics.Paint; import android.os.Bundle; +import android.support.annotation.NonNull; import com.androidplot.util.PixelUtils; +import com.androidplot.xy.BoundaryMode; +import com.androidplot.xy.LineAndPointFormatter; import com.androidplot.xy.SimpleXYSeries; -import com.androidplot.xy.XYSeries; -import com.androidplot.xy.*; - -import java.text.*; +import com.androidplot.xy.StepMode; +import com.androidplot.xy.XYGraphWidget; +import com.androidplot.xy.XYPlot; + +import java.text.DecimalFormat; +import java.text.FieldPosition; +import java.text.Format; +import java.text.ParsePosition; +import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Calendar; import java.util.Date; @@ -95,7 +105,9 @@ public void onCreate(Bundle savedInstanceState) { private final SimpleDateFormat dateFormat = new SimpleDateFormat("MMM yyyy"); @Override - public StringBuffer format(Object obj, StringBuffer toAppendTo, FieldPosition pos) { + public StringBuffer format(Object obj, + @NonNull StringBuffer toAppendTo, + @NonNull FieldPosition pos) { // this rounding is necessary to avoid precision loss when converting from // double back to int: @@ -104,7 +116,7 @@ public StringBuffer format(Object obj, StringBuffer toAppendTo, FieldPosition po } @Override - public Object parseObject(String source, ParsePosition pos) { + public Object parseObject(String source, @NonNull ParsePosition pos) { return null; } From 1e4ea232d284fe112d53f94585ff4c5a2a276de7 Mon Sep 17 00:00:00 2001 From: Jonathan Jackson Date: Fri, 26 May 2017 11:40:51 -0500 Subject: [PATCH 27/55] Inferred nullity annotations for `FastNumber` and `FixedSizeEditableXYSeries` --- .../java/com/androidplot/util/FastNumber.java | 4 +++- .../androidplot/xy/FixedSizeEditableXYSeries.java | 15 ++++++++++----- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/androidplot-core/src/main/java/com/androidplot/util/FastNumber.java b/androidplot-core/src/main/java/com/androidplot/util/FastNumber.java index 9841fb0c..4b113b5d 100644 --- a/androidplot-core/src/main/java/com/androidplot/util/FastNumber.java +++ b/androidplot-core/src/main/java/com/androidplot/util/FastNumber.java @@ -1,6 +1,7 @@ package com.androidplot.util; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; /** * An extension of {@link Number} optimized for speed at the cost of memory. @@ -78,7 +79,7 @@ public double doubleValue() { * instance {@code new Integer(0).equals(new Double(0))} returns {@code false} */ @Override - public boolean equals(Object o) { + public boolean equals(@Nullable Object o) { if (this == o) { return true; } @@ -97,6 +98,7 @@ public int hashCode() { return number.hashCode(); } + @NonNull @Override public String toString() { return String.valueOf(doubleValue()); diff --git a/androidplot-core/src/main/java/com/androidplot/xy/FixedSizeEditableXYSeries.java b/androidplot-core/src/main/java/com/androidplot/xy/FixedSizeEditableXYSeries.java index 240f58dc..03e328c9 100644 --- a/androidplot-core/src/main/java/com/androidplot/xy/FixedSizeEditableXYSeries.java +++ b/androidplot-core/src/main/java/com/androidplot/xy/FixedSizeEditableXYSeries.java @@ -1,8 +1,11 @@ package com.androidplot.xy; -import com.androidplot.util.*; +import android.support.annotation.NonNull; -import java.util.*; +import com.androidplot.util.FastNumber; + +import java.util.ArrayList; +import java.util.List; /** * An efficient implementation of {@link EditableXYSeries} intended for use cases where @@ -14,7 +17,9 @@ */ public class FixedSizeEditableXYSeries implements EditableXYSeries { + @NonNull private List xVals = new ArrayList<>(); + @NonNull private List yVals = new ArrayList<>(); private String title; @@ -24,12 +29,12 @@ public FixedSizeEditableXYSeries(String title, int size) { } @Override - public void setX(Number x, int index) { + public void setX(@NonNull Number x, int index) { xVals.set(index, new FastNumber(x)); } @Override - public void setY(Number y, int index) { + public void setY(@NonNull Number y, int index) { yVals.set(index, new FastNumber(y)); } @@ -44,7 +49,7 @@ public void resize(int size) { resize(yVals, size); } - protected void resize(List list, int size) { + protected void resize(@NonNull List list, int size) { if (size > list.size()) { while (list.size() < size) { list.add(null); From 764940c5b23581943c96a4e2e0325b8f575911f0 Mon Sep 17 00:00:00 2001 From: Jonathan Jackson Date: Fri, 26 May 2017 13:44:57 -0500 Subject: [PATCH 28/55] fix typo --- .../com/androidplot/util/FastNumberTest.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/androidplot-core/src/test/java/com/androidplot/util/FastNumberTest.java b/androidplot-core/src/test/java/com/androidplot/util/FastNumberTest.java index c7900804..b56d07b4 100644 --- a/androidplot-core/src/test/java/com/androidplot/util/FastNumberTest.java +++ b/androidplot-core/src/test/java/com/androidplot/util/FastNumberTest.java @@ -6,6 +6,8 @@ import org.junit.Before; import org.junit.Test; +import java.util.concurrent.locks.ReentrantReadWriteLock; + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; @@ -70,6 +72,18 @@ public void testEqualsLong() { assertFalse(fixture.equals("Not a Long")); } + @Test + public void testLock() { + ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock(true); + reentrantReadWriteLock.writeLock().lock(); + reentrantReadWriteLock.writeLock().lock(); + reentrantReadWriteLock.readLock().lock(); + reentrantReadWriteLock.readLock().unlock(); + reentrantReadWriteLock.writeLock().unlock(); + reentrantReadWriteLock.writeLock().unlock(); + assertTrue(true); + } + @Test public void testEqualsDouble() { FastNumber d1 = new FastNumber(new Double(87654321.12345d)); @@ -156,7 +170,7 @@ public void testHashCodeDouble() { assertTrue("Invalid hash for equal but not identical doubles ", d.hashCode() == dd .hashCode()); } - assertEquals("Magic assumption hasCode (0.0) = 0 failed", 0, new FastNumber(new Double(0.0)).hashCode()); + assertEquals("Magic assumption hashCode (0.0) = 0 failed", 0, new FastNumber(new Double(0.0)).hashCode()); } @Test From 5cfeb0c29c0d0a039aef3fe5e2d6aa853ef00804 Mon Sep 17 00:00:00 2001 From: Jonathan Jackson Date: Fri, 26 May 2017 14:42:44 -0500 Subject: [PATCH 29/55] Simplified unit tests for FastNumberTest.java --- .../com/androidplot/util/FastNumberTest.java | 236 +++++++----------- 1 file changed, 90 insertions(+), 146 deletions(-) diff --git a/androidplot-core/src/test/java/com/androidplot/util/FastNumberTest.java b/androidplot-core/src/test/java/com/androidplot/util/FastNumberTest.java index b56d07b4..a029600a 100644 --- a/androidplot-core/src/test/java/com/androidplot/util/FastNumberTest.java +++ b/androidplot-core/src/test/java/com/androidplot/util/FastNumberTest.java @@ -6,8 +6,6 @@ import org.junit.Before; import org.junit.Test; -import java.util.concurrent.locks.ReentrantReadWriteLock; - import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; @@ -17,6 +15,66 @@ @SuppressLint("UseValueOf") public class FastNumberTest { + private static final Number[] NUMBERS = new Number[]{ + new Integer(0), + new Integer(1), + new Integer(-1), + new Integer(Integer.MAX_VALUE), + new Integer(Integer.MIN_VALUE), + + new Long(0), + new Long(1), + new Long(-1), + new Long(Long.MAX_VALUE), + new Long(Long.MIN_VALUE), + + new Double(0), + new Double(1), + new Double(-1), + new Double(87654321.12345d), + new Double(0.0002f), + new Double(Double.MAX_VALUE), + new Double(Double.MIN_VALUE), + + new Float(0), + new Float(1.0f), + new Float(-1.0f), + new Float(8765.4321f), + new Float(1098.576f), + new Float(Float.MIN_VALUE), + new Float(Float.MAX_VALUE), + }; + + private static final Number[] NUMBERS_CLONE = new Number[]{ + new Integer(0), + new Integer(1), + new Integer(-1), + new Integer(Integer.MAX_VALUE), + new Integer(Integer.MIN_VALUE), + + new Long(0), + new Long(1), + new Long(-1), + new Long(Long.MAX_VALUE), + new Long(Long.MIN_VALUE), + + new Double(0), + new Double(1), + new Double(-1), + new Double(87654321.12345d), + new Double(0.0002f), + new Double(Double.MAX_VALUE), + new Double(Double.MIN_VALUE), + + new Float(0), + new Float(1.0f), + new Float(-1.0f), + new Float(8765.4321f), + new Float(1098.576f), + new Float(Float.MIN_VALUE), + new Float(Float.MAX_VALUE), + }; + @Before public void setUp() throws Exception { } @@ -27,165 +85,51 @@ public void tearDown() throws Exception { } @Test(expected = IllegalArgumentException.class) - public void testNullConstructor() { + public void constructor_throwsException_ifNumberIsNull() { //noinspection ConstantConditions new FastNumber(null); } @Test - public void testEquals() { - assertEquals(new FastNumber(new Double(0)), new FastNumber(new Double(0))); - assertNotEquals(new FastNumber(new Double(0)), new FastNumber(new Long(0))); - } - - - @Test - public void testEqualsInteger() { - assertEquals(new Integer(0), Integer.valueOf(0)); - assertEquals(new Integer(1), Integer.valueOf(1)); - assertEquals(new Integer(-1), Integer.valueOf(-1)); - - Integer fixture = new Integer(25); - assertEquals(fixture, fixture); - assertFalse(fixture.equals(null)); - assertFalse(fixture.equals("Not a Integer")); - } - - @Test - public void testEqualsInteger2() { - // Test for method boolean java.lang.Integer.equals(java.lang.Object) - FastNumber i1 = new FastNumber(new Integer(1000)); - FastNumber i2 = new FastNumber(new Integer(1000)); - FastNumber i3 = new FastNumber(new Integer(-1000)); - assertTrue("Equality test failed", i1.equals(i2) && !(i1.equals(i3))); - } - - @Test - public void testEqualsLong() { - assertEquals(new FastNumber(new Long(0)), new FastNumber(Long.valueOf(0))); - assertEquals(new FastNumber(new Long(1)), new FastNumber(Long.valueOf(1))); - assertEquals(new FastNumber(new Long(-1)), new FastNumber(Long.valueOf(-1))); - - FastNumber fixture = new FastNumber(new Long(25)); - assertEquals(fixture, fixture); - assertFalse(fixture.equals(null)); - assertFalse(fixture.equals("Not a Long")); - } - - @Test - public void testLock() { - ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock(true); - reentrantReadWriteLock.writeLock().lock(); - reentrantReadWriteLock.writeLock().lock(); - reentrantReadWriteLock.readLock().lock(); - reentrantReadWriteLock.readLock().unlock(); - reentrantReadWriteLock.writeLock().unlock(); - reentrantReadWriteLock.writeLock().unlock(); - assertTrue(true); - } - - @Test - public void testEqualsDouble() { - FastNumber d1 = new FastNumber(new Double(87654321.12345d)); - FastNumber d2 = new FastNumber(new Double(87654321.12345d)); - FastNumber d3 = new FastNumber(new Double(0.0002f)); - assertTrue("Assert 0: Equality test failed", d1.equals(d2) && !(d1.equals(d3))); - - assertTrue("Assert 2: NaN should not be == Nan", Double.NaN != Double.NaN); - assertTrue("Assert 3: NaN should not be == Nan", new FastNumber(new Double(Double.NaN)) - .equals(new FastNumber(new Double(Double.NaN)))); - assertTrue("Assert 4: -0d should be == 0d", 0d == -0d); - assertTrue("Assert 5: -0d should not be equals() 0d", !new FastNumber(new Double(0d)) - .equals(new FastNumber(new Double(-0d)))); - - FastNumber dmax = new FastNumber(new Double(Double.MAX_VALUE)); - FastNumber dmax1 = new FastNumber(new Double(Double.MAX_VALUE)); - - assertTrue("Equality test failed", dmax.equals(dmax1) && !(dmax.equals(new Object()))); - } - - @Test - public void testEqualsFloat() { - FastNumber f1 = new FastNumber(new Float(8765.4321f)); - FastNumber f2 = new FastNumber(new Float(8765.4321f)); - FastNumber f3 = new FastNumber(new Float(-1.0f)); - assertTrue("Assert 0: Equality test failed", f1.equals(f2) && !(f1.equals(f3))); - - assertTrue("Assert 1: NaN should not be == Nan", Float.NaN != Float.NaN); - assertTrue("Assert 2: NaN should not be == Nan", new FastNumber(new Float(Float.NaN)).equals(new FastNumber(new Float( - Float.NaN)))); - assertTrue("Assert 3: -0f should be == 0f", 0f == -0f); - assertTrue("Assert 4: -0f should not be equals() 0f", !new FastNumber(new Float(0f)).equals(new FastNumber(new Float( - -0f)))); - - f1 = new FastNumber(new Float(1098.576f)); - f2 = new FastNumber(new Float(1098.576f)); - f3 = new FastNumber(new Float(1.0f)); - assertTrue("Equality test failed", f1.equals(f2) && !(f1.equals(f3))); - - assertTrue("NaN should not be == Nan", Float.NaN != Float.NaN); - assertTrue("NaN should not be == Nan", new FastNumber(new Float(Float.NaN)) - .equals(new FastNumber(new Float(Float.NaN)))); - assertTrue("-0f should be == 0f", 0f == -0f); - assertTrue("-0f should not be equals() 0f", !new FastNumber(new Float(0f)).equals(new FastNumber(new Float(-0f)))); - } - - @Test - public void testHashCodeInteger() { - assertEquals(1, new FastNumber(new Integer(1)).hashCode()); - assertEquals(2, new FastNumber(new Integer(2)).hashCode()); - assertEquals(0, new FastNumber(new Integer(0)).hashCode()); - assertEquals(-1, new FastNumber(new Integer(-1)).hashCode()); - } - - @Test - public void testHashCodeInteger2() { - // Test for method int java.lang.Integer.hashCode() - - FastNumber i1 = new FastNumber(new Integer(1000)); - FastNumber i2 = new FastNumber(new Integer(-1000)); - assertTrue("Returned incorrect hashcode", i1.hashCode() == 1000 - && (i2.hashCode() == -1000)); + public void equals_returnsTrue_ifFromSameNumberInstance() { + for (Number number : NUMBERS) { + assertTrue("Equality test failed on " + number, new FastNumber(number).equals(new FastNumber(number))); + } } - @SuppressWarnings("PointlessBitwiseExpression") @Test - public void testHashCodeLong() { - assertEquals((int) (1L ^ (1L >>> 32)), new FastNumber(new Long(1)).hashCode()); - assertEquals((int) (2L ^ (2L >>> 32)), new FastNumber(new Long(2)).hashCode()); - assertEquals((int) (0L ^ (0L >>> 32)), new FastNumber(new Long(0)).hashCode()); - assertEquals((int) (-1L ^ (-1L >>> 32)), new FastNumber(new Long(-1)).hashCode()); + public void equals_returnsTrue_ifFromSameNumber() { + assertEquals("misconfigured test values", NUMBERS.length, NUMBERS_CLONE.length); + for (int i = 0; i < NUMBERS.length; i++) { + assertEquals("misconfigured test values", NUMBERS[i], NUMBERS_CLONE[i]); + assertTrue(new FastNumber(NUMBERS[i]).equals(new FastNumber(NUMBERS_CLONE[i]))); + } } @Test - public void testHashCodeDouble() { - // Test for method int java.lang.Double.hashCode() - for (int i = -1000; i < 1000; i++) { - FastNumber d = new FastNumber(new Double(i)); - FastNumber dd = new FastNumber(new Double(i)); - assertTrue("Should not be identical ", d != dd); - assertTrue("Should be equals 1 ", d.equals(dd)); - assertTrue("Should be equals 2 ", dd.equals(d)); - assertTrue("Should have identical values ", dd.doubleValue() == d.doubleValue()); - assertTrue("Invalid hash for equal but not identical doubles ", d.hashCode() == dd - .hashCode()); + public void equals_returnsFalse_ifNumberIsDifferent() { + for (int i = 0; i < NUMBERS.length; i++) { + for (int j = 0; j < NUMBERS.length; j++) { + if (j == i) { + continue; + } + assertNotEquals("duplicate test values at index " + i + " and " + j, NUMBERS[i], NUMBERS[j]); + assertFalse(new FastNumber(NUMBERS[i]).equals(new FastNumber(NUMBERS[j]))); + } } - assertEquals("Magic assumption hashCode (0.0) = 0 failed", 0, new FastNumber(new Double(0.0)).hashCode()); } @Test - public void testHashCodeFloat() { - // Test for method int java.lang.Float.hashCode() - FastNumber f = new FastNumber(new Float(1908.8786f)); - assertTrue("Returned invalid hash code for 1908.8786f", f.hashCode() == Float - .floatToIntBits(1908.8786f)); - - f = new FastNumber(new Float(-1.112f)); - assertTrue("Returned invalid hash code for -1.112", f.hashCode() == Float - .floatToIntBits(-1.112f)); - - f = new FastNumber(new Float(0f)); - assertTrue("Returned invalid hash code for 0", f.hashCode() == Float.floatToIntBits(0f)); + public void hashCode_isEqual_ifInstanceIsEqual() { + for (Number number : NUMBERS) { + for (Number number2 : NUMBERS) { + FastNumber fastNumber1 = new FastNumber(number); + FastNumber fastNumber2 = new FastNumber(number2); + if (fastNumber1.equals(fastNumber2)) { + assertEquals(fastNumber1.hashCode(), fastNumber2.hashCode()); + } + } + } } } \ No newline at end of file From be61f70f1c09c2c75cf4759302aec08587b15fff Mon Sep 17 00:00:00 2001 From: Jonathan Jackson Date: Thu, 8 Mar 2018 14:08:24 -0600 Subject: [PATCH 30/55] Set name of render thread to "renderThread" for better debugging --- .../src/main/java/com/androidplot/Plot.java | 31 ++++++++++++++----- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/androidplot-core/src/main/java/com/androidplot/Plot.java b/androidplot-core/src/main/java/com/androidplot/Plot.java index 8b436199..cf05ac90 100644 --- a/androidplot-core/src/main/java/com/androidplot/Plot.java +++ b/androidplot-core/src/main/java/com/androidplot/Plot.java @@ -18,28 +18,43 @@ import android.content.Context; import android.content.res.TypedArray; -import android.graphics.*; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.PorterDuff; +import android.graphics.RectF; import android.os.Build; import android.os.Looper; import android.support.annotation.Nullable; import android.util.AttributeSet; import android.util.Log; import android.view.View; + import com.androidplot.exception.PlotRenderException; -import com.androidplot.ui.*; +import com.androidplot.ui.Anchor; +import com.androidplot.ui.BoxModel; import com.androidplot.ui.Formatter; +import com.androidplot.ui.HorizontalPositioning; +import com.androidplot.ui.LayoutManager; +import com.androidplot.ui.Resizable; +import com.androidplot.ui.SeriesBundle; +import com.androidplot.ui.SeriesRenderer; +import com.androidplot.ui.Size; +import com.androidplot.ui.SizeMode; import com.androidplot.ui.TextOrientation; +import com.androidplot.ui.VerticalPositioning; import com.androidplot.ui.widget.TextLabelWidget; -import com.androidplot.ui.SeriesRenderer; import com.androidplot.util.AttrUtils; import com.androidplot.util.DisplayDimensions; import com.androidplot.util.PixelUtils; -import com.androidplot.ui.HorizontalPositioning; -import com.androidplot.ui.VerticalPositioning; -import com.halfhp.fig.*; +import com.halfhp.fig.Fig; +import com.halfhp.fig.FigException; import java.lang.reflect.Field; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; /** * Base class for all Plot implementations. @@ -406,7 +421,7 @@ public void run() { } pingPong.recycle(); } - }); + }, "renderThread"); } } From bc6dcbd492e1c0b9ced1ea47c135276bf911cefc Mon Sep 17 00:00:00 2001 From: Jonathan Jackson Date: Thu, 8 Mar 2018 15:42:03 -0600 Subject: [PATCH 31/55] Android Studio reformat refactor only, no functional changes --- .../com/androidplot/xy/XYGraphWidget.java | 223 +++++++++++------- 1 file changed, 141 insertions(+), 82 deletions(-) diff --git a/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java b/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java index 2ecd4fcb..890f5c8f 100644 --- a/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java +++ b/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java @@ -47,8 +47,8 @@ import java.util.Map; /** - * Displays graphical data (lines, points, etc.) annotated with domain and range tick markers. - * The inner area of the graph upon which grid lines and points are rendered is called the "grid" area. + * Displays graphical data (lines, points, etc.) annotated with domain and range tick markers. The + * inner area of the graph upon which grid lines and points are rendered is called the "grid" area. */ public class XYGraphWidget extends Widget { @@ -148,7 +148,12 @@ public class XYGraphWidget extends Widget { public static class LineLabelRenderer { - public void drawLabel(Canvas canvas, LineLabelStyle style, Number val, float x, float y, boolean isOrigin) { + public void drawLabel(Canvas canvas, + LineLabelStyle style, + Number val, + float x, + float y, + boolean isOrigin) { final int canvasState = canvas.save(); try { final String txt = style.format.format(val); @@ -159,7 +164,12 @@ public void drawLabel(Canvas canvas, LineLabelStyle style, Number val, float x, } } - protected void drawLabel(Canvas canvas, String text, Paint paint, float x, float y, boolean isOrigin) { + protected void drawLabel(Canvas canvas, + String text, + Paint paint, + float x, + float y, + boolean isOrigin) { canvas.drawText(text, x, y, paint); } } @@ -175,6 +185,7 @@ public static class LineLabelStyle { paint.setTextAlign(Paint.Align.CENTER); paint.setTextSize(DEFAULT_LINE_LABEL_TEXT_SIZE_PX); } + public Format getFormat() { return format; } @@ -203,17 +214,16 @@ public void setPaint(Paint paint) { public interface CursorLabelFormatter { /** - * * @return The Paint to be used to draw the cursor text label. */ Paint getTextPaint(); /** - * - * @return Null if no background should be drawn, - * the Paint used to draw the background otherwise. + * @return Null if no background should be drawn, the Paint used to draw the background + * otherwise. */ Paint getBackgroundPaint(); + String getLabelText(Number x, Number y); } @@ -272,18 +282,21 @@ public XYGraphWidget(LayoutManager layoutManager, XYPlot plot, Size size) { /** * Apply xml attrs + * * @param attrs */ public void processAttrs(TypedArray attrs) { setDrawGridOnTop(attrs.getBoolean(R.styleable.xy_XYPlot_drawGridOnTop, isDrawGridOnTop())); int tlp = attrs.getInt(R.styleable.xy_XYPlot_lineLabels, 0); - if(tlp != 0) { + if (tlp != 0) { setLineLabelEdges(tlp); } - setGridClippingEnabled(attrs.getBoolean(R.styleable.xy_XYPlot_gridClippingEnabled, - isGridClippingEnabled())); + setGridClippingEnabled(attrs.getBoolean( + R.styleable.xy_XYPlot_gridClippingEnabled, + isGridClippingEnabled() + )); final LineLabelStyle lineLabelStyleTop = getLineLabelStyle(Edge.TOP); final LineLabelStyle lineLabelStyleBottom = getLineLabelStyle(Edge.BOTTOM); @@ -292,19 +305,23 @@ public void processAttrs(TypedArray attrs) { lineLabelStyleTop.setRotation(attrs.getFloat( R.styleable.xy_XYPlot_lineLabelRotationTop, - lineLabelStyleTop.getRotation())); + lineLabelStyleTop.getRotation() + )); lineLabelStyleBottom.setRotation(attrs.getFloat( R.styleable.xy_XYPlot_lineLabelRotationBottom, - lineLabelStyleBottom.getRotation())); + lineLabelStyleBottom.getRotation() + )); lineLabelStyleLeft.setRotation(attrs.getFloat( R.styleable.xy_XYPlot_lineLabelRotationLeft, - lineLabelStyleLeft.getRotation())); + lineLabelStyleLeft.getRotation() + )); lineLabelStyleRight.setRotation(attrs.getFloat( R.styleable.xy_XYPlot_lineLabelRotationRight, - lineLabelStyleRight.getRotation())); + lineLabelStyleRight.getRotation() + )); setLineExtensionTop(attrs.getDimension( R.styleable.xy_XYPlot_lineExtensionTop, getLineExtensionTop())); @@ -318,34 +335,40 @@ public void processAttrs(TypedArray attrs) { AttrUtils.configureTextPaint(attrs, lineLabelStyleTop.getPaint(), R.styleable.xy_XYPlot_lineLabelTextColorTop, R.styleable.xy_XYPlot_lineLabelTextSizeTop, - R.styleable.xy_XYPlot_lineLabelAlignTop); + R.styleable.xy_XYPlot_lineLabelAlignTop + ); AttrUtils.configureTextPaint(attrs, lineLabelStyleBottom.getPaint(), R.styleable.xy_XYPlot_lineLabelTextColorBottom, R.styleable.xy_XYPlot_lineLabelTextSizeBottom, - R.styleable.xy_XYPlot_lineLabelAlignBottom); + R.styleable.xy_XYPlot_lineLabelAlignBottom + ); AttrUtils.configureTextPaint(attrs, lineLabelStyleLeft.getPaint(), R.styleable.xy_XYPlot_lineLabelTextColorLeft, R.styleable.xy_XYPlot_lineLabelTextSizeLeft, - R.styleable.xy_XYPlot_lineLabelAlignLeft); + R.styleable.xy_XYPlot_lineLabelAlignLeft + ); AttrUtils.configureTextPaint(attrs, lineLabelStyleRight.getPaint(), R.styleable.xy_XYPlot_lineLabelTextColorRight, R.styleable.xy_XYPlot_lineLabelTextSizeRight, - R.styleable.xy_XYPlot_lineLabelAlignRight); + R.styleable.xy_XYPlot_lineLabelAlignRight + ); AttrUtils.configureInsets(attrs, getGridInsets(), R.styleable.xy_XYPlot_gridInsetTop, R.styleable.xy_XYPlot_gridInsetBottom, R.styleable.xy_XYPlot_gridInsetLeft, - R.styleable.xy_XYPlot_gridInsetRight); + R.styleable.xy_XYPlot_gridInsetRight + ); AttrUtils.configureInsets(attrs, getLineLabelInsets(), R.styleable.xy_XYPlot_lineLabelInsetTop, R.styleable.xy_XYPlot_lineLabelInsetBottom, R.styleable.xy_XYPlot_lineLabelInsetLeft, - R.styleable.xy_XYPlot_lineLabelInsetRight); + R.styleable.xy_XYPlot_lineLabelInsetRight + ); // graph size & position AttrUtils.configureWidget(attrs, this, @@ -353,7 +376,8 @@ public void processAttrs(TypedArray attrs) { R.styleable.xy_XYPlot_graphWidthMode, R.styleable.xy_XYPlot_graphWidth, R.styleable.xy_XYPlot_graphHorizontalPositioning, R.styleable.xy_XYPlot_graphHorizontalPosition, R.styleable.xy_XYPlot_graphVerticalPositioning, R.styleable.xy_XYPlot_graphVerticalPosition, - R.styleable.xy_XYPlot_graphAnchor, R.styleable.xy_XYPlot_graphVisible); + R.styleable.xy_XYPlot_graphAnchor, R.styleable.xy_XYPlot_graphVisible + ); // domainLabel size & position AttrUtils.configureWidget(attrs, this, @@ -361,7 +385,8 @@ public void processAttrs(TypedArray attrs) { R.styleable.xy_XYPlot_domainTitleWidthMode, R.styleable.xy_XYPlot_domainTitleWidth, R.styleable.xy_XYPlot_domainTitleHorizontalPositioning, R.styleable.xy_XYPlot_domainTitleHorizontalPosition, R.styleable.xy_XYPlot_domainTitleVerticalPositioning, R.styleable.xy_XYPlot_domainTitleVerticalPosition, - R.styleable.xy_XYPlot_domainTitleAnchor, R.styleable.xy_XYPlot_domainTitleVisible); + R.styleable.xy_XYPlot_domainTitleAnchor, R.styleable.xy_XYPlot_domainTitleVisible + ); // rangeLabel size & position AttrUtils.configureWidget(attrs, this, @@ -369,7 +394,8 @@ public void processAttrs(TypedArray attrs) { R.styleable.xy_XYPlot_rangeTitleWidthMode, R.styleable.xy_XYPlot_rangeTitleWidth, R.styleable.xy_XYPlot_rangeTitleHorizontalPositioning, R.styleable.xy_XYPlot_rangeTitleHorizontalPosition, R.styleable.xy_XYPlot_rangeTitleVerticalPositioning, R.styleable.xy_XYPlot_rangeTitleVerticalPosition, - R.styleable.xy_XYPlot_rangeTitleAnchor, R.styleable.xy_XYPlot_rangeTitleVisible); + R.styleable.xy_XYPlot_rangeTitleAnchor, R.styleable.xy_XYPlot_rangeTitleVisible + ); // rotation AttrUtils.configureWidgetRotation(attrs, this, R.styleable.xy_XYPlot_graphRotation); @@ -379,31 +405,38 @@ public void processAttrs(TypedArray attrs) { R.styleable.xy_XYPlot_graphMarginTop, R.styleable.xy_XYPlot_graphMarginBottom, R.styleable.xy_XYPlot_graphMarginLeft, R.styleable.xy_XYPlot_graphMarginRight, R.styleable.xy_XYPlot_graphPaddingTop, R.styleable.xy_XYPlot_graphPaddingBottom, - R.styleable.xy_XYPlot_graphPaddingLeft, R.styleable.xy_XYPlot_graphPaddingRight); + R.styleable.xy_XYPlot_graphPaddingLeft, R.styleable.xy_XYPlot_graphPaddingRight + ); // domainOriginLinePaint AttrUtils.configureLinePaint(attrs, getDomainOriginLinePaint(), R.styleable.xy_XYPlot_domainOriginLineColor, - R.styleable.xy_XYPlot_domainOriginLineThickness); + R.styleable.xy_XYPlot_domainOriginLineThickness + ); // rangeOriginLinePaint AttrUtils.configureLinePaint(attrs, getRangeOriginLinePaint(), R.styleable.xy_XYPlot_rangeOriginLineColor, - R.styleable.xy_XYPlot_rangeOriginLineThickness); + R.styleable.xy_XYPlot_rangeOriginLineThickness + ); AttrUtils.configureLinePaint(attrs, getDomainGridLinePaint(), R.styleable.xy_XYPlot_domainLineColor, - R.styleable.xy_XYPlot_domainLineThickness); + R.styleable.xy_XYPlot_domainLineThickness + ); AttrUtils.configureLinePaint(attrs, getRangeGridLinePaint(), R.styleable.xy_XYPlot_rangeLineColor, - R.styleable.xy_XYPlot_rangeLineThickness); + R.styleable.xy_XYPlot_rangeLineThickness + ); AttrUtils.setColor(attrs, getBackgroundPaint(), - R.styleable.xy_XYPlot_graphBackgroundColor); + R.styleable.xy_XYPlot_graphBackgroundColor + ); AttrUtils.setColor(attrs, getGridBackgroundPaint(), - R.styleable.xy_XYPlot_gridBackgroundColor); + R.styleable.xy_XYPlot_gridBackgroundColor + ); } /** @@ -415,7 +448,7 @@ public void processAttrs(TypedArray attrs) { * @return */ protected XYCoords screenToSeries(PointF point) { - if(!plot.getBounds().isFullyDefined()) { + if (!plot.getBounds().isFullyDefined()) { return null; } return new RectRegion(gridRect) @@ -466,6 +499,7 @@ protected Number screenToSeriesX(float xPix) { * Converts a y pixel to a y value. * This is a relatively slow operation and should not be used for operations that are a part of * the main render loop of a dynamic plot. + * * @param yPix * @return */ @@ -478,7 +512,7 @@ protected Number screenToSeriesY(float yPix) { } protected PointF seriesToScreen(XYCoords xy) { - if(!plot.getBounds().isFullyDefined()) { + if (!plot.getBounds().isFullyDefined()) { return null; } return plot.getBounds().transform(xy, gridRect, false, true); @@ -511,7 +545,7 @@ protected void doOnDraw(Canvas canvas, RectF widgetRect) && bounds.getMaxX() != null && bounds.getMinY() != null && bounds.getMaxY() != null) { - if(drawGridOnTop) { + if (drawGridOnTop) { drawData(canvas); drawGrid(canvas); } else { @@ -527,12 +561,13 @@ protected void doOnDraw(Canvas canvas, RectF widgetRect) } protected void drawDomainLine(Canvas canvas, float xPix, Number xVal, - Paint linePaint, boolean isOrigin) { + Paint linePaint, boolean isOrigin) { // lines if (linePaint != null) { - canvas.drawLine(xPix, gridRect.top - lineExtensionTop, - xPix, gridRect.bottom + lineExtensionBottom, linePaint); + canvas.drawLine(xPix, gridRect.top - lineExtensionTop, + xPix, gridRect.bottom + lineExtensionBottom, linePaint + ); } // labels @@ -541,11 +576,12 @@ protected void drawDomainLine(Canvas canvas, float xPix, Number xVal, } protected void drawRangeLine(Canvas canvas, float yPix, Number yVal, - Paint linePaint, boolean isOrigin) { + Paint linePaint, boolean isOrigin) { // lines if (linePaint != null) { canvas.drawLine(gridRect.left - lineExtensionLeft, yPix, - gridRect.right + lineExtensionRight, yPix, linePaint); + gridRect.right + lineExtensionRight, yPix, linePaint + ); } // labels @@ -553,8 +589,13 @@ protected void drawRangeLine(Canvas canvas, float yPix, Number yVal, drawLineLabel(canvas, Edge.RIGHT, yVal, labelRect.right, yPix, isOrigin); } - protected void drawLineLabel(Canvas canvas, Edge edge, Number val, float x, float y, boolean isOrigin) { - if(isLineLabelEnabled(edge)) { + protected void drawLineLabel(Canvas canvas, + Edge edge, + Number val, + float x, + float y, + boolean isOrigin) { + if (isLineLabelEnabled(edge)) { getLineLabelRenderer(edge).drawLabel(canvas, getLineLabelStyle(edge), val, x, y, isOrigin); } } @@ -565,7 +606,7 @@ protected void drawLineLabel(Canvas canvas, Edge edge, Number val, float x, floa * @param canvas */ protected void drawGrid(Canvas canvas) { - if(!drawGridOnTop) { + if (!drawGridOnTop) { drawGridBackground(canvas); } @@ -578,7 +619,7 @@ protected void drawGrid(Canvas canvas) { } else { // if no domain origin is set, use the leftmost value visible on the grid: domainOriginPix = gridRect.left; - domainOrigin=plot.getBounds().getMinX(); + domainOrigin = plot.getBounds().getMinX(); } Step domainStep = XYStepCalculator.getStep(plot, Axis.DOMAIN, gridRect); @@ -587,7 +628,8 @@ protected void drawGrid(Canvas canvas) { if (domainOriginPix >= gridRect.left && domainOriginPix <= gridRect.right) { drawDomainLine(canvas, (float) domainOriginPix, - domainOrigin, domainOriginLinePaint, true); + domainOrigin, domainOriginLinePaint, true + ); } // draw lines LEFT of origin: @@ -598,9 +640,9 @@ protected void drawGrid(Canvas canvas) { * domainStep.getStepVal(); if (xPix <= gridRect.right) { - final boolean isDomainTick = i% getLinesPerDomainLabel() == ZERO; + final boolean isDomainTick = i % getLinesPerDomainLabel() == ZERO; final Paint lp = isDomainTick ? domainGridLinePaint : domainSubGridLinePaint; - drawDomainLine(canvas, (float) xPix, xVal, lp, false); + drawDomainLine(canvas, (float) xPix, xVal, lp, false); } i++; } @@ -613,9 +655,9 @@ protected void drawGrid(Canvas canvas) { * domainStep.getStepVal(); if (xPix >= gridRect.left) { - final boolean isDomainTick = i% getLinesPerDomainLabel() == ZERO; - final Paint lp = isDomainTick ? domainGridLinePaint : domainSubGridLinePaint; - drawDomainLine(canvas, (float) xPix, xVal, lp, false); + final boolean isDomainTick = i % getLinesPerDomainLabel() == ZERO; + final Paint lp = isDomainTick ? domainGridLinePaint : domainSubGridLinePaint; + drawDomainLine(canvas, (float) xPix, xVal, lp, false); } i++; } @@ -636,7 +678,8 @@ protected void drawGrid(Canvas canvas) { // draw range origin: if (rangeOriginPix >= gridRect.top && rangeOriginPix <= gridRect.bottom) { drawRangeLine(canvas, (float) rangeOriginPix, - rangeOrigin, rangeOriginLinePaint, true); + rangeOrigin, rangeOriginLinePaint, true + ); } final double rangeStepPix = rangeStep.getStepPix(); @@ -648,9 +691,9 @@ protected void drawGrid(Canvas canvas) { * rangeStep.getStepVal(); if (yPix <= gridRect.bottom) { - final boolean isRangeTick = i% getLinesPerRangeLabel() == ZERO; + final boolean isRangeTick = i % getLinesPerRangeLabel() == ZERO; final Paint lp = isRangeTick ? rangeGridLinePaint : rangeSubGridLinePaint; - drawRangeLine(canvas, (float)yPix, yVal, lp, false); + drawRangeLine(canvas, (float) yPix, yVal, lp, false); } i++; } @@ -661,9 +704,9 @@ protected void drawGrid(Canvas canvas) { double yVal = rangeOrigin.doubleValue() - i * rangeStep.getStepVal(); if (yPix >= gridRect.top) { - final boolean isRangeTick = i% getLinesPerRangeLabel() == ZERO; + final boolean isRangeTick = i % getLinesPerRangeLabel() == ZERO; final Paint lp = isRangeTick ? rangeGridLinePaint : rangeSubGridLinePaint; - drawRangeLine(canvas, (float)yPix, yVal, lp, false); + drawRangeLine(canvas, (float) yPix, yVal, lp, false); } i++; } @@ -679,11 +722,13 @@ protected void drawGrid(Canvas canvas) { * @param y */ private void drawMarkerText(Canvas canvas, String text, ValueMarker marker, - float x, float y) { + float x, float y) { x += MARKER_LABEL_SPACING; y -= MARKER_LABEL_SPACING; - RectF textRect = new RectF(FontUtils.getStringDimensions(text, - marker.getTextPaint())); + RectF textRect = new RectF(FontUtils.getStringDimensions( + text, + marker.getTextPaint() + )); textRect.offsetTo(x, y - textRect.height()); if (textRect.right > gridRect.right) { @@ -695,18 +740,20 @@ private void drawMarkerText(Canvas canvas, String text, ValueMarker marker, } canvas.drawText(text, textRect.left, textRect.bottom, - marker.getTextPaint()); + marker.getTextPaint() + ); } protected void drawMarkers(Canvas canvas) { - if(plot.getYValueMarkers() != null && plot.getYValueMarkers().size() > 0) { + if (plot.getYValueMarkers() != null && plot.getYValueMarkers().size() > 0) { for (YValueMarker marker : plot.getYValueMarkers()) { if (marker.getValue() != null) { float yPix = (float) plot.getBounds().yRegion .transform(marker.getValue() .doubleValue(), gridRect.top, gridRect.bottom, true); canvas.drawLine(gridRect.left, yPix, - gridRect.right, yPix, marker.getLinePaint()); + gridRect.right, yPix, marker.getLinePaint() + ); float xPix = marker.getTextPosition().getPixelValue( gridRect.width()); @@ -719,14 +766,15 @@ protected void drawMarkers(Canvas canvas) { } } - if(plot.getXValueMarkers() != null && plot.getXValueMarkers().size() > 0) { + if (plot.getXValueMarkers() != null && plot.getXValueMarkers().size() > 0) { for (XValueMarker marker : plot.getXValueMarkers()) { if (marker.getValue() != null) { float xPix = (float) plot.getBounds().xRegion .transform(marker.getValue() .doubleValue(), gridRect.left, gridRect.right, false); canvas.drawLine(xPix, gridRect.top, xPix, gridRect.bottom, - marker.getLinePaint()); + marker.getLinePaint() + ); float yPix = marker.getTextPosition().getPixelValue(gridRect.height()); yPix += gridRect.top; if (marker.getText() != null) { @@ -747,7 +795,8 @@ protected void drawCursors(Canvas canvas) { hasDomainCursor = true; canvas.drawLine(domainCursorPosition, gridRect.top, domainCursorPosition, gridRect.bottom, - domainCursorPaint); + domainCursorPaint + ); } boolean hasRangeCursor = false; @@ -758,10 +807,11 @@ protected void drawCursors(Canvas canvas) { && rangeCursorPosition <= gridRect.bottom) { hasRangeCursor = true; canvas.drawLine(gridRect.left, rangeCursorPosition, - gridRect.right, rangeCursorPosition, rangeCursorPaint); + gridRect.right, rangeCursorPosition, rangeCursorPaint + ); } - if(getCursorLabelFormatter() != null && hasRangeCursor && hasDomainCursor) { + if (getCursorLabelFormatter() != null && hasRangeCursor && hasDomainCursor) { drawCursorLabel(canvas); } } @@ -779,8 +829,10 @@ protected void drawCursorLabel(Canvas canvas) { // if we are too close to the right edge of the plot, we will move // the label to the left side of our cursor: if (cursorRect.right >= gridRect.right) { - cursorRect.offsetTo(domainCursorPosition - cursorRect.width(), - cursorRect.top); + cursorRect.offsetTo( + domainCursorPosition - cursorRect.width(), + cursorRect.top + ); } // same thing for the top edge of the plot: @@ -794,11 +846,12 @@ protected void drawCursorLabel(Canvas canvas) { } canvas.drawText(label, cursorRect.left, cursorRect.bottom, - getCursorLabelFormatter().getTextPaint()); + getCursorLabelFormatter().getTextPaint() + ); } protected void drawGridBackground(Canvas canvas) { - if(gridBackgroundPaint != null) { + if (gridBackgroundPaint != null) { canvas.drawRect(gridRect, gridBackgroundPaint); } } @@ -814,15 +867,15 @@ protected void drawData(Canvas canvas) throws PlotRenderException { drawGridBackground(canvas); } try { - if(isGridClippingEnabled) { + if (isGridClippingEnabled) { canvas.save(Canvas.ALL_SAVE_FLAG); canvas.clipRect(gridRect, android.graphics.Region.Op.INTERSECT); } renderStack.sync(); - for(RenderStack.StackElement thisElement : renderStack.getElements()) { - if(thisElement.isEnabled()) { + for (RenderStack.StackElement thisElement : renderStack.getElements()) { + if (thisElement.isEnabled()) { Class rendererClass = thisElement.get().getFormatter().getRendererClass(); plot.getRenderer(rendererClass).render( @@ -831,7 +884,7 @@ protected void drawData(Canvas canvas) throws PlotRenderException { } } finally { - if(isGridClippingEnabled) { + if (isGridClippingEnabled) { canvas.restore(); } } @@ -858,6 +911,7 @@ public Paint getDomainGridLinePaint() { /** * Set the paint used to draw the domain grid line. + * * @param gridLinePaint */ public void setDomainGridLinePaint(Paint gridLinePaint) { @@ -880,6 +934,7 @@ public Paint getDomainSubGridLinePaint() { /** * Set the paint used to draw the domain grid line. + * * @param gridLinePaint */ public void setDomainSubGridLinePaint(Paint gridLinePaint) { @@ -888,6 +943,7 @@ public void setDomainSubGridLinePaint(Paint gridLinePaint) { /** * Set the Paint used to draw the range grid line. + * * @param gridLinePaint */ public void setRangeGridLinePaint(Paint gridLinePaint) { @@ -903,6 +959,7 @@ public Paint getRangeSubGridLinePaint() { /** * Set the Paint used to draw the range grid line. + * * @param gridLinePaint */ public void setRangeSubGridLinePaint(Paint gridLinePaint) { @@ -943,6 +1000,7 @@ public void setRangeOriginLinePaint(Paint rangeOriginLinePaint) { /** * Set domain and range cursor position using screen coordinates + * * @param x * @param y */ @@ -953,6 +1011,7 @@ public void setCursorPosition(Float x, Float y) { /** * Set domain and range cursor position using screen coordinates + * * @param point */ public void setCursorPosition(PointF point) { @@ -969,6 +1028,7 @@ public Number getDomainCursorVal() { /** * Set domain cursor position using screen coordinates + * * @param domainCursorPosition */ public void setDomainCursorPosition(Float domainCursorPosition) { @@ -985,6 +1045,7 @@ public Number getRangeCursorVal() { /** * Set range cursor position using screen coordinates + * * @param rangeCursorPosition */ public void setRangeCursorPosition(Float rangeCursorPosition) { @@ -1012,9 +1073,8 @@ public Paint getDomainCursorPaint() { } /** - * - * @param domainCursorPaint The {@link Paint} used to draw the domain cursor line. - * Set to null (default) to disable. + * @param domainCursorPaint The {@link Paint} used to draw the domain cursor line. Set to null + * (default) to disable. */ public void setDomainCursorPaint(Paint domainCursorPaint) { this.domainCursorPaint = domainCursorPaint; @@ -1025,9 +1085,8 @@ public Paint getRangeCursorPaint() { } /** - * - * @param rangeCursorPaint The {@link Paint} used to draw the range cursor line. - * Set to null (default) to disable. + * @param rangeCursorPaint The {@link Paint} used to draw the range cursor line. Set to null + * (default) to disable. */ public void setRangeCursorPaint(Paint rangeCursorPaint) { this.rangeCursorPaint = rangeCursorPaint; @@ -1160,7 +1219,7 @@ public boolean isLineLabelEnabled(Edge position) { public void setLineLabelEdges(Edge... positions) { EnumSet positionSet = EnumSet.noneOf(Edge.class); - if(positions != null) { + if (positions != null) { Collections.addAll(positionSet, positions); } this.lineLabelEdges = positionSet; @@ -1171,8 +1230,8 @@ public void setLineLabelEdges(Collection positions) { } protected void setLineLabelEdges(int bitfield) { - for(Edge tp : Edge.values()) { - if((tp.value & bitfield) == tp.value) { + for (Edge tp : Edge.values()) { + if ((tp.value & bitfield) == tp.value) { lineLabelEdges.add(tp); } } From 9fe290d4d21d00c21ca3cb576ca2477efab7bc92 Mon Sep 17 00:00:00 2001 From: Jonathan Jackson Date: Thu, 8 Mar 2018 16:20:14 -0600 Subject: [PATCH 32/55] move incrementing of i in for loop to the for loop increment expression --- .../java/com/androidplot/xy/XYGraphWidget.java | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java b/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java index 890f5c8f..a0ee3dbe 100644 --- a/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java +++ b/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java @@ -634,32 +634,26 @@ protected void drawGrid(Canvas canvas) { // draw lines LEFT of origin: double xPix = domainOriginPix - domainStep.getStepPix(); - for (int i = ONE; xPix >= gridRect.left - FUDGE; xPix = domainOriginPix - - (i * domainStep.getStepPix())) { - double xVal = domainOrigin.doubleValue() - i - * domainStep.getStepVal(); + for (int i = ONE; xPix >= gridRect.left - FUDGE; i++, xPix = domainOriginPix - (i * domainStep.getStepPix())) { + double xVal = domainOrigin.doubleValue() - i * domainStep.getStepVal(); if (xPix <= gridRect.right) { final boolean isDomainTick = i % getLinesPerDomainLabel() == ZERO; final Paint lp = isDomainTick ? domainGridLinePaint : domainSubGridLinePaint; drawDomainLine(canvas, (float) xPix, xVal, lp, false); } - i++; } // draw lines RIGHT of origin: xPix = domainOriginPix + domainStep.getStepPix(); - for (int i = ONE; xPix <= gridRect.right + FUDGE; xPix = domainOriginPix - + (i * domainStep.getStepPix())) { - double xVal = domainOrigin.doubleValue() + i - * domainStep.getStepVal(); + for (int i = ONE; xPix <= gridRect.right + FUDGE; i++, xPix = domainOriginPix + (i * domainStep.getStepPix())) { + double xVal = domainOrigin.doubleValue() + i * domainStep.getStepVal(); if (xPix >= gridRect.left) { final boolean isDomainTick = i % getLinesPerDomainLabel() == ZERO; final Paint lp = isDomainTick ? domainGridLinePaint : domainSubGridLinePaint; drawDomainLine(canvas, (float) xPix, xVal, lp, false); } - i++; } Number rangeOrigin = plot.getRangeOrigin(); From 53e7e2b52a3ee7cdf161e0afbe01e84d75388a99 Mon Sep 17 00:00:00 2001 From: Jonathan Jackson Date: Thu, 8 Mar 2018 16:22:12 -0600 Subject: [PATCH 33/55] move incrementing of i in for loops to the for loop's increment expression --- .../main/java/com/androidplot/xy/XYGraphWidget.java | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java b/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java index a0ee3dbe..db92177f 100644 --- a/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java +++ b/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java @@ -680,29 +680,25 @@ protected void drawGrid(Canvas canvas) { // draw lines ABOVE origin: double yPix = rangeOriginPix - rangeStep.getStepPix(); - for (int i = ONE; yPix >= gridRect.top - FUDGE; yPix = rangeOriginPix - (i * rangeStepPix)) { - double yVal = rangeOrigin.doubleValue() + i - * rangeStep.getStepVal(); + for (int i = ONE; yPix >= gridRect.top - FUDGE; i++, yPix = rangeOriginPix - (i * rangeStepPix)) { + double yVal = rangeOrigin.doubleValue() + i * rangeStep.getStepVal(); if (yPix <= gridRect.bottom) { final boolean isRangeTick = i % getLinesPerRangeLabel() == ZERO; final Paint lp = isRangeTick ? rangeGridLinePaint : rangeSubGridLinePaint; drawRangeLine(canvas, (float) yPix, yVal, lp, false); } - i++; } // draw lines BENEATH origin: yPix = rangeOriginPix + rangeStep.getStepPix(); - for (int i = ONE; yPix <= gridRect.bottom + FUDGE; yPix = rangeOriginPix + (i * rangeStepPix)) { - double yVal = rangeOrigin.doubleValue() - i - * rangeStep.getStepVal(); + for (int i = ONE; yPix <= gridRect.bottom + FUDGE; i++, yPix = rangeOriginPix + (i * rangeStepPix)) { + double yVal = rangeOrigin.doubleValue() - i * rangeStep.getStepVal(); if (yPix >= gridRect.top) { final boolean isRangeTick = i % getLinesPerRangeLabel() == ZERO; final Paint lp = isRangeTick ? rangeGridLinePaint : rangeSubGridLinePaint; drawRangeLine(canvas, (float) yPix, yVal, lp, false); } - i++; } } From 56c3da68f101fa30ca8280f3d9fd0c36a8295144 Mon Sep 17 00:00:00 2001 From: Jonathan Jackson Date: Thu, 8 Mar 2018 16:26:41 -0600 Subject: [PATCH 34/55] move setting xPix and yPix in for loops from the for loop's increment statement to the top of the body of the for loop --- .../main/java/com/androidplot/xy/XYGraphWidget.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java b/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java index db92177f..2663db7c 100644 --- a/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java +++ b/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java @@ -634,7 +634,8 @@ protected void drawGrid(Canvas canvas) { // draw lines LEFT of origin: double xPix = domainOriginPix - domainStep.getStepPix(); - for (int i = ONE; xPix >= gridRect.left - FUDGE; i++, xPix = domainOriginPix - (i * domainStep.getStepPix())) { + for (int i = ONE; xPix >= gridRect.left - FUDGE; i++) { + xPix = domainOriginPix - (i * domainStep.getStepPix()); double xVal = domainOrigin.doubleValue() - i * domainStep.getStepVal(); if (xPix <= gridRect.right) { @@ -646,7 +647,8 @@ protected void drawGrid(Canvas canvas) { // draw lines RIGHT of origin: xPix = domainOriginPix + domainStep.getStepPix(); - for (int i = ONE; xPix <= gridRect.right + FUDGE; i++, xPix = domainOriginPix + (i * domainStep.getStepPix())) { + for (int i = ONE; xPix <= gridRect.right + FUDGE; i++) { + xPix = domainOriginPix + (i * domainStep.getStepPix()); double xVal = domainOrigin.doubleValue() + i * domainStep.getStepVal(); if (xPix >= gridRect.left) { @@ -680,7 +682,8 @@ protected void drawGrid(Canvas canvas) { // draw lines ABOVE origin: double yPix = rangeOriginPix - rangeStep.getStepPix(); - for (int i = ONE; yPix >= gridRect.top - FUDGE; i++, yPix = rangeOriginPix - (i * rangeStepPix)) { + for (int i = ONE; yPix >= gridRect.top - FUDGE; i++) { + yPix = rangeOriginPix - (i * rangeStepPix); double yVal = rangeOrigin.doubleValue() + i * rangeStep.getStepVal(); if (yPix <= gridRect.bottom) { @@ -692,7 +695,8 @@ protected void drawGrid(Canvas canvas) { // draw lines BENEATH origin: yPix = rangeOriginPix + rangeStep.getStepPix(); - for (int i = ONE; yPix <= gridRect.bottom + FUDGE; i++, yPix = rangeOriginPix + (i * rangeStepPix)) { + for (int i = ONE; yPix <= gridRect.bottom + FUDGE; i++) { + yPix = rangeOriginPix + (i * rangeStepPix); double yVal = rangeOrigin.doubleValue() - i * rangeStep.getStepVal(); if (yPix >= gridRect.top) { final boolean isRangeTick = i % getLinesPerRangeLabel() == ZERO; From fe8c0a2d20c84f9985b0c7cfddcd2da707b375c8 Mon Sep 17 00:00:00 2001 From: Jonathan Jackson Date: Thu, 8 Mar 2018 16:32:10 -0600 Subject: [PATCH 35/55] inlined the definition of xPix/yPix in for loop's termination statement and removed redundant and unused values for xPix/yPix this should be equivalent to the previous code --- .../java/com/androidplot/xy/XYGraphWidget.java | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java b/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java index 2663db7c..34326383 100644 --- a/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java +++ b/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java @@ -633,8 +633,8 @@ protected void drawGrid(Canvas canvas) { } // draw lines LEFT of origin: - double xPix = domainOriginPix - domainStep.getStepPix(); - for (int i = ONE; xPix >= gridRect.left - FUDGE; i++) { + double xPix; + for (int i = ONE; domainOriginPix - (i * domainStep.getStepPix()) >= gridRect.left - FUDGE; i++) { xPix = domainOriginPix - (i * domainStep.getStepPix()); double xVal = domainOrigin.doubleValue() - i * domainStep.getStepVal(); @@ -646,8 +646,7 @@ protected void drawGrid(Canvas canvas) { } // draw lines RIGHT of origin: - xPix = domainOriginPix + domainStep.getStepPix(); - for (int i = ONE; xPix <= gridRect.right + FUDGE; i++) { + for (int i = ONE; domainOriginPix + (i * domainStep.getStepPix()) <= gridRect.right + FUDGE; i++) { xPix = domainOriginPix + (i * domainStep.getStepPix()); double xVal = domainOrigin.doubleValue() + i * domainStep.getStepVal(); @@ -681,8 +680,8 @@ protected void drawGrid(Canvas canvas) { final double rangeStepPix = rangeStep.getStepPix(); // draw lines ABOVE origin: - double yPix = rangeOriginPix - rangeStep.getStepPix(); - for (int i = ONE; yPix >= gridRect.top - FUDGE; i++) { + double yPix; + for (int i = ONE; rangeOriginPix - (i * rangeStepPix) >= gridRect.top - FUDGE; i++) { yPix = rangeOriginPix - (i * rangeStepPix); double yVal = rangeOrigin.doubleValue() + i * rangeStep.getStepVal(); @@ -694,8 +693,7 @@ protected void drawGrid(Canvas canvas) { } // draw lines BENEATH origin: - yPix = rangeOriginPix + rangeStep.getStepPix(); - for (int i = ONE; yPix <= gridRect.bottom + FUDGE; i++) { + for (int i = ONE; rangeOriginPix + (i * rangeStepPix) <= gridRect.bottom + FUDGE; i++) { yPix = rangeOriginPix + (i * rangeStepPix); double yVal = rangeOrigin.doubleValue() - i * rangeStep.getStepVal(); if (yPix >= gridRect.top) { From c4c996b2fefdc3cc095db74a122d4ec7c0990b16 Mon Sep 17 00:00:00 2001 From: Jonathan Jackson Date: Thu, 8 Mar 2018 16:38:04 -0600 Subject: [PATCH 36/55] extract gridRect with fudge as final local constant --- .../main/java/com/androidplot/xy/XYGraphWidget.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java b/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java index 34326383..2bbe7574 100644 --- a/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java +++ b/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java @@ -634,7 +634,8 @@ protected void drawGrid(Canvas canvas) { // draw lines LEFT of origin: double xPix; - for (int i = ONE; domainOriginPix - (i * domainStep.getStepPix()) >= gridRect.left - FUDGE; i++) { + final float gridRectLeftMinusFudge = gridRect.left - FUDGE; + for (int i = ONE; domainOriginPix - (i * domainStep.getStepPix()) >= gridRectLeftMinusFudge; i++) { xPix = domainOriginPix - (i * domainStep.getStepPix()); double xVal = domainOrigin.doubleValue() - i * domainStep.getStepVal(); @@ -646,7 +647,8 @@ protected void drawGrid(Canvas canvas) { } // draw lines RIGHT of origin: - for (int i = ONE; domainOriginPix + (i * domainStep.getStepPix()) <= gridRect.right + FUDGE; i++) { + final float gridRectRightPlusFudge = gridRect.right + FUDGE; + for (int i = ONE; domainOriginPix + (i * domainStep.getStepPix()) <= gridRectRightPlusFudge; i++) { xPix = domainOriginPix + (i * domainStep.getStepPix()); double xVal = domainOrigin.doubleValue() + i * domainStep.getStepVal(); @@ -681,7 +683,8 @@ protected void drawGrid(Canvas canvas) { // draw lines ABOVE origin: double yPix; - for (int i = ONE; rangeOriginPix - (i * rangeStepPix) >= gridRect.top - FUDGE; i++) { + final float gridRectTopMinusFudge = gridRect.top - FUDGE; + for (int i = ONE; rangeOriginPix - (i * rangeStepPix) >= gridRectTopMinusFudge; i++) { yPix = rangeOriginPix - (i * rangeStepPix); double yVal = rangeOrigin.doubleValue() + i * rangeStep.getStepVal(); @@ -693,7 +696,8 @@ protected void drawGrid(Canvas canvas) { } // draw lines BENEATH origin: - for (int i = ONE; rangeOriginPix + (i * rangeStepPix) <= gridRect.bottom + FUDGE; i++) { + final float gridRectBottomPlusFudge = gridRect.bottom + FUDGE; + for (int i = ONE; rangeOriginPix + (i * rangeStepPix) <= gridRectBottomPlusFudge; i++) { yPix = rangeOriginPix + (i * rangeStepPix); double yVal = rangeOrigin.doubleValue() - i * rangeStep.getStepVal(); if (yPix >= gridRect.top) { From 07ff4bca5db0223fbc667ad2a6ae1a369c3717ac Mon Sep 17 00:00:00 2001 From: Jonathan Jackson Date: Thu, 8 Mar 2018 16:45:12 -0600 Subject: [PATCH 37/55] algabraic changes to for loop termination statements the new code should be matamatically equivalent to the previous version --- .../src/main/java/com/androidplot/xy/XYGraphWidget.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java b/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java index 2bbe7574..c6b2daa1 100644 --- a/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java +++ b/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java @@ -635,7 +635,7 @@ protected void drawGrid(Canvas canvas) { // draw lines LEFT of origin: double xPix; final float gridRectLeftMinusFudge = gridRect.left - FUDGE; - for (int i = ONE; domainOriginPix - (i * domainStep.getStepPix()) >= gridRectLeftMinusFudge; i++) { + for (int i = ONE; domainOriginPix - gridRectLeftMinusFudge >= i * domainStep.getStepPix(); i++) { xPix = domainOriginPix - (i * domainStep.getStepPix()); double xVal = domainOrigin.doubleValue() - i * domainStep.getStepVal(); @@ -648,7 +648,7 @@ protected void drawGrid(Canvas canvas) { // draw lines RIGHT of origin: final float gridRectRightPlusFudge = gridRect.right + FUDGE; - for (int i = ONE; domainOriginPix + (i * domainStep.getStepPix()) <= gridRectRightPlusFudge; i++) { + for (int i = ONE; i * domainStep.getStepPix() <= gridRectRightPlusFudge - domainOriginPix; i++) { xPix = domainOriginPix + (i * domainStep.getStepPix()); double xVal = domainOrigin.doubleValue() + i * domainStep.getStepVal(); @@ -684,7 +684,7 @@ protected void drawGrid(Canvas canvas) { // draw lines ABOVE origin: double yPix; final float gridRectTopMinusFudge = gridRect.top - FUDGE; - for (int i = ONE; rangeOriginPix - (i * rangeStepPix) >= gridRectTopMinusFudge; i++) { + for (int i = ONE; rangeOriginPix - gridRectTopMinusFudge >= i * rangeStepPix; i++) { yPix = rangeOriginPix - (i * rangeStepPix); double yVal = rangeOrigin.doubleValue() + i * rangeStep.getStepVal(); @@ -697,7 +697,7 @@ protected void drawGrid(Canvas canvas) { // draw lines BENEATH origin: final float gridRectBottomPlusFudge = gridRect.bottom + FUDGE; - for (int i = ONE; rangeOriginPix + (i * rangeStepPix) <= gridRectBottomPlusFudge; i++) { + for (int i = ONE; i * rangeStepPix <= gridRectBottomPlusFudge - rangeOriginPix; i++) { yPix = rangeOriginPix + (i * rangeStepPix); double yVal = rangeOrigin.doubleValue() - i * rangeStep.getStepVal(); if (yPix >= gridRect.top) { From 715f019535d7007f094a141e8e7eb55e57262ddd Mon Sep 17 00:00:00 2001 From: Jonathan Jackson Date: Thu, 8 Mar 2018 16:46:34 -0600 Subject: [PATCH 38/55] algabraic changes to for loop termination statements - move i to the left side the new code should be matamatically equivalent to the previous version --- .../src/main/java/com/androidplot/xy/XYGraphWidget.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java b/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java index c6b2daa1..935eb795 100644 --- a/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java +++ b/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java @@ -635,7 +635,7 @@ protected void drawGrid(Canvas canvas) { // draw lines LEFT of origin: double xPix; final float gridRectLeftMinusFudge = gridRect.left - FUDGE; - for (int i = ONE; domainOriginPix - gridRectLeftMinusFudge >= i * domainStep.getStepPix(); i++) { + for (int i = ONE; i * domainStep.getStepPix() <= domainOriginPix - gridRectLeftMinusFudge; i++) { xPix = domainOriginPix - (i * domainStep.getStepPix()); double xVal = domainOrigin.doubleValue() - i * domainStep.getStepVal(); @@ -684,7 +684,7 @@ protected void drawGrid(Canvas canvas) { // draw lines ABOVE origin: double yPix; final float gridRectTopMinusFudge = gridRect.top - FUDGE; - for (int i = ONE; rangeOriginPix - gridRectTopMinusFudge >= i * rangeStepPix; i++) { + for (int i = ONE; i * rangeStepPix <= rangeOriginPix - gridRectTopMinusFudge; i++) { yPix = rangeOriginPix - (i * rangeStepPix); double yVal = rangeOrigin.doubleValue() + i * rangeStep.getStepVal(); From 14c72fcc0d2412963bea95feb9dfa727bd925a67 Mon Sep 17 00:00:00 2001 From: Jonathan Jackson Date: Thu, 8 Mar 2018 16:51:34 -0600 Subject: [PATCH 39/55] use local variable for domainStepPix to more closely match style used in rangeStepPix on line 635 --- .../main/java/com/androidplot/xy/XYGraphWidget.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java b/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java index 935eb795..f7db84a6 100644 --- a/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java +++ b/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java @@ -632,11 +632,13 @@ protected void drawGrid(Canvas canvas) { ); } + final double domainStepPix = domainStep.getStepPix(); + // draw lines LEFT of origin: double xPix; final float gridRectLeftMinusFudge = gridRect.left - FUDGE; - for (int i = ONE; i * domainStep.getStepPix() <= domainOriginPix - gridRectLeftMinusFudge; i++) { - xPix = domainOriginPix - (i * domainStep.getStepPix()); + for (int i = ONE; i * domainStepPix <= domainOriginPix - gridRectLeftMinusFudge; i++) { + xPix = domainOriginPix - (i * domainStepPix); double xVal = domainOrigin.doubleValue() - i * domainStep.getStepVal(); if (xPix <= gridRect.right) { @@ -648,8 +650,8 @@ protected void drawGrid(Canvas canvas) { // draw lines RIGHT of origin: final float gridRectRightPlusFudge = gridRect.right + FUDGE; - for (int i = ONE; i * domainStep.getStepPix() <= gridRectRightPlusFudge - domainOriginPix; i++) { - xPix = domainOriginPix + (i * domainStep.getStepPix()); + for (int i = ONE; i * domainStepPix <= gridRectRightPlusFudge - domainOriginPix; i++) { + xPix = domainOriginPix + (i * domainStepPix); double xVal = domainOrigin.doubleValue() + i * domainStep.getStepVal(); if (xPix >= gridRect.left) { From c9515e09281372cf3de641f408a443a2346e603a Mon Sep 17 00:00:00 2001 From: Jonathan Jackson Date: Thu, 8 Mar 2018 16:55:14 -0600 Subject: [PATCH 40/55] algabraic changes to for loop termination statements - isolated i on the left side. now the right side of the termination statements is a constant value for the duration of the loop the new code should be matamatically equivalent to the previous version --- .../main/java/com/androidplot/xy/XYGraphWidget.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java b/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java index f7db84a6..eeb6e78e 100644 --- a/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java +++ b/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java @@ -612,7 +612,7 @@ protected void drawGrid(Canvas canvas) { Number domainOrigin = plot.getDomainOrigin(); - double domainOriginPix; + final double domainOriginPix; if (domainOrigin != null) { domainOriginPix = plot.getBounds().getxRegion().transform( plot.getDomainOrigin().doubleValue(), gridRect.left, gridRect.right, false); @@ -637,7 +637,7 @@ protected void drawGrid(Canvas canvas) { // draw lines LEFT of origin: double xPix; final float gridRectLeftMinusFudge = gridRect.left - FUDGE; - for (int i = ONE; i * domainStepPix <= domainOriginPix - gridRectLeftMinusFudge; i++) { + for (int i = ONE; i <= (domainOriginPix - gridRectLeftMinusFudge) / domainStepPix; i++) { xPix = domainOriginPix - (i * domainStepPix); double xVal = domainOrigin.doubleValue() - i * domainStep.getStepVal(); @@ -650,7 +650,7 @@ protected void drawGrid(Canvas canvas) { // draw lines RIGHT of origin: final float gridRectRightPlusFudge = gridRect.right + FUDGE; - for (int i = ONE; i * domainStepPix <= gridRectRightPlusFudge - domainOriginPix; i++) { + for (int i = ONE; i <= (gridRectRightPlusFudge - domainOriginPix) / domainStepPix; i++) { xPix = domainOriginPix + (i * domainStepPix); double xVal = domainOrigin.doubleValue() + i * domainStep.getStepVal(); @@ -662,7 +662,7 @@ protected void drawGrid(Canvas canvas) { } Number rangeOrigin = plot.getRangeOrigin(); - double rangeOriginPix; + final double rangeOriginPix; if (rangeOrigin != null) { rangeOriginPix = plot.getBounds().getyRegion().transform( rangeOrigin.doubleValue(), gridRect.top, gridRect.bottom, true); @@ -686,7 +686,7 @@ protected void drawGrid(Canvas canvas) { // draw lines ABOVE origin: double yPix; final float gridRectTopMinusFudge = gridRect.top - FUDGE; - for (int i = ONE; i * rangeStepPix <= rangeOriginPix - gridRectTopMinusFudge; i++) { + for (int i = ONE; i <= (rangeOriginPix - gridRectTopMinusFudge) / rangeStepPix; i++) { yPix = rangeOriginPix - (i * rangeStepPix); double yVal = rangeOrigin.doubleValue() + i * rangeStep.getStepVal(); @@ -699,7 +699,7 @@ protected void drawGrid(Canvas canvas) { // draw lines BENEATH origin: final float gridRectBottomPlusFudge = gridRect.bottom + FUDGE; - for (int i = ONE; i * rangeStepPix <= gridRectBottomPlusFudge - rangeOriginPix; i++) { + for (int i = ONE; i <= (gridRectBottomPlusFudge - rangeOriginPix) / rangeStepPix; i++) { yPix = rangeOriginPix + (i * rangeStepPix); double yVal = rangeOrigin.doubleValue() - i * rangeStep.getStepVal(); if (yPix >= gridRect.top) { From 966cee0afde2bbbb7e94780844ad50f7ea6d6d5b Mon Sep 17 00:00:00 2001 From: Jonathan Jackson Date: Thu, 8 Mar 2018 17:06:11 -0600 Subject: [PATCH 41/55] inlined variables xPix & yPix the new code should be functionally equivalent to the previous version --- .../java/com/androidplot/xy/XYGraphWidget.java | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java b/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java index eeb6e78e..5afcbca4 100644 --- a/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java +++ b/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java @@ -635,13 +635,12 @@ protected void drawGrid(Canvas canvas) { final double domainStepPix = domainStep.getStepPix(); // draw lines LEFT of origin: - double xPix; final float gridRectLeftMinusFudge = gridRect.left - FUDGE; for (int i = ONE; i <= (domainOriginPix - gridRectLeftMinusFudge) / domainStepPix; i++) { - xPix = domainOriginPix - (i * domainStepPix); double xVal = domainOrigin.doubleValue() - i * domainStep.getStepVal(); - if (xPix <= gridRect.right) { + if (domainOriginPix - (i * domainStepPix) <= gridRect.right) { + final double xPix = domainOriginPix - (i * domainStepPix); final boolean isDomainTick = i % getLinesPerDomainLabel() == ZERO; final Paint lp = isDomainTick ? domainGridLinePaint : domainSubGridLinePaint; drawDomainLine(canvas, (float) xPix, xVal, lp, false); @@ -651,10 +650,10 @@ protected void drawGrid(Canvas canvas) { // draw lines RIGHT of origin: final float gridRectRightPlusFudge = gridRect.right + FUDGE; for (int i = ONE; i <= (gridRectRightPlusFudge - domainOriginPix) / domainStepPix; i++) { - xPix = domainOriginPix + (i * domainStepPix); double xVal = domainOrigin.doubleValue() + i * domainStep.getStepVal(); - if (xPix >= gridRect.left) { + if (domainOriginPix + (i * domainStepPix) >= gridRect.left) { + final double xPix = domainOriginPix + (i * domainStepPix); final boolean isDomainTick = i % getLinesPerDomainLabel() == ZERO; final Paint lp = isDomainTick ? domainGridLinePaint : domainSubGridLinePaint; drawDomainLine(canvas, (float) xPix, xVal, lp, false); @@ -684,13 +683,12 @@ protected void drawGrid(Canvas canvas) { final double rangeStepPix = rangeStep.getStepPix(); // draw lines ABOVE origin: - double yPix; final float gridRectTopMinusFudge = gridRect.top - FUDGE; for (int i = ONE; i <= (rangeOriginPix - gridRectTopMinusFudge) / rangeStepPix; i++) { - yPix = rangeOriginPix - (i * rangeStepPix); double yVal = rangeOrigin.doubleValue() + i * rangeStep.getStepVal(); - if (yPix <= gridRect.bottom) { + if (rangeOriginPix - (i * rangeStepPix) <= gridRect.bottom) { + final double yPix = rangeOriginPix - (i * rangeStepPix); final boolean isRangeTick = i % getLinesPerRangeLabel() == ZERO; final Paint lp = isRangeTick ? rangeGridLinePaint : rangeSubGridLinePaint; drawRangeLine(canvas, (float) yPix, yVal, lp, false); @@ -700,9 +698,9 @@ protected void drawGrid(Canvas canvas) { // draw lines BENEATH origin: final float gridRectBottomPlusFudge = gridRect.bottom + FUDGE; for (int i = ONE; i <= (gridRectBottomPlusFudge - rangeOriginPix) / rangeStepPix; i++) { - yPix = rangeOriginPix + (i * rangeStepPix); double yVal = rangeOrigin.doubleValue() - i * rangeStep.getStepVal(); - if (yPix >= gridRect.top) { + if (rangeOriginPix + (i * rangeStepPix) >= gridRect.top) { + final double yPix = rangeOriginPix + (i * rangeStepPix); final boolean isRangeTick = i % getLinesPerRangeLabel() == ZERO; final Paint lp = isRangeTick ? rangeGridLinePaint : rangeSubGridLinePaint; drawRangeLine(canvas, (float) yPix, yVal, lp, false); From bbdb0a367f8f8b963747082413956345d3e13f71 Mon Sep 17 00:00:00 2001 From: Jonathan Jackson Date: Thu, 8 Mar 2018 17:09:42 -0600 Subject: [PATCH 42/55] move declaration of xVal and yVal closer to its usage the new code should be functionally equivalent to the previous version --- .../main/java/com/androidplot/xy/XYGraphWidget.java | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java b/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java index 5afcbca4..5e8bf6fd 100644 --- a/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java +++ b/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java @@ -637,9 +637,8 @@ protected void drawGrid(Canvas canvas) { // draw lines LEFT of origin: final float gridRectLeftMinusFudge = gridRect.left - FUDGE; for (int i = ONE; i <= (domainOriginPix - gridRectLeftMinusFudge) / domainStepPix; i++) { - double xVal = domainOrigin.doubleValue() - i * domainStep.getStepVal(); - if (domainOriginPix - (i * domainStepPix) <= gridRect.right) { + double xVal = domainOrigin.doubleValue() - i * domainStep.getStepVal(); final double xPix = domainOriginPix - (i * domainStepPix); final boolean isDomainTick = i % getLinesPerDomainLabel() == ZERO; final Paint lp = isDomainTick ? domainGridLinePaint : domainSubGridLinePaint; @@ -650,9 +649,8 @@ protected void drawGrid(Canvas canvas) { // draw lines RIGHT of origin: final float gridRectRightPlusFudge = gridRect.right + FUDGE; for (int i = ONE; i <= (gridRectRightPlusFudge - domainOriginPix) / domainStepPix; i++) { - double xVal = domainOrigin.doubleValue() + i * domainStep.getStepVal(); - if (domainOriginPix + (i * domainStepPix) >= gridRect.left) { + double xVal = domainOrigin.doubleValue() + i * domainStep.getStepVal(); final double xPix = domainOriginPix + (i * domainStepPix); final boolean isDomainTick = i % getLinesPerDomainLabel() == ZERO; final Paint lp = isDomainTick ? domainGridLinePaint : domainSubGridLinePaint; @@ -685,9 +683,8 @@ protected void drawGrid(Canvas canvas) { // draw lines ABOVE origin: final float gridRectTopMinusFudge = gridRect.top - FUDGE; for (int i = ONE; i <= (rangeOriginPix - gridRectTopMinusFudge) / rangeStepPix; i++) { - double yVal = rangeOrigin.doubleValue() + i * rangeStep.getStepVal(); - if (rangeOriginPix - (i * rangeStepPix) <= gridRect.bottom) { + double yVal = rangeOrigin.doubleValue() + i * rangeStep.getStepVal(); final double yPix = rangeOriginPix - (i * rangeStepPix); final boolean isRangeTick = i % getLinesPerRangeLabel() == ZERO; final Paint lp = isRangeTick ? rangeGridLinePaint : rangeSubGridLinePaint; @@ -698,8 +695,8 @@ protected void drawGrid(Canvas canvas) { // draw lines BENEATH origin: final float gridRectBottomPlusFudge = gridRect.bottom + FUDGE; for (int i = ONE; i <= (gridRectBottomPlusFudge - rangeOriginPix) / rangeStepPix; i++) { - double yVal = rangeOrigin.doubleValue() - i * rangeStep.getStepVal(); if (rangeOriginPix + (i * rangeStepPix) >= gridRect.top) { + double yVal = rangeOrigin.doubleValue() - i * rangeStep.getStepVal(); final double yPix = rangeOriginPix + (i * rangeStepPix); final boolean isRangeTick = i % getLinesPerRangeLabel() == ZERO; final Paint lp = isRangeTick ? rangeGridLinePaint : rangeSubGridLinePaint; From d90fb47126c59baf25bf5d8f3de9fee6d403f453 Mon Sep 17 00:00:00 2001 From: Jonathan Jackson Date: Thu, 8 Mar 2018 17:11:42 -0600 Subject: [PATCH 43/55] remove "final" from local variables that have a very limited scope anyway --- .../com/androidplot/xy/XYGraphWidget.java | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java b/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java index 5e8bf6fd..bbad8415 100644 --- a/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java +++ b/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java @@ -639,9 +639,9 @@ protected void drawGrid(Canvas canvas) { for (int i = ONE; i <= (domainOriginPix - gridRectLeftMinusFudge) / domainStepPix; i++) { if (domainOriginPix - (i * domainStepPix) <= gridRect.right) { double xVal = domainOrigin.doubleValue() - i * domainStep.getStepVal(); - final double xPix = domainOriginPix - (i * domainStepPix); - final boolean isDomainTick = i % getLinesPerDomainLabel() == ZERO; - final Paint lp = isDomainTick ? domainGridLinePaint : domainSubGridLinePaint; + double xPix = domainOriginPix - (i * domainStepPix); + boolean isDomainTick = i % getLinesPerDomainLabel() == ZERO; + Paint lp = isDomainTick ? domainGridLinePaint : domainSubGridLinePaint; drawDomainLine(canvas, (float) xPix, xVal, lp, false); } } @@ -651,9 +651,9 @@ protected void drawGrid(Canvas canvas) { for (int i = ONE; i <= (gridRectRightPlusFudge - domainOriginPix) / domainStepPix; i++) { if (domainOriginPix + (i * domainStepPix) >= gridRect.left) { double xVal = domainOrigin.doubleValue() + i * domainStep.getStepVal(); - final double xPix = domainOriginPix + (i * domainStepPix); - final boolean isDomainTick = i % getLinesPerDomainLabel() == ZERO; - final Paint lp = isDomainTick ? domainGridLinePaint : domainSubGridLinePaint; + double xPix = domainOriginPix + (i * domainStepPix); + boolean isDomainTick = i % getLinesPerDomainLabel() == ZERO; + Paint lp = isDomainTick ? domainGridLinePaint : domainSubGridLinePaint; drawDomainLine(canvas, (float) xPix, xVal, lp, false); } } @@ -685,9 +685,9 @@ protected void drawGrid(Canvas canvas) { for (int i = ONE; i <= (rangeOriginPix - gridRectTopMinusFudge) / rangeStepPix; i++) { if (rangeOriginPix - (i * rangeStepPix) <= gridRect.bottom) { double yVal = rangeOrigin.doubleValue() + i * rangeStep.getStepVal(); - final double yPix = rangeOriginPix - (i * rangeStepPix); - final boolean isRangeTick = i % getLinesPerRangeLabel() == ZERO; - final Paint lp = isRangeTick ? rangeGridLinePaint : rangeSubGridLinePaint; + double yPix = rangeOriginPix - (i * rangeStepPix); + boolean isRangeTick = i % getLinesPerRangeLabel() == ZERO; + Paint lp = isRangeTick ? rangeGridLinePaint : rangeSubGridLinePaint; drawRangeLine(canvas, (float) yPix, yVal, lp, false); } } @@ -697,9 +697,9 @@ protected void drawGrid(Canvas canvas) { for (int i = ONE; i <= (gridRectBottomPlusFudge - rangeOriginPix) / rangeStepPix; i++) { if (rangeOriginPix + (i * rangeStepPix) >= gridRect.top) { double yVal = rangeOrigin.doubleValue() - i * rangeStep.getStepVal(); - final double yPix = rangeOriginPix + (i * rangeStepPix); - final boolean isRangeTick = i % getLinesPerRangeLabel() == ZERO; - final Paint lp = isRangeTick ? rangeGridLinePaint : rangeSubGridLinePaint; + double yPix = rangeOriginPix + (i * rangeStepPix); + boolean isRangeTick = i % getLinesPerRangeLabel() == ZERO; + Paint lp = isRangeTick ? rangeGridLinePaint : rangeSubGridLinePaint; drawRangeLine(canvas, (float) yPix, yVal, lp, false); } } From 3a63ad699544d699d3abfe99fcb635ef45d1d654 Mon Sep 17 00:00:00 2001 From: Jonathan Jackson Date: Thu, 8 Mar 2018 17:24:58 -0600 Subject: [PATCH 44/55] algabraic changes to for loop termination statements - isolate i on the left side the new code should be matamatically equivalent to the previous version --- .../java/com/androidplot/xy/XYGraphWidget.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java b/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java index bbad8415..1d044371 100644 --- a/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java +++ b/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java @@ -637,9 +637,9 @@ protected void drawGrid(Canvas canvas) { // draw lines LEFT of origin: final float gridRectLeftMinusFudge = gridRect.left - FUDGE; for (int i = ONE; i <= (domainOriginPix - gridRectLeftMinusFudge) / domainStepPix; i++) { - if (domainOriginPix - (i * domainStepPix) <= gridRect.right) { + if (-i <= (gridRect.right - domainOriginPix) / domainStepPix) { double xVal = domainOrigin.doubleValue() - i * domainStep.getStepVal(); - double xPix = domainOriginPix - (i * domainStepPix); + double xPix = domainOriginPix - i * domainStepPix; boolean isDomainTick = i % getLinesPerDomainLabel() == ZERO; Paint lp = isDomainTick ? domainGridLinePaint : domainSubGridLinePaint; drawDomainLine(canvas, (float) xPix, xVal, lp, false); @@ -649,9 +649,9 @@ protected void drawGrid(Canvas canvas) { // draw lines RIGHT of origin: final float gridRectRightPlusFudge = gridRect.right + FUDGE; for (int i = ONE; i <= (gridRectRightPlusFudge - domainOriginPix) / domainStepPix; i++) { - if (domainOriginPix + (i * domainStepPix) >= gridRect.left) { + if (i >= (gridRect.left - domainOriginPix) / domainStepPix) { double xVal = domainOrigin.doubleValue() + i * domainStep.getStepVal(); - double xPix = domainOriginPix + (i * domainStepPix); + double xPix = domainOriginPix + i * domainStepPix; boolean isDomainTick = i % getLinesPerDomainLabel() == ZERO; Paint lp = isDomainTick ? domainGridLinePaint : domainSubGridLinePaint; drawDomainLine(canvas, (float) xPix, xVal, lp, false); @@ -683,9 +683,9 @@ protected void drawGrid(Canvas canvas) { // draw lines ABOVE origin: final float gridRectTopMinusFudge = gridRect.top - FUDGE; for (int i = ONE; i <= (rangeOriginPix - gridRectTopMinusFudge) / rangeStepPix; i++) { - if (rangeOriginPix - (i * rangeStepPix) <= gridRect.bottom) { + if (-i <= (gridRect.bottom - rangeOriginPix) / rangeStepPix) { double yVal = rangeOrigin.doubleValue() + i * rangeStep.getStepVal(); - double yPix = rangeOriginPix - (i * rangeStepPix); + double yPix = rangeOriginPix - i * rangeStepPix; boolean isRangeTick = i % getLinesPerRangeLabel() == ZERO; Paint lp = isRangeTick ? rangeGridLinePaint : rangeSubGridLinePaint; drawRangeLine(canvas, (float) yPix, yVal, lp, false); @@ -695,9 +695,9 @@ protected void drawGrid(Canvas canvas) { // draw lines BENEATH origin: final float gridRectBottomPlusFudge = gridRect.bottom + FUDGE; for (int i = ONE; i <= (gridRectBottomPlusFudge - rangeOriginPix) / rangeStepPix; i++) { - if (rangeOriginPix + (i * rangeStepPix) >= gridRect.top) { + if (i >= (gridRect.top - rangeOriginPix) / rangeStepPix) { double yVal = rangeOrigin.doubleValue() - i * rangeStep.getStepVal(); - double yPix = rangeOriginPix + (i * rangeStepPix); + double yPix = rangeOriginPix + i * rangeStepPix; boolean isRangeTick = i % getLinesPerRangeLabel() == ZERO; Paint lp = isRangeTick ? rangeGridLinePaint : rangeSubGridLinePaint; drawRangeLine(canvas, (float) yPix, yVal, lp, false); From 820a3664919b3223029ce56b137222a6b10f0f37 Mon Sep 17 00:00:00 2001 From: Jonathan Jackson Date: Thu, 8 Mar 2018 17:27:33 -0600 Subject: [PATCH 45/55] algabraic changes to for loop termination statements - isolate +i on the left side the new code should be matamatically equivalent to the previous version --- .../src/main/java/com/androidplot/xy/XYGraphWidget.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java b/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java index 1d044371..c5424c6f 100644 --- a/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java +++ b/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java @@ -637,7 +637,7 @@ protected void drawGrid(Canvas canvas) { // draw lines LEFT of origin: final float gridRectLeftMinusFudge = gridRect.left - FUDGE; for (int i = ONE; i <= (domainOriginPix - gridRectLeftMinusFudge) / domainStepPix; i++) { - if (-i <= (gridRect.right - domainOriginPix) / domainStepPix) { + if (i >= (domainOriginPix - gridRect.right) / domainStepPix) { double xVal = domainOrigin.doubleValue() - i * domainStep.getStepVal(); double xPix = domainOriginPix - i * domainStepPix; boolean isDomainTick = i % getLinesPerDomainLabel() == ZERO; @@ -683,7 +683,7 @@ protected void drawGrid(Canvas canvas) { // draw lines ABOVE origin: final float gridRectTopMinusFudge = gridRect.top - FUDGE; for (int i = ONE; i <= (rangeOriginPix - gridRectTopMinusFudge) / rangeStepPix; i++) { - if (-i <= (gridRect.bottom - rangeOriginPix) / rangeStepPix) { + if (i >= (rangeOriginPix - gridRect.bottom) / rangeStepPix) { double yVal = rangeOrigin.doubleValue() + i * rangeStep.getStepVal(); double yPix = rangeOriginPix - i * rangeStepPix; boolean isRangeTick = i % getLinesPerRangeLabel() == ZERO; From 162db35ae79d5864d48595ed9f9cc6e4cdc069e4 Mon Sep 17 00:00:00 2001 From: Jonathan Jackson Date: Thu, 8 Mar 2018 17:43:32 -0600 Subject: [PATCH 46/55] modify for loop initial value for i to skip values of i for which there is no-op due to the if statement anyway the new code should be functionally equivalent to the previous version --- .../com/androidplot/xy/XYGraphWidget.java | 28 +++++++++++++------ 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java b/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java index c5424c6f..aba6b8c0 100644 --- a/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java +++ b/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java @@ -636,8 +636,11 @@ protected void drawGrid(Canvas canvas) { // draw lines LEFT of origin: final float gridRectLeftMinusFudge = gridRect.left - FUDGE; - for (int i = ONE; i <= (domainOriginPix - gridRectLeftMinusFudge) / domainStepPix; i++) { - if (i >= (domainOriginPix - gridRect.right) / domainStepPix) { + double iMin = (domainOriginPix - gridRect.right) / domainStepPix; + for (int i = (int) Math.ceil(iMin); + i <= (domainOriginPix - gridRectLeftMinusFudge) / domainStepPix; + i++) { + if (i >= iMin) { double xVal = domainOrigin.doubleValue() - i * domainStep.getStepVal(); double xPix = domainOriginPix - i * domainStepPix; boolean isDomainTick = i % getLinesPerDomainLabel() == ZERO; @@ -648,8 +651,11 @@ protected void drawGrid(Canvas canvas) { // draw lines RIGHT of origin: final float gridRectRightPlusFudge = gridRect.right + FUDGE; - for (int i = ONE; i <= (gridRectRightPlusFudge - domainOriginPix) / domainStepPix; i++) { - if (i >= (gridRect.left - domainOriginPix) / domainStepPix) { + iMin = (gridRect.left - domainOriginPix) / domainStepPix; + for (int i = (int) Math.ceil(iMin); + i <= (gridRectRightPlusFudge - domainOriginPix) / domainStepPix; + i++) { + if (i >= iMin) { double xVal = domainOrigin.doubleValue() + i * domainStep.getStepVal(); double xPix = domainOriginPix + i * domainStepPix; boolean isDomainTick = i % getLinesPerDomainLabel() == ZERO; @@ -682,8 +688,11 @@ protected void drawGrid(Canvas canvas) { // draw lines ABOVE origin: final float gridRectTopMinusFudge = gridRect.top - FUDGE; - for (int i = ONE; i <= (rangeOriginPix - gridRectTopMinusFudge) / rangeStepPix; i++) { - if (i >= (rangeOriginPix - gridRect.bottom) / rangeStepPix) { + iMin = (rangeOriginPix - gridRect.bottom) / rangeStepPix; + for (int i = (int) Math.ceil(iMin); + i <= (rangeOriginPix - gridRectTopMinusFudge) / rangeStepPix; + i++) { + if (i >= iMin) { double yVal = rangeOrigin.doubleValue() + i * rangeStep.getStepVal(); double yPix = rangeOriginPix - i * rangeStepPix; boolean isRangeTick = i % getLinesPerRangeLabel() == ZERO; @@ -694,8 +703,11 @@ protected void drawGrid(Canvas canvas) { // draw lines BENEATH origin: final float gridRectBottomPlusFudge = gridRect.bottom + FUDGE; - for (int i = ONE; i <= (gridRectBottomPlusFudge - rangeOriginPix) / rangeStepPix; i++) { - if (i >= (gridRect.top - rangeOriginPix) / rangeStepPix) { + iMin = (gridRect.top - rangeOriginPix) / rangeStepPix; + for (int i = (int) Math.ceil(iMin); + i <= (gridRectBottomPlusFudge - rangeOriginPix) / rangeStepPix; + i++) { + if (i >= iMin) { double yVal = rangeOrigin.doubleValue() - i * rangeStep.getStepVal(); double yPix = rangeOriginPix + i * rangeStepPix; boolean isRangeTick = i % getLinesPerRangeLabel() == ZERO; From 89869df54328fde7bd051cb0c32380236f0f3880 Mon Sep 17 00:00:00 2001 From: Jonathan Jackson Date: Thu, 8 Mar 2018 17:46:52 -0600 Subject: [PATCH 47/55] remove inner conditional that will always be true with the new initial i value the new code should be functionally equivalent to the previous version --- .../com/androidplot/xy/XYGraphWidget.java | 48 ++++++++----------- 1 file changed, 20 insertions(+), 28 deletions(-) diff --git a/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java b/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java index aba6b8c0..51deafaa 100644 --- a/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java +++ b/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java @@ -640,13 +640,11 @@ protected void drawGrid(Canvas canvas) { for (int i = (int) Math.ceil(iMin); i <= (domainOriginPix - gridRectLeftMinusFudge) / domainStepPix; i++) { - if (i >= iMin) { - double xVal = domainOrigin.doubleValue() - i * domainStep.getStepVal(); - double xPix = domainOriginPix - i * domainStepPix; - boolean isDomainTick = i % getLinesPerDomainLabel() == ZERO; - Paint lp = isDomainTick ? domainGridLinePaint : domainSubGridLinePaint; - drawDomainLine(canvas, (float) xPix, xVal, lp, false); - } + double xVal = domainOrigin.doubleValue() - i * domainStep.getStepVal(); + double xPix = domainOriginPix - i * domainStepPix; + boolean isDomainTick = i % getLinesPerDomainLabel() == ZERO; + Paint lp = isDomainTick ? domainGridLinePaint : domainSubGridLinePaint; + drawDomainLine(canvas, (float) xPix, xVal, lp, false); } // draw lines RIGHT of origin: @@ -655,13 +653,11 @@ protected void drawGrid(Canvas canvas) { for (int i = (int) Math.ceil(iMin); i <= (gridRectRightPlusFudge - domainOriginPix) / domainStepPix; i++) { - if (i >= iMin) { - double xVal = domainOrigin.doubleValue() + i * domainStep.getStepVal(); - double xPix = domainOriginPix + i * domainStepPix; - boolean isDomainTick = i % getLinesPerDomainLabel() == ZERO; - Paint lp = isDomainTick ? domainGridLinePaint : domainSubGridLinePaint; - drawDomainLine(canvas, (float) xPix, xVal, lp, false); - } + double xVal = domainOrigin.doubleValue() + i * domainStep.getStepVal(); + double xPix = domainOriginPix + i * domainStepPix; + boolean isDomainTick = i % getLinesPerDomainLabel() == ZERO; + Paint lp = isDomainTick ? domainGridLinePaint : domainSubGridLinePaint; + drawDomainLine(canvas, (float) xPix, xVal, lp, false); } Number rangeOrigin = plot.getRangeOrigin(); @@ -692,13 +688,11 @@ protected void drawGrid(Canvas canvas) { for (int i = (int) Math.ceil(iMin); i <= (rangeOriginPix - gridRectTopMinusFudge) / rangeStepPix; i++) { - if (i >= iMin) { - double yVal = rangeOrigin.doubleValue() + i * rangeStep.getStepVal(); - double yPix = rangeOriginPix - i * rangeStepPix; - boolean isRangeTick = i % getLinesPerRangeLabel() == ZERO; - Paint lp = isRangeTick ? rangeGridLinePaint : rangeSubGridLinePaint; - drawRangeLine(canvas, (float) yPix, yVal, lp, false); - } + double yVal = rangeOrigin.doubleValue() + i * rangeStep.getStepVal(); + double yPix = rangeOriginPix - i * rangeStepPix; + boolean isRangeTick = i % getLinesPerRangeLabel() == ZERO; + Paint lp = isRangeTick ? rangeGridLinePaint : rangeSubGridLinePaint; + drawRangeLine(canvas, (float) yPix, yVal, lp, false); } // draw lines BENEATH origin: @@ -707,13 +701,11 @@ protected void drawGrid(Canvas canvas) { for (int i = (int) Math.ceil(iMin); i <= (gridRectBottomPlusFudge - rangeOriginPix) / rangeStepPix; i++) { - if (i >= iMin) { - double yVal = rangeOrigin.doubleValue() - i * rangeStep.getStepVal(); - double yPix = rangeOriginPix + i * rangeStepPix; - boolean isRangeTick = i % getLinesPerRangeLabel() == ZERO; - Paint lp = isRangeTick ? rangeGridLinePaint : rangeSubGridLinePaint; - drawRangeLine(canvas, (float) yPix, yVal, lp, false); - } + double yVal = rangeOrigin.doubleValue() - i * rangeStep.getStepVal(); + double yPix = rangeOriginPix + i * rangeStepPix; + boolean isRangeTick = i % getLinesPerRangeLabel() == ZERO; + Paint lp = isRangeTick ? rangeGridLinePaint : rangeSubGridLinePaint; + drawRangeLine(canvas, (float) yPix, yVal, lp, false); } } From fd4baecf665d644ef298806c3f281eaec6a1ea4a Mon Sep 17 00:00:00 2001 From: Jonathan Jackson Date: Thu, 8 Mar 2018 17:59:45 -0600 Subject: [PATCH 48/55] inline local variables that are only being used once --- .../main/java/com/androidplot/xy/XYGraphWidget.java | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java b/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java index 51deafaa..2797093d 100644 --- a/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java +++ b/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java @@ -635,10 +635,9 @@ protected void drawGrid(Canvas canvas) { final double domainStepPix = domainStep.getStepPix(); // draw lines LEFT of origin: - final float gridRectLeftMinusFudge = gridRect.left - FUDGE; double iMin = (domainOriginPix - gridRect.right) / domainStepPix; for (int i = (int) Math.ceil(iMin); - i <= (domainOriginPix - gridRectLeftMinusFudge) / domainStepPix; + i <= (domainOriginPix - gridRect.left + FUDGE) / domainStepPix; i++) { double xVal = domainOrigin.doubleValue() - i * domainStep.getStepVal(); double xPix = domainOriginPix - i * domainStepPix; @@ -648,10 +647,9 @@ protected void drawGrid(Canvas canvas) { } // draw lines RIGHT of origin: - final float gridRectRightPlusFudge = gridRect.right + FUDGE; iMin = (gridRect.left - domainOriginPix) / domainStepPix; for (int i = (int) Math.ceil(iMin); - i <= (gridRectRightPlusFudge - domainOriginPix) / domainStepPix; + i <= (gridRect.right + FUDGE - domainOriginPix) / domainStepPix; i++) { double xVal = domainOrigin.doubleValue() + i * domainStep.getStepVal(); double xPix = domainOriginPix + i * domainStepPix; @@ -683,10 +681,9 @@ protected void drawGrid(Canvas canvas) { final double rangeStepPix = rangeStep.getStepPix(); // draw lines ABOVE origin: - final float gridRectTopMinusFudge = gridRect.top - FUDGE; iMin = (rangeOriginPix - gridRect.bottom) / rangeStepPix; for (int i = (int) Math.ceil(iMin); - i <= (rangeOriginPix - gridRectTopMinusFudge) / rangeStepPix; + i <= (rangeOriginPix - gridRect.top + FUDGE) / rangeStepPix; i++) { double yVal = rangeOrigin.doubleValue() + i * rangeStep.getStepVal(); double yPix = rangeOriginPix - i * rangeStepPix; @@ -696,10 +693,9 @@ protected void drawGrid(Canvas canvas) { } // draw lines BENEATH origin: - final float gridRectBottomPlusFudge = gridRect.bottom + FUDGE; iMin = (gridRect.top - rangeOriginPix) / rangeStepPix; for (int i = (int) Math.ceil(iMin); - i <= (gridRectBottomPlusFudge - rangeOriginPix) / rangeStepPix; + i <= (gridRect.bottom + FUDGE - rangeOriginPix) / rangeStepPix; i++) { double yVal = rangeOrigin.doubleValue() - i * rangeStep.getStepVal(); double yPix = rangeOriginPix + i * rangeStepPix; From facf0e73c052171360aab513b7ff623a2570fb6a Mon Sep 17 00:00:00 2001 From: Jonathan Jackson Date: Fri, 9 Mar 2018 14:38:41 -0600 Subject: [PATCH 49/55] There is already some android thread named "RenderThread" which is confusing while debugging so I renamed the Android Plot thread to "Android Plot Render Thread". --- androidplot-core/src/main/java/com/androidplot/Plot.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/androidplot-core/src/main/java/com/androidplot/Plot.java b/androidplot-core/src/main/java/com/androidplot/Plot.java index cf05ac90..0138bd7f 100644 --- a/androidplot-core/src/main/java/com/androidplot/Plot.java +++ b/androidplot-core/src/main/java/com/androidplot/Plot.java @@ -421,7 +421,7 @@ public void run() { } pingPong.recycle(); } - }, "renderThread"); + }, "Android Plot Render Thread"); } } From 02cdc94b04be2170fcff1dfc61a24dae81f852a3 Mon Sep 17 00:00:00 2001 From: Jonathan Jackson Date: Fri, 9 Mar 2018 14:40:14 -0600 Subject: [PATCH 50/55] Further simplified the loops which draw grids and origin lines. --- .../com/androidplot/xy/XYGraphWidget.java | 89 +++++++------------ 1 file changed, 33 insertions(+), 56 deletions(-) diff --git a/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java b/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java index 2797093d..80a9be84 100644 --- a/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java +++ b/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java @@ -624,38 +624,26 @@ protected void drawGrid(Canvas canvas) { Step domainStep = XYStepCalculator.getStep(plot, Axis.DOMAIN, gridRect); - // draw domain origin: - if (domainOriginPix >= gridRect.left - && domainOriginPix <= gridRect.right) { - drawDomainLine(canvas, (float) domainOriginPix, - domainOrigin, domainOriginLinePaint, true - ); - } + // Draw Domain Lines: final double domainStepPix = domainStep.getStepPix(); + final double iMin = (gridRect.left - domainOriginPix - FUDGE) / domainStepPix; + final double iMax = (gridRect.right - domainOriginPix + FUDGE) / domainStepPix; - // draw lines LEFT of origin: - double iMin = (domainOriginPix - gridRect.right) / domainStepPix; - for (int i = (int) Math.ceil(iMin); - i <= (domainOriginPix - gridRect.left + FUDGE) / domainStepPix; - i++) { - double xVal = domainOrigin.doubleValue() - i * domainStep.getStepVal(); - double xPix = domainOriginPix - i * domainStepPix; - boolean isDomainTick = i % getLinesPerDomainLabel() == ZERO; - Paint lp = isDomainTick ? domainGridLinePaint : domainSubGridLinePaint; - drawDomainLine(canvas, (float) xPix, xVal, lp, false); - } - - // draw lines RIGHT of origin: - iMin = (gridRect.left - domainOriginPix) / domainStepPix; - for (int i = (int) Math.ceil(iMin); - i <= (gridRect.right + FUDGE - domainOriginPix) / domainStepPix; - i++) { + for (int i = (int) Math.ceil(iMin); i <= iMax; i++) { double xVal = domainOrigin.doubleValue() + i * domainStep.getStepVal(); double xPix = domainOriginPix + i * domainStepPix; - boolean isDomainTick = i % getLinesPerDomainLabel() == ZERO; - Paint lp = isDomainTick ? domainGridLinePaint : domainSubGridLinePaint; - drawDomainLine(canvas, (float) xPix, xVal, lp, false); + boolean isMajorTick = i % getLinesPerDomainLabel() == ZERO; + boolean isOrigin = i == 0; + Paint linePaint; + if (isOrigin) { + linePaint = domainOriginLinePaint; + } else if (isMajorTick) { + linePaint = domainGridLinePaint; + } else { + linePaint = domainSubGridLinePaint; + } + drawDomainLine(canvas, (float) xPix, xVal, linePaint, isOrigin); } Number rangeOrigin = plot.getRangeOrigin(); @@ -671,37 +659,26 @@ protected void drawGrid(Canvas canvas) { Step rangeStep = XYStepCalculator.getStep(plot, Axis.RANGE, gridRect); - // draw range origin: - if (rangeOriginPix >= gridRect.top && rangeOriginPix <= gridRect.bottom) { - drawRangeLine(canvas, (float) rangeOriginPix, - rangeOrigin, rangeOriginLinePaint, true - ); - } + // Draw Range Lines: final double rangeStepPix = rangeStep.getStepPix(); - - // draw lines ABOVE origin: - iMin = (rangeOriginPix - gridRect.bottom) / rangeStepPix; - for (int i = (int) Math.ceil(iMin); - i <= (rangeOriginPix - gridRect.top + FUDGE) / rangeStepPix; - i++) { - double yVal = rangeOrigin.doubleValue() + i * rangeStep.getStepVal(); - double yPix = rangeOriginPix - i * rangeStepPix; - boolean isRangeTick = i % getLinesPerRangeLabel() == ZERO; - Paint lp = isRangeTick ? rangeGridLinePaint : rangeSubGridLinePaint; - drawRangeLine(canvas, (float) yPix, yVal, lp, false); - } - - // draw lines BENEATH origin: - iMin = (gridRect.top - rangeOriginPix) / rangeStepPix; - for (int i = (int) Math.ceil(iMin); - i <= (gridRect.bottom + FUDGE - rangeOriginPix) / rangeStepPix; - i++) { - double yVal = rangeOrigin.doubleValue() - i * rangeStep.getStepVal(); - double yPix = rangeOriginPix + i * rangeStepPix; - boolean isRangeTick = i % getLinesPerRangeLabel() == ZERO; - Paint lp = isRangeTick ? rangeGridLinePaint : rangeSubGridLinePaint; - drawRangeLine(canvas, (float) yPix, yVal, lp, false); + final double kMin = (gridRect.top - rangeOriginPix - FUDGE) / rangeStepPix; + final double kMax = (gridRect.bottom - rangeOriginPix + FUDGE) / rangeStepPix; + + for (int k = (int) Math.ceil(kMin); k <= kMax; k++) { + double yVal = rangeOrigin.doubleValue() + k * rangeStep.getStepVal(); + double yPix = rangeOriginPix + k * rangeStepPix; + boolean isMajorTick = k % getLinesPerRangeLabel() == ZERO; + boolean isOrigin = k == 0; + Paint linePaint; + if (isOrigin) { + linePaint = rangeOriginLinePaint; + } else if (isMajorTick) { + linePaint = rangeGridLinePaint; + } else { + linePaint = rangeSubGridLinePaint; + } + drawRangeLine(canvas, (float) yPix, yVal, linePaint, isOrigin); } } From 6a6a271c3554068e5439a12e3afa924ff6795c48 Mon Sep 17 00:00:00 2001 From: Jonathan Jackson Date: Fri, 9 Mar 2018 18:14:28 -0600 Subject: [PATCH 51/55] Fix minMax in SeriesUtils.java - if a series is a FastXYSeries and it returns a min/max that is within contraints, then don't iterate the series manually. - removed redundundant boolean --- .../src/main/java/com/androidplot/util/SeriesUtils.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/androidplot-core/src/main/java/com/androidplot/util/SeriesUtils.java b/androidplot-core/src/main/java/com/androidplot/util/SeriesUtils.java index bd265582..1df07932 100644 --- a/androidplot-core/src/main/java/com/androidplot/util/SeriesUtils.java +++ b/androidplot-core/src/main/java/com/androidplot/util/SeriesUtils.java @@ -85,17 +85,18 @@ public static RectRegion minMax(XYConstraints constraints, XYSeries... seriesArr for (XYSeries series : seriesArray) { // if this is an advanced xy series then minMax have already been calculated for us: - boolean isPreCalculated = false; if (series instanceof FastXYSeries) { final RectRegion b = ((FastXYSeries) series).minMax(); if(b == null) { + //this series doesn't currently have min or max region (might be empty) continue; } if(constraints == null || constraints.contains(b)) { bounds.union(b); + continue; } } - if (!isPreCalculated && series.size() > 0) { + if (series.size() > 0) { for (int i = 0; i < series.size(); i++) { final Number xi = series.getX(i); final Number yi = series.getY(i); From 1a021c3b8493852c756e021d3512d82b58f72234 Mon Sep 17 00:00:00 2001 From: Jonathan Jackson Date: Fri, 9 Mar 2018 18:27:14 -0600 Subject: [PATCH 52/55] if statement was redundant because the for statement will check the condition before the first iteration through the loop --- .../java/com/androidplot/util/SeriesUtils.java | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/androidplot-core/src/main/java/com/androidplot/util/SeriesUtils.java b/androidplot-core/src/main/java/com/androidplot/util/SeriesUtils.java index 1df07932..b9526a24 100644 --- a/androidplot-core/src/main/java/com/androidplot/util/SeriesUtils.java +++ b/androidplot-core/src/main/java/com/androidplot/util/SeriesUtils.java @@ -96,15 +96,13 @@ public static RectRegion minMax(XYConstraints constraints, XYSeries... seriesArr continue; } } - if (series.size() > 0) { - for (int i = 0; i < series.size(); i++) { - final Number xi = series.getX(i); - final Number yi = series.getY(i); + for (int i = 0; i < series.size(); i++) { + final Number xi = series.getX(i); + final Number yi = series.getY(i); - // if constraints have been set, make sure this xy coordinate exists within them: - if (constraints == null || constraints.contains(xi, yi)) { - bounds.union(xi, yi); - } + // if constraints have been set, make sure this xy coordinate exists within them: + if (constraints == null || constraints.contains(xi, yi)) { + bounds.union(xi, yi); } } } From b61f83b9726988eef74d7ba4fb8e5a848c85de42 Mon Sep 17 00:00:00 2001 From: Jonathan Jackson Date: Sat, 10 Mar 2018 17:11:03 -0600 Subject: [PATCH 53/55] Stylize *Androidplot* and *renderThread* --- androidplot-core/src/main/java/com/androidplot/Plot.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/androidplot-core/src/main/java/com/androidplot/Plot.java b/androidplot-core/src/main/java/com/androidplot/Plot.java index 0138bd7f..5e009635 100644 --- a/androidplot-core/src/main/java/com/androidplot/Plot.java +++ b/androidplot-core/src/main/java/com/androidplot/Plot.java @@ -421,7 +421,7 @@ public void run() { } pingPong.recycle(); } - }, "Android Plot Render Thread"); + }, "Androidplot renderThread"); } } From 5926f26bc2140fce78d7992adce407e89f3f54d5 Mon Sep 17 00:00:00 2001 From: Jonathan Jackson Date: Sat, 10 Mar 2018 17:16:34 -0600 Subject: [PATCH 54/55] Name all threads for debugging --- .../src/main/java/com/androidplot/util/Redrawer.java | 2 +- .../src/main/java/com/androidplot/xy/SampledXYSeries.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/androidplot-core/src/main/java/com/androidplot/util/Redrawer.java b/androidplot-core/src/main/java/com/androidplot/util/Redrawer.java index 6cf3b4eb..4bc118e0 100644 --- a/androidplot-core/src/main/java/com/androidplot/util/Redrawer.java +++ b/androidplot-core/src/main/java/com/androidplot/util/Redrawer.java @@ -58,7 +58,7 @@ public Redrawer(List plots, float maxRefreshRate, boolean startImmediately this.plots.add(new WeakReference<>(plot)); } setMaxRefreshRate(maxRefreshRate); - thread = new Thread(this); + thread = new Thread(this, "Androidplot Redrawer"); thread.start(); if(startImmediately) { start(); diff --git a/androidplot-core/src/main/java/com/androidplot/xy/SampledXYSeries.java b/androidplot-core/src/main/java/com/androidplot/xy/SampledXYSeries.java index b10903b1..f795536b 100644 --- a/androidplot-core/src/main/java/com/androidplot/xy/SampledXYSeries.java +++ b/androidplot-core/src/main/java/com/androidplot/xy/SampledXYSeries.java @@ -89,7 +89,7 @@ public void run() { lastResamplingException = ex; } } - }); + }, "Androidplot XY Series Sampler"); getZoomLevels().add(thisSeries); threads.add(thread); thread.start(); From 3160f4d78bc580d2de886a6fdf96a4738f98154a Mon Sep 17 00:00:00 2001 From: Jonathan Jackson Date: Sat, 10 Mar 2018 17:19:01 -0600 Subject: [PATCH 55/55] Fix inverted range values on XY Plots - regression introduced in 02cdc94b04be2170fcff1dfc61a24dae81f852a3 --- .../src/main/java/com/androidplot/xy/XYGraphWidget.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java b/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java index 80a9be84..23506f64 100644 --- a/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java +++ b/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java @@ -666,7 +666,10 @@ protected void drawGrid(Canvas canvas) { final double kMax = (gridRect.bottom - rangeOriginPix + FUDGE) / rangeStepPix; for (int k = (int) Math.ceil(kMin); k <= kMax; k++) { - double yVal = rangeOrigin.doubleValue() + k * rangeStep.getStepVal(); + // Android vertical coordinates (zero at the top of the screen) are the opposite + // direction of default range values (lowest on bottom of screen) so we subtract when + // calculating yVal + double yVal = rangeOrigin.doubleValue() - k * rangeStep.getStepVal(); double yPix = rangeOriginPix + k * rangeStepPix; boolean isMajorTick = k % getLinesPerRangeLabel() == ZERO; boolean isOrigin = k == 0;