Skip to content

Commit 388df8f

Browse files
authored
Merge pull request #368 from Automattic/hamorillo/360-header-app-name
Add X-Source header to Gravatar REST API request
2 parents 854df11 + 37d4926 commit 388df8f

7 files changed

Lines changed: 61 additions & 11 deletions

File tree

demo-app/src/main/java/com/gravatar/demoapp/MainActivity.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ class MainActivity : ComponentActivity() {
1313
super.onCreate(savedInstanceState)
1414

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

1818
setContent {
1919
DemoGravatarApp()

docs/get-started/get-started.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,8 @@ android {
6363
Then you can access the API key in your app's code like this:
6464

6565
```kotlin
66-
Gravatar.initialize(BuildConfig.GRAVATAR_API_KEY)
66+
Gravatar.apiKey(BuildConfig.GRAVATAR_API_KEY)
67+
.context(appContext) // Optional but highly encouraged.
6768
```
6869

6970
# Usage

gravatar/api/gravatar.api

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,8 @@ public final class com/gravatar/DefaultAvatarOption$Wavatar : com/gravatar/Defau
136136

137137
public final class com/gravatar/Gravatar {
138138
public static final field INSTANCE Lcom/gravatar/Gravatar;
139-
public final fun initialize (Ljava/lang/String;)V
139+
public final fun apiKey (Ljava/lang/String;)Lcom/gravatar/Gravatar;
140+
public final fun context (Landroid/content/Context;)Lcom/gravatar/Gravatar;
140141
}
141142

142143
public final class com/gravatar/GravatarConstants {
Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.gravatar
22

3+
import android.content.Context
4+
import android.content.pm.PackageManager
35
import com.gravatar.di.container.GravatarSdkContainer
46

57
/**
@@ -9,9 +11,29 @@ public object Gravatar {
911
/**
1012
* Initializes the Gravatar SDK with the given API key.
1113
*
12-
* @param gravatarApiKey The API key to use when making requests to the Gravatar backend.
14+
* @param apiKey The API key to use when making requests to the Gravatar backend.
1315
*/
14-
public fun initialize(gravatarApiKey: String) {
15-
GravatarSdkContainer.instance.apiKey = gravatarApiKey
16+
public fun apiKey(apiKey: String): Gravatar {
17+
GravatarSdkContainer.instance.apiKey = apiKey
18+
return this
19+
}
20+
21+
/**
22+
* Initializes the Gravatar SDK with the given context.
23+
* The context is used to get the application name.
24+
*
25+
* @param context The context from the app.
26+
*/
27+
public fun context(context: Context): Gravatar {
28+
GravatarSdkContainer.instance.appName = getApplicationName(context)
29+
return this
30+
}
31+
32+
private fun getApplicationName(context: Context): String {
33+
val applicationInfo = context.packageManager.getApplicationInfo(
34+
context.packageName,
35+
PackageManager.GET_META_DATA,
36+
)
37+
return context.packageManager.getApplicationLabel(applicationInfo).toString()
1638
}
1739
}

gravatar/src/main/java/com/gravatar/di/container/GravatarSdkContainer.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ internal class GravatarSdkContainer private constructor() {
3333
val dispatcherIO = Dispatchers.IO
3434

3535
var apiKey: String? = null
36+
var appName: String? = null
3637

3738
fun getGravatarV3Service(okHttpClient: OkHttpClient? = null, oauthToken: String? = null): GravatarApi {
3839
return getRetrofitApiV3Builder().apply {
Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
11
package com.gravatar.services.interceptors
22

33
import com.gravatar.BuildConfig
4+
import com.gravatar.di.container.GravatarSdkContainer
45
import okhttp3.Interceptor
56
import okhttp3.Response
67

78
internal class SdkVersionInterceptor : Interceptor {
89
override fun intercept(chain: Interceptor.Chain): Response {
910
return chain.proceed(
10-
chain.request().newBuilder()
11-
.addHeader("X-Platform", "Android")
12-
.addHeader("X-SDK-Version", BuildConfig.SDK_VERSION)
13-
.build(),
11+
chain.request().newBuilder().apply {
12+
addHeader("X-Platform", "Android")
13+
addHeader("X-SDK-Version", BuildConfig.SDK_VERSION)
14+
GravatarSdkContainer.instance.appName?.let { addHeader("X-Source", it) }
15+
}.build(),
1416
)
1517
}
1618
}

gravatar/src/test/java/com/gravatar/GravatarTest.kt

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
package com.gravatar
22

3+
import android.content.Context
4+
import android.content.pm.ApplicationInfo
5+
import android.content.pm.PackageManager
36
import io.mockk.coVerify
7+
import io.mockk.every
8+
import io.mockk.mockk
49
import org.junit.Rule
510
import org.junit.Test
611

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

15-
Gravatar.initialize(apiKey)
20+
Gravatar.apiKey(apiKey)
1621

1722
coVerify(exactly = 1) { containerRule.gravatarSdkContainerMock.apiKey = apiKey }
1823
}
24+
25+
@Test
26+
fun `given a context when initialize method is invoked then the app name is extracted`() {
27+
val appName = "Gravatar APP"
28+
val packageName = "com.gravatar"
29+
val context = mockk<Context>()
30+
val packageManager = mockk<PackageManager>()
31+
val applicationInfo = mockk<ApplicationInfo>()
32+
33+
every { context.packageManager } returns packageManager
34+
every { context.packageName } returns packageName
35+
every { packageManager.getApplicationInfo(packageName, PackageManager.GET_META_DATA) } returns applicationInfo
36+
every { packageManager.getApplicationLabel(applicationInfo) } returns appName
37+
38+
Gravatar.context(context)
39+
40+
coVerify(exactly = 1) { containerRule.gravatarSdkContainerMock.appName = appName }
41+
}
1942
}

0 commit comments

Comments
 (0)