package com.fascilityconnex.voicemobile.ui.home.adapter import android.content.Context import android.graphics.Color import android.view.LayoutInflater import android.view.MotionEvent import android.view.View import android.view.ViewGroup import android.widget.Toast import androidx.core.content.ContextCompat import androidx.databinding.DataBindingUtil import androidx.recyclerview.widget.RecyclerView import com.fascilityconnex.voicemobile.R import com.fascilityconnex.voicemobile.database.entity.HistorianDataSample import com.fascilityconnex.voicemobile.database.entity.HistorianDataSourceModel import com.fascilityconnex.voicemobile.databinding.KpiRecyclerviewListItemBinding import com.fascilityconnex.voicemobile.ui.home.model.kpilistmodel.KpiListModel import com.fascilityconnex.voicemobile.util.DateUtil import com.fascilityconnex.voicemobile.util.FcxLog import com.scichart.charting.model.dataSeries.IXyDataSeries import com.scichart.charting.modifiers.GestureModifierBase import com.scichart.charting.visuals.axes.DateAxis import com.scichart.charting.visuals.axes.NumericAxis import com.scichart.core.framework.UpdateSuspender import com.scichart.drawing.utility.ColorUtil import com.scichart.extensions.builders.SciChartBuilder import java.util.* import kotlin.collections.ArrayList class KpiListAdapter( private var historianDataSourceModel: ArrayList, private var historianDataSample: ArrayList, private var kpilistModel: ArrayList, val kpiclickListner: KPIListClickListener, ) : RecyclerView.Adapter() { var mRecyclerView: RecyclerView? = null private lateinit var sciChartBuilder: SciChartBuilder private var context: Context? = null inner class KpiListViewHolder(val binding: KpiRecyclerviewListItemBinding) : RecyclerView.ViewHolder(binding.root) { //Defining graph axis val xAxis = DateAxis(context).apply { drawLabels = false autoFitMarginalLabels = false drawMinorGridLines = false drawMajorBands = false drawMajorGridLines = false visibility = View.GONE drawMinorTicks = false drawMajorTicks = false // labelProvider = NumericLabelProvider(SciChartXAxisLabelProvider()) } val yAxis = NumericAxis(context).apply { drawLabels = false autoFitMarginalLabels = false drawMinorGridLines = false drawMajorBands = false visibility = View.GONE drawMinorTicks = false drawMajorTicks = false drawMajorGridLines = false // autoRange=AutoRange.Always // visibleRange } //XyDataseries for adding the sample values for plotting graph val dataSeries: IXyDataSeries = sciChartBuilder.newXyDataSeries( Date::class.javaObjectType, Double::class.javaObjectType ).build() //iterating the x and y axis values fun setChartData(samples: List) { try { dataSeries.acceptsUnsortedData = true samples.forEachIndexed { index, data -> // if(android.text.TextUtils.isDigitsOnly(data.value)) dataSeries.append( DateUtil.generateDateObjectFromDateTimeString(data.timeStamp), data.value.toDouble() ) } val rSeries = sciChartBuilder.newLineSeries().withDataSeries(dataSeries) .withStrokeStyle( Color.parseColor(context!!.getString(R.string.graph_color)), 1f, false ).build() /* if (binding.surfaceChart.parent != null) { (binding.surfaceChart.parent as ViewGroup).removeView(binding.surfaceChart) // <- fix }*/ UpdateSuspender.using(binding.surfaceChart) { Collections.addAll(binding.surfaceChart.xAxes, xAxis) Collections.addAll(binding.surfaceChart.yAxes, yAxis) Collections.addAll(binding.surfaceChart.renderableSeries, rSeries) Collections.addAll( binding.surfaceChart.chartModifiers, sciChartBuilder.newModifierGroupWithDefaultModifiers().build() ) // sciChartBuilder.newAnimator(rSeries).withSweepTransformation().start() binding.surfaceChart.renderableSeriesAreaBorderStyle = sciChartBuilder.newPen().withColor(ColorUtil.Transparent).build() } } catch (numberFormatException: NumberFormatException) { } } } override fun onCreateViewHolder( parent: ViewGroup, viewType: Int ): KpiListAdapter.KpiListViewHolder { val binding = DataBindingUtil.inflate( LayoutInflater.from(parent.context), R.layout.kpi_recyclerview_list_item, parent, false ) mRecyclerView = parent as RecyclerView context = parent.context SciChartBuilder.init(context) sciChartBuilder = SciChartBuilder.instance() return KpiListViewHolder(binding) } override fun onBindViewHolder(holder: KpiListAdapter.KpiListViewHolder, position: Int) { val elements = historianDataSourceModel[position] FcxLog.d("kpilistModel",elements.toString()) //Toast.makeText(context,"${elements.historianDataSample.size}",Toast.LENGTH_LONG).show() //'historianDataSampleList' contains all the samples,in this method each list item is iterated with respect to 'historianDataId' //holder.setChartData(elements.historianDataSample) if (elements.path?.length!! >= 36) { val path = elements.path.substring(0, 20) + "..." + elements.path.takeLast(12) holder.binding.kpiListItemPath.text = path } else { holder.binding.kpiListItemPath.text = elements.path } if (elements.propertyName?.contains(">") == true) { holder.binding.kpiListItemPropertyName.text = elements.propertyName.substringAfterLast(">") } else { holder.binding.kpiListItemPropertyName.text = elements.propertyName } try { if(elements.precision !=null) { val lastValue = String.format("%${elements.precision.toInt()}f", elements.lastValue?.toDouble()) holder.binding.kpiListItemValue.text = lastValue //Toast.makeText(context,"${elements.precision}",Toast.LENGTH_LONG).show() } else { // Toast.makeText(context,"precision ${elements.precision}",Toast.LENGTH_LONG).show() holder.binding.kpiListItemValue.text = elements.lastValue } } catch (nfe: NumberFormatException) { holder.binding.kpiListItemValue.text = elements.lastValue } holder.binding.kpiListItemDate.text = elements.endTime?.let { DateUtil.generateDateFromDateTimeString(it) } holder.binding.kpiListItemTime.text = elements.endTime?.let { DateUtil.generateTimeFromDateTimeString(it) } holder.binding.mainLayout.setOnClickListener { kpiclickListner.onListItemClicK(historianDataSourceModel) } elements.historianDataId?.let { extractListData(historianDataSample, it, holder) } // holder.binding.surfaceChart.chartModifiers.add(CustomClickModifier(historianDataSourceModel)) // holder.binding.surfaceChart.chartModifiers.add(CustomClickModifier(historianDataSourceModel)) //to change the color of the last item's line if (position == historianDataSourceModel.size - 1) { holder.binding.line.setBackgroundColor( ContextCompat.getColor( context!!, R.color.pure_white ) ) } } /* private fun setLayoutParams(holder: KpiListViewHolder) { val params = ConstraintLayout.LayoutParams( ConstraintLayout.LayoutParams.WRAP_CONTENT, ConstraintLayout.LayoutParams.WRAP_CONTENT ) params.setMargins(10, 4, 2, 0) holder.binding.kpiListItemValue.layoutParams=params }*/ private fun extractListData( historiandataSample: List, historianDataId: Int, holder: KpiListViewHolder ) { var samples = ArrayList() historiandataSample.forEach { //each item in list is extracted and compared with 'historianDataParentId' matching objects are added to a new list if (it.historianDataParentId == historianDataId) { samples.add(it) } } //returns the new iterated list for plotting chart holder.setChartData(samples) } override fun getItemCount(): Int { return historianDataSourceModel.size } fun updateList( list: List, historianDataSourceModelList: List, kpilist: ArrayList ) { historianDataSample.clear() historianDataSourceModel.clear() kpilistModel.clear() historianDataSample = list as ArrayList historianDataSourceModel = historianDataSourceModelList as ArrayList kpilistModel=kpilist notifyDataSetChanged() } //OnClicking the list item entire list is passed to the next page interface KPIListClickListener { fun onListItemClicK(list: List) } inner class CustomClickModifier(val historianDataSourceModel: List) : GestureModifierBase() { override fun onSingleTapConfirmed(e: MotionEvent?): Boolean { kpiclickListner.onListItemClicK(historianDataSourceModel) return true } } }