From 2ef9db30e22d25101da7b871dd5900952e431a8b Mon Sep 17 00:00:00 2001 From: Sajal Bansal Date: Sun, 27 Oct 2024 17:44:54 +0530 Subject: [PATCH] files added --- .../example/walletapp/WalletAppApplication.kt | 11 ++++ .../java/com/example/walletapp/db/TokenDao.kt | 19 ++++++ .../com/example/walletapp/db/TokenDatabase.kt | 59 +++++++++++++++++++ .../walletapp/ui/account/TokenRepository.kt | 20 +++++++ .../walletapp/ui/account/TokenViewModel.kt | 39 ++++++++++++ .../com/example/walletapp/utils/Converters.kt | 17 ++++++ 6 files changed, 165 insertions(+) create mode 100644 wallet_app/app/src/main/java/com/example/walletapp/WalletAppApplication.kt create mode 100644 wallet_app/app/src/main/java/com/example/walletapp/db/TokenDao.kt create mode 100644 wallet_app/app/src/main/java/com/example/walletapp/db/TokenDatabase.kt create mode 100644 wallet_app/app/src/main/java/com/example/walletapp/ui/account/TokenRepository.kt create mode 100644 wallet_app/app/src/main/java/com/example/walletapp/ui/account/TokenViewModel.kt create mode 100644 wallet_app/app/src/main/java/com/example/walletapp/utils/Converters.kt diff --git a/wallet_app/app/src/main/java/com/example/walletapp/WalletAppApplication.kt b/wallet_app/app/src/main/java/com/example/walletapp/WalletAppApplication.kt new file mode 100644 index 0000000..65e3d9a --- /dev/null +++ b/wallet_app/app/src/main/java/com/example/walletapp/WalletAppApplication.kt @@ -0,0 +1,11 @@ +package com.example.walletapp + +import android.app.Application +import com.example.walletapp.db.TokenDatabase + + +class WalletAppApplication : Application() { + + // Lazy initialization of the database + val database: TokenDatabase by lazy { TokenDatabase.getDatabase(this) } +} \ No newline at end of file diff --git a/wallet_app/app/src/main/java/com/example/walletapp/db/TokenDao.kt b/wallet_app/app/src/main/java/com/example/walletapp/db/TokenDao.kt new file mode 100644 index 0000000..a708422 --- /dev/null +++ b/wallet_app/app/src/main/java/com/example/walletapp/db/TokenDao.kt @@ -0,0 +1,19 @@ +package com.example.walletapp.db + + +import androidx.room.Dao +import androidx.room.Insert +import androidx.room.OnConflictStrategy +import com.example.walletapp.model.Token +import kotlinx.coroutines.flow.Flow +import androidx.room.Query + +@Dao +interface TokenDao { + + @Insert(onConflict = OnConflictStrategy.REPLACE) + suspend fun insert(token: Token) + + @Query("SELECT * FROM token_table") + fun getAllTokens(): Flow> +} diff --git a/wallet_app/app/src/main/java/com/example/walletapp/db/TokenDatabase.kt b/wallet_app/app/src/main/java/com/example/walletapp/db/TokenDatabase.kt new file mode 100644 index 0000000..a2b08f6 --- /dev/null +++ b/wallet_app/app/src/main/java/com/example/walletapp/db/TokenDatabase.kt @@ -0,0 +1,59 @@ +package com.example.walletapp.db + +import android.content.Context +import androidx.room.Database +import androidx.room.Room +import androidx.room.RoomDatabase +import androidx.room.TypeConverters +import androidx.sqlite.db.SupportSQLiteDatabase +import com.example.walletapp.model.Token +import com.example.walletapp.utils.Converters +import com.swmansion.starknet.data.types.Felt +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch + +@Database(entities = [Token::class], version = 1, exportSchema = false) +@TypeConverters(Converters::class) +abstract class TokenDatabase : RoomDatabase() { + + abstract fun tokenDao(): TokenDao + + companion object { + @Volatile + private var INSTANCE: TokenDatabase? = null + + fun getDatabase(context: Context): TokenDatabase { + return INSTANCE ?: synchronized(this) { + val instance = Room.databaseBuilder( + context.applicationContext, + TokenDatabase::class.java, + "token_database" + ) + .addCallback(DatabaseCallback()) // Add callback here + .build() + INSTANCE = instance + instance + } + } + } + + private class DatabaseCallback : RoomDatabase.Callback() { + override fun onCreate(db: SupportSQLiteDatabase) { + super.onCreate(db) + INSTANCE?.let { database -> + CoroutineScope(Dispatchers.IO).launch { + populateDatabase(database.tokenDao()) + } + } + } + + suspend fun populateDatabase(tokenDao: TokenDao) { + // Add default tokens + val token1 = Token(contactAddress = Felt.fromHex("0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7"), name = "ethereum", symbol = "ETH", decimals = 18) + val token2 = Token(contactAddress = Felt.fromHex("0x04718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d"), name = "starknet", symbol = "STRK", decimals = 18) + tokenDao.insert(token1) + tokenDao.insert(token2) + } + } +} diff --git a/wallet_app/app/src/main/java/com/example/walletapp/ui/account/TokenRepository.kt b/wallet_app/app/src/main/java/com/example/walletapp/ui/account/TokenRepository.kt new file mode 100644 index 0000000..13d0851 --- /dev/null +++ b/wallet_app/app/src/main/java/com/example/walletapp/ui/account/TokenRepository.kt @@ -0,0 +1,20 @@ +package com.example.walletapp.ui.account + +import com.example.walletapp.db.TokenDao +import com.example.walletapp.model.Token +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.withContext + +class TokenRepository(private val tokenDao: TokenDao) { + + // Get all tokens from the database + val allTokens: Flow> = tokenDao.getAllTokens() + + // Insert a token into the database + suspend fun insertToken(token: Token) { + withContext(Dispatchers.IO) { + tokenDao.insert(token) + } + } +} diff --git a/wallet_app/app/src/main/java/com/example/walletapp/ui/account/TokenViewModel.kt b/wallet_app/app/src/main/java/com/example/walletapp/ui/account/TokenViewModel.kt new file mode 100644 index 0000000..afddc8f --- /dev/null +++ b/wallet_app/app/src/main/java/com/example/walletapp/ui/account/TokenViewModel.kt @@ -0,0 +1,39 @@ +package com.example.walletapp.ui.account + +import android.app.Application +import androidx.lifecycle.AndroidViewModel +import androidx.lifecycle.LiveData +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.asLiveData +import androidx.lifecycle.viewModelScope +import com.example.walletapp.model.Token +import kotlinx.coroutines.launch + +class TokenViewModel(application: Application, private val repository: TokenRepository) : AndroidViewModel(application) { + + + // Expose all tokens as LiveData + val tokens: LiveData> = repository.allTokens.asLiveData() + + // Function to insert a new token + fun insertToken(token: Token) { + viewModelScope.launch { + repository.insertToken(token) + } + } + + // Define a factory to pass the repository + class Factory(private val application: Application, private val repository: TokenRepository) : + ViewModelProvider.AndroidViewModelFactory(application) { + + override fun create(modelClass: Class): T { + if (modelClass.isAssignableFrom(TokenViewModel::class.java)) { + @Suppress("UNCHECKED_CAST") + return TokenViewModel(application, repository) as T + } + throw IllegalArgumentException("Unknown ViewModel class") + } + } +} + diff --git a/wallet_app/app/src/main/java/com/example/walletapp/utils/Converters.kt b/wallet_app/app/src/main/java/com/example/walletapp/utils/Converters.kt new file mode 100644 index 0000000..bb9ea1f --- /dev/null +++ b/wallet_app/app/src/main/java/com/example/walletapp/utils/Converters.kt @@ -0,0 +1,17 @@ +package com.example.walletapp.utils + +import androidx.room.TypeConverter +import com.swmansion.starknet.data.types.Felt + +class Converters { + + @TypeConverter + fun fromFelt(felt: Felt): String { + return felt.hexString() // Convert Felt to String + } + + @TypeConverter + fun toFelt(feltString: String): Felt { + return Felt.fromHex(feltString) // Convert String back to Felt + } +}