/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 0 ĠChen he Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġme . chen he . we ar vision . widget Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Canvas Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . View Ċ import Ġandroidx . coordinator layout . widget . Coordinator Layout Ċ import Ġandroidx . core . view . View Compat Ċ import Ġme . chen he . we ar vision . util . is Screen Round Ċ import Ġkotlin . math . max Ċ import Ġkotlin . math . min Ċ Ċ /** Ċ Ġ* ĠA Ġlayout Ġthat Ġextends Ġ[ Coordinator Layout ]. Ċ Ġ* Ċ Ġ* ĠThis Ġlayout Ġadds Ġvertical Ġedge Ġscrolling Ġeffects Ġthat Ġad ap ts Ġthe Ġround Ġscreen . Ċ Ġ*/ Ċ class ĠVision Coordinator Layout Ġ@ Jvm Over loads Ġconstructor ( ĊĠĠĠ Ġcontext : ĠContext , Ġattrs : ĠAttributeSet ? Ġ= Ġnull , Ġdef Style Attr : ĠInt Ġ= Ġ 0 Ċ ) Ġ: ĠCoord inator Layout ( context , Ġattrs , Ġdef Style Attr ) Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġm Edge G low Top : ĠEdge Effect ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Edge G low Bottom : ĠEdge Effect ? Ġ= Ġnull ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! isIn Edit Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate System Shape ( is Screen Round ( context )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġset Will Not Draw ( false ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate System Shape ( system Is Round : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( system Is Round ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Edge G low Top Ġ== Ġnull Ġ|| Ġm Edge G low Top Ġ! is ĠCre sc ent Edge Effect ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Edge G low Top Ġ= ĠCre sc ent Edge Effect ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Edge G low Bottom Ġ= ĠCre sc ent Edge Effect ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Edge G low Top Ġ== Ġnull Ġ|| Ġm Edge G low Top Ġ! is ĠClass ic Edge Effect ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Edge G low Top Ġ= ĠClass ic Edge Effect ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Edge G low Bottom Ġ= ĠClass ic Edge Effect ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdraw ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . draw ( canvas ) ĊĠĠĠĠĠĠĠ Ġm Edge G low Top ?. let Ġ{ Ġtop Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! top . is Finished ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrestore Count Ġ= Ġcanvas . save () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= Ġwidth ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġedge Y Ġ= Ġmin ( 0 , Ġscroll Y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . translate ( 0 f , Ġedge Y . toFloat ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop . setSize ( width , Ġheight ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( top . draw ( canvas )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Invalidate On Animation ( 0 , Ġ 0 , Ġget Width (), Ġtop . max Height Ġ+ Ġpadding Top ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . restore To Count ( restore Count ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġm Edge G low Bottom ?. let Ġ{ Ġbottom Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! bottom . is Finished ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrestore Count Ġ= Ġcanvas . save () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= Ġwidth ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheight Ġ= Ġheight ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġedge X Ġ= Ġ- width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġedge Y Ġ= Ġmax ( height , Ġscroll Y Ġ+ Ġheight ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . translate ( edge X . toFloat (), Ġedge Y . toFloat ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . rotate ( 1 8 0 f , Ġwidth . toFloat (), Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbottom . setSize ( width , Ġheight ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bottom . draw ( canvas )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Invalidate On Animation ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , Ġget Height () Ġ- Ġpadding Bottom Ġ- Ġbottom . max Height , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Width (), Ġget Height () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . restore To Count ( restore Count ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonStart Nested Scroll ( child : ĠView , Ġtarget : ĠView , Ġaxes : ĠInt , Ġtype : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onStart Nested Scroll ( child , Ġtarget , Ġaxes , Ġtype ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue Ġ// ĠAlways Ġaccept Ġthe Ġnested Ġscroll Ġto Ġshow Ġover Ġscroll Ġeffects . ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Nested Scroll ( ĊĠĠĠĠĠĠĠ Ġtarget : ĠView , Ġdx Cons umed : ĠInt , Ġdy Cons umed : ĠInt , Ġdx Un consumed : ĠInt , Ġdy Un consumed : ĠInt , ĊĠĠĠĠĠĠĠ Ġtype : ĠInt , Ġconsumed : ĠInt Array ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Nested Scroll ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtarget , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdx Cons umed , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdy Cons umed , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdx Un consumed , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdy Un consumed , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconsumed ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġpull Edge Effects ( dy Un consumed ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Nested Fl ing ( ĊĠĠĠĠĠĠĠ Ġtarget : ĠView , ĊĠĠĠĠĠĠĠ Ġvelocity X : ĠFloat , ĊĠĠĠĠĠĠĠ Ġvelocity Y : ĠFloat , ĊĠĠĠĠĠĠĠ Ġconsumed : ĠBoolean ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! consumed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġabsor b Edge Effects ( velocity Y . toInt ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Stop Nested Scroll ( target : ĠView , Ġtype : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Stop Nested Scroll ( target , Ġtype ) ĊĠĠĠĠĠĠĠ Ġif Ġ( type Ġ== ĠView Compat . TYPE _ TO UCH ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrelease Edge Effects () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpull Edge Effects ( dy Un consumed : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmax Pull Effect Distance Ġ= Ġheight Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġif Ġ( dy Un consumed Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Edge G low Top ?. let Ġ{ Ġtop Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop . on Pull (- dy Un consumed . toFloat () Ġ/ Ġmax Pull Effect Distance ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Edge G low Bottom ?. is Finished Ġ== Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Edge G low Bottom ?. on Release () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( dy Un consumed Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Edge G low Bottom ?. let Ġ{ Ġbottom Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbottom . on Pull ( dy Un consumed . toFloat () Ġ/ Ġmax Pull Effect Distance ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Edge G low Top ?. is Finished Ġ== Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Edge G low Top ?. on Release () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġabsor b Edge Effects ( vel Y : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( vel Y Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Edge G low Bottom ?. on Ab sor b ( vel Y ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( vel Y Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Edge G low Top ?. on Ab sor b ( vel Y ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrelease Edge Effects () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Edge G low Top ?. on Release () ĊĠĠĠĠĠĠĠ Ġm Edge G low Bottom ?. on Release () ĊĠĠĠ Ġ} Ċ Ċ }