/* Ċ Ġ* Ġ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 . Ċ Ġ*/ Ċ package Ġcom . android . tools . idea . navigator . nodes . nd k Ċ Ċ import Ġcom . android . tools . idea . gradle . model . nd k . v 1 . Ide Native Artifact Ċ import Ġcom . android . tools . idea . flags . Studio Flags Ċ import Ġcom . android . tools . idea . gradle . project . facet . nd k . N dk Facet Ċ import Ġcom . android . tools . idea . gradle . project . model . N dk Module Model Ċ import Ġcom . android . tools . idea . gradle . project . model . V 1 N dk Model Ċ import Ġcom . android . tools . idea . gradle . util . Gradle Util . getModule Icon Ċ import Ġcom . android . tools . idea . navigator . Android Project View Pane Ċ import Ġcom . android . tools . idea . navigator . nodes . Android View Module Node Ċ import Ġcom . android . tools . idea . navigator . nodes . nd k . includes . utils . Lex ical Include Paths Ċ import Ġcom . android . tools . idea . navigator . nodes . nd k . includes . view . Native Includes Ċ import Ġcom . android . tools . idea . nd k . Module Variant Ab i Ċ import Ġcom . android . tools . idea . nd k . Native Workspace Service Ċ import Ġcom . android . tools . idea . nd k . Native Workspace Service . Companion . getInstance Ċ import Ġcom . android . tools . idea . util . to Io File Ċ import Ġcom . google . common . collect . Hash Multimap Ċ import Ġcom . intellij . ide . project View . Presentation Data Ċ import Ġcom . intellij . ide . project View . View Settings Ċ import Ġcom . intellij . ide . util . tree View . Abstract TreeNode Ċ import Ġcom . intellij . openapi . module . Module Ċ import Ġcom . intellij . openapi . module . Module Manager Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . openapi . ui . Queryable Ċ import Ġcom . intellij . openapi . util . text . StringUtil . trim End Ċ import Ġcom . intellij . openapi . util . text . StringUtil . trim Start Ċ import Ġcom . intellij . openapi . vfs . V fs Util Ċ import Ġcom . intellij . openapi . vfs . Virtual File Ċ import Ġjava . util . ArrayList Ċ Ċ class ĠN dk Module Node ( ĊĠ Ġproject : ĠProject , ĊĠ Ġvalue : ĠModule , ĊĠ Ġproject View Pane : ĠAndroid Project View Pane , ĊĠ Ġsettings : ĠView Settings ) Ġ: ĠAndroid View Module Node ( project , Ġvalue , Ġproject View Pane , Ġsettings ) Ġ{ ĊĊĠ Ġoverride Ġfun Ġget Module Children (): ĠCollection < Abstract TreeNode <* >> Ġ{ ĊĠĠĠ Ġval Ġmodule Ġ= Ġvalue Ġ?: Ġreturn Ġempty List () ĊĊĠĠĠ Ġval Ġfacet Ġ= ĠN dk Facet . getInstance ( module ) ĊĠĠĠ Ġif Ġ( facet ?. nd k Module Model Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġreturn Ġempty List () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġassert ( my Project Ġ!= Ġnull ) ĊĠĠĠ Ġreturn Ġget Native Source Nodes ( my Project , Ġfacet . nd k Module Model !! , Ġsettings ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġget Sort Key (): ĠComparable < *> ? Ġ{ ĊĠĠĠ Ġval Ġmodule Ġ= Ġvalue Ġ?: Ġreturn Ġnull ĊĠĠĠ Ġreturn Ġmodule . name ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠgetType Sort Key (): ĠComparable < *> ? Ġ{ ĊĠĠĠ Ġreturn Ġsort Key ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġto Test String ( print Info : ĠQuery able . Print Info ?): ĠString ? Ġ{ ĊĠĠĠ Ġreturn ĠString . format ("% 1 \$ s Ġ( Native - Android - Gradle )", Ġsuper . to Test String ( print Info )) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġupdate ( presentation : ĠPresentation Data ) Ġ{ ĊĠĠĠ Ġsuper . update ( presentation ) ĊĠĠĠ Ġval Ġmodule Ġ= Ġvalue ĊĠĠĠ Ġif Ġ( module Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġpresentation . setIcon ( getModule Icon ( module )) ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ Ċ fun Ġget Native Source Nodes ( project : ĠProject , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġn dk Module Model : ĠN dk Module Model , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsettings : ĠView Settings ): ĠCollection < Abstract TreeNode <* >> Ġ{ ĊĠ Ġval Ġmodule Ġ= ĠModule Manager . getInstance ( project ). find Module ByName ( nd k Module Model . moduleName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġempty List () Ġ// Ġthe Ġmodule Ġcould Ġbe Ġmissing Ġin Ġcase Ġuser Ġchanges Ġproject Ġstructure Ġand Ġsync ĊĠ Ġval Ġn dk Model Ġ= Ġn dk Module Model . nd k Model ĊĠ Ġif Ġ(! Studio Flags . USE _ CONTENT _ ROOT S _ FOR _ NATIVE _ PROJECT _ VIEW . get () Ġ&& Ġn dk Model Ġis ĠV 1 N dk Model ) Ġ{ ĊĠĠĠ Ġval Ġn dk Facet Ġ= ĠN dk Facet . getInstance ( module ) Ġ?: Ġreturn Ġempty List () ĊĠĠĠ Ġreturn Ġget Library Based Native Nodes ( nd k Facet , Ġn dk Model , Ġproject , Ġsettings , Ġmodule ) ĊĠ Ġ} ĊĠ Ġelse Ġ{ ĊĠĠĠ Ġreturn ĠgetContent Root Based Native Nodes ( module , Ġsettings ) ĊĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠGets Ġnodes Ġfor Ġproject Ġview Ġand ĠAndroid Ġview Ġpopulated Ġby Ġnative Ġtargets Ġ( aka , Ġnative Ġlibraries , Ġfor Ġexample , Ġdeclared Ġby Ġadd _ library Ġin Ċ Ġ* ĠCMake Lists . txt ). Ċ Ġ*/ Ċ private Ġfun Ġget Library Based Native Nodes ( nd k Facet : ĠN dk Facet , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv 1 N dk Model : ĠV 1 N dk Model , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject : ĠProject , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsettings : ĠView Settings , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodule : ĠModule ): ĠCollection < Abstract TreeNode <* >> Ġ{ ĊĊĠ Ġval Ġvariant Ġ= Ġv 1 N dk Model . getN dk Variant ( nd k Facet . selected Variant Ab i ) Ġ?: Ġreturn Ġempty List () ĊĠ Ġval Ġnative Libraries Ġ= ĠHash Multimap . create < Native Library Key , ĠIde Native Artifact >() ĊĠ Ġfor Ġ( artifact Ġin Ġvariant . artifacts ) Ġ{ ĊĠĠĠ Ġval Ġfile Ġ= Ġartifact . outputFile ĊĠĠĠ Ġvar Ġnative Library Name : ĠString ĊĠĠĠ Ġval Ġnative Library Type : ĠNative Library Type ĊĠĠĠ Ġif Ġ( file Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġnative Library Name Ġ= Ġartifact . target Name ĊĠĠĠĠĠ Ġnative Library Type Ġ= ĠNative Library Type . OBJECT _ LIBRARY ĊĠĠĠ Ġ} ĊĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠ Ġval Ġname Ġ= Ġfile . name ĊĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġname . endsWith (". so ") Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġnative Library Name Ġ= Ġtrim End ( name , Ġ". so ") ĊĠĠĠĠĠĠĠĠĠ Ġnative Library Type Ġ= ĠNative Library Type . SHARED _ LIBRARY ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġname . endsWith (". a ") Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġnative Library Name Ġ= Ġtrim End ( name , Ġ". a ") ĊĠĠĠĠĠĠĠĠĠ Ġnative Library Type Ġ= ĠNative Library Type . STATIC _ LIBRARY ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġnative Library Name Ġ= Ġname ĊĠĠĠĠĠĠĠĠĠ Ġnative Library Type Ġ= ĠNative Library Type . OTHER ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġnative Library Name Ġ= Ġtrim Start ( native Library Name , Ġ" lib ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġnative Libraries . put ( Native Library Key ( native Library Name , Ġnative Library Type ), Ġartifact ) ĊĠ Ġ} ĊĠ Ġval Ġchildren Ġ= ĠArrayList < Abstract TreeNode <* >>() ĊĠ Ġval Ġnative Workspace Service Ġ= ĠNative Workspace Service . getInstance ( module . project ) ĊĠ Ġfor Ġ( key Ġin Ġnative Libraries . keySet ()) Ġ{ ĊĠĠĠ Ġval Ġnative Library Type Ġ= Ġkey . type . display Text ĊĠĠĠ Ġval Ġnative Library Name Ġ= Ġkey . name ĊĠĠĠ Ġval Ġnode Ġ= ĠN dk Library Enhanced Headers Node ( ĊĠĠĠĠĠ Ġproject , ĊĠĠĠĠĠ Ġnative Library Name , ĊĠĠĠĠĠ Ġnative Library Type , ĊĠĠĠĠĠ Ġnative Libraries . get ( key ), ĊĠĠĠĠĠ ĠNative Includes ({ Ġv 1 N dk Model . find Settings ( it ) Ġ}, Ġnative Libraries . get ( key )), ĊĠĠĠĠĠ Ġsettings ĊĠĠĠ Ġ) Ġ{ Ġitem Ġ-> ĊĠĠĠĠĠ Ġnative Workspace Service . should Show In Project View ( module , Ġitem . virtual File . to Io File ()) ĊĠĠĠ Ġ} ĊĠĠĠ Ġchildren . add ( node ) ĊĠ Ġ} ĊĠ Ġreturn Ġif Ġ( children . size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠ Ġchildren [ 0 ]. children ĊĠ Ġ} ĊĠ Ġelse Ġchildren Ċ } Ċ Ċ fun Ġcontained By Native Nodes ( project : ĠProject , Ġn dk Module Model : ĠN dk Module Model , Ġfile : ĠVirtual File ): ĠBoolean Ġ{ ĊĠ Ġ// ĠCheck Ġif Ġthe Ġfile Ġis Ġan Ġadditional Ġnative Ġfiles Ġthat Ġis Ġmanually Ġadded . ĊĠ Ġval Ġmodule Ġ= ĠModule Manager . getInstance ( project ). find Module ByName ( nd k Module Model . moduleName ) Ġ?: Ġreturn Ġfalse ĊĠ Ġif Ġ( getInstance ( project ). getAdditional Native Files ( module ). contains ( file )) Ġ{ ĊĠĠĠ Ġreturn Ġtrue ĊĠ Ġ} ĊĊĠ Ġ// ĠCheck Ġif Ġthe Ġfile Ġis Ġa Ġheader Ġfile Ġthat 's Ġunder Ġthe Ġsynt hesized Ġ" Includes " Ġnode . ĊĠ Ġif Ġ(! Lex ical Include Paths . has Header Extension ( file . name )) Ġ{ ĊĠĠĠ Ġ// ĠSkip Ġdirectly Ġif Ġthe Ġfile Ġdoes Ġnot Ġlook Ġlike Ġa Ġheader . ĊĠĠĠ Ġreturn Ġfalse ĊĠ Ġ} ĊĠ Ġval Ġn dk Facet Ġ= ĠN dk Facet . getInstance ( module ) !! ĊĠ Ġval Ġselected Variant Ab i Ġ= Ġn dk Facet . selected Variant Ab i Ġ?: Ġreturn Ġfalse ĊĠ Ġval Ġvariant Ġ= Ġselected Variant Ab i . variant ĊĠ Ġval Ġabi Ġ= Ġselected Variant Ab i . abi ĊĠ Ġval Ġnative Workspace Service Ġ= ĠNative Workspace Service . getInstance ( project ) ĊĠ Ġval Ġnative Header Dirs Ġ= Ġnative Workspace Service . get Native Header Dirs ( Module Variant Ab i ( nd k Module Model . moduleName , Ġvariant , Ġabi )) ĊĠ Ġreturn Ġnative Header Dirs . any Ġ{ ĠV fs Util . is Ancestor ( it . dir , Ġfile . to Io File (), Ġfalse ) Ġ} Ċ } Ċ