package Ġapp . mov i eb ase . android x . widget . app bar Ċ Ċ import Ġcom . google . android . material . app bar . AppBar Layout Ċ import Ġcom . google . android . material . app bar . AppBar Layout . On Offset Changed Listener Ċ import Ġkotlin . math . abs Ċ Ċ abstract Ġclass ĠApp Bar State ChangeListener ( private Ġval Ġthreshold : ĠInt ) Ġ: ĠOn Offset Changed Listener Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġcurrent State Ġ= ĠState . IDLE ĊĠĠĠ Ġprivate Ġvar Ġtotal Scroll Range Ġ= Ġ- 1 ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( threshold Ġ>= Ġ 0 ) Ġ{ Ġ" threshold Ġmust Ġbe Ġ 0 Ġor Ġhigher : Ġ$ threshold " Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Offset Changed ( layout : ĠApp Bar Layout , Ġi : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( total Scroll Range Ġ== Ġ- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Scroll Range Ġ= Ġlayout . total Scroll Range ĊĊĠĠĠĠĠĠĠ Ġcurrent State Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi Ġ== Ġ 0 ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( currentState Ġ!= ĠState . EXP AN DED ) Ġon StateChanged ( layout , ĠState . EXP AN DED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠState . EXP AN DED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġabs ( i ) Ġ>= Ġtotal Scroll Range Ġ- Ġthreshold Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( currentState Ġ!= ĠState . COLL AP SED ) Ġon StateChanged ( layout , ĠState . COLL AP SED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠState . COLL AP SED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( currentState Ġ!= ĠState . IDLE ) Ġon StateChanged ( layout , ĠState . IDLE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠState . IDLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġfun Ġon StateChanged ( layout : ĠApp Bar Layout , Ġstate : ĠState ) ĊĊĠĠĠ Ġenum Ġclass ĠState Ġ{ ĊĠĠĠĠĠĠĠ ĠEX PAN DED , ĊĠĠĠĠĠĠĠ ĠCOL LAP SED , ĊĠĠĠĠĠĠĠ ĠID LE ; ĊĊĠĠĠĠĠĠĠ Ġval Ġis Collapsed : ĠBoolean Ġget () Ġ= Ġthis Ġ== ĠCOL LAP SED ĊĠĠĠ Ġ} Ċ } Ċ