# RDC Flutter SDK

## Overview

Development Kits (SDKs) for mobile devices named Rabbit Mobile SDK. The Rabbit Mobile SDK will be used for tagging and collecting online data from the mobile application of the Rabbit’s each business unit.

The SDK will be used to collect the online behavior transaction of all Rabbit customers across all its business units and developed into the data analysis and data science model and eventually will be used for data monetization.

## Flow Chart

![Flow Chart](./flow1.png)

## Features

Rabbit Data Online Collection SDK for Flutter provides the following features.

In-line Configuration
We will implement the overridable configuration by an in-line code configuration on the application bootstrap startup.

Caching
The SDK will use cache manager as its in-memory cache to store a device’s static data and MongoDB Realm to keep the tracking data for later use.

Trigger to send data to the API backend
Conditions before being sent to the API backend are checked for CPU, Memory, and Battery. All conditions to pass and SDK send data to the API backend.

## Flow Chart

![Flow Chart](./flow1.png)

## Using the SDK

### Prerequisites

- iOS 13.0 or later.
- Android 8.0 or later.
- Flutter 2 or later.

## Platform Support

| Android | iOS |
| :-----: | :-: |
|   ✔️    | ✔️  |

## Install plugin

    rdc_flutter_sdk: ^0.0.2

## Setup

### Dart Setup

    required use Plugin https://pub.dev/packages/permission_handler

    await Permission.location.request(); // android, IOS
    await Permission.appTrackingTransparency.request(); // IOS only

### Android Setup

    add lines below in AndroidManifest.xml file

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

### IOS Setup

    Info.plist

    <!-- Permission options for the `location` group -->

    <key>NSLocationWhenInUseUsageDescription</key>
    <string>Need location when in use</string>
    <key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
    <string>Always and when in use!</string>
    <key>NSLocationUsageDescription</key>
    <string>Older devices need location.</string>
    <key>NSLocationAlwaysUsageDescription</key>
    <string>Can I have location always?</string>

    <!-- Permission options for the `appTrackingTransparency` -->

    <key>NSUserTrackingUsageDescription</key>
    <string>appTrackingTransparency</string>

    Podfile

    ##dart: PermissionGroup.appTrackingTransparency

    'PERMISSION_APP_TRACKING_TRANSPARENCY=1',

    ##dart: [PermissionGroup.location, PermissionGroup.locationAlways, PermissionGroup.locationWhenInUse]

    'PERMISSION_LOCATION=1',

## Configuration

|                Method |                      Params                       | Remark                                                |
| --------------------: | :-----------------------------------------------: | ----------------------------------------------------- |
|             setAPIKey |                    String key                     | Authentication key                                    |
|      setEncryptionKey |                    String key                     | Encryption key for encryp data support only hive      |
|       setRotationTime |                    int min = 1                    | Loop time for send data to API                        |
| setDataCollectionType |        DataCollectionType type = rotation         | Type send data to API immediately or loop             |
|      setRetentionDays |                   int date = 30                   | Clear all data these sent to API                      |
|    setDeleteAfterSent |                 bool value = true                 | Delete after sent or not.                             |
|        setOfflineMode |                bool value = false                 | Send data to API or not.                              |
|      setRetryOnFailed |                   int time = 3                    | Retries send data to API.                             |
|   setTriggerCondition | int cpu = 0, int memory = 0, int batteryLevel = 0 | Condition for send data to API                        |
|      setSessionExpire |                   int min = 60                    | Session expire minute for forgeground                 |
|  setSessionAutoExpire |                   int min = 30                    | Session will end after inactive time                  |
|            setConsent |                bool? value = null                 | Consent from user                                     |
|     setPermissionMaid |                bool value = false                 | User allow permission for get Maid only Android       |
|   setStorageCondition |        required int min, required int max         | Storage < min not save to local database and send API |
|                       |                                                   | Storage between min - max FIFO data in local database |

## Event Method

|       Method |                                          Params                                           | Remark                            |
| -----------: | :---------------------------------------------------------------------------------------: | --------------------------------- |
|     addEvent | {required String eventName, required String eventValue, Map<dynamic, dynamic>? dataLayer} | Add event log in local database   |
|    getEvents |                                             -                                             | Get list events in local database |
|  uploadEvent |                                             -                                             | Upload list events send to API    |
|     clearAll |                                             -                                             | Delete all                        |
|   clearCache |                                             -                                             | Delete only isSent                |
| sessionStart |                                             -                                             | Start session in sdk              |
|   sessionEnd |                                             -                                             | End session in sdk                |

## Custom Data Layer

    The limitation is that it must be flat JSON only and All object have to varchar type

    addEvent(dataLayer: {
        'custom_field_1': 'custom_field_1',
        'custom_field_2': 'custom_field_2',
    });

## Example

    Future<void> main() async {

        WidgetsFlutterBinding.ensureInitialized();

        await Permission.location.request();
        await Permission.appTrackingTransparency.request();

        var config = RabbitDataConfig(
            apiKey: 'aStdsdJsskdjaolsdYUSsdsdSDijsdkjwe',   // required
            collectionType: DataCollectionType.event,       // default
            rotationTime: 1,                                // default
            retentionDays: 30,                              // default
            retryTime: 3,                                   // default
            deleteAfterSent: true,                          // default
            cpu: 90,                                        // default
            memory: 80,                                     // default
            betteryLevel: 30,                               // default
            consent: null,                                  // default
            permissionMaid: false,                          // default
            isAutoExpire: true,                             // default
            sessionExpire: con.sessionExpireMin,            // default
            sessionAutoExpire: con.autoExpireMin,           // default
            offlineMode: true,                              // default
            storageMin: 1,                                  // default
            storageMax: 5                                   // default
            );
        var rabbitData = await RabbitData.initializeInstance(config);

        await rabbitData.addEvent('init_app', 'init_app');

        runApp(MyApp());

    }

### Trying the example app

1. Clone the repository. `git clone https://bitbucket.org/bssh-rabbit/rdc-flutter-sdk/src/master/example`

2. Open the `Folder` file in Vscode or Android Studio.

3. Cmd the `flutter run` in terminal.

The example app should launch.
