Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.solanamobile.mobilewalletadapter.reactnative
import android.app.Activity
import android.content.ActivityNotFoundException
import android.content.Intent
import android.content.pm.PackageManager
import android.net.Uri
import android.util.Log
import com.facebook.react.bridge.*
Expand Down Expand Up @@ -97,6 +98,7 @@ class SolanaMobileWalletAdapterModule(reactContext: ReactApplicationContext) :
}
try {
val uriPrefix = config?.getString("baseUri")?.let { Uri.parse(it) }
val packageName = config?.getString("packageName")
val localAssociation =
LocalAssociationScenario(
CLIENT_TIMEOUT_MS,
Expand All @@ -107,6 +109,7 @@ class SolanaMobileWalletAdapterModule(reactContext: ReactApplicationContext) :
localAssociation.port,
localAssociation.session
)
packageName?.let { intent.setPackage(it) }
withContext(Dispatchers.Main) {
sessionTaskId = headlessJsTaskContext.startTask(sessionBackgroundTaskConfig)
}
Expand Down Expand Up @@ -223,6 +226,25 @@ class SolanaMobileWalletAdapterModule(reactContext: ReactApplicationContext) :
} ?: throw NullPointerException("Tried to end a session without an active session")
}

@ReactMethod
override fun getInstalledWallets(promise: Promise) {
try {
val queryIntent = Intent(Intent.ACTION_VIEW, Uri.parse("solana-wallet://"))
val pm = reactApplicationContext.packageManager
val resolveInfos = pm.queryIntentActivities(queryIntent, PackageManager.MATCH_ALL)
val result: WritableArray = WritableNativeArray()
for (info in resolveInfos) {
val map: WritableMap = WritableNativeMap()
map.putString("packageName", info.activityInfo.packageName)
map.putString("appName", info.loadLabel(pm).toString())
result.pushMap(map)
}
promise.resolve(result)
} catch (e: Throwable) {
promise.reject("ERROR_QUERY_WALLETS", e)
}
}

private fun cleanup() {
sessionState = null
associationResultCallback = null
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,6 @@ internal constructor(context: ReactApplicationContext) : ReactContextBaseJavaMod
abstract fun invoke(method: String, params: ReadableMap?, promise: Promise)

abstract fun endSession(promise: Promise)

abstract fun getInstalledWallets(promise: Promise)
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
import { TurboModule, TurboModuleRegistry } from 'react-native';

export interface Spec extends TurboModule {
startSession(config?: { baseUri?: string }): Promise<{
startSession(config?: { baseUri?: string; packageName?: string }): Promise<{
protocol_version: 'legacy' | 'v1';
}>;

invoke(method: string, params: Object | undefined): Promise<Object>;

endSession(): Promise<boolean>;

getInstalledWallets(): Promise<Array<{ packageName: string; appName: string }>>;
}

export default TurboModuleRegistry.getEnforcing<Spec>('SolanaMobileWalletAdapter') as Spec;