From ce88fa8ab0917e60507b276febb2b781a7a39401 Mon Sep 17 00:00:00 2001 From: Ishan Joshi Date: Thu, 9 Jul 2020 14:04:05 +1000 Subject: [PATCH 1/5] fix: enable being detected by screenreader --- .../com/github/mikephil/charting/charts/Chart.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/MPChartLib/src/main/java/com/github/mikephil/charting/charts/Chart.java b/MPChartLib/src/main/java/com/github/mikephil/charting/charts/Chart.java index 8ea56d6cfd..880c7affbc 100644 --- a/MPChartLib/src/main/java/com/github/mikephil/charting/charts/Chart.java +++ b/MPChartLib/src/main/java/com/github/mikephil/charting/charts/Chart.java @@ -229,9 +229,11 @@ public void onAnimationUpdate(ValueAnimator animation) { mInfoPaint.setTextSize(Utils.convertDpToPixel(12f)); if (mLogEnabled) { - Log.i("", "Chart.init()"); - } - } + Log.i("", "Chart.init()"); + + // enable being detected by ScreenReader + setFocusable(true); + }} // public void initWithDummyData() { // ColorTemplate template = new ColorTemplate(); @@ -1649,4 +1651,9 @@ private void unbindDrawables(View view) { public void setUnbindEnabled(boolean enabled) { this.mUnbind = enabled; } + + // region accessibility + + + // endregion } From 489e02028e240b66cdfcf17b3382faf73b3d9191 Mon Sep 17 00:00:00 2001 From: Ishan Joshi Date: Thu, 9 Jul 2020 14:54:53 +1000 Subject: [PATCH 2/5] add: stub message and verified it is read by screenreader --- .../mikephil/charting/charts/BarChart.java | 5 +++++ .../mikephil/charting/charts/BubbleChart.java | 5 +++++ .../charting/charts/CandleStickChart.java | 5 +++++ .../mikephil/charting/charts/Chart.java | 22 +++++++++++++++++++ .../charting/charts/CombinedChart.java | 4 ++++ .../mikephil/charting/charts/LineChart.java | 5 +++++ .../mikephil/charting/charts/PieChart.java | 5 +++++ .../mikephil/charting/charts/RadarChart.java | 5 +++++ .../charting/charts/ScatterChart.java | 5 +++++ 9 files changed, 61 insertions(+) diff --git a/MPChartLib/src/main/java/com/github/mikephil/charting/charts/BarChart.java b/MPChartLib/src/main/java/com/github/mikephil/charting/charts/BarChart.java index 838ff7f454..bc8db05ed1 100644 --- a/MPChartLib/src/main/java/com/github/mikephil/charting/charts/BarChart.java +++ b/MPChartLib/src/main/java/com/github/mikephil/charting/charts/BarChart.java @@ -275,4 +275,9 @@ public void setRoundedBarRadius(float mRoundedBarRadius) { this.mDrawRoundedBars = true; init(); } + + @Override + public String getAccessibilityDescription() { + return "This is a bar chart"; + } } diff --git a/MPChartLib/src/main/java/com/github/mikephil/charting/charts/BubbleChart.java b/MPChartLib/src/main/java/com/github/mikephil/charting/charts/BubbleChart.java index 23dac5780f..1510d85f01 100644 --- a/MPChartLib/src/main/java/com/github/mikephil/charting/charts/BubbleChart.java +++ b/MPChartLib/src/main/java/com/github/mikephil/charting/charts/BubbleChart.java @@ -40,4 +40,9 @@ protected void init() { public BubbleData getBubbleData() { return mData; } + + @Override + public String getAccessibilityDescription() { + return "This is bubble chart"; + } } diff --git a/MPChartLib/src/main/java/com/github/mikephil/charting/charts/CandleStickChart.java b/MPChartLib/src/main/java/com/github/mikephil/charting/charts/CandleStickChart.java index fa36e3522f..5541cbff6c 100644 --- a/MPChartLib/src/main/java/com/github/mikephil/charting/charts/CandleStickChart.java +++ b/MPChartLib/src/main/java/com/github/mikephil/charting/charts/CandleStickChart.java @@ -41,4 +41,9 @@ protected void init() { public CandleData getCandleData() { return mData; } + + @Override + public String getAccessibilityDescription() { + return "This is a candlestick"; + } } diff --git a/MPChartLib/src/main/java/com/github/mikephil/charting/charts/Chart.java b/MPChartLib/src/main/java/com/github/mikephil/charting/charts/Chart.java index 880c7affbc..e11dab819f 100644 --- a/MPChartLib/src/main/java/com/github/mikephil/charting/charts/Chart.java +++ b/MPChartLib/src/main/java/com/github/mikephil/charting/charts/Chart.java @@ -21,6 +21,7 @@ import android.view.View; import android.view.ViewGroup; import android.view.ViewParent; +import android.view.accessibility.AccessibilityEvent; import com.github.mikephil.charting.animation.ChartAnimator; import com.github.mikephil.charting.animation.Easing.EasingFunction; @@ -170,6 +171,11 @@ public abstract class Chart and completed as " + completed); + + event.getText().add(getAccessibilityDescription()); + + return true; + } // endregion } diff --git a/MPChartLib/src/main/java/com/github/mikephil/charting/charts/CombinedChart.java b/MPChartLib/src/main/java/com/github/mikephil/charting/charts/CombinedChart.java index ab4504abaf..8a1656f5b8 100644 --- a/MPChartLib/src/main/java/com/github/mikephil/charting/charts/CombinedChart.java +++ b/MPChartLib/src/main/java/com/github/mikephil/charting/charts/CombinedChart.java @@ -266,4 +266,8 @@ protected void drawMarkers(Canvas canvas) { } } + @Override + public String getAccessibilityDescription() { + return "This is a combined chart"; + } } diff --git a/MPChartLib/src/main/java/com/github/mikephil/charting/charts/LineChart.java b/MPChartLib/src/main/java/com/github/mikephil/charting/charts/LineChart.java index aa7afc4c85..3dbc4db909 100644 --- a/MPChartLib/src/main/java/com/github/mikephil/charting/charts/LineChart.java +++ b/MPChartLib/src/main/java/com/github/mikephil/charting/charts/LineChart.java @@ -47,4 +47,9 @@ protected void onDetachedFromWindow() { } super.onDetachedFromWindow(); } + + @Override + public String getAccessibilityDescription() { + return "This is a line chart"; + } } diff --git a/MPChartLib/src/main/java/com/github/mikephil/charting/charts/PieChart.java b/MPChartLib/src/main/java/com/github/mikephil/charting/charts/PieChart.java index de11b3a844..73114a86ef 100644 --- a/MPChartLib/src/main/java/com/github/mikephil/charting/charts/PieChart.java +++ b/MPChartLib/src/main/java/com/github/mikephil/charting/charts/PieChart.java @@ -801,4 +801,9 @@ protected void onDetachedFromWindow() { } super.onDetachedFromWindow(); } + + @Override + public String getAccessibilityDescription() { + return "This is a pie chart"; + } } diff --git a/MPChartLib/src/main/java/com/github/mikephil/charting/charts/RadarChart.java b/MPChartLib/src/main/java/com/github/mikephil/charting/charts/RadarChart.java index a1a96507d4..524e222bb6 100644 --- a/MPChartLib/src/main/java/com/github/mikephil/charting/charts/RadarChart.java +++ b/MPChartLib/src/main/java/com/github/mikephil/charting/charts/RadarChart.java @@ -382,4 +382,9 @@ public float getYChartMin() { public float getYRange() { return mYAxis.mAxisRange; } + + @Override + public String getAccessibilityDescription() { + return "This is a Radar chart"; + } } diff --git a/MPChartLib/src/main/java/com/github/mikephil/charting/charts/ScatterChart.java b/MPChartLib/src/main/java/com/github/mikephil/charting/charts/ScatterChart.java index 37e8395b5e..231ed0288b 100644 --- a/MPChartLib/src/main/java/com/github/mikephil/charting/charts/ScatterChart.java +++ b/MPChartLib/src/main/java/com/github/mikephil/charting/charts/ScatterChart.java @@ -74,4 +74,9 @@ public static ScatterShape[] getAllDefaultShapes() { return new ScatterShape[]{SQUARE, CIRCLE, TRIANGLE, CROSS, X, CHEVRON_UP, CHEVRON_DOWN}; } } + + @Override + public String getAccessibilityDescription() { + return "This is scatter chart"; + } } From 98b2d964320350ea58b751be82e319cda769d597 Mon Sep 17 00:00:00 2001 From: Ishan Joshi Date: Thu, 9 Jul 2020 15:14:13 +1000 Subject: [PATCH 3/5] add: basic bar-chart description fix: entry label reading (was reading wrong value) --- .../mikephil/charting/charts/BarChart.java | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/MPChartLib/src/main/java/com/github/mikephil/charting/charts/BarChart.java b/MPChartLib/src/main/java/com/github/mikephil/charting/charts/BarChart.java index bc8db05ed1..f954721c27 100644 --- a/MPChartLib/src/main/java/com/github/mikephil/charting/charts/BarChart.java +++ b/MPChartLib/src/main/java/com/github/mikephil/charting/charts/BarChart.java @@ -8,6 +8,7 @@ import com.github.mikephil.charting.components.YAxis; import com.github.mikephil.charting.data.BarData; import com.github.mikephil.charting.data.BarEntry; +import com.github.mikephil.charting.formatter.IAxisValueFormatter; import com.github.mikephil.charting.highlight.BarHighlighter; import com.github.mikephil.charting.highlight.Highlight; import com.github.mikephil.charting.interfaces.dataprovider.BarDataProvider; @@ -278,6 +279,29 @@ public void setRoundedBarRadius(float mRoundedBarRadius) { @Override public String getAccessibilityDescription() { - return "This is a bar chart"; + + BarData barData = getBarData(); + + int entryCount = barData.getEntryCount(); + + // Find the min and max index + IAxisValueFormatter yAxisValueFormatter = getAxisLeft().getValueFormatter(); + String minVal = yAxisValueFormatter.getFormattedValue(barData.getYMin(), null); + String maxVal = yAxisValueFormatter.getFormattedValue(barData.getYMax(), null); + + // Data range... + IAxisValueFormatter xAxisValueFormatter = getXAxis().getValueFormatter(); + String minRange = xAxisValueFormatter.getFormattedValue(barData.getXMin(), null); + String maxRange = xAxisValueFormatter.getFormattedValue(barData.getXMax(), null); + + String entries = entryCount == 1 ? "entry" : "entries"; + + // Format the values of min and max; to recite them back + + String description = String.format("The bar chart has %d %s. " + + "The minimum value is %s and maximum value is %s", + entryCount, entries, minVal, maxVal); + + return description; } } From 36a0ee27d4846533b0f4571ed9f752d25b621c20 Mon Sep 17 00:00:00 2001 From: Ishan Joshi Date: Fri, 10 Jul 2020 09:50:57 +1000 Subject: [PATCH 4/5] add: more descriptive text for BarChart.java add: support for user generated description --- .../mikephil/charting/charts/BarChart.java | 9 ++++++--- .../github/mikephil/charting/charts/Chart.java | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/MPChartLib/src/main/java/com/github/mikephil/charting/charts/BarChart.java b/MPChartLib/src/main/java/com/github/mikephil/charting/charts/BarChart.java index f954721c27..2efbd4093c 100644 --- a/MPChartLib/src/main/java/com/github/mikephil/charting/charts/BarChart.java +++ b/MPChartLib/src/main/java/com/github/mikephil/charting/charts/BarChart.java @@ -15,6 +15,8 @@ import com.github.mikephil.charting.interfaces.datasets.IBarDataSet; import com.github.mikephil.charting.renderer.BarChartRenderer; +import java.util.Locale; + /** * Chart that draws bars. * @@ -298,9 +300,10 @@ public String getAccessibilityDescription() { // Format the values of min and max; to recite them back - String description = String.format("The bar chart has %d %s. " + - "The minimum value is %s and maximum value is %s", - entryCount, entries, minVal, maxVal); + String description = String.format(Locale.getDefault(), "The bar chart has %d %s. " + + "The minimum value is %s and maximum value is %s." + + "Data ranges from %s to %s.", + entryCount, entries, minVal, maxVal, minRange, maxRange); return description; } diff --git a/MPChartLib/src/main/java/com/github/mikephil/charting/charts/Chart.java b/MPChartLib/src/main/java/com/github/mikephil/charting/charts/Chart.java index e11dab819f..e3250953e3 100644 --- a/MPChartLib/src/main/java/com/github/mikephil/charting/charts/Chart.java +++ b/MPChartLib/src/main/java/com/github/mikephil/charting/charts/Chart.java @@ -175,6 +175,11 @@ public abstract class Chart Date: Fri, 10 Jul 2020 17:27:23 +1000 Subject: [PATCH 5/5] add: pie chart information for screen-reader --- .../charting/charts/CandleStickChart.java | 2 +- .../mikephil/charting/charts/LineChart.java | 24 ++++++++++++++++++- .../mikephil/charting/charts/PieChart.java | 24 ++++++++++++++++++- 3 files changed, 47 insertions(+), 3 deletions(-) diff --git a/MPChartLib/src/main/java/com/github/mikephil/charting/charts/CandleStickChart.java b/MPChartLib/src/main/java/com/github/mikephil/charting/charts/CandleStickChart.java index 5541cbff6c..29ba92d56b 100644 --- a/MPChartLib/src/main/java/com/github/mikephil/charting/charts/CandleStickChart.java +++ b/MPChartLib/src/main/java/com/github/mikephil/charting/charts/CandleStickChart.java @@ -44,6 +44,6 @@ public CandleData getCandleData() { @Override public String getAccessibilityDescription() { - return "This is a candlestick"; + return "This is a candlestick chart"; } } diff --git a/MPChartLib/src/main/java/com/github/mikephil/charting/charts/LineChart.java b/MPChartLib/src/main/java/com/github/mikephil/charting/charts/LineChart.java index 3dbc4db909..db0536db27 100644 --- a/MPChartLib/src/main/java/com/github/mikephil/charting/charts/LineChart.java +++ b/MPChartLib/src/main/java/com/github/mikephil/charting/charts/LineChart.java @@ -5,9 +5,12 @@ import android.util.AttributeSet; import com.github.mikephil.charting.data.LineData; +import com.github.mikephil.charting.formatter.IAxisValueFormatter; import com.github.mikephil.charting.interfaces.dataprovider.LineDataProvider; import com.github.mikephil.charting.renderer.LineChartRenderer; +import java.util.Locale; + /** * Chart that draws lines, surfaces, circles, ... * @@ -50,6 +53,25 @@ protected void onDetachedFromWindow() { @Override public String getAccessibilityDescription() { - return "This is a line chart"; + LineData lineData = getLineData(); + + int numberOfPoints = lineData.getEntryCount(); + + // Min and max values... + IAxisValueFormatter yAxisValueFormmater = getAxisLeft().getValueFormatter(); + String minVal = yAxisValueFormmater.getFormattedValue(lineData.getYMin(), null); + String maxVal = yAxisValueFormmater.getFormattedValue(lineData.getYMax(), null); + + // Data range... + IAxisValueFormatter xAxisValueFormatter = getXAxis().getValueFormatter(); + String minRange = xAxisValueFormatter.getFormattedValue(lineData.getXMin(), null); + String maxRange = xAxisValueFormatter.getFormattedValue(lineData.getXMax(), null); + + String entries = numberOfPoints == 1 ? "entry" : "entries"; + + return String.format(Locale.getDefault(), "The line chart has %d %s. " + + "The minimum value is %s and maximum value is %s." + + "Data ranges from %s to %s.", + numberOfPoints, entries, minVal, maxVal, minRange, maxRange); } } diff --git a/MPChartLib/src/main/java/com/github/mikephil/charting/charts/PieChart.java b/MPChartLib/src/main/java/com/github/mikephil/charting/charts/PieChart.java index 73114a86ef..fd0c7a2839 100644 --- a/MPChartLib/src/main/java/com/github/mikephil/charting/charts/PieChart.java +++ b/MPChartLib/src/main/java/com/github/mikephil/charting/charts/PieChart.java @@ -6,10 +6,12 @@ import android.graphics.Paint; import android.graphics.RectF; import android.graphics.Typeface; +import android.text.TextUtils; import android.util.AttributeSet; import com.github.mikephil.charting.components.XAxis; import com.github.mikephil.charting.data.PieData; +import com.github.mikephil.charting.data.PieEntry; import com.github.mikephil.charting.highlight.Highlight; import com.github.mikephil.charting.highlight.PieHighlighter; import com.github.mikephil.charting.interfaces.datasets.IPieDataSet; @@ -17,7 +19,9 @@ import com.github.mikephil.charting.utils.MPPointF; import com.github.mikephil.charting.utils.Utils; +import java.util.ArrayList; import java.util.List; +import java.util.Locale; /** * View that represents a pie chart. Draws cake like slices. @@ -804,6 +808,24 @@ protected void onDetachedFromWindow() { @Override public String getAccessibilityDescription() { - return "This is a pie chart"; + + PieData pieData = getData(); + + int entryCount = pieData.getEntryCount(); + + StringBuilder builder = new StringBuilder(); + + builder.append(String.format(Locale.getDefault(), "The pie chart has %d entries.", + entryCount)); + + for (int i = 0; i < entryCount; i++) { + PieEntry entry = pieData.getDataSet().getEntryForIndex(i); + float percentage = (entry.getValue() / pieData.getYValueSum()) * 100; + builder.append(String.format(Locale.getDefault(), "%s has %.2f percent pie taken", + (TextUtils.isEmpty(entry.getLabel()) ? "No Label" : entry.getLabel()), + percentage)); + } + + return builder.toString(); } }