- provides chart UI component for showing graph data (ChartView) and additional controls which facilitate it (NavigatorChartView and ChartSelectorView)
- all UI components can be styled through application theme. Pre-defined light and dark themes are provided. Default attribute values are available as well
- the library is built using MVC pattern. All views use ChartModel - subscribe to its events and modify it
- every component's config is built using a dedicated Builder. LeonardoConfigFactory abstract factory facades them
- it's possible to customize text to use for axis labels by providing custom AxisLabelTextStrategy implementation. The library contains DefaultAxisLabelTextStrategy and TimeAxisLabelTextStrategy. Both of them are general purpose strategies, with the later targeted for time values
- library API supports unlimited input data sources, to make it possible working with (paged) historical data. However, current implementation works only with the limited data sets at the moment (as defined by the contest rules)
- it was not specified how to switch between the target charts. That's why it was implemented by using spinner for the chart's name. Just click on it to get a list of all five charts (the default value is Followers)
- even though dark/light theme change is supported in runtime without activity reloading, there is an artifact in the chart selector spinner's dropdown (as explained here). As it was not requested by contest rules, it was left as-is for now
- current solution is implemented in Java as required by contest rules. It should have been Kotlin instead
- current Java solution uses traute javac plugin to enforce null-checks in the generated bytecode
- current solution shows a little bit less data at the ledge plot edge in order to avoid plots intersecting Y axis labels. It did not look good otherwise
- source code repo is available at https://bitbucket.org/denis_zhdanov/telegram-contest-chart