/* Ċ Ġ* Ġ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 Ċ Ċ import Ġandroidx . compose . foundation . interaction . Hover Interaction Ċ import Ġandroidx . compose . foundation . interaction . Mutable Interaction Source Ċ import Ġandroidx . compose . runtime . Disposable Effect Ċ import Ġandroidx . compose . runtime . La unched Effect Ċ import Ġandroidx . compose . runtime . getValue Ċ import Ġandroidx . compose . runtime . mutable State Of Ċ import Ġandroidx . compose . runtime . remember Ċ import Ġandroidx . compose . runtime . remember Coroutine Scope Ċ import Ġandroidx . compose . runtime . setValue Ċ import Ġandroidx . compose . ui . Modifier Ċ import Ġandroidx . compose . ui . composed Ċ import Ġandroidx . compose . ui . input . pointer . Pointer EventType Ċ import Ġandroidx . compose . ui . input . pointer . pointer Input Ċ import Ġandroidx . compose . ui . platform . debug Inspector Info Ċ import Ġkotlinx . coroutines . current Coroutine Context Ċ import Ġkotlinx . coroutines . isActive Ċ import Ġkotlinx . coroutines . launch Ċ Ċ /** Ċ Ġ* ĠConfigure Ġcomponent Ġto Ġbe Ġhover able Ġvia Ġpointer Ġenter / exit Ġevents . Ċ Ġ* Ċ Ġ* Ġ@ sample Ġandroidx . compose . foundation . samples . Hover able Sample Ċ Ġ* Ċ Ġ* Ġ@ param Ġinteraction Source Ġ[ Mutable Interaction Source ] Ġthat Ġwill Ġbe Ġused Ġto Ġemit Ċ Ġ* Ġ[ Hover Interaction . Enter ] Ġwhen Ġthis Ġelement Ġis Ġbeing Ġhover ed . Ċ Ġ* Ġ@ param Ġenabled ĠControls Ġthe Ġenabled Ġstate . ĠWhen Ġ` false `, Ġhover Ġevents Ġwill Ġbe Ġignored . Ċ Ġ*/ Ċ fun ĠModifier . hover able ( ĊĠĠĠ Ġinteraction Source : ĠMutable Interaction Source , ĊĠĠĠ Ġenabled : ĠBoolean Ġ= Ġtrue Ċ ): ĠModifier Ġ= Ġcomposed ( ĊĠĠĠ Ġinspector Info Ġ= Ġdebug Inspector Info Ġ{ ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġ" hover able " ĊĠĠĠĠĠĠĠ Ġproperties [" interaction Source "] Ġ= Ġinteraction Source ĊĠĠĠĠĠĠĠ Ġproperties [" enabled "] Ġ= Ġenabled ĊĠĠĠ Ġ} Ċ ) Ġ{ ĊĠĠĠ Ġval Ġscope Ġ= Ġremember Coroutine Scope () ĊĠĠĠ Ġvar Ġhover Interaction Ġby Ġremember Ġ{ Ġmutable State Of < Hover Interaction . Enter ? >( null ) Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġemit Enter () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( hover Interaction Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinteraction Ġ= ĠHover Interaction . Enter () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinteraction Source . emit ( interaction ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhover Interaction Ġ= Ġinteraction ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġemit Exit () Ġ{ ĊĠĠĠĠĠĠĠ Ġhover Interaction ?. let Ġ{ ĠoldValue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinteraction Ġ= ĠHover Interaction . Exit ( oldValue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinteraction Source . emit ( interaction ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhover Interaction Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtry Emit Exit () Ġ{ ĊĠĠĠĠĠĠĠ Ġhover Interaction ?. let Ġ{ ĠoldValue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinteraction Ġ= ĠHover Interaction . Exit ( oldValue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinteraction Source . try Emit ( interaction ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhover Interaction Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠDis posable Effect ( interaction Source ) Ġ{ ĊĠĠĠĠĠĠĠ Ġon Dispose Ġ{ Ġtry Emit Exit () Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ ĠLa unched Effect ( enabled ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemit Exit () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( enabled ) Ġ{ ĊĠĠĠĠĠĠĠ ĠModifier Ċ // ĠTODO ( b / 2 0 2 5 0 5 2 3 1 ): Ċ // Ġ Ġbecause Ġwe Ġonly Ġreact Ġto Ġinput Ġevents , Ġand Ġnot Ġon Ġlayout Ġchanges , Ġwe Ġcan Ġhave Ġa Ġsituation Ġwhen Ċ // Ġ ĠComp osable Ġis Ġunder Ġthe Ġcursor , Ġbut Ġnot Ġhover ed . ĠTo Ġfix Ġthat , Ġwe Ġhave Ġtwo Ġways : Ċ // Ġ Ġa . ĠTrigger ĠEnter / Exit Ġon Ġany Ġlayout Ġchange , Ġinside ĠOwner Ċ // Ġ Ġb . ĠMan ually Ġreact Ġon Ġlayout Ġchanges Ġvia ĠModifier . on Glob ally Position , Ġand Ġcheck Ġsomething Ġlike Ċ // Ġ ĠLocal Pointer Position . current ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. pointer Input ( interaction Source ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Context Ġ= Ġcurrent Coroutine Context () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġawait Pointer Event Scope Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( current Context . isActive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevent Ġ= Ġawait Pointer Event () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( event . type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPointer EventType . Enter Ġ-> Ġscope . launch Ġ{ Ġemit Enter () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPointer EventType . Exit Ġ-> Ġscope . launch Ġ{ Ġemit Exit () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ ĠModifier ĊĠĠĠ Ġ} Ċ } Ċ