package Ġch . he ig vd . ih m . stick ies . ui . free form Ċ Ċ import Ġandroidx . compose . animation . animate Ċ import Ġandroidx . compose . animation . core . Spring Ċ import Ġandroidx . compose . animation . core . spring Ċ import Ġandroidx . compose . foundation . click able Ċ import Ġandroidx . compose . foundation . gest ures . remember Scroll able Controller Ċ import Ġandroidx . compose . foundation . gest ures . scroll able Ċ import Ġandroidx . compose . foundation . layout .* Ċ import Ġandroidx . compose . material . Material Theme Ċ import Ġandroidx . compose . material . content Color For Ċ import Ġandroidx . compose . runtime .* Ċ import Ġandroidx . compose . ui . Modifier Ċ import Ġandroidx . compose . ui . Transform Origin Ċ import Ġandroidx . compose . ui . draw Layer Ċ import Ġandroidx . compose . ui . geometry . Offset Ċ import Ġandroidx . compose . ui . gesture . Long Press Drag Observer Ċ import Ġandroidx . compose . ui . gesture . long Press Drag Gesture Filter Ċ import Ġandroidx . compose . ui . gesture . scroll orientation lock ing . Orientation Ċ import Ġandroidx . compose . ui . graphics . Color Ċ import Ġandroidx . compose . ui . h aptic feedback . H aptic Feedback Type Ċ import Ġandroidx . compose . ui . platform . H aptic Feed Back Ambient Ċ import Ġandroidx . compose . ui . platform . Lifecycle Owner Ambient Ċ import Ġandroidx . compose . ui . res . vector Resource Ċ import Ġandroidx . compose . ui . unit . dp Ċ import Ġandroidx . compose . ui . util . fast ForEach Indexed Ċ import Ġandroidx . compose . ui . z Index Ċ import Ġandroidx . lifecycle . lifecycle Scope Ċ import Ġch . he ig vd . ih m . stick ies . R Ċ import Ġch . he ig vd . ih m . stick ies . ui .* Ċ import Ġch . he ig vd . ih m . stick ies . ui . category Info . Edit Category Info Dialog Ċ import Ġch . he ig vd . ih m . stick ies . ui . free form . Free form Constants . Grid Horizontal Cell Count Ċ import Ġch . he ig vd . ih m . stick ies . ui . free form . Free form Constants . Grid Vertical Cell Count Ċ import Ġch . he ig vd . ih m . stick ies . ui . free form . Pane Constants . P ile Angles Ċ import Ġch . he ig vd . ih m . stick ies . ui . free form . Pane Constants . P ile Offset X Ċ import Ġch . he ig vd . ih m . stick ies . ui . free form . Pane Constants . P ile Offset Y Ċ import Ġch . he ig vd . ih m . stick ies . ui . free form . Pane Constants . Sticky Max St iff ness Ċ import Ġch . he ig vd . ih m . stick ies . ui . free form . Pane Constants . Sticky Min St iff ness Ċ import Ġch . he ig vd . ih m . stick ies . ui . modifier . offset Ċ import Ġch . he ig vd . ih m . stick ies . ui . modifier . offset Px Ċ import Ġch . he ig vd . ih m . stick ies . ui . stick ies .* Ċ import Ġch . he ig vd . ih m . stick ies . util . timestamp Flow Ċ import Ġdev . chr is ban es . compose . navigation Bars Padding Ċ import Ġjava . time . Instant Ċ import Ġjava . time . format . DateTime Formatter Ċ import Ġjava . util .* Ċ Ċ type alias ĠTimestamp Ġ= ĠLong Ċ Ċ /** Ċ Ġ* ĠA Ġcomp osable Ġthat Ġdisplays Ġa Ġ[ Pane ] Ġof Ġstick ies . ĠThese Ġstick ies Ġcan Ġbe Ġmoved Ġaround Ġin Ċ Ġ* Ġdifferent Ġcategories , Ġas Ġwell Ġas Ġopened , Ġdeleted Ġand Ġcreated . Ċ Ġ* Ċ Ġ* Ġ@ param Ġstate Ġthe Ġ[ Mutable State ] Ġthat Ġcontains Ġall Ġof Ġthe Ġinformation Ġrelated Ġto Ġthe Ġapp . Ċ Ġ* Ġ@ param Ġund os Ġthe Ġ[ Mutable State ] Ġthat Ġcontains Ġall Ġthe Ġinformation Ġrelated Ġto Ġthe Ġund os . Ċ Ġ* Ġ@ param ĠonClick Ġa Ġlistener Ġwhen Ġthe Ġsticky Ġis Ġclicked Ġand Ġshould Ġbe Ġopened . Ċ Ġ* Ġ@ param Ġmodifier Ġthe Ġ[ Modifier ] Ġthat Ġthis Ġpane Ġis Ġbased Ġon . Ċ Ġ*/ Ċ @ Composable Ċ fun ĠP ane ( ĊĠĠĠ Ġstate : ĠMutable State < Model >, ĊĠĠĠ Ġund os : ĠMutable State < Un dos >, ĊĠĠĠ ĠonClick : Ġ( Sticky Identifier ) Ġ-> ĠUnit , ĊĠĠĠ Ġmodifier : ĠModifier Ġ= ĠModifier , Ċ ) Ġ{ ĊĠĠĠ Ġvar Ġmodel Ġby Ġstate ĊĠĠĠ Ġvar Ġdrag ged Ġby Ġremember Ġ{ Ġmutable State Of ( empty Set < Sticky Identifier >()) Ġ} ĊĠĠĠ Ġvar Ġdrag ged For Move Ġby Ġremember Ġ{ Ġmutable State Of < Pair < Sticky Identifier , ĠTimestamp >? >( null ) Ġ} ĊĊĠĠĠ ĠFree form ( modifier ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠPrepare Ġthe Ġscroll Ġhandlers . ĊĠĠĠĠĠĠĠ Ġvar Ġdetail Scroll Ġby Ġremember Ġ{ Ġmutable State Of ( No Scroll ()) Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġcontroller Ġin Ġcharge Ġof Ġletting Ġus Ġscroll . ĠMakes Ġsure Ġwe Ġdo Ġnot Ġover scroll Ġthe ĊĠĠĠĠĠĠĠ Ġ// Ġbounds Ġof Ġour Ġviews . ĊĠĠĠĠĠĠĠ Ġval Ġcontroller Ġ= Ġremember Scroll able Controller ( consume Scroll Delta Ġ= Ġ{ Ġdelta Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprevious Ġ= Ġdetail Scroll . amount ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Ġ= Ġ( detail Scroll . amount Ġ- Ġdelta ). coerce In ( 0 f , Ġscroll able Height ( model )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdetail Scroll Ġ= ĠSc rolled ( next ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext Ġ- Ġprevious ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġ// ĠOur Ġscroll able Ġobserver . ĠIt Ġfill s Ġthe Ġbackground Ġof Ġthe Ġwhole Ġview . ĊĠĠĠĠĠĠĠ ĠBox ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . fill MaxSize (). scroll able ( Orientation . Vertical , Ġcontroller ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchildren Ġ= Ġ{}, ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠRender Ġthe Ġcategory Ġdetails Ġplaceholders , Ġas Ġneeded . ĊĠĠĠĠĠĠĠ Ġval Ġshow Detail Options Ġ= Ġmodel . category Open Ġ&& Ġdrag ged . isNotEmpty () ĊĠĠĠĠĠĠĠ ĠPlace holder ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġ" Change Ġcategory ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġasset Ġ= Ġvector Resource ( R . drawable . ic _ category _ action _ move ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ= Ġanimate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( show Detail Options ) Ġcontent Color For ( Material Theme . colors . surface ). copy ( alpha Ġ= Ġ 0 . 2 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠColor . Transparent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbackground Ġ= ĠColor . Transparent , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. offset ( rest ( 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. z Index ( 3 f ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠPlace holder ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġ" Delete Ġforever ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġasset Ġ= Ġvector Resource ( R . drawable . ic _ category _ action _ trash ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ= Ġanimate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( show Detail Options ) ĠColor . Stick ies N icer Red ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠColor . Transparent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbackground Ġ= ĠColor . Transparent , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. offset ( rest ( Grid Horizontal Cell Count )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. z Index ( 3 f ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠRender Ġall Ġthe Ġcategory Ġplaceholders . ĊĠĠĠĠĠĠĠ Ġmodel . categories . fast ForEach Indexed Ġ{ Ġindex , Ġcategory Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey ( category ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolor Ġ= Ġif Ġ( model . category Open ) ĠColor . Stick ies Fake White ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġcontent Color For ( color Ġ= ĠMaterial Theme . colors . surface ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġspring Ġ= Ġspring < Offset >( d amping Ratio Ġ= Ġ 0 . 8 5 f , ĠSpring . St iff ness Low ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPlace holder - specific Ġdrag Ġinformation . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrest Offset Ġ= Ġrest ( index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( drag , Ġset Drag ) Ġ= Ġremember Ġ{ Ġmutable State Of ( Not Dragging ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposition Ġ= Ġdrag . position Ġ?: Ġrest Offset ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRender Ġa Ġtitle Ġthat Ġcan Ġbe Ġdrag ged . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlace holder Title ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġcategory . title , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasset Ġ= Ġvector Resource ( category . icon ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ= Ġanimate ( color ). copy ( alpha Ġ= Ġ 0 . 2 f ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. offset ( animate ( position , Ġspring )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. z Index ( if Ġ( drag . is Dragging ) Ġ 2 f Ġelse Ġ 1 f ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlong Press Drag Observer Ġ= Ġobject Ġ: ĠLong Press Drag Observer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Drag Start () Ġ= Ġset Drag ( Dragging ( position )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Drag ( drag Distance : ĠOffset ): ĠOffset Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Drag ( Dragging ( position Ġ+ Ġdrag Distance )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCons ume Ġall Ġthe Ġdr ags . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdrag Distance ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Stop ( velocity : ĠOffset ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! model . category Open ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel Ġ= Ġmodel . category Swap ( index , Ġdrop Index ( position )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Drag ( Not Dragging ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRender Ġthe Ġactual Ġcontent Ġof Ġthe Ġcategory . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlace holder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġcategory . title , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasset Ġ= Ġvector Resource ( category . icon ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ= Ġanimate ( color ). copy ( alpha Ġ= Ġ 0 . 2 f ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠRender Ġthe Ġcategory Ġinformation . ĊĠĠĠĠĠĠĠ Ġval Ġicon Ġ= Ġmodel . category Open Index ?. let Ġ{ Ġmodel . categories [ it ]. icon Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠR . drawable . ic _ category _ inbox ĊĠĠĠĠĠĠĠ Ġval Ġ( edit Category , Ġset Edit Category ) Ġ= Ġremember Ġ{ Ġmutable State Of ( false ) Ġ} ĊĠĠĠĠĠĠĠ ĠCategory Info ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisible Ġ= Ġmodel . category Open Ġ&& Ġdrag ged . isEmpty (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġmodel . categories [ model . category Open Index Ġ?: Ġ 0 ]. title , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġicon Ġ= Ġvector Resource ( icon ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Edit Click Ġ= Ġ{ Ġset Edit Category ( true ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Back Ġ= Ġ{ Ġmodel Ġ= Ġmodel . category Close () Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . offset ( rest ( 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. navigation Bars Padding () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. padding ( bottom Ġ= Ġ 2 4 . dp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. z Index ( 4 f ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġcategory Index Ġ= Ġmodel . category Open Index ĊĠĠĠĠĠĠĠ Ġif Ġ( edit Category Ġ&& Ġcategory Index Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEdit Category Info Dialog ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġmodel . categories [ category Index ]. title , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġicon Ġ= Ġmodel . categories [ category Index ]. icon , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Confirm Ġ= Ġ{ Ġt , Ġi Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel Ġ= Ġmodel . category Update ( category Index , Ġt , Ġi ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Edit Category ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Cancel Ġ= Ġ{ Ġset Edit Category ( false ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠPrepare Ġpile Ġinformation . ĊĠĠĠĠĠĠĠ Ġval Ġpile Index Ġ= ĠInt Array ( Grid Vertical Cell Count Ġ* ĠGrid Horizontal Cell Count ) Ġ{ Ġ- 1 Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġpile Size Ġ= ĠInt Array ( Grid Vertical Cell Count Ġ* ĠGrid Horizontal Cell Count ) ĊĠĠĠĠĠĠĠ Ġfor Ġ(( _, Ġsticky ) Ġin Ġmodel . stick ies ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpile Size [ sticky . category ] Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠIterate Ġover Ġall Ġthe Ġstick ies , Ġin Ġtheir Ġposition Ġorder .. ĊĠĠĠĠĠĠĠ Ġfor Ġ(( _, Ġsticky ) Ġin Ġmodel . stick ies . as Iterable (). sorted By Descending Ġ{ Ġit . value . p ile Index Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey ( sticky . identifier ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSt icky - specific Ġdrag Ġstate Ġpersistence . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( drag , Ġset Drag ) Ġ= Ġremember Ġ{ Ġmutable State Of ( Not Dragging ()) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠP iles Ġcount Ġare Ġincrement ed Ġby Ġone . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpile Index [ sticky . category ] Ġ+= Ġ 1 ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠInformation Ġrelated Ġto Ġwhether Ġthe Ġst icker Ġis Ġopen Ġor Ġnot . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Self Open Ġ= Ġmodel . category Open Index Ġ== Ġsticky . category ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSt icky Ġoffset . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsticky Rest Offset Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . category Open Index Ġ== Ġsticky . category Ġ-> Ġdetail ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ= Ġpile Index [ sticky . category ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscroll Ġ= Ġdetail Scroll ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . category Open Ġ-> Ġhidden ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ= Ġsticky . category , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġopen Ġ= Ġmodel . category Open Index Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġrest ( index Ġ= Ġsticky . category ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposition Ġ= Ġdrag . position Ġ?: Ġsticky Rest Offset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscope Ġ= ĠLifecycle Owner Ambient . current . lifecycle Scope ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġb ub b led Ġby Ġremember ( sticky . alert ) Ġ{ Ġtimestamp Flow ( sticky . alert ) Ġ}. collect As State ( false ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFree form Sticky ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdetailed Ġ= Ġis Self Open , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb ub b led Ġ= Ġb ub b led , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalert Ġ= Ġsticky . alert ?. let (:: alert Text ) Ġ?: Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdrag ged Ġ= Ġdrag . is Dragging , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Ġ= Ġposition , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġsticky . title , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ= Ġsticky . color , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpile Index Ġ= Ġpile Index [ sticky . category ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpile Size Ġ= Ġpile Size [ sticky . category ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonClick Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Self Open ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonClick ( sticky . identifier ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdetail Scroll Ġ= ĠNo Scroll () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel Ġ= Ġmodel . category Open ( sticky . category ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Drag Started Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdrag ged Ġ= Ġdrag ged Ġ+ Ġsticky . identifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Self Open Ġ|| Ġ! model . category Open ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Drag ( Dragging ( position )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Drag Stopped Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdrag ged Ġ= Ġdrag ged Ġ- Ġsticky . identifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Drag ( Not Dragging ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġto P ile Ġ= Ġmodel . category Open Index ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( to P ile Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel Ġ= Ġmodel . sticky MoveTo Top ( sticky . identifier , Ġdrop Index ( position )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġto Index Ġ= Ġdrop Index Detail ( detail Scroll , Ġposition ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( to Index Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel Ġ= Ġmodel . sticky Move Before Index ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġidentifier Ġ= Ġsticky . identifier , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto P ile Ġ= Ġto P ile , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Index Ġ= Ġto Index ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( drop Index ( position ) Ġ== ĠGrid Horizontal Cell Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( updated , Ġundo ) Ġ= Ġmodel . sticky Remove ( sticky . identifier ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscope . undo After ( und os , Ġundo ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel Ġ= Ġupdated ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Drag Offset Ġ= Ġ{ Ġoffset Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( drag . is Dragging ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Drag ( Dragging ( position Ġ+ Ġoffset )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( model . category Open ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 7 0 0 ms Ġoverlay Ġdelay Ġfor Ġdropping Ġon Ġthe Ġchange Ġcategory . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( drop Index ( position Ġ+ Ġoffset ) Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsticky To Time Ġ= Ġdrag ged For Move ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sticky To Time Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdrag ged For Move Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsticky . identifier Ġto ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelta Ġ= ĠSystem . currentTimeMillis () Ġ- Ġsticky To Time . second ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( delta Ġ> Ġ 7 0 0 L Ġ&& Ġsticky To Time . first Ġ== Ġsticky . identifier ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdrag ged For Move Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdetail Scroll Ġ= ĠNo Scroll () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel Ġ= Ġmodel . category Close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġare Ġnot Ġoverlay ing . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( drag ged For Move ?. first Ġ== Ġsticky . identifier ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdrag ged For Move Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ // ĠFREE FORM ĠCOMP OS ABLE S . Ċ Ċ /** Ċ Ġ* ĠA Ġcomp osable Ġthat Ġcan Ġdisplay Ġa Ġfloating Ġsticky . Ċ Ġ* Ċ Ġ* Ġ@ param Ġb ub b led Ġtrue Ġif Ġa Ġbubble Ġshould Ġbe Ġdisplayed . Ċ Ġ* Ġ@ param Ġdrag ged Ġtrue Ġif Ġthis Ġsticky Ġis Ġcurrently Ġdrag ged . Ċ Ġ* Ġ@ param Ġoffset Ġwhat Ġthe Ġoffset Ġfor Ġthis Ġsticky Ġshould Ġbe . Ċ Ġ* Ġ@ param Ġtitle Ġthe Ġ[ String ] Ġcontent Ġof Ġthe Ġsticky . Ċ Ġ* Ġ@ param Ġcolor Ġthe Ġ[ Color ] Ġused Ġfor Ġthe Ġsticky Ġsurface . Ċ Ġ* Ġ@ param Ġpile Index Ġwhat 's Ġthe Ġindex Ġof Ġthis Ġsticky Ġin Ġits Ġpile Ċ Ġ* Ġ@ param Ġon Drag Started Ġcalled Ġwhen Ġa Ġdrag Ġgesture Ġstarts Ġon Ġthe Ġsticky . Ċ Ġ* Ġ@ param Ġon Drag Offset Ġcalled Ġwhen Ġa Ġdrag Ġgesture Ġmoves Ġon Ġthe Ġsticky . Ċ Ġ* Ġ@ param Ġon Drag Stopped Ġcalled Ġwhen Ġa Ġdrag Ġgesture Ġstops Ġon Ġthe Ġsticky . Ċ Ġ* Ġ@ param ĠonClick Ġcalled Ġwhen Ġthis Ġsticky Ġis Ġclicked . Ċ Ġ* Ġ@ param Ġmodifier Ġthe Ġ[ Modifier ] Ġfor Ġthis Ġcomp osable . Ċ Ġ*/ Ċ @ Composable Ċ private Ġfun ĠFree form Sticky ( ĊĠĠĠ Ġdetailed : ĠBoolean , ĊĠĠĠ Ġb ub b led : ĠBoolean , ĊĠĠĠ Ġalert : ĠString , ĊĠĠĠ Ġdrag ged : ĠBoolean , ĊĠĠĠ Ġoffset : ĠOffset , ĊĠĠĠ Ġtitle : ĠString , ĊĠĠĠ Ġcolor : ĠColor , ĊĠĠĠ Ġpile Index : ĠInt , ĊĠĠĠ Ġpile Size : ĠInt , ĊĠĠĠ Ġmodifier : ĠModifier Ġ= ĠModifier , ĊĠĠĠ Ġon Drag Started : Ġ() Ġ-> ĠUnit Ġ= Ġ{}, ĊĠĠĠ Ġon Drag Offset : Ġ( Offset ) Ġ-> ĠUnit Ġ= Ġ{}, ĊĠĠĠ Ġon Drag Stopped : Ġ( speed : ĠOffset ) Ġ-> ĠUnit Ġ= Ġ{}, ĊĠĠĠ ĠonClick : Ġ() Ġ-> ĠUnit , Ċ ) Ġ{ ĊĠĠĠ Ġval Ġh aptic Ġ= ĠH aptic Feed Back Ambient . current ĊĠĠĠ Ġval Ġst iff ness Step Ġ= Ġif Ġ( p ile Size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ( Sticky Max St iff ness Ġ- ĠSt icky Min St iff ness ) Ġ/ Ġ( p ile Size Ġ- Ġ 1 ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠ 0 f ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġskip Slow down Ġ= Ġif Ġ( detailed Ġ|| Ġdrag ged ) Ġ 0 f Ġelse Ġ 1 f ĊĠĠĠ Ġval Ġspring Ġ= Ġspring ( ĊĠĠĠĠĠĠĠ Ġd amping Ratio Ġ= ĠSpring . D amping Ratio Low Bo unc y , ĊĠĠĠĠĠĠĠ Ġst iff ness Ġ= ĠSt icky Max St iff ness Ġ- Ġ( st iff ness Step Ġ* Ġpile Index Ġ* Ġskip Slow down ), ĊĠĠĠĠĠĠĠ Ġvisibility Threshold Ġ= Ġ 0 . 0 1 f , ĊĠĠĠ Ġ) ĊĠĠĠ Ġval Ġdp Spring Ġ= Ġspring ( ĊĠĠĠĠĠĠĠ Ġd amping Ratio Ġ= ĠSpring . D amping Ratio No Bo unc y , ĊĠĠĠĠĠĠĠ Ġst iff ness Ġ= ĠSt icky Max St iff ness , ĊĠĠĠĠĠĠĠ Ġvisibility Threshold Ġ= Ġ 0 . 1 . dp , ĊĠĠĠ Ġ) ĊĠĠĠ Ġval Ġscale Ġ= Ġanimate ( if Ġ( drag ged ) Ġ 1 . 1 5 f Ġelse Ġ 1 . 0 f , Ġspring ) ĊĠĠĠ Ġval Ġelevation Ġ= Ġanimate ( ĊĠĠĠĠĠĠĠ Ġif Ġ( drag ged ) ĠSt icky Raised Elevation Ġelse ĠSt icky Default Elevation , ĊĠĠĠĠĠĠĠ Ġdp Spring , ĊĠĠĠ Ġ) ĊĠĠĠ Ġval Ġbase Ġ= Ġelevation . value Ġ+ Ġ(( p ile Size Ġ- Ġ( p ile Index Ġ+ Ġ 1 )) Ġ/ Ġpile Size . toFloat ()) Ġ+ Ġ 1 0 f ĊĠĠĠ Ġval Ġsupp lement Ġ= Ġif Ġ( drag ged ) Ġ 1 . 0 f Ġelse Ġ 0 f ĊĊĠĠĠ ĠB ubble ( ĊĠĠĠĠĠĠĠ Ġvisible Ġ= Ġb ub b led , ĊĠĠĠĠĠĠĠ Ġmodifier ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. offset Px ( animate ( offset . x , Ġspring ), Ġanimate ( offset . y , Ġspring )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. size ( Sticky Size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. draw Layer ( scale X Ġ= Ġscale , Ġscale Y Ġ= Ġscale ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. z Index ( base Ġ+ Ġsupp lement ) ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ ĠSt icky ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġtitle , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalert Ġ= Ġalert , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ= Ġcolor , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelevation Ġ= Ġelevation , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO Ġ: ĠMake Ġthis Ġan Ġattribute Ġof ĠSt icky . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. click able ( onClick Ġ= ĠonClick , Ġindication Ġ= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. long Press Drag Gesture Filter ( object Ġ: ĠLong Press Drag Observer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Long Press ( px Position : ĠOffset ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġh aptic . perform H aptic Feedback ( H aptic Feedback Type . Long Press ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Drag Started () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Stop ( velocity : ĠOffset ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Drag Stopped ( velocity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Drag ( drag Distance : ĠOffset ): ĠOffset Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Drag Offset ( drag Distance ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsuper . on Drag ( drag Distance ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. draw Layer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrotation Z Ġ= Ġanimate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( detailed Ġ|| Ġdrag ged ) Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠP ile Angles [ p ile Index Ġ% ĠP ile Angles . size ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspring , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransform Origin Ġ= ĠTransform Origin . Center , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). offset ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ= Ġanimate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( detailed Ġ|| Ġdrag ged ) Ġ 0 . dp ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠP ile Offset X [ p ile Index Ġ% ĠP ile Offset X . size ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdp Spring , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy Ġ= Ġanimate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( detailed Ġ|| Ġdrag ged ) Ġ 0 . dp ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠP ile Offset Y [ p ile Index Ġ% ĠP ile Offset Y . size ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdp Spring , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠSome Ġconstants Ġthat Ġare Ġused Ġby Ġthe Ġ[ Pane ] Ġcomp osable . ĠThey Ġdefine Ġdifferent Ġbehaviors Ġthat Ġare Ċ Ġ* Ġrelevant Ġto Ġthe Ġrendering Ġbits Ġof Ġpan es . Ċ Ġ*/ Ċ object ĠP ane Constants Ġ{ ĊĊĠĠĠ Ġ// ĠSt iff ness Ġthat 's Ġgiven Ġto Ġthe Ġdifferent Ġspr ings . ĊĠĠĠ Ġconst Ġval ĠSt icky Min St iff ness Ġ= ĠSpring . St iff ness Very Low ĊĠĠĠ Ġconst Ġval ĠSt icky Max St iff ness Ġ= ĠSpring . St iff ness Low ĊĊĠĠĠ Ġ// ĠAng les Ġand Ġoffsets Ġapplied Ġto Ġstick ies , Ġdepending Ġon Ġtheir Ġpile Ġindex . ĊĠĠĠ Ġval ĠP ile Angles Ġ= ĠlistOf ( 0 f , Ġ 3 f , Ġ- 2 f ) ĊĠĠĠ Ġval ĠP ile Offset X Ġ= ĠlistOf ( 0 . dp , Ġ 4 . dp , Ġ(- 4 ). dp , Ġ 3 . dp ) ĊĠĠĠ Ġval ĠP ile Offset Y Ġ= ĠlistOf ( 0 . dp , Ġ(- 6 ). dp , Ġ(- 6 ). dp , Ġ 2 . dp ) Ċ } Ċ