# 메서드

## getStatus

WepinSDK의 Lifecycle 상태 값을 반환합니다.

Parameters

* None

Return Value

* CompletableFutuer\<WepinLifeCycle>
  * NOT\_INITIALIZED: `WepinSDK`이 초기화되지 않음
  * INITIALIZING: `WepinSDK`초기화 진행 중
  * INITIALIZED: `WepinSDK`초기화 완료
  * BEFORE\_LOGIN: `WepinSDK`은 초기화되었으나 사용자는 로그인 되지 않음
  * LOGIN: 사용자가 로그인 되었고 위핀에도 가입되어있음
  * LOGIN\_BEFORE\_REGISTER: 사용자가 로그인하였으나 위핀에 가입되지 않음

Example

{% tabs %}
{% tab title="Java" %}

<pre class="language-java"><code class="lang-java"><strong>CompletableFuture&#x3C;WepinLifeCycle> res = wepinWidget.getStatus()
</strong>res.whenComplete((state, error) -> {
    if (error ==  null) {
        Log.d(TAG, "Wepin SDK Lifecycle is $state");
    } else {
        Log.d(TAG, "loginWithUI error: $error");
    }
});
</code></pre>

{% endtab %}

{% tab title="Kotlin" %}

<pre class="language-kotlin"><code class="lang-kotlin"><strong>val res = wepinWidget.getStatus()
</strong>res?.whenComplete { state, error ->
    if (error == null) {
        Log.d(TAG, "Wepin SDK Lifecycle is $state")
    } else {
        Log.d(TAG, "getStatus error: $error")
    }
</code></pre>

{% endtab %}
{% endtabs %}

***

## loginWithUI

`loginWithUI()` 메서드는 위젯을 사용하여 로그인하는 기능을 제공하며, 로그인된 사용자의 정보를 반환합니다. 사용자가 이미 로그인되어 있는 경우, 위젯을 표시하지 않고 로그인된 사용자의 정보를 바로 반환합니다. 위젯 없이 로그인을 수행하려면, `login` 변수의 `loginWepin()` 메서드를 대신 사용해야 합니다.

Parameters

* `context` \<Context> - 애플리케이션 특정 리소스와 클래스에 대한 접근을 제공하고 애플리케이션 환경에 관한 정보를 제공하기 때문에 Android에서 필수적입니다. 이는 새로운 액티비티를 시작하거나, 애플리케이션 자산에 접근하거나, 시스템 서비스를 검색하는 등의 작업에 사용됩니다.\
  `loginWithUI(context)`와 같은 메서드를 호출할 때는 올바른 작동을 보장하기 위해 적절한 Context(예: `Activity` 또는 `Application context`)를 전달해야 합니다. UI 관련 작업(예: 새 화면 열기)의 경우에는 Activity context를 사용하는 것이 권장됩니다.
* `loginProviders` \<List\<LoginProvider>>\
  위젯을 구성할 로그인 프로바이더들의 목록입니다. 빈 목록이 제공되면 이메일 로그인 기능만 사용할 수 있습니다.
  * `provider`\<String>\
    OAuth 로그인 프로바이더(예: 'google', 'naver', 'discord', 'apple')
  * `clientId`\<String>\
    OAuth 로그인 프로바이더의 클라이언트 ID입니다.
* `email`\<String> *optional*\
  `email` 매개변수는 위젯에서 로그인할 때 지정된 이메일 주소로 로그인할 수 있도록 합니다.

Return Value

* CompletableFuture\<WepinUser>
  * `status` \<String>\
    성공여부<'success'|'fail'>
  * `userInfo` \<WepinUserInfo> *optional*\
    사용자 정보
    * `userId` \<String>\
      Wepin 사용자 ID
    * `email` \<String>\
      Wepin 에 로그인된 사용자의 이메일 주소
    * `provider` \<String>\
      로그인 프로바이더 이름 <'google'|'apple'|'naver'|'discord'|'email'|'external\_toekn'>
    * `use2FA` \<Boolean>\
      사용자 지갑에 2FA가 활성화 되어 있는지 여부
  * `userStatus` \<WepinUserStatus>\
    사용자 상태
    * `loginStatus` \<String>\
      로그인 상태<'complete'|'pinRequired'|'registerRequired'>
    * `pinRequired` \<Boolean> *optional*\
      사용자 PIN 번호 필요 여부
  * `walletId` \<String> optional\
    Wepin 사용자의 지갑 ID
  * `token` \<WepinToken>\
    Wepin Token 정보
    * `accessToken` \<String>\
      Wepin Access Token
    * `refreshToken` \<String>\
      Wepin Refresh Token&#x20;

Example

{% tabs %}
{% tab title="Java" %}

```java
Context context = this;
List<LoginProviderInfo> providers = List.of(new LoginProviderInfo("google", "GOOGLE_CLIENT_ID"));
CompletableFuture<WepinUser> res = wepinWidget.loginWithUI(context, providers, null);
res.whenComplete((user, error) -> {
    if (error ==  null) {
        Log.d(TAG, "Wepin User is $user");
    } else {
        Log.d(TAG, "loginWithUI error: $error");
    }
});
```

{% endtab %}

{% tab title="Kotlin" %}

```kotlin
val res = wepinWidget.loginWithUI(context, providers, email)
res?.whenComplete { wepinUser, error ->
    if (error == null) {
        Log.d(TAG, "Wepin User is $wepinUser")
    } else {
        Log.d(TAG, "loginWithUI error: $error")
    }
```

{% endtab %}
{% endtabs %}

***

## openWidget

위젯 창을 열어줍니다. 사용자가 로그인되어 있지 않으면 위젯 창이 열리지 않으므로, `openWidget`을 호출하기 전에 반드시 사용자가 위핀에 로그인되어 있어야 합니다. 로그인하려면 `loginWithUI` 매서드 또는 `login` 변수의 `loginWepin` 메서드를 사용해야 합니다.

Parameters

* context \<Context>\
  애플리케이션 특정 리소스와 클래스에 대한 접근을 제공하고 애플리케이션 환경에 관한 정보를 제공하기 때문에 Android에서 필수적입니다. 이는 새로운 액티비티를 시작하거나, 애플리케이션 자산에 접근하거나, 시스템 서비스를 검색하는 등의 작업에 사용됩니다.\
  `openWidget(context)`와 같은 메서드를 호출할 때는 올바른 작동을 보장하기 위해 적절한 Context(예: `Activity` 또는 `Application context`)를 전달해야 합니다. UI 관련 작업(예: 새 화면 열기)의 경우에는 Activity context를 사용하는 것이 권장됩니다.

Return Value

* CompletableFuture\<Boolean>

Example

{% tabs %}
{% tab title="Java" %}

```java
Context context = this;
CompletableFuture<Boolean> res = wepinWidget.openWidget(context);
res.whenComplete((result, error) -> {
    if (error ==  null) {
        Log.d(TAG, "openWidget Result is $user");
    } else {
        Log.d(TAG, "openWidget error: $error");
    }
});
```

{% endtab %}

{% tab title="Kotlin" %}

```kotlin
val res = wepinWidget.openWidget(context)
res?.whenComplete { result, error ->
    if (error == null) {
        Log.d(TAG, "openWidget result is $result")
    } else {
        Log.d(TAG, "openWidget error: $error")
    }
```

{% endtab %}
{% endtabs %}

***

## closeWidget

위젯 창을 닫습니다. 창을 닫아도 로그아웃되지 않습니다.

Parameters

* None

Return Value

* None

Example

{% tabs %}
{% tab title="Java" %}

<pre class="language-java"><code class="lang-java"><strong>wepinWidget.closeWidget();
</strong></code></pre>

{% endtab %}

{% tab title="Kotlin" %}

```kotlin
wepinWidget.closeWidget()
```

{% endtab %}
{% endtabs %}

***

## register

사용자를 위에 등록합니다. 가입 및 로그인 후 위핀 위젯의 등록 페이지가 열리며, 위핀 서비스에 등록(지갑 생성 및 계정 생성)을 진행합니다. 이 기능은 `WepinSDK`의 `WepinLifeCycle`이 `loginBeforeRegister` 상태일 때만 사용할 수 있습니다. `loginWithUI` 매서드 또는 `login` 변수의 `loginWepin` 메서드를 호출한 후, `userStatus`의 `loginStatus` 값이 'complete'가 아니면 이 메서드를 호출해야 합니다.

Parameters

* context \<Context>\
  애플리케이션 특정 리소스와 클래스에 대한 접근을 제공하고 애플리케이션 환경에 관한 정보를 제공하기 때문에 Android에서 필수적입니다. 이는 새로운 액티비티를 시작하거나, 애플리케이션 자산에 접근하거나, 시스템 서비스를 검색하는 등의 작업에 사용됩니다.\
  `register(context)`와 같은 메서드를 호출할 때는 올바른 작동을 보장하기 위해 적절한 Context(예: `Activity` 또는 `Application context`)를 전달해야 합니다. UI 관련 작업(예: 새 화면 열기)의 경우에는 Activity context를 사용하는 것이 권장됩니다.

Return Value

* CompletableFuture\<WepinUser>
  * `status` \<String>\
    성공여부<'success'|'fail'>
  * `userInfo` \<WepinUserInfo> *optional*\
    사용자 정보
    * `userId` \<String>\
      Wepin 사용자 ID
    * `email` \<String>\
      Wepin 에 로그인된 사용자의 이메일 주소
    * `provider` \<String>\
      로그인 프로바이더 이름 <'google'|'apple'|'naver'|'discord'|'email'|'external\_toekn'>
    * `use2FA` \<Boolean>\
      사용자 지갑에 2FA가 활성화 되어 있는지 여부
  * `userStatus` \<WepinUserStatus>\
    사용자 상태
    * `loginStatus` \<String>\
      로그인 상태<'complete'|'pinRequired'|'registerRequired'>
    * `pinRequired` \<Boolean> *optional*\
      사용자 PIN 번호 필요 여부
  * `walletId` \<String> optional\
    Wepin 사용자의 지갑 ID
  * `token` \<WepinToken>\
    Wepin Token 정보
    * `accessToken` \<String>\
      Wepin Access Token
    * `refreshToken` \<String>\
      Wepin Refresh Token&#x20;

Example

{% tabs %}
{% tab title="Java" %}

```java
Context context = this;
CompletableFuture<WepinUser> res = wepinWidget.register(context);
res.whenComplete((wepinUser, error) -> {
    if (error ==  null) {
        Log.d(TAG, "Wepin User is $wepinUser");
    } else {
        Log.d(TAG, "register error: $error");
    }
});
```

{% endtab %}

{% tab title="Kotlin" %}

```kotlin
val res = wepinWidget.register(context)
res?.whenComplete { wepinUser, error ->
    if (error == null) {
        Log.d(TAG, "Wepin User is $wepinUser")
    } else {
        Log.d(TAG, "register error: $error")
    }
```

{% endtab %}
{% endtabs %}

***

## getAccounts

앱에서 사용 가능한 사용자의 계정 정보(네트워크와 주소)를 반환합니다. 이 기능은 위핀에 로그인한 후에만 사용할 수 있습니다. 파라미터가 없는 경우에는 사용자의 모든 계정 정보가 반환됩니다.

Parameters

* `networks` \<List\<String>> optional\
  반환받고자 하는 계정의 네트워크입니다. 네트워크로 지원하는 블록체인 목록은 아래 지원 블록체인 페이지에서 확인 가능합니다.
* `withEoa` \<Boolean> optional\
  AA 계정이 있는 경우, EOA 계정도 포함하여 반환할지 여부를 지정합니다.

{% content-ref url="../../../wepin/supported-blockchains" %}
[supported-blockchains](https://docs.wepin.io/wepin/supported-blockchains)
{% endcontent-ref %}

Return Value

* CompletableFuture\<List\<WepinAccount>>
  * `address` \<String>\
    사용자 계정의 주소
  * `network` \<String>\
    사용자 계정의 네트워크 종류
  * `contract` \<String> *optional*\
    토큰의 Contract 주소
  * `isAA` \<Boolean> *optional*\
    AA 계정인지 여부

Example

{% tabs %}
{% tab title="Java" %}

<pre class="language-java"><code class="lang-java">List&#x3C;String> networks = List.of("Ethereum", "Kaia");
<strong>CompletableFuture&#x3C;List&#x3C;WepinAccount>> res = wepinWidget.getAccounts(networks, null);
</strong>res.whenComplete((result, error) -> {
    if (error ==  null) {
        Log.d(TAG, "WepinAccount List is $result");
    } else {
        Log.d(TAG, "getAccounts error: $error");
    }
});
</code></pre>

{% endtab %}

{% tab title="Kotlin" %}

```kotlin
val res = wepinWidget.getAccounts(networks)
res?.whenComplete { accounts, error ->
    if (error == null) {
        Log.d(TAG, "Account List is $accounts")
    } else {
        Log.d(TAG, "getAccounts error: $error")
    }
```

{% endtab %}
{% endtabs %}

***

## getBalance

정의 잔액(수량) 정보를 반환합니다. 이 기능은 위핀에 로그인한 후에만 사용할 수 있습니다. `accounts` 파라미터가 없는 경우에는 사용자의 모든 계정의 잔액이 반환됩니다.

Parameters

* `accounts` \<List\<WepinAccount>> *optional*
  * `network` \<String>\
    잔액을 조회할 사용자 계정의 네트워크 종류
  * `address` \<String>\
    잔액을 조회할 사용자 계정의 주소
  * `isAA` \<Boolean> *optional*\
    AA계정인지 여부

Return Value

* CompletableFuture\<List\<WepinAccountBalanceInfo>>
  * `network` \<String>\
    사용자 계정의 네트워크 종류
  * `address` \<String>\
    사용자 계정의 주소
  * `symbol` \<String>\
    네트워크 심볼
  * `balance` \<String>\
    보유하고 있는 네트워크 코인의 수량
  * `token` \<List\<WepinTokenBalanceInfo>>
    * `symbol` \<String>\
      토큰 심볼
    * `balance` \<String>\
      보유하고 있는 토큰의 수량
    * `contract` \<String>\
      토큰 Contract 주소소

Example

{% tabs %}
{% tab title="Java" %}

```java
CompletableFuture<List<WepinAccountBalanceInfo>> res = wepinWidget.getBalance(accounts);
res.whenComplete((result, error) -> {
    if (error ==  null) {
        Log.d(TAG, "Balances is $result");
    } else {
        Log.d(TAG, "getBalance error: $error");
    }
});
```

{% endtab %}

{% tab title="Kotlin" %}

```kotlin
val res = wepinWidget.getBalance()
res?.whenComplete { balance, error ->
    if (error == null) {
        Log.d(TAG, "Balance is $balance")
    } else {
        Log.d(TAG, "getBalance error: $error")
    }
```

{% endtab %}
{% endtabs %}

***

## getNFTs

사용자의 NFT를 반환합니다. 이 기능은 위핀에 로그인한 후에만 사용할 수 있습니다. `networks`파라미터가 없는 경우에는 사용자의 모든 NFT 정보가 반환됩니다.

Parameters

* `refresh` \<Boolean>\
  NFT 데이터를 온체인에서 새로 조회할지 여부
* `networks` \<List\<String>> optional\
  NFT 를 필터링할 네트워크 이름 목록

Return Value

* CompletableFuture\<List\<WepinNFT>>
  * `account` \<WepinAccount>
    * `address` \<String>\
      사용자 계정의 주소
    * `network` \<String>\
      사용자 계정의 네트워크 종류
    * `contract` \<String> *optional*\
      토큰의 Contract 주소
    * `isAA` \<Boolean> *optional*\
      AA 계정인지 여부
  * contract \<WepinNFTContract>
    * `name` \<String>\
      NFT Contract 이름
    * `address` \<String>\
      NFT Contract 주소
    * `scheme` \<String>\
      NFT의 스킴
    * `description` \<String> *optional*\
      NFT Contract의 설명
    * `network` \<String>\
      NFT Contract 와 연결된 네트워크
    * `externalLink` \<String> *optional*\
      NFT Contract와 관련된 외부 링크
    * `imageUrl` \<String> *optional*\
      NFT Contract와 관련된 이미지 URL
  * `name` \<String>\
    NFT 이름
  * `description` \<String>\
    NFT 의 설명
  * `externalLink` \<String>\
    NFT 와 관련된 외부 링크
  * `imageUrl` \<String>\
    NFT 와 관련된 이미지 URL
  * `contentUrl` \<String> *optional*\
    NFT와 연결된 콘텐츠의 URL
  * `quantity` \<Int> *optional*\
    NFT의 수량
  * `contentType` \<String>\
    NFT 의 콘텐츠 유형<'image'|'video'>
  * `state` \<Int>\
    NFT의 상태

Example

{% tabs %}
{% tab title="Java" %}

```java
CompletableFuture<List<WepinNFT>> res = wepinWidget.getNFTs(true, null);
res.whenComplete((result, error) -> {
    if (error ==  null) {
        Log.d(TAG, "NFT List is $result");
    } else {
        Log.d(TAG, "getNFTs error: $error");
    }
});
```

{% endtab %}

{% tab title="Kotlin" %}

```kotlin
val res = wepinWidget.getNFTs(true)
res?.whenComplete { nfts, error ->
    if (error == null) {
        Log.d(TAG, "Wepin NFT List is $nfts")
    } else {
        Log.d(TAG, "getNFTs error: $error")
    }
```

{% endtab %}
{% endtabs %}

***

## send

위젯을 이용하여 send기능을 수행하고 send 트랜젝션의 ID정보를 반환합니다. 이 기능은 위핀에 로그인한 후에만 사용할 수 있습니다.

Parameters

* context \<Context>\
  애플리케이션 특정 리소스와 클래스에 대한 접근을 제공하고 애플리케이션 환경에 관한 정보를 제공하기 때문에 Android에서 필수적입니다. 이는 새로운 액티비티를 시작하거나, 애플리케이션 자산에 접근하거나, 시스템 서비스를 검색하는 등의 작업에 사용됩니다.\
  `send(context)`와 같은 메서드를 호출할 때는 올바른 작동을 보장하기 위해 적절한 Context(예: `Activity` 또는 `Application context`)를 전달해야 합니다. UI 관련 작업(예: 새 화면 열기)의 경우에는 Activity context를 사용하는 것이 권장됩니다.
* `account` \<WepinAccount>
  * `address` \<String>\
    사용자 계정의 주소
  * `network` \<String>\
    사용자 계정의 네트워크 종류
  * `contract` \<String> *optional*\
    토큰의 Contract 주소
  * `isAA` \<Boolean> *optional*\
    AA 계정인지 여부
* txData \<WepinTxData> *optional*
  * `toAddress` \<String>\
    전송 받을 주소
  * `amount` \<String>\
    전송할 수량

Return Value

* CompletableFuture\<WepinSendResponse>
  * `txId` \<String>\
    send 트랜젝션의 txID

Example

{% tabs %}
{% tab title="Java" %}

```java
Context context = this;
CompletableFuture<WepinSendResponse> res = wepinWidget.send(context, account);
res.whenComplete((sendResult, error) -> {
    if (error ==  null) {
        Log.d(TAG, "Send Result is $sendResult");
    } else {
        Log.d(TAG, "send error: $error");
    }
});
```

{% endtab %}

{% tab title="Kotlin" %}

```kotlin
val res = wepinWidget.send(context, account, txData)
res?.whenComplete { result, error ->
    if (error == null) {
        Log.d(TAG, "Send Result is $result")
    } else {
        Log.d(TAG, "send error: $error")
    }
```

{% endtab %}
{% endtabs %}

***

## receive

`receive` 메서드는 지정된 계정과 연관된 계정 정보 페이지를 엽니다. 이 메서드는 위핀에 로그인한 후에만 사용할 수 있습니다.

Parameters

* context \<Context>\
  애플리케이션 특정 리소스와 클래스에 대한 접근을 제공하고 애플리케이션 환경에 관한 정보를 제공하기 때문에 Android에서 필수적입니다. 이는 새로운 액티비티를 시작하거나, 애플리케이션 자산에 접근하거나, 시스템 서비스를 검색하는 등의 작업에 사용됩니다.\
  `receive(context)`와 같은 메서드를 호출할 때는 올바른 작동을 보장하기 위해 적절한 Context(예: `Activity` 또는 `Application context`)를 전달해야 합니다. UI 관련 작업(예: 새 화면 열기)의 경우에는 Activity context를 사용하는 것이 권장됩니다.
* `account` \<WepinAccount>
  * `address` \<String>\
    사용자 계정의 주소
  * `network` \<String>\
    사용자 계정의 네트워크 종류
  * `contract` \<String> *optional*\
    토큰의 Contract 주소
  * `isAA` \<Boolean> *optional*\
    AA 계정인지 여부

Return Value

* CompletableFuture\<WepinReceiveResponse>
  * `account` \<WepinAccount>
    * `address` \<String>\
      사용자 계정의 주소
    * `network` \<String>\
      사용자 계정의 네트워크 종류
    * `contract` \<String> *optional*\
      토큰의 Contract 주소
    * `isAA` \<Boolean> *optional*\
      AA 계정인지 여부

Example

{% tabs %}
{% tab title="Java" %}

```java
Context context = this;
CompletableFuture<WepinReceiveResponse> res = wepinWidget.receive(context, account);
res.whenComplete((result, error) -> {
    if (error ==  null) {
        Log.d(TAG, "Receive Result is $result");
    } else {
        Log.d(TAG, "receive error: $error");
    }
});
```

{% endtab %}

{% tab title="Kotlin" %}

```kotlin
val res = wepinWidget.receive(context, account)
res?.whenComplete { result, error ->
    if (error == null) {
        Log.d(TAG, "Receive Result is $result")
    } else {
        Log.d(TAG, "receive error: $error")
    }
```

{% endtab %}
{% endtabs %}

***

## finalize

```kotlin
wepinWidget.finalize()
```

Wepin Widget SDK 사용을 종료합니다.

### **Parameters**

* None

### **Return Value**

* None

### **Example**

{% tabs %}
{% tab title="Java" %}

```java
wepinWidget.finalize();
```

{% endtab %}

{% tab title="Kotlin" %}

```kotlin
wepinWidget.finalize()
```

{% endtab %}
{% endtabs %}

## login

#### `WepinWidget` 에 통합된 `WepinLogin` 을 사용하지 않고 별도의 `WepinLogin`을 사용할 때, 두 SDK 의 버전이 동일하지 않은 경우 에러가 발생할 수 있습니다.

`login` 변수는 다양한 인증 방법을 포함한 위핀 로그인 라이브러리로, 사용자가 여러 방식으로 로그인할 수 있도록 합니다. 이메일 및 비밀번호 로그인, OAuth 프로바이더 로그인, ID Token 또는 Access Token을 사용한 로그인 등을 지원합니다. 각 메서드에 대한 자세한 정보는 공식 라이브러리 문서 [Login Library 가이드](https://docs.wepin.io/widget-integration/android-java-and-kotlin-sdk/login-library)에서 확인할 수 있습니다.

### **Available Methods**

* [`loginWithOauthProvider`](https://docs.wepin.io/widget-integration/ios-swift-sdk/login-library/methods#loginwithoauthprovider)
* [`signUpWithEmailAndPassword`](https://docs.wepin.io/widget-integration/ios-swift-sdk/login-library/methods#signupwithemailandpassword)
* [`loginWithEmailAndPassword`](https://docs.wepin.io/widget-integration/ios-swift-sdk/login-library/methods#loginwithemailandpassword)
* [`loginWithIdToken`](https://docs.wepin.io/widget-integration/ios-swift-sdk/login-library/methods#loginwithidtoken)
* [`loginWithAccessToken`](https://docs.wepin.io/widget-integration/ios-swift-sdk/login-library/methods#loginwithaccesstoken)
* [`getRefreshFirebaseToken`](https://docs.wepin.io/widget-integration/ios-swift-sdk/login-library/methods#getrefreshfirebasetoken)
* [`loginWepin`](https://docs.wepin.io/widget-integration/ios-swift-sdk/login-library/methods#loginwepin)
* [`getCurrentWepinUser`](https://docs.wepin.io/widget-integration/ios-swift-sdk/login-library/methods#getcurrentwepinuser)
* [`logout`](https://docs.wepin.io/widget-integration/ios-swift-sdk/login-library/methods#logoutwepin)

이 메서드들은 다양한 로그인 시나리오를 지원하며, 필요에 맞는 적절한 방법을 선택할 수 있습니다.

**Exception**

* [WepinError](https://docs.wepin.io/widget-integration/flutter-sdk/widget/methods#wepinerror)

**Example**

Copy

<pre class="language-kotlin"><code class="lang-kotlin"><strong>// OAuth Provider를 사용한 로그인
</strong>wepinSDK.login.loginWithOauthProvider("google", "your-client-id")
    .thenCompose { authResult ->
        // ID Token을 사용한 로그인
        wepinSDK.login.loginWithIdToken(authResult.idToken)
    }.thenCompose { idTokenResult ->
        // 위핀에 로그인
        wepinSDK.login.loginWepin(idTokenResult)
    }.thenAccept { user ->
        Log.d("WepinSDK", "로그인 성공! 사용자 정보: $user")
    }.exceptionally { e ->
        Log.e("WepinSDK", "로그인 실패: ${e.message}", e)
        null
    }

// 이메일 및 비밀번호로 회원가입 및 로그인
wepinSDK.login.signUpWithEmailAndPassword(
    email = 'example@example.com', 
    password = 'password123'
).thenAccept { signUpResult ->
    Log.d("WepinSDK", "로그인 성공! 사용자 정보: $user")
}.exceptionally { error ->
    if (error is WepinError) {
    }
}

// 현재 로그인된 사용자 가져오기
var currentUser = wepinSDK.login.getCurrentWepinUser()
    .thenAccept { user ->
        Log.d("WepinSDK", "현재 사용자: $user")
    }.exceptionally { e ->
        Log.e("WepinSDK", "사용자 가져오기 실패", e)
        null
    }

// 로그아웃
wepinSDK.login.logout()
    .thenAccept { result ->
        Log.d("WepinSDK", "로그아웃 결과: $result")
    }.exceptionally { e ->
        Log.e("WepinSDK", "로그아웃 실패", e)
        null
    }    
</code></pre>
