diff --git a/modules/expo-google-play-referrer/android/build.gradle b/modules/expo-google-play-referrer/android/build.gradle
new file mode 100644
index 0000000000..990c641644
--- /dev/null
+++ b/modules/expo-google-play-referrer/android/build.gradle
@@ -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")
+}
diff --git a/modules/expo-google-play-referrer/android/src/main/AndroidManifest.xml b/modules/expo-google-play-referrer/android/src/main/AndroidManifest.xml
new file mode 100644
index 0000000000..bdae66c8f5
--- /dev/null
+++ b/modules/expo-google-play-referrer/android/src/main/AndroidManifest.xml
@@ -0,0 +1,2 @@
+
+
diff --git a/modules/expo-google-play-referrer/android/src/main/java/expo/modules/googleplayreferrer/ExpoGooglePlayReferrerModule.kt b/modules/expo-google-play-referrer/android/src/main/java/expo/modules/googleplayreferrer/ExpoGooglePlayReferrerModule.kt
new file mode 100644
index 0000000000..490a12fe68
--- /dev/null
+++ b/modules/expo-google-play-referrer/android/src/main/java/expo/modules/googleplayreferrer/ExpoGooglePlayReferrerModule.kt
@@ -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()
+ }
+ })
+ }
+ }
+}
diff --git a/modules/expo-google-play-referrer/expo-module.config.json b/modules/expo-google-play-referrer/expo-module.config.json
new file mode 100644
index 0000000000..182045e157
--- /dev/null
+++ b/modules/expo-google-play-referrer/expo-module.config.json
@@ -0,0 +1,9 @@
+{
+ "platforms": ["android"],
+ "ios": {
+ "modules": ["ExpoGooglePlayReferrerModule"]
+ },
+ "android": {
+ "modules": ["expo.modules.googleplayreferrer.ExpoGooglePlayReferrerModule"]
+ }
+}
diff --git a/modules/expo-google-play-referrer/index.ts b/modules/expo-google-play-referrer/index.ts
new file mode 100644
index 0000000000..b7f2b366ab
--- /dev/null
+++ b/modules/expo-google-play-referrer/index.ts
@@ -0,0 +1,3 @@
+import {GooglePlayReferrerModule} from './src/ExpoGooglePlayReferrerModule'
+
+export default GooglePlayReferrerModule
diff --git a/modules/expo-google-play-referrer/src/ExpoGooglePlayReferrer.types.ts b/modules/expo-google-play-referrer/src/ExpoGooglePlayReferrer.types.ts
new file mode 100644
index 0000000000..7e86e3c877
--- /dev/null
+++ b/modules/expo-google-play-referrer/src/ExpoGooglePlayReferrer.types.ts
@@ -0,0 +1,9 @@
+export type GooglePlayReferrerInfo = {
+ installReferrer: string
+ clickTimestamp: number
+ installTimestamp: number
+}
+
+export type ExpoGooglePlayReferrerModule = {
+ getReferrerInfoAsync(): Promise
+}
diff --git a/modules/expo-google-play-referrer/src/ExpoGooglePlayReferrerModule.android.ts b/modules/expo-google-play-referrer/src/ExpoGooglePlayReferrerModule.android.ts
new file mode 100644
index 0000000000..ec9e0bbe3b
--- /dev/null
+++ b/modules/expo-google-play-referrer/src/ExpoGooglePlayReferrerModule.android.ts
@@ -0,0 +1,6 @@
+import {requireNativeModule} from 'expo-modules-core'
+
+import {ExpoGooglePlayReferrerModule} from './ExpoGooglePlayReferrer.types'
+
+export const BackgroundNotificationHandler =
+ requireNativeModule('ExpoGooglePlayReferrer')
diff --git a/modules/expo-google-play-referrer/src/ExpoGooglePlayReferrerModule.ts b/modules/expo-google-play-referrer/src/ExpoGooglePlayReferrerModule.ts
new file mode 100644
index 0000000000..e2f5ed1f05
--- /dev/null
+++ b/modules/expo-google-play-referrer/src/ExpoGooglePlayReferrerModule.ts
@@ -0,0 +1,11 @@
+import {
+ ExpoGooglePlayReferrerModule,
+ GooglePlayReferrerInfo,
+} from './ExpoGooglePlayReferrer.types'
+
+export const GooglePlayReferrerModule = {
+ getReferrerInfoAsync(): Promise {
+ console.error('getReferrerInfoAsync is only available on Android')
+ return Promise.reject('getReferrerInfoAsync is only available on Android')
+ },
+} as ExpoGooglePlayReferrerModule