6.25.6
 - Fix an issue where notification sounds were always routed to the earpiece by default during the ringing phase.
 - Fix an edge case where a call with multiple callees could be incorrectly marked as established even
   though it never truly established with the specific peer that accepted the call.
 - Add Potential fix for an ANR and OOM that could occur during periodic SDK maintenance operations.
 - Improve SDK size footprint. Binary size has been reduced for all supported architectures. As an example,
   arm64-v8a was reduced from 4.81 MB to 4.62 MB.

6.24.5
 - Improve SDK size footprint. Binary size has been reduced for all supported architectures. As an example,
   arm64-v8a was reduced from 5.17 MB to 4.81 MB.
 - Fixed an issue that could cause an ANR error when changing the AudioManager mode during call state transitions.
 - Improve internal process of exchanging errors between the peers.

6.23.4
 - Changed: Updated the logic for emitting managed push notifications. Managed push notifications are now emitted to any
   callee that supports them, even if the caller did not enable managed push support (did not provide push configuration
   when creating the Sinch client).
 - Handle gracefully any critical errors during WebRTC initialisation of audio related components. If such error
   occurs the call is terminated with appropriate error (codes: AudioRecordInitFailed - 3500,
   AudioRecordStartFailed - 3501, AudioTrackInitFailed - 3502, AudioTrackStartFailed - 3503) and `FAILURE` end cause.

6.22.5
 - Improve `CallListener.onCallAnswered` execution logic. For the callee it is now invoked immediately after accepting
 the call.
 - Improve the internal flow related to notifying peers about the establishment process.

6.21.4
 - Add support for Maven Central distribution. See https://developers.sinch.com/docs/in-app-calling/sdk-downloads for
   more information.

6.20.3
 - Fix an issue where toggling the speaker did not work correctly when AAR was enabled.

6.19.6
 - Fix a bug that could cause a crash inside `PubNubListener.handleData`.

6.18.4
 - Improve internal `PeerConnectionClientFactory` and `PeerConnectionFactory` lifecycle management, reducing call
   initialization time.

6.17.5
 - Fix potential ANR caused by fetching the device ID during `UserController` initialization. Improve device id
   generation logic.

6.16.3
 - Improve Automatic Audio Routing (AAR) functionality by moving internal logic to background thread.

6.15.3
 - Recreate local instance when a 401 Unauthorized response with internal error code 1104 is received from OCRA.

6.14.5
 - Support 16 KB page sizes. See https://developer.android.com/guide/practices/page-sizes for more information.
 - Allow building SinchClient on a background thread. Note that this may change the thread on which Sinch callbacks are
   invoked. See `SinchClientBuilder.callbackHandler(callbackHandler: Handler)` documentation for more information.
 - Add `SinchClientBuilder.callbackHandler(callbackHandler: Handler)` to allow controlling the thread on which Sinch
   callbacks are invoked.

6.13.4
 - Update WebRTC to M131.
 - Fix a bug that could cause `CallControllerListener.onIncomingCall` being incorrectly invoked when 2 peers
   attempted to call each other simultaneously.

6.12.7
 - Fix a bug which caused internal Sinch client configuration not to be always updated on client startup.
 - Fix a bug that could cause `IllegalArgumentException` being thrown when AAR mode was enabled.
 - Improve resource cleanup process when the call ends.
 - Fix a bug that caused `RejectedExecutionException` being thrown inside `MissingMediaStreamWarningController` when call
   has ended.

6.11.3
 - Fix a bug that caused unnecessary invocation of `initPlayout` and `initRecording` methods after the call has ended
   and could cause application to crash.
 - Improve initialization process of Sinch client. Postpone video subcomponents initialization until video call is
   created.

6.10.22
 - Improve handling of extending instance expiry.
 - Fix an issue causing wrong ICE states being assigned when multiple B sides were involved in the call.
 - Add `CallController.setWebRtcCallConfiguration(WebRtcCallConfiguration)` allowing to filter ICE candidates used
   when creating the peer connection.
 - Issue call quality warning events exclusively after the call is established.
 - Expose `CallDetails.progressedTime`, `CallDetails.rungTime` and `CallDetails.answeredTime`.
 - Add `CallState.Answered`. This state is reached when the call has been answered by the callee
   but the media (ICE) didn't connect yet.
 - Improve logic connected with cleanup of audio resources once the call is over.
 - Add `CallListener::onCallRinging` callback. It is invoked for the caller only, once the callee receives the call
   (receives the push notification and propagates is to Sinch SDK).
 - Deprecate `UserController`. Build and start `SinchClient` directly instead of registering a user via `UserController`.
 - Improve handling of updating instance expiry when using UserController.
 - Improve Sinch DB initialization process. Provide more detailed description of possible failure during it's setup.

6.9.19
 - Fix a bug that could cause setting wrong call results for an incoming call.
 - Add `CallListener::onCallAnswered` callback. It is invoked when the callee answers the call. See CallListener documentation for more information
 - Change `CallListener::onCallEstablished` callback invocation logic. It is now triggered when the callee answered the
   call and media connection is established. See CallListener documentation for more information.
 - Add internal reporting of ICE candidate pairs.
 - Add 'ZeroAudioLevelWarningEvent' call quality warning event.
 - Adjust `ConstantAudioLevelWarning` time span threshold (increased from 8 to 20 seconds).
 - Fix bug that caused `startTime` property of the call details to be incorrectly set for the B side
   when it was the callee that terminated the call.
 - Add `Call.qualityController` property for accessing call quality controller for given call. Deprecate
   `Experimental.callController`.
 - Improve ICE exchange process during the call setup, resulting in reducing `missingMediaStream` warnings being
 triggered and then fastly recovered during initial seconds of the call.
 - Fix bug that caused AAR implementation on pre Android 31 devices to ignore use `useSpeakerphoneState` parameter.

6.8.33
 - Fix issue that prevented consumer APP from getting audio focus during active VoIP call.
 - Add `UserController.setSinchLogCallback` method. It is now possible to access Sinch SDK logs at UserController
   level before creating Sinch client. Ignore the change if you're not using UserController as a standalone component.
 - Improve automatic routing logic. On Android 31+ devices this functionality no longer requires any `BLUETOOTH`
   permissions. You still need to request it on lower APIs if you app supports them. See `AudioController` docs for more
   information.
 - Refactor `setRespectNativeCalls` method to `fun setRespectNativeCalls(onIncomingSinchCall: Boolean, duringSinchCall: Boolean = false)`
   Auto denial of incoming Sinch call when GSM call is active no longer requires `android.permission.READ_PHONE_STATE`
   permission. See `CallController` docs for more information about `setRespectNativeCalls` method changes.
 - Bump `minSdkVersion` to 21.
 - Add `CallController.setRespectVoIPCalls(onIncomingSinchCall: Boolean, duringSinchCall: Boolean = false)`. See
   `CallController` docs for more information about that functionality.
 - Add filtering of WARN & ERROR level WebRTC messages that are related to WebRTC internal issues that are handled
 gracefully. If you intend to see all WebRTC logs set `SinchLogger.minLogLevel` to `LogLevel.TRACE`.

6.7.11
 - Improve process of initializing video calling connected components (EGL). They are now lazily created
   only when needed (video calling is used).
 - Improve way of handling log messages:
    * Add `onLogMessage(level: Int, area: String, message: String, throwable: Throwable?)`callback. SDK can now pass an
      optional 'throwable' to log, if the message is bound with some specific JVM error.
    * Deprecate `onLogMessage(level: Int, area: String, message: String)` callback.
   All log messages are now emitted by those callbacks. Your application should implement only one of it as both
   callbacks are fired when Sinch SDK issues log message.
   See 'SinchLogger.minLogLevel' property to adjust logging level.

6.6.2
 - Fix bug causing potential signalling problems during ongoing call.

6.5.3
 - Fix bug causing caller being stuck in call initiation phase.

6.4.6
 - Improve internal caching logic.
 - Handle gracefully possible exceptions during peer connection initialisation process.

6.3.9
 - Improve internal reporting of call quality data.

6.2.7
 - Make native debug symbols compatible with Crashlytics. See README.md in debug symbols archive for more information.
 - Improve initializing of video calling functionality. Clients not using video calling should expect memory consumption
   improvement.

6.1.2
 - Minimise number of calls to Sinch Platform REST API.
 - Improve handling of default audio device during call when Bluetooth device is connected.
 - Distribute Kotlin documentation (dokkaHtml format). Documentation is available inside 'docs/reference' folder of the
   SDK archive and online at https://download.sinch.com/android/latest/reference/index.html.
   If you still need documentation in Javadoc format it is available as a part of the Sinch SDK archive inside
   'docs' folder.

6.0.2
 - Fix sample applications crash when during the call app was moved to background and then, back into the foreground.
 - Refactor SDK files into Kotlin. All API methods that could throw IllegalArgumentException when passing null values
   are now handled on language level and @NonNull / @Nullable annotations when referencing from Java.
   SDK can still be used in Java Android applications. Only extra step required is that you add 'org.jetbrains.kotlin:kotlin-stdlib' library
   inside your build.gradle file. See samples for reference.

5.10.6
 - Update WebRTC to M108. This update moves away from WebRTC version that was marked as vulnerable by Google.
   See https://support.google.com/faqs/answer/12577537 for more information.

5.9.4
 - Fix issue that could cause native crash when initializing WebRTC library.
 - Improve caching of instance data. Clients should expect to have onCredentialsRequired callback being executed less often.

5.8.2
 - Fix issue causing audio not being streamed properly when callee didn't initially grant microphone permissions.

5.7.3
 - Add automatic hang up when call is lingering in failed state for too long.

5.6.5
 - Improve creating the call when application is not in foreground.

5.5.24
 - Remove SinchHelpers class.
 - Add SinchPush class responsible for handling logic connected with delivering push messages for incoming calls.
 - Add SinchClient.builder() and UserController.builder() to access SinchClient and UserController builders respectively.
 - Remove deprecated SinchClient.startListeningOnActiveConnection() and SinchClient.stopListeningOnActiveConnection().
 - Add SinchClient.unregisterPushToken(PushTokenUnregistrationCallback). Client no longer needs to create UserController to remove the push token.
 - Add PushTokenUnregistrationCallback informing about push token unregistration events.
 - Fix bug connected with logging audio routing changes.
 - Add possibility to specify CLI while creating each outgoing call. See updated CallController call initialization methods for reference.
 - Remove SinchClientBuilder.callerIdentifier() method that assigned a common CLI to entire Sinch client instance.
 - Introduce MediaConstrains object for in app calling.
   Combine CallController.callUserVideo() and CallController.callUser() methods into single CallController.callUser(MediaConstraints).
   To initiate a video call create a MediaConstraint object passing 'true' into the constructor. See samples directory for fully working examples.
 - Rename CallClient to CallController.
 - Fix exception handling configuration for ProGuard code obfuscation. SinchClientBuilder.build() and
   UserControllerBuilder.build() can throw IOException. Clients should update their applications to handle
   these exceptions. See samples for possible implementation.
 - Update buildscript sample files.
 - Rename PushProfile to PushConfiguration

5.4.2
 - Fix minor bugs connected with automatic routing functionality

5.3.5
 - Add audio routing logging.

5.2.4
 - Fix issue that prevented user that did not start Sinch client for over a year authenticating on Sinch backend.

5.1.6
 - Fix authorization problems connected with incorrect timestamp parsing when running on 32-bit simulator.

5.0.2
 - Refactor SinchClientBuilder to follow UserControllerBuilder pattern for specifying Push Profile configuration.
 - Add FcmPushProfileBuilder allowing to specify
        * senderID - Firebase sender ID to be used by the Sinch SDK for sending push notifications
        * registrationToken - FCM registration token for this device
 - Remove Firebase and Firebase Messaging dependency. Sinch SDK is no longer responsible for acquiring FCM registration tokens using its sender ID.
   Client should use FcmPushProfileBuilder while creating SinchClient and UserController instances, to provide parameters
   (Firebase sender ID and FCM registration token) needed to initialize FCM Managed Push functionality. Client is also responsible
   for re-registering Push Profile whenever FCM token changes. See FcmListenerService.java at sinch-rtc-sample-video-push to see
   possible code implementation of above.
 - Remove SinchClient.setSupportManagedPush(boolean). Managed push functionality is currently automatically enabled if
   PushProfile is defined while building SinchClient instance. If SinchClient instance is built without defining any push profile the
   functionality is disabled.
 - Deprecate SinchClient.startListeningOnActiveConnection(). Remove non-push sample application.

4.11.3
 - Fix screenshot and filter video sample applications threading issues.

4.10.18
 - Update WebRTC to M96.

4.9.21
 - Refactor AudioController.enableAutomaticAudioRouting() to accept AudioController.AudioRoutingConfig parameter.
 - Fix potential crash in the JNI layer that could happen if null-body reply is unexpectedly returned
   from the backend.

4.8.6
 - Add android:exported attribute to the internal service manifest in conformance with new Android S+ rules (Android 12).

4.7.3
 - Fix crash on Huawei devices that support Google Play Services when Huawei HMS Messaging is used.

4.6.8
 - Fix crash in the AudioManagerInternal caused by unregistering of not-yet-registered Wired Headset Receiver.

4.5.8
 - Stop storing Sinch FCM token in SharedPreferences. Sometimes when the new FCM token is acquired, if
   update of the SharedPreferences fails/slow - the old FCM token is sent again to the Sinch backend.

4.4.5
 - Removed SinchClient.setMediaHandover(boolean), SinchClientBuilder.enableMediaHandover(boolean), and
   Call.setMediaHandover(). Media handover and reconnection behaviour is now handled internally.

4.3.9
 - Check CAMERA permission before video capture starts to avoid crash in case the user revoked permission.
   If not granted - black video. If granted during the call, video can be resumed with call to Call.resumeVideo().
   The responsibility to ensure that CAMERA permission is granted lies on the application.
 - Fixed crash when setting video frame listeners during audio-only call.
 - Removed Beta.setMediaHandoverConfig(SinchClient client, MediaHandoverConfig config) and MediaHandoverConfig class as a whole.
   Media handover behaviour is now handled internally.

4.2.5
 - Fixed memory leak in LocalVideoFrameListener and RemoteVideoFrameListener implementations.

4.1.4
 - Switch to new release tools and process.

4.0.7
 - Fixed crash in SinchClient when the client is terminated during incoming call processing.
 - Added VideoController setLocalVideoResizeBehaviour() to allow full-screen local video experience.

4.0.6
 - Failure of internal database initialization at SinchClient/UserController creation time will now cause IOException,
   instead of failing silently.
 - Fixed rare crash in SinchClient that happened during 'fast' start after graceful termination.
 - Updated sample application with SinchClient lifecycle management comments.

4.0.5
 - Aligned SinchClient registration experience with UserController's one by extending SinchClientListener
   interface and providing a way to register a user with the HMS Push Token via SinchClient by adding
   Huawei HMS specific methods to SinchClientBuilder:
       * hmsDeviceToken(String deviceToken);
       * hmsApplicationId(String applicationId);
 - Extended SinchClientListener interface by both UserRegistrationCallback and PushTokenRegistrationCallback interfaces.
 - Removed SinchClientListener.onRegistrationCredentialsRequired(SinchClient client, ClientRegistration registrationCallback)
   in favor of inherited UserRegistrationCallback.onCredentialsRequired(ClientRegistration registrationCallback).
 - Renamed PushTokenRegistrationCallback methods to follow the same naming pattern:
       * tokenRegistered() -> onPushTokenRegistered()
       * tokenRegistrationFailed(...) -> onPushTokenRegistrationFailed(...)
 - Removed deprecated SinchClient's stop() and unregisterPushProfile() APIs.

4.0.4
  - Removed MissingFCMException.
  - Added SinchHelper methods to check availability of the Google FCM or Huawei HMS services.

4.0.3
  - Moved from deprecated appcompat to AndroidX.

4.0.2
  - Fixed potential crash in logging when receiving weird-looking media streams.

4.0.1
  - Added support specifying/modifying call headers via ICE callback response.

4.0.0
  - Sinch environment host changed to ocra.api.sinch.com
  - Removed support for legacy push data (SinchClient.registerPushNotificationData()).
  - Removed ErrorType.CAPABILITY, ErrorType.OTHER. Added ErrorType.GENERIC.
  - Removed deprecated SinchClient.stop() (and SinchClientListener.onClientStopped()).
    Use SinchClient.terminateGracefully() instead.
  - CallDetails getStartedTime(), getEstablishedTime() and getEndedTime() return java.util.Date
    instead of long.
  - AudioController has new APIs: isMute() and isSpeakerOn().
  - Fixed AudioController bug that change microphone state when disengaging Automatic Audio Routing.

3.17.2
  - Cleaned up aar library to make compatible with Android Bundle build process.

3.17.1
  - Updated Sample Applications (-push, -push-video) to showcase use of UserController.
  - Updated Sample Applications (-push, -push-video) to show how to use Android 10 - time-sensitive notification for incoming calls.
  - Cancel Call Push notification is deprecated for consistency with other platforms (namely iOS 13) due to new requirements.
    If such a push notification is received, it'll have property `isValid` set to `false`

3.17.0
  - WebRTC updated
  - Java source code requires JAVA 8 (1.8)

3.16.0
  - Introduced UserController, an independent component that registers user w/o starting of SinchClient.
  - Instant Messaging functionality removed. Public API interfaces are still present, but will throw exceptions.

3.15.0
  - Added ManagedPush API which provides callbacks on FCM token registration success/failure.
  - Internal improvements related to API request timeouts and resending.

3.14.4
  - Fixed crash that happen on certain condition during un-graceful termination of SinchClient.

3.14.3
  - Fixed bug that caused premature ICE Restart (e.g. re-connection when there is no available network connection).

3.14.2
  - Fixed bug in media handover logic that triggered reconnection attempt while no network is available thus hindering proper reconnection later.

3.14.1
  - Google Services dependencies are updated to revision 4.2.0 which contains the fix of rare 'Firebase not init' bug.
  - Sample-push and Sample-video-push application are amended to provide 'display name' via push notification.
  - Fixed bug in handling of network change during the call if MediaHandoverConfig was not set via Beta.setMediaHandoverConfig() API.

3.14.0
  - Source code is Java 8 desugared. Requirement to use Java 8 dropped (use Java 7 or Java 8 as you please).

3.13.2
  - Fix HTTP requests being cancelled too early during SinchClient graceful shutdown.
  - New API: Beta.canEnableManagedPush(Context)
  - Internally remapping UnsatisfiedLinkError due to OOM to java.lang.OutOfMemoryError
  - Extend internal signaling timeout values

3.13.1
  - Added Beta Auto Audio Routing functionality.
  - Added Beta Torch Mode control.
  - "Call Cancelled" push notification are sent also when call is finished due to timeout or no answer.
  - Fixed ringtone going to earpiece form speaker.
  - Fixed connectivity listener bug.
  - STUN server is read from config.
  - added setTorchMode() API to VideoController to control torchlight during video call.
  - added enable/disable automatic audio routing APIs to AudioController to control audio routing.

3.13.0
  - Improved audio processing (AGC).
  - Added API to select camera before starting a videocall.
  - PubNub subscriber uses HTTPS by default.
  - PubNub and Sinch APIs now working via Sinch HttpClient.
  - WebRTC updated.
  - Bug fixes and improvements.

3.12.8
  - Ready for use with application with targetSdk=28, meeting Google Play's target API level requirement
  for November 2018.
  - Sample Applications are updated to target API 28 and be Android P compliant.

3.12.7
  - Fixed a bug in HttpRequester, which led to crash.

3.12.6
  - Fixed a bug in HttpRequester which made PubNub re-tries not reliable.
  - Sample Applications shows how to check and request necessary permissions.
  - Push Sample Applications demonstrate how to receive call from locked screen.

3.12.5
   - Removed the use of android instanceId in phone meta data gathering.

3.12.4
   - Added support for cancellation of a call via VoIP push notifications.
   - Added API for retrieving custom public headers from push notifications.
   - Fixed a crash occurring while receiving incoming call push notification while in native call with "respectNativeCalls" enabled.

3.12.3
  - Improved Wifi/Cellular handover for App calling.

3.12.2
  - Minor video capture bug fix

3.12.1
  - Improved robustness of video pipeline.
  - De-coupled capturing and preview (now it's possible dynamically show/hide preview w/o affecting
    capturing and sending video).
  - Added new VideoController's API: setVideoFrameListener() to set a callback that receives remote
    video frames w/o affecting rendering. Allows to do "screenshot" of remote video.
  - Added new VideoController's API: setLocalVideoFrameListener() to set a callback that receives
    local video frames instead of sending them to remote side. Allows processing of local video
    before sending it. Does not affect rendering of local preview. Sample application "sinch-rtc-sample-video-filter"
    is added for demonstration.
  - Managed push notifications migrated from GCM to FCM (Google -> Firebase Cloud Messaging)
  - Sample applications updated with regards of FCM use and SinchClient auto-restart.

3.11.1
  - General improvement.

3.11.0
  - Video Calling General Availability Release:
    Add support for pausing and resuming video stream.

  - Known issue:
    Compatibility problem on a few specific 64 bits devices.

3.10.0
  - Add listener for remote video stream frames.

3.9.14
  - Video calling bug fixes.

3.9.13
  - Fix a possible race condition when stopping the camera right after starting it.
  - Fix an unhandled exception in a thread checker routine.

3.9.12
  - Fix negative calls duration if device time is rolled back.
  - Fix a video call crash when camera is taken by a higher priority user in Android 6 and above.

3.9.11
  - Made hangup timeout optional.

3.9.10
  - Fixed local DTMF feedback playout.

3.9.9
  - Video calling bug fixes.

3.9.8
  - Improve robustness of native library loading for Android < 4.3 (Jellybean MR2).
    This should improve on the situation described in
    https://code.google.com/p/android/issues/detail?id=35962

  - Fixed Message.timestamp() to return server-side timestamp for a
    Message passed to MessageClientListener.onMessageSent(...).

3.9.7
  - Fixed an issue affecting incoming call ringtone on some devices.
  - Fixed a possible crash occurring while logging certain HttpRequest errors.

3.9.6
  - Address BoringSSL version compatibility with regards to Google Play Store.

3.9.5
  - Upgrade BoringSSL to revision c880e42ba1c8032d4cdde2aba0541d8a9d9fa2e9.
    This revision includes fixes for described in
    https://www.openssl.org/news/secadv/20160503.txt

  - Ensure OpenSSL/BoringSSL version string is preserved in library binary
    to satisfy Google Play Store checks.

3.9.4
  - Fixed a possible crash for video calling when navigating away from the
     video call screen and back.
  - Fixed a possible crash on devices with custom OEM Android when the app
     is missing BLUETOOTH permission.

3.9.3
  - Updated the SDK to use HttpURLConnection instead of Apache HTTP client
      which is obsolete in Android 6.

3.9.2
  - Support for 64 bit architectures.
  - Support for dual webrtc.
  - Fixed a regression since 3.8.0 which affected setting proper AudioManager
	mode during a call.

3.9.1
  - SIP errors reporting.

3.9.0
  - Introduced Sinch SIP calling.

3.8.0
  - Introduced Sinch video calling.

  - Exposed information about whether the call offers a video track in the push
    notification details.

3.7.2
  - CallClient.call* and Call.answer() will now throw MissingPermissionException
     if the application does not have the RECORD_AUDIO permission. This change is made in order
     to align with the permission system in Android 6.

  - Calling sample has been updated with an example of how to handle MissingPermissionException

3.7.1
  - Introduced Sinch conference calling.

3.6.2
  - Adaptive bitrate support for OPUS codec in app-to-app calls.

3.6.1
  - x86 support

  - Exposed getter for push display name on NotificationResult

  - Minor internal improvements

3.6.0
  - Support for managed push, where the Sinch backend will handle sending
     of push messages. See the reference documentation for setSupportManagedPush,
     unregisterManagedPush, the new sample app and the user-guide for more information.

  - relayRemotePushNotificationPayload will now correctly start the client when
     relaying payload for an IM.

  - Additional exception catching for undocumented exceptions thrown by Android
     audio related APIs.

3.5.0
  - Support for web-to-app calling with the Sinch Javascript SDK.

  - OPUS codec support in app-to-app calls.

  - Decreased amount of messages exchanged during call setup, resulting in
      shorter set up time.

  - SinchClientListener.onClientFailed() will now be called if the audio
      device fails to initialize.

  - Samples updated to be compatible with Android Studio 1.0.

3.4.3
  - Updated OpenSSL version to comply with Play Store requirements.

3.4.2
  - Decreased amount of network requests during startup.

  - IllegalArgumentException is now correctly thrown when headers
      for a call exceed 1024 bytes.

3.4.1
  - Improved internal call reporting.

3.4.0
  - SinchClient.registerPushNotificationData() will now throw if support
      for push notifications has not been enabled before the method is called.

  - Added getCall(String) to CallClient, which returns the Call object
      for the given callId, if that call exists.

  - Added getHeaders() to Call, which returns the custom headers for the
      call.

  - Sample apps have been updated to include a more robust implementation
      where the SinchClient is contained inside a Service.

3.3.9
  - Improvements to scenario where caller hangs up a call before certain
      internal REST API requests has completed, but the requests completes
      later during the graceful termination period.

3.3.8
  - Added new method SinchClient.terminateGracefully()

3.3.7
  - Fixed issue causing long call setup time when using certain codecs.

3.3.6
  - Additional improvements for scenarios in which the caller cancels a
      call before the call is answered.

3.3.5
  - Fixed an issue where if the caller hung up the call quickly,
      the callee would sometimes not receive the event that the call ended.

3.3.4
  - Improved thread handling while fetching history in certain cases.

3.3.3
  - Improved logging of session events to enable debugging in cases
      where calls might fail to establish.

  - Enabled automatic provisioning of device specific settings to increase
      call quality.

3.3.2
  - Improvements in handling unstable network connection when initiating
      a call.

3.3.1
  - Fix for Xperia Z devices not picking up any input from the microphone.

3.3.0
  - Added peristence. Messages are now persisted internally in the SDK and
      retried automatically for 12 hours before failing.

3.2.6
  - Internal improvements for Call headers.

3.2.5
  - Increased logging for rare instances where AudioTrack/AudioRecord would
      not initialize correctly.

  - Fixed crash when attempting to send DTMF during call setup.

  - Incoming calls will from now on never have state PROGRESSING.
      Previously, incoming calls could either be in INITIATING or PROGRESSING
      just after CallClientListener.onIncomingCall.
      Now, the call will initially be in INITIATING, until
      transitioning to ESTABLISHED or ENDED.

3.2.4
  - Fixed bug that prevented creating SinchClient via the Builder without
    specifying an application secret up front.

3.2.3
  - Minor internal improvements.

  - Significantly reduced size of native binary.

3.2.2
  - Minor internal improvements.

3.2.1
  - Minor internal improvements.

3.2.0
  - Minor internal improvements.

3.1.0
  - stop() deprecated in favor of the new terminate().
      As part of this change, the SinchClient is now invalidated
      after terminate() (or stop()) is called and may not be started
      again.

  - SecurityExceptions thrown on network requests are caught
      internally in the SDK now, workaround for a potential
      Android bug that sometimes throws SecurityException when
      it should throw an exception related to unknown host.

  - CallDetails.getError() now correctly returns null
      if no error occurred.

3.0.1
  - Removed internal call to AudioManager.setMode() when
      establishing/tearing down a call.

3.0.0
  - App-to-Phone (PSTN) calling functionality
      New method CallClient.callPhoneNumber()

  - Support for sending Instant Messages to multiple recipients.
      See WritableMessage.addRecipient()

  - Top package is now com.sinch.android.rtc

  - Instantiating a SinchClient is done via a SinchClientBuilder.
      See Sinch.getSinchClientBuilder().

  - Calling functionality moved to interface CallClient.

  - Calling is now disabled by default (to be consistent with
      Instant Messaging).
      Enable it with SinchClient.setSupportCalling(true)

  - Renamed CallListener.onCallReceivedOnRemoteEnd(Call) to
      CallListener.onCallProgressing(Call)

  - All methods to used to manage listeners (SinchClientListnener,
      CallClientListener, MessageClientListener) now conforms
      to the method naming convention addXXXListener,
      removeXXXListener.

  - MessageClientListener.onMessageFailed no longer takes a list
      of List<MessageFailureInfo>, but a single entry.
      The method may be invoked multiple times instead.

  - MessageClientListener.onMessageSent is now passed the
      recipientId as a third argument.

  - Removed method CallListener.onCallAnswered(Call).
      Any logic that was performed in relation to this method
      should be moved to where Call.answer() is invoked.


