** Date of release:** 08th February 2023


  • Fix app crash on app start when live data is observed on a background thread


Date of release: 19th December 2022


  • Add helper functions to UnitController to manually trigger BlueIdSDK initialization and synchronization.


Date of release: 3rd August 2022


  • MOB-1088 BlueId opening returns an NoAccessToSecureObjectIdException when no secureObjectId could be found for the cylinder


  • PD-586 Add refresh token api to Authentication Interceptor for Error Handling


Date of release: 12th April 2022


  • initialize AndroidThreeTen in SmartSpacesSdk builder
  • set compileSdk to 31; add permission BLUETOOTH_CONNECT to Manifest


Date of release: 8th April 2022


  • Add missing dependency for RefreshAuthTokenUseCase


Date of release: 7th April 2022


  • Use synchronous-gatt 1.1.3 (that remove the BLUETOOTH_CONNECT permission - that must only be declared when targeting Android 12 or higher - which is not the case at the moment)


Date of release: 6th April 2022


  • MOB-953 remove MyRenz (PostBox)
  • MOB-952 remove push notifications for Intercom


  • MOB-762 make id from ‘InternalAccessPoint’ available in ‘AccessPoint’ interface
  • MOB-638 Increase minSdk version to API 28 (Android 9)
  • MOB-857 sample BleScans (by default) with 2 seconds
  • MOB-961 improve AuthToken parsing and error handling


  • Sync BlueId secureIds periodically
  • MOB-977 initialization of BlueId can fail after login, so we check at every Activity starts if BlueId was initialized


Date of release: 17th January 2022


  • MOB-814 fix Proguard configuration for kotlin-serialization


Date of release: 30th November 2021


  • MOB-516: Log SSLPeerUnverifiedException as error to Timber


Date of release: 15th November 2021


  • Do not report exceptions for UnknownHostException, SocketTimeoutException, ConnectException.
  • MOB-462 set MyRenz opening timeout to 15 seconds
  • MOB-463 block multiple MyRenz openings
  • MOB-252 SmartSpacesSdk.Builder now expects a Set of certificates (String)
  • Upgrade Apollo to 2.4.6


  • Remove constructor in Result.Error that takes a list of Throwable.
  • MOB-343 remove (opt-in) crash reporting to Sentry from SDK
  • Remove deprecated PostBoxController getNearbyPostBoxes(unitId)
  • Remove DebugActivity


Date of release: 3rd November 2021


  • MOB-590 Coroutines that called a Retrofit Api did not handle Exception (ie UnknownHostException, SocketException, SocketTimeoutException, SSLException) properly


Date of release: 15th October 2021


  • MOB-427 synchronize execution of RegisterMobileDeviceMutation to avoid concurrency problems on the backend


Date of release: 31th August 2021


  • MOB-430: should not crash on logout when com.sensorberg.smartspaces:push dependency is not declared


Date of release: 30th August 2021


  • MOB-422: SDK will not crash when com.sensorberg.smartspaces:push dependency is not declared


Date of release: 9th August 2021


  • DEV-2931: fix BlueId cylinders not visible after App restart.


  • DEV-2931: removed isActuatorAvailableNow from IotUnit


Date of release: 20th July 2021


  • TSUP-1060: Fix syncing time for BlueId cylinders.


Date of release: 12th July 2021


  • Fix crash that happened when authenticating the user on backend fails with http error 401 or 403. Now if the authentication fails the user gets logged out on the device.
  • DEV-2608: Fix endless loop when renewal of AuthToken failed. After 3 times the user gets logged out.
  • DEV-2704: Ensure all controller dependencies gets renewed after logout.
  • DEV-2715: SensorbergFirebaseMessagingService did not refresh its own dependencies after logout.


  • DEV-2413
    • UserManager.usernamePasswordLoginLiveData(): LiveData<SimpleResponse<Void>> returns now LiveData<Result<Unit>>
    • Rename UserManager.oAuth2LoginLiveData(): LiveData<SimpleResponse<Void>> to oAuthLoginLiveData, and it returns now LiveData<Result<Unit>>
    • UserManager.externalTokenLoginLiveData(): LiveData<SimpleResponse<Void>> returns now LiveData<Result<Unit>>
  • Migrate UserManager.changePassword to Coroutines
  • DEV-2505: Migrate REST API post request /api/mobile-sdk/v1/user_devices to GraphQl mutation viewerRegisterMobileDevice.
  • Rename oauthId to clientId in SmartSpacesSdk.Builder
  • DEV-2538: explicitly return nullable values in LiveData
  • DEV-2539:
    • remove unnecessary properties connection and bluetoothScan from IotDevice
    • delete unnecessary class ConnectionDetails
  • DEV-2620
  • DEV-2303: added ringDurationInSeconds to Call.Incoming which describes the time a call should ring on the mobile device
  • Report parsing errors that happen in SensorbergFirebaseMessagingService.
  • DEV-2722: LiveData in Controller and Manager interfaces return null after logout.


Date of release: 14th April 2021

  • DEV-2381: Refactor BlueId SDK wrapper:
    • Increased testability.
    • Supporting Coroutines.
  • DEV-2402: Add new mutation for answering intercom calls.
  • DEV-2378: Upgrade Koin to 2.2.2 (this might require changes if you are using Koin)
  • Extract code for push notifications into separate plugin com.sensorberg.smartspaces:push. Please read Push Notification for more information of how to use the push notification plugin.


Date of release: 24th March 2021


  • DEV-2324: For SupportUnitController.getUnits() and SupportUnitController.getUnitsLiveData() you can now pass a samplePeriodInMillis parameter.


Date of release: 23th March 2021


  • DEV-2352: Change push notification identifier.


Date of release: 19th March 2021


  • Rename parameters in BookingManager, from -> endsAfter, to -> startsBefore.
  • Coroutines, use Dispatchers.IO instead of Dispatchers.Default.
  • Coroutines, use Dispatchers.Main.immediate instead of Dispatchers.Main.
  • DEV-2247: In PostBoxController.getNearbyPostBoxes(Long) you can now pass refreshInterval: Long that controls how often PostBoxes should be refreshed from the Backend.
  • App can now enable Kalman-Filter for Bluetooth RSSI noise filtering (next to MotionlessAverage). This feature is yet experimental and can be enabled by calling SmartSpacesSdk.Builder.enableKalmanFilter().


  • DEV-2255: For better error tracking we are using Sentry for receiving centralized crash reports from the SDK. Clients have to opt-in to make this work.
  • All support functions that return Cancelable do now expect a LifecleOwner. This will ensure that the Cancelable will be automatically cancelled on Lifecycle.State.DESTROYED.
  • DEV-2332: Clients can now receive Sensorberg push message by registering SensorbergFirebaseMessagingService. For more information please read this document.


  • DEV-2332: With handling push messages within SensorbergFirebaseMessagingService, the SecurityController got obsolete and is now removed.


Date of release: 16th March 2021


  • Upgrade ObservableData to 1.4.1 that fixes an issue that an item was emitted without checking if the channel was closed.


  • Explicitly expose androidx.lifecycle:lifecycle-livedata-ktx dependency because the SDK exposes LiveData.


Date of release: 9th February 2021


  • TSUP-704: BookingManager.getBookableUnits requires now a ISO8601 timestamp endsAfter. This will give you all bookings that ends after the given timestamp.


Date of release: 29th January 2021


  • TSUP-673: Fix crash when using Magneto Tap opening.


  • DEV-2162: SDK clients can now define their own apduservice.xml and filter for their own AID for NFC openings.
  • DEV-2208: getting AuthToken and PublicKey synchronously, so that registering firebase deviceToken does not run into a deadlock.


  • DEV-2235: PostBoxController.getNearbyPostBoxes() does not need a unitId for filtering.


  • DEV-2235: PostBoxController.getNearbyPostBoxes(unitId).


Date of release: 12th January 2021


  • Building the SDK in SmartSpacesSdk.Builder requires now an instance of Application rather than Context. The reason is an external partner we are using for opening.
  • Clients of the SDK must add maven { url "" } to their build.gradle.
  • DEV-1624: Auto-connect parameter is set to true when connecting to a BLE device.
  • Instead of fixed 20 bytes the number of bytes will be now based on requestedMTU - L2CAP_HEADER_SIZE(4 bytes)
  • TSUP-519: Unknown GATT response errors are now handled gracefully and will not make the SDK crash.
  • TSUP-520: Expect GATT response ending with an optional trailing newline \n.
  • TSUP-321: Catch rare IncompatibleClassChangeError that happens on some devices (Sony, Samsung) on Android 5 and 6.
  • DEV-2004: Added registerPushNotificationToken(pushNotificationToken: String) in UserManager to register device for receiving notification using firebase cloud messaging.
  • DEV-2086: Add SecurityController that offers a function decrypt to decrypt any ByteArray with either public or private key type.
  • DEV-2065: Parameter to in BookingManager.getSchedules() is now nullable. When to is null you will get all Schedules after from.
  • DEV-2109: Migrate to Dokka 1.4

1.7.3 - 2020-11-24


  • DEV-1976: Provide a compatability copy method for NearbyPostBox.

1.7.2 - 2020-11-09


  • TSUP-483: provide externalIdentifier property for class BookableUnit to let the app filter bookings that are not of type locker.

1.7.1 - 2020-11-06


  • TSUP-321: Catch rare IncompatibleClassChangeError exception that happens on some devices (Sony, Samsung) on Android 5 and 6.
  • DEV-1874: Do early check for properties baseUrl and certificate in SmartSpacesSdk.Builder. They can break dependency injection, when a required instance can not be created because of a malformed parameter. And the resulting Stacktrace can be misleading here.

1.7.0 - 2020-09-29


  • Remove the Result wrapper in AuthenticationController. Now you get a Flow<QrCode>.
  • DEV-1647: Update jsonapi-converter to 0.10
  • DEV-1298: In BookingManager.getBookings(), make ‘to’ parameter optional. (Note: Backend is pre-sorting bookings by startsAt).
  • DEV-1241: Update Gatt exception messages (to be more clear on the backend).

1.6.1 - 2020-09-09


  • Use shortened pkaId (12 characters - without underscores).


  • Fix crash with Ble scanner.
  • Fix crash when trying to unregister BroadcastReceiver that was not registered before.

1.6.0 - 2020-08-14

This versions includes a refactoring of the Bluetooth scanner, supporting now Coroutines. It also provides new PostBoxController that scans for nearby MyRenz boxes and opens them.


  • BookingManager has a new function getBookableParameters().
  • PostBoxController offering open() and getNearbyPostBoxes() functions .


  • Renamed LetterBoxController to PostBoxController.
  • BookingManager getSchedules(unitId: String) does not return Result<Schedule> but Result<Paged<TimePeriod>> instead.
  • Removed com.sensorberg.smartspaces.domain.schedule.Schedule. List of TimePeriod and BookableParams are delivered separately.


  • Refactor Bluetooth Scanner, supporting Coroutines.

1.5.3 - 2020-07-02

  • Added: LetterBoxController to open a letter box. This Api experimental and will change in future!

1.5.2 - 2020-06-25

  • Changed: (DEV-950) When Ble opening fails send the error message that is displayed to the user (incl. error code) to the backend.

1.5.1 - 2020-06-19

  • Fixed: (TSUP-124) Bluetooth based opening lead to constant invalid checksum errors

1.5.0 - 2020-06-10

  • Added: query() to GraphQl which lets you execute your custom queries.
  • Added: Result.Error has now a list of Exception which gives more information by printing StackTraces.
  • Added: to BookingManager:
    • getBookings return your bookings with page information.
    • getBookableUnits() return bookable units with page information.
    • getSchedules() gives you the already booked times of a unit.
    • removeBooking() removes a booking with a given ID.
    • createBooking() creates a booking.
  • Added: getRootUnits() to UnitController that gives you all root units.
  • Changed: SmartSpacesSdk.refresh() does not longer expect a vararg. You can either pass a single Refresh or a List<Refresh>.
  • Changed: Renew Authentication Token when its older than 24 hours.
  • Changed: Move com.sensorberg.smartspaces.sdk.model.TimePeriod to com.sensorberg.smartspaces.domain.schedule.TimePeriod.
  • Changed: Remove booking id field from TimePeriod.
  • Changed: Result.onError() gets called with List<Throwable> instead of Result<Error>.
  • Changed: Result.onSuccess() gets called with data of type T instead of Result<Success>.
  • Changed: Result.onLoading() gets called without any parameter instead of Result<Loading>.
  • Deprecated: createBookingLiveData()
  • Deprecated: getMyBookingsLiveData()
  • Deprecated: getSchedulesLiveData()
  • Deprecated: endBookingNowLiveData()
  • Deprecated: deleteBookingLiveData()

1.4.0 - 2020-02-19

  • Added: AuthenticationController that gives you way(s) to authenticate yourself. At the moment it only provide QrCodes.
  • Changed: BookableParams of type Long are now nullable - in case they are not set on the Backend.
  • Changed: Result has now subtypes Loading, Success or Error.
  • Changed: Clients of the SDK must add maven { url "" } repository url to their build.gradle.
  • Changed: Renamed functions in UserManager, BookingManager and UnitController that return LiveData.
  • Deprecated: IotDeviceController.getStatusLiveData(), will be removed from SDK soon
  • Fixed: When trying to login while you already logged in successfully, you will get an IllegalStateException. This prevents having the SDK in a wrong state.
  • Fixed: Publish Kotlin Sources and documentation so they are available in your IDE.

1.3.1 - 2020-01-14

1.3.0 - 2020-01-09

  • Changed: If network fails and only cached data was available the response status will be Response.Status.SUCCESS instead of Response.Status.FAIL.
  • Changed: Increase booking scheduling time frame from 2 to 6 weeks
  • Removed: Testing Module containing TestSdk
  • Added: Support for Kotlin Coroutines. For clients that are not able to use Kotlin Coroutines alternative methods with a callback parameter are provided.
  • In IotDeviceController
    • Changed: getIotDevices() renamed to getIotDevicesLiveData()
    • Changed: execute() renamed to executeLiveData()
    • Changed: getStatus() renamed to getStatusLiveData()
    • Deprecated: getIotDevicesLiveData(), will be removed soon from the SDK
    • Deprecated: executeLiveData(), will be removed soon from the SDK
  • In GraphQl
    • Changed: query() renamed to queryLiveData()
    • Changed: mutate() renamed to mutateLiveData()
    • Deprecated: queryLiveData(), will be removed soon from the SDK
    • Deprecated: mutateLiveData(), will be removed soon from the SDK

1.2.9 - 2019-10-28

  • Changed: GraphQl caching age is controlled by backend

1.2.8 - 2019-10-24

  • Changed: Updated to latest blue-id SDK
  • Changed: Improve blue-id time-sync
  • Fixed: Blue-id battery status handling

1.2.7 - 2019-10-02

  • Changed: Improved logout process, avoid leaked objects
  • Changed: Improved devices removal from nearby list
  • Changed: Preset GraphQL cache expiration

1.2.6 - 2019-09-24

  • Added: BookableParameters to IotUnits
  • Removed: Deprecated NfcHandler. There are no gateways with NFC tags anymore.

1.2.5 - 2019-09-18

  • Added: GraphQl interface
  • Added: Caching layer to GraphQl queries - 2019-09-23

  • Fixed: NullPointerException handling bad formatted NFC data-packs

1.2.4 - 2019-09-11

  • Changed: Update and organization of internal dependencies

1.2.3 - 2019-08-30

  • Fixed: Timber crash when network connection fail

1.2.2 - 2019-08-30

  • Fixed: Change password error message, when operation fail

1.2.1 - 2019-08-29

  • Fixed: GraphQl pooling logic

1.2.0 - 2019-08-23

  • Changed: Updated to Koin 2.0
  • Added: Support for IotDevices using IotDeviceController
  • Added: Locker cluster
  • Deprecated: IotDeviceRequest. Renamed to DeprecatedIotDeviceRequest. Instead use IotDeviceController
  • Deprecated: IotDeviceState. Renamed to DeprecatedIotDeviceState. Instead use IotDeviceController
  • Deprecated: IotDevice. Renamed to DeprecatedIotDevice. Instead use IotDeviceController

1.1.8 - 2019-08-02

  • Fixed: Rare crash on backend response parser
  • Fixed: Uninitialized unit controller status

1.1.7 - 2019-06-20

  • Added: GraphQl Apollo support
  • Fixed: Threading issue on bluetooth connection

1.1.6 - 2019-05-23

  • Changed: Lower Timber.e to Timber.w for catched exceptions

1.1.5 - 2019-05-21

  • Fixed: rare crash on statistics calculation

1.1.4 - 2019-05-16

  • Added: IotUnit debug screen
  • Added: Detekt checks and fixes
  • Fixed: Login process was not changing status to Initializing

1.1.3 - 2019-05-03 (internal release)

  • Fixed: Proguard rules

1.1.2 - 2019-05-02 (internal release)

  • Added: Improved handling of Actuator request and Statistics post.
  • Changed: Updated Gradle Plugin to 3.4.0 and Gradle to 5.1.1
  • Fixed: On rare cases opening process stuck.
  • Fixed: On rare cases backend does not receive actuator request

1.1.1 - 2019-04-18

  • Fixed: Dealing properly when backend sends same actuator in different units

1.1.0 - 2019-04-17

  • Added: NfcActivity, see docs for implementation
  • Added: backendUnitType field to IotUnit class
  • Added: DebugActivity
  • Removed: AbstractNfcActivity
  • Changed: Improved logout handling
  • Changed: Improved NFC handling

1.0.5 - 2019-04-09

  • Fixed: SDK initialize forever when no connection.
  • Changed: Make IotUnit unitId and actuatorId public

1.0.4 - 2019-04-08

  • Fixed: Case when UnitController not scaning for devices, would report as ready, even if bluetooth or location was off.
  • Fixed: Different booking requests and parsing for lockers and doors.
  • Changed: Improved blue-id scan detection on debugGetBlueIdDetails
  • Fixed: Blue-id battery -1 on debugGetBlueIdDetails

1.0.3 - 2019-04-02

  • Fixed: Unit Controller would get stuck on busy when ble fail on a ble-only unit.
  • Fixed: availableNow not properly processed.

1.0.2 - 2019-03-26

  • Changed: calls to do not throw Exception anymore if the controller is not ready. It will return a with an IllegalStateException parameter

1.0.1 - 2019-03-21

  • Fixed: ProGuard rules with new smartspaces package.

1.0.0 - 2019-03-20

  • Changed: renamed from smartworkspace to smartspaces.
    This change affects the maven artifacts, package and class names.

0.11.6 - 2019-03-19

  • Fixed: Executing state of getSchedules() not reporting properly.

0.11.5 - 2019-03-15

  • Fixed: A few different rare crash events.

0.11.4 - 2019-03-13

  • Changed: clean-up, removing unused IotUnit.Types

0.11.3 - 2019-03-13

  • Changed: improve usage of cached data
  • Fixed: IotUnit matching on schedules call

0.11.2 - 2019-03-12

  • Changed: extracted CancellationSignal to its own class

0.11.1 - 2019-03-11

  • Fixed: Backend endpoint changes
  • Changed: refresh() can receive multiple parameters.

0.11.0 - 2019-03-11

  • Changed: API changes on the SDK interface.
  • Added: Added TapController and UserManager
  • Changed: now receives an optional CancellationSignal and returns a normal LiveData with the execution status.
  • Changed: refresh() method accepts optional Refresh enum to include what’s to be refreshed.
  • Changed: Test implementation now is on a separate maven artifact.

0.10.1 - 2019-03-06

  • Changed: Changed to WorkManager 1.0.0.

0.10.0 - 2019-02-28

  • Changed: Moved the whole project to JetPack (androidx) package naming.
  • Fixed: All the internal calls on the SDK now goes through background threads.

0.9.2 - 2019-02-26

  • Fixed: Bluetooth scanning crash when enabling/disabling bluetooth radio

0.9.1 - 2019-02-18

  • Fixed: Bookings id matching

0.9.0 - 2019-01-24

  • Added: Get blue-id details method. This call also fixes blue-id clock if needed
  • Fixed: Crash during logout.
  • Changed: Better handling of encryptiong failure
  • Changed: getUnits() Proximity have been removed in favour of Sorting. Sorting.None is the same as Proximity.All. Sorting.Distance orders the units from closest to furthers, including all the out-of-range IotUnits. The call IotUnit.isNearby() should be used to check if unit is in range or not.

0.8.0 - 2018-12-18

  • Changed: Simplified SDK status. This is a breaking API change. Check the documentation
  • Changed: Updated to Kotlin 1.3.11, Android Gradle Plugin 3.2.1 and Gradle 4.10.3
  • Fixed: Automatic logout when encryption fails
  • Fixed: Failing decryption when Android auto-backup previous data
    • Moved encryptor and preferences to no-backup folder (file-preferences library)
  • Fixed: Unit bookings without actuator-id not getting mapped
  • Changed: moved API calls to /mobile-sdk/ backend endpoints
  • Changed: Improved some Exception messages
  • Fixed: Checks to bluetooth radio status before starting scan