add some more native code

This commit is contained in:
Hailey
2024-06-16 23:32:12 -07:00
parent fa004bc8df
commit 8785ef3b3c
14 changed files with 206 additions and 58 deletions
@@ -0,0 +1,43 @@
apply plugin: 'com.android.library'
group = 'expo.modules.blueskyswissarmy'
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.blueskyswissarmy"
defaultConfig {
versionCode 1
versionName "0.6.0"
}
lintOptions {
abortOnError false
}
}
@@ -0,0 +1,2 @@
<manifest>
</manifest>
@@ -0,0 +1,10 @@
package expo.modules.blueskyswissarmy
import expo.modules.kotlin.modules.Module
import expo.modules.kotlin.modules.ModuleDefinition
class ExpoBlueskySwissArmyModule : Module() {
override fun definition() = ModuleDefinition {
Name("ExpoBlueskySwissArmy")
}
}
@@ -0,0 +1,9 @@
{
"platforms": ["ios", "tvos", "android", "web"],
"ios": {
"modules": ["ExpoBlueskySwissArmyModule"]
},
"android": {
"modules": ["expo.modules.blueskyswissarmy.ExpoBlueskySwissArmyModule"]
}
}
+2
View File
@@ -0,0 +1,2 @@
import {ExpoBlueskySwissArmyModule} from './src/ExpoBlueskySwissArmy'
export {ExpoBlueskySwissArmyModule as SwissArmyKnife}
@@ -0,0 +1,21 @@
Pod::Spec.new do |s|
s.name = 'ExpoBlueskySwissArmy'
s.version = '1.0.0'
s.summary = 'A collection of native tools for Bluesky'
s.description = 'A collection of native tools for Bluesky'
s.author = ''
s.homepage = 'https://github.com/bluesky-social/social-app'
s.platforms = { :ios => '13.4', :tvos => '13.4' }
s.source = { git: '' }
s.static_framework = true
s.dependency 'ExpoModulesCore'
# Swift/Objective-C compatibility
s.pod_target_xcconfig = {
'DEFINES_MODULE' => 'YES',
'SWIFT_COMPILATION_MODE' => 'wholemodule'
}
s.source_files = "**/*.{h,m,mm,swift,hpp,cpp}"
end
@@ -0,0 +1,26 @@
import ExpoModulesCore
public class ExpoBlueskySwissArmyModule: Module {
func getDefaults(_ useAppGroup: Bool) -> UserDefaults? {
if useAppGroup {
return UserDefaults(suiteName: "group.app.bsky")
} else {
return UserDefaults.standard
}
}
public func definition() -> ModuleDefinition {
Name("ExpoBlueskySwissArmy")
AsyncFunction("getStringValueAsync") { (key: String, useAppGroup: Bool) in
let defaults = self.getDefaults(useAppGroup)
return defaults?.string(forKey: key)
}
AsyncFunction("setStringValueAsync") { (key: String, value: String?, useAppGroup: Bool) in
let defaults = self.getDefaults(useAppGroup)
defaults?.setValue(value, forKey: key)
}
}
}
@@ -0,0 +1,13 @@
type ExpoBlueskySwissArmyModuleType = {
getStringValueAsync(
key: string,
useAppGroup?: boolean,
): Promise<string | null>
setStringValueAsync(
key: string,
value: string | null,
useAppGroup?: boolean,
): Promise<void>
}
export const ExpoBlueskySwissArmyModule = {} as ExpoBlueskySwissArmyModuleType
@@ -0,0 +1,8 @@
export const ExpoBlueskySwissArmyModule = {
getStringValueAsync(_: string, _?: boolean): Promise<string> {
throw new Error('getStringValueAsync is not available on Android')
},
setStringValueAsync(_: string, _: string | null, _?: boolean): Promise<void> {
throw new Error('setStringValueAsync is not available on Android')
},
}
@@ -0,0 +1,16 @@
import {requireNativeModule} from 'expo-modules-core'
const NativeModule = requireNativeModule('ExpoBlueskySwissArmy')
export const ExpoBlueskySwissArmyModule = {
getStringValueAsync(key: string, useAppGroup = false): Promise<string> {
return NativeModule.getStringValueAsync(key, useAppGroup)
},
setStringValueAsync(
key: string,
value: string | null,
useAppGroup = false,
): Promise<void> {
return NativeModule.setStringValueAsync(key, value, useAppGroup)
},
}
@@ -0,0 +1,8 @@
export const ExpoBlueskySwissArmyModule = {
getStringValueAsync(_: string, _?: boolean): Promise<string> {
throw new Error('getStringValueAsync is not available on web')
},
setStringValueAsync(_: string, _: string | null, _?: boolean): Promise<void> {
throw new Error('setStringValueAsync is not available on web')
},
}
@@ -1,45 +0,0 @@
import React from 'react'
import {makeStarterPackLink} from 'lib/routes/links'
import {useSetCurrentStarterPack} from 'state/preferences/starter-pack'
import {useUsedStarterPacks} from 'state/preferences/used-starter-packs'
import GooglePlayReferrer from '../../../modules/expo-google-play-referrer'
export function useStarterPackEntry() {
const [ready, setReady] = React.useState(false)
const setCurrentStarterPack = useSetCurrentStarterPack()
const usedStarterPacks = useUsedStarterPacks()
React.useEffect(() => {
if (ready) return
;(async () => {
const res = await GooglePlayReferrer.getReferrerInfoAsync()
if (res && res.installReferrer) {
// The `utm_content` parameter should be `starterpack-<name>-rkey>`. Let's try to get it from the parameters
// and create a URI for it if it's valid.
const parts = res.installReferrer.split('&')
const starterPackSource = parts
.find(part => part.startsWith('utm_content='))
?.split('=')[1]
const sourceParts = starterPackSource?.split('-')
if (sourceParts?.length === 3 && sourceParts[0] === 'starterpack') {
// Android doesn't clear the referrer info for a total of 90 days. We want to make sure that we don't
// retrigger this on accident.
// We won't actually set `lastUsedUri` until a _successful_ use of the starter pack, meaning a new account
// has actually completed onboarding with the given starter pack.
const uri = makeStarterPackLink(sourceParts[1], sourceParts[2])
if (!usedStarterPacks?.includes(uri)) {
setCurrentStarterPack({
uri: makeStarterPackLink(sourceParts[1], sourceParts[2]),
})
}
}
}
setReady(true)
})()
}, [ready, setCurrentStarterPack, usedStarterPacks])
return ready
}
@@ -1,13 +0,0 @@
import React from 'react'
export function useStarterPackEntry() {
const [ready, setReady] = React.useState(false)
React.useEffect(() => {
;(async () => {
setReady(true)
})()
}, [])
return ready
}
@@ -0,0 +1,48 @@
import React from 'react'
import {makeStarterPackLink} from 'lib/routes/links'
import {isAndroid} from 'platform/detection'
import {useSetCurrentStarterPack} from 'state/preferences/starter-pack'
import {useUsedStarterPacks} from 'state/preferences/used-starter-packs'
import {SwissArmyKnife} from '../../../modules/expo-bluesky-swiss-army'
import GooglePlayReferrer from '../../../modules/expo-google-play-referrer'
export function useStarterPackEntry() {
const [ready, setReady] = React.useState(false)
const setCurrentStarterPack = useSetCurrentStarterPack()
const usedStarterPacks = useUsedStarterPacks()
React.useEffect(() => {
if (ready) return
;(async () => {
let uri: string | null | undefined
if (isAndroid) {
const res = await GooglePlayReferrer.getReferrerInfoAsync()
if (res && res.installReferrer) {
const parts = res.installReferrer.split('&')
const starterPackSource = parts
.find(part => part.startsWith('utm_content='))
?.split('=')[1]
const sourceParts = starterPackSource?.split('-')
if (sourceParts?.length === 3 && sourceParts[0] === 'starterpack') {
uri = makeStarterPackLink(sourceParts[1], sourceParts[2])
}
}
} else {
uri = await SwissArmyKnife.getStringValueAsync('starterPackUri', true)
}
if (uri && !usedStarterPacks?.includes(uri)) {
setCurrentStarterPack({
uri,
})
}
setReady(true)
})()
}, [ready, setCurrentStarterPack, usedStarterPacks])
return ready
}