All notable changes to this project will be documented in this file.
Warning: Features marked as alpha may change or be removed in a future release without notice. Use with caution.
- Upgraded to Kotlin 1.5.31 and Gradle 7.1.1.
- Migrated to Jetpack Room for the SQLite database storing rights and passphrases (contributed by @stevenzeck).
- Note that the internal SQL schema changed. You will need to update your app if you were querying the database manually.
- You can observe the progress of an acquisition by providing an
onProgress
closure toLcpService.acquirePublication()
. - Extensibility in licenses'
Rights
model.
- The Renew Loan API got revamped to better support renewal through a web page.
- You will need to implement
LcpLicense.RenewListener
to coordinate the UX interaction. - If your application fits Material Design guidelines, take a look at
MaterialRenewListener
for a default implementation.
- You will need to implement
- Removed dependency on Joda's
DateTime
in public APIs.- You can always create a
DateTime
from the standardDate
objects if you relied on Joda's features in the callers.
- You can always create a
- #287 Make sure the passphrase input is visible on smaller devices in the authentication dialog.
- Upgraded to Kotlin 1.4.10.
- When acquiring a publication, falls back on the media type declared in the license link if the server returns an unknown media type.
- LCP implementation of the Content Protection API to work with the new Streamer API (contributed by @qnga).
- It is highly recommended that you upgrade to the new
Streamer
API to open publications, which will simplify DRM unlocking.
- It is highly recommended that you upgrade to the new
- Two default implementations of
LcpAuthenticating
:LcpDialogAuthentication
to prompt the user for its passphrase with the official LCP dialog.LcpPassphraseAuthentication
to provide directly a passphrase, pulled for example from a database or a web service.
LcpService::isLcpProtected()
provides a way to check if a file is protected with LCP.- All the
LcpException
errors are now implementingUserException
and are suitable for user display. UsegetUserMessage()
to get the localized message.
- The public API got modernized to be more Kotlin idiomatic (contributed by @qnga).
- All asynchronous APIs are now suspending to take advantage of Kotlin's coroutines.
LcpAuthenticating
is now provided with more information and you will need to update any implementation you may have.- If you copied the default authentication dialog, it's recommended to use
LcpDialogAuthentication
instead.
- If you copied the default authentication dialog, it's recommended to use
- Publications are now downloaded to a temporary location, to make sure disk storage can be recovered automatically by the system. After acquiring the publication, you need to move the downloaded file to another permanent location.
- The private
liblcp
dependency is now accessed through reflection, to allow switching LCP dynamically (contributed by @qnga).- You need to add
implementation "readium:liblcp:1.0.0@aar"
to yourbuild.gradle
. LcpService::create()
returnsnull
iflcplib
is not found.
- You need to add
- Decrypting resources in some edge cases (contributed by @qnga)
- Issues with LSD interactions:
- Exceptions handling with
renew
andreturn
interactions. - Presentation of the
renew
interaction through an HTML page.
- Exceptions handling with
- The timeout of fetching the License Status Document is reduced to 5 seconds, to avoid blocking a publication opening in low Internet conditions.
- Support for PDF and Readium Audiobooks protected with LCP.
LCPAuthenticating
can now return hashed passphrases in addition to clear ones. This can be used by reading apps fetching hashed passphrases from a web service or Authentication for OPDS, for example.
OutOfMemoryError
when downloading a large publication. This fix removed the dependency to Fuel.- The
AndroidManifest.xml
is not forcing anymoreallowBackup
andsupportsRtl
, to let reading apps manage these features themselves (contributed by @twaddington).