/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 3 Ġ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 . tasks Ċ Ċ import Ġcom . google . common . annotations . Visible ForTesting Ċ import Ġcom . android . build . gradle . internal . packaging . create Default Debug Store Ċ import Ġcom . android . build . gradle . internal . scope . Build Artifacts Holder Ċ import Ġcom . android . build . gradle . internal . scope . Internal Artifact Type Ċ import Ġcom . android . build . gradle . internal . scope . Variant Scope Ċ import Ġcom . android . build . gradle . internal . tasks . factory . Variant Task Creation Action Ċ import Ġcom . android . builder . core . Builder Constants Ċ import Ġcom . android . builder . model . Signing Config Ċ import Ġcom . android . builder . signing . Default Signing Config Ċ import Ġcom . android . builder . utils . Synchron ized File Ċ import Ġcom . android . utils . FileUtils Ċ import Ġcom . google . common . base . Preconditions . check State Ċ import Ġorg . gradle . api . Invalid UserData Exception Ċ import Ġorg . gradle . api . file . Directory Ċ import Ġorg . gradle . api . file . Directory Property Ċ import Ġorg . gradle . api . provider . Provider Ċ import Ġorg . gradle . api . tasks . Cache able Task Ċ import Ġorg . gradle . api . tasks . Internal Ċ import Ġorg . gradle . api . tasks . Output Directory Ċ import Ġorg . gradle . api . tasks . Task Provider Ċ import Ġjava . io . File Ċ import Ġjava . io . IOException Ċ import Ġjava . security . KeyStore Ċ import Ġjava . util . concurrent . ExecutionException Ċ Ċ /** Ċ Ġ* ĠA ĠGradle ĠTask Ġto Ġcheck Ġthat Ġthe Ġkeystore Ġfile Ġis Ġpresent Ġfor Ġthis Ġvariant 's Ġsigning Ġconfig . Ċ Ġ* Ċ Ġ* ĠIf Ġthe Ġkeystore Ġis Ġthe Ġdefault Ġdebug Ġkeystore , Ġit Ġwill Ġbe Ġcreated Ġif Ġit Ġis Ġmissing . Ċ Ġ* Ċ Ġ* ĠThis Ġtask Ġhas Ġno Ġexplicit Ġinputs , Ġbut Ġis Ġforced Ġto Ġrun Ġif Ġthe Ġsigning Ġconfig Ġkeystore Ġfile Ġis Ċ Ġ* Ġnot Ġpresent . Ċ Ġ*/ Ċ @ Cache able Task Ċ abstract Ġclass ĠValidate Signing Task Ġ: ĠNon Incremental Task () Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠOutput Ġdirectory Ġto Ġallow Ġthis Ġtask Ġto Ġbe Ġup - to - date , Ġdespite Ġthe Ġthe Ġsigning Ġconfig Ġfile ĊĠĠĠĠ Ġ* Ġnot Ġbeing Ġmodel led Ġdirectly Ġas Ġan Ġinput Ġor Ġan Ġoutput . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ get : Output Directory ĊĠĠĠ Ġabstract Ġval Ġdummy Output Directory : ĠDirectory Property ĊĊĠĠĠ Ġ@ get : Internal Ġinternal Ġlateinit Ġvar Ġsigning Config : ĠSign ing Config ĊĠĠĠ Ġ@ get : Internal Ġinternal Ġlateinit Ġvar Ġdefault Debug Ke yst ore Location : ĠFile ĊĊĠĠĠ Ġoverride Ġfun Ġdo Task Action () Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġsigning Config . store File Ġ== Ġnull Ġ-> Ġthrow ĠInvalid UserData Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" Ke yst ore Ġfile Ġnot Ġset Ġfor Ġsigning Ġconfig Ġ${ signing Config . name } """) ĊĠĠĠĠĠĠĠ Ġis Signing Config Using The Default Debug Ke yst ore () Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĠCheck Ġif Ġthe Ġdebug Ġkeystore Ġis Ġbeing Ġused Ġrather Ġthan Ġdirectly Ġchecking Ġif Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalready Ġexists . ĠA Ġ" fast Ġpath " Ġof Ġreturning Ġtrue Ġif Ġthe Ġstore Ġfile Ġis Ġpresent Ġwould ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġallow Ġone Ġtask Ġto Ġreturn Ġwhile Ġanother Ġvalidate Ġtask Ġhas Ġonly Ġpartially Ġwritten Ġthe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Ġdebug Ġkeystore Ġfile , Ġwhich Ġcould Ġlead Ġto Ġconfusing Ġtransient Ġbuild Ġerrors . Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Default Debug Ke yst ore IfNeeded () ĊĠĠĠĠĠĠĠ Ġsigning Config . store File ?. isFile Ġ== Ġtrue Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĠKe yst ore Ġfile Ġis Ġpresent , Ġallow Ġthe Ġbuild Ġto Ġcontinue . Ġ*/ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠInvalid UserData Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" Ke yst ore Ġfile Ġ'${ signing Config . store File ?. absolute Path }' Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ""" not Ġfound Ġfor Ġsigning Ġconfig Ġ'${ signing Config . name }'. """) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( ExecutionException :: class , ĠIOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġcreate Default Debug Ke yst ore IfNeeded () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġcheck State ( signing Config . is Signing Ready , Ġ" Debug Ġsigning Ġconfig Ġnot Ġready .") ĊĠĠĠĠĠĠĠ Ġif Ġ(! default Debug Ke yst ore Location . parent File . can Write ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIOException (""" Unable Ġto Ġcreate Ġdebug Ġkeystore Ġin Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ""" ${ default Debug Ke yst ore Location . parent File . absolute Path } Ġbecause Ġit Ġis Ġnot Ġwritable . """) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/* ĠSynchron ized Ġfile Ġwith Ġmulti Ġprocess Ġlocking Ġrequires Ġthat Ġthe Ġparent Ġdirectory Ġof Ġthe ĊĠĠĠĠĠĠĠĠĠĠ Ġdefault Ġdebug Ġkeystore Ġis Ġpresent . ĊĠĠĠĠĠĠĠĠĠĠ ĠIt Ġis Ġcreated Ġas Ġpart Ġof ĠKe yst ore Helper . default Debug Ke yst ore Location () Ġ*/ ĊĠĠĠĠĠĠĠ Ġcheck State ( FileUtils . parent Dir Exists ( default Debug Ke yst ore Location ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Parent Ġdirectory Ġof Ġthe Ġdefault Ġdebug Ġkeystore Ġ'% s ' Ġdoes Ġnot Ġexist ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Debug Ke yst ore Location ) ĊĠĠĠĠĠĠĠ Ġ/* ĠCreating Ġthe Ġdebug Ġkeystore Ġis Ġdone Ġwith Ġthe Ġmulti Ġprocess Ġfile Ġlocking , ĊĠĠĠĠĠĠĠĠĠĠ Ġto Ġavoid Ġone Ġvalidate Ġsigning Ġtask Ġfrom Ġexiting Ġearly Ġwhile Ġthe Ġkeystore Ġis Ġin Ġthe ĊĠĠĠĠĠĠĠĠĠĠ Ġprocess Ġof Ġbeing Ġwritten . ĊĠĠĠĠĠĠĠĠĠĠ ĠThe Ġkeystore Ġis Ġnot Ġlocked Ġin Ġthe Ġtask Ġinput Ġpresence Ġcheck Ġor Ġwhere Ġit Ġis Ġused Ġat ĊĠĠĠĠĠĠĠĠĠĠ Ġapplication Ġpackaging . ĊĊĠĠĠĠĠĠĠĠĠĠ ĠThis Ġis Ġgenerally Ġsafe Ġas Ġthe Ġkeystore Ġis Ġonly Ġautomatically Ġcreated , ĊĠĠĠĠĠĠĠĠĠĠ Ġnever Ġautomatically Ġdeleted . Ġ Ġ*/ ĊĠĠĠĠĠĠĠ ĠSynchron ized File ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. getInstance With Multi Process Lock ing ( default Debug Ke yst ore Location ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. create If Absent Ġ{ Ġcreate Default Debug Store ( it , Ġthis . logger ) Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġis Signing Config Using The Default Debug Ke yst ore (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsigning Config . name Ġ== ĠBuilder Constants . DEBUG Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsigning Config . key Alias Ġ== ĠDefault Signing Config . DEFAULT _ ALIAS Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsigning Config . key Password Ġ== ĠDefault Signing Config . DEFAULT _ PASSWORD Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsigning Config . store Password Ġ== ĠDefault Signing Config . DEFAULT _ PASSWORD Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsigning Config . store Type Ġ== ĠKey Store . getDefault Type () Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsigning Config . store File . is Same File ( default Debug Ke yst ore Location ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠFile ?. is Same File ( other : ĠFile ?) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis Ġ!= Ġnull Ġ&& Ġother Ġ!= Ġnull Ġ&& ĠFileUtils . is Same File ( this , Ġother ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAlways Ġre - run Ġif Ġthe Ġstore Ġfile Ġis Ġnot Ġpresent Ġto Ġprevent Ġthe Ġtask Ġbeing ĠUP - TO - DATE ĊĠĠĠĠ Ġ* Ġif Ġthe Ġkeystore Ġis Ġdeleted Ġafter Ġthe Ġfirst Ġrun . Ġ( See Ġ[ Creation Action . execute ]) ĊĠĠĠĠ Ġ* ĠOther Ġchanges , Ġsuch Ġas Ġthe Ġfirst Ġtime Ġit Ġis Ġrun , Ġor Ġif Ġthe Ġproject Ġis Ġcleaned , Ġor Ġif ĊĠĠĠĠ Ġ* Ġthe Ġplugin Ġclasspath Ġis Ġchanged Ġwill Ġalso Ġcause Ġthis Ġtask Ġto Ġbe Ġre - run . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠ Ġfun Ġforce R er un () Ġ= Ġsigning Config . store File ?. isFile Ġ!= Ġtrue ĊĊĠĠĠ Ġclass ĠCreation Action ( ĊĠĠĠĠĠĠĠ Ġvariant Scope : ĠVariant Scope , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdefault Debug Ke yst ore Location : ĠFile ĊĠĠĠ Ġ) Ġ: ĊĠĠĠĠĠĠĠ ĠVariant Task Creation Action < Validate Signing Task >( variant Scope ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġname : ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġvariant Scope . get Task Name (" validate Signing ") ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġtype : ĠClass < Validate Signing Task > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= ĠValidate Signing Task :: class . java ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhandle Provider ( task Provider : ĠTask Provider < out ĠValidate Signing Task >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . handle Provider ( task Provider ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvariant Scope . artifacts . pro duces Dir ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInternal Artifact Type . VALIDATE _ SIGN ING _ CONFIG , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBuild Artifacts Holder . Operation Type . INITIAL , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask Provider , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠValidate Signing Task :: dummy Output Directory ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġconfigure ( task : ĠValidate Signing Task ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . configure ( task ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtask . signing Config Ġ= Ġvariant Scope . variant Configuration . signing Config Ġ?: Ġthrow ĠIllegalStateException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" No Ġsigning Ġconfig Ġconfigured Ġfor Ġvariant Ġ" Ġ+ Ġvariant Scope . full Variant Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtask . default Debug Ke yst ore Location Ġ= Ġdefault Debug Ke yst ore Location ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtask . outputs . up ToDate When Ġ{ Ġ! task . force R er un () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ