/* Ċ Ġ* Ġ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 . text . selection Ċ Ċ import Ġandroid . os . Build Ċ import Ġandroidx . compose . foundation . text . Basic TextField Ċ import Ġandroidx . compose . foundation . text . Handle Ċ import Ġandroidx . compose . foundation . text . Internal Foundation Text Api Ċ import Ġandroidx . compose . foundation . text . Text Delegate Ċ import Ġandroidx . compose . foundation . text . TextField Delegate Ċ import Ġandroidx . compose . foundation . text . TextField State Ċ import Ġandroidx . compose . foundation . text . Text Layout Result Proxy Ċ import Ġandroidx . compose . runtime . Composable Ċ import Ġandroidx . compose . runtime . Disposable Effect Ċ import Ġandroidx . compose . runtime . current Re compose Scope Ċ import Ġandroidx . compose . runtime . remember Ċ import Ġandroidx . compose . ui . Modifier Ċ import Ġandroidx . compose . ui . geometry . Offset Ċ import Ġandroidx . compose . ui . platform . Local Density Ċ import Ġandroidx . compose . ui . platform . Local Font Family Resolver Ċ import Ġandroidx . compose . ui . text . Annotated String Ċ import Ġandroidx . compose . ui . text . Text Layout Result Ċ import Ġandroidx . compose . ui . text . TextStyle Ċ import Ġandroidx . compose . ui . text . input . TextField Value Ċ import Ġandroidx . compose . ui . unit . Constraints Ċ import Ġandroidx . compose . ui . unit . Layout Direction Ċ import Ġandroidx . test . ext . junit . runners . Android JUnit 4 Ċ import Ġandroidx . test . filters . Medium Test Ċ import Ġandroidx . test . filters . Sdk Suppress Ċ import Ġcom . google . common . truth . Truth . assertThat Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ Ċ @ Opt In ( Internal Foundation Text Api :: class ) Ċ @ Medium Test Ċ @ Sdk Suppress ( min Sdk Version Ġ= Ġ 2 8 ) Ċ @ RunWith ( Android JUnit 4 :: class ) Ċ internal Ġclass ĠTextField M agn ifier Test Ġ: ĠAbstract Selection M agn ifier Tests () Ġ{ ĊĊĠĠĠ Ġ@ Composable ĊĠĠĠ Ġoverride Ġfun ĠTest Content ( ĊĠĠĠĠĠĠĠ Ġtext : ĠString , ĊĠĠĠĠĠĠĠ Ġmodifier : ĠModifier , ĊĠĠĠĠĠĠĠ Ġstyle : ĠTextStyle , ĊĠĠĠĠĠĠĠ Ġon Text Layout : Ġ( Text Layout Result ) Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ ĠBasic TextField ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Value Change Ġ= Ġ{}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= Ġmodifier , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Style Ġ= Ġstyle , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Text Layout Ġ= Ġon Text Layout ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġmagn ifier _ appe ars _ while Start Cursor Tou ched () Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck M agn ifier Ap pe ars _ while Handle Tou ched ( Handle . Cursor ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġmagn ifier _ follow s Cursor H orizontally _ when Drag ged () Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck M agn ifier Follow s Handle H orizontally ( Handle . Cursor ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġmagn ifier _ st ays At Line End _ when Cursor Drag ged Past Start () Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck M agn ifier Constr ained To Line Horizontal Bounds ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHandle . Cursor , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Start Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġmagn ifier _ st ays At Line End _ when Cursor Drag ged Past End () Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck M agn ifier Constr ained To Line Horizontal Bounds ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHandle . Cursor , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Start Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġmagn ifier _ hidden _ when Cursor Drag ged Far Past Start Of Line () Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck M agn ifier Hidden When Drag ged Too Far ( Handle . Cursor , Ġcheck Start Ġ= Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġmagn ifier _ hidden _ when Cursor Drag ged Far Past EndOf Line () Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck M agn ifier Hidden When Drag ged Too Far ( Handle . Cursor , Ġcheck Start Ġ= Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġandroid Supports Text M agn ifier On 2 8 And Above () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠNeed Ġa Ġnon - null Ġstate Ġto Ġreturn Ġa Ġreal Ġmodifier . ĊĠĠĠĠĠĠĠ Ġval Ġmodifier Ġ= ĠModifier . textField M agn ifier ( setup Selection Managed M agn ifier ()) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= Ġ 2 8 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( modifier ). isNot Same Instance As ( Modifier ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( modifier ). is Same Instance As ( Modifier ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġdoes Not Modify _ when State IsNull () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmanager Ġ= ĠTextField Selection Manager () ĊĠĠĠĠĠĠĠ Ġval Ġcenter Ġ= Ġcalculate Selection M agn ifier Center Android ( manager , Ġdefault M agn ifier Size ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( center ). isEqualTo ( Offset . Unspecified ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Selection Managed M agn ifier (): ĠTextField Selection Manager Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġselection Manager Ġ= ĠTextField Selection Manager () ĊĠĠĠĠĠĠĠ Ġrule . setContent Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠfontFamily Resolver Ġ= ĠLocal Font Family Resolver . current ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdensity Ġ= ĠLocal Density . current ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselection Manager . value Ġ= ĠText FieldValue ( Text ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscope Ġ= Ġcurrent Re compose Scope ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġvalue Ġwon 't Ġever Ġchange Ġso Ġwe Ġdon 't Ġneed Ġto Ġworry Ġabout Ġever Ġupdating Ġthe Ġstate . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselection Manager . state Ġ= Ġremember Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTextField State ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText Delegate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= ĠAnnot ated String ( Text ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstyle Ġ= ĠTextStyle . Default , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdensity Ġ= Ġdensity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfontFamily Resolver Ġ= ĠfontFamily Resolver ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscope ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRequired Ġfor Ġthe Ġdrag Ġob servers Ġto Ġactually Ġupdate Ġthe Ġselection . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselection Manager . on Value Change Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselection Manager . value Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠDis posable Effect ( Unit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ(_, Ġ_, Ġresult ) Ġ= ĠTextField Delegate . layout ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselection Manager . state !!. text Delegate , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstraints Ġ= ĠConstraints (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Direction Ġ= ĠLayout Direction . L tr ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselection Manager . state !!. layout Result Ġ= ĠText Layout Result Proxy ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Dispose Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġselection Manager ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠText Ġ= Ġ" hello " ĊĠĠĠ Ġ} Ċ } Ċ