1+ // Copyright 2018 Google LLC
2+ //
3+ // Licensed under the Apache License, Version 2.0 (the "License");
4+ // you may not use this file except in compliance with the License.
5+ // You may obtain a copy of the License at
6+ //
7+ // http://www.apache.org/licenses/LICENSE-2.0
8+ //
9+ // Unless required by applicable law or agreed to in writing, software
10+ // distributed under the License is distributed on an "AS IS" BASIS,
11+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+ // See the License for the specific language governing permissions and
13+ // limitations under the License.
14+
15+ // A map of library to the dependencies that need to be added for it.
16+ def firebaseDependenciesMap = [
17+ ' app' : [' com.google.firebase:firebase-core:16.0.7' ],
18+ ' admob' : [' com.google.firebase:firebase-ads:17.1.3' ],
19+ ' analytics' : [' com.google.firebase:firebase-analytics:16.3.0' ],
20+ ' auth' : [' com.google.firebase:firebase-auth:16.2.0' ],
21+ ' database' : [' com.google.firebase:firebase-database:16.1.0' ],
22+ ' dynamic_links' : [' com.google.firebase:firebase-invites:16.1.0' ],
23+ ' functions' : [' com.google.firebase:firebase-functions:16.2.0' ],
24+ ' instance_id' : [' com.google.firebase:firebase-iid:17.1.0' ],
25+ ' invites' : [' com.google.firebase:firebase-invites:16.1.0' ],
26+ // Messaging has an additional local dependency to include.
27+ ' messaging' : [' com.google.firebase:firebase-messaging:17.4.0' ,
28+ ' firebase_cpp_sdk.messaging:messaging_java' ],
29+ ' performance' : [' com.google.firebase:firebase-perf:16.2.4' ],
30+ ' remote_config' : [' com.google.firebase:firebase-config:16.4.0' ],
31+ ' storage' : [' com.google.firebase:firebase-storage:16.1.0' ]
32+ ]
33+
34+ // A map of library to the gradle resources that they depend upon.
35+ def firebaseResourceDependenciesMap = [
36+ ' app' : [' :app:app_resources' ,
37+ ' :app:google_api_resources' ,
38+ ' :app:invites_resources' ],
39+ ' admob' : [' :admob:admob_resources' ],
40+ ' auth' : [' :auth:auth_resources' ],
41+ ' database' : [' :database:database_resources' ],
42+ ' storage' : [' :storage:storage_resources' ]
43+ ]
44+
45+ def setResourceDependencies (String subproject ) {
46+ preDebugBuild. dependsOn gradle. includedBuild(' firebase_cpp_sdk' ). task(
47+ " $subproject :generateDexJarDebug" )
48+ preDebugBuild. dependsOn gradle. includedBuild(' firebase_cpp_sdk' ). task(
49+ " $subproject :generateDexJarRelease" )
50+ }
51+
52+ // Handles adding the Firebase C++ dependencies as properties.
53+ class Dependencies {
54+ HashSet<String > libSet = new HashSet<String > ()
55+
56+ def getApp () {
57+ libSet. add(' app' )
58+ }
59+ def getAdmob () {
60+ libSet. add(' admob' )
61+ }
62+ def getAnalytics () {
63+ libSet. add(' analytics' )
64+ }
65+ def getAuth () {
66+ libSet. add(' auth' )
67+ }
68+ def getDatabase () {
69+ libSet. add(' database' )
70+ }
71+ def getDynamicLinks () {
72+ libSet. add(' dynamic_links' )
73+ }
74+ def getFunctions () {
75+ libSet. add(' functions' )
76+ }
77+ def getInstanceId () {
78+ libSet. add(' instance_id' )
79+ }
80+ def getInvites () {
81+ libSet. add(' invites' )
82+ }
83+ def getMessaging () {
84+ libSet. add(' messaging' )
85+ }
86+ def getPerformance () {
87+ libSet. add(' performance' )
88+ }
89+ def getRemoteConfig () {
90+ libSet. add(' remote_config' )
91+ }
92+ def getStorage () {
93+ libSet. add(' storage' )
94+ }
95+ }
96+
97+ // Extension to handle which Firebase C++ dependencies are being added to the
98+ // gradle project.
99+ // They are added via: firebaseCpp.dependencies "admob", "analytics", ...
100+ class FirebaseCppExtension {
101+ Dependencies dependencies = new Dependencies ()
102+
103+ void dependencies (Closure c ) {
104+ ConfigureUtil . configure(c, dependencies)
105+ }
106+ void dependencies (Action<? super Dependencies > action ) {
107+ action. execute(dependencies)
108+ }
109+ }
110+
111+ project. extensions. create(' firebaseCpp' , FirebaseCppExtension )
112+
113+ apply from : " ${ gradle.firebase_cpp_sdk_dir} /android_build_files/generate_proguard.gradle"
114+
115+ def generateAndAddProguard (String lib ) {
116+ // Set the property on the project, so it is easier to use
117+ project. ext. firebase_cpp_sdk_dir = " ${ gradle.firebase_cpp_sdk_dir} "
118+
119+ // Generate the proguard file for the library, and add it to the project
120+ generateProguardFileWithCallback(lib, new Action<File > () {
121+ public void execute (File proguardFile ) {
122+ project. android. buildTypes. debug. proguardFile proguardFile
123+ project. android. buildTypes. release. proguardFile proguardFile
124+ }
125+ })
126+ }
127+
128+ project. afterEvaluate {
129+ if (! firebaseCpp. dependencies. libSet. isEmpty()) {
130+ // App is required, so add it if it wasn't included.
131+ if (! firebaseCpp. dependencies. libSet. contains(' app' )) {
132+ firebaseCpp. dependencies. libSet. add(' app' )
133+ }
134+
135+ for (String lib : firebaseCpp. dependencies. libSet) {
136+ // Generate and include the proguard file
137+ generateAndAddProguard(lib)
138+
139+ // Add the dependencies for the library
140+ for (String dep : firebaseDependenciesMap. get(lib)) {
141+ project. dependencies {
142+ implementation " $dep "
143+ }
144+ }
145+ if (firebaseResourceDependenciesMap. containsKey(lib)) {
146+ for (String resDep : firebaseResourceDependenciesMap. get(lib)) {
147+ setResourceDependencies(resDep)
148+ }
149+ }
150+ }
151+ }
152+ }
0 commit comments