From 81cd1e0f2a1aaf573aebd3c35b1e072b3559096a Mon Sep 17 00:00:00 2001 From: Hailey Date: Tue, 4 Jun 2024 13:20:39 -0700 Subject: [PATCH] =?UTF-8?q?[=F0=9F=8F=81=20#8]=20Play=20Store=20referrer?= =?UTF-8?q?=20(#4361)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * add new module for referrer api * add dependency * rm boiler * return the result * end connection when finished * add js types --- .../android/build.gradle | 47 +++++++++++++++++++ .../android/src/main/AndroidManifest.xml | 2 + .../ExpoGooglePlayReferrerModule.kt | 47 +++++++++++++++++++ .../expo-module.config.json | 9 ++++ modules/expo-google-play-referrer/index.ts | 3 ++ .../src/ExpoGooglePlayReferrer.types.ts | 9 ++++ .../ExpoGooglePlayReferrerModule.android.ts | 6 +++ .../src/ExpoGooglePlayReferrerModule.ts | 11 +++++ 8 files changed, 134 insertions(+) create mode 100644 modules/expo-google-play-referrer/android/build.gradle create mode 100644 modules/expo-google-play-referrer/android/src/main/AndroidManifest.xml create mode 100644 modules/expo-google-play-referrer/android/src/main/java/expo/modules/googleplayreferrer/ExpoGooglePlayReferrerModule.kt create mode 100644 modules/expo-google-play-referrer/expo-module.config.json create mode 100644 modules/expo-google-play-referrer/index.ts create mode 100644 modules/expo-google-play-referrer/src/ExpoGooglePlayReferrer.types.ts create mode 100644 modules/expo-google-play-referrer/src/ExpoGooglePlayReferrerModule.android.ts create mode 100644 modules/expo-google-play-referrer/src/ExpoGooglePlayReferrerModule.ts 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