package Ġcom . jon as wan ke . calendar . pager Ċ Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . Frame Layout Ċ import Ġandroidx . view pager . widget . Pager Adapter Ċ import Ġcom . jon as wan ke . calendar . Build Config ĊĊ Ċ abstract Ġclass ĠIn finite Pager Adapter < T , ĠV Ġ: ĠView >( init Value : ĠT , Ġprivate Ġval Ġoff screen Pages : ĠInt Ġ= Ġ 1 ) Ġ: ĠP ager Adapter () Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTAG : ĠString Ġ= ĠIn finite Pager Adapter :: class . java . simple Name ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCACHE _ SIZE Ġ= Ġ 5 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġdefault Center Ġ= Ġoff screen Pages Ġ* ĠCACHE _ SIZE ĊĠĠĠ Ġinternal Ġval Ġpage Count Ġ= Ġdefault Center Ġ* Ġ 2 ĊĠĠĠ Ġprivate Ġval Ġpage Models : ĠMutable Map < Int , ĠPage Model < T , ĠV > ?> ĊĊĠĠĠ Ġvar Ġcurrent Indicator : ĠT ĊĠĠĠĠĠĠĠ Ġinternal Ġset ĊĠĠĠ Ġopen Ġvar Ġcurrent Indicator String : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġset (_) Ġ{} ĊĊĠĠĠ Ġprivate Ġvar Ġ_ current Position : ĠInt Ġ= Ġdefault Center ĊĠĠĠ Ġvar Ġcurrent Position : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ current Position ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Indicator Ġ= Ġindicator From Position ( value ) ĊĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġpages To Load Ġget () Ġ= Ġcurrent Position Ġ- Ġoff screen Pages .. current Position Ġ+ Ġoff screen Pages ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Indicator Ġ= Ġinit Value ĊĠĠĠĠĠĠĠ Ġpage Models Ġ= Ġmutable Map Of () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// ĠP ager Adapter ĊĠĠĠ Ġfinal Ġoverride Ġfun Ġinstantiate Item ( container : ĠViewGroup , Ġposition : ĠInt ): ĠAny Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Build Config . DEBUG ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , ĠString . format (" inst anti ating Ġposition Ġ% s ", Ġposition )) ĊĊĠĠĠĠĠĠĠ Ġval Ġindicator Ġ= Ġindicator From Position ( position ) ĊĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġindicator . take If Ġ{ Ġposition Ġin Ġpages To Load Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġinstantiate Item ( it , Ġnull ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġwrapper Ġ= ĠFrame Layout ( container . context ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview ?. also Ġ{ Ġadd View ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġmodel Ġ= ĠPage Model ( wrapper , Ġview , Ġindicator ) ĊĠĠĠĠĠĠĠ Ġpage Models [ position ] Ġ= Ġmodel ĊĊĠĠĠĠĠĠĠ Ġcontainer . addView ( model . wrapper ) ĊĠĠĠĠĠĠĠ Ġreturn Ġmodel ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Count () Ġ= Ġpage Count ĊĠĠĠ Ġoverride Ġfun Ġis View From Object ( view : ĠView , Ġo : ĠAny ) Ġ= Ġview Ġ=== Ġ( o Ġas ĠPage Model < *, Ġ*> ). wrapper ĊĊĠĠĠ Ġoverride Ġfun Ġdestroy Item ( container : ĠViewGroup , Ġposition : ĠInt , Ġobj : ĠAny ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcontainer . remove View (( obj Ġas ĠPage Model < *, Ġ*> ). wrapper ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// ĠCustom ĊĠĠĠ Ġabstract Ġfun Ġinstantiate Item ( indicator : ĠT , Ġold View : ĠV ?): ĠV ĊĊĠĠĠ Ġinternal Ġfun Ġset Position ( position : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( position ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Position Ġ-> Ġposition ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġoff screen Pages .. ( page Count Ġ- Ġoff screen Pages ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdelta Ġ= Ġposition Ġ- Ġcurrent Position ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( delta Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove ( current Position Ġ- Ġoff screen Pages , Ġcurrent Position Ġ+ Ġoff screen Pages Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfill Page ( current Position Ġ+ Ġoff screen Pages Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ current Position ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Indicator Ġ= Ġnext Indicator ( current Indicator ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelta -- ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( delta Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove ( current Position Ġ+ Ġoff screen Pages , Ġcurrent Position Ġ- Ġoff screen Pages Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfill Page ( current Position Ġ- Ġoff screen Pages Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ current Position -- ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Indicator Ġ= Ġprevious Indicator ( current Indicator ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelta ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposition ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcycle Back () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Center ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġreset ( new Indicator : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Indicator Ġ= Ġnew Indicator ĊĠĠĠĠĠĠĠ Ġ_ current Position Ġ= Ġdefault Center ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. off screen Pages Ġ* Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġ// ĠStart Ġat Ġthe Ġcurrent Position Ġand Ġmove Ġout wards ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfill Page (_ current Position Ġ+ Ġif Ġ( i Ġ% Ġ 2 Ġ== Ġ 0 ) Ġi Ġ/ Ġ 2 Ġelse Ġ-( i Ġ/ Ġ 2 Ġ+ Ġ 1 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġfun Ġnext Indicator ( current : ĠT ): ĠT ĊĠĠĠ Ġabstract Ġfun Ġprevious Indicator ( current : ĠT ): ĠT ĊĊĊĠĠĠ Ġ// ĠHelpers ĊĠĠĠ Ġprivate Ġfun Ġcycle Back () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdelta Ġ= Ġdefault Center Ġ- Ġcurrent Position ĊĠĠĠĠĠĠĠ Ġfor Ġ( position Ġin Ġpages To Load ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmove ( position , Ġposition Ġ+ Ġdelta ) ĊĠĠĠĠĠĠĠ Ġ_ current Position Ġ= Ġdefault Center ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmove ( from : ĠInt , Ġto : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfrom Model Ġ= Ġpage Models [ from ] ĊĠĠĠĠĠĠĠ Ġval Ġto Model Ġ= Ġpage Models [ to ] ĊĠĠĠĠĠĠĠ Ġif Ġ( from Model Ġ== Ġnull Ġ|| Ġto Model Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( TAG , Ġ" cycle Back . move Ġno Ġmodel Ġfound Ġ$ from Model Ġ$ to Model ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( Build Config . DEBUG ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Moving Ġpage Ġ$ from Ġto Ġ$ to , Ġindicator Ġfrom Ġ${ from Model . indicator } Ġto Ġ${ to Model . indicator }") ĊĊĠĠĠĠĠĠĠ Ġfrom Model . view ?. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( it . parent Ġas ? ĠViewGroup )?. remove View ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Model . wrapper . addView ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġto Model . indicator Ġ= Ġfrom Model . indicator ĊĠĠĠĠĠĠĠ Ġto Model . view Ġ= Ġfrom Model . view ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġindicator From Position ( position : ĠInt ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġdiff Ġ= Ġposition Ġ- Ġcurrent Position ĊĠĠĠĠĠĠĠ Ġvar Ġindicator Ġ= Ġcurrent Indicator ĊĠĠĠĠĠĠĠ Ġwhile Ġ( diff Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindicator Ġ= Ġnext Indicator ( indicator ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdiff -- ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwhile Ġ( diff Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindicator Ġ= Ġprevious Indicator ( indicator ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdiff ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġindicator ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfill Page ( position : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Build Config . DEBUG ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Fill Ġpage Ġ$ position ") ĊĠĠĠĠĠĠĠ Ġval Ġmodel Ġ= Ġpage Models [ position ] ĊĠĠĠĠĠĠĠ Ġif Ġ( model Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( TAG , Ġ" fill Page : Ġno Ġmodel Ġfound ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġmoving Ġthe Ġnew Ġcreated Ġviews Ġto Ġthe Ġpage Ġof Ġthe Ġview pager ĊĠĠĠĠĠĠĠ Ġval Ġold View Ġ= Ġmodel . view ĊĠĠĠĠĠĠĠ Ġif Ġ( old View Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( old View . parent Ġas ? ĠViewGroup )?. remove View ( old View ) ĊĊĠĠĠĠĠĠĠ Ġval Ġindicator Ġ= Ġindicator From Position ( position ) ĊĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġinstantiate Item ( indicator , Ġold View ) ĊĠĠĠĠĠĠĠ Ġmodel . indicator Ġ= Ġindicator ĊĠĠĠĠĠĠĠ Ġmodel . view Ġ= Ġview ĊĠĠĠĠĠĠĠ Ġmodel . wrapper . addView ( view ) ĊĠĠĠ Ġ} Ċ } Ċ