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.


