RemoteAccountStorage.kt (1909B) - raw
1 package me.rhunk.snapenhance 2 3 import android.os.ParcelFileDescriptor 4 import me.rhunk.snapenhance.bridge.AccountStorage 5 import me.rhunk.snapenhance.common.util.ktx.toParcelFileDescriptor 6 7 class RemoteAccountStorage( 8 private val context: RemoteSideContext 9 ): AccountStorage.Stub() { 10 private val accountFolder by lazy { 11 context.androidContext.filesDir.resolve("accounts").also { 12 if (!it.exists()) it.mkdirs() 13 } 14 } 15 16 override fun getAccounts(): Map<String, String> { 17 return accountFolder.listFiles()?.sortedByDescending { it.lastModified() }?.mapNotNull { file -> 18 if (!file.name.endsWith(".zip") || !file.name.contains("|")) return@mapNotNull null 19 file.nameWithoutExtension.split('|').let { it[0] to it[1] } 20 }?.toMap() ?: emptyMap() 21 } 22 23 override fun addAccount(userId: String, username: String, pfd: ParcelFileDescriptor) { 24 removeAccount(userId) 25 accountFolder.resolve("$userId|$username.zip").outputStream().use { fileOutputStream -> 26 ParcelFileDescriptor.AutoCloseInputStream(pfd).use { 27 it.copyTo(fileOutputStream) 28 } 29 } 30 } 31 32 override fun removeAccount(userId: String) { 33 accountFolder.listFiles()?.firstOrNull { 34 it.nameWithoutExtension.startsWith(userId) 35 }?.also { 36 context.log.verbose("Removing account file: ${it.name}") 37 it.delete() 38 } 39 } 40 41 override fun isAccountExists(userId: String): Boolean { 42 return accountFolder.listFiles()?.any { 43 it.nameWithoutExtension.startsWith(userId) 44 } ?: false 45 } 46 47 override fun getAccountData(userId: String): ParcelFileDescriptor? { 48 return accountFolder.listFiles()?.firstOrNull { 49 it.nameWithoutExtension.startsWith(userId) 50 }?.inputStream()?.toParcelFileDescriptor(context.coroutineScope) 51 } 52 }