/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 8 Ġ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 Ġcom . android . build . gradle . internal . a apt Ċ Ċ import Ġcom . android . Sdk Constants . DOT _ 9 PNG Ċ import Ġcom . android . a apt compiler . can Compile Resource In Jvm Ċ import Ġcom . android . build . gradle . internal . res . A apt 2 Compile Runnable Ċ import Ġcom . android . build . gradle . internal . res . Resource Compiler Runnable Ċ import Ġcom . android . build . gradle . internal . services . A apt 2 Daemon Service Key Ċ import Ġcom . android . build . gradle . internal . tasks . Workers Ċ import Ġcom . android . build . gradle . options . Sync Options Ċ import Ġcom . android . builder . internal . a apt . v 2 . A apt 2 Ren aming Con ventions Ċ import Ġcom . android . ide . common . resources . Compile Resource Request Ċ import Ġcom . android . ide . common . resources . Resource Compilation Service Ċ import Ġcom . android . ide . common . workers . Worker Executor Facade Ċ import Ġjava . io . File Ċ Ċ /** ĠResource Ġcompilation Ġservice Ġbuilt Ġon Ġtop Ġof Ġa ĠA apt 2 Daemon Ġand ĠGradle ĠWorker ĠExec utors . Ġ*/ Ċ class ĠWorker Executor Resource Compilation Service ( ĊĠ ĠprojectName : ĠString , ĊĠ Ġowner : ĠString , ĊĠ Ġprivate Ġval Ġworker Executor : ĠWorker Executor Facade , ĊĠ Ġprivate Ġval Ġa apt 2 Service Key : ĠA apt 2 Daemon Service Key , ĊĠ Ġprivate Ġval Ġerror Format Mode : ĠSync Options . Error Format Mode , ĊĠ Ġprivate Ġval Ġuse Jvm Resource Compiler : ĠBoolean Ċ ) Ġ: ĠResource Compilation Service Ġ{ ĊĊĠ Ġ/** ĠTemporary Ġworkaround Ġfor Ġb / 7 3 8 0 4 5 7 5 Ġ/ Ġhttps :// github . com / gradle / gradle / issues / 4 5 0 2 ĊĠĠ Ġ* Ġ ĠOnly Ġsubmit Ġa Ġsmall Ġnumber Ġof Ġworker Ġactions Ġ*/ ĊĠ Ġprivate Ġval Ġrequests : ĠMutable List < Compile Resource Request > Ġ= ĠArrayList () ĊĊĠ Ġprivate Ġval Ġresource Compiler Executor Ġ= ĠWork ers . with Threads ( projectName , Ġowner ) ĊĊĠ Ġoverride Ġfun Ġsubmit Compile ( request : ĠCompile Resource Request ) Ġ{ ĊĠĠĠ Ġ// Ġb / 7 3 8 0 4 5 7 5 ĊĠĠĠ Ġrequests . add ( request ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġcompile Output For ( request : ĠCompile Resource Request ): ĠFile Ġ{ ĊĠĠĠ Ġreturn ĠFile ( ĊĠĠĠĠĠ Ġrequest . output Directory , ĊĠĠĠĠĠ ĠA apt 2 Ren aming Con ventions . compilation Rename ( request . inputFile )) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġget Extension ( file : ĠFile ): ĠString Ġ{ ĊĠĠĠ Ġ// Ġkotlin ĠFile . extension Ġreturns Ġpng Ġfor Ġ 9 . png Ġfiles ĊĠĠĠ Ġif Ġ( file . name . endsWith ( DOT _ 9 PNG )) Ġ{ ĊĠĠĠĠĠ Ġreturn ĠDOT _ 9 PNG ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġfile . extension ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠ Ġif Ġ( requests . isEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( use Jvm Resource Compiler ) Ġ{ ĊĠĠĠĠĠ Ġ// ĠFirst Ġremove Ġall Ġvalues Ġfiles Ġto Ġbe Ġconsumed Ġby Ġthe Ġkotlin Ġcompiler . ĊĠĠĠĠĠ Ġval Ġvalues Requests Ġ= Ġrequests . filter Ġ{ ĊĠĠĠĠĠĠĠ Ġcan Compile Resource In Jvm ( it . inputFile , Ġit . is P ng C runch ing ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġrequests . removeAll ( values Requests ) ĊĠĠĠĠĠ Ġfor Ġ( request Ġin Ġvalues Requests ) Ġ{ ĊĠĠĠĠĠĠĠ Ġresource Compiler Executor . submit ( ĊĠĠĠĠĠĠĠĠĠ ĠResource Compiler Runnable :: class . java , ĊĠĠĠĠĠĠĠĠĠ ĠResource Compiler Runnable . Params ( request ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠSort Ġthe Ġresource Ġfiles Ġby Ġextension Ġand Ġsize Ġfor Ġa Ġbetter Ġdistribution Ġof Ġfiles ĊĠĠĠ Ġ// Ġbetween Ġworkers . ĠFiles Ġof Ġthe Ġsame Ġtype Ġwill Ġbe Ġdistributed Ġequ ally Ġbetween Ġthe Ġworkers . ĊĠĠĠ Ġ// ĠLarge Ġfiles Ġof Ġthe Ġsame Ġtype Ġwill Ġalso Ġbe Ġdistributed Ġequ ally Ġbetween Ġthe Ġworkers . ĊĠĠĠ Ġrequests . sort With ( compare By ({ Ġget Extension ( it . inputFile ) Ġ}, Ġ{ Ġit . inputFile . length () Ġ})) ĊĠĠĠ Ġval Ġbuckets Ġ= Ġmin Of ( requests . size , Ġ 8 ) Ġ// ĠMax Ġ 8 Ġbuckets ĊĊĠĠĠ Ġfor Ġ( bucket Ġin Ġ 0 Ġuntil Ġbuckets ) Ġ{ ĊĠĠĠĠĠ Ġval Ġbucket Requests Ġ= Ġrequests . filter Indexed Ġ{ Ġi , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠ Ġi . rem ( buckets ) Ġ== Ġbucket ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ// Ġb / 7 3 8 0 4 5 7 5 ĊĠĠĠĠĠ Ġworker Executor . submit ( ĊĠĠĠĠĠĠĠ ĠA apt 2 Compile Runnable :: class . java , ĊĠĠĠĠĠĠĠ ĠA apt 2 Compile Runnable . Params ( a apt 2 Service Key , Ġbucket Requests , Ġerror Format Mode , Ġtrue ) ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġrequests . clear () ĊĊĠĠĠ Ġresource Compiler Executor . close () ĊĠĠĠ Ġ// ĠNo Ġneed Ġfor Ġworker Executor . await () Ġhere Ġas Ġresource Ġcompilation Ġis Ġthe Ġlast Ġpart Ġof Ġthe ĊĠĠĠ Ġ// Ġmerge Ġtask . ĠThis Ġmeans Ġthe ĠMerge Resources Ġtask Ġaction Ġcan Ġreturn , Ġallowing Ġother Ġtasks ĊĠĠĠ Ġ// Ġin Ġthe Ġsame Ġsub project Ġto Ġrun Ġwhile Ġresources Ġare Ġstill Ġbeing Ġcompiled . ĊĠĠĠ Ġworker Executor . close () ĊĠ Ġ} Ċ } Ċ