package Ġcom . g 0 0 fy 2 . developer widget . data . device . cpu Ċ Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Build . VERSION Ċ import Ġandroid . os . Build . VERSION _ CODES Ċ import Ġjava . io . File Ċ import Ġjava . io . FileNotFoundException Ċ import Ġjava . io . Random Access File Ċ import Ġjava . util . regex . Pattern Ċ import Ġkotlin . math . max Ċ Ċ object ĠCPU DataProvider Ġ{ ĊĊĠ Ġprivate Ġconst Ġval ĠCPU _ SYS _ FOLDER Ġ= Ġ"/ sys / devices / system / cpu /" ĊĠ Ġprivate Ġval ĠCPU _ PATTERN Ġ= ĠPattern . compile (" cpu [ 0 - 9 ]+ ") ĊĊĠ Ġfun Ġget Primary ABI (): ĠString Ġ{ ĊĠĠĠ Ġreturn Ġif Ġ( VERSION . SDK _ INT Ġ>= ĠVERSION _ CODES . LO L LI POP ) Ġ{ ĊĠĠĠĠĠ ĠBuild . SUPPORTED _ AB IS . first OrNull () Ġ?: Ġ"" ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġ@ Suppress (" DE PREC ATION ") ĊĠĠĠĠĠ ĠBuild . CPU _ ABI ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġget CPU Core Num (): ĠInt Ġ{ ĊĠĠĠ Ġreturn Ġmax ( ĊĠĠĠĠĠ ĠFile ( CPU _ SYS _ FOLDER ) ĊĠĠĠĠĠĠĠ Ġ. walk () ĊĠĠĠĠĠĠĠ Ġ. max Depth ( 1 ) ĊĠĠĠĠĠĠĠ Ġ. count Ġ{ ĠCPU _ PATTERN . matcher ( it . name ). matches () Ġ}, ĊĠĠĠĠĠ ĠRuntime . get Runtime (). available Processors () ĊĠĠĠ Ġ) ĊĠ Ġ} ĊĊĠ Ġfun Ġget Group ed CPU Core F requ encies (): ĠString Ġ{ ĊĠĠĠ Ġval Ġfrequencies Ġ= Ġmutable ListOf < Pair < Int , ĠInt >>() ĊĠĠĠ Ġval Ġcores Ġ= Ġget CPU Core Num () ĊĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġcores ) Ġ{ ĊĠĠĠĠĠ Ġget CPU F requ encies Per Core ( i )?. let Ġ{ Ġfrequencies . add ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġfrequencies . sorted By Descending Ġ{ Ġit . second Ġ} ĊĠĠĠĠĠ Ġ. grouping By Ġ{ Ġit . second . toString () Ġ+ Ġ" MHz Ġ- Ġ" Ġ+ Ġit . first Ġ+ Ġ" MHz " Ġ} ĊĠĠĠĠĠ Ġ. each Count () ĊĠĠĠĠĠ Ġ. map Ġ{ Ġit . value . toString () Ġ+ Ġ" Ġx Ġ" Ġ+ Ġit . key Ġ} ĊĠĠĠĠĠ Ġ. plus ( if Ġ( frequ encies . size Ġ< Ġcores ) Ġ( cores Ġ- Ġfrequencies . size ). toString () Ġ+ Ġ" Ġx Ġoffline " Ġelse Ġ"") ĊĠĠĠĠĠ Ġ. filter Ġ{ Ġit . isNotEmpty () Ġ} ĊĠĠĠĠĠ Ġ. join ToString ( separator Ġ= Ġ"\ n ") ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġget CPU F requ encies Per Core ( core : ĠInt ): ĠPair < Int , ĠInt >? Ġ{ ĊĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠ Ġval Ġmax Ġ= ĠRandom Access File ( CPU _ SYS _ FOLDER Ġ+ Ġ" cpu $ core / cp uf req / cpu info _ max _ freq ", Ġ" r "). use Ġ{ Ġreader Ġ-> ĊĠĠĠĠĠĠĠ Ġ( reader . readLine (). to Long () Ġ/ Ġ 1 0 0 0 ). toInt () ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġval Ġmin Ġ= ĠRandom Access File ( CPU _ SYS _ FOLDER Ġ+ Ġ" cpu $ core / cp uf req / cpu info _ min _ freq ", Ġ" r "). use Ġ{ Ġreader Ġ-> ĊĠĠĠĠĠĠĠ Ġ( reader . readLine (). to Long () Ġ/ Ġ 1 0 0 0 ). toInt () ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ ĠPair ( min , Ġmax ) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠFileNotFoundException ) Ġ{ ĊĠĠĠĠĠ Ġnull ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ }