diff --git a/modules/expo-bluesky-swiss-army/android/src/main/java/expo/modules/blueskyswissarmy/referrer/ExpoBlueskyReferrerModule.kt b/modules/expo-bluesky-swiss-army/android/src/main/java/expo/modules/blueskyswissarmy/referrer/ExpoBlueskyReferrerModule.kt index 3589b364e0..d8283a1db6 100644 --- a/modules/expo-bluesky-swiss-army/android/src/main/java/expo/modules/blueskyswissarmy/referrer/ExpoBlueskyReferrerModule.kt +++ b/modules/expo-bluesky-swiss-army/android/src/main/java/expo/modules/blueskyswissarmy/referrer/ExpoBlueskyReferrerModule.kt @@ -1,5 +1,8 @@ package expo.modules.blueskyswissarmy.referrer +import android.content.Intent +import android.net.Uri +import android.os.Build import android.util.Log import com.android.installreferrer.api.InstallReferrerClient import com.android.installreferrer.api.InstallReferrerStateListener @@ -8,9 +11,45 @@ import expo.modules.kotlin.modules.ModuleDefinition import expo.modules.kotlin.Promise class ExpoBlueskyReferrerModule : Module() { + private var intent: Intent? = null + private var activityReferrer: Uri? = null + override fun definition() = ModuleDefinition { Name("ExpoBlueskyReferrer") + OnNewIntent { + intent = it + activityReferrer = appContext.currentActivity?.referrer + } + + AsyncFunction("getReferrerInfoAsync") { + val intentReferrer = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + intent?.getParcelableExtra(Intent.EXTRA_REFERRER, Uri::class.java) + } else { + intent?.getParcelableExtra(Intent.EXTRA_REFERRER) + } + + // Some apps explicitly set a referrer, like Chrome. In these cases, we prefer this since + // it's the actual website that the user came from rather than the app. + if (intentReferrer is Uri) { + return@AsyncFunction mapOf( + "referrer" to intentReferrer.toString(), + "hostname" to intentReferrer.host, + ) + } + + // In all other cases, we'll just record the app that sent the intent. + if (activityReferrer != null) { + // referrer could become null here. `.toString()` though can be called on null + return@AsyncFunction mapOf( + "referrer" to activityReferrer.toString(), + "hostname" to (activityReferrer?.host ?: ""), + ) + } + + return@AsyncFunction null + } + AsyncFunction("getGooglePlayReferrerInfoAsync") { promise: Promise -> val referrerClient = InstallReferrerClient.newBuilder(appContext.reactContext).build() referrerClient.startConnection(object : InstallReferrerStateListener { diff --git a/modules/expo-bluesky-swiss-army/src/Referrer/index.android.ts b/modules/expo-bluesky-swiss-army/src/Referrer/index.android.ts index 06dfd2d09c..ec2bcb57db 100644 --- a/modules/expo-bluesky-swiss-army/src/Referrer/index.android.ts +++ b/modules/expo-bluesky-swiss-army/src/Referrer/index.android.ts @@ -1,9 +1,13 @@ import {requireNativeModule} from 'expo' -import {GooglePlayReferrerInfo} from './types' +import {GooglePlayReferrerInfo, ReferrerInfo} from './types' export const NativeModule = requireNativeModule('ExpoBlueskyReferrer') -export function getGooglePlayReferrerInfoAsync(): Promise { +export function getGooglePlayReferrerInfoAsync(): Promise { return NativeModule.getGooglePlayReferrerInfoAsync() } + +export function getReferrerInfoAsync(): Promise { + return NativeModule.getReferrerInfoAsync() +} diff --git a/modules/expo-bluesky-swiss-army/src/Referrer/index.ios.ts b/modules/expo-bluesky-swiss-army/src/Referrer/index.ios.ts new file mode 100644 index 0000000000..6f6e052ab9 --- /dev/null +++ b/modules/expo-bluesky-swiss-army/src/Referrer/index.ios.ts @@ -0,0 +1,14 @@ +import {requireNativeModule} from 'expo' + +import {NotImplementedError} from '../NotImplemented' +import {GooglePlayReferrerInfo, ReferrerInfo} from './types' + +export const NativeModule = requireNativeModule('ExpoBlueskyReferrer') + +export function getGooglePlayReferrerInfoAsync(): Promise { + throw new NotImplementedError() +} + +export function getReferrerInfoAsync(): Promise { + return NativeModule.getReferrerInfoAsync() +} diff --git a/modules/expo-bluesky-swiss-army/src/Referrer/index.ts b/modules/expo-bluesky-swiss-army/src/Referrer/index.ts index 2553985527..a60f7b6db8 100644 --- a/modules/expo-bluesky-swiss-army/src/Referrer/index.ts +++ b/modules/expo-bluesky-swiss-army/src/Referrer/index.ts @@ -1,7 +1,10 @@ import {NotImplementedError} from '../NotImplemented' -import {GooglePlayReferrerInfo} from './types' +import {GooglePlayReferrerInfo, ReferrerInfo} from './types' -// @ts-ignore throws export function getGooglePlayReferrerInfoAsync(): Promise { throw new NotImplementedError() } + +export function getReferrerInfoAsync(): Promise { + throw new NotImplementedError() +} diff --git a/modules/expo-bluesky-swiss-army/src/Referrer/index.web.ts b/modules/expo-bluesky-swiss-army/src/Referrer/index.web.ts new file mode 100644 index 0000000000..38d557d1d7 --- /dev/null +++ b/modules/expo-bluesky-swiss-army/src/Referrer/index.web.ts @@ -0,0 +1,33 @@ +import {Platform} from 'react-native' + +import {NotImplementedError} from '../NotImplemented' +import {GooglePlayReferrerInfo, ReferrerInfo} from './types' + +export function getGooglePlayReferrerInfoAsync(): Promise { + throw new NotImplementedError() +} + +export function getReferrerInfoAsync(): Promise { + if ( + Platform.OS === 'web' && + typeof document !== 'undefined' && + document != null && + document.referrer + ) { + try { + const url = new URL(document.referrer) + if (url.hostname !== 'bsky.app') { + return { + referrer: url.href, + hostname: url.hostname, + } + } + } catch { + // If something happens to the URL parsing, we don't want to actually cause any problems for the user. Just + // log the error so we might catch it + console.error('Failed to parse referrer URL') + } + } + + return null +} diff --git a/modules/expo-bluesky-swiss-army/src/Referrer/types.ts b/modules/expo-bluesky-swiss-army/src/Referrer/types.ts index 55faaff4d3..921e3a6921 100644 --- a/modules/expo-bluesky-swiss-army/src/Referrer/types.ts +++ b/modules/expo-bluesky-swiss-army/src/Referrer/types.ts @@ -1,7 +1,10 @@ -export type GooglePlayReferrerInfo = - | { - installReferrer?: string - clickTimestamp?: number - installTimestamp?: number - } - | undefined +export type GooglePlayReferrerInfo = { + installReferrer?: string + clickTimestamp?: number + installTimestamp?: number +} + +export type ReferrerInfo = { + referrer: string + hostname: string +} diff --git a/modules/expo-get-referrer/android/build.gradle b/modules/expo-get-referrer/android/build.gradle deleted file mode 100644 index 23c21076a3..0000000000 --- a/modules/expo-get-referrer/android/build.gradle +++ /dev/null @@ -1,47 +0,0 @@ -apply plugin: 'com.android.library' - -group = 'expo.modules.getreferrer' -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.getreferrer" - defaultConfig { - versionCode 1 - versionName "0.6.0" - } - lintOptions { - abortOnError false - } -} - -dependencies { - implementation("com.android.installreferrer:installreferrer:2.2") -} diff --git a/modules/expo-get-referrer/android/src/main/AndroidManifest.xml b/modules/expo-get-referrer/android/src/main/AndroidManifest.xml deleted file mode 100644 index bdae66c8f5..0000000000 --- a/modules/expo-get-referrer/android/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/modules/expo-get-referrer/android/src/main/java/expo/modules/getreferrer/ExpoGetReferrerModule.kt b/modules/expo-get-referrer/android/src/main/java/expo/modules/getreferrer/ExpoGetReferrerModule.kt deleted file mode 100644 index b3302a91c1..0000000000 --- a/modules/expo-get-referrer/android/src/main/java/expo/modules/getreferrer/ExpoGetReferrerModule.kt +++ /dev/null @@ -1,86 +0,0 @@ -package expo.modules.getreferrer - -import android.content.Intent -import android.net.Uri -import android.os.Build -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 ExpoGetReferrerModule : Module() { - private var intent: Intent? = null - private var activityReferrer: Uri? = null - - override fun definition() = ModuleDefinition { - Name("ExpoGetReferrer") - - OnNewIntent { - intent = it - activityReferrer = appContext.currentActivity?.referrer - } - - AsyncFunction("getReferrerInfoAsync") { - val intentReferrer = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - intent?.getParcelableExtra(Intent.EXTRA_REFERRER, Uri::class.java) - } else { - intent?.getParcelableExtra(Intent.EXTRA_REFERRER) - } - - // Some apps explicitly set a referrer, like Chrome. In these cases, we prefer this since - // it's the actual website that the user came from rather than the app. - if (intentReferrer is Uri) { - return@AsyncFunction mapOf( - "referrer" to intentReferrer.toString(), - "hostname" to intentReferrer.host, - ) - } - - // In all other cases, we'll just record the app that sent the intent. - if (activityReferrer != null) { - // referrer could become null here. `.toString()` though can be called on null - return@AsyncFunction mapOf( - "referrer" to activityReferrer.toString(), - "hostname" to (activityReferrer?.host ?: ""), - ) - } - - return@AsyncFunction null - } - - AsyncFunction("getGooglePlayReferrerInfoAsync") { 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-get-referrer/expo-module.config.json b/modules/expo-get-referrer/expo-module.config.json deleted file mode 100644 index 358194262b..0000000000 --- a/modules/expo-get-referrer/expo-module.config.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "platforms": ["android"], - "android": { - "modules": ["expo.modules.getreferrer.ExpoGetReferrerModule"] - } -} diff --git a/modules/expo-get-referrer/src/ExpoGetReferrer.types.ts b/modules/expo-get-referrer/src/ExpoGetReferrer.types.ts deleted file mode 100644 index a58e1d7935..0000000000 --- a/modules/expo-get-referrer/src/ExpoGetReferrer.types.ts +++ /dev/null @@ -1,15 +0,0 @@ -export type ExpoGetReferrerModule = { - getGooglePlayReferrerInfoAsync: () => Promise - getReferrerInfoAsync: () => Promise<{ - referrer: string - hostname: string - } | null> -} - -export type GooglePlayReferrerInfo = - | { - installReferrer?: string - clickTimestamp?: number - installTimestamp?: number - } - | undefined diff --git a/modules/expo-get-referrer/src/ExpoGetReferrerModule.ios.ts b/modules/expo-get-referrer/src/ExpoGetReferrerModule.ios.ts deleted file mode 100644 index 08b769ed3c..0000000000 --- a/modules/expo-get-referrer/src/ExpoGetReferrerModule.ios.ts +++ /dev/null @@ -1,14 +0,0 @@ -import {requireNativeModule} from 'expo-modules-core' - -import {ExpoGetReferrerModule} from './ExpoGetReferrer.types' - -const NativeModule = - requireNativeModule('ExpoGetReferrer') - -export const GetReferrerModule: ExpoGetReferrerModule = { - getGooglePlayReferrerInfoAsync: async () => { - console.error('getGooglePlayReferrerInfo is only available on Android') - throw new Error('getGooglePlayReferrerInfo is only available on Android') - }, - getReferrerInfoAsync: NativeModule.getReferrerInfoAsync, -} diff --git a/modules/expo-get-referrer/src/ExpoGetReferrerModule.ts b/modules/expo-get-referrer/src/ExpoGetReferrerModule.ts deleted file mode 100644 index a760e3e138..0000000000 --- a/modules/expo-get-referrer/src/ExpoGetReferrerModule.ts +++ /dev/null @@ -1,11 +0,0 @@ -import {requireNativeModule} from 'expo-modules-core' - -import {ExpoGetReferrerModule} from './ExpoGetReferrer.types' - -const NativeModule = - requireNativeModule('ExpoGetReferrer') - -export const GetReferrerModule: ExpoGetReferrerModule = { - getGooglePlayReferrerInfoAsync: NativeModule.getGooglePlayReferrerInfoAsync, - getReferrerInfoAsync: NativeModule.getReferrerInfoAsync, -} diff --git a/modules/expo-get-referrer/src/ExpoGetReferrerModule.web.ts b/modules/expo-get-referrer/src/ExpoGetReferrerModule.web.ts deleted file mode 100644 index 265b097231..0000000000 --- a/modules/expo-get-referrer/src/ExpoGetReferrerModule.web.ts +++ /dev/null @@ -1,30 +0,0 @@ -import {isWeb} from 'platform/detection' -import {ExpoGetReferrerModule} from './ExpoGetReferrer.types' - -export const GetReferrerModule: ExpoGetReferrerModule = { - getGooglePlayReferrerInfoAsync: async () => { - console.error('getReferrerInfoAsync is only available on Android') - throw new Error('getGooglePlayReferrerInfo is only available on Android') - }, - getReferrerInfoAsync: async () => { - try { - if ( - isWeb && - typeof document !== 'undefined' && - document != null && - document.referrer - ) { - const url = new URL(document.referrer) - if (url.hostname !== 'bsky.app') { - return { - referrer: url.href, - hostname: url.hostname, - } - } - } - } catch { - return null - } - return null - }, -}