/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 7 Ġ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 . Ċ Ġ*/ Ċ @ file : Jvm Name (" Dependency Management Util ") Ċ Ċ package Ġcom . android . tools . idea . util Ċ Ċ import Ġcom . android . Sdk Constants Ċ import Ġcom . google . common . annotations . Visible ForTesting Ċ import Ġcom . android . ide . common . repository . Gradle Coordinate Ċ import Ġcom . android . support . Android x Name Ċ import Ġcom . android . tools . idea . project system .* Ċ import Ġcom . intellij . openapi . application . Application Manager Ċ import Ġcom . intellij . openapi . diagnostic . Logger Ċ import Ġcom . intellij . openapi . module . Module Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . openapi . ui . Messages Ċ import Ġcom . intellij . openapi . util . text . StringUtil Ċ import Ġorg . jetbrains . annotations . Test Only Ċ Ċ @ Test Only Ċ var ĠDE PEND ENCY _ MANAGE MENT _ TEST _ ASSUME _ USER _ W ILL _ ACCEPT _ DEPEND ENCI ES Ġ= Ġtrue Ċ Ċ /** Ċ Ġ* ĠReturns Ġtrue Ġiff Ġthe Ġdependency Ġwith Ġ[ artifactId ] Ġis Ġtransit ively Ġavailable Ġto Ġthis Ġmodule . Ċ Ġ* ĠThis Ġfunction Ġreturns Ġfalse Ġif Ġthe Ġproject 's Ġdependency Ġmodel Ġis Ġunavailable Ġand Ġtherefore Ġdependencies Ċ Ġ* Ġcould Ġnot Ġbe Ġchecked Ġ( e . g . ĠProject Ġis Ġsync ing Ġwith Ġbuild Ġsystem Ġor Ġany Ġdependency Ġmanagement Ġerror Ġoccurs ). Ċ Ġ* ĠTo Ġhandle Ġdependency Ġmanagement Ġerrors , Ġuse Ġmethods Ġdefined Ġin Ġ[ Android Project System ] Ġand Ġcatch Ċ Ġ* Ġ[ Dependency Management Exception ]. Ċ Ġ* Ċ Ġ* Ġ@ param Ġartifact Id Ġthe Ġdependency 's Ġmaven Ġartifact Ġid . Ċ Ġ*/ Ċ fun ĠModule . depends On ( artifactId : ĠGoogle Maven Artifact Id ): ĠBoolean Ġ{ ĊĠ Ġtry Ġ{ ĊĠĠĠ Ġ// ĠTODO Ġthis Ġartifact Ġto Ġcoordinate Ġtranslation Ġis Ġtemporary Ġand Ġwill Ġbe Ġremoved Ġwhen ĠGradle Coordinates Ġare Ġsw apped Ġin Ġfor ĠGoogle Maven Artifact Id . ĊĠĠĠ Ġval Ġcoordinate Ġ= ĠGradle Coordinate ( artifactId . maven GroupId , Ġartifact Id . maven Artifact Id , Ġ"+ ") ĊĠĠĠ Ġreturn Ġget Module System (). get Resolved Dependency ( coordinate ) Ġ!= Ġnull ĊĠ Ġ} ĊĠ Ġcatch Ġ( e : ĠDependency Management Exception ) Ġ{ ĊĠĠĠ ĠLogger . getInstance ( this . java Class . name ). warn ( e . message ) ĊĠ Ġ} ĊĠ Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠ Ġif Ġ(! is Disposed ) Ġ{ ĊĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĠ Ġreturn Ġfalse Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġwhether Ġthis Ġmodule Ġdepends Ġon Ġthe Ġnew Ġsupport Ġlibrary Ġartifacts Ġ( android x ). Ċ Ġ*/ Ċ fun ĠModule . depends On Android x (): ĠBoolean Ġ= ĊĠ ĠGoogle Maven Artifact Id . values () ĊĠĠĠ Ġ. filter Ġ{ Ġit . maven GroupId . startsWith ( Sdk Constants . AND RO IDX _ PKG ) Ġ} ĊĠĠĠ Ġ. any Ġ{ Ġdepends On ( it ) Ġ} Ċ Ċ /** Ċ Ġ* ĠReturns Ġwhether Ġthis Ġmodule Ġdepends Ġon Ġthe Ġold Ġsupport Ġlibrary Ġartifacts Ġ( com . android . support ). Ċ Ġ*/ Ċ fun ĠModule . depends On Old Support Lib (): ĠBoolean Ġ= ĊĠ ĠGoogle Maven Artifact Id . values () ĊĠĠĠ Ġ. filter Ġ{ Ġit . maven GroupId . startsWith ( Sdk Constants . SUPPORT _ LIB _ GROUP _ ID ) Ġ} ĊĠĠĠ Ġ. any Ġ{ Ġdepends On ( it ) Ġ} Ċ Ċ fun ĠModule ?. map Android x Name ( name : ĠAndroid x Name ): ĠString Ġ{ ĊĠ Ġval Ġdepends On Android x Ġ= Ġthis ?. depends On Android x () Ġ?: Ġreturn Ġname . default Name () ĊĠ Ġreturn Ġif Ġ( depends On Android x ) Ġname . new Name () Ġelse Ġname . old Name () Ċ } Ċ Ċ fun ĠModule . depends On AppCompat (): ĠBoolean Ġ= ĊĠ Ġthis . depends On ( Google Maven Artifact Id . APP _ COMPAT _ V 7 ) Ġ|| Ġthis . depends On ( Google Maven Artifact Id . AND RO IDX _ APP _ COMPAT _ V 7 ) Ċ Ċ /** Ċ Ġ* ĠAdd Ġmaven Ġprojects Ġas Ġdependencies Ġfor Ġthis Ġmodule . ĠThe Ġmaven Ġgroup Ġand Ġartifact ĠIDs Ġare Ġtaken Ġfrom Ġgiven Ġ[ Gradle Coordinate ] s Ġand Ġthe Ċ Ġ* Ġcoordinates ' Ġversion Ġinformation Ġare Ġdis reg arded . ĠThis Ġmethod Ġwill Ġshow Ġa Ġdialog Ġpromp ting Ġthe Ġuser Ġfor Ġconfirmation Ġif Ċ Ġ* Ġ[ prompt User Before Adding ] Ġis Ġset Ġto Ġtrue Ġand Ġreturn Ġwith Ġno - op Ġif Ġuser Ġch oo ses Ġto Ġnot Ġadd Ġthe Ġdependencies . ĠIf Ġany Ġof Ġthe Ġdependencies Ċ Ġ* Ġare Ġadded Ġsuccessfully Ġand Ġ[ request Sync ] Ġis Ġset Ġto Ġtrue , Ġthis Ġmethod Ġwill Ġrequest Ġa Ġsync Ġto Ġmake Ġsure Ġthe Ġartifacts Ġare Ġresolved . Ċ Ġ* ĠIn Ġthis Ġcase , Ġthe Ġsync Ġwill Ġhappen Ġasynchronously Ġand Ġthis Ġmethod Ġwill Ġnot Ġwait Ġfor Ġit Ġto Ġfinish Ġbefore Ġreturning . Ċ Ġ* Ċ Ġ* ĠThis Ġmethod Ġshows Ġno Ġconfirmation Ġdialog Ġand Ġperforms Ġa Ġno - op Ġif Ġthe Ġlist Ġof Ġartifacts Ġis Ġthe Ġempty Ġlist . Ċ Ġ* ĠThis Ġmethod Ġdoes Ġnot Ġtrigger Ġa Ġsync Ġif Ġnone Ġof Ġthe Ġartifacts Ġwere Ġadded Ġsuccessfully Ġor Ġif Ġ[ request Sync ] Ġis Ġfalse . Ċ Ġ* Ġ@ return Ġlist Ġof Ġartifacts Ġthat Ġwere Ġnot Ġsuccessfully Ġadded . Ġi . e . ĠIf Ġthe Ġreturned Ġlist Ġis Ġempty , Ġthen Ġall Ġwere Ġadded Ġsuccessfully . Ċ Ġ*/ Ċ @ Jvm Over loads Ċ fun ĠModule . add Dependencies ( coordinates : ĠList < Gradle Coordinate >, Ġprompt User Before Adding : ĠBoolean , Ġrequest Sync : ĠBoolean Ġ= Ġtrue ) ĊĠ Ġ: ĠList < Gradle Coordinate > Ġ{ ĊĊĠ Ġif Ġ( coordinates . isEmpty ()) Ġ{ ĊĠĠĠ Ġreturn ĠlistOf () ĊĠ Ġ} ĊĊĠ Ġval Ġmodule System Ġ= Ġget Module System () ĊĠ Ġval Ġdistinct Coordinates Ġ= Ġcoordinates . distinct By Ġ{ ĠPair ( it . groupId , Ġit . artifactId ) Ġ} ĊĠ Ġval Ġ( versioned Dependencies , Ġunavailable Dependencies , Ġwarning ) Ġ= Ġmodule System . analyze Dependency Compatibility ( distinct Coordinates ) ĊĊĠ Ġif Ġ( versioned Dependencies . isNotEmpty ()) Ġ{ ĊĠĠĠ Ġif Ġ( prompt User Before Adding Ġ&& Ġ! user W ants ToAdd ( project , Ġdistinct Coordinates , Ġwarning )) Ġ{ ĊĠĠĠĠĠ Ġreturn Ġdistinct Coordinates ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġversion ed Dependencies . forEach ( module System :: register Dependency ) ĊĊĠĠĠ Ġif Ġ( request Sync ) Ġ{ ĊĠĠĠĠĠ Ġproject . get Sync Manager (). sync Project ( Project System Sync Manager . Sync Reason . PROJECT _ MODI FIED ) ĊĠĠĠ Ġ} ĊĊĠ Ġ} ĊĠ Ġreturn Ġunavailable Dependencies Ċ } Ċ Ċ fun Ġuser W ants ToAdd ( project : ĠProject , Ġcoordinates : ĠList < Gradle Coordinate >, Ġwarning : ĠString Ġ= Ġ"") : ĠBoolean Ġ{ ĊĠ Ġif Ġ( Application Manager . getApplication (). is UnitTest Mode ) Ġ{ ĊĠĠĠ Ġreturn ĠDE PEND ENCY _ MANAGE MENT _ TEST _ ASSUME _ USER _ W ILL _ ACCEPT _ DEPEND ENCI ES ĊĠ Ġ} ĊĠ Ġreturn ĠMessages . OK Ġ== ĠMessages . show Ok Cancel Dialog ( ĊĠĠĠ Ġproject , Ġcreate Add Dependency Message ( coordinates , Ġwarning ), Ġ" Add ĠProject ĠDependency ", ĠMessages . getError Icon ()) Ċ } Ċ Ċ @ Visible ForTesting Ċ fun Ġcreate Add Dependency Message ( coordinates : ĠList < Gradle Coordinate >, Ġwarning : ĠString Ġ= Ġ"") : ĠString Ġ{ ĊĠ Ġval Ġlibrary Names Ġ= Ġcoordinates . join ToString (", Ġ") Ġ{ Ġit . toString () Ġ} ĊĠ Ġval Ġthese Ġ= ĠString Util . plural ize (" this ", Ġcoordinates . size ) ĊĠ Ġval Ġlibraries Ġ= ĠString Util . plural ize (" library ", Ġcoordinates . size ) ĊĠ Ġval Ġrequires Ġ= Ġ" This Ġoperation Ġrequires Ġthe Ġ$ libraries Ġ$ library Names ." ĊĠ Ġif Ġ( warning . isEmpty ()) Ġ{ ĊĠĠĠ Ġreturn Ġ"$ requires \ n \ n Would Ġyou Ġlike Ġto Ġadd Ġ$ these Ġnow ?" ĊĠ Ġ} ĊĠ Ġval Ġthem Ġ= Ġif Ġ( coordinates . size Ġ> Ġ 1 ) Ġ" them " Ġelse Ġ" it " ĊĠ Ġreturn Ġ""" $ requires Ċ Ċ Problem : Ġ$ warning Ċ Ċ The Ġproject Ġmay Ġnot Ġcompile Ġafter Ġadding Ġ$ these Ġ$ libraries . Ċ Would Ġyou Ġlike Ġto Ġadd Ġ$ them Ġanyway ? """ Ċ } Ċ