[🏁 #8] Play Store referrer (#4361)

* add new module for referrer api

* add dependency

* rm boiler

* return the result

* end connection when finished

* add js types
This commit is contained in:
Hailey
2024-06-04 13:20:39 -07:00
committed by GitHub
parent 8f9898e74c
commit 81cd1e0f2a
8 changed files with 134 additions and 0 deletions
@@ -0,0 +1,47 @@
apply plugin: 'com.android.library'
group = 'expo.modules.googleplayreferrer'
version = '0.6.0'
def expoModulesCorePlugin = new File(project(":expo-modules-core").projectDir.absolutePath, "ExpoModulesCorePlugin.gradle")
apply from: expoModulesCorePlugin
applyKotlinExpoModulesCorePlugin()
useCoreDependencies()
useExpoPublishing()
// If you want to use the managed Android SDK versions from expo-modules-core, set this to true.
// The Android SDK versions will be bumped from time to time in SDK releases and may introduce breaking changes in your module code.
// Most of the time, you may like to manage the Android SDK versions yourself.
def useManagedAndroidSdkVersions = false
if (useManagedAndroidSdkVersions) {
useDefaultAndroidSdkVersions()
} else {
buildscript {
// Simple helper that allows the root project to override versions declared by this library.
ext.safeExtGet = { prop, fallback ->
rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback
}
}
project.android {
compileSdkVersion safeExtGet("compileSdkVersion", 34)
defaultConfig {
minSdkVersion safeExtGet("minSdkVersion", 21)
targetSdkVersion safeExtGet("targetSdkVersion", 34)
}
}
}
android {
namespace "expo.modules.googleplayreferrer"
defaultConfig {
versionCode 1
versionName "0.6.0"
}
lintOptions {
abortOnError false
}
}
dependencies {
implementation("com.android.installreferrer:installreferrer:2.2")
}
@@ -0,0 +1,2 @@
<manifest>
</manifest>
@@ -0,0 +1,47 @@
package expo.modules.googleplayreferrer
import com.android.installreferrer.api.InstallReferrerClient
import com.android.installreferrer.api.InstallReferrerStateListener
import expo.modules.kotlin.modules.Module
import expo.modules.kotlin.modules.ModuleDefinition
import expo.modules.kotlin.Promise
class ExpoGooglePlayReferrerModule : Module() {
override fun definition() = ModuleDefinition {
Name("ExpoGooglePlayReferrer")
AsyncFunction("getReferrerInfoAsync") { promise: Promise ->
val referrerClient = InstallReferrerClient.newBuilder(appContext.reactContext).build()
referrerClient.startConnection(object : InstallReferrerStateListener {
override fun onInstallReferrerSetupFinished(responseCode: Int) {
if (responseCode == InstallReferrerClient.InstallReferrerResponse.OK) {
val response = referrerClient.installReferrer
promise.resolve(
mapOf(
"installReferrer" to response.installReferrer,
"clickTimestamp" to response.referrerClickTimestampSeconds,
"installTimestamp" to response.installBeginTimestampSeconds
)
)
} else {
promise.reject(
"ERR_GOOGLE_PLAY_REFERRER_UNKNOWN",
"Failed to get referrer info",
Exception("Failed to get referrer info")
)
}
referrerClient.endConnection()
}
override fun onInstallReferrerServiceDisconnected() {
promise.reject(
"ERR_GOOGLE_PLAY_REFERRER_DISCONNECTED",
"Failed to get referrer info",
Exception("Failed to get referrer info")
)
referrerClient.endConnection()
}
})
}
}
}
@@ -0,0 +1,9 @@
{
"platforms": ["android"],
"ios": {
"modules": ["ExpoGooglePlayReferrerModule"]
},
"android": {
"modules": ["expo.modules.googleplayreferrer.ExpoGooglePlayReferrerModule"]
}
}
@@ -0,0 +1,3 @@
import {GooglePlayReferrerModule} from './src/ExpoGooglePlayReferrerModule'
export default GooglePlayReferrerModule
@@ -0,0 +1,9 @@
export type GooglePlayReferrerInfo = {
installReferrer: string
clickTimestamp: number
installTimestamp: number
}
export type ExpoGooglePlayReferrerModule = {
getReferrerInfoAsync(): Promise<GooglePlayReferrerInfo>
}
@@ -0,0 +1,6 @@
import {requireNativeModule} from 'expo-modules-core'
import {ExpoGooglePlayReferrerModule} from './ExpoGooglePlayReferrer.types'
export const BackgroundNotificationHandler =
requireNativeModule<ExpoGooglePlayReferrerModule>('ExpoGooglePlayReferrer')
@@ -0,0 +1,11 @@
import {
ExpoGooglePlayReferrerModule,
GooglePlayReferrerInfo,
} from './ExpoGooglePlayReferrer.types'
export const GooglePlayReferrerModule = {
getReferrerInfoAsync(): Promise<GooglePlayReferrerInfo> {
console.error('getReferrerInfoAsync is only available on Android')
return Promise.reject('getReferrerInfoAsync is only available on Android')
},
} as ExpoGooglePlayReferrerModule