package Ġcom . occ . or ca Ċ Ċ import Ġcom . android . build . gradle . App Extension Ċ import Ġcom . android . build . gradle . Library Extension Ċ import Ġcom . android . build . gradle . Tested Extension Ċ import Ġcom . android . build . gradle . api . Base Variant Ċ import Ġcom . occ . or ca . task . Generate CMake Lists Ċ import Ġcom . occ . or ca . task . Generate Java Client File Task Ċ import Ġcom . occ . or ca . task . Generate Occ So Header Task Ċ import Ġorg . gradle . api . Plugin Ċ import Ġorg . gradle . api . Project Ċ import Ġorg . gradle . api . tasks . Copy Ċ import Ġjava . io . File Ċ import Ġjava . util .* Ċ Ċ class ĠO rc a Plugin Ġ: ĠPlugin < Project > Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġapply ( project : ĠProject ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġproject . extensions . add (" O rc a ", ĠO rc a ( project )) ĊĊĠĠĠĠĠĠĠ Ġget Plugin Attach Project ( project ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġlocal Signature Ġ= Ġ"" ĊĊĠĠĠ Ġprivate Ġfun Ġget Plugin Attach Project ( project : ĠProject ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" get Plugin Attach Project Ġ${ project . name }") ĊĠĠĠĠĠĠĠ Ġproject . plugins . with Id (" com . android . application "){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtested Extension Ġ= Ġproject . extensions . getBy Type ( Tested Extension :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tested Extension Ġis ĠApp Extension ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" App Extension ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattach 2 App ( tested Extension , Ġproject ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġproject . plugins . with Id (" com . android . library "){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtested Extension Ġ= Ġproject . extensions . getBy Type ( Tested Extension :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tested Extension Ġis ĠLibrary Extension ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Library Extension ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattach 2 Lib ( tested Extension , Ġproject ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġattach 2 Lib ( android : ĠLibrary Extension , Ġtarget : ĠProject ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnative Origin Path Ġ= Ġget Native File ( target ) ĊĠĠĠĠĠĠĠ Ġcopy Native Code ( native Origin Path , Ġandroid , Ġtarget ) ĊĠĠĠĠĠĠĠ Ġtarget . after Evaluate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġandroid . library Variants . all Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Task ( native Origin Path , this , Ġtarget ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġattach 2 App ( android : ĠApp Extension , Ġtarget : ĠProject ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnative Origin Path Ġ= Ġget Native File ( target ) ĊĠĠĠĠĠĠĠ Ġcopy Native Code ( native Origin Path , Ġandroid , Ġtarget ) ĊĠĠĠĠĠĠĠ Ġtarget . after Evaluate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġandroid . application Variants . all Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Task ( native Origin Path , this , Ġtarget ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġcopy ĠNative Ġcode ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcopy Native Code ( ĊĠĠĠĠĠĠĠ Ġnative Origin Path : ĠAny ?, ĊĠĠĠĠĠĠĠ Ġandroid : ĠTested Extension , ĊĠĠĠĠĠĠĠ Ġproject : ĠProject ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" copy Native Code Ġ Ġ$ native Origin Path ") ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( project . build Dir , Ġ" or ca . so ") ĊĠĠĠĠĠĠĠ Ġif Ġ(! file . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . mkdir s () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject . copy Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom ( native Origin Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinclude (" src / main / cpp /** ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinto ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠGenerate CMake Lists ( project ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlib Name Ġ= Ġproject . name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcmake Lists Dir Ġ= Ġproject . build Dir . canonical Path Ġ+ ĠFile . separator Ġ+ Ġ" or ca . so " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcmake Lists Path Ġ= Ġcmake Lists Dir Ġ+ ĠFile . separator Ġ+ Ġ" CMake Lists . txt " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif (! File ( cmake Lists Path ). exists ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetUp C make ( cmake Lists Path , Ġandroid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetUp C make ( cmake Lists Path , Ġandroid ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠsetUp Ġcmake ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠsetUp C make ( cmake Lists Path : String , android : ĠTested Extension ){ ĊĠĠĠĠĠĠĠ Ġandroid . default Config Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexternal Native Build Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcmake Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcpp Flags ("") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġandroid . external Native Build Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcmake Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath Ġ= ĠFile ( cmake Lists Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġbuild Ġtask ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġbuild Task ( native Origin Path : Any ?, variant : ĠBase Variant , Ġproject : ĠProject ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcmake Lists Dir Ġ= Ġproject . build Dir . canonical Path Ġ+ ĠFile . separator Ġ+ Ġ" or ca . so " ĊĠĠĠĠĠĠĠ Ġval Ġgo Ġ= Ġ( project . extensions . find ByName (" O rc a ") Ġas ĠO rc a ). go ĊĠĠĠĠĠĠĠ Ġif Ġ( local Signature . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Signature Ġ= Ġgo . signature ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtask Ġ= Ġproject . tasks . create ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" generate ${ StringUtils . substring ( variant . name )} So Header ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGenerate Occ So Header Task :: class . java ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġif Ġ( go . secret Key . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtask . secret Key Ġ= Ġgo . secret Key ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtask . keys Ġ= Ġgo . keys ĊĠĠĠĠĠĠĠ Ġtask . isDebug Ġ= Ġgo . isDebug ĊĠĠĠĠĠĠĠ Ġtask . header Ġ= Ġproject . name ĊĠĠĠĠĠĠĠ Ġtask . signature Ġ= Ġlocal Signature ĊĠĠĠĠĠĠĠ Ġtask . encrypt Mode Ġ= Ġgo . encrypt Mode . toUpperCase ( Locale . EN GL ISH ) ĊĠĠĠĠĠĠĠ Ġtask . inputFile Dir Ġ= ĠFile ("$ cmake Lists Dir / src / main / cpp / include ") ĊĊĠĠĠĠĠĠĠ Ġproject . get Tasks ByName ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" generate Json Model ${ StringUtils . substring ( variant . name )} ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . depends On ( task ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġoutput Dir Ġ= ĠFile ( project . build Dir , Ġ"/ generated / source / or ca /${ variant . name }") ĊĠĠĠĠĠĠĠ Ġval Ġgenerate Java Client Task Ġ= Ġproject . tasks . create ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" generate ${ StringUtils . substring ( variant . name )} Java Client ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGenerate Java Client File Task :: class . java ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġgenerate Java Client Task . keys Ġ= Ġgo . keys ĊĠĠĠĠĠĠĠ Ġgenerate Java Client Task . so Head Name Ġ= Ġproject . name ĊĠĠĠĠĠĠĠ Ġgenerate Java Client Task . output Dir Ġ= Ġoutput Dir ĊĠĠĠĠĠĠĠ Ġgenerate Java Client Task . go Ġ= Ġgo ĊĠĠĠĠĠĠĠ Ġvariant . register Java Generating Task ( generate Java Client Task , Ġoutput Dir ) ĊĊĊĠĠĠĠĠĠĠ Ġval Ġmode Ġ= Ġgo . encrypt Mode . toUpperCase ( Locale . EN GL ISH ) ĊĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġwhen Ġ( mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" AES " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" aes " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" DES " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" des " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" aes " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcopy AES Encryption Task Ġ= Ġproject . tasks . create (" copy Java Code ${ StringUtils . substring ( variant . name )} ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCopy :: class . java ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfrom ( native Origin Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinclude (" src / main / java / com / occ / encrypt /${ path } /** ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinto ( output Dir ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġgenerate Java Client Task . depends On ( copy AES Encryption Task ) ĊĊĊĠĠĠ Ġ} ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġfind ĠC ++ Ġroot ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Native File ( project : ĠProject ): ĠAny ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( project . root Project . sub projects . find Ġ{ Ġit . name Ġ== Ġ" or ca - core " Ġ} Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject . root Project . file (" or ca - core "). canonical Path ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġfile Project Ġ= Ġfind Native From Build Script ( project ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file Project Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Project Ġ= Ġfind Native From Build Script ( project . root Project ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile Project ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind Native From Build Script ( project : ĠProject ): ĠAny ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresult : ĠAny ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġproject . build script . configurations . forEach Ġ{ Ġconfig Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġconfig . files . find Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . name . toUpperCase ( Locale . getDefault ()). contains (" OR CA ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġproject . zip Tree ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊ Ċ }