package Ġeu . kan ade . t ach iy omi . ui . reader . viewer . pager Ċ Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġcom . el vis he w . x log . X Log Ċ import Ġeu . kan ade . t ach iy omi . ui . reader . model . Chapter Transition Ċ import Ġeu . kan ade . t ach iy omi . ui . reader . model . Reader Chapter Ċ import Ġeu . kan ade . t ach iy omi . ui . reader . model . Reader Page Ċ import Ġeu . kan ade . t ach iy omi . ui . reader . model . Viewer Chapter s Ċ import Ġeu . kan ade . t ach iy omi . widget . ViewPager Adapter Ċ import Ġkotlin . math . max Ċ Ċ /** Ċ Ġ* ĠP ager Ġadapter Ġused Ġby Ġthis Ġ[ viewer ] Ġto Ġwhere Ġ[ Viewer Chapter s ] Ġupdates Ġare Ġposted . Ċ Ġ*/ Ċ class ĠP ager Viewer Adapter ( private Ġval Ġviewer : ĠP ager Viewer ) Ġ: ĠView Pager Adapter () Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPa ired Ġlist Ġof Ġcurrently Ġset Ġitems . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġjoined Items : ĠMutable List < Pair < Any , ĠAny ? >> Ġ= Ġmutable ListOf () ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġ/** ĠSingle Ġlist Ġof Ġitems Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġsub Items : ĠMutable List < Any > Ġ= Ġmutable ListOf () ĊĊĠĠĠ Ġvar Ġnext Transition : ĠChapter Transition . Next ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġ/** ĠPage Ġused Ġto Ġstart Ġthe Ġshifted Ġpages Ġ*/ ĊĠĠĠ Ġvar Ġpage To Shift : ĠReader Page ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĠVar ibles Ġused Ġto Ġcheck Ġif Ġconfig Ġof Ġthe Ġpages Ġhave Ġchanged Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġshifted Ġ= Ġviewer . config . shift Double Page ĊĠĠĠ Ġprivate Ġvar Ġdouble d Up Ġ= Ġviewer . config . double Pages ĊĊĠĠĠ Ġvar Ġcurrent Chapter : ĠReader Chapter ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġforce Transition Ġ= Ġfalse ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUpdates Ġthis Ġadapter Ġwith Ġthe Ġgiven Ġ[ chapter s ]. ĠIt Ġhandles Ġsetting Ġa Ġfew Ġpages Ġof Ġthe ĊĠĠĠĠ Ġ* Ġnext / previous Ġchapter Ġto Ġallow Ġse am less Ġtransitions Ġand Ġin verting Ġthe Ġpages Ġif Ġthe Ġviewer ĊĠĠĠĠ Ġ* Ġhas ĠR 2 L Ġdirection . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Chapter s ( chapter s : ĠViewer Chapter s , Ġforce Transition : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew Items Ġ= Ġmutable ListOf < Any >() ĊĊĠĠĠĠĠĠĠ Ġthis . force Transition Ġ= Ġforce Transition ĊĠĠĠĠĠĠĠ Ġ// ĠAdd Ġprevious Ġchapter Ġpages Ġand Ġtransition . ĊĠĠĠĠĠĠĠ Ġif Ġ( chapter s . prev Chapter Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġonly Ġneed Ġto Ġadd Ġthe Ġlast Ġfew Ġpages Ġof Ġthe Ġprevious Ġchapter , Ġbecause Ġit 'll Ġbe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġselected Ġas Ġthe Ġcurrent Ġchapter Ġwhen Ġone Ġof Ġthose Ġpages Ġis Ġselected . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprev Pages Ġ= Ġchapter s . prev Chapter . pages ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġwill Ġtake Ġan Ġeven Ġnumber Ġof Ġpages Ġif Ġthe Ġpage Ġcount Ġif Ġeven ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġhowever Ġwe Ġshould Ġtake Ġaccount Ġfull Ġpages Ġwhen Ġdec iding ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠnumberOf Full Pages Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchapter s . prev Chapter . pages ?. count Ġ{ Ġit . full Page Ġ|| Ġit . is olated Page Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( prev Pages Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Items . addAll ( prev Pages . take Last ( if Ġ(( prev Pages . size Ġ+ ĠnumberOf Full Pages ) Ġ% Ġ 2 Ġ== Ġ 0 ) Ġ 2 Ġelse Ġ 3 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠSkip Ġtransition Ġpage Ġif Ġthe Ġchapter Ġis Ġloaded Ġ& Ġcurrent Ġpage Ġis Ġnot Ġa Ġtransition Ġpage ĊĠĠĠĠĠĠĠ Ġif Ġ( force Transition Ġ|| Ġchapter s . prev Chapter ?. state Ġ! is ĠReader Chapter . State . Loaded ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Items . add ( Chapter Transition . Prev ( chapter s . curr Chapter , Ġchapter s . prev Chapter )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠAdd Ġcurrent Ġchapter . ĊĠĠĠĠĠĠĠ Ġval Ġcurr Pages Ġ= Ġchapter s . curr Chapter . pages ĊĠĠĠĠĠĠĠ Ġif Ġ( curr Pages Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Items . addAll ( curr Pages ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcurrent Chapter Ġ= Ġchapter s . curr Chapter ĊĊĠĠĠĠĠĠĠ Ġ// ĠAdd Ġnext Ġchapter Ġtransition Ġand Ġpages . ĊĠĠĠĠĠĠĠ Ġnext Transition Ġ= ĠChapter Transition . Next ( chapter s . curr Chapter , Ġchapter s . next Chapter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( force Transition Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchapter s . next Chapter ?. state Ġ! is ĠReader Chapter . State . Loaded ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Items . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( chapter s . next Chapter Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdd Ġat Ġmost Ġtwo Ġpages , Ġbecause Ġthis Ġchapter Ġwill Ġbe Ġselected Ġbefore Ġthe Ġuser Ġcan ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġswap Ġmore Ġpages . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Pages Ġ= Ġchapter s . next Chapter . pages ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( next Pages Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Items . addAll ( next Pages . take ( 2 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsub Items Ġ= Ġnew Items . to Mutable List () ĊĊĠĠĠĠĠĠĠ Ġvar Ġuse Second Page Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( shift ed Ġ!= Ġviewer . config . shift Double Page Ġ|| Ġ( double d Up Ġ!= Ġviewer . config . double Pages Ġ&& Ġdouble d Up )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( shift ed Ġ&& Ġ( double d Up Ġ== Ġviewer . config . double Pages )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuse Second Page Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshifted Ġ= Ġviewer . config . shift Double Page ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdouble d Up Ġ= Ġviewer . config . double Pages ĊĠĠĠĠĠĠĠ Ġset Joined Items ( use Second Page ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġamount Ġof Ġitems Ġof Ġthe Ġadapter . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġget Count (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġjoined Items . size ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreates Ġa Ġnew Ġview Ġfor Ġthe Ġitem Ġat Ġthe Ġgiven Ġ[ position ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġcreate View ( container : ĠViewGroup , Ġposition : ĠInt ): ĠView Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġitem Ġ= Ġjoined Items [ position ]. first ĊĠĠĠĠĠĠĠ Ġval Ġitem 2 Ġ= Ġjoined Items [ position ]. second ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( item ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠReader Page Ġ-> ĠP ager Page Holder ( viewer , Ġitem , Ġitem 2 Ġas ? ĠReader Page ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠChapter Transition Ġ-> ĠP ager Transition Holder ( viewer , Ġitem ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠNotImplementedError (" Holder Ġfor Ġ${ item . java Class } Ġnot Ġimplemented ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġcurrent Ġposition Ġof Ġthe Ġgiven Ġ[ view ] Ġon Ġthe Ġadapter . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun ĠgetItem Position ( view : ĠAny ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( view Ġis ĠPosition ableView ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposition Ġ= Ġjoined Items . indexOf First Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . item Ġ== Ġ( it . first Ġto Ġit . second ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( position Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġposition ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠX Log . d (" Position Ġfor Ġ${ view . item } Ġnot Ġfound ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠPOSITION _ NONE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsplit Double Pages ( current : ĠReader Page ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġold Current Ġ= Ġjoined Items . get OrNull ( viewer . pager . currentItem ) ĊĠĠĠĠĠĠĠ Ġset Joined Items ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġold Current ?. second Ġ== Ġcurrent Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( current . index Ġ+ Ġ 1 ) Ġ< Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Current ?. second ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġold Current ?. first ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġas ? ĠReader Page ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ?. index Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġlistener Ġmay Ġbe Ġremoved Ġwhen Ġwe Ġsplit Ġa Ġpage , Ġso Ġthe Ġui Ġmay Ġnot Ġhave Ġupdated Ġproperly ĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġcase Ġusually Ġhappens Ġwhen Ġwe Ġload Ġa Ġnew Ġchapter Ġand Ġthe Ġfirst Ġ 2 Ġpages Ġneed Ġto Ġsplit Ġog ĊĠĠĠĠĠĠĠ Ġviewer . pager . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġviewer . on Page Change ( viewer . pager . currentItem ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Joined Items ( use Second Page : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġold Current Ġ= Ġjoined Items . get OrNull ( viewer . pager . currentItem ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! viewer . config . double Pages ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġnot Ġin Ġdouble Ġmode , Ġset Ġup Ġitems Ġlike Ġbefore ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsub Items . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( it Ġas ? ĠReader Page )?. shift ed Page Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . joined Items Ġ= Ġsub Items . map Ġ{ ĠPair < Any , ĠAny ? >( it , Ġnull ) Ġ}. to Mutable List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( viewer Ġis ĠR 2 LP ager Viewer ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjoined Items . reverse () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpage d Items Ġ= Ġmutable ListOf < Mutable List < Reader Page ? >>() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġother Items Ġ= Ġmutable ListOf < Any >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpage d Items . add ( mutable ListOf ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStep Ġ 1 : Ġsegment Ġthe Ġpages Ġand Ġtransition Ġpages ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsub Items . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġis ĠReader Page ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( page d Items . last (). last OrNull () Ġ!= Ġnull Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage d Items . last (). last ()?. chapter ?. chapter ?. id Ġ!= Ġit . chapter . chapter . id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage d Items . add ( mutable ListOf ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage d Items . last (). add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġother Items . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage d Items . add ( mutable ListOf ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġpage d Index Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsub Joined Items Ġ= Ġmutable ListOf < Pair < Any , ĠAny ? >>() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStep Ġ 2 : Ġrun Ġthrough Ġeach Ġset Ġof Ġpages ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpage d Items . forEach Ġ{ Ġitems Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitems . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ?. shift ed Page Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStep Ġ 3 : ĠIf Ġpages Ġhave Ġbeen Ġshifted , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( viewer . config . shift Double Page ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Ġloop @{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġindex Ġ= Ġitems . indexOf ( page To Shift ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( page To Shift ?. full Page Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ= Ġmax ( 0 , Ġindex Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGo Ġfrom Ġthe Ġcurrent Ġpage Ġand Ġwork Ġyour Ġway Ġback Ġto Ġthe Ġfirst Ġpage , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġor Ġthe Ġfirst Ġpage Ġthat 's Ġa Ġfull Ġpage . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġis Ġdone Ġin Ġcase Ġuser Ġtries Ġto Ġshift Ġa Ġpage Ġafter Ġa Ġfull Ġpage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfull Page Before Index Ġ= Ġmax ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ> Ġ- 1 ) Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitems . take ( index ). indexOf Last Ġ{ Ġit ?. full Page Ġ== Ġtrue Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġelse Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdd Ġa Ġshifted Ġpage Ġto Ġthe Ġfirst Ġplace Ġthere Ġis nt Ġa Ġfull Ġpage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( full Page Before Index Ġuntil Ġitems . size ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( items [ it ]?. full Page Ġ== Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitems [ it ]?. shift ed Page Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ loop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStep Ġ 4 : ĠAdd Ġbl anks Ġfor Ġchunk ing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġitem Index Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( item Index Ġ< Ġitems . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitems [ item Index ]?. is olated Page Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( items [ item Index ]?. full Page Ġ== Ġtrue Ġ|| Ġitems [ item Index ]?. shift ed Page Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdd Ġa Ġ' blank ' Ġpage Ġafter Ġeach Ġfull Ġpage . ĠIt Ġwill Ġbe Ġused Ġwhen Ġchunk ed Ġto Ġsolo Ġa Ġpage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitems . add ( item Index Ġ+ Ġ 1 , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( items [ item Index ]?. full Page Ġ== Ġtrue Ġ&& Ġitem Index Ġ> Ġ 0 Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitems [ item Index Ġ- Ġ 1 ] Ġ!= Ġnull Ġ&& Ġ( item Index Ġ- Ġ 1 ) Ġ% Ġ 2 Ġ== Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġa Ġpage Ġis Ġa Ġfull Ġpage , Ġcheck Ġif Ġthe Ġprevious Ġpage Ġneeds Ġto Ġbe Ġisolated ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwe Ġshould Ġcheck Ġif Ġit 's Ġan Ġeven Ġor Ġodd Ġpage , Ġsince Ġeven Ġpages Ġneed Ġsh ifting ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFor Ġexample Ġif ĠPage Ġ 1 Ġis Ġfull , ĠPage Ġ 0 Ġneeds Ġto Ġbe Ġisolated ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNo Ġneed Ġto Ġtake Ġaccount Ġshifted Ġpages , Ġbecause Ġnull Ġadditions Ġshould ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġalways Ġhave Ġan Ġodd Ġindex Ġin Ġthe Ġlist ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitems [ item Index Ġ- Ġ 1 ]?. is olated Page Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitems . add ( item Index , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Index ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Index ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Index ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStep Ġ 5 : Ġchunk Ġem ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( items . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub Joined Items . addAll ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitems . chunk ed ( 2 ). map Ġ{ ĠPair ( it . first () !! , Ġit . get OrNull ( 1 )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġother Items . get OrNull ( page d Index )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub Joined Items . add ( Pair ( it , Ġnull )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage d Index ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( viewer Ġis ĠR 2 LP ager Viewer ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub Joined Items . reverse () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . joined Items Ġ= Ġsub Joined Items ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġnotify DataSet Changed () ĊĊĠĠĠĠĠĠĠ Ġ// ĠStep Ġ 6 : ĠMove Ġback Ġto Ġour Ġprevious Ġpage Ġor Ġtransition Ġpage ĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġlistener Ġis Ġlikely Ġoff Ġaround Ġnow , Ġbut Ġeither Ġway Ġwhen Ġsh ifting Ġor Ġdoub ling , ĊĠĠĠĠĠĠĠ Ġ// Ġwe Ġneed Ġto Ġset Ġthe Ġpage Ġback Ġcorrectly ĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġwill Ġhowever Ġshift Ġto Ġthe Ġfirst Ġpage Ġof Ġthe Ġnew Ġchapter Ġif Ġthe Ġlast Ġpage Ġwe Ġwere Ġare ĊĠĠĠĠĠĠĠ Ġ// Ġon Ġis Ġnot Ġin Ġthe Ġnew Ġchapter Ġthat Ġhas Ġloaded ĊĠĠĠĠĠĠĠ Ġval Ġnew Page Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( old Current ?. first Ġas ? ĠReader Page )?. chapter Ġ!= Ġcurrent Chapter Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( old Current ?. first Ġas ? ĠChapter Transition )?. from Ġ!= Ġcurrent Chapter Ġ-> Ġsub Items . find Ġ{ Ġ( it Ġas ? ĠReader Page )?. chapter Ġ== Ġcurrent Chapter Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuse Second Page Ġ-> Ġ( old Current ?. second Ġ?: Ġold Current ?. first ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġold Current ?. first Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġindex Ġ= Ġjoined Items . indexOf First Ġ{ Ġit . first Ġ== Ġnew Page Ġ|| Ġit . second Ġ== Ġnew Page Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( new Page Ġis ĠChapter Transition Ġ&& Ġindex Ġ== Ġ- 1 Ġ&& Ġ! force Transition ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnewer Page Ġ= Ġif Ġ( new Page Ġis ĠChapter Transition . Next ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjoined Items . filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( it . first Ġas ? ĠReader Page )?. chapter Ġ== Ġnew Page . to ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. min By OrNull Ġ{ Ġ( it . first Ġas ? ĠReader Page )?. index Ġ?: ĠInt . MAX _ VALUE Ġ} ?. first ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjoined Items . filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( it . first Ġas ? ĠReader Page )?. chapter Ġ== Ġnew Page . to ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. max By OrNull Ġ{ Ġ( it . first Ġas ? ĠReader Page )?. index Ġ?: ĠInt . MIN _ VALUE Ġ} ?. first ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ= Ġjoined Items . indexOf First Ġ{ Ġit . first Ġ== Ġnewer Page Ġ|| Ġit . second Ġ== Ġnewer Page Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġviewer . pager . setCurrent Item ( index , Ġfalse ) ĊĠĠĠ Ġ} Ċ } Ċ