Remove custom permission, fix client lifecycle and encrypted prefs

Remove USE_LCK_CONTROL permission from service to fix binding failures
caused by Android revoking custom permissions on app reinstall. Add
auto-cleanup of dead clients via RemoteCallbackList.onCallbackDied and
handle corrupted EncryptedSharedPreferences keyset gracefully. Lower
SDK minSdk to 32.
This commit is contained in:
2026-02-27 22:03:23 +01:00
parent 5b8ede3a19
commit ada06c6240
5 changed files with 53 additions and 19 deletions

View File

@@ -57,7 +57,18 @@ class LckControlService : Service() {
private val serviceScope = CoroutineScope(SupervisorJob() + Dispatchers.Main)
private val clientTracker = ClientTracker()
private val callbacks = RemoteCallbackList<ILckControlCallback>()
private val callbacks = object : RemoteCallbackList<ILckControlCallback>() {
override fun onCallbackDied(callback: ILckControlCallback, cookie: Any?) {
val uid = cookie as? Int ?: return
serviceScope.launch {
val removed = clientTracker.unregisterByUid(uid)
for (client in removed) {
Log.d(TAG, "Auto-unregistered client ${client.clientId} (${client.packageName}) - process died")
broadcastClientUnregistered(client.clientId)
}
}
}
}
private val binder = object : ILckControlService.Stub() {
@@ -146,7 +157,8 @@ class LckControlService : Service() {
// ── Clients ─────────────────────────────────────────
override fun registerClient(clientName: String, packageName: String): String {
val clientId = clientTracker.register(clientName, packageName)
val uid = android.os.Binder.getCallingUid()
val clientId = clientTracker.register(clientName, packageName, uid)
broadcastClientRegistered(clientId)
return clientId
}
@@ -174,7 +186,8 @@ class LckControlService : Service() {
// ── Callbacks ───────────────────────────────────────
override fun registerCallback(callback: ILckControlCallback) {
callbacks.register(callback)
val uid = android.os.Binder.getCallingUid()
callbacks.register(callback, uid)
}
override fun unregisterCallback(callback: ILckControlCallback) {