# MoveSDKState

Represent the different SDK States.

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

```kotlin
sealed class MoveSdkState {
    Uninitialised()
    Ready()
    Running()
    Error(reason: MoveStateError)
}


MoveStateError { 
    LocationPermissionMissing
    PhonePermissionMissing
    OverlayPermissionMissing
    MotionPermissionMissing;
    
    fun resolved()
}
```

{% endtab %}

{% tab title="iOS" %}

```swift
enum MoveSDKState {
    case unintialized
    case ready
    case running
    case error(StateError)
 
    enum StateError {
        case locationPermissionMissing
        case locationPrecisionPermissionMissing
        case motionPermissionMissing
        case sensorsInvalid
    }
}
```

{% endtab %}

{% tab title="React Native" %}

```javascript
export type SdkState = 'error' | 'uninitialized' | 'ready' | 'running';
```

{% endtab %}
{% endtabs %}

| **MoveState**         |                                                                                                                                                                                                                                                                                                                                          |
| --------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| uninitialized         | The SDK is not initialized.                                                                                                                                                                                                                                                                                                              |
| ready                 | The SDK is initialized and ready to start services. Transited to this state on successful initialization and when services didn't start.                                                                                                                                                                                                 |
| running               | The SDK is running its services. Transited to this state after calling startAutomaticDetection() (in [Android](https://docs.movesdk.com/move-platform/move-sdk-1.x/api-interface/android-1/android#start-automatic-detection) / [iOS](https://docs.movesdk.com/move-platform/move-sdk-1.x/api-interface/ios#start-automatic-detection)). |
| error(MoveStateError) | The SDK is in an error state. Transited to this state in cases of error.                                                                                                                                                                                                                                                                 |

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

| **MoveStateError**        |                                                                                                                                                                                                                                                                       |
| ------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| LocationPermissionMissing | <p>Required location permission is missing.</p><p>(<a href="https://developer.android.com/reference/android/Manifest.permission#ACCESS_FINE_LOCATION"><https://developer.android.com/reference/android/Manifest.permission#ACCESS_FINE_LOCATION></a>)</p>             |
| MotionPermissionMissing   | <p>Required activity recognition permission is missing.</p><p>(<a href="https://developer.android.com/reference/android/Manifest.permission#ACTIVITY_RECOGNITION"><https://developer.android.com/reference/android/Manifest.permission#ACTIVITY_RECOGNITION></a>)</p> |
| PhonePermissionMissing    | <p>Required phone permission is missing.</p><p>(<a href="https://developer.android.com/reference/android/Manifest.permission#READ_PHONE_STATE"><https://developer.android.com/reference/android/Manifest.permission#READ_PHONE_STATE></a>)</p>                        |
| OverlayPermissionMissing  | <p>Required system alert window permission is missing</p><p>(<a href="https://developer.android.com/reference/android/Manifest.permission#SYSTEM_ALERT_WINDOW"><https://developer.android.com/reference/android/Manifest.permission#SYSTEM_ALERT_WINDOW></a>)</p>     |

**Note:** In case of resolving an error, the SDK needs to be notified via *`resolved()`* method of the state-error object.
{% endtab %}

{% tab title="iOS" %}

| **StateError**                     |                                                    |
| ---------------------------------- | -------------------------------------------------- |
| locationPermissionMissing          | Required location permission is missing.           |
| locationPrecisionPermissionMissing | Required location precision permission is missing. |
| motionPermissionMissing            | Required motion permission is missing.             |
| sensorsInvalid                     | Required sensors are not available.                |
| {% endtab %}                       |                                                    |
| {% endtabs %}                      |                                                    |

Upon initializing the SDK, it will evaluate the system's services and required permissions (for [Android](https://docs.movesdk.com/move-platform/move-sdk-1.x/sdk/appendix/android/permission-handling) / [iOS](https://docs.movesdk.com/move-platform/move-sdk-1.x/sdk/appendix/ios/permission-handling)) to activate the SDK detection services requested by the host app in the passed [MoveConfig](https://docs.movesdk.com/move-platform/move-sdk-1.x/sdk/models/moveconfig). The SDK is successfully ready to start its services only if all the required services are available and all the required permissions are granted. **The SDK will not transit to `.ready`** [**MoveSDKState**](https://docs.movesdk.com/move-platform/move-sdk-1.x/sdk/models/movestate) **except when all its requirements are fulfilled.**

Required and optional permissions are determined based on the passed [MoveConfig](https://docs.movesdk.com/move-platform/move-sdk-1.x/sdk/models/moveconfig) on initialization. Check [MoveConfig](https://docs.movesdk.com/move-platform/move-sdk-1.x/sdk/models/moveconfig) and permissions handling ([Android](https://docs.movesdk.com/move-platform/move-sdk-1.x/sdk/appendix/android/permission-handling) / [iOS](https://docs.movesdk.com/move-platform/move-sdk-1.x/sdk/appendix/ios/permission-handling)) for more details about configurations and permission requirements.

**The host app is expected to monitor** [**MoveSDKState**](https://docs.movesdk.com/move-platform/move-sdk-1.x/sdk/models/movestate) **changes via `setSDKStateListener` to handle the** [**MoveSDKState**](https://docs.movesdk.com/move-platform/move-sdk-1.x/sdk/models/movestate) **transitions accordingly.**

When the SDK transits to an error state, it either will be a:

* Permission error: In this case, the host app is expected to handle this missing permission (for [Android](https://docs.movesdk.com/move-platform/move-sdk-1.x/sdk/appendix/android/permission-handling) / [iOS](https://docs.movesdk.com/move-platform/move-sdk-1.x/sdk/appendix/ios/permission-handling)) in its app accordingly. When the missing required permission is granted, the SDK will transit back to `.ready` [MoveSDKState](https://docs.movesdk.com/move-platform/move-sdk-1.x/sdk/models/movestate) waiting to start.
* [MoveAuth](https://docs.movesdk.com/move-platform/move-sdk-1.x/sdk/models/moveauth) Expired: In this case, the host app is expected to fetch a new [MoveAuth ](https://docs.movesdk.com/move-platform/move-sdk-1.x/sdk/models/moveauth)from the SDK server to renew the session.
