/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* Ġ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 Ġandroidx . compose . foundation . re location Ċ Ċ import Ġandroidx . compose . foundation . Experimental Foundation Api Ċ import Ġandroidx . compose . runtime . remember Ċ import Ġandroidx . compose . ui . Modifier Ċ import Ġandroidx . compose . ui . composed Ċ import Ġandroidx . compose . ui . geometry . Rect Ċ import Ġandroidx . compose . ui . layout . Layout Coordinates Ċ import Ġandroidx . compose . ui . modifier . Modifier Local Provider Ċ import Ġandroidx . compose . ui . modifier . Pro vid able Modifier Local Ċ import Ġandroidx . compose . ui . platform . debug Inspector Info Ċ import Ġkotlinx . coroutines . coroutine Scope Ċ import Ġkotlinx . coroutines . launch Ċ Ċ /** Ċ Ġ* ĠA Ġparent Ġthat Ġcan Ġrespond Ġto Ġ[ br ing Child Into View ] Ġrequests Ġfrom Ġits Ġchildren , Ġand Ġscroll Ġso Ġthat Ċ Ġ* Ġthe Ġitem Ġis Ġvisible Ġon Ġscreen . ĠTo Ġapply Ġa Ġresponder Ġto Ġan Ġelement , Ġpass Ġit Ġto Ġthe Ċ Ġ* Ġ[ br ing Into View Responder ] Ġmodifier . Ċ Ġ* Ċ Ġ* ĠWhen Ġa Ġcomponent Ġcalls Ġ[ B ring Into View Request er . br ing Into View ], Ġthe Ċ Ġ* Ġ[ B ring Into View ĠModifier Local ][ Modifier Local B ring Into View Parent ] Ġis Ġread Ġto Ġgain Ġaccess Ġto Ġthe Ċ Ġ* Ġ[ B ring Into View Responder ], Ġwhich Ġis Ġresponsible Ġfor , Ġin Ġorder : Ċ Ġ* Ċ Ġ* Ġ 1 . ĠCalcul ating Ġa Ġrectangle Ġthat Ġits Ġparent Ġresponder Ġshould Ġbring Ġinto Ġview Ġby Ġreturning Ġit Ġfrom Ċ Ġ* ĠĠĠ Ġ[ calculate Rect For Parent ]. Ċ Ġ* Ġ 2 . ĠPerform ing Ġany Ġscroll Ġor Ġother Ġlayout Ġadjust ments Ġneeded Ġto Ġensure Ġthe Ġrequested Ġrectangle Ġis Ċ Ġ* ĠĠĠ Ġbrought Ġinto Ġview Ġin Ġ[ br ing Child Into View ]. Ċ Ġ* Ċ Ġ* ĠHere Ġis Ġa Ġsample Ġdefining Ġa Ġcustom Ġ[ B ring Into View Responder ]: Ċ Ġ* Ġ@ sample Ġandroidx . compose . foundation . samples . B ring Into View Responder Sample Ċ Ġ* Ċ Ġ* ĠHere Ġis Ġa Ġsample Ġwhere Ġa Ġcomp osable Ġis Ġbrought Ġinto Ġview : Ċ Ġ* Ġ@ sample Ġandroidx . compose . foundation . samples . B ring Into View Sample Ċ Ġ* Ċ Ġ* ĠHere Ġis Ġa Ġsample Ġwhere Ġa Ġpart Ġof Ġa Ġcomp osable Ġis Ġbrought Ġinto Ġview : Ċ Ġ* Ġ@ sample Ġandroidx . compose . foundation . samples . B ring Part Of Composable Into View Sample Ċ Ġ* Ċ Ġ* Ġ@ see ĠB ring Into View Request er Ċ Ġ*/ Ċ @ Experimental Foundation Api Ċ interface ĠB ring Into View Responder Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturn Ġthe Ġrectangle Ġin Ġthis Ġnode Ġthat Ġshould Ġbe Ġbrought Ġinto Ġview Ġby Ġthis Ġnode 's Ġparent , ĊĠĠĠĠ Ġ* Ġin Ġcoordinates Ġrelative Ġto Ġthis Ġnode . ĠIf Ġthis Ġnode Ġneeds Ġto Ġadjust Ġitself Ġto Ġbring ĊĠĠĠĠ Ġ* Ġ[ local Rect ] Ġinto Ġview , Ġthe Ġreturned Ġrectangle Ġshould Ġbe Ġthe Ġdestination Ġrectangle Ġthat ĊĠĠĠĠ Ġ* Ġ[ local Rect ] Ġwill Ġeventually Ġocc upy Ġonce Ġthis Ġnode 's Ġcontent Ġis Ġadjusted . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġlocal Rect ĠThe Ġrectangle Ġthat Ġshould Ġbe Ġbrought Ġinto Ġview , Ġrelative Ġto Ġthis Ġnode . ĠThis ĊĠĠĠĠ Ġ* Ġwill Ġbe Ġthe Ġsame Ġrectangle Ġpassed Ġto Ġ[ br ing Child Into View ]. ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġrectangle Ġin Ġthis Ġnode Ġthat Ġshould Ġbe Ġbrought Ġinto Ġview Ġitself , Ġrelative Ġto Ġthis ĊĠĠĠĠ Ġ* Ġnode . ĠIf Ġthis Ġnode Ġneeds Ġto Ġscroll Ġto Ġbring Ġ[ local Rect ] Ġinto Ġview , Ġthe Ġreturned Ġrectangle ĊĠĠĠĠ Ġ* Ġshould Ġbe Ġthe Ġdestination Ġrectangle Ġthat Ġ[ local Rect ] Ġwill Ġeventually Ġocc upy , Ġonce Ġthe ĊĠĠĠĠ Ġ* Ġscrolling Ġanimation Ġis Ġfinished . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Experimental Foundation Api ĊĠĠĠ Ġfun Ġcalculate Rect For Parent ( local Rect : ĠRect ): ĠRect ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠB ring Ġthis Ġspecified Ġrectangle Ġinto Ġbounds Ġby Ġmaking Ġthis Ġscroll able Ġparent Ġscroll ĊĠĠĠĠ Ġ* Ġappropriately . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġlocal Rect ĠThe Ġrectangle Ġthat Ġshould Ġbe Ġbrought Ġinto Ġview , Ġrelative Ġto Ġthis Ġnode . ĠThis ĊĠĠĠĠ Ġ* Ġis Ġthe Ġsame Ġrectangle Ġthat Ġwill Ġhave Ġbeen Ġpassed Ġto Ġ[ calculate Rect For Parent ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Experimental Foundation Api ĊĠĠĠ Ġsuspend Ġfun Ġbring Child Into View ( local Rect : ĠRect ) Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġparent Ġthat Ġcan Ġrespond Ġto Ġ[ B ring Into View Request er ] Ġrequests Ġfrom Ġits Ġchildren , Ġand Ġscroll Ġso Ċ Ġ* Ġthat Ġthe Ġitem Ġis Ġvisible Ġon Ġscreen . ĠSee Ġ[ B ring Into View Responder ] Ġfor Ġmore Ġdetails Ġabout Ġhow Ċ Ġ* Ġthis Ġmechanism Ġworks . Ċ Ġ* Ċ Ġ* Ġ@ sample Ġandroidx . compose . foundation . samples . B ring Into View Responder Sample Ċ Ġ* Ġ@ sample Ġandroidx . compose . foundation . samples . B ring Into View Sample Ċ Ġ* Ċ Ġ* Ġ@ see ĠB ring Into View Request er Ċ Ġ*/ Ċ @ Experimental Foundation Api Ċ fun ĠModifier . br ing Into View Responder ( ĊĠĠĠ Ġresponder : ĠB ring Into View Responder Ċ ): ĠModifier Ġ= Ġcomposed ( debug Inspector Info Ġ{ ĊĠĠĠ Ġname Ġ= Ġ" br ing Into View Responder " ĊĠĠĠ Ġproperties [" responder "] Ġ= Ġresponder Ċ }) Ġ{ ĊĠĠĠ Ġval Ġdefault Parent Ġ= Ġremember Default B ring Into View Parent () ĊĠĠĠ Ġval Ġmodifier Ġ= Ġremember ( default Parent ) Ġ{ ĊĠĠĠĠĠĠĠ ĠB ring Into View Responder Modifier ( default Parent ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġmodifier . responder Ġ= Ġresponder ĊĠĠĠ Ġreturn @ composed Ġmodifier Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġmodifier Ġthat Ġholds Ġstate Ġand Ġmodifier Ġimplementations Ġfor Ġ[ br ing Into View Responder ]. ĠIt Ġhas Ċ Ġ* Ġaccess Ġto Ġthe Ġnext Ġ[ B ring Into View Parent ] Ġvia Ġ[ B ring Into View Child Modifier ] Ġand Ġaddition ally Ċ Ġ* Ġprovides Ġitself Ġas Ġthe Ġ[ B ring Into View Parent ] Ġfor Ġsubsequent Ġmodifiers . ĠThis Ġclass Ġis Ġresponsible Ċ Ġ* Ġfor Ġrecursively Ġpropag ating Ġrequests Ġup Ġthe Ġresponder Ġchain . Ċ Ġ*/ Ċ @ Opt In ( Experimental Foundation Api :: class ) Ċ private Ġclass ĠB ring Into View Responder Modifier ( ĊĠĠĠ Ġdefault Parent : ĠB ring Into View Parent Ċ ) Ġ: ĠB ring Into View Child Modifier ( default Parent ), ĊĠĠĠ ĠModifier Local Provider < B ring Into View Parent ? >, ĊĠĠĠ ĠB ring Into View Parent Ġ{ ĊĊĠĠĠ Ġlateinit Ġvar Ġresponder : ĠB ring Into View Responder ĊĊĠĠĠ Ġoverride Ġval Ġkey : ĠPro vid able Modifier Local < B ring Into View Parent ?> ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠModifier Local B ring Into View Parent ĊĠĠĠ Ġoverride Ġval Ġvalue : ĠB ring Into View Parent ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġthis ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRes pon ds Ġto Ġa Ġchild 's Ġrequest Ġby Ġfirst Ġconverting Ġ[ rect ] Ġinto Ġthis Ġnode 's Ġ[ Layout Coordinates ] ĊĠĠĠĠ Ġ* Ġand Ġthen , Ġconcurrent ly , Ġcalling Ġthe Ġ[ responder ] Ġand Ġthe Ġ[ parent ] Ġto Ġhandle Ġthe Ġrequest . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġbring Child Into View ( rect : ĠRect , Ġchild Coordinates : ĠLayout Coordinates ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlayout Coordinates Ġ= Ġlayout Coordinates Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġif Ġ(! child Coordinates . is Attached ) Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġlocal Rect Ġ= Ġlayout Coordinates . local Rect Of ( child Coordinates , Ġrect ) ĊĠĠĠĠĠĠĠ Ġval Ġparent Rect Ġ= Ġresponder . calculate Rect For Parent ( local Rect ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠFor Ġthe Ġitem Ġto Ġbe Ġvisible , Ġif Ġneeds Ġto Ġbe Ġin Ġthe Ġviewport Ġof Ġall Ġits Ġan cestors . ĊĠĠĠĠĠĠĠ Ġ// ĠNote : ĠFor Ġnow Ġwe Ġrun Ġboth Ġof Ġthese Ġconcurrent ly , Ġbut Ġin Ġthe Ġfuture Ġwe Ġcould Ġmake Ġthis ĊĠĠĠĠĠĠĠ Ġ// Ġconfigurable . Ġ( The Ġchild Ġre location Ġcould Ġbe Ġexecuted Ġbefore Ġthe Ġparent , Ġor Ġparent ĊĠĠĠĠĠĠĠ Ġ// Ġbefore Ġthe Ġchild ). ĊĠĠĠĠĠĠĠ Ġcoroutine Scope Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠB ring Ġthe Ġrequested ĠChild Ġinto Ġthis Ġparent 's Ġview . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponder . br ing Child Into View ( local Rect ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent . br ing Child Into View ( parent Rect , Ġlayout Coordinates ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠTrans lates Ġ[ rect ], Ġspecified Ġin Ġ[ source Coordinates ], Ġinto Ġthis Ġ[ Layout Coordinates ]. Ċ Ġ*/ Ċ private Ġfun ĠLayout Coordinates . local Rect Of ( ĊĠĠĠ Ġsource Coordinates : ĠLayout Coordinates , ĊĠĠĠ Ġrect : ĠRect Ċ ): ĠRect Ġ{ ĊĠĠĠ Ġ// ĠTranslate Ġthe Ġsupplied Ġlayout Ġcoordinates Ġinto Ġthe Ġcoordinate Ġsystem Ġof Ġthis Ġparent . ĊĠĠĠ Ġval Ġlocal Rect Ġ= Ġlocal BoundingBox Of ( source Coordinates , Ġclip Bounds Ġ= Ġfalse ) ĊĊĠĠĠ Ġ// ĠTranslate Ġthe Ġrect Ġto Ġthis Ġparent 's Ġlocal Ġcoordinates . ĊĠĠĠ Ġreturn Ġrect . translate ( local Rect . top Left ) Ċ }