From 5fa47937856d269376eab1322f107be3a20a373b Mon Sep 17 00:00:00 2001 From: Victor Kabata Date: Fri, 30 Aug 2024 15:39:48 +0300 Subject: [PATCH 1/8] Added koin bom and koin android --- samples/android/app/build.gradle.kts | 6 ++++++ samples/android/gradle/libs.versions.toml | 4 ++++ 2 files changed, 10 insertions(+) diff --git a/samples/android/app/build.gradle.kts b/samples/android/app/build.gradle.kts index 6f0f9e7d..d6168ab5 100644 --- a/samples/android/app/build.gradle.kts +++ b/samples/android/app/build.gradle.kts @@ -59,11 +59,17 @@ dependencies { implementation(libs.androidx.ui.graphics) implementation(libs.androidx.ui.tooling.preview) implementation(libs.androidx.material3) + + implementation(platform(libs.koin.bom)) + implementation(libs.koin.android) + testImplementation(libs.junit) + androidTestImplementation(libs.androidx.junit) androidTestImplementation(libs.androidx.espresso.core) androidTestImplementation(platform(libs.androidx.compose.bom)) androidTestImplementation(libs.androidx.ui.test.junit4) + debugImplementation(libs.androidx.ui.tooling) debugImplementation(libs.androidx.ui.test.manifest) } \ No newline at end of file diff --git a/samples/android/gradle/libs.versions.toml b/samples/android/gradle/libs.versions.toml index d4d4d6c2..eddd3b74 100644 --- a/samples/android/gradle/libs.versions.toml +++ b/samples/android/gradle/libs.versions.toml @@ -8,6 +8,7 @@ espressoCore = "3.6.1" lifecycleRuntimeKtx = "2.8.4" activityCompose = "1.9.1" composeBom = "2024.04.01" +koinBom = "3.5.6" [libraries] androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } @@ -25,6 +26,9 @@ androidx-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-man androidx-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" } androidx-material3 = { group = "androidx.compose.material3", name = "material3" } +koin-bom = { module = "io.insert-koin:koin-bom", version.ref = "koinBom" } +koin-android = { module = "io.insert-koin:koin-androidx-compose" } + [plugins] android-application = { id = "com.android.application", version.ref = "agp" } jetbrains-kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } From a5dfb7ab5cd7881941add86d3badb71b46a18fda Mon Sep 17 00:00:00 2001 From: Victor Kabata Date: Fri, 30 Aug 2024 15:41:25 +0300 Subject: [PATCH 2/8] Added daraja lib --- samples/android/app/build.gradle.kts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/samples/android/app/build.gradle.kts b/samples/android/app/build.gradle.kts index d6168ab5..fe2b2e9e 100644 --- a/samples/android/app/build.gradle.kts +++ b/samples/android/app/build.gradle.kts @@ -62,7 +62,9 @@ dependencies { implementation(platform(libs.koin.bom)) implementation(libs.koin.android) - + + implementation("io.github.victorkabata:daraja-multiplatform:0.9.5") + testImplementation(libs.junit) androidTestImplementation(libs.androidx.junit) From 7f291f5ec69cbf41d6d182c9c67cdd973e8fa261 Mon Sep 17 00:00:00 2001 From: Victor Kabata Date: Fri, 30 Aug 2024 16:43:53 +0300 Subject: [PATCH 3/8] Update publish_kmp_lib.yml --- .github/workflows/publish_kmp_lib.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish_kmp_lib.yml b/.github/workflows/publish_kmp_lib.yml index b94f564d..19fa1e66 100644 --- a/.github/workflows/publish_kmp_lib.yml +++ b/.github/workflows/publish_kmp_lib.yml @@ -32,7 +32,7 @@ jobs: run: ./gradlew :daraja:allTests --stacktrace - name: Sign and Publish Android Library - run: ./gradlew :daraja:publishAllPublicationsToSonatypeRepository --max-workers 1 --stacktrace + run: ./gradlew clean publishAllPublicationsToSonatypeRepository --max-workers 1 --stacktrace env: OSSRH_USERNAME: ${{ secrets.OSSRH_USERNAME }} OSSRH_PASSWORD: ${{ secrets.OSSRH_PASSWORD }} From 32b60920cbe0965707a730dedd73f2d99f339c12 Mon Sep 17 00:00:00 2001 From: Victor Kabata Date: Mon, 2 Sep 2024 08:44:13 +0300 Subject: [PATCH 4/8] Update daraja kmp version from v0.9.5 to v0.9.6 --- samples/android/app/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/android/app/build.gradle.kts b/samples/android/app/build.gradle.kts index fe2b2e9e..ef1554c9 100644 --- a/samples/android/app/build.gradle.kts +++ b/samples/android/app/build.gradle.kts @@ -63,7 +63,7 @@ dependencies { implementation(platform(libs.koin.bom)) implementation(libs.koin.android) - implementation("io.github.victorkabata:daraja-multiplatform:0.9.5") + implementation("io.github.victorkabata:daraja-multiplatform:0.9.6") testImplementation(libs.junit) From b257af3d762a5d7af9f7d4099ade5e27566ff0ab Mon Sep 17 00:00:00 2001 From: Victor Kabata Date: Mon, 2 Sep 2024 09:47:40 +0300 Subject: [PATCH 5/8] Set up singleton instance of Daraja --- .../com/vickbt/daraja/android/di/AppModule.kt | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 samples/android/app/src/main/java/com/vickbt/daraja/android/di/AppModule.kt diff --git a/samples/android/app/src/main/java/com/vickbt/daraja/android/di/AppModule.kt b/samples/android/app/src/main/java/com/vickbt/daraja/android/di/AppModule.kt new file mode 100644 index 00000000..78a5e801 --- /dev/null +++ b/samples/android/app/src/main/java/com/vickbt/daraja/android/di/AppModule.kt @@ -0,0 +1,16 @@ +package com.vickbt.daraja.android.di + +import com.vickbt.darajakmp.Daraja +import org.koin.dsl.module + +val appModule = module { + // Provide a single instance of Daraja + single { + Daraja.Builder() + .setConsumerKey("") + .setConsumerSecret("") + .setPassKey("") + .isSandbox() + .build() + } +} \ No newline at end of file From 0b56ecde4d14ccbeb0dac5ee73e0a90497c647fd Mon Sep 17 00:00:00 2001 From: Victor Kabata Date: Mon, 2 Sep 2024 14:54:24 +0300 Subject: [PATCH 6/8] Set up base android sample --- .../android/app/src/main/AndroidManifest.xml | 3 ++ .../android/DarajaAndroidApplication.kt | 20 ++++++++++++ .../android/ui/screen/MpesaExpressScreen.kt | 31 ++++++++++++------- 3 files changed, 42 insertions(+), 12 deletions(-) create mode 100644 samples/android/app/src/main/java/com/vickbt/daraja/android/DarajaAndroidApplication.kt diff --git a/samples/android/app/src/main/AndroidManifest.xml b/samples/android/app/src/main/AndroidManifest.xml index 5885a0c1..1408c004 100644 --- a/samples/android/app/src/main/AndroidManifest.xml +++ b/samples/android/app/src/main/AndroidManifest.xml @@ -2,7 +2,10 @@ + + Date: Mon, 2 Sep 2024 15:13:41 +0300 Subject: [PATCH 7/8] Set up mpesa express screen functionality --- .../com/vickbt/daraja/android/di/AppModule.kt | 6 +- .../android/ui/screen/MpesaExpressScreen.kt | 71 +++++++++++++------ 2 files changed, 51 insertions(+), 26 deletions(-) diff --git a/samples/android/app/src/main/java/com/vickbt/daraja/android/di/AppModule.kt b/samples/android/app/src/main/java/com/vickbt/daraja/android/di/AppModule.kt index 78a5e801..26e938f6 100644 --- a/samples/android/app/src/main/java/com/vickbt/daraja/android/di/AppModule.kt +++ b/samples/android/app/src/main/java/com/vickbt/daraja/android/di/AppModule.kt @@ -7,9 +7,9 @@ val appModule = module { // Provide a single instance of Daraja single { Daraja.Builder() - .setConsumerKey("") - .setConsumerSecret("") - .setPassKey("") + .setConsumerKey("consumer_key") + .setConsumerSecret("consumer_secret") + .setPassKey("pass_key") .isSandbox() .build() } diff --git a/samples/android/app/src/main/java/com/vickbt/daraja/android/ui/screen/MpesaExpressScreen.kt b/samples/android/app/src/main/java/com/vickbt/daraja/android/ui/screen/MpesaExpressScreen.kt index 3add0dba..e40ce14c 100644 --- a/samples/android/app/src/main/java/com/vickbt/daraja/android/ui/screen/MpesaExpressScreen.kt +++ b/samples/android/app/src/main/java/com/vickbt/daraja/android/ui/screen/MpesaExpressScreen.kt @@ -2,7 +2,10 @@ package com.vickbt.daraja.android.ui.screen +import android.util.Log +import android.widget.Toast import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.size @@ -11,6 +14,7 @@ import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.rounded.Send +import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.FloatingActionButton import androidx.compose.material3.FloatingActionButtonDefaults @@ -27,23 +31,29 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.TextStyle -import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.vickbt.darajakmp.Daraja import com.vickbt.darajakmp.utils.DarajaTransactionType +import com.vickbt.darajakmp.utils.onFailure +import com.vickbt.darajakmp.utils.onSuccess import org.koin.compose.koinInject @Composable fun MpesaExpressScreen(modifier: Modifier = Modifier, daraja: Daraja = koinInject()) { + val context = LocalContext.current + val tillNumber by remember { mutableStateOf("174379") } var amount by remember { mutableIntStateOf(1) } var phoneNumber by remember { mutableStateOf("") } + var isLoading by remember { mutableStateOf(false) } + Column( modifier = modifier.wrapContentSize(), verticalArrangement = Arrangement.spacedBy( @@ -86,29 +96,44 @@ fun MpesaExpressScreen(modifier: Modifier = Modifier, daraja: Daraja = koinInjec // keyboardActions = KeyboardOptions.Default.copy(imeAction = ImeAction.Done) ) - FloatingActionButton( - modifier = Modifier, - shape = CircleShape, - containerColor = MaterialTheme.colorScheme.primary, - contentColor = MaterialTheme.colorScheme.onPrimary, - elevation = FloatingActionButtonDefaults.elevation(), - onClick = { - daraja.mpesaExpress( - businessShortCode = tillNumber, - amount = amount, - phoneNumber = phoneNumber, - transactionType = DarajaTransactionType.CustomerPayBillOnline, - transactionDesc = "Empty transaction to test SDK", - callbackUrl = "https://mydomain.com", - accountReference = "CompanyX" + Log.e("VicKbt", "Is loading: $isLoading") + + Box(modifier = Modifier){ + FloatingActionButton( + modifier = Modifier.align(Alignment.Center), + shape = CircleShape, + containerColor = MaterialTheme.colorScheme.primary, + contentColor = MaterialTheme.colorScheme.onPrimary, + elevation = FloatingActionButtonDefaults.elevation(), + onClick = { + isLoading = true + + daraja.mpesaExpress( + businessShortCode = tillNumber, + amount = amount, + phoneNumber = phoneNumber, + transactionType = DarajaTransactionType.CustomerPayBillOnline, + transactionDesc = "Empty transaction to test SDK", + callbackUrl = "https://mydomain.com", + accountReference = "CompanyX" + ).onSuccess { + Toast.makeText(context, "Success: $it", Toast.LENGTH_SHORT).show() + }.onFailure { + Toast.makeText(context, "Error: ${it.errorMessage}", Toast.LENGTH_SHORT).show() + } + + }, + ) { + Icon( + modifier = Modifier.size(28.dp), + imageVector = Icons.AutoMirrored.Rounded.Send, + contentDescription = "Pay" ) - }, - ) { - Icon( - modifier = Modifier.size(28.dp), - imageVector = Icons.AutoMirrored.Rounded.Send, - contentDescription = "Pay" - ) + } + + if (isLoading){ + CircularProgressIndicator(modifier = Modifier.align(Alignment.Center), trackColor = MaterialTheme.colorScheme.onPrimary) + } } } } From 634bb056a0c4c2a3c95c77bc4badf8eeeae82a4d Mon Sep 17 00:00:00 2001 From: Victor Kabata Date: Wed, 4 Sep 2024 10:26:02 +0300 Subject: [PATCH 8/8] Fix github security warning --- .github/workflows/publish_swift_package.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish_swift_package.yml b/.github/workflows/publish_swift_package.yml index 0be89cf1..7d2013e8 100644 --- a/.github/workflows/publish_swift_package.yml +++ b/.github/workflows/publish_swift_package.yml @@ -44,7 +44,7 @@ jobs: uses: actions/checkout@v4 - name: Download directory with swift package - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: swiftpackage path: swiftpackage