package org.amnezia.vpn.util import android.app.Application import android.content.Context import android.content.SharedPreferences import androidx.security.crypto.EncryptedSharedPreferences import androidx.security.crypto.MasterKey import kotlin.reflect.typeOf private const val TAG = "Prefs" private const val PREFS_FILE = "org.amnezia.vpn.prefs" private const val SECURE_PREFS_FILE = "$PREFS_FILE.secure" object Prefs { private lateinit var app: Application val prefs: SharedPreferences get() = try { EncryptedSharedPreferences( app, SECURE_PREFS_FILE, MasterKey(app) ) } catch (e: Exception) { Log.e(TAG, "Getting Encryption Storage failed: $e, plaintext fallback") app.getSharedPreferences(PREFS_FILE, Context.MODE_PRIVATE) } fun init(app: Application) { Log.v(TAG, "Init Prefs") this.app = app } fun save(key: String, value: Boolean) = prefs.edit().putBoolean(key, value).apply() fun save(key: String, value: String?) = prefs.edit().putString(key, value).apply() fun save(key: String, value: Int) = prefs.edit().putInt(key, value).apply() fun save(key: String, value: Long) = prefs.edit().putLong(key, value).apply() fun save(key: String, value: Float) = prefs.edit().putFloat(key, value).apply() inline fun load(key: String): T { return when (typeOf()) { typeOf() -> prefs.getBoolean(key, false) typeOf() -> prefs.getString(key, "") typeOf() -> prefs.getInt(key, 0) typeOf() -> prefs.getLong(key, 0L) typeOf() -> prefs.getFloat(key, 0f) else -> throw IllegalArgumentException("SharedPreferences does not support type: ${typeOf()}") } as T } }