Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,15 @@
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.ValueFormatter;
import com.github.mikephil.charting.highlight.BarHighlighter;
import com.github.mikephil.charting.highlight.Highlight;
import com.github.mikephil.charting.interfaces.dataprovider.BarDataProvider;
import com.github.mikephil.charting.interfaces.datasets.IBarDataSet;
import com.github.mikephil.charting.renderer.BarChartRenderer;

import java.util.Locale;

/**
* Chart that draws bars.
*
Expand Down Expand Up @@ -255,4 +258,33 @@ public void groupBars(float fromX, float groupSpace, float barSpace) {
notifyDataSetChanged();
}
}

@Override
public String getAccessibilityDescription() {

BarData barData = getBarData();

int entryCount = barData.getEntryCount();

// Find the min and max index
ValueFormatter yAxisValueFormmater = getAxisLeft().getValueFormatter();
String minVal = yAxisValueFormmater.getFormattedValue(barData.getYMin());
String maxVal = yAxisValueFormmater.getFormattedValue(barData.getYMax());

// Data range...
ValueFormatter xAxisValueFormatter = getXAxis().getValueFormatter();
String minRange = xAxisValueFormatter.getFormattedValue(barData.getXMin());
String maxRange = xAxisValueFormatter.getFormattedValue(barData.getXMax());

String entries = entryCount == 1 ? "entry" : "entries";

// Format the values of min and max; to recite them back

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;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -40,4 +40,9 @@ protected void init() {
public BubbleData getBubbleData() {
return mData;
}

@Override
public String getAccessibilityDescription() {
return "This is bubble chart";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -41,4 +41,9 @@ protected void init() {
public CandleData getCandleData() {
return mData;
}

@Override
public String getAccessibilityDescription() {
return "This is a candlestick";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,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;
Expand Down Expand Up @@ -176,6 +177,16 @@ public abstract class Chart<T extends ChartData<? extends IDataSet<? extends Ent
mExtraBottomOffset = 0.f,
mExtraLeftOffset = 0.f;

/**
* Tag for logging accessibility related content
*/
private String TAG = "abilityTag";

/**
* Additional data on top of dynamically generated description. This can be set by the user.
*/
private String accessibilitySummaryDescription = "";

/**
* default constructor for initialization in code
*/
Expand Down Expand Up @@ -237,6 +248,9 @@ public void onAnimationUpdate(ValueAnimator animation) {

if (mLogEnabled)
Log.i("", "Chart.init()");

// enable being detected by ScreenReader
setFocusable(true);
}

// public void initWithDummyData() {
Expand Down Expand Up @@ -1818,4 +1832,38 @@ private void unbindDrawables(View view) {
public void setUnbindEnabled(boolean enabled) {
this.mUnbind = enabled;
}

// region accessibility

/**
*
* @return accessibility description must be created for each chart
*/
public abstract String getAccessibilityDescription();

public String getAccessibilitySummaryDescription() {
return accessibilitySummaryDescription;
}

public void setAccessibilitySummaryDescription(String accessibilitySummaryDescription) {
this.accessibilitySummaryDescription = accessibilitySummaryDescription;
}

@Override
public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {

boolean completed = super.dispatchPopulateAccessibilityEvent(event);
Log.d(TAG, "Dispatch called for Chart <View> and completed as " + completed);

event.getText().add(getAccessibilityDescription());

// Add the user generated summary after the dynamic summary is complete.
if (!TextUtils.isEmpty(this.getAccessibilitySummaryDescription())) {
event.getText().add(this.getAccessibilitySummaryDescription());
}

return true;
}

// endregion
}
Original file line number Diff line number Diff line change
Expand Up @@ -269,4 +269,8 @@ protected void drawMarkers(Canvas canvas) {
}
}

@Override
public String getAccessibilityDescription() {
return "This is a combined chart";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,12 @@
import android.util.AttributeSet;

import com.github.mikephil.charting.data.LineData;
import com.github.mikephil.charting.formatter.ValueFormatter;
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, ...
*
Expand Down Expand Up @@ -47,4 +50,32 @@ protected void onDetachedFromWindow() {
}
super.onDetachedFromWindow();
}

@Override
public String getAccessibilityDescription() {

LineData lineData = getLineData();

int numberOfPoints = lineData.getEntryCount();

// Min and max values...
ValueFormatter yAxisValueFormmater = getAxisLeft().getValueFormatter();
String minVal = yAxisValueFormmater.getFormattedValue(lineData.getYMin());
String maxVal = yAxisValueFormmater.getFormattedValue(lineData.getYMax());

// Data range...
ValueFormatter xAxisValueFormatter = getXAxis().getValueFormatter();
String minRange = xAxisValueFormatter.getFormattedValue(lineData.getXMin());
String maxRange = xAxisValueFormatter.getFormattedValue(lineData.getXMax());

String entries = numberOfPoints == 1 ? "entry" : "entries";

String description = 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);


return description;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,23 @@
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.formatter.ValueFormatter;
import com.github.mikephil.charting.highlight.Highlight;
import com.github.mikephil.charting.highlight.PieHighlighter;
import com.github.mikephil.charting.interfaces.datasets.IPieDataSet;
import com.github.mikephil.charting.renderer.PieChartRenderer;
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.
Expand Down Expand Up @@ -801,4 +806,27 @@ protected void onDetachedFromWindow() {
}
super.onDetachedFromWindow();
}

@Override
public String getAccessibilityDescription() {

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();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -359,4 +359,9 @@ public float getYChartMin() {
public float getYRange() {
return mYAxis.mAxisRange;
}

@Override
public String getAccessibilityDescription() {
return "This is a Radar chart";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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";
}
}