Skip to content

Commit

Permalink
Merge pull request #368 from Automattic/hamorillo/360-header-app-name
Browse files Browse the repository at this point in the history
Add X-Source header to Gravatar REST API request
  • Loading branch information
hamorillo authored Oct 8, 2024
2 parents 854df11 + 37d4926 commit 388df8f
Show file tree
Hide file tree
Showing 7 changed files with 61 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ class MainActivity : ComponentActivity() {
super.onCreate(savedInstanceState)

// Initialize the Gravatar SDK with the API key if it is available
BuildConfig.DEMO_GRAVATAR_API_KEY?.let { Gravatar.initialize(it) }
BuildConfig.DEMO_GRAVATAR_API_KEY?.let { Gravatar.apiKey(it).context(applicationContext) }

setContent {
DemoGravatarApp()
Expand Down
3 changes: 2 additions & 1 deletion docs/get-started/get-started.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,8 @@ android {
Then you can access the API key in your app's code like this:

```kotlin
Gravatar.initialize(BuildConfig.GRAVATAR_API_KEY)
Gravatar.apiKey(BuildConfig.GRAVATAR_API_KEY)
.context(appContext) // Optional but highly encouraged.
```

# Usage
Expand Down
3 changes: 2 additions & 1 deletion gravatar/api/gravatar.api
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,8 @@ public final class com/gravatar/DefaultAvatarOption$Wavatar : com/gravatar/Defau

public final class com/gravatar/Gravatar {
public static final field INSTANCE Lcom/gravatar/Gravatar;
public final fun initialize (Ljava/lang/String;)V
public final fun apiKey (Ljava/lang/String;)Lcom/gravatar/Gravatar;
public final fun context (Landroid/content/Context;)Lcom/gravatar/Gravatar;
}

public final class com/gravatar/GravatarConstants {
Expand Down
28 changes: 25 additions & 3 deletions gravatar/src/main/java/com/gravatar/Gravatar.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.gravatar

import android.content.Context
import android.content.pm.PackageManager
import com.gravatar.di.container.GravatarSdkContainer

/**
Expand All @@ -9,9 +11,29 @@ public object Gravatar {
/**
* Initializes the Gravatar SDK with the given API key.
*
* @param gravatarApiKey The API key to use when making requests to the Gravatar backend.
* @param apiKey The API key to use when making requests to the Gravatar backend.
*/
public fun initialize(gravatarApiKey: String) {
GravatarSdkContainer.instance.apiKey = gravatarApiKey
public fun apiKey(apiKey: String): Gravatar {
GravatarSdkContainer.instance.apiKey = apiKey
return this
}

/**
* Initializes the Gravatar SDK with the given context.
* The context is used to get the application name.
*
* @param context The context from the app.
*/
public fun context(context: Context): Gravatar {
GravatarSdkContainer.instance.appName = getApplicationName(context)
return this
}

private fun getApplicationName(context: Context): String {
val applicationInfo = context.packageManager.getApplicationInfo(
context.packageName,
PackageManager.GET_META_DATA,
)
return context.packageManager.getApplicationLabel(applicationInfo).toString()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ internal class GravatarSdkContainer private constructor() {
val dispatcherIO = Dispatchers.IO

var apiKey: String? = null
var appName: String? = null

fun getGravatarV3Service(okHttpClient: OkHttpClient? = null, oauthToken: String? = null): GravatarApi {
return getRetrofitApiV3Builder().apply {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,18 @@
package com.gravatar.services.interceptors

import com.gravatar.BuildConfig
import com.gravatar.di.container.GravatarSdkContainer
import okhttp3.Interceptor
import okhttp3.Response

internal class SdkVersionInterceptor : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
return chain.proceed(
chain.request().newBuilder()
.addHeader("X-Platform", "Android")
.addHeader("X-SDK-Version", BuildConfig.SDK_VERSION)
.build(),
chain.request().newBuilder().apply {
addHeader("X-Platform", "Android")
addHeader("X-SDK-Version", BuildConfig.SDK_VERSION)
GravatarSdkContainer.instance.appName?.let { addHeader("X-Source", it) }
}.build(),
)
}
}
25 changes: 24 additions & 1 deletion gravatar/src/test/java/com/gravatar/GravatarTest.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
package com.gravatar

import android.content.Context
import android.content.pm.ApplicationInfo
import android.content.pm.PackageManager
import io.mockk.coVerify
import io.mockk.every
import io.mockk.mockk
import org.junit.Rule
import org.junit.Test

Expand All @@ -12,8 +17,26 @@ class GravatarTest {
fun `given an api key when initialize method is invoked with it then it should be set internally`() {
val apiKey = "API_KEY"

Gravatar.initialize(apiKey)
Gravatar.apiKey(apiKey)

coVerify(exactly = 1) { containerRule.gravatarSdkContainerMock.apiKey = apiKey }
}

@Test
fun `given a context when initialize method is invoked then the app name is extracted`() {
val appName = "Gravatar APP"
val packageName = "com.gravatar"
val context = mockk<Context>()
val packageManager = mockk<PackageManager>()
val applicationInfo = mockk<ApplicationInfo>()

every { context.packageManager } returns packageManager
every { context.packageName } returns packageName
every { packageManager.getApplicationInfo(packageName, PackageManager.GET_META_DATA) } returns applicationInfo
every { packageManager.getApplicationLabel(applicationInfo) } returns appName

Gravatar.context(context)

coVerify(exactly = 1) { containerRule.gravatarSdkContainerMock.appName = appName }
}
}

0 comments on commit 388df8f

Please sign in to comment.