@ file : Suppress (" DE PREC ATION ") Ġ// ĠUsing Ġdeprecated ĠAPIs Ġto Ġmaintain Ġbackwards Ġcompatibility Ċ Ċ package Ġio . github . sim ons ch iller . pref iller Ċ Ċ import Ġcom . android . build . gradle . Base Extension Ċ import Ġcom . android . build . gradle . api . Android Source Set Ċ import Ġcom . android . build . gradle . api . Base Variant Ċ import Ġcom . android . builder . model . Android Project . FD _ GENERATED Ċ import Ġcom . google . devtools . k sp . gradle . K sp Extension Ċ import Ġio . github . sim ons ch iller . pref iller . internal . util . Version Ċ import Ġorg . gradle . api . Project Ċ import Ġorg . gradle . api . file . Directory Ċ import Ġorg . gradle . api . file . Regular File Property Ċ import Ġorg . gradle . api . model . ObjectFactory Ċ import Ġorg . gradle . api . provider . Property Ċ import Ġorg . gradle . api . provider . Provider Ċ import Ġorg . gradle . kotlin . dsl . property Ċ import Ġorg . jetbrains . kotlin . gradle . plugin . K apt Extension Ċ import Ġjava . util .* Ċ Ċ @ Suppress (" Un stable Api Usage ") Ċ class ĠDatabase Config Ġinternal Ġconstructor ( val Ġname : ĠString , Ġobjects : ĠObject Factory ) Ġ{ ĊĠĠĠ Ġval Ġclassname : ĠProperty < String > Ġ= Ġobjects . property () ĊĠĠĠ Ġval Ġscript : ĠRegular File Property Ġ= Ġobjects . file Property () ĊĊĠĠĠ Ġinternal Ġfun Ġregister Tasks ( project : ĠProject , Ġvariant : ĠBase Variant ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvariant Name Ġ= Ġvariant . name . capitalize ( Locale . ROOT ) ĊĠĠĠĠĠĠĠ Ġval Ġdatabase Name Ġ= Ġname . capitalize ( Locale . ROOT ) ĊĠĠĠĠĠĠĠ Ġval Ġtask Name Ġ= Ġ" pref ill $ database Name ${ variant Name } Database " ĊĊĠĠĠĠĠĠĠ Ġ// ĠValidate Ġconfiguration ĊĠĠĠĠĠĠĠ Ġval Ġclassname Ġ= Ġclassname . or Null Ġ?: Ġerror (" No Ġclassname Ġconfigured Ġfor Ġdatabase Ġ$ name ") ĊĠĠĠĠĠĠĠ Ġval Ġscript Ġ= Ġscript . as File . or Null Ġ?: Ġerror (" No Ġscript Ġconfigured Ġfor Ġdatabase Ġ$ name ") ĊĠĠĠĠĠĠĠ Ġcheck ( script . isFile Ġ&& Ġscript . can Read () Ġ&& Ġscript . extension . equals (" sql ", Ġignore Case Ġ= Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Cannot Ġlocate Ġscript Ġat Ġ$ script , Ġmake Ġsure Ġyou Ġspecify Ġa Ġvalid Ġ. sql Ġfile " ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġdatabase Dir Ġ= Ġproject . layout . build Directory . dir ("$ FD _ GENERATED / pref iller /${ variant . name }") ĊĠĠĠĠĠĠĠ Ġval Ġdatabase File Ġ= Ġdatabase Dir . map Ġ{ Ġdir Ġ-> Ġdir . file ("$ name . db ") Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġschema Location Ġ= Ġget Schema Location ( project , Ġvariant ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠRegister Ġtask Ġfor Ġdatabase ĊĠĠĠĠĠĠĠ Ġval Ġtask Ġ= Ġproject . tasks . register ( task Name , ĠPref iller Task :: class . java ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġ" Gener ates Ġand Ġpre - fill s Ġ${ this @ Database Config . name } Ġdatabase Ġfor Ġvariant Ġ${ variant . name }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscript File . set ( script ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenerated Database File . set ( database File ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOn ĠGradle Ġversions Ġearlier Ġthan Ġ 6 . 3 , Ġwe Ġhave Ġto Ġresolve Ġthe Ġpath Ġmanually Ġdue Ġto Ġa Ġbug ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġschema Dir Ġ= Ġschema Location . map Ġ{ Ġparent Dir Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Version . parse ( project . gradle . gradle Version ) Ġ< ĠVersion . parse (" 6 . 3 ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Provider Ġ= Ġproject . provider Ġ{ Ġparent Dir . as File . resolve ( classname ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject . layout . dir ( file Provider ). get () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent Dir . dir ( classname ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġschema Directory . set ( schema Dir ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRoom Ġschema Ġhas Ġto Ġbe Ġgenerated Ġbefore Ġthe ĠPref iller Ġtask Ġruns ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdepends On ( variant . java Compile Provider ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠRegister Ġthe Ġoutput Ġdirectory Ġas Ġasset Ġdirectory Ġand Ġhook Ġtask Ġinto Ġbuild Ġprocess ĊĠĠĠĠĠĠĠ Ġval Ġsource Sets Ġ= Ġvariant . source Sets . filter Is Instance < Android Source Set >() ĊĠĠĠĠĠĠĠ Ġsource Sets . last (). assets . src Dir ( database Dir ) Ġ// ĠLast Ġsource Ġset Ġis Ġthe Ġmost Ġspecific Ġone ĊĠĠĠĠĠĠĠ Ġproject . tasks . named (" generate ${ variant Name } Assets "). configure Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdepends On ( task ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠRead Ġthe ĠRoom Ġschema Ġlocation Ġfrom Ġthe Ġannotation Ġprocessor Ġoptions ĊĠĠĠ Ġprivate Ġfun Ġget Schema Location ( project : ĠProject , Ġvariant : ĠBase Variant ): ĠProvider < Directory > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Provider Ġ= Ġproject . provider Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġk apt Schema Location Ġ= Ġget K apt Schema Location ( project , Ġvariant ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġk sp Schema Location Ġ= Ġget K sp Schema Location ( project ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjava A pt Schema Location Ġ= Ġget Java A pt Schema Location ( variant ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġschema Location Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġk apt Schema Location Ġ!= Ġnull Ġ-> Ġk apt Schema Location ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġk sp Schema Location Ġ!= Ġnull Ġ-> Ġk sp Schema Location ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjava A pt Schema Location Ġ!= Ġnull Ġ-> Ġjava A pt Schema Location ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror (" Could Ġnot Ġfind Ġschema Ġlocation ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject . file ( schema Location ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġproject . layout . dir ( file Provider ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget K apt Schema Location ( project : ĠProject , Ġvariant : ĠBase Variant ): ĠString ? Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġk apt Extension Ġ= Ġproject . extensions . findBy Type ( K apt Extension :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġandroid Extension Ġ= Ġproject . extensions . findBy Type ( Base Extension :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġarguments Ġ= Ġk apt Extension ?. getAdditional Arguments ( project , Ġvariant , Ġandroid Extension ) ĊĠĠĠĠĠĠĠ Ġarguments ?. get ( SCHEMA _ LOCATION _ KEY ) ĊĠĠĠ Ġ} Ġcatch Ġ( exception : ĠNo Class Def Found Error ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnull Ġ// ĠK AP T Ġplugin Ġnot Ġapplied ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget K sp Schema Location ( project : ĠProject ): ĠString ? Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġk sp Extension Ġ= Ġproject . extensions . findBy Type ( K sp Extension :: class . java ) ĊĠĠĠĠĠĠĠ Ġ// ĠArguments Ġwere Ġonly Ġmade Ġpublic Ġrecently Ġ( https :// github . com / google / k sp / pull / 4 4 5 ), Ġso ĊĠĠĠĠĠĠĠ Ġ// Ġwe 're Ġusing Ġreflection Ġfor Ġnow Ġto Ġstay Ġstay Ġcompatible Ġwith Ġsome Ġolder Ġversions . ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠSwitch Ġto Ġpublic ĠAPI Ġonce Ġit Ġhas Ġbeen Ġreleased Ġfor Ġa Ġwhile ĊĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= Ġk sp Extension ?. java Class ?. getMethod (" get Ap Options \$ gradle _ plugin ") ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġval Ġarguments Ġ= Ġmethod ?. invoke ( k sp Extension ) Ġas ? ĠMap < String , ĠString > ĊĠĠĠĠĠĠĠ Ġarguments ?. get ( SCHEMA _ LOCATION _ KEY ) ĊĠĠĠ Ġ} Ġcatch Ġ( exception : ĠNo Class Def Found Error ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnull Ġ// ĠK SP Ġplugin Ġnot Ġapplied ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Java A pt Schema Location ( variant : ĠBase Variant ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġarguments Ġ= Ġvariant . java Compile Options . annotation Processor Options . arguments ĊĠĠĠĠĠĠĠ Ġreturn Ġarguments [ SCHEMA _ LOCATION _ KEY ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠS CHE MA _ LOCATION _ KEY Ġ= Ġ" room . schema Location " ĊĠĠĠ Ġ} Ċ } Ċ