Skip to content

Commit 5a86518

Browse files
committed
Merge branch 'master' into ImplementDocumentIdAnnotation
2 parents f4512eb + ccdf2da commit 5a86518

File tree

34 files changed

+127
-857
lines changed

34 files changed

+127
-857
lines changed

buildSrc/src/main/groovy/com/google/firebase/gradle/plugins/license/LicenseResolverPlugin.groovy

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
package com.google.firebase.gradle.plugins.license
1616

17+
import com.android.build.gradle.tasks.BundleAar
1718
import com.google.firebase.gradle.plugins.license.RemoteLicenseFetcher.AnotherMITLicenseFetcher
1819
import com.google.firebase.gradle.plugins.license.RemoteLicenseFetcher.AndroidSdkTermsFetcher
1920
import com.google.firebase.gradle.plugins.license.RemoteLicenseFetcher.AnotherApache2LicenseFetcher
@@ -90,7 +91,7 @@ class LicenseResolverPlugin implements Plugin<Project> {
9091
outputDir = licensesDir
9192
}
9293

93-
project.tasks.getByName("bundleReleaseAar") {
94+
project.tasks.withType(BundleAar) {
9495
dependsOn licensesTask
9596
from licensesTask.outputDir
9697
}
@@ -102,4 +103,4 @@ class LicenseResolverPlugin implements Plugin<Project> {
102103
static isAndroidProject(project) {
103104
ANDROID_PLUGINS.find { plugin -> project.plugins.hasPlugin(plugin) }
104105
}
105-
}
106+
}

buildSrc/src/main/groovy/com/google/firebase/gradle/plugins/publish/Publisher.groovy

Lines changed: 55 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ package com.google.firebase.gradle.plugins.publish
1616

1717
import org.gradle.api.GradleException
1818
import org.gradle.api.Project
19+
import org.gradle.api.artifacts.Configuration
20+
import org.gradle.api.artifacts.Dependency
21+
import org.gradle.api.artifacts.ProjectDependency
1922
import org.gradle.api.publish.maven.MavenPublication
2023

2124
/** Handles publication versioning and pom validation upon release. */
@@ -26,7 +29,7 @@ class Publisher {
2629
SNAPSHOT
2730
}
2831
private final Mode mode;
29-
private final Set<Project> projectsToPublish;
32+
private final Set<Project> projectsToPublish
3033

3134
Publisher(Mode mode, Set<Project> projectsToPublish) {
3235
this.mode = mode
@@ -37,6 +40,7 @@ class Publisher {
3740
publication.pom.withXml {
3841
def rootNode = asNode()
3942
validatePomXml(project, rootNode)
43+
processDependencies(project, rootNode)
4044
}
4145
}
4246

@@ -51,7 +55,7 @@ class Publisher {
5155
return UNRELEASED_VERSION
5256
}
5357

54-
private void validatePomXml(Project p, Node pom) {
58+
private static void validatePomXml(Project p, Node pom) {
5559
def unreleased = pom.dependencies.dependency.findAll { it.version.text() == UNRELEASED_VERSION }
5660
.collect { "${it.groupId.text()}:${it.artifactId.text()}"}
5761
if(unreleased) {
@@ -63,4 +67,53 @@ class Publisher {
6367
return "${baseVersion}${mode == Mode.SNAPSHOT ? '-SNAPSHOT' : ''}"
6468
}
6569

70+
private static void processDependencies(Project project, Node pom) {
71+
def deps = getDependencyTypes(project)
72+
73+
pom.dependencies.dependency.each {
74+
// remove multidex as it is supposed to be added by final applications and is needed for
75+
// some libraries only for instrumentation tests to build.
76+
if (it.groupId.text() in ['com.android.support', 'androidx'] && it.artifactId.text() == 'multidex') {
77+
it.parent().remove(it)
78+
}
79+
it.appendNode('type', [:], deps["${it.groupId.text()}:${it.artifactId.text()}"])
80+
81+
// change scope to compile to preserve existing behavior
82+
it.scope.replaceNode {
83+
createNode('scope', 'compile')
84+
}
85+
}
86+
}
87+
88+
private static Map<String, String> getDependencyTypes(Project project) {
89+
def dummyDependencyConfiguration = project.configurations.create('publisherDummyConfig')
90+
def nonProjectDependencies = project.configurations.releaseRuntimeClasspath.allDependencies.findAll {
91+
!(it instanceof ProjectDependency)
92+
}
93+
dummyDependencyConfiguration.dependencies.addAll(nonProjectDependencies)
94+
try {
95+
return project.configurations.releaseRuntimeClasspath.getAllDependencies().collectEntries {
96+
[("$it.group:$it.name" as String): getType(dummyDependencyConfiguration, it)]
97+
}
98+
} finally {
99+
project.configurations.remove(dummyDependencyConfiguration)
100+
}
101+
102+
}
103+
104+
private static String getType(Configuration config, Dependency d) {
105+
if (d instanceof ProjectDependency) {
106+
// we currently only support aar libraries to be produced in this repository
107+
return 'aar'
108+
}
109+
String path = config.find {
110+
it.absolutePath.matches(".*\\Q$d.group/$d.name/$d.version/\\E[a-zA-Z0-9]+/\\Q$d.name-$d.version.\\E[aj]ar")
111+
}?.absolutePath
112+
if (path && path.endsWith (".aar")) {
113+
return "aar"
114+
} else {
115+
return "jar"
116+
}
117+
}
118+
66119
}

buildSrc/src/test/groovy/com/google/firebase/gradle/plugins/publish/PublishingPluginSpec.groovy

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,15 @@ class PublishingPluginSpec extends Specification {
4444
}
4545
dependencies {
4646
<%dependencies.each { println "implementation project(':$it.name')" } %>
47+
<%externalDependencies.each { println "implementation '$it'" } %>
4748
}
4849
'''
4950
String name
5051
String group = 'com.example'
5152
String version = 'undefined'
5253
String latestReleasedVersion = ''
5354
Set<Project> projectDependencies = []
55+
Set<String> externalDependencies = []
5456
Project releaseWith = null
5557
String customizePom = null
5658

@@ -60,6 +62,7 @@ class PublishingPluginSpec extends Specification {
6062
group: group,
6163
version: version,
6264
dependencies: projectDependencies,
65+
externalDependencies: externalDependencies,
6366
releaseWith: releaseWith,
6467
latestReleasedVersion: latestReleasedVersion,
6568
customizePom: customizePom,
@@ -253,6 +256,42 @@ licenses {
253256
dependency.version == project1.version
254257
}
255258

259+
def "Publish project should correctly set dependency types"() {
260+
Project project1 = new Project(name: 'childProject1', version: '1.0', latestReleasedVersion: '0.8')
261+
Project project2 = new Project(
262+
name: 'childProject2',
263+
version: '0.9',
264+
projectDependencies: [project1],
265+
externalDependencies: [
266+
'com.google.dagger:dagger:2.22',
267+
'com.google.dagger:dagger-android-support:2.22',
268+
'com.android.support:multidex:1.0.3'
269+
])
270+
271+
when: "publishFirebase invoked"
272+
subprojectsDefined(project1, project2)
273+
def result = publish(Mode.RELEASE, project2)
274+
then: 'poms exist'
275+
def pom1 = project1.getPublishedPom("$testProjectDir.root/build/m2repository")
276+
def pom2 = project2.getPublishedPom("$testProjectDir.root/build/m2repository")
277+
assert !pom1.isPresent()
278+
assert pom2.isPresent()
279+
280+
and: 'versions and dependency types are valid'
281+
282+
def xml2 = new XmlSlurper().parseText(pom2.get().text)
283+
xml2.version == project2.version
284+
def dependencies = xml2.dependencies.dependency.collect {
285+
"${it.groupId.text()}:${it.artifactId.text()}:${it.version.text()}:${it.type.text()}:${it.scope.text()}"
286+
} as Set<String>
287+
dependencies == [
288+
"$project1.group:$project1.name:$project1.latestReleasedVersion:aar:compile",
289+
'com.google.dagger:dagger:2.22:jar:compile',
290+
'com.google.dagger:dagger-android-support:2.22:aar:compile'
291+
] as Set<String>
292+
293+
}
294+
256295
private BuildResult build(String... args) {
257296
GradleRunner.create()
258297
.withProjectDir(testProjectDir.root)

firebase-common/firebase-common.gradle

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,12 +78,13 @@ dependencies {
7878
androidTestImplementation 'org.mockito:mockito-core:2.21.0'
7979
androidTestImplementation 'com.linkedin.dexmaker:dexmaker:2.16.0'
8080
androidTestImplementation 'com.linkedin.dexmaker:dexmaker-mockito:2.16.0'
81-
androidTestImplementation ('com.google.firebase:firebase-auth:16.0.2') {
81+
androidTestImplementation ('com.google.firebase:firebase-auth:17.0.0') {
8282
exclude group: "com.google.firebase", module: "firebase-common"
8383
}
84+
8485
androidTestImplementation ('com.google.firebase:firebase-core:16.0.4') {
8586
exclude group: "com.google.firebase", module: "firebase-common"
8687
}
8788

8889
annotationProcessor 'com.google.auto.value:auto-value:1.6'
89-
}
90+
}

firebase-common/gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
version=16.1.1
1+
version=17.0.0
22
latestReleasedVersion=16.1.0

firebase-common/src/androidTest/AndroidManifest.xml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
3+
xmlns:tools="http://schemas.android.com/tools"
34
package="com.google.firebase.test">
45

5-
<uses-sdk android:minSdkVersion="14"/>
6+
<uses-sdk android:minSdkVersion="16" tools:overrideLibrary="com.google.firebase.auth"/>
67
<application>
78
<service android:name="com.google.firebase.components.ComponentDiscoveryService"
89
android:exported="false">
@@ -15,4 +16,4 @@
1516
</service>
1617
</application>
1718

18-
</manifest>
19+
</manifest>

firebase-common/src/androidTest/java/com/google/firebase/FirebaseAppTest.java

Lines changed: 4 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
import static org.mockito.Mockito.never;
2323
import static org.mockito.Mockito.reset;
2424
import static org.mockito.Mockito.spy;
25-
import static org.mockito.Mockito.times;
2625
import static org.mockito.Mockito.verify;
2726
import static org.mockito.Mockito.when;
2827

@@ -33,21 +32,17 @@
3332
import android.content.Intent;
3433
import android.content.IntentFilter;
3534
import android.os.UserManager;
36-
import android.support.annotation.NonNull;
3735
import android.support.test.InstrumentationRegistry;
3836
import android.support.test.runner.AndroidJUnit4;
3937
import android.support.v4.content.LocalBroadcastManager;
4038
import com.google.android.gms.common.api.internal.BackgroundDetector;
4139
import com.google.common.base.Defaults;
42-
import com.google.firebase.FirebaseApp.IdTokenListener;
43-
import com.google.firebase.FirebaseApp.IdTokenListenersCountChangedListener;
4440
import com.google.firebase.auth.FirebaseAuth;
4541
import com.google.firebase.components.EagerSdkVerifier;
4642
import com.google.firebase.components.InitTracker;
4743
import com.google.firebase.components.TestComponentOne;
4844
import com.google.firebase.components.TestComponentTwo;
4945
import com.google.firebase.components.TestUserAgentDependentComponent;
50-
import com.google.firebase.internal.InternalTokenResult;
5146
import com.google.firebase.platforminfo.UserAgentPublisher;
5247
import com.google.firebase.testing.FirebaseAppRule;
5348
import java.lang.reflect.InvocationTargetException;
@@ -56,9 +51,7 @@
5651
import java.util.ArrayList;
5752
import java.util.Arrays;
5853
import java.util.Collection;
59-
import java.util.HashMap;
6054
import java.util.List;
61-
import java.util.Map;
6255
import java.util.concurrent.atomic.AtomicBoolean;
6356
import java.util.concurrent.atomic.AtomicInteger;
6457
import org.junit.Before;
@@ -147,10 +140,11 @@ public void testInitializeApp_shouldPublishVersionForFirebaseCommon() {
147140
String[] actualUserAgent = userAgentPublisher.getUserAgent().split(" ");
148141
Arrays.sort(actualUserAgent);
149142

150-
// After sorting the user agents are expected to be {"fire-android/", "fire-core/x.y.z",
151-
// "test-component/1.2.3"}
143+
// After sorting the user agents are expected to be {"fire-android/", "fire-auth/x.y.z",
144+
// "fire-core/x.y.z", "test-component/1.2.3"}
152145
assertThat(actualUserAgent[0]).contains("fire-android");
153-
assertThat(actualUserAgent[1]).contains("fire-core");
146+
assertThat(actualUserAgent[1]).contains("fire-auth");
147+
assertThat(actualUserAgent[2]).contains("fire-core");
154148
}
155149

156150
@Test
@@ -202,30 +196,6 @@ public void testBackgroundStateChangeCallbacksDontFire_AutomaticResourceManageme
202196
assertThat(callbackCount.get()).isEqualTo(2);
203197
}
204198

205-
@Test
206-
public void testDefaultIdTokenListenersCountChangedListener() {
207-
FirebaseApp firebaseApp = FirebaseApp.initializeApp(targetContext, OPTIONS, "myApp");
208-
IdTokenListenersCountChangedListener listenersCountChangedListener =
209-
mock(IdTokenListenersCountChangedListener.class);
210-
211-
// When registering, should fire
212-
firebaseApp.setIdTokenListenersCountChangedListener(listenersCountChangedListener);
213-
verify(listenersCountChangedListener).onListenerCountChanged(0);
214-
215-
IdTokenListener listener =
216-
tokenResult -> {
217-
// do nothing
218-
};
219-
220-
// On number changed, should fire
221-
firebaseApp.addIdTokenListener(listener);
222-
verify(listenersCountChangedListener).onListenerCountChanged(1);
223-
224-
// On removal, should fire
225-
firebaseApp.removeIdTokenListener(listener);
226-
verify(listenersCountChangedListener, times(2)).onListenerCountChanged(0);
227-
}
228-
229199
@Test
230200
public void testGetInstanceErrorMessageContainsProcessName() {
231201
try {
@@ -280,17 +250,13 @@ public void testInvokeAfterDeleteThrows() throws Exception {
280250
// delete and hidden methods shouldn't throw even after delete.
281251
Collection<String> allowedToCallAfterDelete =
282252
Arrays.asList(
283-
"addIdTokenChangeListener",
284253
"addBackgroundStateChangeListener",
285254
"delete",
286255
"equals",
287256
"getListeners",
288257
"getPersistenceKey",
289258
"hashCode",
290259
"isDefaultApp",
291-
"setIdTokenListenersCountChangedListener",
292-
"notifyIdTokenListeners",
293-
"removeIdTokenChangeListener",
294260
"removeBackgroundStateChangeListener",
295261
"setTokenProvider",
296262
"toString");
@@ -424,38 +390,6 @@ public void testDirectBoot_shouldInitializeEagerComponentsOnDeviceUnlock() {
424390
assertThat(sdkVerifier.isAnalyticsInitialized()).isTrue();
425391
}
426392

427-
public static class DefaultIdTokenListener implements IdTokenListener {
428-
private Map<IdTokenListener, Integer> calls;
429-
430-
public DefaultIdTokenListener(Map<IdTokenListener, Integer> calls) {
431-
this.calls = calls;
432-
}
433-
434-
@Override
435-
public void onIdTokenChanged(@NonNull InternalTokenResult tokenResult) {
436-
if (!calls.containsKey(this)) {
437-
calls.put(this, 0);
438-
}
439-
calls.put(this, calls.get(this) + 1);
440-
}
441-
};
442-
443-
@Test
444-
public void testIdTokenListener() {
445-
Context mockContext = createForwardingMockContext();
446-
FirebaseApp firebaseApp = FirebaseApp.initializeApp(mockContext);
447-
Map<IdTokenListener, Integer> calls = new HashMap<>();
448-
IdTokenListener listener1 = new DefaultIdTokenListener(calls);
449-
IdTokenListener listener2 = new DefaultIdTokenListener(calls);
450-
firebaseApp.addIdTokenListener(listener1);
451-
firebaseApp.addIdTokenListener(listener2);
452-
firebaseApp.notifyIdTokenListeners(null);
453-
firebaseApp.removeIdTokenListener(listener2);
454-
firebaseApp.notifyIdTokenListeners(null);
455-
assertThat(calls.get(listener2)).isEqualTo(1);
456-
assertThat(calls.get(listener1)).isEqualTo(2);
457-
}
458-
459393
/** Returns mock context that forwards calls to targetContext and localBroadcastManager. */
460394
private Context createForwardingMockContext() {
461395
final UserManager spyUserManager = spy(targetContext.getSystemService(UserManager.class));

0 commit comments

Comments
 (0)