/* Ċ Ġ* Ġ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 . ui . integration . test Ċ Ċ import Ġandroidx . compose . ui . geometry . Offset Ċ import Ġandroidx . compose . ui . graphics . Color Ċ import Ġandroidx . compose . ui . graphics . Shadow Ċ import Ġandroidx . compose . ui . text . Annotated String Ċ import Ġandroidx . compose . ui . text . intl . Locale List Ċ import Ġandroidx . compose . ui . text . Span Style Ċ import Ġandroidx . compose . ui . text . TextStyle Ċ import Ġandroidx . compose . ui . text . font . FontStyle Ċ import Ġandroidx . compose . ui . text . font . Font Weight Ċ import Ġandroidx . compose . ui . text . style . Baseline Shift Ċ import Ġandroidx . compose . ui . text . style . Text Decoration Ċ import Ġandroidx . compose . ui . text . style . Text Ge ometric Transform Ċ import Ġandroidx . compose . ui . unit . em Ċ import Ġandroidx . compose . ui . unit . sp Ċ import Ġkotlin . math . ceil Ċ import Ġkotlin . random . Random Ċ Ċ class ĠRandom Text Generator ( ĊĠĠĠ Ġprivate Ġval Ġalphabet : ĠAl phabet Ġ= ĠAl phabet . Latin , ĊĠĠĠ Ġprivate Ġval Ġrandom : ĠRandom Ġ= ĠRandom ( 0 ) Ċ ) Ġ{ ĊĠĠĠ Ġ// Ġa Ġset Ġof Ġpredefined ĠTextStyle 's Ġto Ġadd Ġto Ġstyled Ġtext ĊĠĠĠ Ġprivate Ġval Ġnon Metric A ffect ing Text Styles Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠ ĠSpan Style ( color Ġ= ĠColor . Blue ), ĊĠĠĠĠĠĠĠ ĠSpan Style ( background Ġ= ĠColor . C yan ), ĊĠĠĠĠĠĠĠ ĠSpan Style ( text Decoration Ġ= ĠText Decoration . Underline ), ĊĠĠĠĠĠĠĠ ĠSpan Style ( shadow Ġ= ĠShadow ( Color . Black , ĠOffset ( 3 f , Ġ 3 f ), Ġ 2 . 0 f )) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġval Ġmetric A ffect ing Text Styles Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠ ĠSpan Style ( fontSize Ġ= Ġ 1 8 . sp ), ĊĠĠĠĠĠĠĠ ĠSpan Style ( fontSize Ġ= Ġ 2 . em ), ĊĠĠĠĠĠĠĠ ĠSpan Style ( font Weight Ġ= ĠFontWeight . Bold ), ĊĠĠĠĠĠĠĠ ĠSpan Style ( font Style Ġ= ĠFont Style . Italic ), ĊĠĠĠĠĠĠĠ ĠSpan Style ( letter Spacing Ġ= Ġ 0 . 2 . em ), ĊĠĠĠĠĠĠĠ ĠSpan Style ( baseline Shift Ġ= ĠBase line Shift . Sub script ), ĊĠĠĠĠĠĠĠ ĠSpan Style ( text Ge ometric Transform Ġ= ĠText Ge ometric Transform ( 0 . 5 f , Ġ 0 . 5 f )), ĊĠĠĠĠĠĠĠ ĠSpan Style ( locale List Ġ= ĠLocale List (" it ")) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġfun Ġget Span Style List ( has Metric A ffect ing Style : ĠBoolean ) Ġ= ĊĠĠĠĠĠĠĠ Ġnon Metric A ffect ing Text Styles Ġ+ Ġif Ġ( has Metric A ffect ing Style ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmetric A ffect ing Text Styles ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreates Ġa Ġsequence Ġof Ġcharacters Ġgroup Ġof Ġlength Ġ[ length ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġnext Word ( length : ĠInt ): ĠString Ġ= ĠList ( length ) Ġ{ ĊĠĠĠĠĠĠĠ Ġalphabet . char Ranges . random ( random ). random ( random ). to Char () ĊĠĠĠ Ġ}. join ToString ( separator Ġ= Ġ"") ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreate Ġa Ġsequence Ġof Ġcharacter Ġgroups Ġseparated Ġby Ġthe Ġ[ Alphabet . space ]. ĠEach Ġcharacter Ġgroup Ġconsists Ġof ĊĠĠĠĠ Ġ* Ġ[ word Length ] Ġcharacters . ĠThe Ġtotal Ġlength Ġof Ġthe Ġreturned Ġstring Ġis Ġ[ length ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġnext Paragraph ( ĊĠĠĠĠĠĠĠ Ġlength : ĠInt , ĊĠĠĠĠĠĠĠ Ġword Length : ĠInt Ġ= Ġ 9 ĊĠĠĠ Ġ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( length Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"" ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStringBuilder (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( this . length Ġ< Ġlength ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( next Word ( word Length )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( alphabet . space ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. substring ( 0 , Ġlength ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGiven Ġa Ġ[ text ] Ġmark Ġeach Ġcharacter Ġgroup Ġwith Ġa Ġpredefined ĠTextStyle . ĠThe Ġorder Ġof ĠText Styles Ġis Ġpredefined , ĊĠĠĠĠ Ġ* Ġand Ġnot Ġrandom ized Ġon Ġpurpose Ġin Ġorder Ġto Ġget Ġa Ġconsistent Ġresult Ġin Ġour Ġbenchmarks . ĊĠĠĠĠ Ġ* Ġ@ param Ġtext ĠThe Ġtext Ġon Ġwhich Ġthe Ġmarkup Ġis Ġapplied . ĊĠĠĠĠ Ġ* Ġ@ param Ġstyle Count ĠThe Ġnumber Ġof Ġthe Ġtext Ġstyles Ġapplied Ġon Ġthe Ġ[ text ]. ĊĠĠĠĠ Ġ* Ġ@ param Ġhas Metric A ffect ing Style ĠWhether Ġto Ġapply Ġmetric Ġaffect ing Ġ[ TextStyle ] s Ġtext , Ġwhich ĊĠĠĠĠ Ġ* Ġ Ġincreases Ġthe Ġdifficulty Ġto Ġmeasure Ġtext . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcreate Styles ( ĊĠĠĠĠĠĠĠ Ġtext : ĠString , ĊĠĠĠĠĠĠĠ Ġstyle Count : ĠInt Ġ= Ġtext . split ( alphabet . space ). size , ĊĠĠĠĠĠĠĠ Ġhas Metric A ffect ing Style : ĠBoolean Ġ= Ġtrue ĊĠĠĠ Ġ): ĠList < Annotated String . Range < Span Style >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġspan Style List Ġ= Ġget Span Style List ( has Metric A ffect ing Style ) ĊĊĠĠĠĠĠĠĠ Ġval Ġwords Ġ= Ġtext . split ( alphabet . space ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġindex Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġstyle Index Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġval Ġstyle Per Word Ġ= Ġstyle Count Ġ/ Ġwords . size ĊĠĠĠĠĠĠĠ Ġval Ġremains Ġ= Ġstyle Count Ġ% Ġwords . size ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwords . with Index (). flatMap Ġ{ Ġ( word Index , Ġword ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Ġ= Ġindex ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Ġ= Ġstart Ġ+ Ġword . length ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ+= Ġword . length Ġ+ Ġ 1 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstyle Count On Word Ġ= Ġstyle Per Word Ġ+ Ġif Ġ( word Index Ġ< Ġremains ) Ġ 1 Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠList ( style Count On Word ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAnnot ated String . Range ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ= Ġstart , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Ġ= Ġend , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Ġ= Ġspan Style List [ style Index ++ Ġ% Ġspan Style List . size ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreate Ġan Ġ[ Annotated String ] Ġwith Ġrandomly Ġgenerated Ġtext Ġbut Ġpredefined ĠText Styles . ĊĠĠĠĠ Ġ* Ġ@ see Ġnext Paragraph ĊĠĠĠĠ Ġ* Ġ@ see Ġcreate Styles ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġnext Annotated String ( ĊĠĠĠĠĠĠĠ Ġlength : ĠInt , ĊĠĠĠĠĠĠĠ Ġword Length : ĠInt Ġ= Ġ 9 , ĊĠĠĠĠĠĠĠ Ġstyle Count : ĠInt , ĊĠĠĠĠĠĠĠ Ġhas Metric A ffect ing Style : ĠBoolean Ġ= Ġtrue ĊĠĠĠ Ġ): ĠAnnot ated String Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġnext Paragraph ( length , Ġword Length ) ĊĠĠĠĠĠĠĠ Ġreturn ĠAnnot ated String ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġtext , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġspan Styles Ġ= Ġcreate Styles ( text , Ġstyle Count , Ġhas Metric A ffect ing Style ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreate Ġa Ġlist Ġof Ġword ( character Ġgroup )- [ TextStyle ] Ġpairs , Ġwords Ġare Ġrandomly Ġgenerated Ġwhile ĊĠĠĠĠ Ġ* Ġthe Ġ[ TextStyle ] Ġis Ġcreated Ġin Ġa Ġfixed Ġorder . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġnext Styled Word List ( ĊĠĠĠĠĠĠĠ Ġlength : ĠInt , ĊĠĠĠĠĠĠĠ Ġword Length : ĠInt Ġ= Ġ 9 , ĊĠĠĠĠĠĠĠ Ġhas Metric A ffect ing Style : ĠBoolean Ġ= Ġtrue ĊĠĠĠ Ġ): ĠList < Pair < String , ĠSpan Style >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtext Style List Ġ= Ġget Span Style List ( has Metric A ffect ing Style ) ĊĊĠĠĠĠĠĠĠ Ġval Ġword Count Ġ= Ġceil ( length . toFloat () Ġ/ Ġ( word Length Ġ+ Ġ 1 )). toInt () ĊĠĠĠĠĠĠĠ Ġvar Ġstyle Index Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġreturn ĠList ( word Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair ("${ next Word ( length )} Ġ", Ġtext Style List [ style Index ++ Ġ% Ġtext Style List . size ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠDefines Ġthe Ġcharacter Ġranges Ġto Ġbe Ġpicked Ġrandomly Ġfor Ġa Ġscript . Ċ Ġ*/ Ċ class ĠAl phabet ( ĊĠĠĠ Ġval Ġchar Ranges : ĠList < Int Range >, ĊĠĠĠ Ġval Ġspace : ĠChar , ĊĠĠĠ Ġval Ġname : ĠString Ċ ) Ġ{ ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġname ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠLat in Ġ= ĠAl phabet ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchar Ranges Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInt Range (' a '. toInt (), Ġ' z '. toInt ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInt Range (' A '. toInt (), Ġ' Z '. toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġspace Ġ= Ġ' Ġ', ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġ" Latin " ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval ĠC jk Ġ= ĠAl phabet ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchar Ranges Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInt Range ( 0 x 4 E 0 0 , Ġ 0 x 6 2 FF ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInt Range ( 0 x 6 3 0 0 , Ġ 0 x 7 7 FF ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInt Range ( 0 x 7 8 0 0 , Ġ 0 x 8 C FF ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġspace Ġ= Ġ 0 x 3 0 0 0 . to Char (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġ" C JK " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠUsed Ġby Ġ[ Random Text Generator ] Ġin Ġorder Ġto Ġcreate Ġplain Ġtext Ġor Ġmulti - styled Ġtext . Ċ Ġ*/ Ċ enum Ġclass ĠText Type Ġ{ ĊĠĠĠ ĠPlain Text , ĊĠĠĠ ĠStyled Text Ċ } Ċ Ċ /** Ċ Ġ* ĠGiven Ġa Ġlist Ġof ĠArrays Ġand Ġmake Ġcart esian Ġproduct Ġeach Ġof Ġthem Ġwith Ġthe Ġ[ array ]. Ċ Ġ*/ Ċ fun ĠList < Array < Any >> . cart esian ( var arg Ġarray : ĠAny ): ĠList < Array < Any >> Ġ{ ĊĠĠĠ Ġreturn Ġflat Map Ġ{ Ġrow Ġ-> Ġarray . map Ġ{ Ġrow Ġ+ Ġit Ġ} Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠCreates Ġa Ġcart esian Ġproduct Ġof Ġthe Ġgiven Ġarrays . Ċ Ġ*/ Ċ fun Ġcart esian ( var arg Ġarrays : ĠArray < Any >): ĠList < Array < Any >> Ġ{ ĊĠĠĠ Ġreturn Ġarrays . fold ( listOf ( array Of ())) Ġ{ Ġacc , Ġlist Ġ-> ĊĠĠĠĠĠĠĠ Ġ// Ġadd Ġitems Ġfrom Ġthe Ġcurrent Ġlist ĊĠĠĠĠĠĠĠ Ġ// Ġto Ġeach Ġlist Ġthat Ġwas Ġaccumulated ĊĠĠĠĠĠĠĠ Ġacc . flatMap Ġ{ Ġacc ListItem Ġ-> Ġlist . map Ġ{ Ġacc ListItem Ġ+ Ġit Ġ} Ġ} ĊĠĠĠ Ġ} Ċ } Ċ