Skip to content
This repository has been archived by the owner on Nov 1, 2022. It is now read-only.

Commit

Permalink
Remove service-glean's hard-dependency on httpurlconnection
Browse files Browse the repository at this point in the history
We still test with it, so we keep it around.

⚠️ **BREAKING CHANGE** ⚠️

Users will need to supply a configuration with a ping uploader to Glean
now.
A default lib-fetch-httpurlconnection implementation can be used like
this:

```kotlin
import mozilla.components.lib.fetch.httpurlconnection.HttpURLConnectionClient;
import mozilla.components.service.glean.config.Configuration;
import mozilla.components.service.glean.net.ConceptFetchHttpUploader;

val config = Configuration(httpClient = ConceptFetchHttpUploader(lazy { HttpURLConnectionClient() }))
Glean.initialize(context, true, config)
```

For Java this becomes:

```java
import mozilla.components.lib.fetch.httpurlconnection.HttpURLConnectionClient;
import mozilla.components.service.glean.config.Configuration;
import mozilla.components.service.glean.net.ConceptFetchHttpUploader;

ConceptFetchHttpUploader httpClient = ConceptFetchHttpUploader.fromClient(new HttpURLConnectionClient());
Configuration config = new Configuration(httpClient);
Glean.INSTANCE.initialize(context, true, config);
```

Co-authored-by: Alessio Placitelli <[email protected]>
  • Loading branch information
badboy and Dexterp37 committed May 11, 2020
1 parent 7a60da6 commit 4c427cf
Show file tree
Hide file tree
Showing 6 changed files with 41 additions and 15 deletions.
6 changes: 4 additions & 2 deletions components/service/glean/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -50,10 +50,11 @@ dependencies {

api GLEAN_LIBRARY

// So consumers can set a HTTP client.
api project(':concept-fetch')

implementation project(':support-ktx')
implementation project(':support-base')
implementation project(':concept-fetch')
implementation project(':lib-fetch-httpurlconnection')
implementation project(':support-utils')

testImplementation Dependencies.androidx_test_core
Expand All @@ -65,6 +66,7 @@ dependencies {
testImplementation Dependencies.androidx_work_testing

testImplementation project(':support-test')
testImplementation project(':lib-fetch-httpurlconnection')
testImplementation project(':lib-fetch-okhttp')

testImplementation GLEAN_LIBRARY_FORUNITTESTS
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,11 @@ object Glean {
* @param uploadEnabled A [Boolean] that determines the initial state of the uploader
* @param configuration A Glean [Configuration] object with global settings.
*/
@JvmOverloads
@MainThread
fun initialize(
applicationContext: Context,
uploadEnabled: Boolean,
configuration: Configuration = Configuration()
configuration: Configuration
) {
GleanCore.initialize(
applicationContext = applicationContext,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,26 +4,27 @@

package mozilla.components.service.glean.config

import mozilla.components.lib.fetch.httpurlconnection.HttpURLConnectionClient
import mozilla.components.service.glean.net.ConceptFetchHttpUploader
import mozilla.telemetry.glean.net.PingUploader
import mozilla.telemetry.glean.config.Configuration as GleanCoreConfiguration

/**
* The Configuration class describes how to configure the Glean.
*
* @property serverEndpoint the server pings are sent to. Please note that this is
* @property httpClient The HTTP client implementation to use for uploading pings.
* If you don't provide your own networking stack with an HTTP client to use,
* you can fall back to a simple implementation on top of `java.net` using
* `ConceptFetchHttpUploader(lazy { HttpURLConnectionClient() as Client })`
* @property serverEndpoint (optional) the server pings are sent to. Please note that this is
* is only meant to be changed for tests.
* @property channel the release channel the application is on, if known. This will be
* @property channel (optional )the release channel the application is on, if known. This will be
* sent along with all the pings, in the `client_info` section.
* @property maxEvents the number of events to store before the events ping is sent
* @property httpClient The HTTP client implementation to use for uploading pings.
* @property maxEvents (optional) the number of events to store before the events ping is sent
*/
data class Configuration @JvmOverloads constructor (
val httpClient: PingUploader,
val serverEndpoint: String = DEFAULT_TELEMETRY_ENDPOINT,
val channel: String? = null,
val maxEvents: Int? = null,
val httpClient: PingUploader = ConceptFetchHttpUploader(lazy { HttpURLConnectionClient() })
val maxEvents: Int? = null
) {
// The following is required to support calling our API from Java.
companion object {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,12 @@ import mozilla.components.concept.fetch.isClientError
import mozilla.components.concept.fetch.isSuccess
import mozilla.components.support.base.log.logger.Logger
import mozilla.telemetry.glean.net.HeadersList
import mozilla.telemetry.glean.net.PingUploader
import mozilla.telemetry.glean.net.PingUploader as CorePingUploader
import java.io.IOException
import java.util.concurrent.TimeUnit

typealias PingUploader = CorePingUploader

/**
* A simple ping Uploader, which implements a "send once" policy, never
* storing or attempting to send the ping again. This uses Android Component's
Expand All @@ -33,6 +35,16 @@ class ConceptFetchHttpUploader(
const val DEFAULT_CONNECTION_TIMEOUT = 10000L
// The timeout, in milliseconds, to use when reading from the server.
const val DEFAULT_READ_TIMEOUT = 30000L

/**
* Export a constructor that is usable from Java.
*
* This looses the lazyness of creating the `client`.
*/
@JvmStatic
fun fromClient(client: Client): ConceptFetchHttpUploader {
return ConceptFetchHttpUploader(lazy { client })
}
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,9 @@
import java.util.HashMap;
import java.util.Map;

import mozilla.components.lib.fetch.httpurlconnection.HttpURLConnectionClient;
import mozilla.components.service.glean.config.Configuration;
import mozilla.components.service.glean.net.ConceptFetchHttpUploader;

@RunWith(RobolectricTestRunner.class)
public class GleanFromJavaTest {
Expand All @@ -28,15 +30,18 @@ public class GleanFromJavaTest {
public void testInitGleanWithDefaults() {
Context context = ApplicationProvider.getApplicationContext();
WorkManagerTestInitHelper.initializeTestWorkManager(context);
Glean.INSTANCE.initialize(context, true);
ConceptFetchHttpUploader httpClient = ConceptFetchHttpUploader.fromClient(new HttpURLConnectionClient());
Configuration config = new Configuration(httpClient);
Glean.INSTANCE.initialize(context, true, config);
}

@Test
public void testInitGleanWithConfiguration() {
Context context = ApplicationProvider.getApplicationContext();
WorkManagerTestInitHelper.initializeTestWorkManager(context);
ConceptFetchHttpUploader httpClient = ConceptFetchHttpUploader.fromClient(new HttpURLConnectionClient());
Configuration config =
new Configuration(Configuration.DEFAULT_TELEMETRY_ENDPOINT, "test-channel");
new Configuration(httpClient, Configuration.DEFAULT_TELEMETRY_ENDPOINT, "test-channel");
Glean.INSTANCE.initialize(context, true, config);
}

Expand Down
7 changes: 7 additions & 0 deletions docs/changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,13 @@ permalink: /changelog/
* **browser-tabstray**
* Added optional `itemDecoration` DividerItemDecoration parameter to `BrowserTabsTray` constructor to allow the clients to add their own dividers. This is used to ensure setting divider item decoration after setAdapter() is called.

* **service-glean**
* ⚠️ **This is a breaking change**: Glean's configuration now requires explicitly setting an http client. Users need to pass one at construction.
A default `lib-fetch-httpurlconnection` implementation is available.
Add it to the configuration object like this:
`val config = Configuration(httpClient = ConceptFetchHttpUploader(lazy { HttpURLConnectionClient() }))`.
See [PR #6875](https://github.com/mozilla-mobile/android-components/pull/6875) for details and full code examples.

# 40.0.0

* [Commits](https://github.com/mozilla-mobile/android-components/compare/v39.0.0...v40.0.0)
Expand Down

0 comments on commit 4c427cf

Please sign in to comment.