package Ġco il . compose Ċ Ċ import Ġandroid . graphics . drawable . Bitmap Drawable Ċ import Ġandroid . graphics . drawable . Color Drawable Ċ import Ġandroid . graphics . drawable . Drawable Ċ import Ġandroidx . compose . foundation . Image Ċ import Ġandroidx . compose . foundation . lazy . Lazy Column Ċ import Ġandroidx . compose . foundation . lazy . Lazy Row Ċ import Ġandroidx . compose . runtime . Composable Ċ import Ġandroidx . compose . runtime . Remember Observer Ċ import Ġandroidx . compose . runtime . Stable Ċ import Ġandroidx . compose . runtime . getValue Ċ import Ġandroidx . compose . runtime . mutable State Of Ċ import Ġandroidx . compose . runtime . remember Ċ import Ġandroidx . compose . runtime . setValue Ċ import Ġandroidx . compose . runtime . snapshot Flow Ċ import Ġandroidx . compose . ui . geometry . Size Ċ import Ġandroidx . compose . ui . geometry . is Unspecified Ċ import Ġandroidx . compose . ui . graphics . Color Ċ import Ġandroidx . compose . ui . graphics . Color Filter Ċ import Ġandroidx . compose . ui . graphics . Default Alpha Ċ import Ġandroidx . compose . ui . graphics . Filter Quality Ċ import Ġandroidx . compose . ui . graphics . Image Bitmap Ċ import Ġandroidx . compose . ui . graphics . as Image Bitmap Ċ import Ġandroidx . compose . ui . graphics . draw scope . Draw Scope Ċ import Ġandroidx . compose . ui . graphics . draw scope . Draw Scope . Companion . Default Filter Quality Ċ import Ġandroidx . compose . ui . graphics . p ainter . Bitmap Painter Ċ import Ġandroidx . compose . ui . graphics . p ainter . Color Painter Ċ import Ġandroidx . compose . ui . graphics . p ainter . Painter Ċ import Ġandroidx . compose . ui . graphics . vector . Image Vector Ċ import Ġandroidx . compose . ui . layout . Content Scale Ċ import Ġandroidx . compose . ui . platform . Local Inspection Mode Ċ import Ġandroidx . compose . ui . unit . Constraints Ċ import Ġco il . Image Loader Ċ import Ġco il . compose . Async Image Painter . Companion . Default Transform Ċ import Ġco il . compose . Async Image Painter . State Ċ import Ġco il . request . Error Result Ċ import Ġco il . request . Image Request Ċ import Ġco il . request . Image Result Ċ import Ġco il . request . Success Result Ċ import Ġco il . size . Dimension Ċ import Ġco il . size . Precision Ċ import Ġco il . transition . Cross fade Transition Ċ import Ġco il . transition . Transition Target Ċ import Ġcom . google . ac comp an ist . drawable p ainter . Drawable Painter Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . Supervisor Job Ċ import Ġkotlinx . coroutines . cancel Ċ import Ġkotlinx . coroutines . flow . Mutable State Flow Ċ import Ġkotlinx . coroutines . flow . first Ċ import Ġkotlinx . coroutines . flow . map Latest Ċ import Ġkotlinx . coroutines . flow . map NotNull Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlin . math . round ToInt Ċ import Ġco il . size . Size Ġas ĠCo il Size Ċ Ċ /** Ċ Ġ* ĠReturn Ġan Ġ[ Async Image Painter ] Ġthat Ġexecutes Ġan Ġ[ Image Request ] Ġasynchronously Ġand Ġrenders Ġthe Ġresult . Ċ Ġ* Ċ Ġ* Ġ** This Ġis Ġa Ġlower - level ĠAPI Ġthan Ġ[ Async Image ] Ġand Ġmay Ġnot Ġwork Ġas Ġexpected Ġin Ġall Ġsituations .** Ċ Ġ* Ġ** It 's Ġhighly Ġrecommended Ġto Ġuse Ġ[ Async Image ] Ġunless Ġyou Ġneed Ġa Ġreference Ġto Ġa Ġ[ Painter ]. ** Ċ Ġ* Ċ Ġ* Ġ- Ġ[ Async Image Painter ] Ġwill Ġnot Ġfinish Ġloading Ġif Ġ[ Async Image Painter . on Draw ] Ġis Ġnot Ġcalled . Ċ Ġ* ĠĠ ĠThis Ġcan Ġoccur Ġif Ġa Ġcomp osable Ġhas Ġan Ġun bounded Ġ( i . e . Ġ[ Constraints . Infinity ]) Ġwidth / height Ċ Ġ* ĠĠ Ġconstraint . ĠFor Ġexample , Ġto Ġuse Ġ[ Async Image Painter ] Ġwith Ġ[ Lazy Row ] Ġor Ġ[ Lazy Column ], Ġyou Ġmust Ċ Ġ* ĠĠ Ġset Ġa Ġbounded Ġwidth Ġor Ġheight Ġrespectively . Ċ Ġ* Ġ- Ġ[ Async Image Painter . state ] Ġdoes Ġnot Ġtransition Ġto Ġ[ State . Success ] Ġsynchronous ly Ġduring Ġthe Ċ Ġ* ĠĠ Ġcomposition Ġphase . ĠUse Ġ[ Sub compose Async Image ] Ġif Ġyou Ġneed Ġthis . Ċ Ġ* Ċ Ġ* Ġ@ param Ġmodel ĠEither Ġan Ġ[ Image Request ] Ġor Ġthe Ġ[ Image Request . data ] Ġvalue . Ċ Ġ* Ġ@ param Ġimage Loader ĠThe Ġ[ Image Loader ] Ġthat Ġwill Ġbe Ġused Ġto Ġexecute Ġthe Ġrequest . Ċ Ġ* Ġ@ param Ġplaceholder ĠA Ġ[ Painter ] Ġthat Ġis Ġdisplayed Ġwhile Ġthe Ġimage Ġis Ġloading . Ċ Ġ* Ġ@ param Ġerror ĠA Ġ[ Painter ] Ġthat Ġis Ġdisplayed Ġwhen Ġthe Ġimage Ġrequest Ġis Ġun successful . Ċ Ġ* Ġ@ param Ġfallback ĠA Ġ[ Painter ] Ġthat Ġis Ġdisplayed Ġwhen Ġthe Ġrequest 's Ġ[ Image Request . data ] Ġis Ġnull . Ċ Ġ* Ġ@ param Ġon Loading ĠCalled Ġwhen Ġthe Ġimage Ġrequest Ġbegins Ġloading . Ċ Ġ* Ġ@ param ĠonSuccess ĠCalled Ġwhen Ġthe Ġimage Ġrequest Ġcompletes Ġsuccessfully . Ċ Ġ* Ġ@ param ĠonError ĠCalled Ġwhen Ġthe Ġimage Ġrequest Ġcompletes Ġun successfully . Ċ Ġ* Ġ@ param Ġcontent Scale ĠUsed Ġto Ġdetermine Ġthe Ġaspect Ġratio Ġscaling Ġto Ġbe Ġused Ġif Ġthe Ġcanvas Ġbounds Ċ Ġ* Ġ Ġare Ġa Ġdifferent Ġsize Ġfrom Ġthe Ġintr insic Ġsize Ġof Ġthe Ġimage Ġloaded Ġby Ġ[ model ]. ĠThis Ġshould Ġbe Ġset Ċ Ġ* Ġ Ġto Ġthe Ġsame Ġvalue Ġthat 's Ġpassed Ġto Ġ[ Image ]. Ċ Ġ* Ġ@ param Ġfilter Quality ĠS ampling Ġalgorithm Ġapplied Ġto Ġa Ġbitmap Ġwhen Ġit Ġis Ġscaled Ġand Ġdrawn Ġinto Ġthe Ċ Ġ* Ġ Ġdestination . Ċ Ġ*/ Ċ @ Composable Ċ fun Ġremember Async Image Painter ( ĊĠĠĠ Ġmodel : ĠAny ?, ĊĠĠĠ Ġimage Loader : ĠImage Loader , ĊĠĠĠ Ġplaceholder : ĠP ainter ? Ġ= Ġnull , ĊĠĠĠ Ġerror : ĠP ainter ? Ġ= Ġnull , ĊĠĠĠ Ġfallback : ĠP ainter ? Ġ= Ġerror , ĊĠĠĠ Ġon Loading : Ġ(( State . Loading ) Ġ-> ĠUnit )? Ġ= Ġnull , ĊĠĠĠ ĠonSuccess : Ġ(( State . Success ) Ġ-> ĠUnit )? Ġ= Ġnull , ĊĠĠĠ ĠonError : Ġ(( State . Error ) Ġ-> ĠUnit )? Ġ= Ġnull , ĊĠĠĠ Ġcontent Scale : ĠContent Scale Ġ= ĠContent Scale . Fit , ĊĠĠĠ Ġfilter Quality : ĠFilter Quality Ġ= ĠDefault Filter Quality , Ċ ) Ġ= Ġremember Async Image Painter ( ĊĠĠĠ Ġmodel Ġ= Ġmodel , ĊĠĠĠ Ġimage Loader Ġ= Ġimage Loader , ĊĠĠĠ Ġtransform Ġ= Ġtransform Of ( placeholder , Ġerror , Ġfallback ), ĊĠĠĠ Ġon State Ġ= Ġon State Of ( on Loading , ĠonSuccess , ĠonError ), ĊĠĠĠ Ġcontent Scale Ġ= Ġcontent Scale , ĊĠĠĠ Ġfilter Quality Ġ= Ġfilter Quality , Ċ ) Ċ Ċ /** Ċ Ġ* ĠReturn Ġan Ġ[ Async Image Painter ] Ġthat Ġexecutes Ġan Ġ[ Image Request ] Ġasynchronously Ġand Ġrenders Ġthe Ġresult . Ċ Ġ* Ċ Ġ* Ġ** This Ġis Ġa Ġlower - level ĠAPI Ġthan Ġ[ Async Image ] Ġand Ġmay Ġnot Ġwork Ġas Ġexpected Ġin Ġall Ġsituations .** Ċ Ġ* Ġ** It 's Ġhighly Ġrecommended Ġto Ġuse Ġ[ Async Image ] Ġunless Ġyou Ġneed Ġa Ġreference Ġto Ġa Ġ[ Painter ]. ** Ċ Ġ* Ċ Ġ* Ġ- Ġ[ Async Image Painter ] Ġwill Ġnot Ġfinish Ġloading Ġif Ġ[ Async Image Painter . on Draw ] Ġis Ġnot Ġcalled . Ċ Ġ* ĠĠ ĠThis Ġcan Ġoccur Ġif Ġa Ġcomp osable Ġhas Ġan Ġun bounded Ġ( i . e . Ġ[ Constraints . Infinity ]) Ġwidth / height Ċ Ġ* ĠĠ Ġconstraint . ĠFor Ġexample , Ġto Ġuse Ġ[ Async Image Painter ] Ġwith Ġ[ Lazy Row ] Ġor Ġ[ Lazy Column ], Ġyou Ġmust Ċ Ġ* ĠĠ Ġset Ġa Ġbounded Ġwidth Ġor Ġheight Ġrespectively . Ċ Ġ* Ġ- Ġ[ Async Image Painter . state ] Ġdoes Ġnot Ġtransition Ġto Ġ[ State . Success ] Ġsynchronous ly Ġduring Ġthe Ċ Ġ* ĠĠ Ġcomposition Ġphase . ĠUse Ġ[ Sub compose Async Image ] Ġif Ġyou Ġneed Ġthis . Ċ Ġ* Ċ Ġ* Ġ@ param Ġmodel ĠEither Ġan Ġ[ Image Request ] Ġor Ġthe Ġ[ Image Request . data ] Ġvalue . Ċ Ġ* Ġ@ param Ġimage Loader ĠThe Ġ[ Image Loader ] Ġthat Ġwill Ġbe Ġused Ġto Ġexecute Ġthe Ġrequest . Ċ Ġ* Ġ@ param Ġtransform ĠA Ġcallback Ġto Ġtransform Ġa Ġnew Ġ[ State ] Ġbefore Ġit 's Ġapplied Ġto Ġthe Ċ Ġ* Ġ Ġ[ Async Image Painter ]. ĠTypically Ġthis Ġis Ġused Ġto Ġoverwrite Ġthe Ġstate 's Ġ[ Painter ]. Ċ Ġ* Ġ@ param Ġon State ĠCalled Ġwhen Ġthe Ġstate Ġof Ġthis Ġpainter Ġchanges . Ċ Ġ* Ġ@ param Ġcontent Scale ĠUsed Ġto Ġdetermine Ġthe Ġaspect Ġratio Ġscaling Ġto Ġbe Ġused Ġif Ġthe Ġcanvas Ġbounds Ċ Ġ* Ġ Ġare Ġa Ġdifferent Ġsize Ġfrom Ġthe Ġintr insic Ġsize Ġof Ġthe Ġimage Ġloaded Ġby Ġ[ model ]. ĠThis Ġshould Ġbe Ġset Ċ Ġ* Ġ Ġto Ġthe Ġsame Ġvalue Ġthat 's Ġpassed Ġto Ġ[ Image ]. Ċ Ġ* Ġ@ param Ġfilter Quality ĠS ampling Ġalgorithm Ġapplied Ġto Ġa Ġbitmap Ġwhen Ġit Ġis Ġscaled Ġand Ġdrawn Ġinto Ġthe Ċ Ġ* Ġ Ġdestination . Ċ Ġ*/ Ċ @ Composable Ċ fun Ġremember Async Image Painter ( ĊĠĠĠ Ġmodel : ĠAny ?, ĊĠĠĠ Ġimage Loader : ĠImage Loader , ĊĠĠĠ Ġtransform : Ġ( State ) Ġ-> ĠState Ġ= ĠDefault Transform , ĊĠĠĠ Ġon State : Ġ(( State ) Ġ-> ĠUnit )? Ġ= Ġnull , ĊĠĠĠ Ġcontent Scale : ĠContent Scale Ġ= ĠContent Scale . Fit , ĊĠĠĠ Ġfilter Quality : ĠFilter Quality Ġ= ĠDefault Filter Quality , Ċ ): ĠAsync Image Painter Ġ{ ĊĠĠĠ Ġval Ġrequest Ġ= Ġrequest Of ( model ) ĊĠĠĠ Ġvalidate Request ( request ) ĊĊĠĠĠ Ġval Ġpainter Ġ= Ġremember Ġ{ ĠAsync Image Painter ( request , Ġimage Loader ) Ġ} ĊĠĠĠ Ġpainter . transform Ġ= Ġtransform ĊĠĠĠ Ġpainter . on State Ġ= Ġon State ĊĠĠĠ Ġpainter . content Scale Ġ= Ġcontent Scale ĊĠĠĠ Ġpainter . filter Quality Ġ= Ġfilter Quality ĊĠĠĠ Ġpainter . is Preview Ġ= ĠLocal Inspection Mode . current ĊĠĠĠ Ġpainter . image Loader Ġ= Ġimage Loader ĊĠĠĠ Ġpainter . request Ġ= Ġrequest Ġ// ĠUpdate Ġrequest Ġlast Ġso Ġall Ġother Ġproperties Ġare Ġup Ġto Ġdate . ĊĠĠĠ Ġpainter . on Remember ed () Ġ// ĠInvoke Ġthis Ġmanually Ġso Ġ` p ainter . state ` Ġis Ġset Ġto Ġ` Loading ` Ġimmediately . ĊĠĠĠ Ġreturn Ġpainter Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġ[ Painter ] Ġthat Ġthat Ġexecutes Ġan Ġ[ Image Request ] Ġasynchronously Ġand Ġrenders Ġthe Ġresult . Ċ Ġ*/ Ċ @ Stable Ċ class ĠAsync Image Painter Ġinternal Ġconstructor ( ĊĠĠĠ Ġrequest : ĠImage Request , ĊĠĠĠ Ġimage Loader : ĠImage Loader Ċ ) Ġ: ĠP ainter (), ĠRemember Observer Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġremember Scope : ĠCor outine Scope ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġdraw Size Ġ= ĠMutable State Flow ( Size . Zero ) ĊĊĠĠĠ Ġprivate Ġvar Ġpainter : ĠP ainter ? Ġby Ġmutable State Of ( null ) ĊĠĠĠ Ġprivate Ġvar Ġalpha : ĠFloat Ġby Ġmutable State Of ( Default Alpha ) ĊĠĠĠ Ġprivate Ġvar Ġcolor Filter : ĠColor Filter ? Ġby Ġmutable State Of ( null ) ĊĊĠĠĠ Ġ// ĠThese Ġfields Ġallow Ġaccess Ġto Ġthe Ġcurrent Ġvalue ĊĠĠĠ Ġ// Ġinstead Ġof Ġthe Ġvalue Ġin Ġthe Ġcurrent Ġcomposition . ĊĠĠĠ Ġprivate Ġvar Ġ_ state : ĠState Ġ= ĠState . Empty ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġvar Ġ_ p ainter : ĠP ainter ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpainter Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġvar Ġtransform Ġ= ĠDefault Transform ĊĠĠĠ Ġinternal Ġvar Ġon State : Ġ(( State ) Ġ-> ĠUnit )? Ġ= Ġnull ĊĠĠĠ Ġinternal Ġvar Ġcontent Scale Ġ= ĠContent Scale . Fit ĊĠĠĠ Ġinternal Ġvar Ġfilter Quality Ġ= ĠDefault Filter Quality ĊĠĠĠ Ġinternal Ġvar Ġis Preview Ġ= Ġfalse ĊĊĠĠĠ Ġ/** ĠThe Ġcurrent Ġ[ Async Image Painter . State ]. Ġ*/ ĊĠĠĠ Ġvar Ġstate : ĠState Ġby Ġmutable State Of ( State . Empty ) ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġ/** ĠThe Ġcurrent Ġ[ Image Request ]. Ġ*/ ĊĠĠĠ Ġvar Ġrequest : ĠImage Request Ġby Ġmutable State Of ( request ) ĊĠĠĠĠĠĠĠ Ġinternal Ġset ĊĊĠĠĠ Ġ/** ĠThe Ġcurrent Ġ[ Image Loader ]. Ġ*/ ĊĠĠĠ Ġvar Ġimage Loader : ĠImage Loader Ġby Ġmutable State Of ( image Loader ) ĊĠĠĠĠĠĠĠ Ġinternal Ġset ĊĊĠĠĠ Ġoverride Ġval Ġintr insic Size : ĠSize ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġpainter ?. intrinsic Size Ġ?: ĠSize . Unspecified ĊĊĠĠĠ Ġoverride Ġfun ĠDraw Scope . on Draw () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠUpdate Ġthe Ġdraw Ġscope 's Ġcurrent Ġsize . ĊĠĠĠĠĠĠĠ Ġdraw Size . value Ġ= Ġsize ĊĊĠĠĠĠĠĠĠ Ġ// ĠDraw Ġthe Ġcurrent Ġpainter . ĊĠĠĠĠĠĠĠ Ġpainter ?. apply Ġ{ Ġdraw ( size , Ġalpha , Ġcolor Filter ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġapply Alpha ( alpha : ĠFloat ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . alpha Ġ= Ġalpha ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġapply Color Filter ( color Filter : ĠColor Filter ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . color Filter Ġ= Ġcolor Filter ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Opt In ( Experimental Cor outines Api :: class ) ĊĠĠĠ Ġoverride Ġfun Ġon Remember ed () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠShort Ġcircuit Ġif Ġwe 're Ġalready Ġremember ed . ĊĠĠĠĠĠĠĠ Ġif Ġ( remember Scope Ġ!= Ġnull ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġ// ĠCreate Ġa Ġnew Ġscope Ġto Ġobserve Ġstate Ġand Ġexecute Ġrequests Ġwhile Ġwe 're Ġremember ed . ĊĠĠĠĠĠĠĠ Ġval Ġscope Ġ= ĠCor outine Scope ( Supervisor Job () Ġ+ ĠDispatch ers . Main . immediate ) ĊĠĠĠĠĠĠĠ Ġremember Scope Ġ= Ġscope ĊĊĠĠĠĠĠĠĠ Ġ// ĠMan ually Ġnotify Ġthe Ġchild Ġpainter Ġthat Ġwe 're Ġremember ed . ĊĠĠĠĠĠĠĠ Ġ(_ p ainter Ġas ? ĠRemember Observer )?. on Remember ed () ĊĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġwe 're Ġin Ġinspection Ġmode Ġskip Ġthe Ġimage Ġrequest Ġand Ġset Ġthe Ġstate Ġto Ġloading . ĊĠĠĠĠĠĠĠ Ġif Ġ( is Preview ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġrequest . newBuilder (). defaults ( image Loader . defaults ). build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate State ( State . Loading ( request . placeholder ?. to Painter ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠOb serve Ġthe Ġcurrent Ġrequest Ġand Ġexecute Ġany Ġemission s . ĊĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsnapshot Flow Ġ{ Ġrequest Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Latest Ġ{ Ġimage Loader . execute ( update Request ( request )). to State () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect (:: update State ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Forgot ten () Ġ{ ĊĠĠĠĠĠĠĠ Ġclear () ĊĠĠĠĠĠĠĠ Ġ(_ p ainter Ġas ? ĠRemember Observer )?. on Forgot ten () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Ab and oned () Ġ{ ĊĠĠĠĠĠĠĠ Ġclear () ĊĠĠĠĠĠĠĠ Ġ(_ p ainter Ġas ? ĠRemember Observer )?. on Ab and oned () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclear () Ġ{ ĊĠĠĠĠĠĠĠ Ġremember Scope ?. cancel () ĊĠĠĠĠĠĠĠ Ġremember Scope Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠUpdate Ġthe Ġ[ request ] Ġto Ġwork Ġwith Ġ[ Async Image Painter ]. Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġupdate Request ( request : ĠImage Request ): ĠImage Request Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrequest . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. target ( onStart Ġ= Ġ{ Ġplaceholder Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate State ( State . Loading ( placeholder ?. to Painter ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( request . defined . size Resolver Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġno Ġother Ġsize Ġresolver Ġis Ġset , Ġsuspend Ġuntil Ġthe Ġcanvas Ġsize Ġis Ġpositive . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize Ġ{ Ġdraw Size . map NotNull Ġ{ Ġit . to Size OrNull () Ġ}. first () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( request . defined . scale Resolver Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġno Ġother Ġscale Ġresolver Ġis Ġset , Ġuse Ġthe Ġcontent Ġscale . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscale ( content Scale . to Scale ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( request . defined . precision Ġ!= ĠPrecision . EX ACT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAsync Image Painter Ġscales Ġthe Ġimage Ġto Ġfit Ġthe Ġcanvas Ġsize Ġat Ġdraw Ġtime . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprecision ( Precision . IN EX ACT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate State ( input : ĠState ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprevious Ġ= Ġ_ state ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Ġ= Ġtransform ( input ) ĊĠĠĠĠĠĠĠ Ġ_ state Ġ= Ġcurrent ĊĠĠĠĠĠĠĠ Ġ_ p ainter Ġ= Ġmaybe New Cross fade Painter ( previous , Ġcurrent ) Ġ?: Ġcurrent . p ainter ĊĊĠĠĠĠĠĠĠ Ġ// ĠMan ually Ġforget Ġand Ġremember Ġthe Ġold / new Ġpain ters Ġif Ġwe 're Ġalready Ġremember ed . ĊĠĠĠĠĠĠĠ Ġif Ġ( remember Scope Ġ!= Ġnull Ġ&& Ġprevious . p ainter Ġ!== Ġcurrent . p ainter ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( previous . p ainter Ġas ? ĠRemember Observer )?. on Forgot ten () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( current . p ainter Ġas ? ĠRemember Observer )?. on Remember ed () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠNotify Ġthe Ġstate Ġlistener . ĊĠĠĠĠĠĠĠ Ġon State ?. invoke ( current ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠCreate Ġand Ġreturn Ġa Ġ[ Cross fade Painter ] Ġif Ġrequested . Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġmaybe New Cross fade Painter ( previous : ĠState , Ġcurrent : ĠState ): ĠCross fade Painter ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġcan Ġonly Ġinvoke Ġthe Ġtransition Ġfactory Ġif Ġthe Ġstate Ġis Ġsuccess Ġor Ġerror . ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġwhen Ġ( current ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠState . Success Ġ-> Ġcurrent . result ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠState . Error Ġ-> Ġcurrent . result ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠInvoke Ġthe Ġtransition Ġfactory Ġand Ġwrap Ġthe Ġpainter Ġin Ġa Ġ` Cross fade Painter ` Ġif Ġit Ġreturns ĊĠĠĠĠĠĠĠ Ġ// Ġa Ġ` Cross fade Transformation `. ĊĠĠĠĠĠĠĠ Ġval Ġtransition Ġ= Ġresult . request . transition Factory . create ( Fake Transition Target , Ġresult ) ĊĠĠĠĠĠĠĠ Ġif Ġ( transition Ġis ĠCross fade Transition ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠCross fade Painter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ= Ġprevious . p ainter . take If Ġ{ Ġprevious Ġis ĠState . Loading Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Ġ= Ġcurrent . p ainter , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Scale Ġ= Ġcontent Scale , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġduration Millis Ġ= Ġtransition . duration Millis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfade Start Ġ= Ġresult Ġ! is ĠSuccess Result Ġ|| Ġ! result . is Placeholder Cached , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefer Exact Intr insic Size Ġ= Ġtransition . prefer Exact Intr insic Size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠImage Result . to State () Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠSuccess Result Ġ-> ĠState . Success ( drawable . to Painter (), Ġthis ) ĊĠĠĠĠĠĠĠ Ġis ĠError Result Ġ-> ĠState . Error ( drawable ?. to Painter (), Ġthis ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠConvert Ġthis Ġ[ Drawable ] Ġinto Ġa Ġ[ Painter ] Ġusing ĠCompose Ġprimitives Ġif Ġpossible . Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠDrawable . to Painter () Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠBitmap Drawable Ġ-> ĠBitmap Painter ( bitmap . as Image Bitmap (), Ġfilter Quality Ġ= Ġfilter Quality ) ĊĠĠĠĠĠĠĠ Ġis ĠColor Drawable Ġ-> ĠColor Painter ( Color ( color )) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> ĠDrawable Painter ( mutate ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġcurrent Ġstate Ġof Ġthe Ġ[ Async Image Painter ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsealed Ġclass ĠState Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/** ĠThe Ġcurrent Ġpainter Ġbeing Ġdrawn Ġby Ġ[ Async Image Painter ]. Ġ*/ ĊĠĠĠĠĠĠĠ Ġabstract Ġval Ġpainter : ĠP ainter ? ĊĊĠĠĠĠĠĠĠ Ġ/** ĠThe Ġrequest Ġhas Ġnot Ġbeen Ġstarted . Ġ*/ ĊĠĠĠĠĠĠĠ Ġobject ĠEmpty Ġ: ĠState () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġpainter : ĠP ainter ? Ġget () Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĠThe Ġrequest Ġis Ġin - progress . Ġ*/ ĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠLoading ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġpainter : ĠP ainter ?, ĊĠĠĠĠĠĠĠ Ġ) Ġ: ĠState () ĊĊĠĠĠĠĠĠĠ Ġ/** ĠThe Ġrequest Ġwas Ġsuccessful . Ġ*/ ĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠSuccess ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġpainter : ĠP ainter , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult : ĠSuccess Result , ĊĠĠĠĠĠĠĠ Ġ) Ġ: ĠState () ĊĊĠĠĠĠĠĠĠ Ġ/** ĠThe Ġrequest Ġfailed Ġdue Ġto Ġ[ Error Result . throwable ]. Ġ*/ ĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠError ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġpainter : ĠP ainter ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult : ĠError Result , ĊĠĠĠĠĠĠĠ Ġ) Ġ: ĠState () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠA Ġstate Ġtransform Ġthat Ġdoes Ġnot Ġmodify Ġthe Ġstate . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval ĠDefault Transform : Ġ( State ) Ġ-> ĠState Ġ= Ġ{ Ġit Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġvalidate Request ( request : ĠImage Request ) Ġ{ ĊĠĠĠ Ġwhen Ġ( request . data ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠImage Request . Builder Ġ-> Ġunsupported Data ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġ" Image Request . Builder ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġ" Did Ġyou Ġforget Ġto Ġcall ĠImage Request . Builder . build () ?" ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġis ĠImage Bitmap Ġ-> Ġunsupported Data (" Image Bitmap ") ĊĠĠĠĠĠĠĠ Ġis ĠImage Vector Ġ-> Ġunsupported Data (" Image Vector ") ĊĠĠĠĠĠĠĠ Ġis ĠP ainter Ġ-> Ġunsupported Data (" Painter ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġrequire ( request . target Ġ== Ġnull ) Ġ{ Ġ" request . target Ġmust Ġbe Ġnull ." Ġ} Ċ } Ċ Ċ private Ġfun Ġunsupported Data ( ĊĠĠĠ Ġname : ĠString , ĊĠĠĠ Ġdescription : ĠString Ġ= Ġ" If Ġyou Ġwish Ġto Ġdisplay Ġthis Ġ$ name , Ġuse Ġandroidx . compose . foundation . Image ." Ċ ): ĠNothing Ġ= Ġthrow ĠIllegalArgumentException (" Unsupported Ġtype : Ġ$ name . Ġ$ description ") Ċ Ċ private Ġval ĠSize . is Positive Ġget () Ġ= Ġwidth Ġ>= Ġ 0 . 5 Ġ&& Ġheight Ġ>= Ġ 0 . 5 Ċ Ċ private Ġfun ĠSize . to Size OrNull () Ġ= Ġwhen Ġ{ ĊĠĠĠ Ġis Unspecified Ġ-> ĠCo il Size . ORIGIN AL ĊĠĠĠ Ġis Positive Ġ-> ĠCo il Size ( ĊĠĠĠĠĠĠĠ Ġwidth Ġ= Ġif Ġ( width . is Finite ()) ĠDimension ( width . round ToInt ()) Ġelse ĠDimension . Original , ĊĠĠĠĠĠĠĠ Ġheight Ġ= Ġif Ġ( height . is Finite ()) ĠDimension ( height . round ToInt ()) Ġelse ĠDimension . Original ĊĠĠĠ Ġ) ĊĠĠĠ Ġelse Ġ-> Ġnull Ċ } Ċ Ċ private Ġval ĠFake Transition Target Ġ= Ġobject Ġ: ĠTransition Target Ġ{ ĊĠĠĠ Ġoverride Ġval Ġview Ġget () Ġ= Ġthrow ĠUnsupportedOperationException () ĊĠĠĠ Ġoverride Ġval Ġdrawable : ĠDrawable ? Ġget () Ġ= Ġnull Ċ } Ċ