Interacting with Particle Auth on Android using Kotlin
Particle Auth for Android
The Particle Auth Android SDK is the flagship mechanism for integrating Particle's Wallet-as-a-Service within Android applications. This SDK, for most applications, acts as the sole facilitator of integration on Android, built for simplicity. As with the other Particle Auth SDKs, it requires only a few lines of code.
Unlike the Unity SDK and Web SDK, the Android SDK deviates in installation and configuration; these specific intricacies and setup processes are detailed below.
Getting Started
Utilizing the Particle Auth Android SDK is quite straightforward, although it requires a few prerequisite version minimums to get started and ensure compatibility.
Prerequisites
- minSdkVersion 23 or higher.
- minSdkVersion 23 or higher; compileSdkVersion, targetSdkVersion 33 or higher.
- JavaVersion 11.
- Jetpack (AndroidX).
Configuration
Before you begin using the Particle Auth Android SDK, you'll need a few required values that are universal across all Particle Auth SDKs. These values are projectId, clientKey, and appId. All three can be retrieved by heading over to the Particle dashboard and doing the following:
- Sign up/log in to the Particle dashboard.
- Create a new project or enter an existing one.
- Create a new Android application, or skip this step if you already have one.
- Retrieve the project ID (
projectId), the client key (clientKey), and the application ID (appId).
Installation
With a project and application created on the Particle Dashboard, you can move on to installing and initializing ParticleNetwork. For the former, you must begin by declaring the Particle Auth SDK in your Gradle file.
repositories {
google()
mavenCentral()
maven { setUrl("https://jitpack.io") }
//...
}
dependencies {
implementation("network.particle:auth-core:${latest_version}")
// Alternatively, to use Auth Service (deprecated)
// implementation("network.particle:auth-service:${latest_version}")
// Find the latest version of the SDK:
// https://search.maven.org/search?q=g:network.particle
}
For release updates, subscribe to the GitHub repository.
Additionally, you'll need to go ahead and declare specific configurations, such as the insertion of aforementioned values projectId, clientKey, and appId within the relevant AndroidManifest.xml file.
An example of such configuration is attached below- placeholders such as pn_project_id would need to be filled in.
<!-- AuthCore need add android:fullBackupContent -->
<application
tools:replace="android:fullBackupContent"
android:fullBackupContent="@xml/pn_backup_rules"
>
<!-- Particle Auth Service Start (deprecated)
<activity
android:name="com.particle.network.controller.WebActivity"
android:exported="true"
android:launchMode="singleTask"
android:configChanges="orientation|keyboardHidden|screenSize"
android:theme="@style/ThemeAuthWeb">
<intent-filter>
<data android:scheme="pn${pn_app_id}" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
</intent-filter>
</activity>
Particle Auth Service End -->
<!-- Particle AuthCore Start -->
<activity
android:name="com.particle.auth.controller.AuthCoreWebActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:exported="true"
android:launchMode="singleTask"
android:theme="@style/ThemeAuthWeb">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="ac${PN_APP_ID}" />
</intent-filter>
</activity>
<!-- Particle AuthCore End -->
<meta-data
android:name="particle.network.project_id"
android:value="${pn_project_id}" />
<meta-data
android:name="particle.network.project_client_key"
android:value="${pn_project_client_key}" />
<meta-data
android:name="particle.network.app_id"
android:value="${pn_app_id}" />
</application>
Examples of utilization
Initialize the SDK
Upon application startup, ParticleNetwork will need to be initialized to function properly. This can be done by calling the init method on ParticleNetwork and passing in the primary chain you intend to use within your application
class App : Application() {
override fun onCreate() {
super.onCreate()
// Initialize Particle Auth SDK for Ethereum
ParticleNetwork.init(this, Env.PRODUCTION, Ethereum)
// If you're using Solana, initialization looks like this
ParticleNetwork.init(this, Env.PRODUCTION, Solana)
}
}
Switch Chain
To switch the used chain after initial configuration, AuthCore.switchChain is used. This enables asynchronous switching. Similar to the initial configuration.
val chainInfo = ChainInfo.Polygon
AuthCore.switchChain(chainInfo, callback)
// For switching chains synchronously, without checking login status
ParticleNetwork.setChainInfo(chainInfo,callback)
// Alternatively, to use AuthService (deprecated)
ParticleNetwork.switchChain(chainInfo,callback)
Login
ParticleNetwork.login throws the standard login popup, which changes depending on the associated configurations such as loginType (adjacent to the Web SDK's preferredAuthType), supportAuthTypeValues, and so on. This login popup acts as the primary mechanism facilitating account creation and, for existing users, account login.
Specifically, ParticleNetwork.login takes the following parameters:
loginType, the social login method preferred. This supports either 'jwt,' 'email,' 'phone,' 'google,' 'apple,' or 'facebook'.account, if the above is either 'phone,' 'email,' or 'jwt,'accountcan optionally be set to a specified expected email or phone number. If you're using 'jwt,'accountis required and must be set to the relevant JWT.supportLoginTypes, the list of authentication types you'd like to be available through the resulting login popup interface. By default, this will only display the login type chosen throughloginType, although you can add additional methods to the UI, such as 'google,' by passing them intosupportAuthType.prompt, the prompt to be displayed following social login, such as a request to set a master password, payment password, etc. This isnullby default.loginPageConfigConfigure the login page's imagePath、projectName、description.loginCallbackCallback after successful login
AuthCore.connect(loginType,account,supportLoginTypes,prompt,loginPageConfig,loginCallback)
// Alternatively, to use AuthService (deprecated)
// ParticleNetwork.login(
// loginType = LoginType.PHONE,
// account = "", // Optional
// supportAuthTypeValues = SupportAuthType.FACEBOOK.value, // Optional
// loginFormMode = false, // Optional
// prompt = null, // Optional
// loginCallback )
UserInfo and Address Retrieval (post-login)
After the login is successful, detailed user information can be retrieved by calling the following methods.
AuthCore.getUserInfo()
AuthCore.evm.getAddress()
AuthCore.solana.getAddress()
// Alternatively, to use AuthService (deprecated)
// ParticleNetwork.getUserInfo()
// ParticleNetwork.getAddress()
Logout
ParticleNetwork.logout will log a user out of their current session and return them to the previous state before login.
AuthCore.disconnect(object : ResultCallback {
override fun success() {
// Handle success
}
override fun failure() {
// Handle error
}
})
// Alternatively, to use AuthService (deprecated)
// ParticleNetwork.logout(callback)
Is User Logged In
AuthCore.isLogin returns a Boolean based upon the account status of a given session (whether or not a user is logged in with Particle.
AuthCore.isConnected()
// Alternatively, to use AuthService (deprecated)
// ParticleNetwork.isLogin()
Signatures
Once ParticleNetwork has been initialized and a user has successfully logged in, signatures can be proposed for confirmation through a popup; this can be facilitated via a number of different methods:
signAndSendTransaction: Requests a signature for a given transaction and, upon receiving it, sends the transaction and returns the signature.signTransaction: Solana-specific; requests a signature for a given transaction. Upon receiving a signature, it gets immediately returned. A transaction is not automatically sent.signMessage: Requests a signature for a basic message. On EVM chains, this can be passed as a hex-encoded string prefixed by '0x'. For Solana, this can be passed directly as a string.signTypedData: EVM-specific, requests a signature for structured (typed) data-eth_signTypedData. For more information onsignTypedData, see the Web (JavaScript/TypeScript) page.
//evm chains
AuthCore.evm.sendTransaction(transaction, callback)
//solana
AuthCore.solana.signAndSendTransaction(serializedTransaction: Base58String, callback)
// Alternatively, to use AuthService (deprecated)
// ParticleNetwork.signAndSendTransaction(transaction, callback)
AuthCore.solana.signTransaction(serializedTransaction: Base58String, callback)
// Alternatively, to use AuthService (deprecated)
// Expects a base58 string, Solana-specific
// ParticleNetwork.signTransaction(transaction, callback)
// Plural version of the above
// val allTransactions = listOf(tx1, tx2)
// ParticleNetwork.signAllTransactions(allTransactions,callback)
AuthCore.evm.personalSign(hexUnSignedMessage: PrefixedHexString, callback)
AuthCore.solana.signMessage(message: Base58String, callback)
// Alternatively, to use AuthService (deprecated)
//ParticleNetwork.signMessage(message,callback)
AuthCore.evm.signTypedData(data: PrefixedHexString, callback)
// Alternatively, to use AuthService (deprecated)
// Expects hex string prefixed with '0x'
//ParticleNetwork.signTypedData(message, version, callback)
Set Display Wallet (deprecated in Auth Core)
If you'd like to display the full wallet whenever a signature is requested, you can pass true within ParticleNetwork.setDisplayWallet. By default, this is set to false.
// Alternatively, to use AuthService (deprecated)
// ParticleNetwork.setDisplayWallet(true)
Open Web Wallet (deprecated in Auth Core)
If you'd like to open an instance of the Wallet UI (Particle Wallet, a unified mechanism of interacting with accounts generated by ParticleNetwork.login), then you can do so by calling ParticleNetwork.openWebWallet and passing in various chosen configurations.
For specific details regarding custom style configurations, see the Web Wallet reference.
// Alternatively, to use AuthService (deprecated)
// val customStyleJson = """
// {
// "supportAddToken": false,
// "supportChains": [{
// "id": 1,
// "name": "Ethereum"
// },
// {
// "id": 5,
// "name": "Ethereum"
// }
// ]
// }
// """
// ParticleNetwork.openWebWallet(customStyleJson)
Open Account and Security
Additionally, if you'd like to, force the "Account and Security" options to be opened on-screen (from which you can control master passwords, payment passwords, additional accounts, and so on), on the frontend, then you can call AuthCore.openAccountAndSecurity.
AuthCore.openAccountAndSecurity
// Alternatively, to use AuthService (deprecated)
// ParticleNetwork.openAccountAndSecurity()
Set Security Account Config
Within the security settings, specific popups can be set to display upon confirmation or wallet UI entrance. These popups include promptSettingWhenSign, which refers to payment (signature) passwords, and promptMasterPasswordSettingWhenLogin, which refers to a login-based master password.
By default, promptSettingWhenSign is set to 1, which will show the prompt upon the first signature a given account conducts. If it's set to 0, it will never be shown; if it's set to 2, it will be shown upon every signature confirmation.
This same logic applies to promptMasterPasswordSettingWhenLogin, although by default it's set to 0.
ParticleNetwork.setSecurityAccountConfig(
SecurityAccountConfig(
promptSettingWhenSign = 1,
promptMasterPasswordSettingWhenLogin = 2
)
)
Master Password and Payment Password
User can set master password and payment password to protect assets, call auth.changeMasterPassword to set or change master password, call AuthCore.openAccountAndSecurity() to set or change payment password.
// check user has master password or not
AuthCore.hasMasterPassword()
// set or change master password
AuthCore.changeMasterPassword()
// check user has payment password or not
AuthCore.hasPaymentPassword()
// open securiy account page
AuthCore.openAccountAndSecurity()
Language Setting
ParticleNetwork.setAppliedLanguage will forcibly set the language of the text displayed within UI popups initiated by the SDK- this can be either 'en-US', 'ja-JP', 'ko-KR', 'zh-CN', or 'zh-TW'. Additionally, you can call ParticleNetwork.getAppliedLanguage to retrieve the currently active language setting.
// Supports LanguageEnum.EN、LanguageEnum.JA、LanguageEnum.KO、LanguageEnum.ZH_CN、LanguageEnum.ZH_TW
ParticleNetwork.setAppliedLanguage(LanguageEnum.EN)
ParticleNetwork.getAppliedLanguage()
