| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560 |
- //
- // Graphs.swift
- // LoopFollow
- //
- // Created by Jon Fawcett on 6/16/20.
- // Copyright © 2020 Jon Fawcett. All rights reserved.
- //
- import Foundation
- import Charts
- import UIKit
- let ScaleXMax:Float = 150.0
- extension MainViewController {
-
- func chartValueSelected(_ chartView: ChartViewBase, entry: ChartDataEntry, highlight: Highlight) {
- if chartView == BGChartFull {
- BGChart.moveViewToX(entry.x)
- }
- }
-
- func chartTranslated(_ chartView: ChartViewBase, dX: CGFloat, dY: CGFloat) {
- if chartView == BGChart {
- let currentMatrix = chartView.viewPortHandler.touchMatrix
- //BGChartFull.viewPortHandler.refresh(newMatrix: currentMatrix, chart: BGChartFull, invalidate: true)
- //BGChartFull.highlightValue(x: Double(currentMatrix.tx), y: Double(currentMatrix.ty), dataSetIndex: 0)
- }
- }
-
- func chartScaled(_ chartView: ChartViewBase, scaleX: CGFloat, scaleY: CGFloat) {
- print("Chart Scaled: \(BGChart.scaleX), \(BGChart.scaleY)")
-
- // dont store huge values
- var scale: Float = Float(BGChart.scaleX)
- if(scale > ScaleXMax ) {
- scale = ScaleXMax
- }
- UserDefaultsRepository.chartScaleX.value = Float(scale)
- }
-
- func createGraph(){
- self.BGChart.clear()
-
- // Create the BG Graph Data
- let entries = bgData
- var bgChartEntry = [ChartDataEntry]()
- var colors = [NSUIColor]()
- var maxBG: Float = UserDefaultsRepository.minBGScale.value
-
- // Setup BG line details
- let lineBG = LineChartDataSet(entries:bgChartEntry, label: "")
- lineBG.circleRadius = 3
- lineBG.circleColors = [NSUIColor.systemGreen]
- lineBG.drawCircleHoleEnabled = false
- lineBG.axisDependency = YAxis.AxisDependency.right
- lineBG.highlightEnabled = true
- lineBG.drawValuesEnabled = false
-
- if UserDefaultsRepository.showLines.value {
- lineBG.lineWidth = 2
- } else {
- lineBG.lineWidth = 0
- }
- if UserDefaultsRepository.showDots.value {
- lineBG.drawCirclesEnabled = true
- } else {
- lineBG.drawCirclesEnabled = false
- }
- lineBG.setDrawHighlightIndicators(false)
- lineBG.valueFont.withSize(50)
-
- // Setup Prediction line details
- var predictionChartEntry = [ChartDataEntry]()
- let linePrediction = LineChartDataSet(entries:predictionChartEntry, label: "")
- linePrediction.circleRadius = 3
- linePrediction.circleColors = [NSUIColor.systemPurple]
- linePrediction.colors = [NSUIColor.systemPurple]
- linePrediction.drawCircleHoleEnabled = false
- linePrediction.axisDependency = YAxis.AxisDependency.right
- linePrediction.highlightEnabled = true
- linePrediction.drawValuesEnabled = false
-
- if UserDefaultsRepository.showLines.value {
- linePrediction.lineWidth = 2
- } else {
- linePrediction.lineWidth = 0
- }
- if UserDefaultsRepository.showDots.value {
- linePrediction.drawCirclesEnabled = true
- } else {
- linePrediction.drawCirclesEnabled = false
- }
- linePrediction.setDrawHighlightIndicators(false)
- linePrediction.valueFont.withSize(50)
-
-
- // create Basal graph data
- var chartEntry = [ChartDataEntry]()
- var maxBasal = UserDefaultsRepository.minBasalScale.value
- let lineBasal = LineChartDataSet(entries:chartEntry, label: "")
- lineBasal.setDrawHighlightIndicators(false)
- lineBasal.setColor(NSUIColor.systemBlue, alpha: 0.5)
- lineBasal.lineWidth = 0
- lineBasal.drawFilledEnabled = true
- lineBasal.fillColor = NSUIColor.systemBlue.withAlphaComponent(0.8)
- lineBasal.drawCirclesEnabled = false
- lineBasal.axisDependency = YAxis.AxisDependency.left
- lineBasal.highlightEnabled = true
- lineBasal.drawValuesEnabled = false
-
- // Boluses
- var chartEntryBolus = [ChartDataEntry]()
- let lineBolus = LineChartDataSet(entries:chartEntryBolus, label: "")
- lineBolus.circleRadius = 7
- lineBolus.circleColors = [NSUIColor.systemBlue.withAlphaComponent(0.75)]
- lineBolus.drawCircleHoleEnabled = false
- lineBolus.setDrawHighlightIndicators(false)
- lineBolus.setColor(NSUIColor.systemBlue, alpha: 1.0)
- lineBolus.drawCirclesEnabled = true
- lineBolus.lineWidth = 0
- lineBolus.highlightEnabled = false
- lineBolus.axisDependency = YAxis.AxisDependency.right
- lineBolus.valueFormatter = ChartYDataValueFormatter()
- lineBolus.drawValuesEnabled = true
- lineBolus.valueTextColor = NSUIColor.label
-
- // Carbs
- var chartEntryCarbs = [ChartDataEntry]()
- let lineCarbs = LineChartDataSet(entries:chartEntryCarbs, label: "")
- lineCarbs.circleRadius = 7
- lineCarbs.circleColors = [NSUIColor.systemOrange.withAlphaComponent(0.75)]
- lineCarbs.drawCircleHoleEnabled = false
- lineCarbs.setDrawHighlightIndicators(false)
- lineCarbs.setColor(NSUIColor.systemBlue, alpha: 1.0)
- lineCarbs.drawCirclesEnabled = true
- lineCarbs.lineWidth = 0
- lineCarbs.highlightEnabled = false
- lineCarbs.axisDependency = YAxis.AxisDependency.right
- lineCarbs.valueFormatter = ChartYDataValueFormatter()
- lineCarbs.drawValuesEnabled = true
- lineCarbs.valueTextColor = NSUIColor.label
-
- // create Scheduled Basal graph data
- var chartBasalScheduledEntry = [ChartDataEntry]()
- let lineBasalScheduled = LineChartDataSet(entries:chartBasalScheduledEntry, label: "")
- lineBasalScheduled.setDrawHighlightIndicators(false)
- lineBasalScheduled.setColor(NSUIColor.systemBlue, alpha: 0.8)
- lineBasalScheduled.lineWidth = 2
- lineBasalScheduled.drawFilledEnabled = false
- lineBasalScheduled.drawCirclesEnabled = false
- lineBasalScheduled.axisDependency = YAxis.AxisDependency.left
- lineBasalScheduled.highlightEnabled = false
- lineBasalScheduled.drawValuesEnabled = false
- lineBasalScheduled.lineDashLengths = [10.0, 5.0]
-
- // create Override graph data
- var chartOverrideEntry = [ChartDataEntry]()
- let lineOverride = LineChartDataSet(entries:chartOverrideEntry, label: "")
- lineOverride.setDrawHighlightIndicators(false)
- lineOverride.setColor(NSUIColor.systemTeal, alpha: 0.8 )
- lineOverride.lineWidth = 10
- lineOverride.drawFilledEnabled = false
- lineOverride.drawCirclesEnabled = false
- lineOverride.axisDependency = YAxis.AxisDependency.right
- lineOverride.highlightEnabled = true
- lineOverride.drawValuesEnabled = false
-
- // Setup the chart data of all lines
- let data = LineChartData()
- data.addDataSet(lineBG) // Dataset 0
- data.addDataSet(linePrediction) // Dataset 1
- data.addDataSet(lineBasal) // Dataset 2
- data.addDataSet(lineBolus) // Dataset 3
- data.addDataSet(lineCarbs) // Dataset 4
- data.addDataSet(lineBasalScheduled) // Dataset 5
- data.addDataSet(lineOverride) // Dataset 6
-
- data.setValueFont(UIFont.systemFont(ofSize: 12))
-
- // Add marker popups for bolus and carbs
- let marker = PillMarker(color: .secondarySystemBackground, font: UIFont.boldSystemFont(ofSize: 14), textColor: .label)
- BGChart.marker = marker
-
- // Clear limit lines so they don't add multiples when changing the settings
- BGChart.rightAxis.removeAllLimitLines()
-
- //Add lower red line based on low alert value
- let ll = ChartLimitLine()
- ll.limit = Double(UserDefaultsRepository.lowLine.value)
- ll.lineColor = NSUIColor.systemRed.withAlphaComponent(0.5)
- BGChart.rightAxis.addLimitLine(ll)
-
- //Add upper yellow line based on low alert value
- let ul = ChartLimitLine()
- ul.limit = Double(UserDefaultsRepository.highLine.value)
- ul.lineColor = NSUIColor.systemYellow.withAlphaComponent(0.5)
- BGChart.rightAxis.addLimitLine(ul)
-
- // Setup the main graph overall details
- BGChart.xAxis.valueFormatter = ChartXValueFormatter()
- BGChart.xAxis.granularity = 1800
- BGChart.xAxis.labelTextColor = NSUIColor.label
- BGChart.xAxis.labelPosition = XAxis.LabelPosition.bottom
- BGChart.xAxis.drawGridLinesEnabled = false
-
- BGChart.leftAxis.enabled = true
- BGChart.leftAxis.labelPosition = YAxis.LabelPosition.insideChart
- BGChart.leftAxis.axisMaximum = maxBasal
- BGChart.leftAxis.axisMinimum = 0.0
- BGChart.leftAxis.drawGridLinesEnabled = false
-
- BGChart.rightAxis.labelTextColor = NSUIColor.label
- BGChart.rightAxis.labelPosition = YAxis.LabelPosition.insideChart
- BGChart.rightAxis.axisMinimum = Double(UserDefaultsRepository.minBGValue.value)
- BGChart.rightAxis.axisMaximum = Double(maxBG)
- BGChart.rightAxis.gridLineDashLengths = [5.0, 5.0]
- BGChart.rightAxis.valueFormatter = ChartYMMOLValueFormatter()
-
- BGChart.legend.enabled = false
- BGChart.scaleYEnabled = false
- BGChart.drawGridBackgroundEnabled = false
- //BGChart.gridBackgroundColor = NSUIColor.secondarySystemBackground
-
-
- BGChart.data = data
- BGChart.setExtraOffsets(left: 10, top: 10, right: 10, bottom: 10)
-
- }
-
- func updateBGGraphSettings() {
- let dataIndex = 0
- let dataIndexPrediction = 1
- let lineBG = BGChart.lineData!.dataSets[dataIndex] as! LineChartDataSet
- let linePrediction = BGChart.lineData!.dataSets[dataIndexPrediction] as! LineChartDataSet
- if UserDefaultsRepository.showLines.value {
- lineBG.lineWidth = 2
- linePrediction.lineWidth = 2
- } else {
- lineBG.lineWidth = 0
- linePrediction.lineWidth = 0
- }
- if UserDefaultsRepository.showDots.value {
- lineBG.drawCirclesEnabled = true
- linePrediction.drawCirclesEnabled = true
- } else {
- lineBG.drawCirclesEnabled = false
- linePrediction.drawCirclesEnabled = false
- }
-
- BGChart.rightAxis.axisMinimum = Double(UserDefaultsRepository.minBGValue.value)
-
- // Clear limit lines so they don't add multiples when changing the settings
- BGChart.rightAxis.removeAllLimitLines()
-
- //Add lower red line based on low alert value
- let ll = ChartLimitLine()
- ll.limit = Double(UserDefaultsRepository.lowLine.value)
- ll.lineColor = NSUIColor.systemRed.withAlphaComponent(0.5)
- BGChart.rightAxis.addLimitLine(ll)
-
- //Add upper yellow line based on low alert value
- let ul = ChartLimitLine()
- ul.limit = Double(UserDefaultsRepository.highLine.value)
- ul.lineColor = NSUIColor.systemYellow.withAlphaComponent(0.5)
- BGChart.rightAxis.addLimitLine(ul)
-
- BGChart.data?.dataSets[dataIndex].notifyDataSetChanged()
- BGChart.data?.notifyDataChanged()
- BGChart.notifyDataSetChanged()
-
- }
-
- func updateBGGraph() {
- let dataIndex = 0
- let entries = bgData
- var mainChart = BGChart.lineData!.dataSets[dataIndex] as! LineChartDataSet
- var smallChart = BGChartFull.lineData!.dataSets[dataIndex] as! LineChartDataSet
- mainChart.clear()
- smallChart.clear()
- var maxBG = UserDefaultsRepository.minBGScale.value
- var maxBGOffset: Float = 0.0
- if UserDefaultsRepository.offsetCarbsBolus.value {
- maxBGOffset = 40.0
- }
- var colors = [NSUIColor]()
- for i in 0..<entries.count{
- if Float(entries[i].sgv) > maxBG - maxBGOffset {
- maxBG = Float(entries[i].sgv) + maxBGOffset
- }
- let value = ChartDataEntry(x: Double(entries[i].date), y: Double(entries[i].sgv))
- mainChart.addEntry(value)
- smallChart.addEntry(value)
-
- if Double(entries[i].sgv) >= Double(UserDefaultsRepository.highLine.value) {
- colors.append(NSUIColor.systemYellow)
- } else if Double(entries[i].sgv) <= Double(UserDefaultsRepository.lowLine.value) {
- colors.append(NSUIColor.systemRed)
- } else {
- colors.append(NSUIColor.systemGreen)
- }
- }
-
-
- // Set Colors
- let lineBG = BGChart.lineData!.dataSets[dataIndex] as! LineChartDataSet
- let lineBGSmall = BGChartFull.lineData!.dataSets[dataIndex] as! LineChartDataSet
- lineBG.colors.removeAll()
- lineBG.circleColors.removeAll()
- lineBGSmall.colors.removeAll()
- lineBGSmall.circleColors.removeAll()
- if colors.count > 0 {
- if UserDefaultsRepository.debugLog.value { self.writeDebugLog(value: "Graph: colors") }
- for i in 0..<colors.count{
- mainChart.addColor(colors[i])
- mainChart.circleColors.append(colors[i])
- smallChart.addColor(colors[i])
- smallChart.circleColors.append(colors[i])
- }
- }
-
- BGChart.rightAxis.axisMaximum = Double(maxBG)
- BGChart.setVisibleXRangeMinimum(600)
- BGChart.data?.dataSets[dataIndex].notifyDataSetChanged()
- BGChart.data?.notifyDataChanged()
- BGChart.notifyDataSetChanged()
- BGChartFull.data?.dataSets[dataIndex].notifyDataSetChanged()
- BGChartFull.data?.notifyDataChanged()
- BGChartFull.notifyDataSetChanged()
-
- if firstGraphLoad {
- var scaleX = CGFloat(UserDefaultsRepository.chartScaleX.value)
- print("Scale: \(scaleX)")
- if( scaleX > CGFloat(ScaleXMax) ) {
- scaleX = CGFloat(ScaleXMax)
- UserDefaultsRepository.chartScaleX.value = ScaleXMax
- }
- BGChart.zoom(scaleX: scaleX, scaleY: 1, x: 1, y: 1)
- firstGraphLoad = false
- }
- if BGChart.chartXMax > dateTimeUtils.getNowTimeIntervalUTC() {
- BGChart.moveViewToAnimated(xValue: dateTimeUtils.getNowTimeIntervalUTC() - (BGChart.visibleXRange * 0.7), yValue: 0.0, axis: .right, duration: 1, easingOption: .easeInBack)
- }
- }
-
- func updatePredictionGraph() {
- let dataIndex = 1
- var mainChart = BGChart.lineData!.dataSets[dataIndex] as! LineChartDataSet
- var smallChart = BGChartFull.lineData!.dataSets[dataIndex] as! LineChartDataSet
- mainChart.clear()
- smallChart.clear()
- if UserDefaultsRepository.debugLog.value { self.writeDebugLog(value: "Graph: print prediction") }
- var colors = [NSUIColor]()
- for i in 0..<predictionData.count {
- var predictionVal = Double(predictionData[i].sgv)
- // Below can be turned on to prevent out of range on the graph if desired.
- // It currently just drops them out of view
- if predictionVal > 400 {
- predictionVal = 400
- colors.append(NSUIColor.systemYellow)
- } else if predictionVal < 0 {
- predictionVal = 0
- colors.append(NSUIColor.systemRed)
- } else {
- colors.append(NSUIColor.systemPurple)
- }
- let value = ChartDataEntry(x: predictionData[i].date, y: predictionVal)
- mainChart.addEntry(value)
- smallChart.addEntry(value)
- }
-
- smallChart.circleColors.removeAll()
- smallChart.colors.removeAll()
- mainChart.colors.removeAll()
- mainChart.circleColors.removeAll()
- if colors.count > 0 {
- if UserDefaultsRepository.debugLog.value { self.writeDebugLog(value: "Graph: prediction colors") }
- for i in 0..<colors.count{
- mainChart.addColor(colors[i])
- mainChart.circleColors.append(colors[i])
- smallChart.addColor(colors[i])
- smallChart.circleColors.append(colors[i])
- }
- }
- BGChart.data?.dataSets[dataIndex].notifyDataSetChanged()
- BGChart.data?.notifyDataChanged()
- BGChart.notifyDataSetChanged()
- BGChartFull.data?.dataSets[dataIndex].notifyDataSetChanged()
- BGChartFull.data?.notifyDataChanged()
- BGChartFull.notifyDataSetChanged()
- }
-
- func updateBasalGraph() {
- var dataIndex = 2
- BGChart.lineData?.dataSets[dataIndex].clear()
- var maxBasal = UserDefaultsRepository.minBasalScale.value
- for i in 0..<basalData.count{
- let value = ChartDataEntry(x: Double(basalData[i].date), y: Double(basalData[i].basalRate))
- BGChart.data?.dataSets[dataIndex].addEntry(value)
- if basalData[i].basalRate > maxBasal {
- maxBasal = basalData[i].basalRate
- }
- }
-
- BGChart.leftAxis.axisMaximum = maxBasal
-
- BGChart.data?.dataSets[dataIndex].notifyDataSetChanged()
- BGChart.data?.notifyDataChanged()
- BGChart.notifyDataSetChanged()
- }
-
- func updateBasalScheduledGraph() {
- var dataIndex = 5
- BGChart.lineData?.dataSets[dataIndex].clear()
- for i in 0..<basalScheduleData.count{
- let value = ChartDataEntry(x: Double(basalScheduleData[i].date), y: Double(basalScheduleData[i].basalRate))
- BGChart.data?.dataSets[dataIndex].addEntry(value)
- }
-
- BGChart.data?.dataSets[dataIndex].notifyDataSetChanged()
- BGChart.data?.notifyDataChanged()
- BGChart.notifyDataSetChanged()
- }
-
- func updateBolusGraph() {
- var dataIndex = 3
- BGChart.lineData?.dataSets[dataIndex].clear()
- for i in 0..<bolusData.count{
- let formatter = NumberFormatter()
- formatter.minimumFractionDigits = 0
- formatter.maximumFractionDigits = 2
- formatter.minimumIntegerDigits = 1
- var offset = 0
- if UserDefaultsRepository.offsetCarbsBolus.value {
- offset = 10
- }
- let value = ChartDataEntry(x: Double(bolusData[i].date), y: Double(bolusData[i].sgv + offset), data: formatter.string(from: NSNumber(value: bolusData[i].value)))
- BGChart.data?.dataSets[dataIndex].addEntry(value)
- }
-
- BGChart.data?.dataSets[dataIndex].notifyDataSetChanged()
- BGChart.data?.notifyDataChanged()
- BGChart.notifyDataSetChanged()
- }
-
- func updateCarbGraph() {
- var dataIndex = 4
- BGChart.lineData?.dataSets[dataIndex].clear()
- for i in 0..<carbData.count{
- let formatter = NumberFormatter()
- formatter.minimumFractionDigits = 0
- formatter.maximumFractionDigits = 2
- formatter.minimumIntegerDigits = 1
- var offset = 0
- if UserDefaultsRepository.offsetCarbsBolus.value {
- offset = 30
- }
- let value = ChartDataEntry(x: Double(carbData[i].date), y: Double(carbData[i].sgv + offset), data: formatter.string(from: NSNumber(value: carbData[i].value)))
- BGChart.data?.dataSets[dataIndex].addEntry(value)
- }
-
- BGChart.data?.dataSets[dataIndex].notifyDataSetChanged()
- BGChart.data?.notifyDataChanged()
- BGChart.notifyDataSetChanged()
- }
-
-
-
- func createSmallBGGraph(){
- let entries = bgData
- var bgChartEntry = [ChartDataEntry]()
- var colors = [NSUIColor]()
-
-
- let lineBG = LineChartDataSet(entries:bgChartEntry, label: "")
-
- lineBG.drawCirclesEnabled = false
- //line2.setDrawHighlightIndicators(false)
- lineBG.highlightEnabled = true
- lineBG.drawHorizontalHighlightIndicatorEnabled = false
- lineBG.drawVerticalHighlightIndicatorEnabled = false
- lineBG.highlightColor = NSUIColor.label
- lineBG.drawValuesEnabled = false
- lineBG.lineWidth = 2
-
- // Setup Prediction line details
- var predictionChartEntry = [ChartDataEntry]()
- let linePrediction = LineChartDataSet(entries:predictionChartEntry, label: "")
- linePrediction.drawCirclesEnabled = false
- //line2.setDrawHighlightIndicators(false)
- linePrediction.setColor(NSUIColor.systemPurple)
- linePrediction.highlightEnabled = true
- linePrediction.drawHorizontalHighlightIndicatorEnabled = false
- linePrediction.drawVerticalHighlightIndicatorEnabled = false
- linePrediction.highlightColor = NSUIColor.label
- linePrediction.drawValuesEnabled = false
- linePrediction.lineWidth = 2
-
- let data = LineChartData()
- data.addDataSet(lineBG)
- data.addDataSet(linePrediction)
- BGChartFull.highlightPerDragEnabled = true
- BGChartFull.leftAxis.enabled = false
- BGChartFull.rightAxis.enabled = false
- BGChartFull.xAxis.enabled = false
- BGChartFull.legend.enabled = false
- BGChartFull.scaleYEnabled = false
- BGChartFull.scaleXEnabled = false
- BGChartFull.drawGridBackgroundEnabled = false
- BGChartFull.data = data
- }
-
-
- func updateOverrideGraph() {
- var dataIndex = 6
- var chart = BGChart.lineData!.dataSets[dataIndex] as! LineChartDataSet
- chart.clear()
-
- var colors = [NSUIColor]()
- for i in 0..<overrideData.count{
- let value = ChartDataEntry(x: Double(overrideData[i].date), y: Double(overrideData[i].sgv), data: overrideData[i].value)
- BGChart.data?.dataSets[dataIndex].addEntry(value)
-
- if Double(overrideData[i].value) == 1.0 {
- colors.append(NSUIColor.systemGray.withAlphaComponent(0.0))
- } else if i >= overrideData.count - 2 {
- colors.append(NSUIColor.systemGreen)
- } else {
- colors.append(NSUIColor.systemGray.withAlphaComponent(CGFloat(overrideData[i].value / 2)))
- }
- }
-
- // Set Colors
- let line = BGChart.lineData!.dataSets[dataIndex] as! LineChartDataSet
- line.colors.removeAll()
- line.circleColors.removeAll()
-
- if colors.count > 0 {
- for i in 0..<colors.count{
- chart.addColor(colors[i])
- chart.circleColors.append(colors[i])
- }
- }
-
- BGChart.data?.dataSets[dataIndex].notifyDataSetChanged()
- BGChart.data?.notifyDataChanged()
- BGChart.notifyDataSetChanged()
- }
-
- }
|