package Ġtk . zw ander . lock screen widgets . views Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . content . Context Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . Motion Event Ċ import Ġandroid . view . View Configuration Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġtk . zw ander . lock screen widgets . util . IS n appy LayoutManager Ċ import Ġkotlin . math . absolute Value Ċ Ċ // Based Ġon Ġhttps :// stackoverflow . com / a / 2 6 4 4 5 0 6 4 / 5 4 9 6 1 7 7 Ċ class ĠSn appy RecyclerView ( context : ĠContext , Ġattrs : ĠAttributeSet ) Ġ: ĠRecyclerView ( context , Ġattrs ) Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġlatest VX Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġlatest VY Ġ= Ġ 0 ĊĊĠĠĠ Ġoverride Ġfun Ġfl ing ( velocity X : ĠInt , Ġvelocity Y : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġs lop Ġ= ĠView Configuration . get ( context ). scaled Paging Touch S lop ĊĊĠĠĠĠĠĠĠ Ġlatest VX Ġ= Ġvelocity X ĊĠĠĠĠĠĠĠ Ġlatest VY Ġ= Ġvelocity Y ĊĊĠĠĠĠĠĠĠ Ġif Ġ( velocity X . absolute Value Ġ> Ġs lop Ġ|| Ġvelocity Y . absolute Value Ġ> Ġs lop ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlayout Manager Ġ= Ġlayout Manager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( layout Manager Ġis ĠIS n appy LayoutManager Ġ&& Ġlayout Manager . can Snap ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsmooth Scroll To Position ( layout Manager . getPosition For Velocity ( velocity X , Ġvelocity Y )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . fl ing ( velocity X , Ġvelocity Y ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġorig X Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġorig Y Ġ= Ġ 0 f ĊĊĠĠĠ Ġprivate Ġvar Ġprev X Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġprev Y Ġ= Ġ 0 f ĊĊĠĠĠ Ġ@ Suppress Lint (" Click ableView Accessibility ") ĊĠĠĠ Ġoverride Ġfun Ġon Touch Event ( e : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġwant Ġthe Ġparent Ġto Ġhandle Ġall Ġtouch Ġevents -- there 's Ġa Ġlot Ġgoing Ġon Ġthere , ĊĠĠĠĠĠĠĠ Ġ// Ġand Ġthere Ġis Ġno Ġreason Ġto Ġoverwrite Ġthat Ġfunctionality -- bad Ġthings Ġwill Ġhappen . ĊĠĠĠĠĠĠĠ Ġval Ġret Ġ= Ġsuper . on Touch Event ( e ) ĊĠĠĠĠĠĠĠ Ġval Ġlm Ġ= Ġlayout Manager ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( e . action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ DOWN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorig X Ġ= Ġe . raw X ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorig Y Ġ= Ġe . raw Y ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprev X Ġ= Ġorig X ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprev Y Ġ= Ġorig Y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ MOVE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvx Ġ= Ġe . raw X Ġ- Ġprev X ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvy Ġ= Ġe . raw Y Ġ- Ġprev Y ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs lop Test X Ġ= Ġe . raw X Ġ- Ġorig X ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs lop Test Y Ġ= Ġe . raw Y Ġ- Ġorig Y ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlatest VX Ġ= Ġif Ġ( s lop Test X . absolute Value Ġ> Ġvx . absolute Value ) Ġs lop Test X . toInt () Ġelse Ġvx . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlatest VY Ġ= Ġif Ġ( s lop Test Y . absolute Value Ġ> Ġvy . absolute Value ) Ġs lop Test Y . toInt () Ġelse Ġvy . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( lm Ġis ĠIS n appy LayoutManager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġ( e . action Ġ== ĠMotion Event . ACTION _ UP Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . action Ġ== ĠMotion Event . ACTION _ CANCEL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġscroll State Ġ== ĠSC ROLL _ STATE _ IDLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġ( latest VX Ġ!= Ġ 0 Ġ|| Ġlatest VY Ġ!= Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġlayout Ġmanager Ġis Ġa ĠSn appy LayoutManager , Ġwhich Ġmeans Ġthat Ġthe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġchildren Ġshould Ġbe Ġsn apped Ġto Ġa Ġgrid Ġat Ġthe Ġend Ġof Ġa Ġdrag Ġor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfl ing . ĠThe Ġmotion Ġevent Ġis Ġeither Ġa Ġuser Ġl ifting Ġtheir Ġfinger Ġor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġcancellation Ġof Ġa Ġmotion Ġevents , Ġso Ġthis Ġis Ġthe Ġtime Ġto Ġtake ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġover Ġthe Ġscrolling Ġto Ġperform Ġour Ġown Ġfunctionality . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFinally , Ġthe Ġscroll Ġstate Ġis Ġidle -- mean ing Ġthat Ġthe Ġresult ant ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġvelocity Ġafter Ġthe Ġuser 's Ġgesture Ġwas Ġbelow Ġthe Ġthreshold , Ġand ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġno Ġfl ing Ġwas Ġperformed , Ġso Ġthe Ġview Ġmay Ġbe Ġin Ġan Ġun aligned Ġstate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġand Ġwill Ġnot Ġbe Ġfl ung Ġto Ġa Ġproper Ġstate . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( lm . can Snap ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsmooth Scroll To Position ( lm . get Fix Scroll Pos ( latest VX , Ġlatest VY )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlatest VX Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlatest VY Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġret ĊĠĠĠ Ġ} Ċ }