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 }