diff --git a/demo-app/src/main/java/com/gravatar/demoapp/MainActivity.kt b/demo-app/src/main/java/com/gravatar/demoapp/MainActivity.kt index 58630425..50998255 100644 --- a/demo-app/src/main/java/com/gravatar/demoapp/MainActivity.kt +++ b/demo-app/src/main/java/com/gravatar/demoapp/MainActivity.kt @@ -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() diff --git a/docs/get-started/get-started.md b/docs/get-started/get-started.md index 4a37d0ac..1d81ccfb 100644 --- a/docs/get-started/get-started.md +++ b/docs/get-started/get-started.md @@ -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 diff --git a/gravatar/api/gravatar.api b/gravatar/api/gravatar.api index 0eddefee..fe2de836 100644 --- a/gravatar/api/gravatar.api +++ b/gravatar/api/gravatar.api @@ -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 { diff --git a/gravatar/src/main/java/com/gravatar/Gravatar.kt b/gravatar/src/main/java/com/gravatar/Gravatar.kt index 368fec4a..87e9958d 100644 --- a/gravatar/src/main/java/com/gravatar/Gravatar.kt +++ b/gravatar/src/main/java/com/gravatar/Gravatar.kt @@ -1,5 +1,7 @@ package com.gravatar +import android.content.Context +import android.content.pm.PackageManager import com.gravatar.di.container.GravatarSdkContainer /** @@ -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() } } diff --git a/gravatar/src/main/java/com/gravatar/di/container/GravatarSdkContainer.kt b/gravatar/src/main/java/com/gravatar/di/container/GravatarSdkContainer.kt index a2c37edb..6240a45f 100644 --- a/gravatar/src/main/java/com/gravatar/di/container/GravatarSdkContainer.kt +++ b/gravatar/src/main/java/com/gravatar/di/container/GravatarSdkContainer.kt @@ -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 { diff --git a/gravatar/src/main/java/com/gravatar/services/interceptors/SdkVersionInterceptor.kt b/gravatar/src/main/java/com/gravatar/services/interceptors/SdkVersionInterceptor.kt index 536e6648..13379dce 100644 --- a/gravatar/src/main/java/com/gravatar/services/interceptors/SdkVersionInterceptor.kt +++ b/gravatar/src/main/java/com/gravatar/services/interceptors/SdkVersionInterceptor.kt @@ -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(), ) } } diff --git a/gravatar/src/test/java/com/gravatar/GravatarTest.kt b/gravatar/src/test/java/com/gravatar/GravatarTest.kt index 35894254..b18e1d34 100644 --- a/gravatar/src/test/java/com/gravatar/GravatarTest.kt +++ b/gravatar/src/test/java/com/gravatar/GravatarTest.kt @@ -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 @@ -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() + val packageManager = mockk() + val applicationInfo = mockk() + + 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 } + } }