diff --git a/androidApp/build.gradle b/androidApp/build.gradle index 5f90c5d..b74f607 100644 --- a/androidApp/build.gradle +++ b/androidApp/build.gradle @@ -5,11 +5,11 @@ apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' android { - compileSdkVersion 29 + compileSdkVersion 33 defaultConfig { applicationId "org.mifos.openbanking" minSdkVersion 21 - targetSdkVersion 29 + targetSdkVersion 33 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" @@ -38,19 +38,29 @@ android { } dependencies { + + constraints { + implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.0") { + because("kotlin-stdlib-jdk8 is now a part of kotlin-stdlib") + } + } + implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'androidx.core:core-ktx:1.3.0' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' implementation 'com.google.android.material:material:1.2.0' - implementation 'androidx.navigation:navigation-fragment:2.3.0' - implementation 'androidx.navigation:navigation-ui:2.3.0' - implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0' + implementation 'androidx.navigation:navigation-fragment-ktx:2.3.0' + implementation 'androidx.navigation:navigation-ui-ktx:2.3.0' + implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1' + implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.5.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' + implementation 'androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1' implementation 'androidx.navigation:navigation-fragment-ktx:2.3.0' implementation 'androidx.navigation:navigation-ui-ktx:2.3.0' implementation 'com.google.code.gson:gson:2.8.6' - testImplementation 'junit:junit:4.13' + testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' @@ -75,3 +85,7 @@ dependencies { // SHIMMER ANIMATION implementation 'com.facebook.shimmer:shimmer:0.5.0' } + +configurations { + all*.exclude group: 'org.jetbrains.kotlinx', module: 'kotlinx-serialization-runtime-jvm' +} \ No newline at end of file diff --git a/androidApp/gradle/wrapper/gradle-wrapper.properties b/androidApp/gradle/wrapper/gradle-wrapper.properties index a40c025..d2e72f9 100644 --- a/androidApp/gradle/wrapper/gradle-wrapper.properties +++ b/androidApp/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-all.zip diff --git a/androidApp/src/main/AndroidManifest.xml b/androidApp/src/main/AndroidManifest.xml index d99bd8c..cf3f99d 100644 --- a/androidApp/src/main/AndroidManifest.xml +++ b/androidApp/src/main/AndroidManifest.xml @@ -1,9 +1,15 @@ + + + + android:theme="@style/AppTheme" + android:exported="true"> diff --git a/build.gradle b/build.gradle index 4542dfc..8dc6844 100644 --- a/build.gradle +++ b/build.gradle @@ -1,22 +1,22 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.3.72' - ext.sql_delight_version = "1.4.0" + ext.kotlin_version = '1.7.20' + ext.sql_delight_version = "1.5.4" repositories { google() jcenter() mavenCentral() - maven { url "https://dl.bintray.com/kodein-framework/Kodein-DI/org/kodein/di/" } + maven { url "https://repo1.maven.org/maven2/org/kodein/di/" } } dependencies { // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files - classpath 'com.android.tools.build:gradle:4.0.1' + classpath "com.android.tools.build:gradle:7.3.0" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version" classpath "com.squareup.sqldelight:gradle-plugin:$sql_delight_version" @@ -28,22 +28,23 @@ allprojects { repositories { google() jcenter() + mavenCentral() - - maven { url = uri("https://dl.bintray.com/icerockdev/moko") } - maven { url "https://dl.bintray.com/florent37/maven" } - maven { url "https://dl.bintray.com/kodein-framework/Kodein-DI" } + maven { url = uri("https://repo1.maven.org/maven2/dev/icerock/moko") } + maven { url = uri("https://repo1.maven.org/maven2/org/kodein/di") } + maven { url = uri("https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-core") } } } ext { - coroutine_version = "1.3.2" - serializer_version = "0.20.0" + coroutine_version = "1.3.8" + serializer_core_version = "1.0-M1-1.4.0-rc" + serializer_native_version = "0.20.0-1.4-M1-release-99" + serializer_json_version = "1.5.1" ktor_version = "1.3.2" kodeinVersion = "6.5.3" - moko_mvvm_version = "0.6.0" + moko_mvvm_version = "0.10.0" mockk_version = "1.9.3" - preferences_version = "1.0.0" } task clean(type: Delete) { diff --git a/common/build.gradle b/common/build.gradle index 96cfa84..10ef7c9 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -4,11 +4,11 @@ apply plugin: 'com.android.library' apply plugin: 'com.squareup.sqldelight' android { - compileSdkVersion(29) + compileSdkVersion(33) defaultConfig { minSdkVersion(21) - targetSdkVersion(29) + targetSdkVersion(33) } // By default the android gradle plugin expects to find the kotlin source files in @@ -31,11 +31,20 @@ android { targetCompatibility JavaVersion.VERSION_1_8 } - tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all { + tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach { kotlinOptions { jvmTarget = "1.8" + freeCompilerArgs += ["-Xskip-prerelease-check"] } } + configurations { + create("androidTestApi") + create("androidTestDebugApi") + create("androidTestReleaseApi") + create("testApi") + create("testDebugApi") + create("testReleaseApi") + } } kotlin { @@ -66,13 +75,16 @@ kotlin { api 'org.jetbrains.kotlin:kotlin-stdlib-common' // COROUTINES - implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core-common:$coroutine_version" + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core-common:$coroutine_core_version" // MOKO - MVVM implementation "dev.icerock.moko:mvvm:$moko_mvvm_version" // SERIALIZATION - implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime-common:$serializer_version" + implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime:$serializer_core_version" + + // SERIALIZATION - JSON Format + implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:$serializer_json_version" // KODE IN implementation "org.kodein.di:kodein-di-core:$kodeinVersion" @@ -81,9 +93,6 @@ kotlin { // KTOR implementation "io.ktor:ktor-client-core:$ktor_version" implementation "io.ktor:ktor-client-auth-native:$ktor_version" - - // Preferences - implementation "com.github.florent37:multiplatform-preferences:$preferences_version" } androidMain.dependencies { @@ -93,20 +102,17 @@ kotlin { // COROUTINES implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutine_version" - // MOKO - MVVM + // ViewModel and LiveData implementation "androidx.lifecycle:lifecycle-extensions:$androidx_lifecycle_version" // SERIALIZATION - implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime:$serializer_version" + implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime:$serializer_core_version" // KTOR implementation "io.ktor:ktor-client-android:$ktor_version" // SQL Delight implementation "com.squareup.sqldelight:android-driver:$sql_delight_version" - - // Preferences - implementation "com.github.florent37:multiplatform-preferences-android:$preferences_version" } iosMain.dependencies { @@ -116,22 +122,22 @@ kotlin { implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core-native:$coroutine_version" // SERIALIZATION - implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime-native:$serializer_version" + implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime-native:$serializer_native_version" // KTOR implementation "io.ktor:ktor-client-ios:$ktor_version" // SQL Delight implementation "com.squareup.sqldelight:native-driver:$sql_delight_version" - - // Preferences - implementation "com.github.florent37:multiplatform-preferences-ios:$preferences_version" } commonTest.dependencies { implementation kotlin('test-common') implementation kotlin('test-annotations-common') implementation "io.mockk:mockk:$mockk_version" + implementation "junit:junit:4.13.2" + implementation 'org.jetbrains.kotlin:kotlin-test' + implementation 'org.jetbrains.kotlin:kotlin-test-junit' } } } diff --git a/common/src/androidMainTest/kotlin/SampleTestsAndroid.kt b/common/src/androidMainTest/kotlin/SampleTestsAndroid.kt index 87332d7..90e5d8a 100644 --- a/common/src/androidMainTest/kotlin/SampleTestsAndroid.kt +++ b/common/src/androidMainTest/kotlin/SampleTestsAndroid.kt @@ -1,8 +1,8 @@ package org.mifos.openbanking.common +import org.junit.Assert.assertTrue +import org.junit.Test import org.mifos.openbanking.hello -import kotlin.test.Test -import kotlin.test.assertTrue class SampleTestsAndroid { @Test diff --git a/common/src/commonMain/kotlin/org/mifos/openbanking/data/datasources/disk/preferencesHelper/PreferencesHelper.kt b/common/src/commonMain/kotlin/org/mifos/openbanking/data/datasources/disk/preferencesHelper/PreferencesHelper.kt index 6dc950a..ecb1b3b 100644 --- a/common/src/commonMain/kotlin/org/mifos/openbanking/data/datasources/disk/preferencesHelper/PreferencesHelper.kt +++ b/common/src/commonMain/kotlin/org/mifos/openbanking/data/datasources/disk/preferencesHelper/PreferencesHelper.kt @@ -1,7 +1,7 @@ package org.mifos.openbanking.data.datasources.disk.preferencesHelper -import com.github.florent37.preferences.Preferences -import kotlinx.serialization.builtins.list +import kotlinx.serialization.builtins.ListSerializer +import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json import org.mifos.openbanking.domain.usecase.fetchBanks.Bank import org.mifos.openbanking.viewModel.model.UserModel @@ -13,23 +13,103 @@ class PreferencesHelper { private val supportedBanksKey: String = "supported_banks" fun saveUserModel(userModel: UserModel) { - preferences.setString(userModelKey, Json.stringify(UserModel.serializer(), userModel)) + preferences.setString(userModelKey, Json.encodeToString(userModel)) } fun getUserModel(): UserModel? { return if (preferences.hasKey(userModelKey)) { - Json.parse(UserModel.serializer(), preferences.getString(userModelKey)!!) + Json.decodeFromString(UserModel.serializer(),preferences.getString(userModelKey)!!) } else { null } } + fun saveSupportedBanks(bankList: List) { - preferences.setString(supportedBanksKey, Json.stringify(Bank.serializer().list, bankList)) + preferences.setString(supportedBanksKey, Json.encodeToString(bankList)) } + fun getSupportedBanks(): List { - return Json.parse(Bank.serializer().list, preferences.getString(supportedBanksKey)!!) + return Json.decodeFromString(ListSerializer(Bank.serializer()), preferences.getString(supportedBanksKey)!!) + } +} + +class Preferences(private val name: String? = null) { + + private val preferences = mutableMapOf() + + fun setInt(key: String, value: Int) { + preferences[key] = value } -} \ No newline at end of file + fun getInt(key: String, defaultValue: Int): Int { + return preferences[key] as? Int? ?: defaultValue + } + + fun getInt(key: String): Int? { + return preferences[key] as? Int + } + + fun setFloat(key: String, value: Float) { + preferences[key] = value + } + + fun getFloat(key: String, defaultValue: Float): Float { + return preferences[key] as? Float? ?: defaultValue + } + + fun getFloat(key: String): Float? { + return preferences[key] as? Float + } + + fun setLong(key: String, value: Long) { + preferences[key] = value + } + + fun getLong(key: String, defaultValue: Long): Long { + return preferences[key] as? Long? ?: defaultValue + } + + fun getLong(key: String): Long? { + return preferences[key] as? Long + } + + fun setString(key: String, value: String) { + preferences[key] = value + } + + fun getString(key: String, defaultValue: String): String { + return preferences[key] as? String? ?: defaultValue + } + + fun getString(key: String): String? { + return preferences[key] as? String + } + + fun setBoolean(key: String, value: Boolean) { + preferences[key] = value + } + + fun getBoolean(key: String, defaultValue: Boolean): Boolean { + return preferences[key] as? Boolean? ?: defaultValue + } + + fun getBoolean(key: String): Boolean? { + return preferences[key] as? Boolean + } + + fun remove(key: String) { + preferences.remove(key) + } + + fun clear() { + preferences.clear() + } + + fun hasKey(key: String): Boolean { + return preferences.containsKey(key) + } +} + + diff --git a/common/src/commonMain/kotlin/org/mifos/openbanking/data/datasources/network/BanksApi.kt b/common/src/commonMain/kotlin/org/mifos/openbanking/data/datasources/network/BanksApi.kt index 111ef65..4c6372f 100644 --- a/common/src/commonMain/kotlin/org/mifos/openbanking/data/datasources/network/BanksApi.kt +++ b/common/src/commonMain/kotlin/org/mifos/openbanking/data/datasources/network/BanksApi.kt @@ -1,9 +1,9 @@ package org.mifos.openbanking.data.datasources.network -import io.ktor.client.* -import io.ktor.client.features.* -import io.ktor.client.request.* -import kotlinx.serialization.builtins.list +import io.ktor.client.HttpClient +import io.ktor.client.features.ClientRequestException +import io.ktor.client.request.get +import kotlinx.serialization.builtins.ListSerializer import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonObject import org.mifos.openbanking.base.Response @@ -19,8 +19,9 @@ class BanksApi { return try { val response = client.get(API_HOST + BANKS_PATH) - val responseBanks = (Json.parseJson(response) as JsonObject)["banks"].toString() - val bankList = Json.nonstrict.parse(Bank.serializer().list, responseBanks) + val responseBanks = (Json.parseToJsonElement(response) as JsonObject)["banks"].toString() + val bankList = + Json.decodeFromString(ListSerializer(Bank.serializer()), responseBanks) Response.Success( FetchBanksResponse( diff --git a/common/src/commonMain/kotlin/org/mifos/openbanking/data/datasources/network/CardApi.kt b/common/src/commonMain/kotlin/org/mifos/openbanking/data/datasources/network/CardApi.kt index 06956af..b0344f4 100644 --- a/common/src/commonMain/kotlin/org/mifos/openbanking/data/datasources/network/CardApi.kt +++ b/common/src/commonMain/kotlin/org/mifos/openbanking/data/datasources/network/CardApi.kt @@ -22,7 +22,7 @@ class CardApi { } } - val fetchCardsResponse = Json.nonstrict.parse(FetchCardsResponse.serializer(), response) + val fetchCardsResponse = Json.decodeFromString(FetchCardsResponse.serializer(), response) return Response.Success(fetchCardsResponse) } catch (exp: ClientRequestException) { diff --git a/common/src/commonMain/kotlin/org/mifos/openbanking/data/datasources/network/ClientApi.kt b/common/src/commonMain/kotlin/org/mifos/openbanking/data/datasources/network/ClientApi.kt index 96a46fa..8de3457 100644 --- a/common/src/commonMain/kotlin/org/mifos/openbanking/data/datasources/network/ClientApi.kt +++ b/common/src/commonMain/kotlin/org/mifos/openbanking/data/datasources/network/ClientApi.kt @@ -1,13 +1,16 @@ package org.mifos.openbanking.data.datasources.network -import io.ktor.client.* -import io.ktor.client.features.* -import io.ktor.client.request.* -import kotlinx.serialization.builtins.list +import io.ktor.client.HttpClient +import io.ktor.client.features.ClientRequestException +import io.ktor.client.request.get +import io.ktor.client.request.headers +import io.ktor.client.request.post +import kotlinx.serialization.builtins.ListSerializer import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonArray import kotlinx.serialization.json.JsonObject -import kotlinx.serialization.json.content +import kotlinx.serialization.json.double +import kotlinx.serialization.json.jsonPrimitive import org.mifos.openbanking.base.Response import org.mifos.openbanking.domain.usecase.createClient.CreateClientResponse import org.mifos.openbanking.domain.usecase.fetchAccounts.Account @@ -43,7 +46,7 @@ class ClientApi { } } - val loginClientResponse = Json.parse(LoginClientResponse.serializer(), response) + val loginClientResponse = Json.decodeFromString(LoginClientResponse.serializer(), response) return Response.Success(loginClientResponse) } catch (exp: ClientRequestException) { @@ -61,9 +64,9 @@ class ClientApi { } } - val responseJson = Json.parseJson(response) + val responseJson = Json.parseToJsonElement(response) val responseAccounts = (responseJson as Map)["accounts"].toString() - val accounts = Json.nonstrict.parse(Account.serializer().list, responseAccounts) + val accounts = Json.decodeFromString(ListSerializer(Account.serializer()), responseAccounts) return Response.Success( FetchAccountsResponse( accounts @@ -91,13 +94,13 @@ class ClientApi { val accountBalances: MutableList = mutableListOf() - val accounts = (Json.parseJson(response) as JsonObject)["accounts"] as JsonArray + val accounts = (Json.parseToJsonElement(response) as JsonObject)["accounts"] as JsonArray for (account in accounts) { account as JsonObject - val accountId = account["id"]!!.content + val accountId = account["id"]!!.jsonPrimitive.content val balance = account["balance"] as JsonObject - val currency = balance["currency"]!!.content - val amount = balance["amount"]!!.primitive.double + val currency = balance["currency"]!!.jsonPrimitive.content + val amount = balance["amount"]!!.jsonPrimitive.double accountBalances.add( AccountBalance( diff --git a/common/src/commonMain/kotlin/org/mifos/openbanking/data/datasources/network/TransactionApi.kt b/common/src/commonMain/kotlin/org/mifos/openbanking/data/datasources/network/TransactionApi.kt index 9aa1906..c431894 100644 --- a/common/src/commonMain/kotlin/org/mifos/openbanking/data/datasources/network/TransactionApi.kt +++ b/common/src/commonMain/kotlin/org/mifos/openbanking/data/datasources/network/TransactionApi.kt @@ -71,7 +71,7 @@ class TransactionApi { } val transactionRequestsList = - Json.nonstrict.parse(FetchTransactionRequestsResponse.serializer(), response) + Json.decodeFromString(FetchTransactionRequestsResponse.serializer(), response) return Response.Success(transactionRequestsList) } catch (exp: ClientRequestException) { @@ -96,7 +96,7 @@ class TransactionApi { } val transaction = - Json.nonstrict.parse(Transaction.serializer(), response) + Json.decodeFromString(Transaction.serializer(), response) return Response.Success(FetchTransactionByIdResponse(transaction)) } catch (exp: ClientRequestException) { @@ -125,7 +125,7 @@ class TransactionApi { } val fetchTransactionsResponse = - Json.nonstrict.parse(FetchTransactionsResponse.serializer(), response) + Json.decodeFromString(FetchTransactionsResponse.serializer(), response) return Response.Success(fetchTransactionsResponse) } catch (exp: ClientRequestException) { diff --git a/gradle.properties b/gradle.properties index 23339e0..78ffcf6 100644 --- a/gradle.properties +++ b/gradle.properties @@ -19,3 +19,7 @@ android.useAndroidX=true android.enableJetifier=true # Kotlin code style for this project: "official" or "obsolete": kotlin.code.style=official +# Enable Multiplatform/Android-V2-SourceSetLayout +kotlin.mpp.androidSourceSetLayoutVersion=2 +# Mac targets cannot be built on linux, suppress the warning. +kotlin.native.ignoreDisabledTargets=true \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 1b16c34..774fae8 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/settings.gradle b/settings.gradle index eec104c..a645601 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,4 +1,2 @@ include ':AndroidApp', ':common' -rootProject.name = 'Mifos Open banking' - -enableFeaturePreview('GRADLE_METADATA') +rootProject.name = 'Mifos Open banking' \ No newline at end of file