/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 Ġ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 . ui . text . input Ċ Ċ import Ġandroidx . compose . runtime . Immutable Ċ import Ġandroidx . compose . runtime . save able . Saver Ċ import Ġandroidx . compose . runtime . save able . list Saver Ċ import Ġandroidx . compose . ui . text . Annotated String Ċ import Ġandroidx . compose . ui . text . Text Range Ċ import Ġandroidx . compose . ui . text . constr ain Ċ import Ġkotlin . math . max Ċ import Ġkotlin . math . min Ċ Ċ /** Ċ Ġ* ĠA Ġclass Ġholding Ġinformation Ġabout Ġthe Ġediting Ġstate . Ċ Ġ* Ċ Ġ* ĠThe Ġinput Ġservice Ġupdates Ġtext Ġselection , Ġcursor , Ġtext Ġand Ġtext Ġcomposition . ĠThis Ġclass Ċ Ġ* Ġrepresents Ġthose Ġvalues Ġand Ġit Ġis Ġpossible Ġto Ġobserve Ġchanges Ġto Ġthose Ġvalues Ġin Ġthe Ġtext Ċ Ġ* Ġediting Ġcomp os ables . Ċ Ġ* Ċ Ġ* ĠThis Ġclass Ġstores Ġa Ġsnapshot Ġof Ġthe Ġinput Ġstate Ġof Ġthe Ġedit Ġbuffer Ġand Ġprovide Ġutility Ġfunctions Ċ Ġ* Ġfor Ġanswer ing ĠI ME Ġrequests Ġsuch Ġas ĠgetText Before Cursor , Ġget Selected Text . Ċ Ġ* Ċ Ġ* ĠInput Ġservice Ġcomposition Ġis Ġan Ġinstance Ġof Ġtext Ġproduced Ġby ĠI ME . ĠAn Ġexample Ġvisual Ġfor Ġthe Ċ Ġ* Ġcomposition Ġis Ġthat Ġthe Ġcurrently Ġcomposed Ġword Ġis Ġvis ually Ġseparated Ġfrom Ġothers Ġwith Ċ Ġ* Ġunderline , Ġor Ġtext Ġbackground . ĠFor Ġdescription Ġof Ġcomposition Ġplease Ġcheck Ċ Ġ* Ġ[ W 3 C ĠI ME ĠComp osition ]( https :// www . w 3 . org / TR / ime - api /# ime - composition ). Ċ Ġ* Ċ Ġ* ĠI ME Ġcomposition Ġis Ġdefined Ġby Ġ[ composition ] Ġparameter Ġand Ġfunction . ĠWhen Ġa Ċ Ġ* Ġ[ TextField Value ] Ġwith Ġnull Ġ[ composition ] Ġis Ġpassed Ġto Ġa ĠTextField , Ġif Ġthere Ġwas Ġan Ċ Ġ* Ġactive Ġ[ composition ] Ġon Ġthe Ġtext , Ġthe Ġchanges Ġwill Ġbe Ġapplied . ĠApply ing Ġa Ġcomposition Ġwill Ċ Ġ* Ġaccept Ġthe Ġchanges Ġthat Ġwere Ġstill Ġbeing Ġcomposed Ġby ĠI ME . ĠPlease Ġuse Ġ[ copy ] Ċ Ġ* Ġfunctions Ġif Ġyou Ġdo Ġnot Ġwant Ġto Ġintention ally Ġapply Ġthe Ġongoing ĠI ME Ġcomposition . Ċ Ġ* Ċ Ġ* Ġ@ param Ġannotated String Ġthe Ġtext Ġto Ġbe Ġrendered . Ċ Ġ* Ġ@ param Ġselection Ġthe Ġselection Ġrange . ĠIf Ġthe Ġselection Ġis Ġcollapsed , Ġit Ġrepresents Ġcursor Ċ Ġ* Ġlocation . ĠWhen Ġselection Ġrange Ġis Ġout Ġof Ġbounds , Ġit Ġis Ġconstr ained Ġwith Ġthe Ġtext Ġlength . Ċ Ġ* Ġ@ param Ġcomposition Ġthe Ġcomposition Ġrange , Ġnull Ġmeans Ġempty Ġcomposition Ġor Ġapply Ġif Ġa Ċ Ġ* Ġcomposition Ġexists Ġon Ġthe Ġtext . ĠOwn ed Ġby ĠI ME , Ġand Ġif Ġyou Ġhave Ġan Ġinstance Ġof Ġ[ TextField Value ] Ċ Ġ* Ġplease Ġuse Ġ[ copy ] Ġfunctions Ġif Ġyou Ġdo Ġnot Ġwant Ġto Ġintention ally Ġchange Ġthe Ġvalue Ġof Ġthis Ċ Ġ* Ġfield . Ċ Ġ* Ċ Ġ*/ Ċ @ Immutable Ċ class ĠText FieldValue Ġconstructor ( ĊĠĠĠ Ġval Ġannotated String : ĠAnnot ated String , ĊĠĠĠ Ġselection : ĠText Range Ġ= ĠText Range . Zero , ĊĠĠĠ Ġcomposition : ĠText Range ? Ġ= Ġnull Ċ ) Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param Ġtext Ġthe Ġtext Ġto Ġbe Ġrendered . ĊĠĠĠĠ Ġ* Ġ@ param Ġselection Ġthe Ġselection Ġrange . ĠIf Ġthe Ġselection Ġis Ġcollapsed , Ġit Ġrepresents Ġcursor ĊĠĠĠĠ Ġ* Ġlocation . ĠWhen Ġselection Ġrange Ġis Ġout Ġof Ġbounds , Ġit Ġis Ġconstr ained Ġwith Ġthe Ġtext Ġlength . ĊĠĠĠĠ Ġ* Ġ@ param Ġcomposition Ġthe Ġcomposition Ġrange , Ġnull Ġmeans Ġempty Ġcomposition Ġor Ġapply Ġif Ġa ĊĠĠĠĠ Ġ* Ġcomposition Ġexists Ġon Ġthe Ġtext . ĠOwn ed Ġby ĠI ME , Ġand Ġif Ġyou Ġhave Ġan Ġinstance Ġof Ġ[ TextField Value ] ĊĠĠĠĠ Ġ* Ġplease Ġuse Ġ[ copy ] Ġfunctions Ġif Ġyou Ġdo Ġnot Ġwant Ġto Ġintention ally Ġchange Ġthe Ġvalue Ġof Ġthis ĊĠĠĠĠ Ġ* Ġfield . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġtext : ĠString Ġ= Ġ"", ĊĠĠĠĠĠĠĠ Ġselection : ĠText Range Ġ= ĠText Range . Zero , ĊĠĠĠĠĠĠĠ Ġcomposition : ĠText Range ? Ġ= Ġnull ĊĠĠĠ Ġ) Ġ: Ġthis ( Annotated String ( text ), Ġselection , Ġcomposition ) ĊĊĠĠĠ Ġval Ġtext : ĠString Ġget () Ġ= Ġannotated String . text ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġselection Ġrange . ĠIf Ġthe Ġselection Ġis Ġcollapsed , Ġit Ġrepresents Ġcursor ĊĠĠĠĠ Ġ* Ġlocation . ĠWhen Ġselection Ġrange Ġis Ġout Ġof Ġbounds , Ġit Ġis Ġconstr ained Ġwith Ġthe Ġtext Ġlength . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġselection : ĠText Range Ġ= Ġselection . constr ain ( 0 , Ġtext . length ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠComp osition Ġrange Ġcreated Ġby Ġ ĠI ME . ĠIf Ġnull , Ġthere Ġis Ġno Ġcomposition Ġrange . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠInput Ġservice Ġcomposition Ġis Ġan Ġinstance Ġof Ġtext Ġproduced Ġby ĠI ME . ĠAn Ġexample Ġvisual Ġfor Ġthe ĊĠĠĠĠ Ġ* Ġcomposition Ġis Ġthat Ġthe Ġcurrently Ġcomposed Ġword Ġis Ġvis ually Ġseparated Ġfrom Ġothers Ġwith ĊĠĠĠĠ Ġ* Ġunderline , Ġor Ġtext Ġbackground . ĠFor Ġdescription Ġof Ġcomposition Ġplease Ġcheck ĊĠĠĠĠ Ġ* Ġ[ W 3 C ĠI ME ĠComp osition ]( https :// www . w 3 . org / TR / ime - api /# ime - composition ) ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠComp osition Ġcan Ġbe Ġset Ġon Ġthe Ġby Ġthe Ġsystem , Ġhowever Ġit Ġis Ġpossible Ġto Ġapply Ġan Ġexisting ĊĠĠĠĠ Ġ* Ġcomposition Ġby Ġsetting Ġthe Ġvalue Ġto Ġnull . ĠApply ing Ġa Ġcomposition Ġwill Ġaccept Ġthe Ġchanges ĊĠĠĠĠ Ġ* Ġthat Ġwere Ġstill Ġbeing Ġcomposed Ġby ĠI ME . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġcomposition : ĠText Range ? Ġ= Ġcomposition ?. constr ain ( 0 , Ġtext . length ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġcopy Ġof Ġthe ĠText FieldValue . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcopy ( ĊĠĠĠĠĠĠĠ Ġannotated String : ĠAnnot ated String Ġ= Ġthis . annotated String , ĊĠĠĠĠĠĠĠ Ġselection : ĠText Range Ġ= Ġthis . selection , ĊĠĠĠĠĠĠĠ Ġcomposition : ĠText Range ? Ġ= Ġthis . composition ĊĠĠĠ Ġ): ĠText FieldValue Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠText FieldValue ( annotated String , Ġselection , Ġcomposition ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġcopy Ġof Ġthe ĠText FieldValue . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcopy ( ĊĠĠĠĠĠĠĠ Ġtext : ĠString , ĊĠĠĠĠĠĠĠ Ġselection : ĠText Range Ġ= Ġthis . selection , ĊĠĠĠĠĠĠĠ Ġcomposition : ĠText Range ? Ġ= Ġthis . composition ĊĠĠĠ Ġ): ĠText FieldValue Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠText FieldValue ( Annotated String ( text ), Ġselection , Ġcomposition ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġauto Ġgenerated Ġequals Ġmethod ĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( other Ġ! is ĠText FieldValue ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġreturn Ġannotated String Ġ== Ġother . annotated String Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselection Ġ== Ġother . selection Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcomposition Ġ== Ġother . composition ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġauto Ġgenerated ĠhashCode Ġmethod ĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġannotated String . hashCode () ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġselection . hashCode () ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġ( composition ?. hashCode () Ġ?: Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" TextField Value (" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" text ='$ annotated String ', Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" selection =$ selection , Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" composition =$ composition )" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġdefault Ġ[ Saver ] Ġimplementation Ġfor Ġ[ TextField Value ]. ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval ĠS aver Ġ= Ġlist Saver < TextField Value , ĠAny >( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( it . annotated String . toString (), Ġit . selection . start , Ġit . selection . end ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrestore Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText FieldValue ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġit [ 0 ] Ġas ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselection Ġ= ĠText Range ( it [ 1 ] Ġas ĠInt , Ġit [ 2 ] Ġas ĠInt ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġthe Ġtext Ġbefore Ġthe Ġselection . Ċ Ġ* Ċ Ġ* Ġ@ param Ġmax Chars Ġmaximum Ġnumber Ġof Ġcharacters Ġ( inclusive ) Ġbefore Ġthe Ġminimum Ġvalue Ġin Ċ Ġ* Ġ[ TextField Value . selection ]. Ċ Ġ* Ċ Ġ* Ġ@ see ĠText Range . min Ċ Ġ*/ Ċ fun ĠText FieldValue . getText Before Selection ( max Chars : ĠInt ): ĠAnnot ated String Ġ= ĊĠĠĠ Ġannotated String . sub Sequence ( max ( 0 , Ġselection . min Ġ- Ġmax Chars ), Ġselection . min ) Ċ Ċ /** Ċ Ġ* ĠReturns Ġthe Ġtext Ġafter Ġthe Ġselection . Ċ Ġ* Ċ Ġ* Ġ@ param Ġmax Chars Ġmaximum Ġnumber Ġof Ġcharacters Ġ( exclusive ) Ġafter Ġthe Ġmaximum Ġvalue Ġin Ċ Ġ* Ġ[ TextField Value . selection ]. Ċ Ġ* Ċ Ġ* Ġ@ see ĠText Range . max Ċ Ġ*/ Ċ fun ĠText FieldValue . getText After Selection ( max Chars : ĠInt ): ĠAnnot ated String Ġ= ĊĠĠĠ Ġannotated String . sub Sequence ( selection . max , Ġmin ( selection . max Ġ+ Ġmax Chars , Ġtext . length )) Ċ Ċ /** Ċ Ġ* ĠReturns Ġthe Ġcurrently Ġselected Ġtext . Ċ Ġ*/ Ċ fun ĠText FieldValue . getSelected Text (): ĠAnnot ated String Ġ= Ġannotated String . sub Sequence ( selection )