/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 ĠCl iff ord ĠLi u Ċ Ġ* Ċ Ġ* Ġ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 Ġcom . mad ness . collision . unit . api _ view ing . data Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics .* Ċ import Ġandroid . graphics . drawable . Adaptive Icon Drawable Ċ import Ġandroid . graphics . drawable . Drawable Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġcom . mad ness . collision . R Ċ import Ġcom . mad ness . collision . util . Graphics Util Ċ import Ġcom . mad ness . collision . util . Theme Util Ċ import Ġcom . mad ness . collision . util . X Ċ import Ġcom . mad ness . collision . util . os . Os Utils Ċ import Ġkotlin . math . max Ċ import Ġkotlin . math . round ToInt Ċ Ċ internal Ġobject ĠApp Icon Processor Ġ{ ĊĊĠĠĠ Ġfun Ġretrieve App Icon ( ĊĠĠĠĠĠĠĠ Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠ Ġis Defined : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġicon Drawable : ĠDrawable , ĊĠĠĠĠĠĠĠ Ġicon Details : ĠIcon Retrie ving Details ĊĠĠĠ Ġ): ĠBitmap ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġlogo Drawable Ġ= Ġicon Drawable ĊĠĠĠĠĠĠĠ Ġif Ġ( isDefined ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( icon Details . is Default ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogo Drawable Ġ= ĠContext Compat . get Drawable ( context , ĠR . drawable . ic _ android _ 2 4 ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġicon Details . width Ġ= Ġlogo Drawable . intrinsic Width ĊĠĠĠĠĠĠĠĠĠĠĠ Ġicon Details . height Ġ= Ġlogo Drawable . intrinsic Height ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( icon Details . width Ġ<= Ġ 0 Ġ|| Ġicon Details . height Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġicon Details . is Default Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogo Drawable Ġ= ĠContext Compat . get Drawable ( context , ĠR . drawable . ic _ android _ 2 4 ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġicon Details . width Ġ= Ġlogo Drawable . intrinsic Width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġicon Details . height Ġ= Ġlogo Drawable . intrinsic Height ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġbelow : Ġshrink Ġsize Ġif Ġit 's Ġtoo Ġlarge Ġin Ġcase Ġof Ġconsuming Ġtoo Ġmuch Ġmemory ĊĠĠĠĠĠĠĠĠĠĠĠ Ġicon Details . standard Width Ġ= ĠX . size ( context , Ġ 7 2 f , ĠX . DP ). round ToInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠmaxLength Ġ= Ġmax ( icon Details . width , Ġicon Details . height ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( maxLength Ġ> Ġicon Details . standard Width ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfraction : ĠFloat Ġ= Ġicon Details . standard Width . toFloat () Ġ/ ĠmaxLength ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġicon Details . width Ġ= Ġ( icon Details . width Ġ* Ġfraction ). round ToInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġicon Details . height Ġ= Ġ( icon Details . height Ġ* Ġfraction ). round ToInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( icon Details . width Ġ<= Ġ 0 Ġ|| Ġicon Details . height Ġ<= Ġ 0 ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġlogo Ġ= ĠBitmap . create Bitmap ( icon Details . width , Ġicon Details . height , ĠBitmap . Config . ARGB _ 8 8 8 8 ) ĊĠĠĠĠĠĠĠ Ġlogo Drawable . setBounds ( 0 , Ġ 0 , Ġicon Details . width , Ġicon Details . height ) ĊĠĠĠĠĠĠĠ Ġlogo Drawable . draw ( Canvas ( logo )) ĊĠĠĠĠĠĠĠ Ġ// Ġmake Ġit Ġsquare Ġand Ġproperly Ġcentered ĊĠĠĠĠĠĠĠ Ġlogo Ġ= ĠGraphics Util . proper ly 2 Square ( logo ) ĊĠĠĠĠĠĠĠ Ġreturn ĠX . to Target ( logo , Ġicon Details . standard Width , Ġicon Details . standard Width ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdetermine Icon Clip ( context : ĠContext , Ġicon 2 Clip : ĠBitmap , Ġicon Details : ĠIcon Retrie ving Details , Ġalpha Limit : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġradius Ġ= ĠX . size ( context , Ġ 1 0 f , ĠX . DP ). round ToInt () ĊĠĠĠĠĠĠĠ Ġval Ġradius Float Ġ= Ġradius . toFloat () ĊĠĠĠĠĠĠĠ Ġval Ġdiameter Ġ= Ġ 2 Ġ* Ġradius ĊĊĠĠĠĠĠĠĠ Ġval Ġsample Ġ= ĠX . to Target ( icon 2 Clip , Ġdiameter , Ġdiameter ) ĊĠĠĠĠĠĠĠ Ġ// Ġexam Ġwhether Ġto Ġtrim Ġit ĊĠĠĠĠĠĠĠ Ġval Ġexam Ġ= ĠBitmap . create Bitmap ( sample ) ĊĠĠĠĠĠĠĠ Ġval Ġcanvas Exam Ġ= ĠCanvas ( exam ) ĊĠĠĠĠĠĠĠ Ġval Ġpaint Exam Ġ= ĠPaint (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstyle Ġ= ĠPaint . Style . FILL ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Anti Alias Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ= ĠColor . BLACK ĊĠĠĠĠĠĠĠĠĠĠĠ Ġxfer mode Ġ= ĠPort er D uff X fer mode ( Port er D uff . Mode . SRC ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġpath Exam Ġ= ĠPath (). apply Ġ{ Ġfill Type Ġ= ĠPath . Fill Type . IN VERSE _ E VEN _ O DD Ġ} ĊĠĠĠĠĠĠĠ Ġpath Exam . add Circle ( radius Float , Ġradius Float , Ġradius Float , ĠPath . Direction . CW ) ĊĠĠĠĠĠĠĠ Ġcanvas Exam . draw Path ( path Exam , Ġpaint Exam ) ĊĠĠĠĠĠĠĠ Ġval Ġpixels Ġ= ĠInt Array ( exam . width Ġ* Ġexam . height ) ĊĠĠĠĠĠĠĠ Ġexam . get Pixels ( pixels , Ġ 0 , Ġexam . width , Ġ 0 , Ġ 0 , Ġexam . width , Ġexam . height ) ĊĠĠĠĠĠĠĠ Ġval Ġtransparent Pixels Ġ= Ġpixels . filter Ġ{ Ġ( it Ġ ush r Ġ 2 4 Ġand Ġ 0 xFF ) Ġ< Ġalpha Limit Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġtransparent Size Ġ= Ġtransparent Pixels . size . toFloat () ĊĠĠĠĠĠĠĠ Ġval Ġtotal Ġ= Ġpixels . size . toFloat () ĊĠĠĠĠĠĠĠ Ġval Ġratio Ġ= Ġtransparent Size Ġ/ Ġtotal ĊĠĠĠĠĠĠĠ Ġicon Details . should Clip Ġ= Ġratio Ġ< Ġ 0 . 0 1 5 ĊĊĠĠĠĠĠĠĠ Ġif Ġ( icon Details . should Clip ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpaint Exam . shader Ġ= ĠBitmap Shader ( sample , ĠShader . Tile Mode . CLAMP , ĠShader . Tile Mode . CLAMP ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath Exam . fill Type Ġ= ĠPath . Fill Type . E VEN _ O DD ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġround Sample Ġ= ĠBitmap . create Bitmap ( diameter , Ġdiameter , ĠBitmap . Config . ARGB _ 8 8 8 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCanvas ( round Sample ). draw Path ( path Exam , Ġpaint Exam ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġicon Details . should Stroke Ġ= ĠGraphics Util . should Stroke ( context , Ġround Sample , ĠGraphics Util . AI _ FL AV OR _ ROUND ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġmake Ġicon Ġround ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġround Icon ( ĊĠĠĠĠĠĠĠ Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠ Ġis Defined : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġlogo : ĠBitmap , ĊĠĠĠĠĠĠĠ Ġround Icon Drawable : ĠDrawable ?, ĊĠĠĠĠĠĠĠ Ġicon Details : ĠIcon Retrie ving Details ĊĠĠĠ Ġ): ĠBitmap Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdo Package Icon Ġ= Ġround Icon Drawable Ġ!= Ġnull ĊĠĠĠĠĠĠĠ Ġ// Ġbelow : Ġconvert Ġinto Ġround ĊĠĠĠĠĠĠĠ Ġ// Ġthe Ġhigher Ġthe Ġharder Ġto Ġbe Ġrecognized Ġas Ġround Ġicon ĊĠĠĠĠĠĠĠ Ġval Ġalpha Limit Ġ= Ġ 0 x 9 0 ĊĠĠĠĠĠĠĠ Ġval Ġicon 2 Clip Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGraphics Util . remove Outer Transparent Pixels ( logo , Ġno Transparency Ġ= Ġfalse , Ġalpha Limit Ġ= Ġalpha Limit ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGraphics Util . proper ly 2 Square ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! isDefined Ġ&& Ġ! do Package Icon Ġ&& ĠEasy Access . should Clip 2 Round ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdetermine Icon Clip ( context , Ġicon 2 Clip , Ġicon Details , Ġalpha Limit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! isDefined Ġ&& Ġ! do Package Icon Ġ&& Ġ! icon Details . should Clip ) Ġicon Details . should Stroke Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġval ĠstrokeWidth Ġ= Ġif Ġ( icon Details . should Stroke ) ĠX . size ( context , Ġ 1 f , ĠX . DP ). round ToInt () Ġelse Ġ 0 ĊĠĠĠĠĠĠĠ Ġval ĠstrokeWidth Float Ġ= Ġif Ġ( icon Details . should Stroke ) ĠstrokeWidth . toFloat () Ġelse Ġ 0 f ĊĊĠĠĠĠĠĠĠ Ġ// Ġbelow : Ġget Ġtools Ġready Ġto Ġdraw ĊĠĠĠĠĠĠĠ Ġval Ġfraction Ġ= Ġ 0 . 6 f ĊĠĠĠĠĠĠĠ Ġ// Ġstandard Ġicon Ġsize : Ġ 4 8 dp Ġ* Ġ 4 8 dp ĊĠĠĠĠĠĠĠ Ġval Ġradius Standard Ġ= ĠX . size ( context , Ġ 3 6 Ġ/ Ġfraction , ĠX . DP ). round ToInt () ĊĠĠĠĠĠĠĠ Ġ// Ġthe Ġradius Ġvisible Ġto Ġbe Ġseen ĊĠĠĠĠĠĠĠ Ġval Ġdisplay Radius Ġ= Ġif Ġ( icon Details . should Stroke ) Ġradius Standard Ġ+ ĠstrokeWidth Ġelse Ġradius Standard ĊĠĠĠĠĠĠĠ Ġval Ġdisplay Radius Float Ġ= Ġdisplay Radius . toFloat () ĊĠĠĠĠĠĠĠ Ġval Ġdisplay Di ameter Ġ= Ġ 2 Ġ* Ġdisplay Radius ĊĠĠĠĠĠĠĠ Ġ// Ġthe Ġtrue Ġradius Ġof Ġimage ĊĠĠĠĠĠĠĠ Ġval Ġtarget Radius Ġ= Ġdisplay Radius Ġ+ ĠstrokeWidth ĊĠĠĠĠĠĠĠ Ġval Ġtarget Radius Float Ġ= Ġtarget Radius . toFloat () ĊĠĠĠĠĠĠĠ Ġval Ġtarget Di ameter Ġ= Ġ 2 Ġ* Ġtarget Radius ĊĊĠĠĠĠĠĠĠ Ġval Ġlogo Circular Ġ= ĠBitmap . create Bitmap ( target Di ameter , Ġtarget Di ameter , ĠBitmap . Config . ARGB _ 8 8 8 8 ) ĊĠĠĠĠĠĠĠ Ġval Ġcanvas Ġ= ĠCanvas ( logo Circular !! ) ĊĠĠĠĠĠĠĠ Ġval Ġpaint Ġ= ĠPaint ( Paint . ANTI _ ALIAS _ FLAG ) ĊĠĠĠĠĠĠĠ Ġval Ġcolor Stroke Ġ= Ġif Ġ( icon Details . should Stroke ) ĠTheme Util . getColor ( context , ĠR . attr . color Stroke ) Ġelse Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġ// Ġbelow : Ġprocess Ġround Ġicon Ġfrom Ġpackage ĊĠĠĠĠĠĠĠ Ġif Ġ( do Package Icon ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlogo 2 Draw Ġ= Ġicon Drawable 2 Bitmap ( context , Ġround Icon Drawable !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġbelow : Ġensure Ġit Ġis Ġround ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogo 2 Draw Ġ= ĠX . to Target ( logo 2 Draw , Ġdisplay Di ameter , Ġdisplay Di ameter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpaint . shader Ġ= ĠBitmap Shader ( logo 2 Draw , ĠShader . Tile Mode . CLAMP , ĠShader . Tile Mode . CLAMP ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Circle ( target Radius Float , Ġtarget Radius Float , Ġdisplay Radius Float , Ġpaint ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! icon Details . should Stroke ) Ġreturn Ġlogo Circular ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( icon Details . should Clip ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpaint . shader Ġ= ĠBitmap Shader ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠX . to Target ( icon 2 Clip , Ġdisplay Di ameter , Ġdisplay Di ameter ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠShader . Tile Mode . CLAMP , ĠShader . Tile Mode . CLAMP ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Circle ( target Radius Float , Ġtarget Radius Float , Ġdisplay Radius Float , Ġpaint ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! icon Details . should Stroke ) Ġreturn Ġlogo Circular ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġbelow : Ġdraw Ġicon Ġon Ġtop Ġof Ġa Ġwhite Ġbackground ĊĠĠĠĠĠĠĠ Ġif Ġ(! do Package Icon Ġ&& Ġ! icon Details . should Clip ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġbelow : Ġdraw Ġbackground ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpaint . color Ġ= ĠTheme Util . getColor ( context , ĠR . attr . color Api Legacy Back ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Circle ( target Radius Float , Ġtarget Radius Float , Ġdisplay Radius Float , Ġpaint ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġbelow : Ġdraw Ġsh run k Ġapp Ġicon ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsh run k Di ameter Ġ= Ġ( display Di ameter Ġ* Ġfraction ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsh run k Logo Ġ= ĠX . to Target ( logo , Ġsh run k Di ameter , Ġsh run k Di ameter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġtarget Radius Float Ġ* Ġ( 1 Ġ- Ġfraction ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Bitmap ( sh run k Logo , Ġoffset , Ġoffset , ĠPaint ( Paint . ANTI _ ALIAS _ FLAG )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġstroke ĊĠĠĠĠĠĠĠ Ġval Ġpaint Stroke Ġ= ĠPaint ( Paint . ANTI _ ALIAS _ FLAG ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . color Ġ= Ġcolor Stroke ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . stroke Width Ġ= ĠstrokeWidth Float ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . style Ġ= ĠPaint . Style . ST RO KE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcanvas . draw Circle ( target Radius Float , Ġtarget Radius Float , Ġdisplay Radius Float , Ġpaint Stroke ) ĊĠĠĠĠĠĠĠ Ġreturn Ġlogo Circular ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġicon Drawable 2 Bitmap ( context : ĠContext , Ġdrawable : ĠDrawable ): ĠBitmap Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Os Utils . satisf y ( Os Utils . O ) Ġ&& Ġdrawable Ġis ĠAdapt ive Icon Drawable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠGraphics Util . draw AIR ound ( context , Ġdrawable ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠX . drawable To Bitmap ( drawable ) ĊĠĠĠ Ġ} Ċ Ċ } Ċ