Skip to content

Instantly share code, notes, and snippets.

@shafty023
shafty023 / messy_prefs.kt
Last active June 10, 2020 00:47
Messy preferences
@Singleton
class Preferences(context: Context) {
private val prefs: SharedPreferences = context.getSharedPreferences("Prefs", Context.MODE_PRIVATE)
companion object {
const val PREF_CURRENT_STATE = "CurrentState"
const val PREF_LAST_KNOWN_ERROR = "LastKnownError"
const val PREF_LAST_ACTION_PERFORMED = "LastActionPerformed"
}
@shafty023
shafty023 / get_storable.kt
Last active August 7, 2020 00:13
Retrieve Storable instance from storage
/**
* Retrieves the [Storable] instance from prefs.
*
* @param context the caller's context
* @return the storable instance
*/
fun getStorable(context: Context): Storable? {
val prefs = context.getSharedPreferences("database",
Context.MODE_PRIVATE)
val serialized = prefs.getString("key", null)
@shafty023
shafty023 / encrypt_and_store_key.kt
Last active April 14, 2022 15:04
Encrypt the key and store it
fun persistRawKey(userPasscode: CharArray) {
val storable = toStorable(rawByteKey, userPasscode)
// Implementation explained in next step
saveToPrefs(storable)
}
/**
* Returns a [Storable] instance with the db key encrypted using PBE.
*
* @param rawDbKey the raw database key
@shafty023
shafty023 / ByteArrayToHex.kt
Last active August 24, 2022 17:00
Convert a ByteArray to Hex encoded String
private val HEX_CHARS = "0123456789ABCDEF".toCharArray()
/**
* Extension function that converts a ByteArray to a hex encoded CharArray.
*/
fun ByteArray.toHex(): CharArray {
val result = StringBuilder()
forEach {
val octet = it.toInt()
val firstIndex = (octet and 0xF0).ushr(4)
@shafty023
shafty023 / encrypted_room_db.kt
Created June 9, 2020 23:19
Encrypted Room db
abstract class EncryptedDatabase : RoomDatabase() {
companion object {
fun getInstance(passcode: CharArray, context: Context):
EncryptedDatabase = buildDatabase(passcode, context)
private fun buildDatabase(
passcode: CharArray,
context: Context
): EncryptedDatabase {
// DatabaseKeyMgr is a singleton that all of the above code is wrapped into.