/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠSquare ĠInc . Ċ Ġ* Ċ Ġ* Ġ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 Ġcom . squareup . workflow . ui . compose . internal Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup . LayoutParams . MATCH _ PARENT Ċ import Ġandroid . widget . Frame Layout Ċ import Ġandroidx . compose . foundation . layout . Box Ċ import Ġandroidx . compose . runtime . Composable Ċ import Ġandroidx . compose . runtime . Side Effect Ċ import Ġandroidx . compose . runtime . remember Ċ import Ġandroidx . compose . ui . Modifier Ċ import Ġandroidx . compose . ui . node . Ref Ċ import Ġandroidx . compose . ui . view interop . Android View Ċ import Ġcom . squareup . workflow 1 . ui . View Environment Ċ import Ġcom . squareup . workflow 1 . ui . View Factory Ċ import Ġcom . squareup . workflow 1 . ui . Workflow Layout Ċ import Ġcom . squareup . workflow 1 . ui . Workflow Ui Experimental Api Ċ import Ġcom . squareup . workflow 1 . ui . can Show Rendering Ċ import Ġcom . squareup . workflow . ui . compose . Compose View Factory Ċ import Ġcom . squareup . workflow . ui . compose . Workflow Container Ċ import Ġcom . squareup . workflow 1 . ui . get Rendering Ċ import Ġcom . squareup . workflow 1 . ui . show Rendering Ċ import Ġkotlin . properties . Deleg ates . observable Ċ Ċ /** Ċ Ġ* ĠR enders Ġ[ rendering ] Ġinto Ġthe Ġcomposition Ġusing Ġ[ view Factory ]. Ċ Ġ* Ċ Ġ* ĠTo Ġdisplay Ġa Ġnested Ġrendering Ġfrom Ġa Ċ Ġ* Ġ[ Composable Ġview Ġbinding ][ com . squareup . workflow . ui . compose . composed View Factory ], Ġuse Ġthe Ġoverload Ċ Ġ* Ġwithout Ġa Ġ[ View Factory ] Ġparameter . Ċ Ġ* Ċ Ġ* Ġ* Note : Ġ[ rendering ] Ġmust Ġbe Ġthe Ġsame Ġtype Ġas Ġthis Ġ[ View Factory ], Ġeven Ġthough Ġthe Ġtype Ġsystem Ġdoes Ċ Ġ* Ġnot Ġenforce Ġthis Ġconstraint . ĠThis Ġis Ġdue Ġto Ġa ĠCompose Ġcompiler Ġbug Ġtracked Ċ Ġ* Ġ[ here ]( https :// issue tracker . google . com / issues / 1 5 6 5 2 7 3 3 2 ). Ċ Ġ* Ċ Ġ* Ġ@ see Ġcom . squareup . workflow . ui . compose . Workflow Rendering Ċ Ġ*/ Ċ @ Workflow Ui Experimental Api Ċ @ Composable Ġinternal Ġfun Ġ< Rendering T Ġ: ĠAny > ĠWorkflow Rendering ( ĊĠ Ġrendering : ĠRendering T , ĊĠ Ġview Factory : ĠView Factory < Rendering T >, ĊĠ Ġview Environment : ĠView Environment , ĊĠ Ġmodifier : ĠModifier Ġ= ĠModifier Ċ ) Ġ{ ĊĠ ĠBox ( modifier Ġ= Ġmodifier ) Ġ{ ĊĠĠĠ Ġ// Ġ" Fast " Ġpath : ĠIf Ġthe Ġchild Ġbinding Ġis Ġalso Ġa ĠComp osable , Ġwe Ġdon 't Ġneed Ġto Ġgo Ġthrough Ġthe ĊĠĠĠ Ġ// Ġlegacy Ġview Ġsystem Ġand Ġcan Ġjust Ġinvoke Ġthe Ġbinding 's Ġcomp osable Ġfunction Ġdirectly . ĊĠĠĠ Ġif Ġ( view Factory Ġis ĠCompose View Factory ) Ġ{ ĊĠĠĠĠĠ Ġview Factory . content ( rendering , Ġview Environment ) ĊĠĠĠĠĠ Ġreturn @ Box ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ" Slow " Ġpath : ĠCreate Ġa Ġlegacy ĠAndroid ĠView Ġto Ġshow Ġthe Ġrendering , Ġlike ĠWorkflow View Stub . ĊĠĠĠ ĠView Factory Android View ( view Factory , Ġrendering , Ġview Environment ) ĊĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠThis Ġis Ġeffectively Ġthe Ġlogic Ġof Ġ[ com . squareup . workflow 1 . ui . Workflow View Stub ], Ġbut Ġtranslated Ċ Ġ* Ġinto ĠCompose Ġid iom s . ĠThis Ġapproach Ġhas Ġa Ġfew Ġadv antages : Ċ Ġ* Ċ Ġ* Ġ Ġ- ĠAvoid s Ġextra Ġcustom Ġviews Ġrequired Ġto Ġhost Ġ` Workflow View Stub ` Ġinside Ġa ĠComp osition . ĠIts Ġtrick Ċ Ġ* ĠĠĠ Ġof Ġreplacing Ġitself Ġin Ġits Ġparent Ġdoesn 't Ġplay Ġnice Ġwith ĠCompose . Ċ Ġ* Ġ Ġ- ĠAllows Ġus Ġto Ġpass Ġthe Ġcorrect Ġparent Ġview Ġfor Ġinfl ation Ġ( the Ġroot Ġof Ġthe Ġcomposition ). Ċ Ġ* Ġ Ġ- ĠAvoid s Ġ` Workflow View Stub ` Ġhaving Ġto Ġdo Ġits Ġown Ġlookup Ġto Ġfind Ġthe Ġcorrect Ġ[ View Factory ], Ġsince Ċ Ġ* ĠĠĠ Ġwe Ġalready Ġhave Ġthe Ġcorrect Ġone . Ċ Ġ* Ċ Ġ* ĠLike Ġ` Workflow View Stub `, Ġthis Ġfunction Ġuses Ġthe Ġ[ view Factory ] Ġto Ġcreate Ġand Ġmemo ize Ġa Ġ[ View ] Ġto Ċ Ġ* Ġdisplay Ġthe Ġ[ rendering ], Ġkeeps Ġit Ġupdated Ġwith Ġthe Ġlatest Ġ[ rendering ] Ġand Ġ[ view Environment ], Ġand Ċ Ġ* Ġadds Ġit Ġto Ġthe Ġcomposition . Ċ Ġ*/ Ċ @ Workflow Ui Experimental Api Ċ @ Composable Ġprivate Ġfun Ġ< R Ġ: ĠAny > ĠView Factory Android View ( ĊĠ Ġview Factory : ĠView Factory < R >, ĊĠ Ġrendering : ĠR , ĊĠ Ġview Environment : ĠView Environment Ċ ) Ġ{ ĊĠ Ġ// ĠWe Ġcan 't Ġtrigger Ġsub composition s Ġduring Ġthe Ġcomposition Ġitself , Ġwe Ġhave Ġto Ġwait Ġuntil ĊĠ Ġ// Ġthe Ġcomposition Ġis Ġcommitted . ĠSo Ġinstead Ġof Ġsending Ġthe Ġupdate Ġin Ġthe ĠAndroid View Ġupdate ĊĠ Ġ// Ġlambda , Ġwe Ġjust Ġstore Ġthe Ġview Ġhere , Ġand Ġthen Ġsend Ġthe Ġupdate Ġand Ġview Ġfactory Ġin Ġan ĊĠ Ġ// Ġon Pre Commit Ġhook . ĠSee Ġhttps :// github . com / square / workflow - kotlin - compose / issues / 6 7 . ĊĠ Ġval Ġhost View Ref Ġ= Ġremember Ġ{ ĠRef < Host View >() Ġ} ĊĊĠ ĠAndroid View (:: Host View ) Ġ{ ĊĠĠĠ Ġhost View Ref . value Ġ= Ġit ĊĠ Ġ} ĊĊĠ ĠSide Effect Ġ{ ĊĠĠĠ Ġhost View Ref . value ?. let Ġ{ Ġhost View Ġ-> ĊĠĠĠĠĠ Ġhost View . view Factory Ġ= Ġview Factory ĊĠĠĠĠĠ Ġhost View . update Ġ= ĠPair ( rendering , Ġview Environment ) ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠThis Ġis Ġbasically Ġa Ġclone Ġof ĠWorkflow View Stub , Ġbut Ġit Ġtakes Ġan Ġexplicit Ġ[ View Factory ] Ġinstead Ċ Ġ* Ġof Ġlooking Ġone Ġup Ġitself , Ġand Ġdoesn 't Ġdo Ġthe Ġreplace - in - parent Ġtrick . Ċ Ġ* Ċ Ġ* ĠIt Ġdoesn 't Ġseem Ġpossible Ġto Ġcreate Ġthe Ġview Ġinside Ġa ĠComp osable Ġdirectly Ġand Ġuse Ċ Ġ* Ġ[ Android View ]. ĠI Ġcan 't Ġfigure Ġout Ġexactly Ġwhy Ġit Ġdoesn 't Ġwork , Ġbut ĠI Ċ Ġ* Ġthink Ġit Ġhas Ġsomething Ġto Ġdo Ġwith Ġgetting Ġinto Ġan Ġincorrect Ġstate Ġif Ġa Ġnon - Composable Ġview Ċ Ġ* Ġfactory Ġsynchronous ly Ġbuilds Ġand Ġbind s Ġa ĠComp osable View Factory Ġin Ġbuild View . ĠIn Ġthat Ġcase , Ġthe Ċ Ġ* Ġsecond Ġand Ġsubsequent Ġcompose Ġpasses Ġwill Ġlose Ġamb ients Ġfrom Ġthe Ġparent Ġcomposition . ĠI 've Ġspent Ċ Ġ* Ġa Ġbunch Ġof Ġtime Ġtrying Ġto Ġdebug Ġcompose Ġinternals Ġand Ġtrying Ġdifferent Ġapproaches Ġto Ġfigure Ġout Ċ Ġ* Ġwhy Ġthat Ġis , Ġbut Ġnothing Ġmakes Ġsense . ĠAll ĠI Ġknow Ġis Ġthat Ġusing Ġa Ġcustom Ġview Ġlike Ġthis Ġseems Ġto Ċ Ġ* Ġfix Ġit . Ċ Ġ* Ċ Ġ* ĠâĢ¦ Except Ġin Ġthe Ġcase Ġwhere Ġthe Ġhighest - level ĠComp osable View Factory Ġisn 't Ġa Ġsub composition Ġ( i . e . Ċ Ġ* Ġthe Ġworkflow Ġis Ġbeing Ġran Ġwith Ġa Ġ[ Workflow Layout ] Ġinstead Ġof Ġ[ Workflow Container ]). ĠOr Ġmaybe Ġit 's Ċ Ġ* Ġonly Ġif Ġthe Ġtop - level ĠView Factory Ġis Ġsuch Ġa ĠComp osable View Factory , ĠI Ġhaven 't Ġtested Ġother Ġlegacy Ċ Ġ* Ġview Ġfactories Ġbetween Ġthe Ġroot Ġand Ġthe Ġtop - level ĠCV F . ĠIn Ġthat Ġcase , Ġthere Ġseems Ġto Ġbe Ġa Ġrace Ċ Ġ* Ġcondition Ġwith Ġmeas uring Ġand Ġsecond Ġcompose Ġpass Ġwill Ġthrow Ġan Ġexception Ġabout Ġan Ġun meas ured Ċ Ġ* Ġnode . Ċ Ġ*/ Ċ @ Workflow Ui Experimental Api Ċ private Ġclass ĠHost View ( context : ĠContext ) Ġ: ĠFrame Layout ( context ) Ġ{ ĊĊĠ Ġprivate Ġvar Ġrer ender Ġ= Ġtrue ĊĠ Ġprivate Ġvar Ġview : ĠView ? Ġ= Ġnull ĊĊĠ Ġvar Ġview Factory Ġby Ġobservable < View Factory < *> ? >( null ) Ġ{ Ġ_, Ġold , Ġnew Ġ-> ĊĠĠĠ Ġif Ġ( old Ġ!= Ġnew ) Ġ{ ĊĠĠĠĠĠ Ġupdate () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġvar Ġupdate Ġby Ġobservable < Pair < Any , ĠView Environment >? >( null ) Ġ{ Ġ_, Ġold , Ġnew Ġ-> ĊĠĠĠ Ġif Ġ( old Ġ!= Ġnew ) Ġ{ ĊĠĠĠĠĠ Ġrer ender Ġ= Ġtrue ĊĠĠĠĠĠ Ġupdate () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġinit Ġ{ ĊĠĠĠ Ġlayout Params Ġ= ĠLayout Params ( MATCH _ PARENT , ĠMATCH _ PARENT ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġupdate () Ġ{ ĊĠĠĠ Ġif Ġ( view Factory Ġ== Ġnull ) Ġreturn ĊĠĠĠ Ġval Ġ( rendering , Ġview Environment ) Ġ= Ġupdate Ġ?: Ġreturn ĊĊĠĠĠ Ġif Ġ( view ?. can Show Rendering ( rendering ) Ġ!= Ġtrue ) Ġ{ ĊĠĠĠĠĠ Ġ// ĠBuild View Ġmust Ġcall Ġbind Show Rendering , Ġwhich Ġwill Ġcall Ġshow Rendering . ĊĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠ Ġview Ġ= Ġ( view Factory Ġas ĠView Factory < Any >) ĊĠĠĠĠĠĠĠ Ġ. build View ( rendering , Ġview Environment , Ġcontext , Ġthis ) ĊĊĠĠĠĠĠ Ġcheck ( view !!. get Rendering < Any >() Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ" View . bind Show Rendering Ġshould Ġhave Ġbeen Ġcalled Ġfor Ġ$ this , Ġtypically Ġby Ġthe Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ View Factory :: class . java . name } Ġthat Ġcreated Ġit ." ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġremove All Views () ĊĠĠĠĠĠ Ġadd View ( view ) ĊĠĠĠ Ġ} Ġelse Ġif Ġ( rer ender ) Ġ{ ĊĠĠĠĠĠ Ġview !!. show Rendering ( rendering , Ġview Environment ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġrer ender Ġ= Ġfalse ĊĠ Ġ} Ċ } Ċ