package Ġpm . gn osis . plugin Ċ Ċ import Ġcom . android . build . gradle .* Ċ import Ġcom . android . build . gradle . api . Base Variant Ċ import Ġorg . apache . log 4 j . Logger Ċ import Ġorg . gradle . api . Domain Object Set Ċ import Ġorg . gradle . api . Plugin Ċ import Ġorg . gradle . api . Project Ċ import Ġorg . gradle . api . Task Ċ import Ġorg . gradle . api . plugins . Extension Container Ċ import Ġorg . gradle . api . tasks . Source Set Container Ċ import Ġorg . jetbrains . kotlin . gradle . plugin . Kotlin Plugin Wrapper Ċ import Ġpm . gn osis . Ab i Parser Ċ import Ġjava . io . File Ċ import Ġkotlin . reflect . K Class Ċ Ċ open Ġclass ĠB iv rost Task Extension Ġ{ ĊĠĠĠ Ġvar ĠpackageName : ĠString ? Ġ= Ġnull Ċ } Ċ Ċ class ĠB iv rost Plugin Ġ: ĠPlugin < Project > Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLogger . getLogger ( B iv rost Plugin :: class . java ) ĊĊĠĠĠ Ġoverride Ġfun Ġapply ( project : ĠProject ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . debug (" Plugin ĠProject : Ġ$ project ") ĊĠĠĠĠĠĠĠ Ġproject . plugins . all Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFeature Plugin Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject . extensions [ Feature Extension :: class ]. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfigure Code Generation Android ( project , Ġfeature Variants ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfigure Code Generation Android ( project , Ġlibrary Variants ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠLibrary Plugin Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject . extensions [ Library Extension :: class ]. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfigure Code Generation Android ( project , Ġlibrary Variants ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠApp Plugin Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug (" Found ĠApp Plugin ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject . extensions [ App Extension :: class ]. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfigure Code Generation Android ( project , Ġapplication Variants ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠKotlin Plugin Wrapper Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug (" Found Ġkotlin ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfigure Code Generation Kotlin ( project ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠClass NotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug (" Could Ġnot Ġconfigure Ġcode Ġgeneration ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconfigure Code Generation Kotlin ( project : ĠProject ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġextension Ġ= Ġproject . extensions . create (" b iv rost Task ", ĠB iv rost Task Extension :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġoutput Dir Ġ= Ġproject . build Dir . resolve (" generated / source / abi / main ") ĊĠĠĠĠĠĠĠ Ġproject . extensions [ Source Set Container :: class ]. find ByName (" main ") ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjava . src Dir ( output Dir ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġtask Ġ= Ġcreate CodeGen Task ( project , Ġ" pm . gn osis . generate . generate Main Api Wrapper ", Ġoutput Dir ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġextension . packageName Ġ?: Ġthrow ĠIllegalArgumentException (" Please Ġspecific Ġa Ġpackage Ġname Ġin Ġb iv rost Task ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġproject . tasks . get ByName (" build "). depends On ( task ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconfigure Code Generation Android ( project : ĠProject , Ġvariants : ĠDomain Object Set < out ĠBase Variant >) Ġ{ ĊĠĠĠĠĠĠĠ Ġvariants . all Ġ{ Ġvariant Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Dir Ġ= Ġproject . build Dir . resolve (" generated / source / abi /${ variant . dir Name }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Ġ= Ġcreate CodeGen Task ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" pm . gn osis . generate ${ variant . name . capitalize ()} Ab i Wrapper ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Dir ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġvariant . application Id . remove Suffix ( variant . build Type . application Id Suffix Ġ?: Ġ"") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvariant . register Java Generating Task ( task , Ġoutput Dir ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvariant . outputs . all Ġ{ Ġoutput Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprocess Resources Ġ= Ġoutput . process Resources ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask . depends On ( process Resources ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate CodeGen Task ( project : ĠProject , Ġtask Name : ĠString , Ġoutput Dir : ĠFile , ĠpackageName Fn : Ġ() Ġ-> ĠString ): ĠTask Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtask Ġ= Ġproject . tasks . create ( task Name ) ĊĠĠĠĠĠĠĠ Ġtask . outputs . dir ( output Dir ) ĊĊĠĠĠĠĠĠĠ Ġval Ġabi Folder Ġ= Ġproject . project Dir . resolve (" abi ") ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtask . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinputs . files ( abi Folder . list Files ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Last Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠpackageName Ġ= ĠpackageName Fn () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġcan Ġreuse Ġarrays Ġfor Ġall ĠAB Is ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarrays Map Ġ= ĠAb i Parser . Arrays Map ( packageName ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġabi Folder . list Files ()?. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Generating Ġwrapper Ġfor Ġ<$ it >") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAb i Parser . generate Wrapper ( packageName , Ġit . read Text (), Ġoutput Dir , Ġarrays Map ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarrays Map . generate ( output Dir ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġoperator Ġfun Ġ< T Ġ: ĠAny > ĠExtension Container . get ( type : ĠK Class < T >): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget ByType ( type . java ) ĊĠĠĠ Ġ} Ċ }