From 456e109f3fabd9375c4d1bafc12ee714bde68f88 Mon Sep 17 00:00:00 2001 From: Dewan Tawsif Date: Fri, 24 Oct 2025 06:29:06 +0600 Subject: [PATCH 1/2] Add a LCP constructor parameter to pass a custom device id --- .gitignore | 1 + CHANGELOG.md | 14 ++++++++++++- .../java/org/readium/r2/lcp/LcpService.kt | 4 ++++ .../readium/r2/lcp/service/DeviceService.kt | 20 +++++++++---------- 4 files changed, 28 insertions(+), 11 deletions(-) diff --git a/.gitignore b/.gitignore index a631cf7133..93f3e1038d 100644 --- a/.gitignore +++ b/.gitignore @@ -49,6 +49,7 @@ captures/ .idea/jarRepositories.xml .idea/misc.xml .idea/migrations.xml +.idea/markdown.xml # Android Studio 3 in .gitignore file. .idea/caches .idea/modules.xml diff --git a/CHANGELOG.md b/CHANGELOG.md index e79be5826d..45c49fe83f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,19 @@ All notable changes to this project will be documented in this file. Take a look **Warning:** Features marked as *experimental* may change or be removed in a future release without notice. Use with caution. - +## [Unreleased] + +### Added + +#### LCP + +* Added a constructor parameter to pass a custom device id. + +### Changed + +#### LCP + +* Set device id only once after generating. ## [3.1.2] diff --git a/readium/lcp/src/main/java/org/readium/r2/lcp/LcpService.kt b/readium/lcp/src/main/java/org/readium/r2/lcp/LcpService.kt index ad7f405b76..54546a0985 100644 --- a/readium/lcp/src/main/java/org/readium/r2/lcp/LcpService.kt +++ b/readium/lcp/src/main/java/org/readium/r2/lcp/LcpService.kt @@ -135,11 +135,14 @@ public interface LcpService { * @param deviceName Device name used when registering a license to an LSD server. * If not provided, the device name will be generated from the device's manufacturer and * model. + * @param deviceId Device ID used when registering a liceense to an LSD server. + * If not provided, the device id will be generated as a random UUID. */ public operator fun invoke( context: Context, assetRetriever: AssetRetriever, deviceName: String? = null, + deviceId: String? = null, ): LcpService? { if (!LcpClient.isAvailable()) { return null @@ -152,6 +155,7 @@ public interface LcpService { val network = NetworkService() val device = DeviceService( deviceName = deviceName, + deviceId = deviceId, repository = deviceRepository, network = network, context = context diff --git a/readium/lcp/src/main/java/org/readium/r2/lcp/service/DeviceService.kt b/readium/lcp/src/main/java/org/readium/r2/lcp/service/DeviceService.kt index c723f075e3..e9c74b5d38 100644 --- a/readium/lcp/src/main/java/org/readium/r2/lcp/service/DeviceService.kt +++ b/readium/lcp/src/main/java/org/readium/r2/lcp/service/DeviceService.kt @@ -12,6 +12,7 @@ package org.readium.r2.lcp.service import android.content.Context import android.content.SharedPreferences import android.os.Build +import androidx.core.content.edit import java.io.Serializable import java.util.UUID import org.readium.r2.lcp.license.model.LicenseDocument @@ -19,22 +20,21 @@ import org.readium.r2.lcp.license.model.components.Link internal class DeviceService( deviceName: String?, + deviceId: String?, private val repository: DeviceRepository, private val network: NetworkService, val context: Context, ) : Serializable { - private val preferences: SharedPreferences = context.getSharedPreferences( - "org.readium.r2.settings", - Context.MODE_PRIVATE - ) + private val preferences: SharedPreferences by lazy { + context.getSharedPreferences("org.readium.r2.settings", Context.MODE_PRIVATE) + } - val id: String - get() { - val deviceId = preferences.getString("lcp_device_id", UUID.randomUUID().toString())!! - preferences.edit().putString("lcp_device_id", deviceId).apply() - return deviceId - } + val id: String = deviceId ?: run { + val deviceId = preferences.getString("lcp_device_id", UUID.randomUUID().toString())!! + preferences.edit { putString("lcp_device_id", deviceId) } + deviceId + } val name: String = deviceName ?: "${Build.MANUFACTURER} ${Build.MODEL}" From 131d2214fea3c9bcab066a458929c5abe28a0e23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mickae=CC=88l=20Menu?= Date: Thu, 6 Nov 2025 14:38:54 +0100 Subject: [PATCH 2/2] Fixes --- .../java/org/readium/r2/lcp/LcpService.kt | 5 ++-- .../readium/r2/lcp/service/DeviceService.kt | 23 +++++++++++-------- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/readium/lcp/src/main/java/org/readium/r2/lcp/LcpService.kt b/readium/lcp/src/main/java/org/readium/r2/lcp/LcpService.kt index 54546a0985..99d3f0f118 100644 --- a/readium/lcp/src/main/java/org/readium/r2/lcp/LcpService.kt +++ b/readium/lcp/src/main/java/org/readium/r2/lcp/LcpService.kt @@ -135,8 +135,9 @@ public interface LcpService { * @param deviceName Device name used when registering a license to an LSD server. * If not provided, the device name will be generated from the device's manufacturer and * model. - * @param deviceId Device ID used when registering a liceense to an LSD server. - * If not provided, the device id will be generated as a random UUID. + * @param deviceId Device ID used when registering a license to an LSD server. + * If not provided, the device ID will be generated as a random UUID and persisted for + * future sessions. */ public operator fun invoke( context: Context, diff --git a/readium/lcp/src/main/java/org/readium/r2/lcp/service/DeviceService.kt b/readium/lcp/src/main/java/org/readium/r2/lcp/service/DeviceService.kt index e9c74b5d38..ee81cd5e93 100644 --- a/readium/lcp/src/main/java/org/readium/r2/lcp/service/DeviceService.kt +++ b/readium/lcp/src/main/java/org/readium/r2/lcp/service/DeviceService.kt @@ -10,10 +10,8 @@ package org.readium.r2.lcp.service import android.content.Context -import android.content.SharedPreferences import android.os.Build import androidx.core.content.edit -import java.io.Serializable import java.util.UUID import org.readium.r2.lcp.license.model.LicenseDocument import org.readium.r2.lcp.license.model.components.Link @@ -24,16 +22,21 @@ internal class DeviceService( private val repository: DeviceRepository, private val network: NetworkService, val context: Context, -) : Serializable { +) { - private val preferences: SharedPreferences by lazy { - context.getSharedPreferences("org.readium.r2.settings", Context.MODE_PRIVATE) - } + val id: String = deviceId ?: generatedId + + private val generatedId: String get() { + val key = "lcp_device_id" + + val preferences = context.getSharedPreferences("org.readium.r2.settings", Context.MODE_PRIVATE) + + preferences.getString(key, null) + ?.let { return it } - val id: String = deviceId ?: run { - val deviceId = preferences.getString("lcp_device_id", UUID.randomUUID().toString())!! - preferences.edit { putString("lcp_device_id", deviceId) } - deviceId + val id = UUID.randomUUID().toString() + preferences.edit { putString(key, id) } + return id } val name: String =