/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 6 Ġ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 . tools . idea . gradle . structure . configur ables . android . dependencies . project . tree view Ċ Ċ import Ġcom . android . tools . idea . gradle . structure . configur ables . ui . Ps UI Settings Ċ import Ġcom . android . tools . idea . gradle . structure . configur ables . ui . tree view . Abstract Base Tree Structure Ċ import Ġcom . android . tools . idea . gradle . structure . configur ables . ui . tree view . Ps Root Node Ċ import Ġcom . android . tools . idea . gradle . structure . model . Ps Base Dependency Ċ import Ġcom . android . tools . idea . gradle . structure . model . android . Ps Android Artifact Ċ import Ġcom . android . tools . idea . gradle . structure . model . android . Ps Android Module Ċ import Ġcom . android . tools . idea . gradle . structure . model . android . Ps Declared Library Android Dependency Ċ import Ġcom . android . tools . idea . gradle . structure . model . android . Ps Library Android Dependency Ċ import Ġcom . android . tools . idea . gradle . structure . model . android . Ps Module Android Dependency Ċ import Ġcom . android . tools . idea . gradle . structure . model . android . Ps Resolved Library Android Dependency Ċ import Ġcom . android . tools . idea . gradle . structure . model . android . Reverse Dependency Ċ import Ġcom . android . tools . idea . gradle . structure . model . to Library Key Ċ import Ġjava . util . Comparator Ċ import Ġjava . util . function . Function Ċ Ċ class ĠTarget Modules Tree Structure ( var Ġui Settings : ĠP s UI Settings ) Ġ: ĠAbstract Base Tree Structure () Ġ{ ĊĊĠ Ġprivate Ġval Ġroot Node : ĠP s Root Node Ġ= ĠP s Root Node ( ui Settings ) ĊĊĠ Ġoverride Ġfun Ġget Root Element (): ĠAny Ġ= Ġroot Node ĊĊĠ Ġfun Ġdisplay Target Modules ( dependency Nodes : ĠList < List < Ps Base Dependency >>) Ġ{ ĊĠĠĠ Ġ// ĠKey : Ġmodule Ġname , ĠValue : Ġpair Ġof Ġmodule Ġand Ġversion Ġof Ġthe Ġdependency Ġused Ġin Ġthe Ġmodule . ĊĠĠĠ Ġval Ġmodels Ġ= Ġdependency Nodes . flatMap Ġ{ Ġit } ĊĠĠĠ Ġval Ġlibrary Models Ġ= Ġmodels . filter Is Instance < Ps Library Android Dependency >() ĊĠĠĠ Ġval Ġmodule Models Ġ= Ġmodels . filter Is Instance < Ps Module Android Dependency >() ĊĠĠĠ Ġif Ġ( library Models . isNotEmpty () Ġ&& Ġmodule Models . isNotEmpty ()) Ġreturn ĊĊĠĠĠ Ġif Ġ( module Models . isNotEmpty ()) Ġreturn ĊĊĠĠĠ Ġif Ġ( library Models . groupBy Ġ{ Ġit . spec . to Library Key () Ġ}. size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠ Ġroot Node . set Children ( listOf ()) ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġresolved Library Models Ġ= Ġlibrary Models . filter Is Instance < Ps Resolved Library Android Dependency >() ĊĠĠĠĠĠ Ġ. groupBy Ġ{ Ġit . artifact . parent . parent Ġ} ĊĊĠĠĠ Ġval Ġdeclared Library Models Ġ= Ġlibrary Models . filter Is Instance < Ps Declared Library Android Dependency >() ĊĠĠĠĠĠ Ġ. groupBy Ġ{ Ġit . parent Ġ} ĊĊĠĠĠ Ġfun Ġcreate Module Node ( module : ĠP s Android Module ): ĠTarget Android Module Node Ġ{ ĊĠĠĠĠĠ Ġval Ġmodule Resolved Library Models Ġ= Ġresolved Library Models [ module ] ĊĠĠĠĠĠĠĠ Ġ? . groupBy Ġ{ Ġit . artifact Ġ} ĊĠĠĠĠĠĠĠ Ġ. or Empty () ĊĠĠĠĠĠ Ġval Ġmodule Declared Library Configuration Names Ġ= Ġdeclared Library Models [ module ]?. map Ġ{ Ġit . configuration Name Ġ} ?. toSet () Ġ?: Ġempty Set () ĊĊĠĠĠĠĠ Ġval Ġartifacts Ġ= ĊĠĠĠĠĠĠĠ Ġ( module Resolved Library Models . keys Ġ+ ĊĠĠĠĠĠĠĠĠ Ġ( module . resolved Variants . flatMap Ġ{ Ġit . artifacts Ġ}. filter Ġ{ Ġartifact Ġ-> ĊĠĠĠĠĠĠĠĠĠĠ Ġmodule Declared Library Configuration Names . any Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġartifact . contains Configuration Name ( it ) ĊĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ). sorted With ( comparator ) ĊĊĠĠĠĠĠ Ġfun Ġcreate Artifact Node ( artifact : ĠP s Android Artifact ): ĠTarget Android Artifact Node Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdeclared Dependencies Ġ= Ġdeclared Library Models [ artifact . parent . parent ] ĊĠĠĠĠĠĠĠĠĠ Ġ? . filter Ġ{ Ġartifact . contains Configuration Name ( it . configuration Name ) Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ. or Empty () ĊĠĠĠĠĠĠĠ Ġval Ġtrans itive Dependencies Ġ= Ġmodule Resolved Library Models [ artifact ] ĊĠĠĠĠĠĠĠĠĠ Ġ? . flatMap Ġ{ Ġit . get Reverse Dependencies (). filter Is Instance < Reverse Dependency . Trans itive >() Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ. or Empty () ĊĠĠĠĠĠĠĠ Ġreturn ĠTarget Android Artifact Node ( artifact , Ġnull , Ġui Settings ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġset Children ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeclared Dependencies . map Ġ{ ĠTarget Configuration Node ( Configuration ( it . configuration Name , Ġartifact . icon ), Ġui Settings ) Ġ} Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrans itive Dependencies . map Ġ{ ĠTarget Trans itive Dependency Node ( listOf ( it ), Ġit . request ing Resolved Dependency . spec , Ġui Settings ) Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġreturn ĠTarget Android Module Node ( root Node , Ġmodule , Ġnull , Ġartifacts . map Ġ{ Ġartifact Ġ-> Ġcreate Artifact Node ( artifact ) Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġmodules Ġ= Ġmodels . map Ġ{ it . parent }. distinct (). sorted By Ġ{ Ġit . name Ġ} ĊĠĠĠ Ġroot Node . set Children ( modules . map NotNull Ġ{ Ġmodule Ġ-> Ġ( module Ġas ? ĠP s Android Module )?. let Ġ{ Ġcreate Module Node ( it ) Ġ} Ġ}) ĊĠ Ġ} Ċ } Ċ Ċ private Ġval Ġcomparator : ĠComparator < Ps Android Artifact > Ġ= ĊĠ ĠComparator ĊĠĠĠ Ġ. comp aring ( Function < Ps Android Artifact , ĠString > Ġ{ Ġit . name Ġ}) ĊĠĠĠ Ġ. then Comp aring ( Function < Ps Android Artifact , ĠString > Ġ{ Ġit . parent . name Ġ}) Ċ