package Ġcom . did ig lobal . boost er . task . resource . der ed undancy Ċ Ċ import Ġcom . did ig lobal . boost er . a apt . Configuration Ċ import Ġcom . did ig lobal . boost er . a apt 2 . A apt 2 Container Ċ import Ġcom . did ig lobal . boost er . a apt 2 . metadata Ċ import Ġcom . did ig lobal . boost er . compression . Compression Result Ċ import Ġorg . gradle . api . tasks . Task Action Ċ import Ġjava . io . File Ċ import Ġjava . io . IOException Ċ import Ġjava . util . stream . Collectors Ċ Ċ /** Ċ Ġ* ĠRepresents Ġa Ġtask Ġfor Ġredundant Ġresources Ġreducing Ċ Ġ* Ċ Ġ* Ġ@ author Ġj ohn son lee Ċ Ġ*/ Ċ internal Ġopen Ġclass ĠRemove Red undant Flat Images Ġ: ĠRemove Red undant Images () Ġ{ ĊĊĠĠĠ Ġ@ Task Action ĊĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresources Ġ= Ġsupplier (). parallel Stream (). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġto Ġit . metadata ĊĠĠĠĠĠĠĠ Ġ}. collect ( Collectors . toSet ()) ĊĊĠĠĠĠĠĠĠ Ġresources . filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsupports R tl Ġ-> Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġremove Ġld rtl Ġresources Ġif ĠRTL Ġis Ġnot Ġsupported ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . second . configuration . screen Config . layout Ġ== ĠConfiguration . Screen Config . SCREEN _ LAYOUT _ DIR _ RTL Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . remove () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. groupBy ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . second . resourceName . substring Before Last ('/') Ġ// Ġgroup Ġby Ġresource Ġtype , Ġeg . Ġdrawable , Ġmip map , Ġetc . ĊĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . first Ġto Ġit . second ĊĠĠĠĠĠĠĠ Ġ}). forEach Ġ{ Ġentry Ġ-> Ġ// Ġresource Ġtype Ġ=> Ġresources ĊĠĠĠĠĠĠĠĠĠĠĠ Ġentry . value . groupBy ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġresource Ġname Ġwith Ġconfiguration Ġexcept Ġdensity ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConfiguration ( it . second . configuration ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscreen Type . density Ġ= ĠConfiguration . Screen Type . D ENS ITY _ DEFAULT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. toString ( it . second . resourceName . substring After Last ('/ ')) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . first Ġto Ġit . second ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}). map Ġ{ Ġgroup Ġ-> Ġ// Ġresource Ġname Ġwith Ġconfiguration Ġ=> Ġresources ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcalculate Ġthe Ġmaximum Ġdensity Ġof Ġthe Ġresource Ġgroup Ġwith Ġsame Ġname ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhighest Ġ= Ġgroup . value . max By Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . second . configuration . screen Type . density ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ?. second ?. configuration ?. screen Type ?. density ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġselect Ġthe Ġgrouped Ġresources Ġexcept Ġthe Ġone Ġwith Ġmaximum Ġdensity ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroup . value . filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . second . configuration . screen Type . density Ġ!= Ġhighest ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. flatten (). parallel Stream (). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . remove () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠPair < File , ĠA apt 2 Container . Metadata >. remove () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this . first . delete ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoriginal Ġ= ĠFile ( this . second . source Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresults . add ( Compression Result ( this . first , Ġoriginal . length (), Ġ 0 , Ġoriginal )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Cannot Ġdelete Ġfile Ġ`${ this . first }` ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Cannot Ġdelete Ġfile Ġ`${ this . first }` ", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ