> ## Documentation Index
> Fetch the complete documentation index at: https://docs.privy.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Android changelog

> Release notes and changelog for the Privy Android SDK — track new features, bug fixes, and breaking changes.

The release notes for our Android SDK.

<Update label="0.12.0">
  * Promotes 0.12.0-beta.1 release to GA.
</Update>

<Update label="0.12.0-beta.1">
  ### Added

  * Telegram authentication support.
  * Native user signer with P256 signing and MFA handling.
  * Encrypted persistence for user signer key using Google Tink.
  * Lazy WebView initialization for TEE-only users.
  * `/wallets/authenticate` API with HPKE decryption.
  * Developer Tools screen to verify Tink encryption.

  ### Fixed

  * Make `wallet_client_type` nullable in `WalletAccount` deserialization.
  * Resolve namespace collision for AGP 9.0 compatibility.
</Update>

<Update label="0.11.0">
  ### Added

  * Support for binary payloads in `generateAuthorizationSignature`.
</Update>

<Update label="0.10.0">
  ### Added

  * Signer management for embedded wallets:
    * `suspend fun addSigners(signers: List<SignerInput>): Result<Unit>` - Adds signers to an embedded wallet with optional policy IDs
    * `suspend fun removeSigner(signerId: String): Result<Unit>` - Removes a specific signer from an embedded wallet
    * `suspend fun removeAllSigners(): Result<Unit>` - Removes all signers from an embedded wallet
</Update>

<Update label="0.9.2">
  * Promotes 0.9.2-beta.X releases to GA

  ### Added

  * MFA Support
  * Only log user out on session refresh if we get a definitive response from Privy API
  * Automatically attempt to refresh session if auth state is AuthenticatedUnverified
  * Adds `generateAuthorizationSignature` to the user object, enabling client-side signing of requests to the Privy API with [authorization keys](/controls/authorization-keys/using-owners/sign/utility-functions)
</Update>

<Update label="0.9.2-beta.2">
  ### Changed

  * Only log user out on session refresh if we get a definitive response from Privy API
  * Automatically attempt to refresh session if auth state is AuthenticatedUnverified
</Update>

<Update label="0.9.2-beta.1">
  ### Added

  * MFA support. See [docs](https://docs.privy.io/authentication/user-authentication/mfa/overview) for full details.
</Update>

<Update label="0.9.1-beta.1">
  ### Added

  * Connects existing wallet before creating a new one
</Update>

<Update label="0.9.0">
  ### Added

  * Expose user MFA methods
  * Email unlinking support
    * `suspend fun privy.email.unlink(email: String): Result<PrivyUser>` - Unlinks an email from the authenticated user's account
  * SMS unlinking support
    * `suspend fun privy.sms.unlink(phoneNumber: String): Result<PrivyUser>` - Unlinks a phone number from the authenticated user's account

  ### Changed

  * Link methods now return `Result<PrivyUser>` instead of `Result<Unit>`:
    * `suspend fun privy.email.linkWithCode(code: String, email: String?): Result<PrivyUser>`
    * `suspend fun privy.sms.linkWithCode(code: String, phoneNumber: String): Result<PrivyUser>`
    * `suspend fun privy.siwe.link(message: String, signature: String, params: SiweMessageParams, metadata: WalletLoginMetadata?): Result<PrivyUser>`
    * `suspend fun privy.siws.link(message: String, signature: String, params: SiwsMessageParams, metadata: WalletLoginMetadata?): Result<PrivyUser>`
    * `suspend fun privy.passkey.link(relyingParty: String, displayName: String?): Result<PrivyUser>`
  * Unlink methods now return `Result<PrivyUser>` instead of `Result<Unit>`:
    * `suspend fun privy.passkey.unlink(credentialId: String): Result<PrivyUser>`
    * `suspend fun privy.siwe.unlink(address: String): Result<PrivyUser>`
    * `suspend fun privy.siws.unlink(address: String): Result<PrivyUser>`
</Update>

<Update label="0.8.0">
  ### Added

  * Passkey linking and unlinking support
    * `suspend fun privy.passkey.link(relyingParty: String, displayName: String?): Result<Unit>` - Links a passkey to an existing authenticated user's account
    * `suspend fun privy.passkey.unlink(credentialId: String): Result<Unit>` - Unlinks a passkey from the authenticated user's account
</Update>

<Update label="0.7.0">
  ### Added

  * Sign-In with Solana (SIWS) authentication support:
    * `suspend fun privy.siws.generateMessage(params: SiwsMessageParams): Result<String>` - Generates a SIWS message for wallet signing
    * `suspend fun privy.siws.login(message: String, signature: String, params: SiwsMessageParams, metadata: WalletLoginMetadata?): Result<PrivyUser>` - Authenticates user with Solana wallet
    * `suspend fun privy.siws.link(message: String, signature: String, params: SiwsMessageParams, metadata: WalletLoginMetadata?): Result<Unit>` - Links Solana wallet to existing authenticated user
    * `suspend fun privy.siws.unlink(address: String): Result<Unit>` - Unlinks Solana wallet from authenticated user's account
  * Sign-In with Ethereum (SIWE) unlinking support:
    * `suspend fun privy.siwe.unlink(address: String): Result<Unit>` - Unlinks Ethereum wallet from authenticated user's account
  * Solana wallet sign and send transaction support:
    * `signAndSendTransaction(transaction: ByteArray, cluster: SolanaCluster): Result<SolanaSignAndSendTransactionResponse>` - Signs and sends a Solana transaction to the network

  ### Deprecated

  * SIWE method names updated for consistency and brevity:
    * `privy.siwe.generateSiweMessage()` → Use `privy.siwe.generateMessage()` instead
    * `privy.siwe.loginWithSiwe()` → Use `privy.siwe.login()` instead
    * `privy.siwe.linkWithSiwe()` → Use `privy.siwe.link()` instead
    * `privy.siwe.unlinkWallet()` → Use `privy.siwe.unlink()` instead
</Update>

<Update label="0.6.0">
  ### Added

  * Passkey authentication support for secure, passwordless login:
    * `suspend fun privy.passkey.signup(relyingParty: String, displayName: String? = null): Result<PrivyUser>` - Creates a new account and registers a passkey with an optional display name
    * `suspend fun privy.passkey.login(relyingParty: String): Result<PrivyUser>` - Authenticates using an existing passkey

  ### Changed

  * Bumped minimum SDK version from 27 to 28
</Update>

<Update label="0.5.0">
  ### Added

  * Extended `EthereumRpcRequest` companion object with additional convenience methods:
    * `personalSign(message: String, address: String)` - Creates personal\_sign RPC request
    * `secp256k1Sign(hash: String)` - Creates secp256k1\_sign RPC request
    * `ethSign(address: String, message: String)` - Creates eth\_sign RPC request
    * `ethSignTypedDataV4(address: String, typedDataJson: String)` - Creates eth\_signTypedData\_v4 RPC request
    * `ethSignTransaction(transactionJson: String)` - Creates eth\_signTransaction RPC request
    * `ethSendTransaction(transactionJson: String)` - Creates eth\_sendTransaction RPC request
  * Added Solana wallet methods:
    * `signTransaction(transaction: ByteArray): Result<SolanaSignTransactionResponse>` - Signs a Solana transaction
    * `signMessage(message: ByteArray): Result<SolanaSignMessageResponse>` - Signs a Solana message

  ### Deprecated

  * `signMessage(message: String): Result<SolanaSignMessageResponse>` - Use `signMessage(message: ByteArray): Result<SolanaSignMessageResponse>` instead.
</Update>

<Update label="0.4.0">
  ### Added

  * Link SMS
  * Update phone number
  * Update email
</Update>

<Update label="0.3.0">
  ### Added

  * `suspend fun getUser(): PrivyUser?` - awaits ready under the hood, then returns user if authenticated

  ### Deprecated

  * `Privy.user` - Use `suspend fun getUser(): PrivyUser?` instead.
</Update>

<Update label="0.2.0">
  ### Added

  * **Breaking**: Added AuthState.AuthenticatedUnverified
  * `suspend fun getAuthState(): AuthState` - awaits ready under the hood, then returns most up to date AuthState

  ### Changed

  * **Breaking**: Privy.siwe.generateMessage no longer takes in a `WalletLoginMetadata` as it was not unused internally.

  ### Deprecated

  * `func awaitReady() async` in favor of the newly added `suspend fun getAuthState(): AuthState`
</Update>

<Update label="0.1.0-beta.2">
  ### Changed

  * **BREAKING**: LoginWithOauth flow is now entirely managed within the PrivySDK.
    Simply add the PrivyRedirectActivity to your manifest, configure the scheme, and trigger the Oauth login method.
    For full details, see the updated [OAuth documentation](/authentication/user-authentication/login-methods/oauth).
</Update>

<Update label="0.1.0-beta.1">
  ### Added

  * Wallet Management:
    * Added `createAdditional` parameter to `createSolanaWallet` to create multiple Solana wallets
</Update>

<Update label="0.9.0-beta.3">
  ### Fixed

  Minor enhancements
</Update>

<Update label="0.9.0-beta.2">
  ### Added

  Enhanced web view error handling
</Update>

<Update label="0.9.0-beta.1">
  ### Added

  Enhanced network state observability
</Update>

<Update label="0.0.8">
  ### Changed

  * User will not get logged out on refresh call if network is not available. An error is thrown instead.
</Update>

<Update label="0.0.7">
  ### Added

  * Oauth support (Google, Twitter, Discord)

  ### Fixed

  * Support null tokens on authenticate and refresh session
</Update>

<Update label="0.0.6">
  ### Improvements

  * Internal dependency updates.
</Update>
