package Ġcom . tun jid . android x . tab lists . tables Ċ Ċ import Ġandroid . app . Application Ċ import Ġandroidx . lifecycle . Android ViewModel Ċ import Ġcom . openc sv . CSV Reader Ċ import Ġcom . tun jid . android x . R Ċ import Ġcom . tun jid . android x . to LiveData Ċ import Ġio . reactivex . Single Ċ import Ġio . reactivex . processors . Behavior Processor Ċ import Ġio . reactivex . schedul ers . Schedulers Ċ import Ġjava . io . BufferedReader Ċ import Ġjava . io . IOException Ċ import Ġjava . io . InputStream Reader Ċ import Ġjava . nio . charset . Charset Ċ import Ġkotlin . math . max ĊĊ Ċ class ĠSp readsheet ViewModel ( application : ĠApplication ) Ġ: ĠAndroid ViewModel ( application ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġprocessor Ġ= ĠBehavior Processor . create < Cell . Header >() ĊĊĠĠĠ Ġval Ġstate Ġ= ĠSingle . from Callable Ġ{ Ġread Data () Ġ} ĊĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . io ()) ĊĠĠĠĠĠĠĠ Ġ. flatMap Publisher Ġ{ Ġperson nel Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocessor . scan ( person nel ) Ġ{ Ġnext , Ġheader Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext . copy ( sort Header Ġ= Ġnext . sort Header . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Column Ġ= Ġheader . content , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġascending Ġ= Ġheader . ascending ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. to LiveData () ĊĊĠĠĠ Ġfun Ġaccept ( input : ĠCell . Header ) Ġ= Ġprocessor . onNext ( input ) ĊĊĠĠĠ Ġprivate Ġfun Ġread Data (): ĠPerson nel Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠinputStream Ġ= Ġget Application < Application >(). resources . open Raw Resource ( R . raw . spreadsheet _ data ) ĊĠĠĠĠĠĠĠ Ġval Ġreader Ġ= ĠBufferedReader ( InputStream Reader ( inputStream , ĠCharset . forName (" UTF - 8 "))) ĊĠĠĠĠĠĠĠ Ġval Ġcsv Reader Ġ= ĠCSV Reader ( reader ) ĊĠĠĠĠĠĠĠ Ġreturn ĠPerson nel ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Sequence ( csv Reader :: read Next ). toList () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e 1 : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠPerson nel ( ĊĠĠĠ Ġprivate Ġval Ġperson nel : ĠList < Array < String >>, ĊĠĠĠ Ġoverride Ġval Ġsort Header : ĠCell . Header Ġ= ĠCell . Header ( ĊĠĠĠĠĠĠĠ Ġcontent Ġ= Ġperson nel . first (). first (). to Title d Diff able (), ĊĠĠĠĠĠĠĠ Ġselected Column Ġ= Ġperson nel . first (). first (). to Title d Diff able (), ĊĠĠĠĠĠĠĠ Ġascending Ġ= Ġtrue ĊĠĠĠ Ġ), Ċ ) Ġ: ĠTable Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġcomparator Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsort Column Ġ= Ġmax ( person nel . first (). indexOf ( sort Header . selected Column . diff Id ), Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġobject Ġ: ĠComparator < Array < String >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġdelegate Ġ= Ġcompare By < Array < String >>( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġcolumns Ġ-> Ġcolumns [ sort Column ]. toInt OrNull () Ġ?: Ġ 0 Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġcolumns Ġ-> Ġcolumns [ sort Column ] Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcompare ( a : ĠArray < String >, Ġb : ĠArray < String >): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomparison Ġ= Ġdelegate . compare ( a , Ġb ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( sort Header . ascending ) Ġcomparison Ġelse Ġ- comparison ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġheader : ĠRow Ġ= ĠRow . Header ( ĊĠĠĠĠĠĠĠ Ġcontent Ġ= ĠId ( 0 ), ĊĠĠĠĠĠĠĠ Ġascending Ġ= Ġsort Header . ascending , ĊĠĠĠĠĠĠĠ Ġcells Ġ= Ġperson nel . first (). map Ġ{ Ġcolumn Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCell . Header ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Ġ= Ġcolumn . to Title d Diff able (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġascending Ġ= Ġsort Header . ascending , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Column Ġ= Ġsort Header . selected Column , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalignment Ġ= ĠText Alignment . Start ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġoverride Ġval Ġrows : ĠList < Row > Ġ= ĠlistOf ( header ) Ġ+ Ġperson nel . drop ( 1 ) ĊĠĠĠĠĠĠĠ Ġ. sorted With ( comparator ) ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġcolumns Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRow . Item ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Ġ= ĠId ( id Ġ= Ġcolumns . first (). toInt ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcells Ġ= Ġcolumns . map Ġ{ Ġtext Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCell . Text ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Ġ= Ġtext . to Title d Diff able (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalignment Ġ= ĠText Alignment . Start ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġsidebar Ġ= Ġrows . map Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRow . Item Ġ-> Ġit . copy ( cells Ġ= Ġit . cells . take ( 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRow . Header Ġ-> Ġit . copy ( cells Ġ= Ġit . cells . take ( 1 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġdata Ġclass ĠId ( val Ġid : ĠInt ) Ġ: ĠTitle d Diff able Ġ{ ĊĠĠĠ Ġoverride Ġval Ġtitle : ĠCharSequence Ġget () Ġ= Ġid . toString () ĊĠĠĠ Ġoverride Ġval Ġdiff Id : ĠString Ġget () Ġ= Ġid . toString () Ċ } Ċ