package Ġnet . d ank ito . richt ext editor . android . util Ċ Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġjava . io . File ĊĊ Ċ open Ġclass ĠSystem Fonts Parser Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlog Ġ= ĠLoggerFactory . getLogger ( System Fonts Parser :: class . java ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// ĠTODO : Ġfor Ġa Ġreal Ġparsing Ġof Ġfile Ġsee Ġhttps :// stackoverflow . com / a / 2 9 5 3 3 6 8 6 ĊĠĠĠ Ġopen Ġfun Ġparse System Fonts (): ĠList < Font Info > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfont Infos Ġ= ĠArrayList < Font Info >() ĊĊĠĠĠĠĠĠĠ Ġfont Infos . addAll ( parse Font Infos From Fonts Xml ()) Ġ// Ġnewer ĠAndroid s ĊĊĠĠĠĠĠĠĠ Ġfont Infos . addAll ( parse Font Infos From System Fonts Xml ()) Ġ// Ġolder Ġsystems ĊĊĠĠĠĠĠĠĠ Ġval Ġunique F amilies Ġ= Ġfont Infos . associate By Ġ{ Ġit . fontFamily Ġ} Ġ// Ġsome Ġfonts Ġare Ġmultiple Ġtimes Ġin Ġxml Ġfiles Ġ-> Ġshow Ġeach Ġfont Ġonly Ġone Ġtime ĊĊĠĠĠĠĠĠĠ Ġreturn Ġunique F amilies . values . toList () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġparse Font Infos From Fonts Xml (): ĠCollection < Font Info > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfont Info Map Ġ= Ġmutable ListOf < Font Info >() ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfonts File Ġ= ĠFile ("/ system / etc / fonts . xml ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( fonts File . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlines Ġ= Ġfonts File . read Lines () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( i Ġin Ġ 0 .. lines . size Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry To Parse Fonts Xml Line To Font Family ( lines [ i ]) ?. let Ġ{ ĠfontFamily Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfont Info Ġ= ĠFont Info ( fontFamily ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfont Info Map . add ( font Info ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( i Ġ< Ġlines . size Ġ- Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry To Parse Fonts Xml Font Name ( lines [ i Ġ+ Ġ 1 ], Ġfont Info ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch ( e : ĠException ) Ġ{ Ġlog . error (" Could Ġnot Ġparse Ġfont Ġxml Ġfile Ġ/ system / etc / fonts . xml ", Ġe ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfont Info Map ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġtry To Parse Fonts Xml Line To Font Family ( line : ĠString ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( line . trim (). startsWith ("< family Ġname =\"" )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar ĠfontFamily Ġ= Ġline . substring ( line . indexOf ("< family Ġname =\" ") Ġ+ Ġ"< family Ġname =\"" . length ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfontFamily Ġ= ĠfontFamily . substring ( 0 , ĠfontFamily . indexOf (' \" ')) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠfontFamily ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error (" Could Ġnot Ġparse Ġline Ġ$ line ", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġtry To Parse Fonts Xml Font Name ( line : ĠString , Ġfont Info : ĠFont Info ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( line . trim (). startsWith ("< font Ġweight =\"" )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠstartIndex Ġ= Ġline . indexOf ("\ "> ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( startIndex Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfont Name Line Ġ= Ġline . substring ( line . indexOf ("\ "> ") Ġ+ Ġ"\ "> ". length ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Font Name From Line ( font Name Line , Ġfont Info ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch ( e : ĠException ) Ġ{ Ġlog . error (" Could Ġnot Ġparse Ġline Ġ$ line Ġto Ġfont Ġname Ġalias ", Ġe ) Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġparse Font Infos From System Fonts Xml (): ĠCollection < Font Info > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfont Infos Ġ= ĠArrayList < Font Info >() ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfonts File Ġ= ĠFile ("/ system / etc / system _ fonts . xml ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( fonts File . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlines Ġ= Ġfonts File . read Lines () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( i Ġin Ġ 0 .. lines . size Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry To Parse System Fonts Xml Line To Font Info ( lines , Ġi )?. let Ġ{ Ġfont Info Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfont Infos . add ( font Info ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch ( e : ĠException ) Ġ{ Ġlog . error (" Could Ġnot Ġparse Ġfont Ġxml Ġfile Ġ/ system / etc / system _ fonts . xml ", Ġe ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfont Infos ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġtry To Parse System Fonts Xml Line To Font Info ( lines : ĠList < String >, Ġindex : ĠInt ): ĠFont Info ? Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Ġ= Ġlines [ index ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( line . trim () Ġ== Ġ"< name set >") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠfontFamily Index Ġ= Ġindex Ġ+ Ġ 1 ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry To Parse System Fonts Xml Line To Font Family ( lines , ĠfontFamily Index )?. let Ġ{ ĠfontFamily Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfont Info Ġ= ĠFont Info ( fontFamily ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparse System Fonts Xml Font Name ( font Info , Ġlines , ĠfontFamily Index ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfont Info ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error (" Could Ġnot Ġparse Ġline ", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġtry To Parse System Fonts Xml Line To Font Family ( lines : ĠList < String >, Ġindex : ĠInt ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Ġ= Ġlines [ index ] ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( line . trim (). startsWith ("< name > ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar ĠfontFamily Ġ= Ġline . substring ( line . indexOf ("< name >") Ġ+ Ġ"< name >". length ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfontFamily Ġ= ĠfontFamily . substring ( 0 , ĠfontFamily . indexOf ("</ name > ")) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠfontFamily ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch ( e : ĠException ) Ġ{ Ġlog . error (" Could Ġnot Ġparse Ġline Ġfor Ġindex Ġ$ index ", Ġe ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġparse System Fonts Xml Font Name ( font Info : ĠFont Info , Ġlines : ĠList < String >, ĠfontFamily Index : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġnext Index Ġ= ĠfontFamily Index ĊĊĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( try To Parse System Fonts Xml Line To Font Name ( lines , Ġ++ next Index , Ġfont Info )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġwhile ( next Index Ġ< Ġlines . size Ġ- Ġ 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġtry To Parse System Fonts Xml Line To Font Name ( lines : ĠList < String >, Ġindex : ĠInt , Ġfont Info : ĠFont Info ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Ġ= Ġlines [ index ] ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( line . trim (). startsWith ("< file set > ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġfont Name Line Ġ= Ġlines [ index Ġ+ Ġ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfont Name Line Ġ= Ġfont Name Line . substring ( font Name Line . indexOf ("< file >") Ġ+ Ġ"< file >". length ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Font Name From Line ( font Name Line , Ġfont Info ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch ( e : ĠException ) Ġ{ Ġlog . error (" Could Ġnot Ġparse Ġline Ġfor Ġindex Ġ$ index ", Ġe ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġget Font Name From Line ( font Name Line : ĠString , Ġfont Info : ĠFont Info ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġend Index Ġ= Ġfont Name Line . indexOf ('- ') ĊĠĠĠĠĠĠĠ Ġif ( end Index Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Index Ġ= Ġfont Name Line . indexOf ('.') ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif ( end Index Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfont Name Ġ= Ġfont Name Line . substring ( 0 , Ġend Index ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfont Info . font Name Ġ= Ġfont Name ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }