diff --git a/app/build.gradle b/app/build.gradle index 916dfa44..c12d5fe4 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -7,12 +7,12 @@ plugins { android { namespace 'com.metamask.dapp' - compileSdk 34 + compileSdk 33 defaultConfig { applicationId "com.metamask.dapp" minSdk 23 - targetSdk 34 + targetSdk 33 versionCode 1 versionName "1.0" diff --git a/app/src/main/java/com/metamask/dapp/AppModule.kt b/app/src/main/java/com/metamask/dapp/AppModule.kt index fa3e3ce9..243118d6 100644 --- a/app/src/main/java/com/metamask/dapp/AppModule.kt +++ b/app/src/main/java/com/metamask/dapp/AppModule.kt @@ -18,9 +18,14 @@ internal object AppModule { return DappMetadata("Droiddapp", "https://droiddapp.io", iconUrl = "https://cdn.sstatic.net/Sites/stackoverflow/Img/apple-touch-icon.png") } + @Provides + fun provideLogger(): Logger { + return DefaultLogger + } + @Provides // Add SDKOptions(infuraAPIKey="supply_your_key_here") to Ethereum constructor for read-only calls - fun provideEthereum(@ApplicationContext context: Context, dappMetadata: DappMetadata): Ethereum { - return Ethereum(context, dappMetadata, SDKOptions(infuraAPIKey = "#####")) + fun provideEthereum(@ApplicationContext context: Context, dappMetadata: DappMetadata, logger: Logger): Ethereum { + return Ethereum(context, dappMetadata, SDKOptions(infuraAPIKey = "#####"), logger) } @Provides diff --git a/app/src/main/java/com/metamask/dapp/EthereumFlowViewModel.kt b/app/src/main/java/com/metamask/dapp/EthereumFlowViewModel.kt index c437f4cc..77f0e63d 100644 --- a/app/src/main/java/com/metamask/dapp/EthereumFlowViewModel.kt +++ b/app/src/main/java/com/metamask/dapp/EthereumFlowViewModel.kt @@ -110,8 +110,6 @@ class EthereumFlowViewModel @Inject constructor( } suspend fun addEthereumChain(chainId: String) : SwitchChainResult { - Logger.log("Adding chainId: $chainId") - return when (val result = ethereum.addEthereumChain( chainId = chainId, chainName = Network.chainNameFor(chainId), diff --git a/app/src/main/java/com/metamask/dapp/EthereumViewModel.kt b/app/src/main/java/com/metamask/dapp/EthereumViewModel.kt index b808c7ec..40e38008 100644 --- a/app/src/main/java/com/metamask/dapp/EthereumViewModel.kt +++ b/app/src/main/java/com/metamask/dapp/EthereumViewModel.kt @@ -8,7 +8,8 @@ import javax.inject.Inject @HiltViewModel class EthereumViewModel @Inject constructor( - private val ethereum: Ethereum + private val ethereum: Ethereum, + private val logger: Logger = DefaultLogger ): ViewModel() { val ethereumState = MediatorLiveData().apply { @@ -21,11 +22,11 @@ class EthereumViewModel @Inject constructor( ethereum.connect() { result -> when (result) { is Result.Error -> { - Logger.log("Ethereum connection error: ${result.error.message}") + logger.log("Ethereum connection error: ${result.error.message}") onError(result.error.message) } is Result.Success.Items -> { - Logger.log("Ethereum connection result: ${result.value.first()}") + logger.log("Ethereum connection result: ${result.value.first()}") onSuccess() } else -> { } @@ -37,11 +38,11 @@ class EthereumViewModel @Inject constructor( ethereum.connectWith(request) { result -> when (result) { is Result.Error -> { - Logger.log("Connectwith error: ${result.error.message}") + logger.log("Connectwith error: ${result.error.message}") onError(result.error.message) } is Result.Success.Item -> { - Logger.log("Connectwith result: $result") + logger.log("Connectwith result: $result") onSuccess(result.value) } else -> {} @@ -72,11 +73,11 @@ class EthereumViewModel @Inject constructor( ethereum.connectSign(message) { result -> when (result) { is Result.Error -> { - Logger.log("Connect & sign error: ${result.error.message}") + logger.log("Connect & sign error: ${result.error.message}") onError(result.error.message) } is Result.Success.Item -> { - Logger.log("Connect & sign result: $result") + logger.log("Connect & sign result: $result") onSuccess(result.value) } else -> {} @@ -110,11 +111,11 @@ class EthereumViewModel @Inject constructor( ethereum.sendRequestBatch(requestBatch) { result -> when (result) { is Result.Error -> { - Logger.log("Ethereum batch sign error: ${result.error.message}") + logger.log("Ethereum batch sign error: ${result.error.message}") onError(result.error.message) } is Result.Success.Items -> { - Logger.log("Ethereum batch sign result: $result") + logger.log("Ethereum batch sign result: $result") onSuccess(result.value) } else -> {} @@ -138,11 +139,11 @@ class EthereumViewModel @Inject constructor( ethereum.sendRequest(signRequest) { result -> when (result) { is Result.Error -> { - Logger.log("Ethereum sign error: ${result.error.message}") + logger.log("Ethereum sign error: ${result.error.message}") onError(result.error.message) } is Result.Success.Item -> { - Logger.log("Ethereum sign result: $result") + logger.log("Ethereum sign result: $result") onSuccess(result.value) } else -> {} @@ -165,11 +166,11 @@ class EthereumViewModel @Inject constructor( ethereum.sendRequest(getBalanceRequest) { result -> when (result) { is Result.Error -> { - Logger.log("Ethereum get balance error: ${result.error.message}") + logger.log("Ethereum get balance error: ${result.error.message}") onError(result.error.message) } is Result.Success.Item -> { - Logger.log("Ethereum get balance result: $result") + logger.log("Ethereum get balance result: $result") onSuccess(result.value) } else -> {} @@ -191,11 +192,11 @@ class EthereumViewModel @Inject constructor( ethereum.sendRequest(gasPriceRequest) { result -> when (result) { is Result.Error -> { - Logger.log("Ethereum gas price error: ${result.error.message}") + logger.log("Ethereum gas price error: ${result.error.message}") onError(result.error.message) } is Result.Success.Item -> { - Logger.log("Ethereum gas price result: $result") + logger.log("Ethereum gas price result: $result") onSuccess(result.value) } else -> {} @@ -217,11 +218,11 @@ class EthereumViewModel @Inject constructor( ethereum.sendRequest(web3ClientVersionRequest) { result -> when (result) { is Result.Error -> { - Logger.log("Ethereum web3 client version error: ${result.error.message}") + logger.log("Ethereum web3 client version error: ${result.error.message}") onError(result.error.message) } is Result.Success.Item -> { - Logger.log("Ethereum web3 client version result: $result") + logger.log("Ethereum web3 client version result: $result") onSuccess(result.value) } else -> {} @@ -250,11 +251,11 @@ class EthereumViewModel @Inject constructor( ethereum.sendRequest(transactionRequest) { result -> when (result) { is Result.Error -> { - Logger.log("Ethereum transaction error: ${result.error.message}") + logger.log("Ethereum transaction error: ${result.error.message}") onError(result.error.message) } is Result.Success.Item -> { - Logger.log("Ethereum transaction result: $result") + logger.log("Ethereum transaction result: $result") onSuccess(result.value) } else -> {} @@ -307,7 +308,7 @@ class EthereumViewModel @Inject constructor( onSuccess: (message: String) -> Unit, onError: (message: String) -> Unit ) { - Logger.log("Adding chainId: $chainId") + logger.log("Adding chainId: $chainId") val addChainParams: Map = mapOf( "chainId" to chainId, diff --git a/app/src/main/java/com/metamask/dapp/ScreenViewModel.kt b/app/src/main/java/com/metamask/dapp/ScreenViewModel.kt index 2db8af31..75ae6fd2 100644 --- a/app/src/main/java/com/metamask/dapp/ScreenViewModel.kt +++ b/app/src/main/java/com/metamask/dapp/ScreenViewModel.kt @@ -4,6 +4,7 @@ import androidx.compose.runtime.State import androidx.compose.runtime.mutableStateOf import androidx.lifecycle.ViewModel import dagger.hilt.android.lifecycle.HiltViewModel +import io.metamask.androidsdk.DefaultLogger import io.metamask.androidsdk.Logger import javax.inject.Inject @@ -14,6 +15,6 @@ class ScreenViewModel @Inject constructor(): ViewModel() { fun setScreen(screen: DappScreen) { _currentScreen.value = screen - Logger.log("Navigating to $screen") + DefaultLogger.log("Navigating to $screen") } } \ No newline at end of file diff --git a/metamask-android-sdk/build.gradle b/metamask-android-sdk/build.gradle index 0205e1ab..8cb31568 100644 --- a/metamask-android-sdk/build.gradle +++ b/metamask-android-sdk/build.gradle @@ -8,14 +8,14 @@ plugins { android { namespace 'io.metamask.androidsdk' - compileSdk 34 + compileSdk 33 defaultConfig { minSdk 23 - targetSdk 34 + targetSdk 33 ext.versionCode = 1 - ext.versionName = "0.5.7" + ext.versionName = "0.5.8" testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' consumerProguardFiles 'consumer-rules.pro' @@ -54,7 +54,7 @@ dependencies { implementation 'com.google.android.material:material:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation 'androidx.test.ext:junit-ktx:1.1.5' - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.7.0" + implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.6.1" testImplementation 'junit:junit:4.13.2' testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.0' @@ -65,7 +65,7 @@ dependencies { ext { PUBLISH_GROUP_ID = 'io.metamask.androidsdk' - PUBLISH_VERSION = '0.5.7' + PUBLISH_VERSION = '0.5.8' PUBLISH_ARTIFACT_ID = 'metamask-android-sdk' } diff --git a/metamask-android-sdk/src/main/java/io/metamask/androidsdk/SDKInfo.kt b/metamask-android-sdk/src/main/java/io/metamask/androidsdk/SDKInfo.kt index 37f87253..b9ee1923 100644 --- a/metamask-android-sdk/src/main/java/io/metamask/androidsdk/SDKInfo.kt +++ b/metamask-android-sdk/src/main/java/io/metamask/androidsdk/SDKInfo.kt @@ -1,6 +1,6 @@ package io.metamask.androidsdk object SDKInfo { - const val VERSION = "0.5.7" + const val VERSION = "0.5.8" const val PLATFORM = "android" } \ No newline at end of file diff --git a/metamask-android-sdk/src/test/java/io/metamask/androidsdk/SessionManagerTests.kt b/metamask-android-sdk/src/test/java/io/metamask/androidsdk/SessionManagerTests.kt index c47a6aac..d0358749 100644 --- a/metamask-android-sdk/src/test/java/io/metamask/androidsdk/SessionManagerTests.kt +++ b/metamask-android-sdk/src/test/java/io/metamask/androidsdk/SessionManagerTests.kt @@ -1,6 +1,8 @@ package io.metamask.androidsdk import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.delay +import kotlinx.coroutines.runBlocking import kotlinx.coroutines.test.advanceUntilIdle import kotlinx.coroutines.test.runTest import org.junit.Assert.assertEquals @@ -12,23 +14,30 @@ import org.junit.Test class SessionManagerTests { private val sessionConfigFile: String = "SESSION_CONFIG_FILE" + private val sessionConfigKey: String = "SESSION_CONFIG_KEY" + private lateinit var keyStorage: SecureStorage private lateinit var sessionManager: SessionManager @Before fun setUp() { keyStorage = MockKeyStorage() + keyStorage.clearValue(key = sessionConfigKey, file = sessionConfigFile) keyStorage.clear(sessionConfigFile) sessionManager = SessionManager(store = keyStorage, logger = TestLogger) + sessionManager.clearSession{} } + + @OptIn(ExperimentalCoroutinesApi::class) @Test fun testInitLoadsSessionConfig() = runTest { assertNotNull(sessionManager.sessionId) } + @OptIn(ExperimentalCoroutinesApi::class) @Test fun testDefaultSessionDuration() = runTest { val sessionConfig = sessionManager.getSessionConfig() val defaultDuration = 30 * 24 * 3600L // 30 days - assertEquals(sessionConfig.expiryDate, System.currentTimeMillis() + defaultDuration * 1000) + assertEquals(sessionConfig.expiryDate/1000, System.currentTimeMillis()/1000 + defaultDuration) } @OptIn(ExperimentalCoroutinesApi::class) @Test @@ -37,20 +46,24 @@ class SessionManagerTests { sessionManager.updateSessionDuration(newDuration) advanceUntilIdle() val sessionConfig = sessionManager.getSessionConfig() - assertEquals(sessionConfig.expiryDate, System.currentTimeMillis() + newDuration * 1000) + assertEquals(sessionConfig.expiryDate/1000, System.currentTimeMillis()/1000 + newDuration) } + @OptIn(ExperimentalCoroutinesApi::class) @Test fun testSessionConfigIsValid() = runTest { val sessionConfig = sessionManager.getSessionConfig() assertTrue(sessionConfig.isValid()) } + @OptIn(ExperimentalCoroutinesApi::class) @Test - fun testSessionConfigReset() = runTest { + fun testSessionConfigReset() = runBlocking { val initialSessionConfig = sessionManager.getSessionConfig() + delay(1000) val resetSessionConfig = sessionManager.getSessionConfig(reset = true) assertNotEquals(initialSessionConfig.sessionId, resetSessionConfig.sessionId) } + @OptIn(ExperimentalCoroutinesApi::class) @Test fun testSaveSessionConfig() = runTest { val sessionConfig = SessionConfig("test_session", System.currentTimeMillis() + 1000L) @@ -69,6 +82,7 @@ class SessionManagerTests { assertNotEquals("", sessionManager.sessionId) assertNotEquals("", sessionConfig.sessionId) } + @OptIn(ExperimentalCoroutinesApi::class) @Test fun testMakeNewSessionConfig() = runTest { val newConfig = sessionManager.makeNewSessionConfig()