Skip to content

Commit

Permalink
Merge pull request #748 from rafsanjani/development
Browse files Browse the repository at this point in the history
Sync main with develop
  • Loading branch information
rafsanjani authored Feb 2, 2025
2 parents a90080d + c548777 commit 389e098
Show file tree
Hide file tree
Showing 137 changed files with 1,476 additions and 617 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/android_pr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ jobs:
uses: gradle/actions/setup-gradle@v4

- name: Snapshot test (shared-ui)
run: ./gradlew verifyPaparazziDebug --continue
run: ./gradlew verifyPaparazzi --continue

- name: Commit and Push Images to GitHub Pages
if: failure()
Expand Down
58 changes: 58 additions & 0 deletions .github/workflows/post-merge.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
name: Save Release APK

on:
push:
branches: [ development ]
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
persistReleaseApk:
env:
SENTRY_BASE_URL_ANDROID: ${{secrets.SENTRY_BASE_URL_ANDROID}}
SENTRY_AUTH_TOKEN: ${{secrets.SENTRY_AUTH_TOKEN}}
GOOGLE_SERVER_CLIENT_ID: ${{secrets.GOOGLE_SERVER_CLIENT_ID}}
MAPS_API_KEY_ANDROID: ${{secrets.MAPS_API_KEY_ANDROID}}
OPENAI_KEY: ${{secrets.OPENAI_KEY}}
STORE_FILE_BASE64: ${{secrets.SIGNING_KEY_BASE64}}
STORE_PASSWORD: ${{secrets.SIGNING_KEYSTORE_PASSWORD}}
KEY_ALIAS: ${{secrets.SIGNING_KEY_ALIAS}}
KEY_PASSWORD: ${{secrets.SIGNING_KEY_PASSWORD}}
SUPABASE_URL: ${{secrets.SUPABASE_URL}}
SUPABASE_KEY: ${{secrets.SUPABASE_KEY}}

name: Save Release APK artifact
runs-on: macos-14
steps:
- uses: actions/checkout@v4
with:
lfs: true

- uses: actions/setup-java@v4
with:
distribution: 'zulu'
java-version: '17'

- name: Setup secrets.properties and Configurations/Release.xcconfig
run: ./environments.sh

- name: Decode keystore file from secrets
run: echo "$STORE_FILE_BASE64" | base64 --decode > keystore

- name: Inject Signing params into gradle.properties
run: |
echo STORE_FILE=keystore >> gradle.properties
echo STORE_PASSWORD="$STORE_PASSWORD" >> gradle.properties
echo KEY_PASSWORD="$KEY_PASSWORD" >> gradle.properties
echo KEY_ALIAS="$KEY_ALIAS" >> gradle.properties
cat gradle.properties
- name: Build Android App (Release)
run: ./gradlew androidApp:app:assembleRelease

- name: Upload APK artifact
uses: actions/upload-artifact@v4
with:
name: apk-release
path: androidApp/app/build/outputs/apk/release/app-release.apk
5 changes: 3 additions & 2 deletions androidApp/app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ plugins {
alias(libs.plugins.compose.compiler)
alias(libs.plugins.kotlin.serialization)
id("com.google.android.libraries.mapsplatform.secrets-gradle-plugin")
id("io.sentry.android.gradle") version "4.14.1"
id("io.sentry.android.gradle") version "5.1.0"
id("com.google.firebase.appdistribution") version "5.1.0"
}

Expand All @@ -16,7 +16,7 @@ android {
applicationId = "com.foreverrafs.superdiary"
minSdk = 28
targetSdk = 35
versionCode = 19
versionCode = 26
versionName = "0.0.1"

val sentryBaseUrl = System.getenv("SENTRY_BASE_URL_ANDROID") ?: ""
Expand Down Expand Up @@ -137,6 +137,7 @@ dependencies {
implementation(libs.androidx.activity.compose)
implementation(libs.google.material)
implementation(projects.sharedUi)
implementation(projects.feature.diaryAuth)
implementation(projects.core.analytics)
implementation(libs.koin.android)
implementation(libs.androidx.core)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,48 +10,41 @@ import com.foreverrafs.superdiary.core.logging.SentryLogger
import com.foreverrafs.superdiary.ui.di.compositeModule
import org.koin.android.ext.koin.androidContext
import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
import org.koin.core.context.startKoin

class DiaryApp : Application(), KoinComponent {
private val androidContextProvider: AndroidContextProvider by inject()
private val androidContextProvider = AndroidContextProvider.getInstance()
override fun onCreate() {
super.onCreate()
initializeKoin()
registerAndroidContextProviderCallbacks()
}

private fun registerAndroidContextProviderCallbacks() {
registerActivityLifecycleCallbacks(object : ActivityLifecycleCallbacks {
override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
androidContextProvider.setContext(activity)
}
registerActivityLifecycleCallbacks(
object : ActivityLifecycleCallbacks {
override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) =
Unit

override fun onActivityStarted(activity: Activity) {
androidContextProvider.setContext(activity)
}
override fun onActivityStarted(activity: Activity) = Unit

// Sometimes activities will cycle between paused and resumed states
override fun onActivityResumed(activity: Activity) {
androidContextProvider.setContext(activity)
}
// Sometimes activities will cycle between paused and resumed states
override fun onActivityResumed(activity: Activity) {
androidContextProvider.setContext(activity)
}

override fun onActivityPaused(activity: Activity) {
androidContextProvider.clearContext()
}
override fun onActivityPaused(activity: Activity) {
androidContextProvider.clearContext()
}

// Cleared in onPaused but being extra cautious
override fun onActivityStopped(activity: Activity) {
androidContextProvider.clearContext()
}
override fun onActivityStopped(activity: Activity) = Unit

override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) = Unit
override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) =
Unit

// Cleared in onPaused but being extra cautious
override fun onActivityDestroyed(activity: Activity) {
androidContextProvider.clearContext()
}
})
override fun onActivityDestroyed(activity: Activity) = Unit
},
)
}

private fun initializeKoin() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@ import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.semantics.testTagsAsResourceId
import com.foreverrafs.superdiary.auth.register.DeeplinkContainer
import com.foreverrafs.superdiary.core.logging.AggregateLogger
import com.foreverrafs.superdiary.ui.App
import com.foreverrafs.superdiary.ui.feature.auth.register.DeeplinkContainer
import io.github.jan.supabase.SupabaseClient
import io.github.jan.supabase.auth.auth
import org.koin.android.ext.android.inject
Expand Down
1 change: 1 addition & 0 deletions common-test/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ kotlin {
implementation(libs.kotlinx.coroutines.test)
implementation(libs.koin.core)
implementation(projects.commonUtils)
implementation(libs.turbine)
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.foreverrafs.superdiary.ui
package com.foreverrafs.superdiary.common.coroutines

import app.cash.turbine.ReceiveTurbine

Expand Down
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ plugins {
kotlin {
androidTarget()

iosX64()
jvm()
iosX64()
iosArm64()
iosSimulatorArm64()

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.foreverrafs.auth

import android.annotation.SuppressLint
import android.content.Context

/**
Expand All @@ -11,10 +12,16 @@ import android.content.Context
* This should only be used from the Application class where it can be
* cleared in a structured manner
*/
class AndroidContextProvider {
class AndroidContextProvider private constructor() {
private var context: Context? = null
fun getContext(): Context? = context

companion object {
@SuppressLint("StaticFieldLeak")
private val instance = AndroidContextProvider()
fun getInstance(): AndroidContextProvider = instance
}

fun setContext(context: Context) {
this.context = context
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,10 @@ import com.foreverrafs.auth.BiometricAuth
import org.koin.core.module.Module
import org.koin.core.module.dsl.bind
import org.koin.core.module.dsl.factoryOf
import org.koin.core.module.dsl.singleOf
import org.koin.dsl.module

internal actual fun platformAuthModule(): Module = module {
singleOf(::AndroidContextProvider)
single<AndroidContextProvider> { AndroidContextProvider.getInstance() }
factoryOf(::AndroidAuth) { bind<AuthApi>() }
factoryOf(::AndroidBiometricAuth) { bind<BiometricAuth>() }
}
1 change: 1 addition & 0 deletions design-system/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ kotlin {
androidMain {
dependencies {
implementation(libs.compose.ui.tooling)
implementation(libs.androidx.activity.compose)
implementation(libs.kotlinx.coroutines.android)
implementation(libs.google.maps.compose)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.foreverrafs.superdiary.design.components

import androidx.compose.runtime.Composable

@Composable
actual fun BackHandler(onBack: () -> Unit) {
androidx.activity.compose.BackHandler(
enabled = true,
onBack = onBack,
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package com.foreverrafs.superdiary.design.components

import androidx.compose.runtime.Composable
import org.jetbrains.compose.resources.stringResource
import superdiary.design_system.generated.resources.Res
import superdiary.design_system.generated.resources.confirm_delete_diary_dialog_message
import superdiary.design_system.generated.resources.confirm_delete_diary_dialog_title
import superdiary.design_system.generated.resources.confirm_delete_diary_negative_button
import superdiary.design_system.generated.resources.confirm_delete_diary_positive_button
import superdiary.design_system.generated.resources.confirm_save_diary_dialog_message
import superdiary.design_system.generated.resources.confirm_save_diary_dialog_title
import superdiary.design_system.generated.resources.confirm_save_diary_negative_button
import superdiary.design_system.generated.resources.confirm_save_diary_positive_button

@Composable
actual fun ConfirmSaveDialog(
onDismiss: () -> Unit,
onConfirm: () -> Unit,
onDismissRequest: () -> Unit,
) {
BasicMaterialDialog(
onNegativeButton = onDismiss,
onPositiveButton = onConfirm,
title = stringResource(Res.string.confirm_save_diary_dialog_title),
message = stringResource(Res.string.confirm_save_diary_dialog_message),
positiveButtonText = stringResource(Res.string.confirm_save_diary_positive_button),
negativeButtonText = stringResource(Res.string.confirm_save_diary_negative_button),
onDismissRequest = onDismissRequest,
)
}

@Composable
actual fun ConfirmDeleteDialog(onDismiss: () -> Unit, onConfirm: () -> Unit) {
BasicMaterialDialog(
onNegativeButton = onDismiss,
onPositiveButton = onConfirm,
title = stringResource(Res.string.confirm_delete_diary_dialog_title),
message = stringResource(Res.string.confirm_delete_diary_dialog_message),
negativeButtonText = stringResource(Res.string.confirm_delete_diary_negative_button),
positiveButtonText = stringResource(Res.string.confirm_delete_diary_positive_button),
onDismissRequest = onDismiss,
)
}

@Composable
actual fun ConfirmBiometricAuthDialog(
onDismiss: () -> Unit,
onEnableBiometric: () -> Unit,
onDismissRequest: () -> Unit,
) {
BasicMaterialDialog(
onNegativeButton = onDismiss,
onPositiveButton = onEnableBiometric,
title = "Biometric Authentication",
message = "Do you want to enable biometric authentication?",
negativeButtonText = "No",
positiveButtonText = "Yes",
onDismissRequest = onDismissRequest,
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,9 @@
<string name="confirm_save_diary_dialog_title">Confirm Save</string>
<string name="confirm_save_diary_dialog_message">Do you want to save the entry?</string>
<string name="confirm_save_diary_positive_button">Save</string>
<string name="confirm_save_diary_cancel_button">Cancel</string>
<string name="confirm_save_diary_negative_button">Don't save</string>

<string name="confirm_logout_dialog_title">Confirm logout</string>
<string name="confirm_logout_dialog_message">Are you sure you want to logout?</string>
<string name="confirm_logout_dialog_cancel_button">Cancel</string>
<string name="confirm_logout_dialog_confirm_button">Logout</string>

<!-- Labels -->
<string name="label_diary_ai">Diary AI:</string>
<string name="label_add_entry">Add entry</string>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.foreverrafs.superdiary.ui
package com.foreverrafs.superdiary.design.components

import androidx.compose.runtime.Composable

Expand Down
Loading

0 comments on commit 389e098

Please sign in to comment.