# Easy Tool SDK (App to App)

***

This document will help you integrate and use the Easy Tool SDK in your Android applications.

### Introduction

The Easy Tool SDK is a secure Android SDK designed for seamless communication with Easytool app. It provides a simple API for printing text, raw bytes, images, controlling cash drawers, and managing sessions with type-safe callbacks.

### Installation

#### Gradle

Add the following to your app's `build.gradle` file:

```gradle
dependencies {
    implementation 'sa.easypay:easypay-toolsdk:1.6.0'
}
```

#### Maven

```xml
<dependency>
    <groupId>sa.easypay</groupId>
    <artifactId>easypay-toolsdk</artifactId>
    <version>1.6.0</version>
</dependency>
```

#### Permissions

Ensure the following permissions are added to your `AndroidManifest.xml`:

```xml
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
```

### Getting Started

#### Initialize the SDK

To start using the SDK, initialize it with your subscription number:

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

```kotlin
val initializeListener = object : InitializeListener {
    override fun onInitializeSuccess() {
        // SDK is ready to use
    }
    
    override fun onInitializeError(error: String) {
        // Handle initialization error
    }
}

EasyTool.initialize(this, "your_subscription_number", initializeListener)
```

{% endtab %}

{% tab title="Java" %}

```java
InitializeListener initializeListener = new InitializeListener() {
    @Override
    public void onInitializeSuccess() {
        // SDK is ready to use
    }
    @Override
    public void onInitializeError(String error) {
        // Handle initialization error
    }
};

EasyTool.initialize(this, "your_subscription_number", initializeListener);
```

{% endtab %}
{% endtabs %}

### Printer Selection

Prompt the user to select a printer:

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

```kotlin
val printerSelectListener = object : PrinterSelectListener {
    override fun onPrinterSelected(printerId: String, printerName: String?) {
        // Save printerId for printing
    }
    override fun onPrinterSelectionCancelled() {
        // Handle cancellation
    }
    override fun onPrinterSelectionError(error: String) {
        // Handle error
    }
}

EasyTool.selectPrinter(printerSelectListener)
```

{% endtab %}

{% tab title="Java" %}

```java
PrinterSelectListener printerSelectListener = new PrinterSelectListener() {
    @Override
    public void onPrinterSelected(String printerId, String printerName) {
        // Save printerId for printing
    }
    @Override
    public void onPrinterSelectionCancelled() {
        // Handle cancellation
    }
    @Override
    public void onPrinterSelectionError(String error) {
        // Handle error
    }
};

EasyTool.selectPrinter(printerSelectListener);
```

{% endtab %}
{% endtabs %}

### Core Features

#### Print Operations

* **Print Text**

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

```kotlin
EasyTool.printText(printerId, "Hello World!", printListener)
```

{% endtab %}

{% tab title="Java" %}

```java
EasyTool.printText(printerId, "Hello World!", printListener);
```

{% endtab %}
{% endtabs %}

* **Print Bytes**

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

```kotlin
val escPosBase64 = "G0EAIC" // Example ESC/POS command
EasyTool.printBytes(printerId, escPosBase64, printListener)
```

{% endtab %}

{% tab title="Java" %}

```java
String escPosBase64 = "G0EAIC"; // Example ESC/POS command
EasyTool.printBytes(printerId, escPosBase64, printListener);
```

{% endtab %}
{% endtabs %}

* **Print Image**

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

```kotlin
val base64Image = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5+hHgAHggJ/PchI7wAAAABJRU5ErkJggg=="
EasyTool.printImage(printerId, base64Image, printListener)
```

{% endtab %}

{% tab title="Java" %}

```java
String base64Image = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5+hHgAHggJ/PchI7wAAAABJRU5ErkJggg==";
EasyTool.printImage(printerId, base64Image, printListener);
```

{% endtab %}
{% endtabs %}

* **Open Cash Drawer**

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

```kotlin
EasyTool.openCashDrawer(printerId, printListener)
```

{% endtab %}

{% tab title="Java" %}

```java
EasyTool.openCashDrawer(printerId, printListener);
```

{% endtab %}
{% endtabs %}

#### PrintListener Example

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

```kotlin
val printListener = object : PrintListener {
    override fun onPrintSuccess(result: String?) {
        // Print successful
    }
    override fun onPrintError(error: String) {
        // Print failed
    }
}
```

{% endtab %}

{% tab title="Java" %}

```java
PrintListener printListener = new PrintListener() {
    @Override
    public void onPrintSuccess(String result) {
        // Print successful
    }
    @Override
    public void onPrintError(String error) {
        // Print failed
    }
};
```

{% endtab %}
{% endtabs %}

### Session Management

Sign out and clear all session data:

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

```kotlin
val signOutListener = object : SignOutListener {
    override fun onSignOutSuccess() {
        // Signed out
    }
    override fun onSignOutError(error: String) {
        // Handle error
    }
}

EasyTool.signOut(signOutListener)
```

{% endtab %}

{% tab title="Java" %}

```java
SignOutListener signOutListener = new SignOutListener() {
    @Override
    public void onSignOutSuccess() {
        // Signed out
    }
    @Override
    public void onSignOutError(String error) {
        // Handle error
    }
};

EasyTool.signOut(signOutListener);
```

{% endtab %}
{% endtabs %}

### Advanced Usage

#### Custom Error Handling

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

```kotlin
override fun onInitializeError(error: String) {
    when {
        error.contains("network", ignoreCase = true) -> { /* Handle network error */ }
        error.contains("Subscription number", ignoreCase = true) -> { /* Handle subscription error */ }
        else -> { /* Handle other errors */ }
    }
}
```

{% endtab %}

{% tab title="Java" %}

```java
@Override
public void onInitializeError(String error) {
    if (error.toLowerCase().contains("network")) {
        // Handle network error
    } else if (error.toLowerCase().contains("subscription number")) {
        // Handle subscription error
    } else {
        // Handle other errors
    }
}
```

{% endtab %}
{% endtabs %}

#### Base64 Data Preparation

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

```kotlin
val escPosCommands = byteArrayOf(0x1B, 0x40)
val base64Data = Base64.encodeToString(escPosCommands, Base64.DEFAULT)
EasyTool.printBytes(printerId, base64Data, printListener)
```

{% endtab %}

{% tab title="Java" %}

```java
byte[] escPosCommands = new byte[] { 0x1B, 0x40 };
String base64Data = Base64.encodeToString(escPosCommands, Base64.DEFAULT);
EasyTool.printBytes(printerId, base64Data, printListener);
```

{% endtab %}
{% endtabs %}

### Error Handling

The SDK provides comprehensive error handling with automatic recovery. Initialization failures trigger complete state cleanup, and sign out errors still perform local cleanup.

### Version History

* **1.5.0**: Added robust Easy Tool app installation check and user prompt
* **1.4.0**: Enhanced security, improved error handling
* **1.3.0**: Added sign out functionality, enhanced error recovery, version centralization
* **1.2.0**: Enhanced security, improved error handling
* **1.1.0**: Added Base64 image support, optimized flow
* **1.0.0**: Initial release
