## Overview
The Bitmovin Android SDK minimizes offline content management and playback to a few API calls, and allows fast integration of offline capabilities.
## Setup
In order to use offline functionality, the following dependency must be added manually to the build file:
Additionally, the permission for checking the network state is required in the Android Manifest:
Depending on the location the offline data is saved, it may also be required to add the STORAGE permission to the Android Manifest:
## API Usage
The core component responsible for handling offline content is the `OfflineContentManager
`. It allows fetching the current offline state, requesting state changes and generating `SourceConfig
` for offline playback.
### Initialization
One `OfflineContentManager
` is linked with one `SourceConfig
`. When instantiating an `OfflineContentManager
`, it is required to provide a storage location, a unique ID for the content and a listener of type `OfflineContentManagerListener
`.
### OfflineContentManager
Interaction with the `OfflineContentManager
` is mostly done asynchronously. The results when calling `getOptions
`, `process
` and `renewDrmLicense
` are received by the `OfflineContentManagerListener
`, which is passed at creation of the `OfflineContentManager
`. Only calls to `getRemainingOfflineLicenseDuration
`, `offlineSourceConfig
` and `release
` are synchronous and return their values immediately.
#### OfflineContentManagerListener
The `OfflineContentManagerListener
` provides seven callbacks:
**onOptionsAvailable** is called after a `
getOptions
` call, or when the state of an OfflineOptionEntry has changed. The states can be `NOT_DOWNLOADED
`, `DOWNLOADED
`, `DOWNLOADING
` or `DELETING
`.**onProgress** is called when the progress for an ongoing operation has changed e.g. the download progress.
**onCompleted** is called when an operation has completed. This could be the downloading or deleting of content.
**onDrmLicenseUpdated** is called when the stored DRM license was updated.
**onError** is called when an error occurs.
**onSuspended** is called when all actions have been suspended.
**onResumed** is called when all actions have been resumed.
#### OfflineContentOptions
`OfflineContentOptions
` can be received by calling `getOptions
` on the `OfflineContentManager
` for a specific `SourceConfig
`. `OfflineContentOptions
` represent the "offline state" of a stream and each available track (video, audio, captions/subtitles). It contains four lists, containing the different types: **video**, **audio**, **text** (captions/subtitles) and **thumbnails**.
### Downloading Content
Once an `OfflineContentManger
` is created, downloading of content can be started. To gain knowledge of the available tracks and their state, `getOptions
` should be called:
As this is an asynchronous call, the response must be handled in the `OfflineContentManagerListener
` callback:
From the received `OfflineContentOptions
` the separate `OfflineOptionEntry
` can be received and selected for download or deletion. As an example, the `VideoOfflineOptionEntry
` with the highest bitrate will be selected here for download:
_Note:_ Depending on the current state of the `OfflineOptionEntry
` it might be not possible to set all actions. For example, already downloaded content cannot be downloaded again.
After successfully preparing the download, by setting the desired actions, the `OfflineContentOptions
` object is pushed back to the (correct) `OfflineContentManager
` using the `process(...)
` call:
This triggers an `onOptionsAvailable(...)
` listener callback. The `OfflineOptionEntry
` entries which were selected to be downloaded will have the state `DOWNLOADING
` now. Until the `onCompleted(...)
` listener is invoked, the `onProgress(...)
` listener is called frequently with updated information about the ongoing operation.
### Playback of Offline Content
When the `onCompleted(...)
` listener callback has been invoked, meaning at least one `OfflineOptionEntry
` is in the `DOWNLOADED
` state, an `OfflineSourceConfig
` can be requested from the `OfflineContentManager
` for playback. With this `OfflineSourceConfig
` a `SourceConfig
` can be created and loaded into the `Player
` as usual:
The Player is now ready to play the offline stored content.