From 1123cf2a74514a04d5d5d0f5c8ce613f1291ca27 Mon Sep 17 00:00:00 2001 From: Andi-IM Date: Mon, 7 Aug 2023 06:36:57 +0700 Subject: [PATCH 01/29] feat(hilt) : Implement dependency injection --- app/build.gradle.kts | 10 ++++++++- app/src/main/AndroidManifest.xml | 1 + .../app/PlantScanHiltApplication.kt | 15 +++++++++++++ .../andiim/orchidscan/app/di/DebugModule.kt | 13 ++++++++++++ .../orchidscan/app/di/TimberDebugTree.kt | 21 +++++++++++++++++++ library-android/build.gradle.kts | 2 +- 6 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/PlantScanHiltApplication.kt create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/di/DebugModule.kt create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/di/TimberDebugTree.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 2f306675..2112f9e3 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,6 +1,8 @@ plugins { id("com.android.application") kotlin("android") + kotlin("kapt") + id("com.google.dagger.hilt.android") } android { @@ -16,7 +18,7 @@ android { testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } buildFeatures { - viewBinding = true + buildConfig = true } compileOptions { sourceCompatibility = JavaVersion.VERSION_17 @@ -55,6 +57,11 @@ android { } dependencies { + implementation(libs.timber) + implementation(libs.dagger.hilt) + implementation(libs.dagger.hilt.navigation.compose) + kapt(libs.dagger.hilt.compiler) + implementation(projects.libraryAndroid) implementation(projects.libraryKotlin) @@ -67,4 +74,5 @@ dependencies { androidTestImplementation(libs.androidx.test.ext.junit.ktx) androidTestImplementation(libs.androidx.test.rules) androidTestImplementation(libs.espresso.core) + androidTestImplementation(libs.dagger.hilt.testing) } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ddf83260..a849f999 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,6 +3,7 @@ xmlns:tools="http://schemas.android.com/tools"> Log.v(tag, message, t) + Log.DEBUG -> Log.d(tag, message, t) + Log.INFO -> Log.i(tag, message, t) + Log.WARN -> Log.w(tag, message, t) + Log.ERROR -> Log.e(tag, message, t) + else -> Log.wtf(tag, message, t) + } + } +} diff --git a/library-android/build.gradle.kts b/library-android/build.gradle.kts index 71dadf1d..ba68a9c1 100644 --- a/library-android/build.gradle.kts +++ b/library-android/build.gradle.kts @@ -12,7 +12,7 @@ android { defaultConfig { minSdk = libs.versions.min.sdk.version.get().toInt() - namespace = "com.ncorti.kotlin.template.library.android" + namespace = "com.github.andiim.orchidscan.library.android" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles("consumer-rules.pro") From 1a52ffda34b8f0fe0f771f1e0849fc19e4ad5945 Mon Sep 17 00:00:00 2001 From: Andi-IM Date: Mon, 7 Aug 2023 06:37:56 +0700 Subject: [PATCH 02/29] refactor : Change namespace from template to the right name --- .../template => github/andiim/orchidscan}/app/MainActivity.kt | 2 +- .../andiim/orchidscan}/library/android/ToastUtilTest.kt | 3 ++- .../andiim/orchidscan}/library/android/ToastUtil.kt | 2 +- .../andiim/orchidscan}/library/FactorialCalculator.kt | 2 +- .../andiim/orchidscan}/library/FactorialCalculatorTest.kt | 4 ++-- 5 files changed, 7 insertions(+), 6 deletions(-) rename app/src/main/java/com/{ncorti/kotlin/template => github/andiim/orchidscan}/app/MainActivity.kt (84%) rename library-android/src/androidTest/java/com/{ncorti/kotlin/template => github/andiim/orchidscan}/library/android/ToastUtilTest.kt (85%) rename library-android/src/main/java/com/{ncorti/kotlin/template => github/andiim/orchidscan}/library/android/ToastUtil.kt (82%) rename library-kotlin/src/main/java/com/{ncorti/kotlin/template => github/andiim/orchidscan}/library/FactorialCalculator.kt (90%) rename library-kotlin/src/test/java/com/{ncorti/kotlin/template => github/andiim/orchidscan}/library/FactorialCalculatorTest.kt (87%) diff --git a/app/src/main/java/com/ncorti/kotlin/template/app/MainActivity.kt b/app/src/main/java/com/github/andiim/orchidscan/app/MainActivity.kt similarity index 84% rename from app/src/main/java/com/ncorti/kotlin/template/app/MainActivity.kt rename to app/src/main/java/com/github/andiim/orchidscan/app/MainActivity.kt index c2557258..13997be1 100644 --- a/app/src/main/java/com/ncorti/kotlin/template/app/MainActivity.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/MainActivity.kt @@ -1,4 +1,4 @@ -package com.ncorti.kotlin.template.app +package com.github.andiim.orchidscan.app import android.os.Bundle import androidx.activity.ComponentActivity diff --git a/library-android/src/androidTest/java/com/ncorti/kotlin/template/library/android/ToastUtilTest.kt b/library-android/src/androidTest/java/com/github/andiim/orchidscan/library/android/ToastUtilTest.kt similarity index 85% rename from library-android/src/androidTest/java/com/ncorti/kotlin/template/library/android/ToastUtilTest.kt rename to library-android/src/androidTest/java/com/github/andiim/orchidscan/library/android/ToastUtilTest.kt index 2f0dfd36..2b6d2ef9 100644 --- a/library-android/src/androidTest/java/com/ncorti/kotlin/template/library/android/ToastUtilTest.kt +++ b/library-android/src/androidTest/java/com/github/andiim/orchidscan/library/android/ToastUtilTest.kt @@ -1,8 +1,9 @@ -package com.ncorti.kotlin.template.library.android +package com.github.andiim.orchidscan.library.android import android.widget.Toast import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry +import com.github.andiim.orchidscan.library.android.ToastUtil import org.junit.Assert.assertEquals import org.junit.Test import org.junit.runner.RunWith diff --git a/library-android/src/main/java/com/ncorti/kotlin/template/library/android/ToastUtil.kt b/library-android/src/main/java/com/github/andiim/orchidscan/library/android/ToastUtil.kt similarity index 82% rename from library-android/src/main/java/com/ncorti/kotlin/template/library/android/ToastUtil.kt rename to library-android/src/main/java/com/github/andiim/orchidscan/library/android/ToastUtil.kt index 6542f810..75f7a4a1 100644 --- a/library-android/src/main/java/com/ncorti/kotlin/template/library/android/ToastUtil.kt +++ b/library-android/src/main/java/com/github/andiim/orchidscan/library/android/ToastUtil.kt @@ -1,4 +1,4 @@ -package com.ncorti.kotlin.template.library.android +package com.github.andiim.orchidscan.library.android import android.content.Context import android.widget.Toast diff --git a/library-kotlin/src/main/java/com/ncorti/kotlin/template/library/FactorialCalculator.kt b/library-kotlin/src/main/java/com/github/andiim/orchidscan/library/FactorialCalculator.kt similarity index 90% rename from library-kotlin/src/main/java/com/ncorti/kotlin/template/library/FactorialCalculator.kt rename to library-kotlin/src/main/java/com/github/andiim/orchidscan/library/FactorialCalculator.kt index 2f4758cf..fbc74094 100644 --- a/library-kotlin/src/main/java/com/ncorti/kotlin/template/library/FactorialCalculator.kt +++ b/library-kotlin/src/main/java/com/github/andiim/orchidscan/library/FactorialCalculator.kt @@ -1,4 +1,4 @@ -package com.ncorti.kotlin.template.library +package com.github.andiim.orchidscan.library object FactorialCalculator { private const val MAX_FACTORIAL_64BIT = 20 diff --git a/library-kotlin/src/test/java/com/ncorti/kotlin/template/library/FactorialCalculatorTest.kt b/library-kotlin/src/test/java/com/github/andiim/orchidscan/library/FactorialCalculatorTest.kt similarity index 87% rename from library-kotlin/src/test/java/com/ncorti/kotlin/template/library/FactorialCalculatorTest.kt rename to library-kotlin/src/test/java/com/github/andiim/orchidscan/library/FactorialCalculatorTest.kt index c3763a97..9866178e 100644 --- a/library-kotlin/src/test/java/com/ncorti/kotlin/template/library/FactorialCalculatorTest.kt +++ b/library-kotlin/src/test/java/com/github/andiim/orchidscan/library/FactorialCalculatorTest.kt @@ -1,6 +1,6 @@ -package com.ncorti.kotlin.template.library +package com.github.andiim.orchidscan.library -import com.ncorti.kotlin.template.library.FactorialCalculator.computeFactorial +import com.github.andiim.orchidscan.library.FactorialCalculator.computeFactorial import org.junit.Assert.assertEquals import org.junit.Assert.assertThrows import org.junit.Test From edc8516afd2db2ce986b617b46db83da16b7fb32 Mon Sep 17 00:00:00 2001 From: Andi-IM Date: Mon, 7 Aug 2023 06:37:56 +0700 Subject: [PATCH 03/29] refactor : Change namespace from template to the right name --- .../template => github/andiim/orchidscan}/app/MainActivity.kt | 2 +- .../andiim/orchidscan}/library/android/ToastUtilTest.kt | 3 ++- .../andiim/orchidscan}/library/android/ToastUtil.kt | 2 +- .../andiim/orchidscan}/library/FactorialCalculator.kt | 2 +- .../andiim/orchidscan}/library/FactorialCalculatorTest.kt | 4 ++-- settings.gradle.kts | 2 +- 6 files changed, 8 insertions(+), 7 deletions(-) rename app/src/main/java/com/{ncorti/kotlin/template => github/andiim/orchidscan}/app/MainActivity.kt (84%) rename library-android/src/androidTest/java/com/{ncorti/kotlin/template => github/andiim/orchidscan}/library/android/ToastUtilTest.kt (85%) rename library-android/src/main/java/com/{ncorti/kotlin/template => github/andiim/orchidscan}/library/android/ToastUtil.kt (82%) rename library-kotlin/src/main/java/com/{ncorti/kotlin/template => github/andiim/orchidscan}/library/FactorialCalculator.kt (90%) rename library-kotlin/src/test/java/com/{ncorti/kotlin/template => github/andiim/orchidscan}/library/FactorialCalculatorTest.kt (87%) diff --git a/app/src/main/java/com/ncorti/kotlin/template/app/MainActivity.kt b/app/src/main/java/com/github/andiim/orchidscan/app/MainActivity.kt similarity index 84% rename from app/src/main/java/com/ncorti/kotlin/template/app/MainActivity.kt rename to app/src/main/java/com/github/andiim/orchidscan/app/MainActivity.kt index c2557258..13997be1 100644 --- a/app/src/main/java/com/ncorti/kotlin/template/app/MainActivity.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/MainActivity.kt @@ -1,4 +1,4 @@ -package com.ncorti.kotlin.template.app +package com.github.andiim.orchidscan.app import android.os.Bundle import androidx.activity.ComponentActivity diff --git a/library-android/src/androidTest/java/com/ncorti/kotlin/template/library/android/ToastUtilTest.kt b/library-android/src/androidTest/java/com/github/andiim/orchidscan/library/android/ToastUtilTest.kt similarity index 85% rename from library-android/src/androidTest/java/com/ncorti/kotlin/template/library/android/ToastUtilTest.kt rename to library-android/src/androidTest/java/com/github/andiim/orchidscan/library/android/ToastUtilTest.kt index 2f0dfd36..2b6d2ef9 100644 --- a/library-android/src/androidTest/java/com/ncorti/kotlin/template/library/android/ToastUtilTest.kt +++ b/library-android/src/androidTest/java/com/github/andiim/orchidscan/library/android/ToastUtilTest.kt @@ -1,8 +1,9 @@ -package com.ncorti.kotlin.template.library.android +package com.github.andiim.orchidscan.library.android import android.widget.Toast import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry +import com.github.andiim.orchidscan.library.android.ToastUtil import org.junit.Assert.assertEquals import org.junit.Test import org.junit.runner.RunWith diff --git a/library-android/src/main/java/com/ncorti/kotlin/template/library/android/ToastUtil.kt b/library-android/src/main/java/com/github/andiim/orchidscan/library/android/ToastUtil.kt similarity index 82% rename from library-android/src/main/java/com/ncorti/kotlin/template/library/android/ToastUtil.kt rename to library-android/src/main/java/com/github/andiim/orchidscan/library/android/ToastUtil.kt index 6542f810..75f7a4a1 100644 --- a/library-android/src/main/java/com/ncorti/kotlin/template/library/android/ToastUtil.kt +++ b/library-android/src/main/java/com/github/andiim/orchidscan/library/android/ToastUtil.kt @@ -1,4 +1,4 @@ -package com.ncorti.kotlin.template.library.android +package com.github.andiim.orchidscan.library.android import android.content.Context import android.widget.Toast diff --git a/library-kotlin/src/main/java/com/ncorti/kotlin/template/library/FactorialCalculator.kt b/library-kotlin/src/main/java/com/github/andiim/orchidscan/library/FactorialCalculator.kt similarity index 90% rename from library-kotlin/src/main/java/com/ncorti/kotlin/template/library/FactorialCalculator.kt rename to library-kotlin/src/main/java/com/github/andiim/orchidscan/library/FactorialCalculator.kt index 2f4758cf..fbc74094 100644 --- a/library-kotlin/src/main/java/com/ncorti/kotlin/template/library/FactorialCalculator.kt +++ b/library-kotlin/src/main/java/com/github/andiim/orchidscan/library/FactorialCalculator.kt @@ -1,4 +1,4 @@ -package com.ncorti.kotlin.template.library +package com.github.andiim.orchidscan.library object FactorialCalculator { private const val MAX_FACTORIAL_64BIT = 20 diff --git a/library-kotlin/src/test/java/com/ncorti/kotlin/template/library/FactorialCalculatorTest.kt b/library-kotlin/src/test/java/com/github/andiim/orchidscan/library/FactorialCalculatorTest.kt similarity index 87% rename from library-kotlin/src/test/java/com/ncorti/kotlin/template/library/FactorialCalculatorTest.kt rename to library-kotlin/src/test/java/com/github/andiim/orchidscan/library/FactorialCalculatorTest.kt index c3763a97..9866178e 100644 --- a/library-kotlin/src/test/java/com/ncorti/kotlin/template/library/FactorialCalculatorTest.kt +++ b/library-kotlin/src/test/java/com/github/andiim/orchidscan/library/FactorialCalculatorTest.kt @@ -1,6 +1,6 @@ -package com.ncorti.kotlin.template.library +package com.github.andiim.orchidscan.library -import com.ncorti.kotlin.template.library.FactorialCalculator.computeFactorial +import com.github.andiim.orchidscan.library.FactorialCalculator.computeFactorial import org.junit.Assert.assertEquals import org.junit.Assert.assertThrows import org.junit.Test diff --git a/settings.gradle.kts b/settings.gradle.kts index b06bfcaa..9edcbada 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -13,7 +13,7 @@ dependencyResolutionManagement { } } -rootProject.name = ("kotlin-android-template") +rootProject.name = ("PlantScan") enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") From 0f5f9e1850cf72862c389ec00213f9b8195f740e Mon Sep 17 00:00:00 2001 From: Andi-IM Date: Mon, 7 Aug 2023 07:08:03 +0700 Subject: [PATCH 04/29] feat : initialize compose to android project --- app/build.gradle.kts | 17 +++ app/src/main/AndroidManifest.xml | 2 +- .../{MainActivity.kt => PlantScanActivity.kt} | 5 +- .../andiim/orchidscan/app/PlantScanApp.kt | 71 ++++++++++++ .../ui/common/extensions/ModifierExtension.kt | 52 +++++++++ .../app/ui/common/snackbar/SnackbarManager.kt | 20 ++++ .../app/ui/common/snackbar/SnackbarMessage.kt | 25 ++++ .../app/ui/states/PlantScanAppState.kt | 54 +++++++++ .../andiim/orchidscan/app/ui/theme/Color.kt | 68 +++++++++++ .../andiim/orchidscan/app/ui/theme/Shapes.kt | 20 ++++ .../andiim/orchidscan/app/ui/theme/Theme.kt | 108 ++++++++++++++++++ .../andiim/orchidscan/app/ui/theme/Type.kt | 17 +++ app/src/main/res/values/strings.xml | 11 +- .../android/extensions/BitmapExtensions.kt | 19 +++ .../android/extensions/StringExtension.kt | 25 ++++ 15 files changed, 503 insertions(+), 11 deletions(-) rename app/src/main/java/com/github/andiim/orchidscan/app/{MainActivity.kt => PlantScanActivity.kt} (62%) create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/PlantScanApp.kt create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/ui/common/extensions/ModifierExtension.kt create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/ui/common/snackbar/SnackbarManager.kt create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/ui/common/snackbar/SnackbarMessage.kt create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/ui/states/PlantScanAppState.kt create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/ui/theme/Color.kt create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/ui/theme/Shapes.kt create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/ui/theme/Theme.kt create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/ui/theme/Type.kt create mode 100644 library-android/src/main/java/com/github/andiim/orchidscan/library/android/extensions/BitmapExtensions.kt create mode 100644 library-android/src/main/java/com/github/andiim/orchidscan/library/android/extensions/StringExtension.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 2112f9e3..b79de959 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -58,6 +58,8 @@ android { dependencies { implementation(libs.timber) + implementation(libs.material) + implementation(libs.dagger.hilt) implementation(libs.dagger.hilt.navigation.compose) kapt(libs.dagger.hilt.compiler) @@ -65,9 +67,18 @@ dependencies { implementation(projects.libraryAndroid) implementation(projects.libraryKotlin) + implementation(platform(libs.compose.bom)) + implementation(libs.bundles.compose) + debugImplementation(libs.bundles.compose.debug) + implementation(libs.bundles.lifecycle) + implementation(libs.accompanist.permission) + implementation(libs.accompanist.webview) + implementation(libs.androidx.appcompat) implementation(libs.androidx.core.ktx) + implementation(libs.bundles.camera) + testImplementation(libs.junit) androidTestImplementation(libs.androidx.test.ext.junit) @@ -75,4 +86,10 @@ dependencies { androidTestImplementation(libs.androidx.test.rules) androidTestImplementation(libs.espresso.core) androidTestImplementation(libs.dagger.hilt.testing) + androidTestImplementation(libs.kotlin.coroutines.test) + androidTestImplementation(libs.truth) + kaptAndroidTest(libs.dagger.hilt.compiler) } + +kapt { correctErrorTypes = true } +hilt { enableAggregatingTask = true } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a849f999..1c457987 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -11,7 +11,7 @@ android:supportsRtl="true" android:theme="@style/AppTheme" tools:ignore="AllowBackup"> - diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/MainActivity.kt b/app/src/main/java/com/github/andiim/orchidscan/app/PlantScanActivity.kt similarity index 62% rename from app/src/main/java/com/github/andiim/orchidscan/app/MainActivity.kt rename to app/src/main/java/com/github/andiim/orchidscan/app/PlantScanActivity.kt index 13997be1..eb332c7b 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/MainActivity.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/PlantScanActivity.kt @@ -2,11 +2,12 @@ package com.github.andiim.orchidscan.app import android.os.Bundle import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent -class MainActivity : ComponentActivity() { +class PlantScanActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - + setContent { OrchidScanApp() } } } diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/PlantScanApp.kt b/app/src/main/java/com/github/andiim/orchidscan/app/PlantScanApp.kt new file mode 100644 index 00000000..ee9f5dae --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/PlantScanApp.kt @@ -0,0 +1,71 @@ +package com.github.andiim.orchidscan.app + +import android.content.res.Resources +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Snackbar +import androidx.compose.material3.SnackbarHost +import androidx.compose.material3.SnackbarHostState +import androidx.compose.material3.Surface +import androidx.compose.runtime.Composable +import androidx.compose.runtime.ReadOnlyComposable +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalConfiguration +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.unit.dp +import androidx.navigation.NavHostController +import androidx.navigation.compose.rememberNavController +import com.github.andiim.orchidscan.app.ui.common.snackbar.SnackbarManager +import com.github.andiim.orchidscan.app.ui.states.PlantScanAppState +import com.github.andiim.orchidscan.app.ui.theme.PlantScanTheme +import kotlinx.coroutines.CoroutineScope + +@Composable +fun OrchidScanApp() { + PlantScanTheme { + val appState = rememberAppState() + + Surface(color = MaterialTheme.colorScheme.background) { + Scaffold( + snackbarHost = { + SnackbarHost( + hostState = appState.snackbarHostState, + modifier = Modifier.padding(8.dp), + snackbar = { snackbarData -> + Snackbar( + snackbarData, + contentColor = MaterialTheme.colorScheme.onPrimary + ) + }) + }, + ) { innerPadding -> + Box(modifier = Modifier.padding(innerPadding)) + } + } + } +} + +@Composable +@ReadOnlyComposable +fun resources(): Resources { + LocalConfiguration.current + return LocalContext.current.resources +} + +@Composable +fun rememberAppState( + snackbarHostState: SnackbarHostState = SnackbarHostState(), + navController: NavHostController = rememberNavController(), + snackbarManager: SnackbarManager = SnackbarManager, + resources: Resources = resources(), + coroutineScope: CoroutineScope = rememberCoroutineScope() +) = + remember(snackbarHostState, navController, snackbarManager, resources, coroutineScope) { + PlantScanAppState( + snackbarHostState, navController, snackbarManager, resources, coroutineScope + ) + } diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/extensions/ModifierExtension.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/extensions/ModifierExtension.kt new file mode 100644 index 00000000..42fef268 --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/extensions/ModifierExtension.kt @@ -0,0 +1,52 @@ +package com.github.andiim.orchidscan.app.ui.common.extensions + +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.widthIn +import androidx.compose.foundation.layout.wrapContentHeight +import androidx.compose.foundation.layout.wrapContentSize +import androidx.compose.foundation.layout.wrapContentWidth +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp + +fun Modifier.textButton(): Modifier { + return this.fillMaxWidth().padding(16.dp, 8.dp, 16.dp, 0.dp) +} + +fun Modifier.basicButton(): Modifier { + return this.fillMaxWidth().padding(16.dp, 8.dp) +} + +fun Modifier.card(): Modifier { + return this.padding(16.dp, 0.dp, 16.dp, 8.dp) +} + +fun Modifier.contextMenu(): Modifier { + return this.wrapContentWidth() +} + +fun Modifier.alertDialog(): Modifier { + return this.widthIn(280.dp, 560.dp).wrapContentHeight() +} + +fun Modifier.dropdownSelector(): Modifier { + return this.fillMaxWidth() +} + +fun Modifier.fieldModifier(): Modifier { + return this.fillMaxWidth().padding(16.dp, 4.dp) +} + +fun Modifier.toolbarActions(): Modifier { + return this.wrapContentSize(Alignment.TopEnd) +} + +fun Modifier.spacer(): Modifier { + return this.fillMaxWidth().padding(12.dp) +} + +fun Modifier.smallSpacer(): Modifier { + return this.fillMaxWidth().height(8.dp) +} \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/snackbar/SnackbarManager.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/snackbar/SnackbarManager.kt new file mode 100644 index 00000000..59a430ac --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/snackbar/SnackbarManager.kt @@ -0,0 +1,20 @@ +package com.github.andiim.orchidscan.app.ui.common.snackbar + +import androidx.annotation.StringRes +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow + +object SnackbarManager { + private val messages: MutableStateFlow = MutableStateFlow(null) + val snackbarMessages: StateFlow + get() = messages.asStateFlow() + + fun showMessage(@StringRes message: Int) { + messages.value = SnackbarMessage.ResourceSnackbar(message) + } + + fun showMessage(message: SnackbarMessage) { + messages.value = message + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/snackbar/SnackbarMessage.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/snackbar/SnackbarMessage.kt new file mode 100644 index 00000000..d712229b --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/snackbar/SnackbarMessage.kt @@ -0,0 +1,25 @@ +package com.github.andiim.orchidscan.app.ui.common.snackbar + +import android.content.res.Resources +import androidx.annotation.StringRes +import com.github.andiim.orchidscan.app.R + +sealed class SnackbarMessage { + class StringSnackbar(val message: String) : SnackbarMessage() + class ResourceSnackbar(@StringRes val message: Int) : SnackbarMessage() + + companion object { + fun SnackbarMessage.toMessage(resources: Resources): String { + return when (this) { + is StringSnackbar -> this.message + is ResourceSnackbar -> resources.getString(this.message) + } + } + + fun Throwable.toSnackbarMessage(): SnackbarMessage { + val message = this.message.orEmpty() + return if (message.isNotBlank()) StringSnackbar(message) + else ResourceSnackbar(R.string.generic_error) + } + } +} diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/states/PlantScanAppState.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/states/PlantScanAppState.kt new file mode 100644 index 00000000..a491851d --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/states/PlantScanAppState.kt @@ -0,0 +1,54 @@ +package com.github.andiim.orchidscan.app.ui.states + +import android.content.res.Resources +import androidx.compose.material3.SnackbarHostState +import androidx.navigation.NavGraph.Companion.findStartDestination +import androidx.navigation.NavHostController +import com.github.andiim.orchidscan.app.ui.common.snackbar.SnackbarManager +import com.github.andiim.orchidscan.app.ui.common.snackbar.SnackbarMessage.Companion.toMessage +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.flow.filterNotNull +import kotlinx.coroutines.launch + +class PlantScanAppState( + val snackbarHostState: SnackbarHostState, + val navController: NavHostController, + private val snackbarManager: SnackbarManager, + private val resources: Resources, + coroutineScope: CoroutineScope +) { + init { + coroutineScope.launch { + snackbarManager.snackbarMessages.filterNotNull().collect { snackbarMessage -> + val text = snackbarMessage.toMessage(resources) + snackbarHostState.showSnackbar(text) + } + } + } + + fun popUp() { + navController.popBackStack() + } + + fun navigate(route: String, singleTopLaunch: Boolean = true) { + navController.navigate(route) { launchSingleTop = singleTopLaunch } + } + + fun navigateAndPopUp(route: String, popUp: String) { + navController.navigate(route) { + launchSingleTop = true + popUpTo(popUp) { inclusive = true } + } + } + + fun clearAndNavigate(route: String) { + navController.navigate(route) { + popUpTo(navController.graph.findStartDestination().id) { + // saveState = true + inclusive = true + } + launchSingleTop = true + // restoreState = true + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/theme/Color.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/theme/Color.kt new file mode 100644 index 00000000..91837084 --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/theme/Color.kt @@ -0,0 +1,68 @@ +package com.github.andiim.orchidscan.app.ui.theme + +import androidx.compose.ui.graphics.Color + +val md_theme_light_primary = Color(0xFFAF0095) +val md_theme_light_onPrimary = Color(0xFFFFFFFF) +val md_theme_light_primaryContainer = Color(0xFFFFD7EE) +val md_theme_light_onPrimaryContainer = Color(0xFF3A0030) +val md_theme_light_secondary = Color(0xFF87458A) +val md_theme_light_onSecondary = Color(0xFFFFFFFF) +val md_theme_light_secondaryContainer = Color(0xFFFFD6FB) +val md_theme_light_onSecondaryContainer = Color(0xFF36003D) +val md_theme_light_tertiary = Color(0xFF456812) +val md_theme_light_onTertiary = Color(0xFFFFFFFF) +val md_theme_light_tertiaryContainer = Color(0xFFC5F08B) +val md_theme_light_onTertiaryContainer = Color(0xFF102000) +val md_theme_light_error = Color(0xFFBA1A1A) +val md_theme_light_errorContainer = Color(0xFFFFDAD6) +val md_theme_light_onError = Color(0xFFFFFFFF) +val md_theme_light_onErrorContainer = Color(0xFF410002) +val md_theme_light_background = Color(0xFFF9FFE8) +val md_theme_light_onBackground = Color(0xFF112000) +val md_theme_light_surface = Color(0xFFF9FFE8) +val md_theme_light_onSurface = Color(0xFF112000) +val md_theme_light_surfaceVariant = Color(0xFFEFDEE6) +val md_theme_light_onSurfaceVariant = Color(0xFF4F444A) +val md_theme_light_outline = Color(0xFF81737A) +val md_theme_light_inverseOnSurface = Color(0xFFD4FF97) +val md_theme_light_inverseSurface = Color(0xFF203600) +val md_theme_light_inversePrimary = Color(0xFFFFADE4) +val md_theme_light_shadow = Color(0xFF000000) +val md_theme_light_surfaceTint = Color(0xFFAF0095) +val md_theme_light_outlineVariant = Color(0xFFD2C2CA) +val md_theme_light_scrim = Color(0xFF000000) + +val md_theme_dark_primary = Color(0xFFFFADE4) +val md_theme_dark_onPrimary = Color(0xFF5F0050) +val md_theme_dark_primaryContainer = Color(0xFF860071) +val md_theme_dark_onPrimaryContainer = Color(0xFFFFD7EE) +val md_theme_dark_secondary = Color(0xFFFAACF9) +val md_theme_dark_onSecondary = Color(0xFF521458) +val md_theme_dark_secondaryContainer = Color(0xFF6C2D70) +val md_theme_dark_onSecondaryContainer = Color(0xFFFFD6FB) +val md_theme_dark_tertiary = Color(0xFFAAD472) +val md_theme_dark_onTertiary = Color(0xFF203700) +val md_theme_dark_tertiaryContainer = Color(0xFF304F00) +val md_theme_dark_onTertiaryContainer = Color(0xFFC5F08B) +val md_theme_dark_error = Color(0xFFFFB4AB) +val md_theme_dark_errorContainer = Color(0xFF93000A) +val md_theme_dark_onError = Color(0xFF690005) +val md_theme_dark_onErrorContainer = Color(0xFFFFDAD6) +val md_theme_dark_background = Color(0xFF112000) +val md_theme_dark_onBackground = Color(0xFFC6F08A) +val md_theme_dark_surface = Color(0xFF112000) +val md_theme_dark_onSurface = Color(0xFFC6F08A) +val md_theme_dark_surfaceVariant = Color(0xFF4F444A) +val md_theme_dark_onSurfaceVariant = Color(0xFFD2C2CA) +val md_theme_dark_outline = Color(0xFF9B8D94) +val md_theme_dark_inverseOnSurface = Color(0xFF112000) +val md_theme_dark_inverseSurface = Color(0xFFC6F08A) +val md_theme_dark_inversePrimary = Color(0xFFAF0095) +val md_theme_dark_shadow = Color(0xFF000000) +val md_theme_dark_surfaceTint = Color(0xFFFFADE4) +val md_theme_dark_outlineVariant = Color(0xFF4F444A) +val md_theme_dark_scrim = Color(0xFF000000) + + +val seed = Color(0xFFDF06BE) diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/theme/Shapes.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/theme/Shapes.kt new file mode 100644 index 00000000..6cacc30f --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/theme/Shapes.kt @@ -0,0 +1,20 @@ +package com.github.andiim.orchidscan.app.ui.theme + +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.runtime.ReadOnlyComposable +import androidx.compose.runtime.compositionLocalOf +import androidx.compose.ui.unit.dp + +data class Shape( + val default: RoundedCornerShape = RoundedCornerShape(0.dp), + val small: RoundedCornerShape = RoundedCornerShape(4.dp), + val medium: RoundedCornerShape = RoundedCornerShape(8.dp), + val large: RoundedCornerShape = RoundedCornerShape(16.dp) +) + +val LocalShape = compositionLocalOf { Shape() } + +val MaterialTheme.shapeScheme: Shape + @Composable @ReadOnlyComposable get() = LocalShape.current diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/theme/Theme.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/theme/Theme.kt new file mode 100644 index 00000000..9b711a13 --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/theme/Theme.kt @@ -0,0 +1,108 @@ +package com.github.andiim.orchidscan.app.ui.theme + +import android.app.Activity +import android.os.Build +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.darkColorScheme +import androidx.compose.material3.dynamicDarkColorScheme +import androidx.compose.material3.dynamicLightColorScheme +import androidx.compose.material3.lightColorScheme +import androidx.compose.runtime.Composable +import androidx.compose.runtime.SideEffect +import androidx.compose.ui.graphics.toArgb +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalView +import androidx.core.view.WindowCompat + +private val lightColorScheme = lightColorScheme( + primary = md_theme_light_primary, + onPrimary = md_theme_light_onPrimary, + primaryContainer = md_theme_light_primaryContainer, + onPrimaryContainer = md_theme_light_onPrimaryContainer, + secondary = md_theme_light_secondary, + onSecondary = md_theme_light_onSecondary, + secondaryContainer = md_theme_light_secondaryContainer, + onSecondaryContainer = md_theme_light_onSecondaryContainer, + tertiary = md_theme_light_tertiary, + onTertiary = md_theme_light_onTertiary, + tertiaryContainer = md_theme_light_tertiaryContainer, + onTertiaryContainer = md_theme_light_onTertiaryContainer, + error = md_theme_light_error, + errorContainer = md_theme_light_errorContainer, + onError = md_theme_light_onError, + onErrorContainer = md_theme_light_onErrorContainer, + background = md_theme_light_background, + onBackground = md_theme_light_onBackground, + surface = md_theme_light_surface, + onSurface = md_theme_light_onSurface, + surfaceVariant = md_theme_light_surfaceVariant, + onSurfaceVariant = md_theme_light_onSurfaceVariant, + outline = md_theme_light_outline, + inverseOnSurface = md_theme_light_inverseOnSurface, + inverseSurface = md_theme_light_inverseSurface, + inversePrimary = md_theme_light_inversePrimary, + surfaceTint = md_theme_light_surfaceTint, + outlineVariant = md_theme_light_outlineVariant, + scrim = md_theme_light_scrim, +) + + +private val darkColorScheme = darkColorScheme( + primary = md_theme_dark_primary, + onPrimary = md_theme_dark_onPrimary, + primaryContainer = md_theme_dark_primaryContainer, + onPrimaryContainer = md_theme_dark_onPrimaryContainer, + secondary = md_theme_dark_secondary, + onSecondary = md_theme_dark_onSecondary, + secondaryContainer = md_theme_dark_secondaryContainer, + onSecondaryContainer = md_theme_dark_onSecondaryContainer, + tertiary = md_theme_dark_tertiary, + onTertiary = md_theme_dark_onTertiary, + tertiaryContainer = md_theme_dark_tertiaryContainer, + onTertiaryContainer = md_theme_dark_onTertiaryContainer, + error = md_theme_dark_error, + errorContainer = md_theme_dark_errorContainer, + onError = md_theme_dark_onError, + onErrorContainer = md_theme_dark_onErrorContainer, + background = md_theme_dark_background, + onBackground = md_theme_dark_onBackground, + surface = md_theme_dark_surface, + onSurface = md_theme_dark_onSurface, + surfaceVariant = md_theme_dark_surfaceVariant, + onSurfaceVariant = md_theme_dark_onSurfaceVariant, + outline = md_theme_dark_outline, + inverseOnSurface = md_theme_dark_inverseOnSurface, + inverseSurface = md_theme_dark_inverseSurface, + inversePrimary = md_theme_dark_inversePrimary, + surfaceTint = md_theme_dark_surfaceTint, + outlineVariant = md_theme_dark_outlineVariant, + scrim = md_theme_dark_scrim, +) + +@Composable +fun PlantScanTheme( + darkTheme: Boolean = isSystemInDarkTheme(), + dynamicColor: Boolean = true, + content: @Composable () -> Unit +) { + val colorScheme = + when { + dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> { + val context = LocalContext.current + if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context) + } + darkTheme -> darkColorScheme + else -> lightColorScheme + } + val view = LocalView.current + if (!view.isInEditMode) { + SideEffect { + val window = (view.context as Activity).window + window.statusBarColor = colorScheme.primary.toArgb() + WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = darkTheme + } + } + + MaterialTheme(colorScheme = colorScheme, typography = Typography, content = content) +} diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/theme/Type.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/theme/Type.kt new file mode 100644 index 00000000..1ec95b91 --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/theme/Type.kt @@ -0,0 +1,17 @@ +package com.github.andiim.orchidscan.app.ui.theme + +import androidx.compose.material3.Typography +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.sp + +val Typography = + Typography( + bodyLarge = + TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Normal, + fontSize = 16.sp, + lineHeight = 24.sp, + letterSpacing = 0.5.sp)) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ef636ab1..e188326a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,10 +1,5 @@ - Kotlin Android Template - This is just a template - You can compute a factorial using the library-kotlin module. The result will be also shown in a notification using the library-android module. - Insert a number to compute his factorial - Compute - The Result is: %s - Please Enter a Number - In Compose + Plant Scan + + Something wrong happened. Please try again. diff --git a/library-android/src/main/java/com/github/andiim/orchidscan/library/android/extensions/BitmapExtensions.kt b/library-android/src/main/java/com/github/andiim/orchidscan/library/android/extensions/BitmapExtensions.kt new file mode 100644 index 00000000..fc1457fc --- /dev/null +++ b/library-android/src/main/java/com/github/andiim/orchidscan/library/android/extensions/BitmapExtensions.kt @@ -0,0 +1,19 @@ +package com.github.andiim.orchidscan.library.android.extensions + +import android.graphics.Bitmap +import android.graphics.Matrix + +/** + * Get from [YanneckReiss](https://github.com/YanneckReiss) + * + * The rotationDegrees parameter is the rotation in degrees clockwise from the original orientation. + */ +fun Bitmap.rotateBitmap(rotationDegrees: Int): Bitmap { + val matrix = + Matrix().apply { + postRotate(-rotationDegrees.toFloat()) + postScale(-1f, -1f) + } + + return Bitmap.createBitmap(this, 0, 0, width, height, matrix, true) +} diff --git a/library-android/src/main/java/com/github/andiim/orchidscan/library/android/extensions/StringExtension.kt b/library-android/src/main/java/com/github/andiim/orchidscan/library/android/extensions/StringExtension.kt new file mode 100644 index 00000000..63a5aa5c --- /dev/null +++ b/library-android/src/main/java/com/github/andiim/orchidscan/library/android/extensions/StringExtension.kt @@ -0,0 +1,25 @@ +package com.github.andiim.orchidscan.library.android.extensions + +import android.util.Patterns +import java.util.regex.Pattern + +private const val MIN_PASS_LENGTH = 6 +private const val PASS_PATTERN = "^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=\\S+$).{4,}$" + +fun String.isValidEmail(): Boolean { + return this.isNotBlank() && Patterns.EMAIL_ADDRESS.matcher(this).matches() +} + +fun String.isValidPassword(): Boolean { + return this.isNotBlank() && + this.length >= MIN_PASS_LENGTH && + Pattern.compile(PASS_PATTERN).matcher(this).matches() +} + +fun String.passwordMatches(repeated: String): Boolean { + return this == repeated +} + +fun String.idFromParameter(): String { + return this.substring(1, this.length - 1) +} From 280f23f682d107e9aae79bfb4e5be81a32ff3a3f Mon Sep 17 00:00:00 2001 From: Andi-IM Date: Mon, 7 Aug 2023 07:37:58 +0700 Subject: [PATCH 05/29] feat : adding navigation --- .../andiim/orchidscan/app/PlantScanApp.kt | 3 +- .../app/data/firebase/AccountService.kt | 17 +++ .../app/data/firebase/ConfigurationService.kt | 6 + .../app/data/firebase/LogService.kt | 5 + .../andiim/orchidscan/app/data/model/User.kt | 3 + .../common/composables/BottomBarComposable.kt | 78 ++++++++++ .../ui/common/composables/ButtonComposable.kt | 87 +++++++++++ .../common/composables/DropdownComposable.kt | 134 ++++++++++++++++ .../composables/PermissionDialogComposable.kt | 111 ++++++++++++++ .../common/composables/TextFieldComposable.kt | 143 ++++++++++++++++++ .../common/composables/ToolbarComposable.kt | 104 +++++++++++++ .../orchidscan/app/ui/navigation/Direction.kt | 21 +++ .../app/ui/navigation/Navigation.kt | 55 +++++++ .../app/ui/navigation/NavigationItem.kt | 6 + .../app/ui/navigation/NavigationObject.kt | 25 +++ .../app/ui/screens/splash/SplashScreen.kt | 58 +++++++ .../app/ui/screens/splash/SplashViewModel.kt | 40 +++++ .../screens/viewModels/PlantScanViewModel.kt | 22 +++ .../app/ui/screens/web/WebScreen.kt | 42 +++++ .../main/res/drawable/ic_visibility_off.xml | 10 ++ .../main/res/drawable/ic_visibility_on.xml | 10 ++ app/src/main/res/values/strings.xml | 43 ++++++ 22 files changed, 1022 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/data/firebase/AccountService.kt create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/data/firebase/ConfigurationService.kt create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/data/firebase/LogService.kt create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/data/model/User.kt create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/BottomBarComposable.kt create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/ButtonComposable.kt create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/DropdownComposable.kt create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/PermissionDialogComposable.kt create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/TextFieldComposable.kt create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/ToolbarComposable.kt create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/ui/navigation/Direction.kt create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/ui/navigation/Navigation.kt create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/ui/navigation/NavigationItem.kt create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/ui/navigation/NavigationObject.kt create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/splash/SplashScreen.kt create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/splash/SplashViewModel.kt create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/PlantScanViewModel.kt create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/web/WebScreen.kt create mode 100644 app/src/main/res/drawable/ic_visibility_off.xml create mode 100644 app/src/main/res/drawable/ic_visibility_on.xml diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/PlantScanApp.kt b/app/src/main/java/com/github/andiim/orchidscan/app/PlantScanApp.kt index ee9f5dae..a7ec604c 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/PlantScanApp.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/PlantScanApp.kt @@ -20,6 +20,7 @@ import androidx.compose.ui.unit.dp import androidx.navigation.NavHostController import androidx.navigation.compose.rememberNavController import com.github.andiim.orchidscan.app.ui.common.snackbar.SnackbarManager +import com.github.andiim.orchidscan.app.ui.navigation.SetupRootNavGraph import com.github.andiim.orchidscan.app.ui.states.PlantScanAppState import com.github.andiim.orchidscan.app.ui.theme.PlantScanTheme import kotlinx.coroutines.CoroutineScope @@ -43,7 +44,7 @@ fun OrchidScanApp() { }) }, ) { innerPadding -> - Box(modifier = Modifier.padding(innerPadding)) + SetupRootNavGraph(appState, modifier = Modifier.padding(innerPadding)) } } } diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/data/firebase/AccountService.kt b/app/src/main/java/com/github/andiim/orchidscan/app/data/firebase/AccountService.kt new file mode 100644 index 00000000..9faee130 --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/data/firebase/AccountService.kt @@ -0,0 +1,17 @@ +package com.github.andiim.orchidscan.app.data.firebase + +import com.github.andiim.orchidscan.app.data.model.User +import kotlinx.coroutines.flow.Flow + +interface AccountService { + val currentUserId: String + val hasUser: Boolean + val currentUser: Flow + + suspend fun authenticate(email: String, password: String) + suspend fun sendRecoveryEmail(email: String) + suspend fun createAnonymousAccount() + suspend fun linkAccount(email: String, password: String) + suspend fun deleteAccount() + suspend fun signOut() +} \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/data/firebase/ConfigurationService.kt b/app/src/main/java/com/github/andiim/orchidscan/app/data/firebase/ConfigurationService.kt new file mode 100644 index 00000000..1a9ed604 --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/data/firebase/ConfigurationService.kt @@ -0,0 +1,6 @@ +package com.github.andiim.orchidscan.app.data.firebase + +interface ConfigurationService { + suspend fun fetchConfiguration(): Boolean + val isShowTaskEditButtonConfig: Boolean +} \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/data/firebase/LogService.kt b/app/src/main/java/com/github/andiim/orchidscan/app/data/firebase/LogService.kt new file mode 100644 index 00000000..7a61dda2 --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/data/firebase/LogService.kt @@ -0,0 +1,5 @@ +package com.github.andiim.orchidscan.app.data.firebase + +interface LogService { + fun logNonFatalCrash(throwable: Throwable) +} \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/data/model/User.kt b/app/src/main/java/com/github/andiim/orchidscan/app/data/model/User.kt new file mode 100644 index 00000000..b313877c --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/data/model/User.kt @@ -0,0 +1,3 @@ +package com.github.andiim.orchidscan.app.data.model + +data class User(val id: String = "", val isAnonymous: Boolean = true) diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/BottomBarComposable.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/BottomBarComposable.kt new file mode 100644 index 00000000..faa6cd41 --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/BottomBarComposable.kt @@ -0,0 +1,78 @@ +package com.github.andiim.orchidscan.app.ui.common.composables + +import androidx.annotation.StringRes +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.RowScope +import androidx.compose.foundation.layout.padding +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Camera +import androidx.compose.material3.FloatingActionButton +import androidx.compose.material3.Icon +import androidx.compose.material3.NavigationBar +import androidx.compose.material3.NavigationBarItem +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.res.stringResource +import androidx.navigation.NavDestination.Companion.hierarchy +import androidx.navigation.compose.currentBackStackEntryAsState +import com.github.andiim.orchidscan.app.rememberAppState +import com.github.andiim.orchidscan.app.ui.navigation.Direction +import com.github.andiim.orchidscan.app.ui.navigation.NavigationObject +import com.github.andiim.orchidscan.app.ui.states.PlantScanAppState + +@Composable +fun HomeScreen(appState: PlantScanAppState = rememberAppState()) { + Scaffold( + bottomBar = {}, + floatingActionButton = { + FloatingActionButton(onClick = { appState.navigate(Direction.Detect.route) }) { + Icon(Icons.Filled.Camera, contentDescription = "Detect!") + } + }) { innerPadding -> + Box(modifier = Modifier.padding(innerPadding)) { + /*when (selectedItem) { + 0 -> SearchOrDetectOrchidElement() + 1 -> MyGardenElement() + 2 -> SettingsElement(restartApp = {}, openScreen = {}) + }*/ + } + } +} + +@Composable +fun BottomBar(state: PlantScanAppState) { + val navBackStateEntry by state.navController.currentBackStackEntryAsState() + val currentDestination = navBackStateEntry?.destination + if (currentDestination?.hierarchy?.any { it.route == Direction.MainNav.route } == true) + NavigationBar { + for (navigationItem in NavigationObject.bottomNavItems) { + Items( + state = state, + title = navigationItem.title, + icon = navigationItem.icon, + direction = navigationItem.direction) + } + } +} + +@Composable +private fun RowScope.Items( + state: PlantScanAppState, + @StringRes title: Int, + icon: ImageVector, + direction: Direction +) { + val navBackStackEntry by state.navController.currentBackStackEntryAsState() + val currentDestination = navBackStackEntry?.destination + + NavigationBarItem( + icon = { Icon(imageVector = icon, contentDescription = stringResource(title)) }, + selected = currentDestination?.hierarchy?.any { it.route == direction.route } == true, + label = { Text(stringResource(title)) }, + onClick = { state.clearAndNavigate(direction.route) }, + alwaysShowLabel = false) +} diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/ButtonComposable.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/ButtonComposable.kt new file mode 100644 index 00000000..669157eb --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/ButtonComposable.kt @@ -0,0 +1,87 @@ +package com.github.andiim.orchidscan.app.ui.common.composables + +import android.content.res.Configuration +import androidx.annotation.StringRes +import androidx.compose.foundation.layout.Column +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.sp +import com.github.andiim.orchidscan.app.ui.common.extensions.basicButton +import com.github.andiim.orchidscan.app.ui.theme.PlantScanTheme +import com.github.andiim.orchidscan.app.R.string as AppText + +@Composable +fun BasicTextButton(@StringRes text: Int, modifier: Modifier, action: () -> Unit) { + TextButton(onClick = action, modifier = modifier) { Text(text = stringResource(text)) } +} + +@Composable +fun BasicButton(@StringRes text: Int, modifier: Modifier, action: () -> Unit) { + Button( + onClick = action, + modifier = modifier, + colors = + ButtonDefaults.buttonColors( + containerColor = MaterialTheme.colorScheme.onBackground, + contentColor = MaterialTheme.colorScheme.onPrimary + ) + ) { + Text(text = stringResource(text), fontSize = 16.sp) + } +} + +@Composable +fun DialogConfirmButton(@StringRes text: Int, action: () -> Unit) { + Button( + onClick = action, + colors = + ButtonDefaults.buttonColors( + containerColor = MaterialTheme.colorScheme.primaryContainer, + contentColor = MaterialTheme.colorScheme.onPrimaryContainer + ) + ) { + Text(text = stringResource(text)) + } +} + +@Composable +fun DialogCancelButton(@StringRes text: Int, action: () -> Unit) { + Button( + onClick = action, + colors = + ButtonDefaults.buttonColors( + containerColor = MaterialTheme.colorScheme.primaryContainer, + contentColor = MaterialTheme.colorScheme.onPrimaryContainer + ) + ) { + Text(text = stringResource(text)) + } +} + +@Preview(name = "Night Mode", uiMode = Configuration.UI_MODE_NIGHT_YES) +@Preview(name = "Day Mode", uiMode = Configuration.UI_MODE_NIGHT_NO) +@Composable +private fun Preview() { + PlantScanTheme { + Surface { + Column(horizontalAlignment = Alignment.CenterHorizontally) { + BasicTextButton( + text = AppText.app_name, + modifier = Modifier.basicButton(), + action = {}) + BasicButton(text = AppText.app_name, modifier = Modifier.basicButton(), action = {}) + DialogConfirmButton(text = AppText.app_name, action = {}) + DialogCancelButton(text = AppText.app_name, action = {}) + } + } + } +} diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/DropdownComposable.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/DropdownComposable.kt new file mode 100644 index 00000000..217260f2 --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/DropdownComposable.kt @@ -0,0 +1,134 @@ +package com.github.andiim.orchidscan.app.ui.common.composables + +import android.content.res.Configuration +import androidx.annotation.StringRes +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.MoreVert +import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.ExposedDropdownMenuBox +import androidx.compose.material3.ExposedDropdownMenuDefaults +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.material3.TextField +import androidx.compose.material3.TextFieldColors +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.github.andiim.orchidscan.app.ui.common.extensions.dropdownSelector +import com.github.andiim.orchidscan.app.ui.theme.PlantScanTheme +import com.github.andiim.orchidscan.app.R.string as AppText + +@Composable +@OptIn(ExperimentalMaterial3Api::class) +fun DropdownContextMenu( + options: List, + modifier: Modifier, + onActionClick: (String) -> Unit +) { + var isExpanded by remember { mutableStateOf(false) } + + ExposedDropdownMenuBox( + expanded = isExpanded, modifier = modifier, onExpandedChange = { isExpanded = !isExpanded }) { + Icon( + modifier = Modifier.padding(8.dp, 0.dp), + imageVector = Icons.Default.MoreVert, + contentDescription = "More") + + ExposedDropdownMenu( + modifier = Modifier.width(180.dp), + expanded = isExpanded, + onDismissRequest = { isExpanded = false }) { + options.forEach { selectionOption -> + DropdownMenuItem( + text = { Text(text = selectionOption) }, + onClick = { + isExpanded = false + onActionClick(selectionOption) + }) + } + } + } +} + +@Composable +@OptIn(ExperimentalMaterial3Api::class) +fun DropdownSelector( + @StringRes label: Int, + options: List, + selection: String, + modifier: Modifier, + onNewValue: (String) -> Unit +) { + var isExpanded by remember { mutableStateOf(false) } + + ExposedDropdownMenuBox( + expanded = isExpanded, modifier = modifier, onExpandedChange = { isExpanded = !isExpanded }) { + TextField( + modifier = Modifier.fillMaxWidth(), + readOnly = true, + value = selection, + label = { Text(stringResource(label)) }, + onValueChange = {}, + trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = isExpanded) }, + colors = dropdownColors()) + + ExposedDropdownMenu(expanded = isExpanded, onDismissRequest = { isExpanded = false }) { + options.forEach { selectionOption -> + DropdownMenuItem( + text = { Text(text = selectionOption) }, + onClick = { + onNewValue(selectionOption) + isExpanded = false + }) + } + } + } +} + +@Composable +@OptIn(ExperimentalMaterial3Api::class) +private fun dropdownColors(): TextFieldColors { + return ExposedDropdownMenuDefaults.textFieldColors( + focusedContainerColor = MaterialTheme.colorScheme.onPrimaryContainer, + focusedIndicatorColor = Color.Transparent, + unfocusedIndicatorColor = Color.Transparent, + focusedTrailingIconColor = MaterialTheme.colorScheme.onSurface, + focusedLabelColor = MaterialTheme.colorScheme.primary, + unfocusedLabelColor = MaterialTheme.colorScheme.primary) +} + +@Preview(name = "Night Mode", uiMode = Configuration.UI_MODE_NIGHT_YES) +@Preview(name = "Day Mode", uiMode = Configuration.UI_MODE_NIGHT_NO) +@Composable +private fun Preview() { + PlantScanTheme { + Surface { + Column(Modifier.padding(16.dp)) { + DropdownContextMenu( + options = listOf("Hello", "World!"), modifier = Modifier, onActionClick = {}) + Spacer(Modifier.padding(8.dp)) + DropdownSelector( + label = AppText.app_name, + options = listOf("Hello", "World!"), + selection = "select this?", + modifier = Modifier.dropdownSelector(), + onNewValue = {}) + } + } + } +} diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/PermissionDialogComposable.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/PermissionDialogComposable.kt new file mode 100644 index 00000000..9a8ec0f0 --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/PermissionDialogComposable.kt @@ -0,0 +1,111 @@ +package com.github.andiim.orchidscan.app.ui.common.composables + +import android.content.res.Configuration +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.wrapContentHeight +import androidx.compose.foundation.layout.wrapContentWidth +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.AlertDialogDefaults +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.github.andiim.orchidscan.app.ui.common.extensions.alertDialog +import com.github.andiim.orchidscan.app.ui.common.extensions.textButton +import com.github.andiim.orchidscan.app.ui.theme.PlantScanTheme +import com.github.andiim.orchidscan.app.R.string as AppText + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun PermissionDialog(onRequestPermission: () -> Unit) { + var showWarningDialog by remember { mutableStateOf(true) } + + if (showWarningDialog) { + AlertDialog( + modifier = Modifier.alertDialog(), onDismissRequest = { showWarningDialog = false }) { + Surface( + modifier = Modifier.wrapContentWidth().wrapContentHeight(), + shape = MaterialTheme.shapes.large, + tonalElevation = AlertDialogDefaults.TonalElevation) { + Column(modifier = Modifier.padding(24.dp)) { + Text( + stringResource(AppText.notification_permission_title), + color = (MaterialTheme.colorScheme).onSurface, + style = (MaterialTheme.typography).headlineSmall) + Spacer(modifier = Modifier.height(16.dp)) + Text( + stringResource(AppText.notification_permission_description), + style = (MaterialTheme.typography).bodyMedium, + color = (MaterialTheme.colorScheme).onSurfaceVariant, + ) + Spacer(modifier = Modifier.height(24.dp)) + TextButton( + onClick = { + onRequestPermission() + showWarningDialog = true + }, + modifier = Modifier.align(Alignment.End)) { + Text( + stringResource(AppText.request_notification_permission), + style = (MaterialTheme.typography).labelLarge) + } + } + } + } + } +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun RationaleDialog() { + var showWarningDialog by remember { mutableStateOf(true) } + + if (showWarningDialog) { + AlertDialog( + modifier = Modifier.alertDialog(), onDismissRequest = { showWarningDialog = false }) { + Column(modifier = Modifier.padding(16.dp)) { + Text( + stringResource(AppText.notification_permission_title), + color = (MaterialTheme.colorScheme).onSurface, + style = (MaterialTheme.typography).headlineSmall) + Spacer(modifier = Modifier.height(16.dp)) + Text( + stringResource(AppText.notification_permission_description), + color = (MaterialTheme.colorScheme).onSurfaceVariant, + style = (MaterialTheme.typography).bodyMedium) + Spacer(modifier = Modifier.height(24.dp)) + TextButton(onClick = { showWarningDialog = true }, modifier = Modifier.textButton()) { + Text(stringResource(AppText.ok)) + } + } + } + } +} + +@Preview(name = "Night Mode", uiMode = Configuration.UI_MODE_NIGHT_YES) +@Preview(name = "Day Mode", uiMode = Configuration.UI_MODE_NIGHT_NO) +@Composable +private fun RationalDialogPreview() { + PlantScanTheme { Surface { RationaleDialog() } } +} + +@Preview(name = "Night Mode", uiMode = Configuration.UI_MODE_NIGHT_YES) +@Preview(name = "Day Mode", uiMode = Configuration.UI_MODE_NIGHT_NO) +@Composable +private fun PermissionDialogPreview() { + PlantScanTheme { Surface { PermissionDialog {} } } +} diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/TextFieldComposable.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/TextFieldComposable.kt new file mode 100644 index 00000000..7ad59fce --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/TextFieldComposable.kt @@ -0,0 +1,143 @@ +/* +Copyright 2022 Google LLC + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + */ + +package com.github.andiim.orchidscan.app.ui.common.composables + +import android.content.res.Configuration +import androidx.annotation.StringRes +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Email +import androidx.compose.material.icons.filled.Lock +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.input.KeyboardType +import androidx.compose.ui.text.input.PasswordVisualTransformation +import androidx.compose.ui.text.input.VisualTransformation +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.github.andiim.orchidscan.app.ui.theme.PlantScanTheme +import com.github.andiim.orchidscan.app.R.drawable as AppIcon +import com.github.andiim.orchidscan.app.R.string as AppText + +@Composable +fun BasicField( + @StringRes text: Int, + value: String, + onNewValue: (String) -> Unit, + modifier: Modifier = Modifier +) { + OutlinedTextField( + singleLine = true, + modifier = modifier, + value = value, + onValueChange = { onNewValue(it) }, + placeholder = { Text(stringResource(text)) }) +} + +@Composable +fun EmailField(value: String, onNewValue: (String) -> Unit, modifier: Modifier = Modifier) { + OutlinedTextField( + singleLine = true, + modifier = modifier, + value = value, + onValueChange = { onNewValue(it) }, + placeholder = { Text(stringResource(AppText.email)) }, + leadingIcon = { Icon(imageVector = Icons.Default.Email, contentDescription = "Email") }) +} + +@Composable +fun PasswordField(value: String, onNewValue: (String) -> Unit, modifier: Modifier = Modifier) { + PasswordField(value, AppText.password, onNewValue, modifier) +} + +@Composable +fun RepeatPasswordField( + value: String, + onNewValue: (String) -> Unit, + modifier: Modifier = Modifier +) { + PasswordField(value, AppText.repeat_password, onNewValue, modifier) +} + +@Composable +private fun PasswordField( + value: String, + @StringRes placeholder: Int, + onNewValue: (String) -> Unit, + modifier: Modifier = Modifier +) { + var isVisible by remember { mutableStateOf(false) } + + val icon = + if (isVisible) painterResource(AppIcon.ic_visibility_on) + else painterResource(AppIcon.ic_visibility_off) + + val visualTransformation = + if (isVisible) VisualTransformation.None else PasswordVisualTransformation() + + OutlinedTextField( + modifier = modifier, + value = value, + onValueChange = { onNewValue(it) }, + placeholder = { Text(text = stringResource(placeholder)) }, + leadingIcon = { Icon(imageVector = Icons.Default.Lock, contentDescription = "Lock") }, + trailingIcon = { + IconButton(onClick = { isVisible = !isVisible }) { + Icon(painter = icon, contentDescription = "Visibility") + } + }, + keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password), + visualTransformation = visualTransformation) +} + +@Preview(name = "Night Mode", uiMode = Configuration.UI_MODE_NIGHT_YES) +@Preview(name = "Day Mode", uiMode = Configuration.UI_MODE_NIGHT_NO) +@Composable +private fun TextViewPreview() { + PlantScanTheme { + Surface { + Column( + verticalArrangement = Arrangement.SpaceEvenly, + horizontalAlignment = Alignment.CenterHorizontally, + modifier = Modifier.padding(16.dp)) { + BasicField(text = AppText.app_name, value = "", onNewValue = {}) + Spacer(modifier = Modifier.padding(8.dp)) + EmailField(value = "", onNewValue = {}) + Spacer(modifier = Modifier.padding(8.dp)) + PasswordField(value = "", onNewValue = {}) + Spacer(modifier = Modifier.padding(8.dp)) + RepeatPasswordField(value = "", onNewValue = {}) + } + } + } +} diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/ToolbarComposable.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/ToolbarComposable.kt new file mode 100644 index 00000000..b8fe19a3 --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/ToolbarComposable.kt @@ -0,0 +1,104 @@ +/* +Copyright 2022 Google LLC + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + */ + +package com.github.andiim.orchidscan.app.ui.common.composables + +import android.content.res.Configuration +import androidx.annotation.DrawableRes +import androidx.annotation.StringRes +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.RowScope +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar +import androidx.compose.material3.TopAppBarColors +import androidx.compose.material3.TopAppBarDefaults +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import com.github.andiim.orchidscan.app.ui.theme.PlantScanTheme +import com.github.andiim.orchidscan.app.R.drawable as AppIcon +import com.github.andiim.orchidscan.app.R.string as AppText + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun BasicToolbar( + @StringRes title: Int, + leading: @Composable () -> Unit = {}, + trailing: @Composable (RowScope.() -> Unit) = {} +) { + TopAppBar( + navigationIcon = leading, + title = { Text(stringResource(title)) }, + colors = TopAppBarDefaults.orchidScanTopAppBarColor(), + actions = trailing + ) +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun ActionToolbar( + @StringRes title: Int, + @DrawableRes endActionIcon: Int, + modifier: Modifier, + endAction: () -> Unit +) { + TopAppBar( + title = { Text(stringResource(title)) }, + colors = TopAppBarDefaults.orchidScanTopAppBarColor(), + actions = { + Box(modifier) { + IconButton(onClick = endAction) { + Icon(painter = painterResource(endActionIcon), contentDescription = "Action") + } + } + }) +} + +@Composable +@OptIn(ExperimentalMaterial3Api::class) +private fun TopAppBarDefaults.orchidScanTopAppBarColor(): TopAppBarColors { + return topAppBarColors(containerColor = MaterialTheme.colorScheme.surfaceVariant) +} + +@Preview(name = "Night Mode", uiMode = Configuration.UI_MODE_NIGHT_YES) +@Preview(name = "Day Mode", uiMode = Configuration.UI_MODE_NIGHT_NO) +@Composable +private fun BasicToolbarPreview() { + PlantScanTheme { Surface { BasicToolbar(title = AppText.app_name) } } +} + +@Preview(name = "Night Mode", uiMode = Configuration.UI_MODE_NIGHT_YES) +@Preview(name = "Day Mode", uiMode = Configuration.UI_MODE_NIGHT_NO) +@Composable +private fun ActionToolbarPreview() { + PlantScanTheme { + Surface { + ActionToolbar( + title = AppText.app_name, + endActionIcon = AppIcon.ic_visibility_on, + endAction = {}, + modifier = Modifier + ) + } + } +} diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/navigation/Direction.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/navigation/Direction.kt new file mode 100644 index 00000000..2bd41ba3 --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/navigation/Direction.kt @@ -0,0 +1,21 @@ +package com.github.andiim.orchidscan.app.ui.navigation + +sealed class Direction(val route: String) { + object MainNav : Direction("main_navigation") + object AccountNav : Direction("account_navigation") + object Splash : Direction("splash") + object SearchOrDetect : Direction("search_or_detect") + object Search : Direction("search") + object Detect : Direction("orchid_detect") + object MyGarden : Direction("my_garden") + object Settings : Direction("settings") + object Login : Direction("login") + object SignUp : Direction("signup") + object OrchidList : Direction("orchid") + object WebScreenView : Direction("web_screen/{url}") { + fun setUrl(url: String) = "web_screen/$url" + } + object OrchidDetail : Direction("orchid/{orchid_id}") { + // TODO : Create Plant + } +} diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/navigation/Navigation.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/navigation/Navigation.kt new file mode 100644 index 00000000..32c9fb2f --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/navigation/Navigation.kt @@ -0,0 +1,55 @@ +package com.github.andiim.orchidscan.app.ui.navigation + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.navigation.NavGraphBuilder +import androidx.navigation.NavType +import androidx.navigation.compose.NavHost +import androidx.navigation.compose.composable +import androidx.navigation.navArgument +import androidx.navigation.navigation +import com.github.andiim.orchidscan.app.ui.screens.splash.SplashScreen +import com.github.andiim.orchidscan.app.ui.screens.web.WebScreen +import com.github.andiim.orchidscan.app.ui.states.PlantScanAppState + +@Composable +fun SetupRootNavGraph(appState: PlantScanAppState, modifier: Modifier = Modifier) { + NavHost( + modifier = modifier, + navController = appState.navController, + startDestination = Direction.Splash.route, + ) { + addSplashScreen(appState) + + navigation( + startDestination = Direction.SearchOrDetect.route, + route = Direction.MainNav.route + ) { + // TODO : Add Bottom Navigation + } + + navigation(startDestination = Direction.Login.route, route = Direction.AccountNav.route) { + addWebViewScreen(appState) + // TODO : Something indirection + } + + } +} + +private fun NavGraphBuilder.addWebViewScreen(appState: PlantScanAppState) { + composable( + route = Direction.WebScreenView.route, + arguments = listOf(navArgument("url") { type = NavType.StringType }) + ) { backStackEntry -> + val url = backStackEntry.arguments?.getString("url") + url?.let { WebScreen(url = it, name = "Testing", popUpScreen = appState::popUp) } + } +} + +private fun NavGraphBuilder.addSplashScreen(appState: PlantScanAppState) { + composable(route = Direction.Splash.route) { + SplashScreen(openAndPopUp = appState::navigateAndPopUp) + } +} + + diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/navigation/NavigationItem.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/navigation/NavigationItem.kt new file mode 100644 index 00000000..556567e7 --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/navigation/NavigationItem.kt @@ -0,0 +1,6 @@ +package com.github.andiim.orchidscan.app.ui.navigation + +import androidx.annotation.StringRes +import androidx.compose.ui.graphics.vector.ImageVector + +data class NavigationItem(@StringRes val title: Int, val icon: ImageVector, val direction: Direction) diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/navigation/NavigationObject.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/navigation/NavigationObject.kt new file mode 100644 index 00000000..f4d9f3f9 --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/navigation/NavigationObject.kt @@ -0,0 +1,25 @@ +package com.github.andiim.orchidscan.app.ui.navigation + +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.List +import androidx.compose.material.icons.filled.Search +import androidx.compose.material.icons.outlined.LocalFlorist +import com.github.andiim.orchidscan.app.R.string as AppText + +object NavigationObject { + val bottomNavItems = + listOf( + NavigationItem( + title = AppText.label_search, + icon = Icons.Filled.Search, + direction = Direction.SearchOrDetect), + NavigationItem( + title = AppText.label_garden_screen, + icon = Icons.Outlined.LocalFlorist, + direction = Direction.MyGarden), + NavigationItem( + title = AppText.label_settings, + icon = Icons.Filled.List, + direction = Direction.Settings), + ) +} diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/splash/SplashScreen.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/splash/SplashScreen.kt new file mode 100644 index 00000000..0a740c83 --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/splash/SplashScreen.kt @@ -0,0 +1,58 @@ +package com.github.andiim.orchidscan.app.ui.screens.splash + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.hilt.navigation.compose.hiltViewModel +import com.github.andiim.orchidscan.app.R +import com.github.andiim.orchidscan.app.ui.common.composables.BasicButton +import com.github.andiim.orchidscan.app.ui.common.extensions.basicButton +import kotlinx.coroutines.delay + +private const val SPLASH_TIMEOUT = 1000L + +@Composable +fun SplashScreen( + openAndPopUp: (String, String) -> Unit, + modifier: Modifier = Modifier, +) { + + val viewModel = false; + + Column( + modifier = + modifier + .fillMaxWidth() + .fillMaxHeight() + .background(color = MaterialTheme.colorScheme.background) + .verticalScroll(rememberScrollState()), + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally) { + if (viewModel) { + Text(text = stringResource(R.string.generic_error)) + + BasicButton(text = R.string.try_again, Modifier.basicButton()) { + + } + } else { + CircularProgressIndicator(color = MaterialTheme.colorScheme.onBackground) + } + } + + LaunchedEffect(true) { + delay(SPLASH_TIMEOUT) + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/splash/SplashViewModel.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/splash/SplashViewModel.kt new file mode 100644 index 00000000..2db586ac --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/splash/SplashViewModel.kt @@ -0,0 +1,40 @@ +package com.github.andiim.orchidscan.app.ui.screens.splash + +import androidx.compose.runtime.mutableStateOf +import com.github.andiim.orchidscan.app.data.firebase.AccountService +import com.github.andiim.orchidscan.app.data.firebase.ConfigurationService +import com.github.andiim.orchidscan.app.data.firebase.LogService +import com.github.andiim.orchidscan.app.ui.navigation.Direction +import com.github.andiim.orchidscan.app.ui.screens.viewModels.PlantScanViewModel +import javax.inject.Inject + +class SplashViewModel @Inject +constructor( + configurationService: ConfigurationService, + private val accountService: AccountService, + logService: LogService +) : PlantScanViewModel(logService) { + val showError = mutableStateOf(false) + + init { + launchCatching { configurationService.fetchConfiguration() } + } + + fun onAppStart(openAndPopup: (String, String) -> Unit) { + showError.value = false + if (accountService.hasUser) openAndPopup(Direction.MainNav.route, Direction.Splash.route) + else createAnonymousAccount(openAndPopup) + } + + private fun createAnonymousAccount(openAndPopup: (String, String) -> Unit) { + launchCatching(snackbar = false) { + try { + accountService.createAnonymousAccount() + } catch (ex: Exception) { + showError.value = true + throw ex + } + openAndPopup(Direction.MainNav.route, Direction.Splash.route) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/PlantScanViewModel.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/PlantScanViewModel.kt new file mode 100644 index 00000000..9139586d --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/PlantScanViewModel.kt @@ -0,0 +1,22 @@ +package com.github.andiim.orchidscan.app.ui.screens.viewModels + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.github.andiim.orchidscan.app.data.firebase.LogService +import com.github.andiim.orchidscan.app.ui.common.snackbar.SnackbarManager +import com.github.andiim.orchidscan.app.ui.common.snackbar.SnackbarMessage.Companion.toSnackbarMessage +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch + +open class PlantScanViewModel(private val logService: LogService) : ViewModel() { + fun launchCatching(snackbar: Boolean = true, block: suspend CoroutineScope.() -> Unit) = + viewModelScope.launch( + CoroutineExceptionHandler { _, throwable -> + if (snackbar) { + SnackbarManager.showMessage(throwable.toSnackbarMessage()) + } + logService.logNonFatalCrash(throwable) + }, + block = block) +} diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/web/WebScreen.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/web/WebScreen.kt new file mode 100644 index 00000000..28806d37 --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/web/WebScreen.kt @@ -0,0 +1,42 @@ +package com.github.andiim.orchidscan.app.ui.screens.web + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.wrapContentHeight +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.ArrowBack +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.LinearProgressIndicator +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import com.google.accompanist.web.WebView +import com.google.accompanist.web.rememberWebViewState + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun WebScreen(url: String, name: String, popUpScreen: () -> Unit) { + val state = rememberWebViewState("https://$url") + Scaffold( + topBar = { + Column(modifier = Modifier.fillMaxWidth().wrapContentHeight()) { + TopAppBar( + title = { Text(name) }, + navigationIcon = { + IconButton(onClick = popUpScreen) { + Icon(Icons.Default.ArrowBack, contentDescription = "Back") + } + }) + if (state.isLoading) { + LinearProgressIndicator(modifier = Modifier.fillMaxWidth()) + } + } + }) { + WebView(state, Modifier.padding(it)) + } +} diff --git a/app/src/main/res/drawable/ic_visibility_off.xml b/app/src/main/res/drawable/ic_visibility_off.xml new file mode 100644 index 00000000..92c48569 --- /dev/null +++ b/app/src/main/res/drawable/ic_visibility_off.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_visibility_on.xml b/app/src/main/res/drawable/ic_visibility_on.xml new file mode 100644 index 00000000..a3e222a2 --- /dev/null +++ b/app/src/main/res/drawable/ic_visibility_on.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e188326a..6dd6a233 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,5 +1,48 @@ Plant Scan + Email + Password + Repeat password Something wrong happened. Please try again. + Please insert a valid email. + Cancel + Try again + OK + + + My Garden + Search + Account + + + Sign in + Enter your login details + Forgot password? Click to get recovery email + Check your inbox for the recovery email. + Password cannot be empty. + + + Create account + Your password should have at least six digits and include one digit, one lower case letter and one upper case letter. + Passwords do not match. + + + Sign in / Sign up + Settings + Sign out + Delete my account + + + Sign out? + You will have to sign in again to see your tasks. + Delete account? + You will lose all your tasks and your account will be deleted. This action is irreversible. + + + fcm_default_channel + Request permission + Notification permission + The notification permission is important for this app. Please grant the permission. + The notification permission is important for this app. Please navigate to your device settings and enable notifications for Make it So. From 2c6ec947ef22efc0445c22d2f5392f0ee42dc6c2 Mon Sep 17 00:00:00 2001 From: Andi-IM Date: Mon, 7 Aug 2023 09:39:19 +0700 Subject: [PATCH 06/29] feat : adding screens framework (also with models) --- app/build.gradle.kts | 3 + .../andiim/orchidscan/app/data/model/Image.kt | 3 + .../andiim/orchidscan/app/data/model/Plant.kt | 11 ++ .../orchidscan/app/data/model/PlantDetail.kt | 6 + .../orchidscan/app/data/model/Taxonomy.kt | 10 ++ .../app/ui/screens/auth/login/LoginScreen.kt | 153 ++++++++++++++++++ .../app/ui/screens/auth/login/LoginState.kt | 3 + .../ui/screens/auth/signUp/SignUpScreen.kt | 2 + .../app/ui/screens/detail/DetailScreen.kt | 2 + .../app/ui/screens/detect/DetectScreen.kt | 4 + .../home/findPlant/FindPlantElement.kt | 4 + .../screens/home/myGarden/MyGardenElement.kt | 2 + .../screens/home/settings/SettingsElement.kt | 2 + .../app/ui/screens/list/PlantListScreen.kt | 2 + .../ui/screens/viewModels/DetailViewModel.kt | 4 + .../ui/screens/viewModels/DetectViewModel.kt | 4 + .../screens/viewModels/FindPlantViewModel.kt | 4 + .../ui/screens/viewModels/LoginViewModel.kt | 61 +++++++ .../screens/viewModels/MyGardenViewModel.kt | 4 + .../screens/viewModels/PlantListViewModel.kt | 4 + .../screens/viewModels/SettingsViewModel.kt | 4 + .../ui/screens/viewModels/SignUpViewModel.kt | 4 + .../{splash => viewModels}/SplashViewModel.kt | 2 +- gradle/libs.versions.toml | 4 +- 24 files changed, 299 insertions(+), 3 deletions(-) create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/data/model/Image.kt create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/data/model/Plant.kt create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/data/model/PlantDetail.kt create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/data/model/Taxonomy.kt create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/login/LoginScreen.kt create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/login/LoginState.kt create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/signUp/SignUpScreen.kt create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/detail/DetailScreen.kt create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/detect/DetectScreen.kt create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/findPlant/FindPlantElement.kt create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/myGarden/MyGardenElement.kt create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/settings/SettingsElement.kt create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/list/PlantListScreen.kt create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/DetailViewModel.kt create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/DetectViewModel.kt create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/FindPlantViewModel.kt create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/LoginViewModel.kt create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/MyGardenViewModel.kt create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/PlantListViewModel.kt create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/SettingsViewModel.kt create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/SignUpViewModel.kt rename app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/{splash => viewModels}/SplashViewModel.kt (95%) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index b79de959..a5b2c578 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -18,8 +18,10 @@ android { testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } buildFeatures { + compose = true buildConfig = true } + composeOptions { kotlinCompilerExtensionVersion = libs.versions.compose.compilerextension.get() } compileOptions { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 @@ -71,6 +73,7 @@ dependencies { implementation(libs.bundles.compose) debugImplementation(libs.bundles.compose.debug) implementation(libs.bundles.lifecycle) + implementation(libs.accompanist.permission) implementation(libs.accompanist.webview) diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/data/model/Image.kt b/app/src/main/java/com/github/andiim/orchidscan/app/data/model/Image.kt new file mode 100644 index 00000000..1d42ca46 --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/data/model/Image.kt @@ -0,0 +1,3 @@ +package com.github.andiim.orchidscan.app.data.model + +data class Image(val attribution: String = "", val file: String = "", val name: String = "") diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/data/model/Plant.kt b/app/src/main/java/com/github/andiim/orchidscan/app/data/model/Plant.kt new file mode 100644 index 00000000..759d91b0 --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/data/model/Plant.kt @@ -0,0 +1,11 @@ +package com.github.andiim.orchidscan.app.data.model + +data class Plant( + val id: String = "", + val name: String = "", + val species: String = "", + val type: String = "", + var images : List? = null, + val commonName: List = listOf(), + var detail: PlantDetail? = null +) diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/data/model/PlantDetail.kt b/app/src/main/java/com/github/andiim/orchidscan/app/data/model/PlantDetail.kt new file mode 100644 index 00000000..0b2d4ee3 --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/data/model/PlantDetail.kt @@ -0,0 +1,6 @@ +package com.github.andiim.orchidscan.app.data.model + +data class PlantDetail( + val classification: Taxonomy? = null, + val description: String? = null +) diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/data/model/Taxonomy.kt b/app/src/main/java/com/github/andiim/orchidscan/app/data/model/Taxonomy.kt new file mode 100644 index 00000000..6ca5f5b7 --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/data/model/Taxonomy.kt @@ -0,0 +1,10 @@ +package com.github.andiim.orchidscan.app.data.model + +data class Taxonomy( + val id: String = "", + val phylum: String = "", + val className: String = "", + val order: String = "", + val family: String = "", + val genus: String = "" +) diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/login/LoginScreen.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/login/LoginScreen.kt new file mode 100644 index 00000000..a014de1b --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/login/LoginScreen.kt @@ -0,0 +1,153 @@ +package com.github.andiim.orchidscan.app.ui.screens.auth.login + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.text.ClickableText +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.SpanStyle +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.buildAnnotatedString +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.text.withStyle +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.hilt.navigation.compose.hiltViewModel +import com.github.andiim.orchidscan.app.R +import com.github.andiim.orchidscan.app.ui.common.composables.BasicButton +import com.github.andiim.orchidscan.app.ui.common.composables.BasicTextButton +import com.github.andiim.orchidscan.app.ui.common.composables.EmailField +import com.github.andiim.orchidscan.app.ui.common.composables.PasswordField +import com.github.andiim.orchidscan.app.ui.common.extensions.basicButton +import com.github.andiim.orchidscan.app.ui.common.extensions.fieldModifier +import com.github.andiim.orchidscan.app.ui.common.extensions.textButton +import com.github.andiim.orchidscan.app.ui.screens.viewModels.LoginViewModel +import com.github.andiim.orchidscan.app.ui.theme.PlantScanTheme + +@Composable +fun LoginScreen( + openWeb: (String) -> Unit, + openAndPopUp: (String, String) -> Unit, + viewModel: LoginViewModel = hiltViewModel() +) { + val loginState by viewModel.state.collectAsState() + + LoginContent( + email = loginState.email, + password = loginState.password, + openWeb = openWeb, + openAndPopUp = openAndPopUp, + onEmailChange = viewModel::onEmailChange, + onPasswordChange = viewModel::onPasswordChange, + onForgotPasswordClick = viewModel::onForgotPasswordClick + ) +} + +@Composable +fun LoginContent( + email: String = "", + password: String = "", + openWeb: (String) -> Unit = {}, + openAndPopUp: (String, String) -> Unit, + onEmailChange: (String) -> Unit = {}, + onPasswordChange: (String) -> Unit = {}, + onForgotPasswordClick: () -> Unit = {}, + onSignInClick: ((String, String) -> Unit) -> Unit = {} +) { + Box(modifier = Modifier.padding(24.dp)) { + Column( + modifier = Modifier + .fillMaxWidth() + .fillMaxHeight() + .verticalScroll(rememberScrollState()), + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally + ) { + EmailField(email, onEmailChange, Modifier.fieldModifier()) + PasswordField(password, onPasswordChange, Modifier.fieldModifier()) + + BasicButton( + R.string.label_sign_in, + Modifier.basicButton(), + action = { onSignInClick(openAndPopUp) }) + + BasicTextButton( + R.string.hint_forgot_password, + Modifier.textButton(), + action = onForgotPasswordClick + ) + } + TermsAndPrivacyStatementText( + openWeb = openWeb, + modifier = Modifier.align(Alignment.BottomCenter) + ) + } +} + +@Composable +private fun TermsAndPrivacyStatementText( + modifier: Modifier = Modifier, + openWeb: (String) -> Unit, +) { + val annotatedText = buildAnnotatedString { + withStyle(style = SpanStyle()) { append("By continuing, you agree to our") } + pushStringAnnotation(tag = "URL_A", annotation = "android.com") + withStyle( + style = + SpanStyle(color = (MaterialTheme.colorScheme).primary, fontWeight = FontWeight.Bold) + ) { + append(" Terms ") + } + append(" and ") + pushStringAnnotation(tag = "URL_B", annotation = "developer.android.com") + withStyle( + style = + SpanStyle(color = (MaterialTheme.colorScheme).primary, fontWeight = FontWeight.Bold) + ) { + append(" Privacy Policy ") + } + pop() + } + + ClickableText( + text = annotatedText, + modifier = modifier, + style = TextStyle.Default.copy(textAlign = TextAlign.Center, fontSize = 13.sp) + ) { offset -> + val termsString = + annotatedText + .getStringAnnotations(tag = "URL_A", start = offset, end = offset) + .firstOrNull() + val privacyString = + annotatedText + .getStringAnnotations(tag = "URL_B", start = offset, end = offset) + .firstOrNull() + + if (termsString != null && privacyString == null) { + openWeb(termsString.item) + } else privacyString?.let { openWeb(it.item) } + } +} + +@Preview +@Composable +private fun Preview_LoginContent() { + PlantScanTheme { + Surface { + LoginContent(openAndPopUp = { _, _ -> }) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/login/LoginState.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/login/LoginState.kt new file mode 100644 index 00000000..b9452ec5 --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/login/LoginState.kt @@ -0,0 +1,3 @@ +package com.github.andiim.orchidscan.app.ui.screens.auth.login + +data class LoginState(val email: String = "", val password: String = "") \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/signUp/SignUpScreen.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/signUp/SignUpScreen.kt new file mode 100644 index 00000000..4d15447f --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/signUp/SignUpScreen.kt @@ -0,0 +1,2 @@ +package com.github.andiim.orchidscan.app.ui.screens.auth.signUp + diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/detail/DetailScreen.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/detail/DetailScreen.kt new file mode 100644 index 00000000..e5988cc5 --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/detail/DetailScreen.kt @@ -0,0 +1,2 @@ +package com.github.andiim.orchidscan.app.ui.screens.detail + diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/detect/DetectScreen.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/detect/DetectScreen.kt new file mode 100644 index 00000000..91508625 --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/detect/DetectScreen.kt @@ -0,0 +1,4 @@ +package com.github.andiim.orchidscan.app.ui.screens.detect + +class DetectScreen { +} \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/findPlant/FindPlantElement.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/findPlant/FindPlantElement.kt new file mode 100644 index 00000000..f52b2616 --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/findPlant/FindPlantElement.kt @@ -0,0 +1,4 @@ +package com.github.andiim.orchidscan.app.ui.screens.home.findPlant + +class FindPlantElement { +} \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/myGarden/MyGardenElement.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/myGarden/MyGardenElement.kt new file mode 100644 index 00000000..1c12d425 --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/myGarden/MyGardenElement.kt @@ -0,0 +1,2 @@ +package com.github.andiim.orchidscan.app.ui.screens.home.myGarden + diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/settings/SettingsElement.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/settings/SettingsElement.kt new file mode 100644 index 00000000..c1a96892 --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/settings/SettingsElement.kt @@ -0,0 +1,2 @@ +package com.github.andiim.orchidscan.app.ui.screens.home.settings + diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/list/PlantListScreen.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/list/PlantListScreen.kt new file mode 100644 index 00000000..9a8d31f0 --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/list/PlantListScreen.kt @@ -0,0 +1,2 @@ +package com.github.andiim.orchidscan.app.ui.screens.list + diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/DetailViewModel.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/DetailViewModel.kt new file mode 100644 index 00000000..6cbb029d --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/DetailViewModel.kt @@ -0,0 +1,4 @@ +package com.github.andiim.orchidscan.app.ui.screens.viewModels + +class DetailViewModel { +} \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/DetectViewModel.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/DetectViewModel.kt new file mode 100644 index 00000000..7c554c8a --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/DetectViewModel.kt @@ -0,0 +1,4 @@ +package com.github.andiim.orchidscan.app.ui.screens.viewModels + +class DetectViewModel { +} \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/FindPlantViewModel.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/FindPlantViewModel.kt new file mode 100644 index 00000000..f74dba44 --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/FindPlantViewModel.kt @@ -0,0 +1,4 @@ +package com.github.andiim.orchidscan.app.ui.screens.viewModels + +class FindPlantViewModel { +} \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/LoginViewModel.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/LoginViewModel.kt new file mode 100644 index 00000000..f50bfb31 --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/LoginViewModel.kt @@ -0,0 +1,61 @@ +package com.github.andiim.orchidscan.app.ui.screens.viewModels + +import com.github.andiim.orchidscan.app.R +import com.github.andiim.orchidscan.app.data.firebase.AccountService +import com.github.andiim.orchidscan.app.data.firebase.LogService +import com.github.andiim.orchidscan.app.ui.common.snackbar.SnackbarManager +import com.github.andiim.orchidscan.app.ui.navigation.Direction +import com.github.andiim.orchidscan.app.ui.screens.auth.login.LoginState +import com.github.andiim.orchidscan.library.android.extensions.isValidEmail +import javax.inject.Inject +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow + +class LoginViewModel @Inject +constructor(private val accountService: AccountService, logService: LogService) : + PlantScanViewModel(logService) { + private val _state = MutableStateFlow(LoginState()) + val state = _state.asStateFlow() + + private val email + get() = _state.value.email + private val password + get() = _state.value.password + + fun onEmailChange(newValue: String) { + _state.value = _state.value.copy(email = newValue) + } + + fun onPasswordChange(newValue: String) { + _state.value = _state.value.copy(password = newValue) + } + + fun onSignInClick(openAndPopUp: (String, String) -> Unit) { + if (!email.isValidEmail()) { + SnackbarManager.showMessage(R.string.email_error) + return + } + + if (password.isBlank()) { + SnackbarManager.showMessage(R.string.error_empty_password) + return + } + + launchCatching { + accountService.authenticate(email, password) + openAndPopUp(Direction.Settings.route, Direction.Login.route) + } + } + + fun onForgotPasswordClick() { + if (!email.isValidEmail()) { + SnackbarManager.showMessage(R.string.email_error) + return + } + + launchCatching { + accountService.sendRecoveryEmail(email) + SnackbarManager.showMessage(R.string.hint_recovery_email_sent) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/MyGardenViewModel.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/MyGardenViewModel.kt new file mode 100644 index 00000000..30a7b390 --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/MyGardenViewModel.kt @@ -0,0 +1,4 @@ +package com.github.andiim.orchidscan.app.ui.screens.viewModels + +class MyGardenViewModel { +} \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/PlantListViewModel.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/PlantListViewModel.kt new file mode 100644 index 00000000..5b383106 --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/PlantListViewModel.kt @@ -0,0 +1,4 @@ +package com.github.andiim.orchidscan.app.ui.screens.viewModels + +class PlantListViewModel { +} \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/SettingsViewModel.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/SettingsViewModel.kt new file mode 100644 index 00000000..5a4ebc75 --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/SettingsViewModel.kt @@ -0,0 +1,4 @@ +package com.github.andiim.orchidscan.app.ui.screens.viewModels + +class SettingsViewModel { +} \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/SignUpViewModel.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/SignUpViewModel.kt new file mode 100644 index 00000000..7413a9f5 --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/SignUpViewModel.kt @@ -0,0 +1,4 @@ +package com.github.andiim.orchidscan.app.ui.screens.viewModels + +class SignUpViewModel { +} \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/splash/SplashViewModel.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/SplashViewModel.kt similarity index 95% rename from app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/splash/SplashViewModel.kt rename to app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/SplashViewModel.kt index 2db586ac..fc065a9e 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/splash/SplashViewModel.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/SplashViewModel.kt @@ -1,4 +1,4 @@ -package com.github.andiim.orchidscan.app.ui.screens.splash +package com.github.andiim.orchidscan.app.ui.screens.viewModels import androidx.compose.runtime.mutableStateOf import com.github.andiim.orchidscan.app.data.firebase.AccountService diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 70162a1c..992d0ac6 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -6,7 +6,7 @@ androidx_test = "1.5.2" androidx_test_rules = "1.5.0" androidx_test_ext = "1.1.5" appcompat = "1.6.1" -camerax_version = "1.3.0-beta02" +camerax_version = "1.2.3" compile_sdk_version = "33" coroutines = "1.7.2" coil = "2.4.0" @@ -27,7 +27,7 @@ lifecycle = "2.6.1" material = "1.9.0" navigation = "2.6.0" min_sdk_version = "21" -target_sdk_version = "33" +target_sdk_version = "34" benmanesversion = "0.47.0" timber = "5.0.1" truth = "1.1.5" From f56626032d5f77fd461dcb294a28bae8dffbf517 Mon Sep 17 00:00:00 2001 From: Andi-IM Date: Mon, 7 Aug 2023 10:00:41 +0700 Subject: [PATCH 07/29] refactor : update LoginViewModel --- .../app/ui/screens/viewModels/LoginViewModel.kt | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/LoginViewModel.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/LoginViewModel.kt index f50bfb31..7e129468 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/LoginViewModel.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/LoginViewModel.kt @@ -17,11 +17,6 @@ constructor(private val accountService: AccountService, logService: LogService) private val _state = MutableStateFlow(LoginState()) val state = _state.asStateFlow() - private val email - get() = _state.value.email - private val password - get() = _state.value.password - fun onEmailChange(newValue: String) { _state.value = _state.value.copy(email = newValue) } @@ -31,30 +26,30 @@ constructor(private val accountService: AccountService, logService: LogService) } fun onSignInClick(openAndPopUp: (String, String) -> Unit) { - if (!email.isValidEmail()) { + if (!_state.value.email.isValidEmail()) { SnackbarManager.showMessage(R.string.email_error) return } - if (password.isBlank()) { + if (_state.value.password.isBlank()) { SnackbarManager.showMessage(R.string.error_empty_password) return } launchCatching { - accountService.authenticate(email, password) + accountService.authenticate(_state.value.email, _state.value.password) openAndPopUp(Direction.Settings.route, Direction.Login.route) } } fun onForgotPasswordClick() { - if (!email.isValidEmail()) { + if (!_state.value.email.isValidEmail()) { SnackbarManager.showMessage(R.string.email_error) return } launchCatching { - accountService.sendRecoveryEmail(email) + accountService.sendRecoveryEmail(_state.value.email) SnackbarManager.showMessage(R.string.hint_recovery_email_sent) } } From 15071acfe4d9964481c97337f8dc0030a17cf0fb Mon Sep 17 00:00:00 2001 From: Andi-IM Date: Mon, 7 Aug 2023 10:01:10 +0700 Subject: [PATCH 08/29] refactor : update LoginScreen --- .../andiim/orchidscan/app/ui/screens/auth/login/LoginScreen.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/login/LoginScreen.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/login/LoginScreen.kt index a014de1b..b176ec7e 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/login/LoginScreen.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/login/LoginScreen.kt @@ -52,6 +52,7 @@ fun LoginScreen( openAndPopUp = openAndPopUp, onEmailChange = viewModel::onEmailChange, onPasswordChange = viewModel::onPasswordChange, + onSignInClick = viewModel::onSignInClick, onForgotPasswordClick = viewModel::onForgotPasswordClick ) } From d01da51acd2ac5bc96737d0b53b45c5b58e4b42a Mon Sep 17 00:00:00 2001 From: Andi-IM Date: Mon, 7 Aug 2023 10:01:31 +0700 Subject: [PATCH 09/29] refactor : implement signUp Screen --- .../ui/screens/auth/signUp/SignUpScreen.kt | 73 +++++++++++++++++++ .../app/ui/screens/auth/signUp/SignUpState.kt | 7 ++ .../ui/screens/viewModels/SignUpViewModel.kt | 58 ++++++++++++++- 3 files changed, 136 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/signUp/SignUpState.kt diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/signUp/SignUpScreen.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/signUp/SignUpScreen.kt index 4d15447f..7d807833 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/signUp/SignUpScreen.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/signUp/SignUpScreen.kt @@ -1,2 +1,75 @@ package com.github.andiim.orchidscan.app.ui.screens.auth.signUp +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.Surface +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +import androidx.hilt.navigation.compose.hiltViewModel +import com.github.andiim.orchidscan.app.R +import com.github.andiim.orchidscan.app.ui.common.composables.BasicButton +import com.github.andiim.orchidscan.app.ui.common.composables.BasicToolbar +import com.github.andiim.orchidscan.app.ui.common.composables.EmailField +import com.github.andiim.orchidscan.app.ui.common.composables.PasswordField +import com.github.andiim.orchidscan.app.ui.common.composables.RepeatPasswordField +import com.github.andiim.orchidscan.app.ui.common.extensions.basicButton +import com.github.andiim.orchidscan.app.ui.common.extensions.fieldModifier +import com.github.andiim.orchidscan.app.ui.screens.viewModels.SignUpViewModel +import com.github.andiim.orchidscan.app.ui.theme.PlantScanTheme + +@Composable +fun SignUpScreen( + openAndPopUp: (String, String) -> Unit, + viewModel: SignUpViewModel = hiltViewModel() +) { + val state by viewModel.state.collectAsState() + SignUpContent( + openAndPopUp = openAndPopUp, + uiState = state, + onEmailChange = viewModel::onEmailChange, + onPasswordChange = viewModel::onPasswordChange, + onRepeatPasswordChange = viewModel::onRepeatPasswordChange, + onSignUpClick = viewModel::onSignUpClick, + ) +} + +@Composable +fun SignUpContent( + openAndPopUp: (String, String) -> Unit = { _, _ -> }, + uiState: SignUpState = SignUpState(), + onEmailChange: (String) -> Unit = {}, + onPasswordChange: (String) -> Unit = {}, + onRepeatPasswordChange: (String) -> Unit = {}, + onSignUpClick: ((String, String) -> Unit) -> Unit = {} +) { + BasicToolbar(R.string.label_create_account) + + Column( + modifier = Modifier.fillMaxWidth().fillMaxHeight().verticalScroll(rememberScrollState()), + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally) { + EmailField(uiState.email, onEmailChange, Modifier.fieldModifier()) + PasswordField(uiState.password, onPasswordChange, Modifier.fieldModifier()) + RepeatPasswordField(uiState.repeatPassword, onRepeatPasswordChange, Modifier.fieldModifier()) + + BasicButton(R.string.label_create_account, Modifier.basicButton()) { onSignUpClick(openAndPopUp) } + } +} + +@Preview +@Composable +private fun Preview_LoginContent() { + PlantScanTheme { + Surface { + SignUpContent() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/signUp/SignUpState.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/signUp/SignUpState.kt new file mode 100644 index 00000000..a95dfe55 --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/signUp/SignUpState.kt @@ -0,0 +1,7 @@ +package com.github.andiim.orchidscan.app.ui.screens.auth.signUp + +data class SignUpState( + val email: String = "", + val password: String = "", + val repeatPassword: String = "" +) \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/SignUpViewModel.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/SignUpViewModel.kt index 7413a9f5..e242c7f3 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/SignUpViewModel.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/SignUpViewModel.kt @@ -1,4 +1,58 @@ package com.github.andiim.orchidscan.app.ui.screens.viewModels -class SignUpViewModel { -} \ No newline at end of file +import com.github.andiim.orchidscan.app.R +import com.github.andiim.orchidscan.app.data.firebase.AccountService +import com.github.andiim.orchidscan.app.data.firebase.LogService +import com.github.andiim.orchidscan.app.ui.common.snackbar.SnackbarManager +import com.github.andiim.orchidscan.app.ui.screens.auth.signUp.SignUpState +import com.github.andiim.orchidscan.library.android.extensions.isValidEmail +import com.github.andiim.orchidscan.library.android.extensions.isValidPassword +import com.github.andiim.orchidscan.library.android.extensions.passwordMatches +import javax.inject.Inject +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow + +class SignUpViewModel @Inject +constructor(private val accountService: AccountService, logService: LogService) : + PlantScanViewModel(logService) { + + private val _state = MutableStateFlow(SignUpState()) + val state = _state.asStateFlow() + + private val email = _state.value.email + private val password = _state.value.password + + fun onEmailChange(newValue: String) { + _state.value = _state.value.copy(email = newValue) + } + + fun onPasswordChange(newValue: String) { + _state.value = _state.value.copy(password = newValue) + } + + fun onRepeatPasswordChange(newValue: String) { + _state.value = _state.value.copy(repeatPassword = newValue) + } + + fun onSignUpClick(openAndPopUp: (String, String) -> Unit) { + if (!email.isValidEmail()) { + SnackbarManager.showMessage(R.string.email_error) + return + } + + if (!password.isValidPassword()) { + SnackbarManager.showMessage(R.string.error_wrong_password) + return + } + + if (!password.passwordMatches(_state.value.repeatPassword)) { + SnackbarManager.showMessage(R.string.error_password_match) + return + } + + launchCatching { + accountService.linkAccount(email, password) + openAndPopUp("mandatory", "mandatory") + } + } +} From 4a5e913c2c3703d0b047f87403715c51ae8bf134 Mon Sep 17 00:00:00 2001 From: Andi-IM Date: Mon, 7 Aug 2023 10:01:31 +0700 Subject: [PATCH 10/29] feat : implement signUp Screen --- .../ui/screens/auth/signUp/SignUpScreen.kt | 73 +++++++++++++++++++ .../app/ui/screens/auth/signUp/SignUpState.kt | 7 ++ .../ui/screens/viewModels/SignUpViewModel.kt | 58 ++++++++++++++- 3 files changed, 136 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/signUp/SignUpState.kt diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/signUp/SignUpScreen.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/signUp/SignUpScreen.kt index 4d15447f..7d807833 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/signUp/SignUpScreen.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/signUp/SignUpScreen.kt @@ -1,2 +1,75 @@ package com.github.andiim.orchidscan.app.ui.screens.auth.signUp +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.Surface +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +import androidx.hilt.navigation.compose.hiltViewModel +import com.github.andiim.orchidscan.app.R +import com.github.andiim.orchidscan.app.ui.common.composables.BasicButton +import com.github.andiim.orchidscan.app.ui.common.composables.BasicToolbar +import com.github.andiim.orchidscan.app.ui.common.composables.EmailField +import com.github.andiim.orchidscan.app.ui.common.composables.PasswordField +import com.github.andiim.orchidscan.app.ui.common.composables.RepeatPasswordField +import com.github.andiim.orchidscan.app.ui.common.extensions.basicButton +import com.github.andiim.orchidscan.app.ui.common.extensions.fieldModifier +import com.github.andiim.orchidscan.app.ui.screens.viewModels.SignUpViewModel +import com.github.andiim.orchidscan.app.ui.theme.PlantScanTheme + +@Composable +fun SignUpScreen( + openAndPopUp: (String, String) -> Unit, + viewModel: SignUpViewModel = hiltViewModel() +) { + val state by viewModel.state.collectAsState() + SignUpContent( + openAndPopUp = openAndPopUp, + uiState = state, + onEmailChange = viewModel::onEmailChange, + onPasswordChange = viewModel::onPasswordChange, + onRepeatPasswordChange = viewModel::onRepeatPasswordChange, + onSignUpClick = viewModel::onSignUpClick, + ) +} + +@Composable +fun SignUpContent( + openAndPopUp: (String, String) -> Unit = { _, _ -> }, + uiState: SignUpState = SignUpState(), + onEmailChange: (String) -> Unit = {}, + onPasswordChange: (String) -> Unit = {}, + onRepeatPasswordChange: (String) -> Unit = {}, + onSignUpClick: ((String, String) -> Unit) -> Unit = {} +) { + BasicToolbar(R.string.label_create_account) + + Column( + modifier = Modifier.fillMaxWidth().fillMaxHeight().verticalScroll(rememberScrollState()), + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally) { + EmailField(uiState.email, onEmailChange, Modifier.fieldModifier()) + PasswordField(uiState.password, onPasswordChange, Modifier.fieldModifier()) + RepeatPasswordField(uiState.repeatPassword, onRepeatPasswordChange, Modifier.fieldModifier()) + + BasicButton(R.string.label_create_account, Modifier.basicButton()) { onSignUpClick(openAndPopUp) } + } +} + +@Preview +@Composable +private fun Preview_LoginContent() { + PlantScanTheme { + Surface { + SignUpContent() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/signUp/SignUpState.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/signUp/SignUpState.kt new file mode 100644 index 00000000..a95dfe55 --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/signUp/SignUpState.kt @@ -0,0 +1,7 @@ +package com.github.andiim.orchidscan.app.ui.screens.auth.signUp + +data class SignUpState( + val email: String = "", + val password: String = "", + val repeatPassword: String = "" +) \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/SignUpViewModel.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/SignUpViewModel.kt index 7413a9f5..e242c7f3 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/SignUpViewModel.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/SignUpViewModel.kt @@ -1,4 +1,58 @@ package com.github.andiim.orchidscan.app.ui.screens.viewModels -class SignUpViewModel { -} \ No newline at end of file +import com.github.andiim.orchidscan.app.R +import com.github.andiim.orchidscan.app.data.firebase.AccountService +import com.github.andiim.orchidscan.app.data.firebase.LogService +import com.github.andiim.orchidscan.app.ui.common.snackbar.SnackbarManager +import com.github.andiim.orchidscan.app.ui.screens.auth.signUp.SignUpState +import com.github.andiim.orchidscan.library.android.extensions.isValidEmail +import com.github.andiim.orchidscan.library.android.extensions.isValidPassword +import com.github.andiim.orchidscan.library.android.extensions.passwordMatches +import javax.inject.Inject +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow + +class SignUpViewModel @Inject +constructor(private val accountService: AccountService, logService: LogService) : + PlantScanViewModel(logService) { + + private val _state = MutableStateFlow(SignUpState()) + val state = _state.asStateFlow() + + private val email = _state.value.email + private val password = _state.value.password + + fun onEmailChange(newValue: String) { + _state.value = _state.value.copy(email = newValue) + } + + fun onPasswordChange(newValue: String) { + _state.value = _state.value.copy(password = newValue) + } + + fun onRepeatPasswordChange(newValue: String) { + _state.value = _state.value.copy(repeatPassword = newValue) + } + + fun onSignUpClick(openAndPopUp: (String, String) -> Unit) { + if (!email.isValidEmail()) { + SnackbarManager.showMessage(R.string.email_error) + return + } + + if (!password.isValidPassword()) { + SnackbarManager.showMessage(R.string.error_wrong_password) + return + } + + if (!password.passwordMatches(_state.value.repeatPassword)) { + SnackbarManager.showMessage(R.string.error_password_match) + return + } + + launchCatching { + accountService.linkAccount(email, password) + openAndPopUp("mandatory", "mandatory") + } + } +} From ab0d131a001fe5310a3259a2e8b4a98b45fd697d Mon Sep 17 00:00:00 2001 From: Andi-IM Date: Mon, 7 Aug 2023 10:04:15 +0700 Subject: [PATCH 11/29] refactor : change sign up preview --- .../orchidscan/app/ui/screens/auth/signUp/SignUpScreen.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/signUp/SignUpScreen.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/signUp/SignUpScreen.kt index 7d807833..a2b4efe5 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/signUp/SignUpScreen.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/signUp/SignUpScreen.kt @@ -66,7 +66,7 @@ fun SignUpContent( @Preview @Composable -private fun Preview_LoginContent() { +private fun Preview_SignUpScreen() { PlantScanTheme { Surface { SignUpContent() From 44064961d503718c60c45c7cac7ba3efa0c09cd6 Mon Sep 17 00:00:00 2001 From: Andi-IM Date: Mon, 7 Aug 2023 10:42:57 +0700 Subject: [PATCH 12/29] feat : create base view framework for each screen --- .../orchidscan/app/ui/navigation/Direction.kt | 36 ++++++++------- .../app/ui/navigation/Navigation.kt | 4 +- .../app/ui/screens/auth/login/LoginScreen.kt | 1 - .../login}/LoginViewModel.kt | 4 +- .../ui/screens/auth/signUp/SignUpScreen.kt | 1 - .../signUp}/SignUpViewModel.kt | 4 +- .../app/ui/screens/detail/DetailScreen.kt | 24 ++++++++++ .../app/ui/screens/detail/DetailViewModel.kt | 4 ++ .../app/ui/screens/detect/DetectScreen.kt | 24 +++++++++- .../app/ui/screens/detect/DetectViewModel.kt | 4 ++ .../home/findPlant/FindPlantElement.kt | 25 ++++++++++- .../home/findPlant/FindPlantViewModel.kt | 4 ++ .../screens/home/myGarden/MyGardenElement.kt | 26 +++++++++++ .../home/myGarden/MyGardenViewModel.kt | 4 ++ .../screens/home/settings/SettingsElement.kt | 26 +++++++++++ .../home/settings/SettingsViewModel.kt | 4 ++ .../app/ui/screens/list/PlantListScreen.kt | 29 ++++++++++++ .../app/ui/screens/list/PlantListViewModel.kt | 4 ++ .../app/ui/screens/splash/SplashScreen.kt | 44 +++++++++++++++---- .../{viewModels => splash}/SplashViewModel.kt | 2 +- .../ui/screens/viewModels/DetailViewModel.kt | 4 -- .../ui/screens/viewModels/DetectViewModel.kt | 4 -- .../screens/viewModels/FindPlantViewModel.kt | 4 -- .../screens/viewModels/MyGardenViewModel.kt | 4 -- .../screens/viewModels/PlantListViewModel.kt | 4 -- .../screens/viewModels/SettingsViewModel.kt | 4 -- 26 files changed, 238 insertions(+), 60 deletions(-) rename app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/{viewModels => auth/login}/LoginViewModel.kt (92%) rename app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/{viewModels => auth/signUp}/SignUpViewModel.kt (93%) create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/detail/DetailViewModel.kt create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/detect/DetectViewModel.kt create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/findPlant/FindPlantViewModel.kt create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/myGarden/MyGardenViewModel.kt create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/settings/SettingsViewModel.kt create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/list/PlantListViewModel.kt rename app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/{viewModels => splash}/SplashViewModel.kt (95%) delete mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/DetailViewModel.kt delete mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/DetectViewModel.kt delete mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/FindPlantViewModel.kt delete mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/MyGardenViewModel.kt delete mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/PlantListViewModel.kt delete mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/SettingsViewModel.kt diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/navigation/Direction.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/navigation/Direction.kt index 2bd41ba3..0937f012 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/navigation/Direction.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/navigation/Direction.kt @@ -1,21 +1,23 @@ package com.github.andiim.orchidscan.app.ui.navigation +import com.github.andiim.orchidscan.app.data.model.Plant + sealed class Direction(val route: String) { - object MainNav : Direction("main_navigation") - object AccountNav : Direction("account_navigation") - object Splash : Direction("splash") - object SearchOrDetect : Direction("search_or_detect") - object Search : Direction("search") - object Detect : Direction("orchid_detect") - object MyGarden : Direction("my_garden") - object Settings : Direction("settings") - object Login : Direction("login") - object SignUp : Direction("signup") - object OrchidList : Direction("orchid") - object WebScreenView : Direction("web_screen/{url}") { - fun setUrl(url: String) = "web_screen/$url" - } - object OrchidDetail : Direction("orchid/{orchid_id}") { - // TODO : Create Plant - } + object MainNav : Direction("main_navigation") + object AccountNav : Direction("account_navigation") + object Splash : Direction("splash") + object FindPlant : Direction("find") + object Detect : Direction("orchid_detect") + object MyGarden : Direction("my_garden") + object Settings : Direction("settings") + object Login : Direction("login") + object SignUp : Direction("signup") + object List : Direction("orchid") + object Web : Direction("web_screen/{url}") { + fun setUrl(url: String) = "web_screen/$url" + } + + object Detail : Direction("orchid/{orchid_id}") { + fun createRoute(plant: Plant) = "orchid/${plant.id}" + } } diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/navigation/Navigation.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/navigation/Navigation.kt index 32c9fb2f..f9e7d861 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/navigation/Navigation.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/navigation/Navigation.kt @@ -22,7 +22,7 @@ fun SetupRootNavGraph(appState: PlantScanAppState, modifier: Modifier = Modifier addSplashScreen(appState) navigation( - startDestination = Direction.SearchOrDetect.route, + startDestination = Direction.FindPlant.route, route = Direction.MainNav.route ) { // TODO : Add Bottom Navigation @@ -38,7 +38,7 @@ fun SetupRootNavGraph(appState: PlantScanAppState, modifier: Modifier = Modifier private fun NavGraphBuilder.addWebViewScreen(appState: PlantScanAppState) { composable( - route = Direction.WebScreenView.route, + route = Direction.Web.route, arguments = listOf(navArgument("url") { type = NavType.StringType }) ) { backStackEntry -> val url = backStackEntry.arguments?.getString("url") diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/login/LoginScreen.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/login/LoginScreen.kt index b176ec7e..2c376c22 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/login/LoginScreen.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/login/LoginScreen.kt @@ -34,7 +34,6 @@ import com.github.andiim.orchidscan.app.ui.common.composables.PasswordField import com.github.andiim.orchidscan.app.ui.common.extensions.basicButton import com.github.andiim.orchidscan.app.ui.common.extensions.fieldModifier import com.github.andiim.orchidscan.app.ui.common.extensions.textButton -import com.github.andiim.orchidscan.app.ui.screens.viewModels.LoginViewModel import com.github.andiim.orchidscan.app.ui.theme.PlantScanTheme @Composable diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/LoginViewModel.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/login/LoginViewModel.kt similarity index 92% rename from app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/LoginViewModel.kt rename to app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/login/LoginViewModel.kt index 7e129468..1dbe7c60 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/LoginViewModel.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/login/LoginViewModel.kt @@ -1,11 +1,11 @@ -package com.github.andiim.orchidscan.app.ui.screens.viewModels +package com.github.andiim.orchidscan.app.ui.screens.auth.login import com.github.andiim.orchidscan.app.R import com.github.andiim.orchidscan.app.data.firebase.AccountService import com.github.andiim.orchidscan.app.data.firebase.LogService import com.github.andiim.orchidscan.app.ui.common.snackbar.SnackbarManager import com.github.andiim.orchidscan.app.ui.navigation.Direction -import com.github.andiim.orchidscan.app.ui.screens.auth.login.LoginState +import com.github.andiim.orchidscan.app.ui.screens.viewModels.PlantScanViewModel import com.github.andiim.orchidscan.library.android.extensions.isValidEmail import javax.inject.Inject import kotlinx.coroutines.flow.MutableStateFlow diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/signUp/SignUpScreen.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/signUp/SignUpScreen.kt index a2b4efe5..535d234f 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/signUp/SignUpScreen.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/signUp/SignUpScreen.kt @@ -22,7 +22,6 @@ import com.github.andiim.orchidscan.app.ui.common.composables.PasswordField import com.github.andiim.orchidscan.app.ui.common.composables.RepeatPasswordField import com.github.andiim.orchidscan.app.ui.common.extensions.basicButton import com.github.andiim.orchidscan.app.ui.common.extensions.fieldModifier -import com.github.andiim.orchidscan.app.ui.screens.viewModels.SignUpViewModel import com.github.andiim.orchidscan.app.ui.theme.PlantScanTheme @Composable diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/SignUpViewModel.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/signUp/SignUpViewModel.kt similarity index 93% rename from app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/SignUpViewModel.kt rename to app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/signUp/SignUpViewModel.kt index e242c7f3..bcc0a247 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/SignUpViewModel.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/signUp/SignUpViewModel.kt @@ -1,10 +1,10 @@ -package com.github.andiim.orchidscan.app.ui.screens.viewModels +package com.github.andiim.orchidscan.app.ui.screens.auth.signUp import com.github.andiim.orchidscan.app.R import com.github.andiim.orchidscan.app.data.firebase.AccountService import com.github.andiim.orchidscan.app.data.firebase.LogService import com.github.andiim.orchidscan.app.ui.common.snackbar.SnackbarManager -import com.github.andiim.orchidscan.app.ui.screens.auth.signUp.SignUpState +import com.github.andiim.orchidscan.app.ui.screens.viewModels.PlantScanViewModel import com.github.andiim.orchidscan.library.android.extensions.isValidEmail import com.github.andiim.orchidscan.library.android.extensions.isValidPassword import com.github.andiim.orchidscan.library.android.extensions.passwordMatches diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/detail/DetailScreen.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/detail/DetailScreen.kt index e5988cc5..7ae043d3 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/detail/DetailScreen.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/detail/DetailScreen.kt @@ -1,2 +1,26 @@ package com.github.andiim.orchidscan.app.ui.screens.detail +import androidx.compose.material3.Surface +import androidx.compose.runtime.Composable +import androidx.compose.ui.tooling.preview.Preview +import com.github.andiim.orchidscan.app.ui.theme.PlantScanTheme + +@Composable +fun DetailScreen() { + DetailContent() +} + +@Composable +fun DetailContent() { + +} + +@Preview +@Composable +private fun Preview_DetailContent() { + PlantScanTheme { + Surface { + DetailContent() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/detail/DetailViewModel.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/detail/DetailViewModel.kt new file mode 100644 index 00000000..e5857613 --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/detail/DetailViewModel.kt @@ -0,0 +1,4 @@ +package com.github.andiim.orchidscan.app.ui.screens.detail + +class DetailViewModel { +} \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/detect/DetectScreen.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/detect/DetectScreen.kt index 91508625..444c7e76 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/detect/DetectScreen.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/detect/DetectScreen.kt @@ -1,4 +1,26 @@ package com.github.andiim.orchidscan.app.ui.screens.detect -class DetectScreen { +import androidx.compose.material3.Surface +import androidx.compose.runtime.Composable +import androidx.compose.ui.tooling.preview.Preview +import com.github.andiim.orchidscan.app.ui.theme.PlantScanTheme + +@Composable +fun DetectScreen() { + DetectContent() +} + +@Composable +fun DetectContent() { + +} + +@Preview +@Composable +private fun Preview_DetectContent() { + PlantScanTheme { + Surface { + DetectContent() + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/detect/DetectViewModel.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/detect/DetectViewModel.kt new file mode 100644 index 00000000..338f2ce6 --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/detect/DetectViewModel.kt @@ -0,0 +1,4 @@ +package com.github.andiim.orchidscan.app.ui.screens.detect + +class DetectViewModel { +} \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/findPlant/FindPlantElement.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/findPlant/FindPlantElement.kt index f52b2616..2712aa56 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/findPlant/FindPlantElement.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/findPlant/FindPlantElement.kt @@ -1,4 +1,27 @@ package com.github.andiim.orchidscan.app.ui.screens.home.findPlant -class FindPlantElement { +import androidx.compose.material3.Surface +import androidx.compose.runtime.Composable +import androidx.compose.ui.tooling.preview.Preview +import com.github.andiim.orchidscan.app.ui.screens.auth.signUp.SignUpContent +import com.github.andiim.orchidscan.app.ui.theme.PlantScanTheme + +@Composable +fun FindPlantElement(){ + +} + +@Composable +fun FindPlantContent(){ + +} + +@Preview +@Composable +private fun Preview_FindPlantContent() { + PlantScanTheme { + Surface { + FindPlantContent() + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/findPlant/FindPlantViewModel.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/findPlant/FindPlantViewModel.kt new file mode 100644 index 00000000..24c86cf4 --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/findPlant/FindPlantViewModel.kt @@ -0,0 +1,4 @@ +package com.github.andiim.orchidscan.app.ui.screens.home.findPlant + +class FindPlantViewModel { +} \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/myGarden/MyGardenElement.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/myGarden/MyGardenElement.kt index 1c12d425..865ffedc 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/myGarden/MyGardenElement.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/myGarden/MyGardenElement.kt @@ -1,2 +1,28 @@ package com.github.andiim.orchidscan.app.ui.screens.home.myGarden +import androidx.compose.foundation.layout.Box +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.tooling.preview.Preview +import com.github.andiim.orchidscan.app.ui.theme.PlantScanTheme + +@Composable +fun MyGardenElement() { + Box { Text("Hello World!") } +} + +@Composable +fun MyGardenContent() { + +} + +@Preview +@Composable +private fun Preview_MyGardenContent() { + PlantScanTheme { + Surface { + MyGardenContent() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/myGarden/MyGardenViewModel.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/myGarden/MyGardenViewModel.kt new file mode 100644 index 00000000..033ca286 --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/myGarden/MyGardenViewModel.kt @@ -0,0 +1,4 @@ +package com.github.andiim.orchidscan.app.ui.screens.home.myGarden + +class MyGardenViewModel { +} \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/settings/SettingsElement.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/settings/SettingsElement.kt index c1a96892..06979862 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/settings/SettingsElement.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/settings/SettingsElement.kt @@ -1,2 +1,28 @@ package com.github.andiim.orchidscan.app.ui.screens.home.settings +import androidx.compose.foundation.layout.Box +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.tooling.preview.Preview +import com.github.andiim.orchidscan.app.ui.theme.PlantScanTheme + +@Composable +fun SettingsElement() { + Box { Text("Hello World!") } +} + +@Composable +fun SettingsContent() { + +} + +@Preview +@Composable +private fun Preview_SettingsContent() { + PlantScanTheme { + Surface { + SettingsContent() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/settings/SettingsViewModel.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/settings/SettingsViewModel.kt new file mode 100644 index 00000000..cde54954 --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/settings/SettingsViewModel.kt @@ -0,0 +1,4 @@ +package com.github.andiim.orchidscan.app.ui.screens.home.settings + +class SettingsViewModel { +} \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/list/PlantListScreen.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/list/PlantListScreen.kt index 9a8d31f0..4b7260e2 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/list/PlantListScreen.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/list/PlantListScreen.kt @@ -1,2 +1,31 @@ package com.github.andiim.orchidscan.app.ui.screens.list +import androidx.compose.foundation.layout.Box +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.tooling.preview.Preview +import com.github.andiim.orchidscan.app.ui.theme.PlantScanTheme + +@Composable +fun PlantListScreen() { + Box { + Text("Hello World!") + PlantListContent() + } +} + +@Composable +fun PlantListContent() { + +} + +@Preview +@Composable +private fun Preview_PlantListContent() { + PlantScanTheme { + Surface { + PlantListContent() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/list/PlantListViewModel.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/list/PlantListViewModel.kt new file mode 100644 index 00000000..b0eb3ae9 --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/list/PlantListViewModel.kt @@ -0,0 +1,4 @@ +package com.github.andiim.orchidscan.app.ui.screens.list + +class PlantListViewModel { +} \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/splash/SplashScreen.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/splash/SplashScreen.kt index 0a740c83..661c2949 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/splash/SplashScreen.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/splash/SplashScreen.kt @@ -9,28 +9,44 @@ import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview import androidx.hilt.navigation.compose.hiltViewModel import com.github.andiim.orchidscan.app.R import com.github.andiim.orchidscan.app.ui.common.composables.BasicButton import com.github.andiim.orchidscan.app.ui.common.extensions.basicButton +import com.github.andiim.orchidscan.app.ui.theme.PlantScanTheme import kotlinx.coroutines.delay private const val SPLASH_TIMEOUT = 1000L @Composable fun SplashScreen( - openAndPopUp: (String, String) -> Unit, modifier: Modifier = Modifier, + openAndPopUp: (String, String) -> Unit, + viewModel: SplashViewModel = hiltViewModel() ) { + SplashContent( + modifier = modifier, + openAndPopUp = openAndPopUp, + onAppStart = viewModel::onAppStart, + isError = viewModel.showError.value + ) +} - val viewModel = false; - +@Composable +fun SplashContent( + modifier: Modifier = Modifier, + openAndPopUp: (String, String) -> Unit = { _, _ -> }, + onAppStart: ((String, String) -> Unit) -> Unit = {}, + isError: Boolean = false +) { Column( modifier = modifier @@ -39,13 +55,15 @@ fun SplashScreen( .background(color = MaterialTheme.colorScheme.background) .verticalScroll(rememberScrollState()), verticalArrangement = Arrangement.Center, - horizontalAlignment = Alignment.CenterHorizontally) { - if (viewModel) { + horizontalAlignment = Alignment.CenterHorizontally + ) { + if (isError) { Text(text = stringResource(R.string.generic_error)) - BasicButton(text = R.string.try_again, Modifier.basicButton()) { - - } + BasicButton( + text = R.string.try_again, + Modifier.basicButton(), + action = { onAppStart(openAndPopUp) }) } else { CircularProgressIndicator(color = MaterialTheme.colorScheme.onBackground) } @@ -53,6 +71,16 @@ fun SplashScreen( LaunchedEffect(true) { delay(SPLASH_TIMEOUT) + onAppStart(openAndPopUp) + } +} +@Preview +@Composable +private fun Preview_PlantListContent() { + PlantScanTheme { + Surface { + SplashContent() + } } } \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/SplashViewModel.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/splash/SplashViewModel.kt similarity index 95% rename from app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/SplashViewModel.kt rename to app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/splash/SplashViewModel.kt index fc065a9e..2db586ac 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/SplashViewModel.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/splash/SplashViewModel.kt @@ -1,4 +1,4 @@ -package com.github.andiim.orchidscan.app.ui.screens.viewModels +package com.github.andiim.orchidscan.app.ui.screens.splash import androidx.compose.runtime.mutableStateOf import com.github.andiim.orchidscan.app.data.firebase.AccountService diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/DetailViewModel.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/DetailViewModel.kt deleted file mode 100644 index 6cbb029d..00000000 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/DetailViewModel.kt +++ /dev/null @@ -1,4 +0,0 @@ -package com.github.andiim.orchidscan.app.ui.screens.viewModels - -class DetailViewModel { -} \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/DetectViewModel.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/DetectViewModel.kt deleted file mode 100644 index 7c554c8a..00000000 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/DetectViewModel.kt +++ /dev/null @@ -1,4 +0,0 @@ -package com.github.andiim.orchidscan.app.ui.screens.viewModels - -class DetectViewModel { -} \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/FindPlantViewModel.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/FindPlantViewModel.kt deleted file mode 100644 index f74dba44..00000000 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/FindPlantViewModel.kt +++ /dev/null @@ -1,4 +0,0 @@ -package com.github.andiim.orchidscan.app.ui.screens.viewModels - -class FindPlantViewModel { -} \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/MyGardenViewModel.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/MyGardenViewModel.kt deleted file mode 100644 index 30a7b390..00000000 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/MyGardenViewModel.kt +++ /dev/null @@ -1,4 +0,0 @@ -package com.github.andiim.orchidscan.app.ui.screens.viewModels - -class MyGardenViewModel { -} \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/PlantListViewModel.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/PlantListViewModel.kt deleted file mode 100644 index 5b383106..00000000 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/PlantListViewModel.kt +++ /dev/null @@ -1,4 +0,0 @@ -package com.github.andiim.orchidscan.app.ui.screens.viewModels - -class PlantListViewModel { -} \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/SettingsViewModel.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/SettingsViewModel.kt deleted file mode 100644 index 5a4ebc75..00000000 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/SettingsViewModel.kt +++ /dev/null @@ -1,4 +0,0 @@ -package com.github.andiim.orchidscan.app.ui.screens.viewModels - -class SettingsViewModel { -} \ No newline at end of file From 54c365fac69381c8d4cf5794201d7aa7541f9a1d Mon Sep 17 00:00:00 2001 From: Andi-IM Date: Mon, 7 Aug 2023 11:17:18 +0700 Subject: [PATCH 13/29] refactor : connect viewModel into detail screen --- .../app/ui/screens/auth/signUp/SignUpViewModel.kt | 3 ++- .../orchidscan/app/ui/screens/detail/DetailScreen.kt | 7 ++++++- .../app/ui/screens/detail/DetailViewModel.kt | 10 +++++++++- .../app/ui/screens/home/settings/SettingsViewModel.kt | 9 ++++++++- .../app/ui/screens/list/PlantListViewModel.kt | 9 ++++++++- 5 files changed, 33 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/signUp/SignUpViewModel.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/signUp/SignUpViewModel.kt index bcc0a247..3d5d40e3 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/signUp/SignUpViewModel.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/signUp/SignUpViewModel.kt @@ -8,10 +8,11 @@ import com.github.andiim.orchidscan.app.ui.screens.viewModels.PlantScanViewModel import com.github.andiim.orchidscan.library.android.extensions.isValidEmail import com.github.andiim.orchidscan.library.android.extensions.isValidPassword import com.github.andiim.orchidscan.library.android.extensions.passwordMatches +import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow - +@HiltViewModel class SignUpViewModel @Inject constructor(private val accountService: AccountService, logService: LogService) : PlantScanViewModel(logService) { diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/detail/DetailScreen.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/detail/DetailScreen.kt index 7ae043d3..fd05cf11 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/detail/DetailScreen.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/detail/DetailScreen.kt @@ -3,10 +3,15 @@ package com.github.andiim.orchidscan.app.ui.screens.detail import androidx.compose.material3.Surface import androidx.compose.runtime.Composable import androidx.compose.ui.tooling.preview.Preview +import androidx.hilt.navigation.compose.hiltViewModel import com.github.andiim.orchidscan.app.ui.theme.PlantScanTheme @Composable -fun DetailScreen() { +fun DetailScreen( + id: String?, + popUpScreen: () -> Unit, + viewModel: DetailViewModel = hiltViewModel() +) { DetailContent() } diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/detail/DetailViewModel.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/detail/DetailViewModel.kt index e5857613..d3ea2913 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/detail/DetailViewModel.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/detail/DetailViewModel.kt @@ -1,4 +1,12 @@ package com.github.andiim.orchidscan.app.ui.screens.detail -class DetailViewModel { +import com.github.andiim.orchidscan.app.data.firebase.LogService +import com.github.andiim.orchidscan.app.ui.screens.viewModels.PlantScanViewModel +import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject + +@HiltViewModel +class DetailViewModel @Inject +constructor(logService: LogService) : PlantScanViewModel(logService) { + } \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/settings/SettingsViewModel.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/settings/SettingsViewModel.kt index cde54954..5bcdb81d 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/settings/SettingsViewModel.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/settings/SettingsViewModel.kt @@ -1,4 +1,11 @@ package com.github.andiim.orchidscan.app.ui.screens.home.settings -class SettingsViewModel { +import com.github.andiim.orchidscan.app.data.firebase.LogService +import com.github.andiim.orchidscan.app.ui.screens.viewModels.PlantScanViewModel +import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject + +@HiltViewModel +class SettingsViewModel @Inject constructor(logService: LogService) : + PlantScanViewModel(logService) { } \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/list/PlantListViewModel.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/list/PlantListViewModel.kt index b0eb3ae9..f444f06a 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/list/PlantListViewModel.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/list/PlantListViewModel.kt @@ -1,4 +1,11 @@ package com.github.andiim.orchidscan.app.ui.screens.list -class PlantListViewModel { +import com.github.andiim.orchidscan.app.data.firebase.LogService +import com.github.andiim.orchidscan.app.ui.screens.viewModels.PlantScanViewModel +import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject + +@HiltViewModel +class PlantListViewModel @Inject constructor(logService: LogService) : + PlantScanViewModel(logService) { } \ No newline at end of file From 0c6dd38ebf2ef40dbd13d849c0da289756008d73 Mon Sep 17 00:00:00 2001 From: Andi-IM Date: Mon, 7 Aug 2023 11:17:57 +0700 Subject: [PATCH 14/29] refactor : connect viewModel into detect screen --- .../orchidscan/app/ui/screens/detect/DetectScreen.kt | 6 +++++- .../app/ui/screens/detect/DetectViewModel.kt | 10 +++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/detect/DetectScreen.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/detect/DetectScreen.kt index 444c7e76..8d4909d5 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/detect/DetectScreen.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/detect/DetectScreen.kt @@ -3,10 +3,14 @@ package com.github.andiim.orchidscan.app.ui.screens.detect import androidx.compose.material3.Surface import androidx.compose.runtime.Composable import androidx.compose.ui.tooling.preview.Preview +import androidx.hilt.navigation.compose.hiltViewModel import com.github.andiim.orchidscan.app.ui.theme.PlantScanTheme @Composable -fun DetectScreen() { +fun DetectScreen( + popUpScreen: () -> Unit, + viewModel: DetectViewModel = hiltViewModel() +) { DetectContent() } diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/detect/DetectViewModel.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/detect/DetectViewModel.kt index 338f2ce6..6810b2e3 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/detect/DetectViewModel.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/detect/DetectViewModel.kt @@ -1,4 +1,12 @@ package com.github.andiim.orchidscan.app.ui.screens.detect -class DetectViewModel { +import com.github.andiim.orchidscan.app.data.firebase.LogService +import com.github.andiim.orchidscan.app.ui.screens.viewModels.PlantScanViewModel +import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject + +@HiltViewModel +class DetectViewModel @Inject constructor(logService: LogService) : + PlantScanViewModel(logService) { + } \ No newline at end of file From 7d8cca279421aa3063cacfc40fd663962dc465ce Mon Sep 17 00:00:00 2001 From: Andi-IM Date: Mon, 7 Aug 2023 11:19:01 +0700 Subject: [PATCH 15/29] refactor : connect viewModel into find plant element --- .../screens/home/findPlant/FindPlantElement.kt | 16 ++++++++++++---- .../screens/home/findPlant/FindPlantViewModel.kt | 9 ++++++++- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/findPlant/FindPlantElement.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/findPlant/FindPlantElement.kt index 2712aa56..9225bbcf 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/findPlant/FindPlantElement.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/findPlant/FindPlantElement.kt @@ -2,17 +2,25 @@ package com.github.andiim.orchidscan.app.ui.screens.home.findPlant import androidx.compose.material3.Surface import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview -import com.github.andiim.orchidscan.app.ui.screens.auth.signUp.SignUpContent +import androidx.hilt.navigation.compose.hiltViewModel +import com.github.andiim.orchidscan.app.data.model.Plant import com.github.andiim.orchidscan.app.ui.theme.PlantScanTheme @Composable -fun FindPlantElement(){ - +fun FindPlantElement( + modifier: Modifier = Modifier, + onDetails: (Plant) -> Unit, + toDetect: () -> Unit, + toPlantType: () -> Unit, + viewModel: FindPlantViewModel = hiltViewModel() +) { + FindPlantContent() } @Composable -fun FindPlantContent(){ +fun FindPlantContent() { } diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/findPlant/FindPlantViewModel.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/findPlant/FindPlantViewModel.kt index 24c86cf4..69f3fd84 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/findPlant/FindPlantViewModel.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/findPlant/FindPlantViewModel.kt @@ -1,4 +1,11 @@ package com.github.andiim.orchidscan.app.ui.screens.home.findPlant -class FindPlantViewModel { +import com.github.andiim.orchidscan.app.data.firebase.LogService +import com.github.andiim.orchidscan.app.ui.screens.viewModels.PlantScanViewModel +import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject + +@HiltViewModel +class FindPlantViewModel @Inject constructor(val logService: LogService) : + PlantScanViewModel(logService) { } \ No newline at end of file From 0269c5a9dcabb0e2f20fae39050042ba45b2e260 Mon Sep 17 00:00:00 2001 From: Andi-IM Date: Mon, 7 Aug 2023 11:19:35 +0700 Subject: [PATCH 16/29] refactor : connect viewModel into find my garden element --- .../app/ui/screens/home/myGarden/MyGardenElement.kt | 3 ++- .../app/ui/screens/home/myGarden/MyGardenViewModel.kt | 9 ++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/myGarden/MyGardenElement.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/myGarden/MyGardenElement.kt index 865ffedc..52497de9 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/myGarden/MyGardenElement.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/myGarden/MyGardenElement.kt @@ -5,10 +5,11 @@ import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.tooling.preview.Preview +import androidx.hilt.navigation.compose.hiltViewModel import com.github.andiim.orchidscan.app.ui.theme.PlantScanTheme @Composable -fun MyGardenElement() { +fun MyGardenElement(viewModel: MyGardenViewModel = hiltViewModel()) { Box { Text("Hello World!") } } diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/myGarden/MyGardenViewModel.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/myGarden/MyGardenViewModel.kt index 033ca286..ef68d851 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/myGarden/MyGardenViewModel.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/myGarden/MyGardenViewModel.kt @@ -1,4 +1,11 @@ package com.github.andiim.orchidscan.app.ui.screens.home.myGarden -class MyGardenViewModel { +import com.github.andiim.orchidscan.app.data.firebase.LogService +import com.github.andiim.orchidscan.app.ui.screens.viewModels.PlantScanViewModel +import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject + +@HiltViewModel +class MyGardenViewModel @Inject +constructor(logService: LogService) : PlantScanViewModel(logService) { } \ No newline at end of file From 7f05bb89677e5cd98dbd02b1e872a4a09d0c4f95 Mon Sep 17 00:00:00 2001 From: Andi-IM Date: Mon, 7 Aug 2023 11:20:00 +0700 Subject: [PATCH 17/29] refactor : adding hilt annotation to login view model --- .../orchidscan/app/ui/screens/auth/login/LoginViewModel.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/login/LoginViewModel.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/login/LoginViewModel.kt index 1dbe7c60..5033e586 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/login/LoginViewModel.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/login/LoginViewModel.kt @@ -7,10 +7,12 @@ import com.github.andiim.orchidscan.app.ui.common.snackbar.SnackbarManager import com.github.andiim.orchidscan.app.ui.navigation.Direction import com.github.andiim.orchidscan.app.ui.screens.viewModels.PlantScanViewModel import com.github.andiim.orchidscan.library.android.extensions.isValidEmail +import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow +@HiltViewModel class LoginViewModel @Inject constructor(private val accountService: AccountService, logService: LogService) : PlantScanViewModel(logService) { From b365dfce2ae69c1ea28d00cd6676d277db135a38 Mon Sep 17 00:00:00 2001 From: Andi-IM Date: Mon, 7 Aug 2023 11:20:59 +0700 Subject: [PATCH 18/29] refactor : changing constructor in composable component --- .../ui/screens/home/settings/SettingsElement.kt | 13 +++++++++---- .../app/ui/screens/list/PlantListScreen.kt | 17 ++++++++++------- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/settings/SettingsElement.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/settings/SettingsElement.kt index 06979862..fec96feb 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/settings/SettingsElement.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/settings/SettingsElement.kt @@ -1,15 +1,20 @@ package com.github.andiim.orchidscan.app.ui.screens.home.settings -import androidx.compose.foundation.layout.Box import androidx.compose.material3.Surface -import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview +import androidx.hilt.navigation.compose.hiltViewModel import com.github.andiim.orchidscan.app.ui.theme.PlantScanTheme @Composable -fun SettingsElement() { - Box { Text("Hello World!") } +fun SettingsElement( + restartApp: (String) -> Unit, + openScreen: (String) -> Unit, + modifier: Modifier = Modifier, + viewModel: SettingsViewModel = hiltViewModel() +) { + SettingsContent() } @Composable diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/list/PlantListScreen.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/list/PlantListScreen.kt index 4b7260e2..a98f2b62 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/list/PlantListScreen.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/list/PlantListScreen.kt @@ -1,18 +1,21 @@ package com.github.andiim.orchidscan.app.ui.screens.list -import androidx.compose.foundation.layout.Box import androidx.compose.material3.Surface -import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview +import androidx.hilt.navigation.compose.hiltViewModel +import com.github.andiim.orchidscan.app.data.model.Plant import com.github.andiim.orchidscan.app.ui.theme.PlantScanTheme @Composable -fun PlantListScreen() { - Box { - Text("Hello World!") - PlantListContent() - } +fun PlantListScreen( + onDetails: (Plant) -> Unit, + popUpScreen: () -> Unit, + modifier: Modifier = Modifier, + viewModel: PlantListViewModel = hiltViewModel() +) { + PlantListContent() } @Composable From 29ca19fd2733bee000e1c92d6e4216b64ecb6e67 Mon Sep 17 00:00:00 2001 From: Andi-IM Date: Mon, 7 Aug 2023 11:21:23 +0700 Subject: [PATCH 19/29] feat : updating navigation routes and connect to all view --- .../app/ui/navigation/Navigation.kt | 142 ++++++++++++++++-- 1 file changed, 129 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/navigation/Navigation.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/navigation/Navigation.kt index f9e7d861..c4cd2b72 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/navigation/Navigation.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/navigation/Navigation.kt @@ -1,13 +1,31 @@ package com.github.andiim.orchidscan.app.ui.navigation import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember import androidx.compose.ui.Modifier +import androidx.hilt.navigation.compose.hiltViewModel import androidx.navigation.NavGraphBuilder import androidx.navigation.NavType import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.navArgument import androidx.navigation.navigation +import com.github.andiim.orchidscan.app.ui.screens.auth.login.LoginScreen +import com.github.andiim.orchidscan.app.ui.screens.auth.login.LoginViewModel +import com.github.andiim.orchidscan.app.ui.screens.auth.signUp.SignUpScreen +import com.github.andiim.orchidscan.app.ui.screens.auth.signUp.SignUpViewModel +import com.github.andiim.orchidscan.app.ui.screens.detail.DetailScreen +import com.github.andiim.orchidscan.app.ui.screens.detail.DetailViewModel +import com.github.andiim.orchidscan.app.ui.screens.detect.DetectScreen +import com.github.andiim.orchidscan.app.ui.screens.detect.DetectViewModel +import com.github.andiim.orchidscan.app.ui.screens.home.findPlant.FindPlantElement +import com.github.andiim.orchidscan.app.ui.screens.home.findPlant.FindPlantViewModel +import com.github.andiim.orchidscan.app.ui.screens.home.myGarden.MyGardenElement +import com.github.andiim.orchidscan.app.ui.screens.home.myGarden.MyGardenViewModel +import com.github.andiim.orchidscan.app.ui.screens.home.settings.SettingsElement +import com.github.andiim.orchidscan.app.ui.screens.home.settings.SettingsViewModel +import com.github.andiim.orchidscan.app.ui.screens.list.PlantListScreen +import com.github.andiim.orchidscan.app.ui.screens.list.PlantListViewModel import com.github.andiim.orchidscan.app.ui.screens.splash.SplashScreen import com.github.andiim.orchidscan.app.ui.screens.web.WebScreen import com.github.andiim.orchidscan.app.ui.states.PlantScanAppState @@ -19,37 +37,135 @@ fun SetupRootNavGraph(appState: PlantScanAppState, modifier: Modifier = Modifier navController = appState.navController, startDestination = Direction.Splash.route, ) { - addSplashScreen(appState) + navigation(startDestination = Direction.Login.route, route = Direction.AccountNav.route) { + authLoginScreen(appState) + authSignUpScreen(appState) + webViewScreen(appState) + } + + detailScreen(appState) + detectScreen(appState) navigation( startDestination = Direction.FindPlant.route, route = Direction.MainNav.route ) { - // TODO : Add Bottom Navigation + homeFindPlantElement(appState) + homeMyGardenElement() + homeSettingsElement(appState) } - navigation(startDestination = Direction.Login.route, route = Direction.AccountNav.route) { - addWebViewScreen(appState) - // TODO : Something indirection - } + listScreen(appState) + splashScreen(appState) + } +} + +private fun NavGraphBuilder.authLoginScreen(appState: PlantScanAppState) { + composable(route = Direction.Login.route) { backStackEntry -> + val parentEntry = + remember(backStackEntry) { + appState.navController.getBackStackEntry(Direction.AccountNav.route) + } + val viewModel: LoginViewModel = hiltViewModel(parentEntry) + LoginScreen( + openAndPopUp = appState::navigateAndPopUp, + openWeb = { url -> + appState.navigate(Direction.Web.setUrl(url), singleTopLaunch = false) + }, + viewModel = viewModel + ) + } +} +private fun NavGraphBuilder.authSignUpScreen(appState: PlantScanAppState) { + composable(route = Direction.SignUp.route) { backStackEntry -> + val parentEntry = + remember(backStackEntry) { + appState.navController.getBackStackEntry(Direction.AccountNav.route) + } + val viewModel: SignUpViewModel = hiltViewModel(parentEntry) + SignUpScreen(openAndPopUp = appState::navigateAndPopUp, viewModel = viewModel) } } -private fun NavGraphBuilder.addWebViewScreen(appState: PlantScanAppState) { +private fun NavGraphBuilder.detailScreen(appState: PlantScanAppState) { composable( - route = Direction.Web.route, - arguments = listOf(navArgument("url") { type = NavType.StringType }) + route = Direction.Detail.route, + arguments = listOf(navArgument("orchid_id") { type = NavType.StringType }) ) { backStackEntry -> - val url = backStackEntry.arguments?.getString("url") - url?.let { WebScreen(url = it, name = "Testing", popUpScreen = appState::popUp) } + val viewModel: DetailViewModel = hiltViewModel() + val id = backStackEntry.arguments?.getString("orchid_id") + DetailScreen(id = id, popUpScreen = appState::popUp, viewModel = viewModel) + } +} + +private fun NavGraphBuilder.detectScreen(appState: PlantScanAppState) { + composable(route = Direction.Detect.route) { + val viewModel: DetectViewModel = hiltViewModel() + DetectScreen(popUpScreen = appState::popUp, viewModel = viewModel) + } +} + +private fun NavGraphBuilder.homeMyGardenElement() { + composable(route = Direction.MyGarden.route) { + val viewModel: MyGardenViewModel = hiltViewModel() + MyGardenElement(viewModel = viewModel) + } +} + +private fun NavGraphBuilder.homeFindPlantElement(appState: PlantScanAppState) { + composable(route = Direction.FindPlant.route) { + val viewModel: FindPlantViewModel = hiltViewModel() + FindPlantElement( + onDetails = { appState.navigate(Direction.Detail.createRoute(it)) }, + viewModel = viewModel, + toDetect = { appState.navigate(Direction.Detect.route) }, + toPlantType = {}) + } +} + +private fun NavGraphBuilder.homeSettingsElement(appState: PlantScanAppState) { + composable(route = Direction.Settings.route) { backStackEntry -> + val parentEntry = + remember(backStackEntry) { + appState.navController.getBackStackEntry(Direction.MainNav.route) + } + val viewModel: SettingsViewModel = hiltViewModel(parentEntry) + SettingsElement( + restartApp = appState::clearAndNavigate, + openScreen = appState::navigate, + viewModel = viewModel + ) + } +} + +private fun NavGraphBuilder.listScreen(appState: PlantScanAppState) { + composable(route = Direction.List.route) { backStackEntry -> + val parentEntry = + remember(backStackEntry) { + appState.navController.getBackStackEntry(Direction.MainNav.route) + } + val viewModel: PlantListViewModel = hiltViewModel(parentEntry) + PlantListScreen( + onDetails = { appState.navigate(Direction.Detail.createRoute(it)) }, + popUpScreen = appState::popUp, + viewModel = viewModel + ) } } -private fun NavGraphBuilder.addSplashScreen(appState: PlantScanAppState) { +private fun NavGraphBuilder.splashScreen(appState: PlantScanAppState) { composable(route = Direction.Splash.route) { SplashScreen(openAndPopUp = appState::navigateAndPopUp) } } - +private fun NavGraphBuilder.webViewScreen(appState: PlantScanAppState) { + composable( + route = Direction.Web.route, + arguments = listOf(navArgument("url") { type = NavType.StringType }) + ) { backStackEntry -> + val url = backStackEntry.arguments?.getString("url") + url?.let { WebScreen(url = it, name = "Testing", popUpScreen = appState::popUp) } + } +} From 87b938ec845918bd36677ddcfc573c7073a9e9d9 Mon Sep 17 00:00:00 2001 From: Andi-IM Date: Mon, 7 Aug 2023 14:35:22 +0700 Subject: [PATCH 20/29] feat : implementation for find plant screen --- .../andiim/orchidscan/app/PlantScanApp.kt | 3 +- .../app/data/firebase/PlantDatabase.kt | 10 ++ .../common/composables/BottomBarComposable.kt | 67 +++------- .../app/ui/common/composables/PlantItem.kt | 98 ++++++++++++++ .../app/ui/common/composables/PlantLists.kt | 123 ++++++++++++++++++ .../app/ui/navigation/NavigationObject.kt | 33 ++--- .../home/findPlant/FindPlantElement.kt | 116 ++++++++++++++++- .../home/findPlant/FindPlantViewModel.kt | 47 ++++++- app/src/main/res/values/strings.xml | 6 + 9 files changed, 438 insertions(+), 65 deletions(-) create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/data/firebase/PlantDatabase.kt create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/PlantItem.kt create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/PlantLists.kt diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/PlantScanApp.kt b/app/src/main/java/com/github/andiim/orchidscan/app/PlantScanApp.kt index a7ec604c..e20d2bc1 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/PlantScanApp.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/PlantScanApp.kt @@ -1,7 +1,6 @@ package com.github.andiim.orchidscan.app import android.content.res.Resources -import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.padding import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold @@ -19,6 +18,7 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp import androidx.navigation.NavHostController import androidx.navigation.compose.rememberNavController +import com.github.andiim.orchidscan.app.ui.common.composables.BottomBar import com.github.andiim.orchidscan.app.ui.common.snackbar.SnackbarManager import com.github.andiim.orchidscan.app.ui.navigation.SetupRootNavGraph import com.github.andiim.orchidscan.app.ui.states.PlantScanAppState @@ -43,6 +43,7 @@ fun OrchidScanApp() { ) }) }, + bottomBar = { BottomBar(state = appState) } ) { innerPadding -> SetupRootNavGraph(appState, modifier = Modifier.padding(innerPadding)) } diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/data/firebase/PlantDatabase.kt b/app/src/main/java/com/github/andiim/orchidscan/app/data/firebase/PlantDatabase.kt new file mode 100644 index 00000000..e3b28202 --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/data/firebase/PlantDatabase.kt @@ -0,0 +1,10 @@ +package com.github.andiim.orchidscan.app.data.firebase + +import androidx.paging.PagingData +import com.github.andiim.orchidscan.app.data.model.Plant +import kotlinx.coroutines.flow.Flow + +interface PlantDatabase { + fun getAllPlant(): Flow> + fun searchPlant(query: String = ""): Flow> +} \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/BottomBarComposable.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/BottomBarComposable.kt index faa6cd41..795ed1a9 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/BottomBarComposable.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/BottomBarComposable.kt @@ -1,62 +1,36 @@ package com.github.andiim.orchidscan.app.ui.common.composables import androidx.annotation.StringRes -import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.RowScope -import androidx.compose.foundation.layout.padding -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Camera -import androidx.compose.material3.FloatingActionButton import androidx.compose.material3.Icon import androidx.compose.material3.NavigationBar import androidx.compose.material3.NavigationBarItem -import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue -import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.res.stringResource import androidx.navigation.NavDestination.Companion.hierarchy import androidx.navigation.compose.currentBackStackEntryAsState -import com.github.andiim.orchidscan.app.rememberAppState import com.github.andiim.orchidscan.app.ui.navigation.Direction import com.github.andiim.orchidscan.app.ui.navigation.NavigationObject import com.github.andiim.orchidscan.app.ui.states.PlantScanAppState -@Composable -fun HomeScreen(appState: PlantScanAppState = rememberAppState()) { - Scaffold( - bottomBar = {}, - floatingActionButton = { - FloatingActionButton(onClick = { appState.navigate(Direction.Detect.route) }) { - Icon(Icons.Filled.Camera, contentDescription = "Detect!") - } - }) { innerPadding -> - Box(modifier = Modifier.padding(innerPadding)) { - /*when (selectedItem) { - 0 -> SearchOrDetectOrchidElement() - 1 -> MyGardenElement() - 2 -> SettingsElement(restartApp = {}, openScreen = {}) - }*/ - } - } -} - @Composable fun BottomBar(state: PlantScanAppState) { - val navBackStateEntry by state.navController.currentBackStackEntryAsState() - val currentDestination = navBackStateEntry?.destination - if (currentDestination?.hierarchy?.any { it.route == Direction.MainNav.route } == true) - NavigationBar { - for (navigationItem in NavigationObject.bottomNavItems) { - Items( - state = state, - title = navigationItem.title, - icon = navigationItem.icon, - direction = navigationItem.direction) + val navBackStateEntry by state.navController.currentBackStackEntryAsState() + val currentDestination = navBackStateEntry?.destination + if (currentDestination?.hierarchy?.any { it.route == Direction.MainNav.route } == true) + NavigationBar { + for (navigationItem in NavigationObject.bottomNavItems) { + Items( + state = state, + title = navigationItem.title, + icon = navigationItem.icon, + direction = navigationItem.direction + ) + } } - } } @Composable @@ -66,13 +40,14 @@ private fun RowScope.Items( icon: ImageVector, direction: Direction ) { - val navBackStackEntry by state.navController.currentBackStackEntryAsState() - val currentDestination = navBackStackEntry?.destination + val navBackStackEntry by state.navController.currentBackStackEntryAsState() + val currentDestination = navBackStackEntry?.destination - NavigationBarItem( - icon = { Icon(imageVector = icon, contentDescription = stringResource(title)) }, - selected = currentDestination?.hierarchy?.any { it.route == direction.route } == true, - label = { Text(stringResource(title)) }, - onClick = { state.clearAndNavigate(direction.route) }, - alwaysShowLabel = false) + NavigationBarItem( + icon = { Icon(imageVector = icon, contentDescription = stringResource(title)) }, + selected = currentDestination?.hierarchy?.any { it.route == direction.route } == true, + label = { Text(stringResource(title)) }, + onClick = { state.clearAndNavigate(direction.route) }, + alwaysShowLabel = false + ) } diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/PlantItem.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/PlantItem.kt new file mode 100644 index 00000000..b46c8647 --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/PlantItem.kt @@ -0,0 +1,98 @@ +package com.github.andiim.orchidscan.app.ui.common.composables + +import android.content.res.Configuration +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.ArrowForwardIos +import androidx.compose.material3.Card +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.github.andiim.orchidscan.app.data.model.Image +import com.github.andiim.orchidscan.app.data.model.Plant +import com.github.andiim.orchidscan.app.ui.theme.PlantScanTheme + +@Composable +fun PlantItem(plant: Plant, onClick: (Plant) -> Unit = {}) { + Card(modifier = Modifier.fillMaxWidth().height(96.dp).clickable { onClick.invoke(plant) }) { + Row( + modifier = Modifier.fillMaxWidth().padding(16.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceAround) { +// AsyncImage( +// model = +// ImageRequest.Builder(LocalContext.current) +// .data(plant.images[0].file) +// .crossfade(true) +// .build(), +// placeholder = painterResource(ImageDrawable.ic_error), +// contentDescription = plant.name, +// contentScale = ContentScale.Crop, +// modifier = Modifier.clip(CircleShape).size(64.dp).align(Alignment.CenterVertically)) + Spacer(modifier = Modifier.size(8.dp)) + PlantContent(modifier = Modifier.weight(2f), plant = plant) + Spacer(modifier = Modifier.size(8.dp)) + Icon(Icons.Default.ArrowForwardIos, contentDescription = "click") + } + } +} + +@Composable +private fun PlantContent(modifier: Modifier = Modifier, plant: Plant) { + Column(modifier = modifier) { + Text(text = plant.name, style = (MaterialTheme.typography).titleSmall) + KnownNames(names = plant.commonName) + } +} + +@Composable +private fun KnownNames(names: List) { + val nameString = names.joinToString(", ") + Text( + text = nameString, + maxLines = 2, + overflow = TextOverflow.Clip, + style = (MaterialTheme.typography).bodyMedium) +} + +@Preview( + name = "Night Mode", + uiMode = Configuration.UI_MODE_NIGHT_YES, +) +@Preview( + name = "Day Mode", + uiMode = Configuration.UI_MODE_NIGHT_NO, +) +@Composable +private fun Preview() { + val plant = + Plant( + id = "1", + name = "Bird of Paradise", + species = "Strelizia reginae", + type = "bird", + images = + listOf( + Image( + attribution = "Creative Common", + name = "Orchid", + file = + "https://upload.wikimedia.org/wikipedia/commons/3/30/Orchid_Phalaenopsis_hybrid.jpg")), + commonName = listOf("Strelizia reginae", "Crane flower", "Bird of Paradise"), + ) + PlantScanTheme { PlantItem(plant) } +} diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/PlantLists.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/PlantLists.kt new file mode 100644 index 00000000..a017dd5a --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/PlantLists.kt @@ -0,0 +1,123 @@ +package com.github.andiim.orchidscan.app.ui.common.composables + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.wrapContentSize +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.rememberLazyListState +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.Divider +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedButton +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.unit.dp +import androidx.paging.LoadState +import androidx.paging.compose.LazyPagingItems +import androidx.paging.compose.itemContentType +import androidx.paging.compose.itemKey +import com.github.andiim.orchidscan.app.data.model.Plant + +@Composable +fun PlantList(plants: LazyPagingItems, onItemClick: (Plant) -> Unit) { + LazyColumn(state = rememberLazyListState()) { + items( + count = plants.itemCount, + key = plants.itemKey { it.id }, + contentType = plants.itemContentType { "Orchids" }) { index -> + val orchid = plants[index] + orchid?.let { + PlantItem(plant = it, onItemClick) + Divider() + } + Divider() + } + + plants.apply { + when (loadState.prepend) { + is LoadState.NotLoading -> { + if (itemCount == 0) { + item(key = "not_loading_and_empty") { + EmptyItem(modifier = Modifier.fillParentMaxSize()) + } + } + } + + is LoadState.Loading -> { + item { LoadingItem(modifier = Modifier.fillParentMaxSize()) } + } + + is LoadState.Error -> { + val e = loadState.refresh as LoadState.Error + item { + ErrorItem( + message = e.error.localizedMessage!!, + modifier = Modifier.fillParentMaxSize(), + onClickRetry = { retry() }) + } + } + } + } + } +} + +@Composable +private fun LoadingItem(modifier: Modifier) { + Column( + modifier = modifier, + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center + ) { + Text( + modifier = Modifier.padding(8.dp), + text = "Refresh Loading" + ) + CircularProgressIndicator(color = Color.Black) + } +} + +@Composable +private fun ErrorItem( + message: String, + modifier: Modifier = Modifier, + onClickRetry: () -> Unit +) { + Row( + modifier = modifier.padding(16.dp), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = message, + maxLines = 1, + modifier = Modifier.weight(1f), + style = MaterialTheme.typography.headlineSmall, + color = Color.Red + ) + OutlinedButton(onClick = onClickRetry) { + Text(text = "Try again") + } + } +} + +@Composable +private fun EmptyItem(modifier: Modifier) { + Box( + modifier = modifier, + contentAlignment = Alignment.Center + ) { + Column( + modifier = Modifier.wrapContentSize(), + horizontalAlignment = Alignment.CenterHorizontally + ) { + // TODO : Adding an empty animation! + Text(text = "Empty List") + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/navigation/NavigationObject.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/navigation/NavigationObject.kt index f4d9f3f9..15f1725e 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/navigation/NavigationObject.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/navigation/NavigationObject.kt @@ -7,19 +7,22 @@ import androidx.compose.material.icons.outlined.LocalFlorist import com.github.andiim.orchidscan.app.R.string as AppText object NavigationObject { - val bottomNavItems = - listOf( - NavigationItem( - title = AppText.label_search, - icon = Icons.Filled.Search, - direction = Direction.SearchOrDetect), - NavigationItem( - title = AppText.label_garden_screen, - icon = Icons.Outlined.LocalFlorist, - direction = Direction.MyGarden), - NavigationItem( - title = AppText.label_settings, - icon = Icons.Filled.List, - direction = Direction.Settings), - ) + val bottomNavItems = + listOf( + NavigationItem( + title = AppText.label_search, + icon = Icons.Filled.Search, + direction = Direction.FindPlant + ), + NavigationItem( + title = AppText.label_garden_screen, + icon = Icons.Outlined.LocalFlorist, + direction = Direction.MyGarden + ), + NavigationItem( + title = AppText.label_settings, + icon = Icons.Filled.List, + direction = Direction.Settings + ), + ) } diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/findPlant/FindPlantElement.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/findPlant/FindPlantElement.kt index 9225bbcf..28751f2d 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/findPlant/FindPlantElement.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/findPlant/FindPlantElement.kt @@ -1,12 +1,46 @@ package com.github.andiim.orchidscan.app.ui.screens.home.findPlant +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.CameraAlt +import androidx.compose.material.icons.filled.Close +import androidx.compose.material.icons.filled.Search +import androidx.compose.material3.Button +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.SearchBar import androidx.compose.material3.Surface +import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.shadow +import androidx.compose.ui.geometry.Offset +import androidx.compose.ui.graphics.Brush +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel +import androidx.paging.PagingData +import androidx.paging.compose.collectAsLazyPagingItems import com.github.andiim.orchidscan.app.data.model.Plant +import com.github.andiim.orchidscan.app.ui.common.composables.PlantList import com.github.andiim.orchidscan.app.ui.theme.PlantScanTheme +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flowOf +import com.github.andiim.orchidscan.app.R.string as AppText @Composable fun FindPlantElement( @@ -16,12 +50,90 @@ fun FindPlantElement( toPlantType: () -> Unit, viewModel: FindPlantViewModel = hiltViewModel() ) { - FindPlantContent() + val query by viewModel.query.collectAsState() + + FindPlantContent( + modifier = modifier, + query = query, + data = viewModel.fetchedData, + onQueryChange = viewModel::onQueryChange, + toDetail = onDetails, + toDetect = toDetect, + toPlantType = toPlantType + ) } +@OptIn(ExperimentalMaterial3Api::class) @Composable -fun FindPlantContent() { +fun FindPlantContent( + modifier: Modifier = Modifier, + query: String = "", + data: Flow> = flowOf(), + onQueryChange: (String) -> Unit = {}, + toDetect: () -> Unit = {}, + toDetail: (Plant) -> Unit = {}, + toPlantType: () -> Unit = {}, +) { + var active by rememberSaveable { mutableStateOf(false) } + val plants = data.collectAsLazyPagingItems() + + Box(contentAlignment = Alignment.Center, modifier = modifier.fillMaxSize()) { + IconButton(modifier = modifier.size(100.dp), onClick = toDetect) { + Box( + contentAlignment = Alignment.Center, + modifier = + modifier + .fillMaxSize() + .background( + brush = + Brush.radialGradient( + colors = listOf(Color(0xFF789885), Color(0xFF7D8A82)), + center = Offset(0.5f, 0.5f), + radius = 0.2f + ) + ) + ) { + Icon( + Icons.Default.CameraAlt, + tint = Color.White, + modifier = modifier + .fillMaxSize() + .padding(30.dp) + .shadow(8.dp, shape = CircleShape), + contentDescription = stringResource(AppText.search_using_camera_icon_description) + ) + } + } + Button(modifier = Modifier.align(Alignment.BottomCenter), onClick = toPlantType) { + Text(text = "Find by plant type") + } + SearchBar( + modifier = Modifier.align(Alignment.TopCenter), + query = query, + onQueryChange = onQueryChange, + onSearch = { active = false }, + active = active, + onActiveChange = { active = it }, + placeholder = { Text(stringResource(AppText.search_placeholder)) }, + leadingIcon = { + Icon( + Icons.Default.Search, + contentDescription = stringResource(AppText.search_icon_description) + ) + }, + trailingIcon = { + if (active) + IconButton(onClick = { active = false }) { + Icon( + Icons.Default.Close, + contentDescription = stringResource(AppText.search_icon_close_description) + ) + } + }) { + PlantList(plants = plants, onItemClick = toDetail) + } + } } @Preview diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/findPlant/FindPlantViewModel.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/findPlant/FindPlantViewModel.kt index 69f3fd84..f7f127a9 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/findPlant/FindPlantViewModel.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/findPlant/FindPlantViewModel.kt @@ -1,11 +1,56 @@ package com.github.andiim.orchidscan.app.ui.screens.home.findPlant +import androidx.lifecycle.viewModelScope +import androidx.paging.PagingData +import androidx.paging.cachedIn import com.github.andiim.orchidscan.app.data.firebase.LogService +import com.github.andiim.orchidscan.app.data.firebase.PlantDatabase +import com.github.andiim.orchidscan.app.data.model.Plant import com.github.andiim.orchidscan.app.ui.screens.viewModels.PlantScanViewModel import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject +import kotlinx.coroutines.FlowPreview +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.debounce +import kotlinx.coroutines.launch +import kotlin.time.Duration.Companion.seconds +@OptIn(FlowPreview::class) @HiltViewModel -class FindPlantViewModel @Inject constructor(val logService: LogService) : +class FindPlantViewModel @Inject constructor( + private val plantDatabase: PlantDatabase, + logService: LogService +) : PlantScanViewModel(logService) { + + private val _query = MutableStateFlow("") + val query: StateFlow = _query.asStateFlow() + + private val _fetchedData = MutableStateFlow>(PagingData.empty()) + val fetchedData: StateFlow> = _fetchedData.asStateFlow() + + fun onQueryChange(query: String) { + _query.value = query + } + + init { + viewModelScope.launch { + _query + .debounce(1.seconds) + .collect { query -> searchPlant(query) } + } + } + + private fun searchPlant(query: String) { + viewModelScope.launch { + if (query.isNotEmpty()) + plantDatabase + .searchPlant(query = query) + .cachedIn(viewModelScope) + .collect { _fetchedData.value = it } + else _fetchedData.value = PagingData.empty() + } + } } \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6dd6a233..ac0a5e2e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -10,6 +10,12 @@ Try again OK + + Search Plant + Search Icon + Close search bar + Search using camera detection + My Garden Search From 2f6f4ff4df064f2d30d06c774b6afab5fd2e8624 Mon Sep 17 00:00:00 2001 From: Andi-IM Date: Mon, 7 Aug 2023 14:54:57 +0700 Subject: [PATCH 21/29] feat : implementation for saved plant data --- .../app/data/firebase/PlantDatabase.kt | 1 + .../{PlantLists.kt => PlantPagedList.kt} | 2 +- .../app/ui/navigation/Navigation.kt | 9 +++++--- .../home/findPlant/FindPlantElement.kt | 4 ++-- .../screens/home/myGarden/MyGardenElement.kt | 22 ++++++++++++++----- .../home/myGarden/MyGardenViewModel.kt | 6 ++++- 6 files changed, 31 insertions(+), 13 deletions(-) rename app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/{PlantLists.kt => PlantPagedList.kt} (97%) diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/data/firebase/PlantDatabase.kt b/app/src/main/java/com/github/andiim/orchidscan/app/data/firebase/PlantDatabase.kt index e3b28202..013e30a6 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/data/firebase/PlantDatabase.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/data/firebase/PlantDatabase.kt @@ -6,5 +6,6 @@ import kotlinx.coroutines.flow.Flow interface PlantDatabase { fun getAllPlant(): Flow> + fun getMyPlant(): Flow> fun searchPlant(query: String = ""): Flow> } \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/PlantLists.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/PlantPagedList.kt similarity index 97% rename from app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/PlantLists.kt rename to app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/PlantPagedList.kt index a017dd5a..c2a2b7d0 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/PlantLists.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/PlantPagedList.kt @@ -25,7 +25,7 @@ import androidx.paging.compose.itemKey import com.github.andiim.orchidscan.app.data.model.Plant @Composable -fun PlantList(plants: LazyPagingItems, onItemClick: (Plant) -> Unit) { +fun PlantPagedList(plants: LazyPagingItems, onItemClick: (Plant) -> Unit) { LazyColumn(state = rememberLazyListState()) { items( count = plants.itemCount, diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/navigation/Navigation.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/navigation/Navigation.kt index c4cd2b72..c35f3ca0 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/navigation/Navigation.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/navigation/Navigation.kt @@ -51,7 +51,7 @@ fun SetupRootNavGraph(appState: PlantScanAppState, modifier: Modifier = Modifier route = Direction.MainNav.route ) { homeFindPlantElement(appState) - homeMyGardenElement() + homeMyGardenElement(appState) homeSettingsElement(appState) } @@ -106,10 +106,13 @@ private fun NavGraphBuilder.detectScreen(appState: PlantScanAppState) { } } -private fun NavGraphBuilder.homeMyGardenElement() { +private fun NavGraphBuilder.homeMyGardenElement(appState: PlantScanAppState) { composable(route = Direction.MyGarden.route) { val viewModel: MyGardenViewModel = hiltViewModel() - MyGardenElement(viewModel = viewModel) + MyGardenElement( + toDetail = { appState.navigate(Direction.Detect.route) }, + viewModel = viewModel + ) } } diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/findPlant/FindPlantElement.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/findPlant/FindPlantElement.kt index 28751f2d..b5a241d4 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/findPlant/FindPlantElement.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/findPlant/FindPlantElement.kt @@ -36,7 +36,7 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.paging.PagingData import androidx.paging.compose.collectAsLazyPagingItems import com.github.andiim.orchidscan.app.data.model.Plant -import com.github.andiim.orchidscan.app.ui.common.composables.PlantList +import com.github.andiim.orchidscan.app.ui.common.composables.PlantPagedList import com.github.andiim.orchidscan.app.ui.theme.PlantScanTheme import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flowOf @@ -131,7 +131,7 @@ fun FindPlantContent( ) } }) { - PlantList(plants = plants, onItemClick = toDetail) + PlantPagedList(plants = plants, onItemClick = toDetail) } } } diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/myGarden/MyGardenElement.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/myGarden/MyGardenElement.kt index 52497de9..f93e2641 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/myGarden/MyGardenElement.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/myGarden/MyGardenElement.kt @@ -1,21 +1,31 @@ package com.github.andiim.orchidscan.app.ui.screens.home.myGarden -import androidx.compose.foundation.layout.Box import androidx.compose.material3.Surface -import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.tooling.preview.Preview import androidx.hilt.navigation.compose.hiltViewModel +import androidx.paging.PagingData +import androidx.paging.compose.collectAsLazyPagingItems +import com.github.andiim.orchidscan.app.data.model.Plant +import com.github.andiim.orchidscan.app.ui.common.composables.PlantPagedList import com.github.andiim.orchidscan.app.ui.theme.PlantScanTheme +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flowOf @Composable -fun MyGardenElement(viewModel: MyGardenViewModel = hiltViewModel()) { - Box { Text("Hello World!") } +fun MyGardenElement( + toDetail: (Plant) -> Unit, + viewModel: MyGardenViewModel = hiltViewModel() +) { + MyGardenContent(plant = viewModel.myPlant, onItemClick = toDetail) } @Composable -fun MyGardenContent() { - +fun MyGardenContent( + plant: Flow> = flowOf(), + onItemClick: (Plant) -> Unit = {}, +) { + PlantPagedList(plants = plant.collectAsLazyPagingItems(), onItemClick = onItemClick) } @Preview diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/myGarden/MyGardenViewModel.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/myGarden/MyGardenViewModel.kt index ef68d851..753ec5bc 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/myGarden/MyGardenViewModel.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/myGarden/MyGardenViewModel.kt @@ -1,11 +1,15 @@ package com.github.andiim.orchidscan.app.ui.screens.home.myGarden +import androidx.lifecycle.viewModelScope +import androidx.paging.cachedIn import com.github.andiim.orchidscan.app.data.firebase.LogService +import com.github.andiim.orchidscan.app.data.firebase.PlantDatabase import com.github.andiim.orchidscan.app.ui.screens.viewModels.PlantScanViewModel import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject @HiltViewModel class MyGardenViewModel @Inject -constructor(logService: LogService) : PlantScanViewModel(logService) { +constructor(plantDatabase: PlantDatabase, logService: LogService) : PlantScanViewModel(logService) { + val myPlant = plantDatabase.getMyPlant().cachedIn(viewModelScope) } \ No newline at end of file From 4699e0ab8d8f1563b35faa6365afa5161554eee7 Mon Sep 17 00:00:00 2001 From: Andi-IM Date: Mon, 7 Aug 2023 15:11:15 +0700 Subject: [PATCH 22/29] feat : implementation for settings screen --- .../screens/home/settings/SettingsElement.kt | 117 +++++++++++++++++- .../screens/home/settings/SettingsUiState.kt | 3 + .../home/settings/SettingsViewModel.kt | 29 ++++- app/src/main/res/drawable/ic_calendar.xml | 10 ++ app/src/main/res/drawable/ic_check.xml | 10 ++ app/src/main/res/drawable/ic_clock.xml | 13 ++ .../main/res/drawable/ic_create_account.xml | 10 ++ .../res/drawable/ic_delete_my_account.xml | 10 ++ app/src/main/res/drawable/ic_error.xml | 5 + app/src/main/res/drawable/ic_exit.xml | 10 ++ app/src/main/res/drawable/ic_flag.xml | 10 ++ app/src/main/res/drawable/ic_settings.xml | 12 ++ app/src/main/res/drawable/ic_sign_in.xml | 10 ++ 13 files changed, 246 insertions(+), 3 deletions(-) create mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/settings/SettingsUiState.kt create mode 100644 app/src/main/res/drawable/ic_calendar.xml create mode 100644 app/src/main/res/drawable/ic_check.xml create mode 100644 app/src/main/res/drawable/ic_clock.xml create mode 100644 app/src/main/res/drawable/ic_create_account.xml create mode 100644 app/src/main/res/drawable/ic_delete_my_account.xml create mode 100644 app/src/main/res/drawable/ic_error.xml create mode 100644 app/src/main/res/drawable/ic_exit.xml create mode 100644 app/src/main/res/drawable/ic_flag.xml create mode 100644 app/src/main/res/drawable/ic_settings.xml create mode 100644 app/src/main/res/drawable/ic_sign_in.xml diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/settings/SettingsElement.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/settings/SettingsElement.kt index fec96feb..085b8528 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/settings/SettingsElement.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/settings/SettingsElement.kt @@ -1,10 +1,33 @@ package com.github.andiim.orchidscan.app.ui.screens.home.settings +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.AlertDialog import androidx.compose.material3.Surface +import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.hilt.navigation.compose.hiltViewModel +import com.github.andiim.orchidscan.app.R +import com.github.andiim.orchidscan.app.ui.common.composables.BasicToolbar +import com.github.andiim.orchidscan.app.ui.common.composables.DangerousCardEditor +import com.github.andiim.orchidscan.app.ui.common.composables.DialogCancelButton +import com.github.andiim.orchidscan.app.ui.common.composables.DialogConfirmButton +import com.github.andiim.orchidscan.app.ui.common.composables.RegularCardEditor +import com.github.andiim.orchidscan.app.ui.common.extensions.card +import com.github.andiim.orchidscan.app.ui.common.extensions.spacer import com.github.andiim.orchidscan.app.ui.theme.PlantScanTheme @Composable @@ -14,12 +37,102 @@ fun SettingsElement( modifier: Modifier = Modifier, viewModel: SettingsViewModel = hiltViewModel() ) { - SettingsContent() + val isAnonymity = viewModel.uiState.collectAsState(SettingsUiState(false)) + SettingsContent( + modifier = modifier, + openScreen = openScreen, + restartApp = restartApp, + isAnonymity = isAnonymity.value.isAnonymousAccount, + onLoginClick = viewModel::onLoginClick, + onSignUpClick = viewModel::onSignUpClick, + onSignOutClick = viewModel::onSignOutClick, + onDeleteMyAccountClick = viewModel::onDeleteMyAccountClick + ) } @Composable -fun SettingsContent() { +fun SettingsContent( + modifier: Modifier = Modifier, + isAnonymity: Boolean = false, + openScreen: (String) -> Unit = {}, + restartApp: (String) -> Unit = {}, + onLoginClick: ((String) -> Unit) -> Unit = {}, + onSignUpClick: ((String) -> Unit) -> Unit = {}, + onSignOutClick: ((String) -> Unit) -> Unit = {}, + onDeleteMyAccountClick: ((String) -> Unit) -> Unit = {} +) { + Column( + modifier = modifier + .fillMaxWidth() + .fillMaxHeight() + .verticalScroll(rememberScrollState()), + horizontalAlignment = Alignment.CenterHorizontally + ) { + BasicToolbar(R.string.label_settings) + Spacer(modifier = Modifier.spacer()) + if (isAnonymity) { + RegularCardEditor( + R.string.label_sign_in_sign_up, + R.drawable.ic_sign_in, "", + Modifier.card(), + onEditClick = { onLoginClick(openScreen) }) + } else { + SignOutCard { onSignOutClick(restartApp) } + DeleteMyAccountCard { onDeleteMyAccountClick(restartApp) } + } + } +} + +@Composable +private fun SignOutCard(signOut: () -> Unit) { + var showWarningDialog by remember { mutableStateOf(false) } + + RegularCardEditor( + title = R.string.label_sign_out, icon = R.drawable.ic_exit, content = "", Modifier.card() + ) { + showWarningDialog = true + } + + if (showWarningDialog) { + AlertDialog( + onDismissRequest = { showWarningDialog = false }, + title = { Text(stringResource(R.string.title_sign_out)) }, + text = { Text(stringResource(R.string.description_sign_out)) }, + dismissButton = { DialogCancelButton(R.string.cancel) { showWarningDialog = false } }, + confirmButton = { + DialogConfirmButton(R.string.label_sign_out) { + signOut() + showWarningDialog = false + } + }) + } +} + +@Composable +private fun DeleteMyAccountCard(deleteMyAccount: () -> Unit) { + var showWarningDialog by remember { mutableStateOf(false) } + + DangerousCardEditor( + title = R.string.label_delete_account, + icon = R.drawable.ic_delete_my_account, + content = "", + modifier = Modifier.card() + ) { showWarningDialog = true } + + if (showWarningDialog) { + AlertDialog( + onDismissRequest = { showWarningDialog = false }, + title = { Text(stringResource(R.string.title_delete_account)) }, + text = { Text(stringResource(R.string.description_delete_account)) }, + dismissButton = { DialogCancelButton(R.string.cancel) { showWarningDialog = false } }, + confirmButton = { + DialogConfirmButton(R.string.label_delete_account) { + deleteMyAccount() + showWarningDialog = false + } + }) + } } @Preview diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/settings/SettingsUiState.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/settings/SettingsUiState.kt new file mode 100644 index 00000000..1659a69e --- /dev/null +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/settings/SettingsUiState.kt @@ -0,0 +1,3 @@ +package com.github.andiim.orchidscan.app.ui.screens.home.settings + +class SettingsUiState(val isAnonymousAccount: Boolean = true) \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/settings/SettingsViewModel.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/settings/SettingsViewModel.kt index 5bcdb81d..addc31ee 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/settings/SettingsViewModel.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/settings/SettingsViewModel.kt @@ -1,11 +1,38 @@ package com.github.andiim.orchidscan.app.ui.screens.home.settings +import com.github.andiim.orchidscan.app.data.firebase.AccountService import com.github.andiim.orchidscan.app.data.firebase.LogService +import com.github.andiim.orchidscan.app.ui.navigation.Direction import com.github.andiim.orchidscan.app.ui.screens.viewModels.PlantScanViewModel import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject +import kotlinx.coroutines.flow.map @HiltViewModel -class SettingsViewModel @Inject constructor(logService: LogService) : +class SettingsViewModel @Inject constructor( + private val accountService: AccountService, + logService: LogService +) : PlantScanViewModel(logService) { + val uiState = accountService.currentUser.map { SettingsUiState(it.isAnonymous) } + + fun onLoginClick(openScreen: (String) -> Unit) { + openScreen(Direction.Login.route) + } + + fun onSignUpClick(openScreen: (String) -> Unit) { + openScreen(Direction.SignUp.route) + } + + fun onSignOutClick(restartApp: (String) -> Unit) { + launchCatching { accountService.signOut() } + restartApp(Direction.Splash.route) + } + + fun onDeleteMyAccountClick(restartApp: (String) -> Unit) { + launchCatching { + accountService.deleteAccount() + restartApp(Direction.Splash.route) + } + } } \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_calendar.xml b/app/src/main/res/drawable/ic_calendar.xml new file mode 100644 index 00000000..964ec03c --- /dev/null +++ b/app/src/main/res/drawable/ic_calendar.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_check.xml b/app/src/main/res/drawable/ic_check.xml new file mode 100644 index 00000000..0432fa69 --- /dev/null +++ b/app/src/main/res/drawable/ic_check.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_clock.xml b/app/src/main/res/drawable/ic_clock.xml new file mode 100644 index 00000000..86533bf0 --- /dev/null +++ b/app/src/main/res/drawable/ic_clock.xml @@ -0,0 +1,13 @@ + + + + diff --git a/app/src/main/res/drawable/ic_create_account.xml b/app/src/main/res/drawable/ic_create_account.xml new file mode 100644 index 00000000..491bf766 --- /dev/null +++ b/app/src/main/res/drawable/ic_create_account.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_delete_my_account.xml b/app/src/main/res/drawable/ic_delete_my_account.xml new file mode 100644 index 00000000..3c4030b0 --- /dev/null +++ b/app/src/main/res/drawable/ic_delete_my_account.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_error.xml b/app/src/main/res/drawable/ic_error.xml new file mode 100644 index 00000000..7816afd1 --- /dev/null +++ b/app/src/main/res/drawable/ic_error.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_exit.xml b/app/src/main/res/drawable/ic_exit.xml new file mode 100644 index 00000000..83cdf05a --- /dev/null +++ b/app/src/main/res/drawable/ic_exit.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_flag.xml b/app/src/main/res/drawable/ic_flag.xml new file mode 100644 index 00000000..026653ce --- /dev/null +++ b/app/src/main/res/drawable/ic_flag.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_settings.xml b/app/src/main/res/drawable/ic_settings.xml new file mode 100644 index 00000000..f3164bc8 --- /dev/null +++ b/app/src/main/res/drawable/ic_settings.xml @@ -0,0 +1,12 @@ + + + diff --git a/app/src/main/res/drawable/ic_sign_in.xml b/app/src/main/res/drawable/ic_sign_in.xml new file mode 100644 index 00000000..6bdced2d --- /dev/null +++ b/app/src/main/res/drawable/ic_sign_in.xml @@ -0,0 +1,10 @@ + + + From 34e3e4ca90dbf69296e5096fc0f56b9400c5ef96 Mon Sep 17 00:00:00 2001 From: Andi-IM Date: Mon, 7 Aug 2023 15:26:29 +0700 Subject: [PATCH 23/29] feat : implementation for plant lists --- .../app/ui/navigation/Navigation.kt | 2 +- .../app/ui/screens/list/PlantListScreen.kt | 41 ++++++++++++++++--- .../app/ui/screens/list/PlantListViewModel.kt | 10 ++++- app/src/main/res/values/strings.xml | 4 ++ 4 files changed, 49 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/navigation/Navigation.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/navigation/Navigation.kt index c35f3ca0..590e765d 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/navigation/Navigation.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/navigation/Navigation.kt @@ -150,7 +150,7 @@ private fun NavGraphBuilder.listScreen(appState: PlantScanAppState) { } val viewModel: PlantListViewModel = hiltViewModel(parentEntry) PlantListScreen( - onDetails = { appState.navigate(Direction.Detail.createRoute(it)) }, + toDetails = { appState.navigate(Direction.Detail.createRoute(it)) }, popUpScreen = appState::popUp, viewModel = viewModel ) diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/list/PlantListScreen.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/list/PlantListScreen.kt index a98f2b62..e64deb1e 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/list/PlantListScreen.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/list/PlantListScreen.kt @@ -1,26 +1,57 @@ package com.github.andiim.orchidscan.app.ui.screens.list +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.ArrowBack +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton import androidx.compose.material3.Surface import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.hilt.navigation.compose.hiltViewModel +import androidx.paging.PagingData +import androidx.paging.compose.collectAsLazyPagingItems import com.github.andiim.orchidscan.app.data.model.Plant +import com.github.andiim.orchidscan.app.ui.common.composables.BasicToolbar +import com.github.andiim.orchidscan.app.ui.common.composables.PlantPagedList import com.github.andiim.orchidscan.app.ui.theme.PlantScanTheme +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flowOf +import com.github.andiim.orchidscan.app.R.string as AppText @Composable fun PlantListScreen( - onDetails: (Plant) -> Unit, + toDetails: (Plant) -> Unit, popUpScreen: () -> Unit, - modifier: Modifier = Modifier, viewModel: PlantListViewModel = hiltViewModel() ) { - PlantListContent() + PlantListContent( + data = viewModel.fetchedData, + onItemClick = toDetails, + popUpScreen = popUpScreen + ) } @Composable -fun PlantListContent() { +fun PlantListContent( + popUpScreen: () -> Unit = {}, + onItemClick: (Plant) -> Unit = {}, + data: Flow> = flowOf() +) { + val plants = data.collectAsLazyPagingItems() + BasicToolbar( + leading = { + IconButton(onClick = popUpScreen) { + Icon( + Icons.Default.ArrowBack, + contentDescription = stringResource(AppText.plants_exit) + ) + } + }, + title = AppText.plants_label + ) + PlantPagedList(plants = plants, onItemClick = onItemClick) } @Preview diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/list/PlantListViewModel.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/list/PlantListViewModel.kt index f444f06a..261281fd 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/list/PlantListViewModel.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/list/PlantListViewModel.kt @@ -1,11 +1,17 @@ package com.github.andiim.orchidscan.app.ui.screens.list +import androidx.lifecycle.viewModelScope +import androidx.paging.cachedIn import com.github.andiim.orchidscan.app.data.firebase.LogService +import com.github.andiim.orchidscan.app.data.firebase.PlantDatabase import com.github.andiim.orchidscan.app.ui.screens.viewModels.PlantScanViewModel import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject @HiltViewModel -class PlantListViewModel @Inject constructor(logService: LogService) : - PlantScanViewModel(logService) { +class PlantListViewModel @Inject constructor( + plantDatabase: PlantDatabase, + logService: LogService +) : PlantScanViewModel(logService) { + val fetchedData = plantDatabase.getAllPlant().cachedIn(viewModelScope) } \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ac0a5e2e..a743a596 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -10,6 +10,10 @@ Try again OK + + Plants + Back + Search Plant Search Icon From 198facee32ae30d1bcac7858cc08512b4cb2f93c Mon Sep 17 00:00:00 2001 From: Andi-IM Date: Mon, 7 Aug 2023 19:10:31 +0700 Subject: [PATCH 24/29] fix : forgot to implementation hilt in activity --- .../java/com/github/andiim/orchidscan/app/PlantScanActivity.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/PlantScanActivity.kt b/app/src/main/java/com/github/andiim/orchidscan/app/PlantScanActivity.kt index eb332c7b..12c16ca4 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/PlantScanActivity.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/PlantScanActivity.kt @@ -3,7 +3,9 @@ package com.github.andiim.orchidscan.app import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class PlantScanActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { From 294b7d3186214163fb8673dd5f87239a782078fa Mon Sep 17 00:00:00 2001 From: Andi-IM Date: Mon, 7 Aug 2023 19:15:53 +0700 Subject: [PATCH 25/29] feat : separate compose to android XML native for access hardware camera. --- app/build.gradle.kts | 2 -- app/src/main/AndroidManifest.xml | 4 ++- .../andiim/orchidscan/app/PlantScanApp.kt | 23 +++++++++++----- .../app/{ui/states => }/PlantScanAppState.kt | 25 +++++++++++++---- .../common/composables/BottomBarComposable.kt | 2 +- .../app/ui/navigation/Navigation.kt | 14 +++------- .../app/ui/screens/splash/SplashViewModel.kt | 2 ++ gradle/libs.versions.toml | 4 +++ library-android/build.gradle.kts | 8 ++++++ library-android/src/main/AndroidManifest.xml | 27 +++++++++++++++++++ .../library/android/detect/DetectActivity.kt | 12 +++++++++ .../src/main/res/layout/activity_detect.xml | 9 +++++++ .../src/main/res/values/strings.xml | 3 +++ 13 files changed, 108 insertions(+), 27 deletions(-) rename app/src/main/java/com/github/andiim/orchidscan/app/{ui/states => }/PlantScanAppState.kt (67%) create mode 100644 library-android/src/main/AndroidManifest.xml create mode 100644 library-android/src/main/java/com/github/andiim/orchidscan/library/android/detect/DetectActivity.kt create mode 100644 library-android/src/main/res/layout/activity_detect.xml create mode 100644 library-android/src/main/res/values/strings.xml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index a5b2c578..9a2fd9a1 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -80,8 +80,6 @@ dependencies { implementation(libs.androidx.appcompat) implementation(libs.androidx.core.ktx) - implementation(libs.bundles.camera) - testImplementation(libs.junit) androidTestImplementation(libs.androidx.test.ext.junit) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1c457987..612d7d20 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,8 +15,10 @@ android:exported="true"> - + diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/PlantScanApp.kt b/app/src/main/java/com/github/andiim/orchidscan/app/PlantScanApp.kt index e20d2bc1..1bd24540 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/PlantScanApp.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/PlantScanApp.kt @@ -1,6 +1,6 @@ package com.github.andiim.orchidscan.app -import android.content.res.Resources +import android.content.Context import androidx.compose.foundation.layout.padding import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold @@ -21,7 +21,6 @@ import androidx.navigation.compose.rememberNavController import com.github.andiim.orchidscan.app.ui.common.composables.BottomBar import com.github.andiim.orchidscan.app.ui.common.snackbar.SnackbarManager import com.github.andiim.orchidscan.app.ui.navigation.SetupRootNavGraph -import com.github.andiim.orchidscan.app.ui.states.PlantScanAppState import com.github.andiim.orchidscan.app.ui.theme.PlantScanTheme import kotlinx.coroutines.CoroutineScope @@ -53,9 +52,9 @@ fun OrchidScanApp() { @Composable @ReadOnlyComposable -fun resources(): Resources { +fun getContext(): Context { LocalConfiguration.current - return LocalContext.current.resources + return LocalContext.current } @Composable @@ -63,11 +62,21 @@ fun rememberAppState( snackbarHostState: SnackbarHostState = SnackbarHostState(), navController: NavHostController = rememberNavController(), snackbarManager: SnackbarManager = SnackbarManager, - resources: Resources = resources(), + context: Context = getContext(), coroutineScope: CoroutineScope = rememberCoroutineScope() ) = - remember(snackbarHostState, navController, snackbarManager, resources, coroutineScope) { + remember( + snackbarHostState, + navController, + snackbarManager, + context, + coroutineScope + ) { PlantScanAppState( - snackbarHostState, navController, snackbarManager, resources, coroutineScope + snackbarHostState, + navController, + snackbarManager, + context, + coroutineScope ) } diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/states/PlantScanAppState.kt b/app/src/main/java/com/github/andiim/orchidscan/app/PlantScanAppState.kt similarity index 67% rename from app/src/main/java/com/github/andiim/orchidscan/app/ui/states/PlantScanAppState.kt rename to app/src/main/java/com/github/andiim/orchidscan/app/PlantScanAppState.kt index a491851d..06457772 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/states/PlantScanAppState.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/PlantScanAppState.kt @@ -1,11 +1,14 @@ -package com.github.andiim.orchidscan.app.ui.states +package com.github.andiim.orchidscan.app -import android.content.res.Resources +import android.content.Context +import android.content.Intent +import android.net.Uri import androidx.compose.material3.SnackbarHostState import androidx.navigation.NavGraph.Companion.findStartDestination import androidx.navigation.NavHostController import com.github.andiim.orchidscan.app.ui.common.snackbar.SnackbarManager import com.github.andiim.orchidscan.app.ui.common.snackbar.SnackbarMessage.Companion.toMessage +import com.github.andiim.orchidscan.app.ui.navigation.Direction import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.launch @@ -14,13 +17,13 @@ class PlantScanAppState( val snackbarHostState: SnackbarHostState, val navController: NavHostController, private val snackbarManager: SnackbarManager, - private val resources: Resources, + private val context: Context, coroutineScope: CoroutineScope ) { init { coroutineScope.launch { snackbarManager.snackbarMessages.filterNotNull().collect { snackbarMessage -> - val text = snackbarMessage.toMessage(resources) + val text = snackbarMessage.toMessage(context.resources) snackbarHostState.showSnackbar(text) } } @@ -31,7 +34,19 @@ class PlantScanAppState( } fun navigate(route: String, singleTopLaunch: Boolean = true) { - navController.navigate(route) { launchSingleTop = singleTopLaunch } + if (route == Direction.Detect.route) { + toDetectActivity() + } else { + navController.navigate(route) { launchSingleTop = singleTopLaunch } + } + } + + private fun toDetectActivity() { + val intent = Intent(Intent.ACTION_VIEW).apply { + data = Uri.parse("plantscan://detection") + `package` = context.packageName + } + context.startActivity(intent) } fun navigateAndPopUp(route: String, popUp: String) { diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/BottomBarComposable.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/BottomBarComposable.kt index 795ed1a9..9ae5353f 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/BottomBarComposable.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/BottomBarComposable.kt @@ -14,7 +14,7 @@ import androidx.navigation.NavDestination.Companion.hierarchy import androidx.navigation.compose.currentBackStackEntryAsState import com.github.andiim.orchidscan.app.ui.navigation.Direction import com.github.andiim.orchidscan.app.ui.navigation.NavigationObject -import com.github.andiim.orchidscan.app.ui.states.PlantScanAppState +import com.github.andiim.orchidscan.app.PlantScanAppState @Composable fun BottomBar(state: PlantScanAppState) { diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/navigation/Navigation.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/navigation/Navigation.kt index 590e765d..bb63f58a 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/navigation/Navigation.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/navigation/Navigation.kt @@ -10,14 +10,13 @@ import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.navArgument import androidx.navigation.navigation +import com.github.andiim.orchidscan.app.PlantScanAppState import com.github.andiim.orchidscan.app.ui.screens.auth.login.LoginScreen import com.github.andiim.orchidscan.app.ui.screens.auth.login.LoginViewModel import com.github.andiim.orchidscan.app.ui.screens.auth.signUp.SignUpScreen import com.github.andiim.orchidscan.app.ui.screens.auth.signUp.SignUpViewModel import com.github.andiim.orchidscan.app.ui.screens.detail.DetailScreen import com.github.andiim.orchidscan.app.ui.screens.detail.DetailViewModel -import com.github.andiim.orchidscan.app.ui.screens.detect.DetectScreen -import com.github.andiim.orchidscan.app.ui.screens.detect.DetectViewModel import com.github.andiim.orchidscan.app.ui.screens.home.findPlant.FindPlantElement import com.github.andiim.orchidscan.app.ui.screens.home.findPlant.FindPlantViewModel import com.github.andiim.orchidscan.app.ui.screens.home.myGarden.MyGardenElement @@ -28,7 +27,6 @@ import com.github.andiim.orchidscan.app.ui.screens.list.PlantListScreen import com.github.andiim.orchidscan.app.ui.screens.list.PlantListViewModel import com.github.andiim.orchidscan.app.ui.screens.splash.SplashScreen import com.github.andiim.orchidscan.app.ui.screens.web.WebScreen -import com.github.andiim.orchidscan.app.ui.states.PlantScanAppState @Composable fun SetupRootNavGraph(appState: PlantScanAppState, modifier: Modifier = Modifier) { @@ -44,7 +42,6 @@ fun SetupRootNavGraph(appState: PlantScanAppState, modifier: Modifier = Modifier } detailScreen(appState) - detectScreen(appState) navigation( startDestination = Direction.FindPlant.route, @@ -99,13 +96,6 @@ private fun NavGraphBuilder.detailScreen(appState: PlantScanAppState) { } } -private fun NavGraphBuilder.detectScreen(appState: PlantScanAppState) { - composable(route = Direction.Detect.route) { - val viewModel: DetectViewModel = hiltViewModel() - DetectScreen(popUpScreen = appState::popUp, viewModel = viewModel) - } -} - private fun NavGraphBuilder.homeMyGardenElement(appState: PlantScanAppState) { composable(route = Direction.MyGarden.route) { val viewModel: MyGardenViewModel = hiltViewModel() @@ -172,3 +162,5 @@ private fun NavGraphBuilder.webViewScreen(appState: PlantScanAppState) { url?.let { WebScreen(url = it, name = "Testing", popUpScreen = appState::popUp) } } } + + diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/splash/SplashViewModel.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/splash/SplashViewModel.kt index 2db586ac..c83a2ffc 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/splash/SplashViewModel.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/splash/SplashViewModel.kt @@ -6,8 +6,10 @@ import com.github.andiim.orchidscan.app.data.firebase.ConfigurationService import com.github.andiim.orchidscan.app.data.firebase.LogService import com.github.andiim.orchidscan.app.ui.navigation.Direction import com.github.andiim.orchidscan.app.ui.screens.viewModels.PlantScanViewModel +import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject +@HiltViewModel class SplashViewModel @Inject constructor( configurationService: ConfigurationService, diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 992d0ac6..acfd2099 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -31,6 +31,8 @@ target_sdk_version = "34" benmanesversion = "0.47.0" timber = "5.0.1" truth = "1.1.5" +org-jetbrains-kotlin-android = "1.8.0" +constraintlayout = "2.1.4" [libraries] junit = { module = "junit:junit", version.ref = "junit" } @@ -92,6 +94,7 @@ paging-compose = { module = "androidx.paging:paging-compose", version = "3.2.0" timber = { group = "com.jakewharton.timber", name = "timber", version.ref = "timber" } truth = { module = "com.google.truth:truth", version.ref = "truth" } play-services-auth = { group = "com.google.android.gms", name = "play-services-auth", version = "20.6.0" } +constraintlayout = { group = "androidx.constraintlayout", name = "constraintlayout", version.ref = "constraintlayout" } [bundles] camera = ["camera","camera-core", "camera-lifecycle", "camera-extensions"] @@ -105,3 +108,4 @@ paging = ["paging-common", "paging-compose"] detekt = { id = "io.gitlab.arturbosch.detekt", version.ref = "detekt" } ktlint = { id = "org.jlleitschuh.gradle.ktlint", version.ref = "ktlint.gradle" } versions = { id = "com.github.ben-manes.versions", version.ref = "benmanesversion" } +org-jetbrains-kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "org-jetbrains-kotlin-android" } diff --git a/library-android/build.gradle.kts b/library-android/build.gradle.kts index ba68a9c1..f875535d 100644 --- a/library-android/build.gradle.kts +++ b/library-android/build.gradle.kts @@ -23,6 +23,11 @@ android { targetCompatibility = JavaVersion.VERSION_17 } + buildFeatures { + buildConfig = true + viewBinding = true + } + kotlinOptions { jvmTarget = JavaVersion.VERSION_17.toString() } @@ -53,8 +58,11 @@ android { dependencies { implementation(libs.androidx.appcompat) implementation(libs.androidx.core.ktx) + implementation(libs.material) + implementation(libs.constraintlayout) testImplementation(libs.junit) + implementation(libs.bundles.camera) androidTestImplementation(libs.androidx.test.runner) androidTestImplementation(libs.androidx.test.ext.junit) diff --git a/library-android/src/main/AndroidManifest.xml b/library-android/src/main/AndroidManifest.xml new file mode 100644 index 00000000..19ae28a9 --- /dev/null +++ b/library-android/src/main/AndroidManifest.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/library-android/src/main/java/com/github/andiim/orchidscan/library/android/detect/DetectActivity.kt b/library-android/src/main/java/com/github/andiim/orchidscan/library/android/detect/DetectActivity.kt new file mode 100644 index 00000000..6ace0099 --- /dev/null +++ b/library-android/src/main/java/com/github/andiim/orchidscan/library/android/detect/DetectActivity.kt @@ -0,0 +1,12 @@ +package com.github.andiim.orchidscan.library.android.detect + +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import com.github.andiim.orchidscan.library.android.R + +class DetectActivity : AppCompatActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_detect) + } +} \ No newline at end of file diff --git a/library-android/src/main/res/layout/activity_detect.xml b/library-android/src/main/res/layout/activity_detect.xml new file mode 100644 index 00000000..92ce5a5a --- /dev/null +++ b/library-android/src/main/res/layout/activity_detect.xml @@ -0,0 +1,9 @@ + + + + \ No newline at end of file diff --git a/library-android/src/main/res/values/strings.xml b/library-android/src/main/res/values/strings.xml new file mode 100644 index 00000000..dadecbf8 --- /dev/null +++ b/library-android/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + Detect a Plant + \ No newline at end of file From 5309a83f5c53e435845c07a2ecd27be9806aad7a Mon Sep 17 00:00:00 2001 From: Andi-IM Date: Mon, 7 Aug 2023 19:22:20 +0700 Subject: [PATCH 26/29] fix : resolve hilt error --- .../java/com/github/andiim/orchidscan/app/PlantScanActivity.kt | 2 ++ .../github/andiim/orchidscan/app/PlantScanHiltApplication.kt | 2 ++ 2 files changed, 4 insertions(+) diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/PlantScanActivity.kt b/app/src/main/java/com/github/andiim/orchidscan/app/PlantScanActivity.kt index eb332c7b..12c16ca4 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/PlantScanActivity.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/PlantScanActivity.kt @@ -3,7 +3,9 @@ package com.github.andiim.orchidscan.app import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class PlantScanActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/PlantScanHiltApplication.kt b/app/src/main/java/com/github/andiim/orchidscan/app/PlantScanHiltApplication.kt index 3ef50a2d..9f7585b5 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/PlantScanHiltApplication.kt +++ b/app/src/main/java/com/github/andiim/orchidscan/app/PlantScanHiltApplication.kt @@ -2,8 +2,10 @@ package com.github.andiim.orchidscan.app import android.app.Application import com.github.andiim.orchidscan.app.di.DebugModule.provideTimberTree +import dagger.hilt.android.HiltAndroidApp import timber.log.Timber +@HiltAndroidApp class PlantScanHiltApplication : Application() { override fun onCreate() { super.onCreate() From c5395bba64a459639e07eb1016c9e6e156fc541a Mon Sep 17 00:00:00 2001 From: Andi-IM Date: Mon, 7 Aug 2023 21:43:39 +0700 Subject: [PATCH 27/29] fix : resolve hilt error, changing the package from orchidscan to plantscan --- app/build.gradle.kts | 10 ++- app/src/main/AndroidManifest.xml | 35 +++++++--- .../app/ui/screens/detail/DetailViewModel.kt | 12 ---- .../app/ui/screens/detect/DetectViewModel.kt | 12 ---- .../screens/home/settings/SettingsUiState.kt | 3 - .../app/PlantScanActivity.kt | 3 +- .../app/PlantScanApp.kt | 54 +++++++++++---- .../app/PlantScanAppState.kt | 32 +++++---- .../app/PlantScanHiltApplication.kt | 4 +- .../app/PlantScanMessagingService.kt | 57 ++++++++++++++++ .../app/data/firebase/AccountService.kt | 4 +- .../app/data/firebase/ConfigurationService.kt | 2 +- .../app/data/firebase/LogService.kt | 2 +- .../app/data/firebase/PlantDatabase.kt | 4 +- .../firebase/implement/AccountServiceImpl.kt | 40 +++++++++++ .../implement/ConfigurationServiceImpl.kt | 11 +++ .../data/firebase/implement/LogServiceImpl.kt | 10 +++ .../firebase/implement/PlantDatabaseImpl.kt | 21 ++++++ .../app/data/model/Image.kt | 2 +- .../app/data/model/Plant.kt | 2 +- .../app/data/model/PlantDetail.kt | 2 +- .../app/data/model/Taxonomy.kt | 2 +- .../app/data/model/User.kt | 2 +- .../app/di/DebugModule.kt | 2 +- .../andiim/plantscan/app/di/ServiceModule.kt | 30 +++++++++ .../app/di/TimberDebugTree.kt | 2 +- .../common/composables/BottomBarComposable.kt | 8 +-- .../ui/common/composables/ButtonComposable.kt | 8 +-- .../common/composables/DropdownComposable.kt | 11 +-- .../composables/PermissionDialogComposable.kt | 10 +-- .../app/ui/common/composables/PlantItem.kt | 8 +-- .../ui/common/composables/PlantPagedList.kt | 4 +- .../common/composables/TextFieldComposable.kt | 8 +-- .../common/composables/ToolbarComposable.kt | 8 +-- .../ui/common/extensions/ModifierExtension.kt | 2 +- .../app/ui/common/snackbar/SnackbarManager.kt | 2 +- .../app/ui/common/snackbar/SnackbarMessage.kt | 4 +- .../app/ui/navigation/Direction.kt | 4 +- .../app/ui/navigation/Navigation.kt | 36 +++++----- .../app/ui/navigation/NavigationItem.kt | 2 +- .../app/ui/navigation/NavigationObject.kt | 4 +- .../app/ui/screens/auth/login/LoginScreen.kt | 20 +++--- .../app/ui/screens/auth/login/LoginState.kt | 2 +- .../ui/screens/auth/login/LoginViewModel.kt | 18 ++--- .../ui/screens/auth/signUp/SignUpScreen.kt | 20 +++--- .../app/ui/screens/auth/signUp/SignUpState.kt | 2 +- .../ui/screens/auth/signUp/SignUpViewModel.kt | 20 +++--- .../app/ui/screens/detail/DetailScreen.kt | 4 +- .../app/ui/screens/detail/DetailViewModel.kt | 12 ++++ .../app/ui/screens/detect/DetectScreen.kt | 4 +- .../app/ui/screens/detect/DetectViewModel.kt | 12 ++++ .../home/findPlant/FindPlantElement.kt | 10 +-- .../home/findPlant/FindPlantViewModel.kt | 10 +-- .../screens/home/myGarden/MyGardenElement.kt | 8 +-- .../home/myGarden/MyGardenViewModel.kt | 8 +-- .../screens/home/settings/SettingsElement.kt | 20 +++--- .../screens/home/settings/SettingsUiState.kt | 3 + .../home/settings/SettingsViewModel.kt | 10 +-- .../app/ui/screens/list/PlantListScreen.kt | 12 ++-- .../app/ui/screens/list/PlantListViewModel.kt | 8 +-- .../app/ui/screens/splash/SplashScreen.kt | 10 +-- .../app/ui/screens/splash/SplashViewModel.kt | 12 ++-- .../screens/viewModels/PlantScanViewModel.kt | 8 +-- .../app/ui/screens/web/WebScreen.kt | 2 +- .../app/ui/theme/Color.kt | 2 +- .../app/ui/theme/Shapes.kt | 2 +- .../app/ui/theme/Theme.kt | 2 +- .../app/ui/theme/Type.kt | 2 +- app/src/main/res/values-night/themes.xml | 34 ++++++++++ app/src/main/res/values/colors.xml | 67 ++++++++++++++++++- app/src/main/res/values/styles.xml | 11 --- app/src/main/res/values/themes.xml | 57 ++++++++++++++++ gradle.properties | 2 +- gradle/libs.versions.toml | 2 +- library-android/build.gradle.kts | 2 +- .../library/android/ToastUtilTest.kt | 3 +- library-android/src/main/AndroidManifest.xml | 2 +- .../library/android/ToastUtil.kt | 2 +- .../library/android/detect/DetectActivity.kt | 4 +- .../android/extensions/BitmapExtensions.kt | 2 +- .../android/extensions/StringExtension.kt | 2 +- .../src/main/res/layout/activity_detect.xml | 2 +- 82 files changed, 638 insertions(+), 276 deletions(-) delete mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/detail/DetailViewModel.kt delete mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/detect/DetectViewModel.kt delete mode 100644 app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/settings/SettingsUiState.kt rename app/src/main/java/com/github/andiim/{orchidscan => plantscan}/app/PlantScanActivity.kt (89%) rename app/src/main/java/com/github/andiim/{orchidscan => plantscan}/app/PlantScanApp.kt (56%) rename app/src/main/java/com/github/andiim/{orchidscan => plantscan}/app/PlantScanAppState.kt (67%) rename app/src/main/java/com/github/andiim/{orchidscan => plantscan}/app/PlantScanHiltApplication.kt (73%) create mode 100644 app/src/main/java/com/github/andiim/plantscan/app/PlantScanMessagingService.kt rename app/src/main/java/com/github/andiim/{orchidscan => plantscan}/app/data/firebase/AccountService.kt (79%) rename app/src/main/java/com/github/andiim/{orchidscan => plantscan}/app/data/firebase/ConfigurationService.kt (69%) rename app/src/main/java/com/github/andiim/{orchidscan => plantscan}/app/data/firebase/LogService.kt (56%) rename app/src/main/java/com/github/andiim/{orchidscan => plantscan}/app/data/firebase/PlantDatabase.kt (69%) create mode 100644 app/src/main/java/com/github/andiim/plantscan/app/data/firebase/implement/AccountServiceImpl.kt create mode 100644 app/src/main/java/com/github/andiim/plantscan/app/data/firebase/implement/ConfigurationServiceImpl.kt create mode 100644 app/src/main/java/com/github/andiim/plantscan/app/data/firebase/implement/LogServiceImpl.kt create mode 100644 app/src/main/java/com/github/andiim/plantscan/app/data/firebase/implement/PlantDatabaseImpl.kt rename app/src/main/java/com/github/andiim/{orchidscan => plantscan}/app/data/model/Image.kt (64%) rename app/src/main/java/com/github/andiim/{orchidscan => plantscan}/app/data/model/Plant.kt (82%) rename app/src/main/java/com/github/andiim/{orchidscan => plantscan}/app/data/model/PlantDetail.kt (66%) rename app/src/main/java/com/github/andiim/{orchidscan => plantscan}/app/data/model/Taxonomy.kt (78%) rename app/src/main/java/com/github/andiim/{orchidscan => plantscan}/app/data/model/User.kt (57%) rename app/src/main/java/com/github/andiim/{orchidscan => plantscan}/app/di/DebugModule.kt (86%) create mode 100644 app/src/main/java/com/github/andiim/plantscan/app/di/ServiceModule.kt rename app/src/main/java/com/github/andiim/{orchidscan => plantscan}/app/di/TimberDebugTree.kt (93%) rename app/src/main/java/com/github/andiim/{orchidscan => plantscan}/app/ui/common/composables/BottomBarComposable.kt (87%) rename app/src/main/java/com/github/andiim/{orchidscan => plantscan}/app/ui/common/composables/ButtonComposable.kt (91%) rename app/src/main/java/com/github/andiim/{orchidscan => plantscan}/app/ui/common/composables/DropdownComposable.kt (93%) rename app/src/main/java/com/github/andiim/{orchidscan => plantscan}/app/ui/common/composables/PermissionDialogComposable.kt (92%) rename app/src/main/java/com/github/andiim/{orchidscan => plantscan}/app/ui/common/composables/PlantItem.kt (93%) rename app/src/main/java/com/github/andiim/{orchidscan => plantscan}/app/ui/common/composables/PlantPagedList.kt (96%) rename app/src/main/java/com/github/andiim/{orchidscan => plantscan}/app/ui/common/composables/TextFieldComposable.kt (95%) rename app/src/main/java/com/github/andiim/{orchidscan => plantscan}/app/ui/common/composables/ToolbarComposable.kt (92%) rename app/src/main/java/com/github/andiim/{orchidscan => plantscan}/app/ui/common/extensions/ModifierExtension.kt (95%) rename app/src/main/java/com/github/andiim/{orchidscan => plantscan}/app/ui/common/snackbar/SnackbarManager.kt (90%) rename app/src/main/java/com/github/andiim/{orchidscan => plantscan}/app/ui/common/snackbar/SnackbarMessage.kt (88%) rename app/src/main/java/com/github/andiim/{orchidscan => plantscan}/app/ui/navigation/Direction.kt (86%) rename app/src/main/java/com/github/andiim/{orchidscan => plantscan}/app/ui/navigation/Navigation.kt (80%) rename app/src/main/java/com/github/andiim/{orchidscan => plantscan}/app/ui/navigation/NavigationItem.kt (78%) rename app/src/main/java/com/github/andiim/{orchidscan => plantscan}/app/ui/navigation/NavigationObject.kt (88%) rename app/src/main/java/com/github/andiim/{orchidscan => plantscan}/app/ui/screens/auth/login/LoginScreen.kt (87%) rename app/src/main/java/com/github/andiim/{orchidscan => plantscan}/app/ui/screens/auth/login/LoginState.kt (53%) rename app/src/main/java/com/github/andiim/{orchidscan => plantscan}/app/ui/screens/auth/login/LoginViewModel.kt (74%) rename app/src/main/java/com/github/andiim/{orchidscan => plantscan}/app/ui/screens/auth/signUp/SignUpScreen.kt (76%) rename app/src/main/java/com/github/andiim/{orchidscan => plantscan}/app/ui/screens/auth/signUp/SignUpState.kt (65%) rename app/src/main/java/com/github/andiim/{orchidscan => plantscan}/app/ui/screens/auth/signUp/SignUpViewModel.kt (70%) rename app/src/main/java/com/github/andiim/{orchidscan => plantscan}/app/ui/screens/detail/DetailScreen.kt (81%) create mode 100644 app/src/main/java/com/github/andiim/plantscan/app/ui/screens/detail/DetailViewModel.kt rename app/src/main/java/com/github/andiim/{orchidscan => plantscan}/app/ui/screens/detect/DetectScreen.kt (80%) create mode 100644 app/src/main/java/com/github/andiim/plantscan/app/ui/screens/detect/DetectViewModel.kt rename app/src/main/java/com/github/andiim/{orchidscan => plantscan}/app/ui/screens/home/findPlant/FindPlantElement.kt (93%) rename app/src/main/java/com/github/andiim/{orchidscan => plantscan}/app/ui/screens/home/findPlant/FindPlantViewModel.kt (82%) rename app/src/main/java/com/github/andiim/{orchidscan => plantscan}/app/ui/screens/home/myGarden/MyGardenElement.kt (77%) rename app/src/main/java/com/github/andiim/{orchidscan => plantscan}/app/ui/screens/home/myGarden/MyGardenViewModel.kt (57%) rename app/src/main/java/com/github/andiim/{orchidscan => plantscan}/app/ui/screens/home/settings/SettingsElement.kt (86%) create mode 100644 app/src/main/java/com/github/andiim/plantscan/app/ui/screens/home/settings/SettingsUiState.kt rename app/src/main/java/com/github/andiim/{orchidscan => plantscan}/app/ui/screens/home/settings/SettingsViewModel.kt (73%) rename app/src/main/java/com/github/andiim/{orchidscan => plantscan}/app/ui/screens/list/PlantListScreen.kt (80%) rename app/src/main/java/com/github/andiim/{orchidscan => plantscan}/app/ui/screens/list/PlantListViewModel.kt (58%) rename app/src/main/java/com/github/andiim/{orchidscan => plantscan}/app/ui/screens/splash/SplashScreen.kt (89%) rename app/src/main/java/com/github/andiim/{orchidscan => plantscan}/app/ui/screens/splash/SplashViewModel.kt (73%) rename app/src/main/java/com/github/andiim/{orchidscan => plantscan}/app/ui/screens/viewModels/PlantScanViewModel.kt (68%) rename app/src/main/java/com/github/andiim/{orchidscan => plantscan}/app/ui/screens/web/WebScreen.kt (96%) rename app/src/main/java/com/github/andiim/{orchidscan => plantscan}/app/ui/theme/Color.kt (98%) rename app/src/main/java/com/github/andiim/{orchidscan => plantscan}/app/ui/theme/Shapes.kt (93%) rename app/src/main/java/com/github/andiim/{orchidscan => plantscan}/app/ui/theme/Theme.kt (98%) rename app/src/main/java/com/github/andiim/{orchidscan => plantscan}/app/ui/theme/Type.kt (90%) create mode 100644 app/src/main/res/values-night/themes.xml delete mode 100644 app/src/main/res/values/styles.xml create mode 100644 app/src/main/res/values/themes.xml rename library-android/src/androidTest/java/com/github/andiim/{orchidscan => plantscan}/library/android/ToastUtilTest.kt (85%) rename library-android/src/main/java/com/github/andiim/{orchidscan => plantscan}/library/android/ToastUtil.kt (82%) rename library-android/src/main/java/com/github/andiim/{orchidscan => plantscan}/library/android/detect/DetectActivity.kt (70%) rename library-android/src/main/java/com/github/andiim/{orchidscan => plantscan}/library/android/extensions/BitmapExtensions.kt (88%) rename library-android/src/main/java/com/github/andiim/{orchidscan => plantscan}/library/android/extensions/StringExtension.kt (91%) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 9a2fd9a1..866b7785 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -3,6 +3,9 @@ plugins { kotlin("android") kotlin("kapt") id("com.google.dagger.hilt.android") + id("com.google.gms.google-services") + id("com.google.firebase.crashlytics") + id("com.google.firebase.firebase-perf") } android { @@ -10,7 +13,7 @@ android { defaultConfig { minSdk = libs.versions.min.sdk.version.get().toInt() - namespace = "com.github.andiim.orchidscan.app" + namespace = "com.github.andiim.plantscan.app" applicationId = AppCoordinates.APP_ID versionCode = AppCoordinates.APP_VERSION_CODE @@ -77,6 +80,11 @@ dependencies { implementation(libs.accompanist.permission) implementation(libs.accompanist.webview) + // Firebase + implementation(platform(libs.firebase.bom)) + implementation(libs.bundles.firebase) + implementation(libs.play.services.auth) + implementation(libs.androidx.appcompat) implementation(libs.androidx.core.ktx) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 612d7d20..257a8f08 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,18 +1,15 @@ - + - + android:theme="@style/Theme.PlantScan"> + @@ -21,6 +18,26 @@ android:scheme="plantscan"/> + + + + + + + + + + diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/detail/DetailViewModel.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/detail/DetailViewModel.kt deleted file mode 100644 index d3ea2913..00000000 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/detail/DetailViewModel.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.github.andiim.orchidscan.app.ui.screens.detail - -import com.github.andiim.orchidscan.app.data.firebase.LogService -import com.github.andiim.orchidscan.app.ui.screens.viewModels.PlantScanViewModel -import dagger.hilt.android.lifecycle.HiltViewModel -import javax.inject.Inject - -@HiltViewModel -class DetailViewModel @Inject -constructor(logService: LogService) : PlantScanViewModel(logService) { - -} \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/detect/DetectViewModel.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/detect/DetectViewModel.kt deleted file mode 100644 index 6810b2e3..00000000 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/detect/DetectViewModel.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.github.andiim.orchidscan.app.ui.screens.detect - -import com.github.andiim.orchidscan.app.data.firebase.LogService -import com.github.andiim.orchidscan.app.ui.screens.viewModels.PlantScanViewModel -import dagger.hilt.android.lifecycle.HiltViewModel -import javax.inject.Inject - -@HiltViewModel -class DetectViewModel @Inject constructor(logService: LogService) : - PlantScanViewModel(logService) { - -} \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/settings/SettingsUiState.kt b/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/settings/SettingsUiState.kt deleted file mode 100644 index 1659a69e..00000000 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/settings/SettingsUiState.kt +++ /dev/null @@ -1,3 +0,0 @@ -package com.github.andiim.orchidscan.app.ui.screens.home.settings - -class SettingsUiState(val isAnonymousAccount: Boolean = true) \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/PlantScanActivity.kt b/app/src/main/java/com/github/andiim/plantscan/app/PlantScanActivity.kt similarity index 89% rename from app/src/main/java/com/github/andiim/orchidscan/app/PlantScanActivity.kt rename to app/src/main/java/com/github/andiim/plantscan/app/PlantScanActivity.kt index 12c16ca4..be2a88cc 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/PlantScanActivity.kt +++ b/app/src/main/java/com/github/andiim/plantscan/app/PlantScanActivity.kt @@ -1,4 +1,4 @@ -package com.github.andiim.orchidscan.app +package com.github.andiim.plantscan.app import android.os.Bundle import androidx.activity.ComponentActivity @@ -7,7 +7,6 @@ import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint class PlantScanActivity : ComponentActivity() { - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { OrchidScanApp() } diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/PlantScanApp.kt b/app/src/main/java/com/github/andiim/plantscan/app/PlantScanApp.kt similarity index 56% rename from app/src/main/java/com/github/andiim/orchidscan/app/PlantScanApp.kt rename to app/src/main/java/com/github/andiim/plantscan/app/PlantScanApp.kt index 1bd24540..280c572a 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/PlantScanApp.kt +++ b/app/src/main/java/com/github/andiim/plantscan/app/PlantScanApp.kt @@ -1,6 +1,10 @@ -package com.github.andiim.orchidscan.app +package com.github.andiim.plantscan.app -import android.content.Context +import android.Manifest +import android.content.res.Resources +import android.os.Build +import androidx.annotation.RequiresApi +import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold @@ -18,18 +22,31 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp import androidx.navigation.NavHostController import androidx.navigation.compose.rememberNavController -import com.github.andiim.orchidscan.app.ui.common.composables.BottomBar -import com.github.andiim.orchidscan.app.ui.common.snackbar.SnackbarManager -import com.github.andiim.orchidscan.app.ui.navigation.SetupRootNavGraph -import com.github.andiim.orchidscan.app.ui.theme.PlantScanTheme +import com.github.andiim.plantscan.app.ui.common.composables.BottomBar +import com.github.andiim.plantscan.app.ui.common.composables.PermissionDialog +import com.github.andiim.plantscan.app.ui.common.composables.RationaleDialog +import com.github.andiim.plantscan.app.ui.common.snackbar.SnackbarManager +import com.github.andiim.plantscan.app.ui.navigation.SetupRootNavGraph +import com.github.andiim.plantscan.app.ui.theme.PlantScanTheme +import com.google.accompanist.permissions.ExperimentalPermissionsApi +import com.google.accompanist.permissions.isGranted +import com.google.accompanist.permissions.rememberPermissionState +import com.google.accompanist.permissions.shouldShowRationale import kotlinx.coroutines.CoroutineScope @Composable fun OrchidScanApp() { PlantScanTheme { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + RequestNotificationPermissionDialog() + } + val appState = rememberAppState() - Surface(color = MaterialTheme.colorScheme.background) { + Surface( + modifier = Modifier.fillMaxSize(), + color = MaterialTheme.colorScheme.background + ) { Scaffold( snackbarHost = { SnackbarHost( @@ -52,9 +69,9 @@ fun OrchidScanApp() { @Composable @ReadOnlyComposable -fun getContext(): Context { +fun resources(): Resources { LocalConfiguration.current - return LocalContext.current + return LocalContext.current.resources } @Composable @@ -62,21 +79,34 @@ fun rememberAppState( snackbarHostState: SnackbarHostState = SnackbarHostState(), navController: NavHostController = rememberNavController(), snackbarManager: SnackbarManager = SnackbarManager, - context: Context = getContext(), + resources: Resources = resources(), coroutineScope: CoroutineScope = rememberCoroutineScope() ) = remember( snackbarHostState, navController, snackbarManager, - context, + resources, coroutineScope ) { PlantScanAppState( snackbarHostState, navController, snackbarManager, - context, + resources, coroutineScope ) } + +@RequiresApi(Build.VERSION_CODES.TIRAMISU) +@OptIn(ExperimentalPermissionsApi::class) +@Composable +fun RequestNotificationPermissionDialog() { + val permissionState = + rememberPermissionState(permission = Manifest.permission.POST_NOTIFICATIONS) + + if (!permissionState.status.isGranted) { + if (permissionState.status.shouldShowRationale) RationaleDialog() + else PermissionDialog { permissionState.launchPermissionRequest() } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/PlantScanAppState.kt b/app/src/main/java/com/github/andiim/plantscan/app/PlantScanAppState.kt similarity index 67% rename from app/src/main/java/com/github/andiim/orchidscan/app/PlantScanAppState.kt rename to app/src/main/java/com/github/andiim/plantscan/app/PlantScanAppState.kt index 06457772..1d230044 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/PlantScanAppState.kt +++ b/app/src/main/java/com/github/andiim/plantscan/app/PlantScanAppState.kt @@ -1,14 +1,12 @@ -package com.github.andiim.orchidscan.app +package com.github.andiim.plantscan.app -import android.content.Context -import android.content.Intent -import android.net.Uri +import android.content.res.Resources import androidx.compose.material3.SnackbarHostState import androidx.navigation.NavGraph.Companion.findStartDestination import androidx.navigation.NavHostController -import com.github.andiim.orchidscan.app.ui.common.snackbar.SnackbarManager -import com.github.andiim.orchidscan.app.ui.common.snackbar.SnackbarMessage.Companion.toMessage -import com.github.andiim.orchidscan.app.ui.navigation.Direction +import com.github.andiim.plantscan.app.ui.common.snackbar.SnackbarManager +import com.github.andiim.plantscan.app.ui.common.snackbar.SnackbarMessage.Companion.toMessage +import com.github.andiim.plantscan.app.ui.navigation.Direction import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.launch @@ -17,13 +15,13 @@ class PlantScanAppState( val snackbarHostState: SnackbarHostState, val navController: NavHostController, private val snackbarManager: SnackbarManager, - private val context: Context, + private val resources: Resources, coroutineScope: CoroutineScope ) { init { coroutineScope.launch { snackbarManager.snackbarMessages.filterNotNull().collect { snackbarMessage -> - val text = snackbarMessage.toMessage(context.resources) + val text = snackbarMessage.toMessage(resources) snackbarHostState.showSnackbar(text) } } @@ -35,19 +33,19 @@ class PlantScanAppState( fun navigate(route: String, singleTopLaunch: Boolean = true) { if (route == Direction.Detect.route) { - toDetectActivity() + //toDetectActivity() } else { navController.navigate(route) { launchSingleTop = singleTopLaunch } } } - private fun toDetectActivity() { - val intent = Intent(Intent.ACTION_VIEW).apply { - data = Uri.parse("plantscan://detection") - `package` = context.packageName - } - context.startActivity(intent) - } +// private fun toDetectActivity() { +// val intent = Intent(Intent.ACTION_VIEW).apply { +// data = Uri.parse("plantscan://detection") +// `package` = context.packageName +// } +// context.startActivity(intent) +// } fun navigateAndPopUp(route: String, popUp: String) { navController.navigate(route) { diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/PlantScanHiltApplication.kt b/app/src/main/java/com/github/andiim/plantscan/app/PlantScanHiltApplication.kt similarity index 73% rename from app/src/main/java/com/github/andiim/orchidscan/app/PlantScanHiltApplication.kt rename to app/src/main/java/com/github/andiim/plantscan/app/PlantScanHiltApplication.kt index 9f7585b5..42868a7a 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/PlantScanHiltApplication.kt +++ b/app/src/main/java/com/github/andiim/plantscan/app/PlantScanHiltApplication.kt @@ -1,7 +1,7 @@ -package com.github.andiim.orchidscan.app +package com.github.andiim.plantscan.app import android.app.Application -import com.github.andiim.orchidscan.app.di.DebugModule.provideTimberTree +import com.github.andiim.plantscan.app.di.DebugModule.provideTimberTree import dagger.hilt.android.HiltAndroidApp import timber.log.Timber diff --git a/app/src/main/java/com/github/andiim/plantscan/app/PlantScanMessagingService.kt b/app/src/main/java/com/github/andiim/plantscan/app/PlantScanMessagingService.kt new file mode 100644 index 00000000..b77b40ab --- /dev/null +++ b/app/src/main/java/com/github/andiim/plantscan/app/PlantScanMessagingService.kt @@ -0,0 +1,57 @@ +package com.github.andiim.plantscan.app + +import android.app.NotificationChannel +import android.app.NotificationManager +import android.app.PendingIntent +import android.content.Intent +import android.os.Build +import androidx.core.app.NotificationCompat +import com.google.firebase.messaging.FirebaseMessagingService +import com.google.firebase.messaging.RemoteMessage +import timber.log.Timber +import kotlin.random.Random + +class PlantScanMessagingService : FirebaseMessagingService() { + private val random = Random + override fun onMessageReceived(remoteMessage: RemoteMessage) { + remoteMessage.notification?.let { message -> sendNotification(message) } + } + + private fun sendNotification(message: RemoteMessage.Notification) { + // If you want the notifications to appear when your app is in foreground + val intent = + Intent(this, PlantScanActivity::class.java).apply { addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) } + + val pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_IMMUTABLE) + + val channelId = this.getString(R.string.default_notification_channel_id) + + val notificationBuilder = + NotificationCompat.Builder(this, channelId) + .setContentTitle(message.title) + .setContentText(message.body) + .setSmallIcon(R.mipmap.ic_launcher) + .setAutoCancel(true) + .setContentIntent(pendingIntent) + + val manager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + val channel = NotificationChannel(channelId, CHANNEL_NAME, NotificationManager.IMPORTANCE_DEFAULT) + manager.createNotificationChannel(channel) + } + + manager.notify(random.nextInt(), notificationBuilder.build()) + } + + override fun onNewToken(token: String) { + // If you want to send messages to this application instance or + // manage this apps subscriptions on the server side, send the + // FCM registration token to your app server. + Timber.d("FCM", "onNewToken: $token") + } + + companion object { + const val CHANNEL_NAME = "FCM notification channel" + } +} diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/data/firebase/AccountService.kt b/app/src/main/java/com/github/andiim/plantscan/app/data/firebase/AccountService.kt similarity index 79% rename from app/src/main/java/com/github/andiim/orchidscan/app/data/firebase/AccountService.kt rename to app/src/main/java/com/github/andiim/plantscan/app/data/firebase/AccountService.kt index 9faee130..923edebe 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/data/firebase/AccountService.kt +++ b/app/src/main/java/com/github/andiim/plantscan/app/data/firebase/AccountService.kt @@ -1,6 +1,6 @@ -package com.github.andiim.orchidscan.app.data.firebase +package com.github.andiim.plantscan.app.data.firebase -import com.github.andiim.orchidscan.app.data.model.User +import com.github.andiim.plantscan.app.data.model.User import kotlinx.coroutines.flow.Flow interface AccountService { diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/data/firebase/ConfigurationService.kt b/app/src/main/java/com/github/andiim/plantscan/app/data/firebase/ConfigurationService.kt similarity index 69% rename from app/src/main/java/com/github/andiim/orchidscan/app/data/firebase/ConfigurationService.kt rename to app/src/main/java/com/github/andiim/plantscan/app/data/firebase/ConfigurationService.kt index 1a9ed604..bd8186dc 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/data/firebase/ConfigurationService.kt +++ b/app/src/main/java/com/github/andiim/plantscan/app/data/firebase/ConfigurationService.kt @@ -1,4 +1,4 @@ -package com.github.andiim.orchidscan.app.data.firebase +package com.github.andiim.plantscan.app.data.firebase interface ConfigurationService { suspend fun fetchConfiguration(): Boolean diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/data/firebase/LogService.kt b/app/src/main/java/com/github/andiim/plantscan/app/data/firebase/LogService.kt similarity index 56% rename from app/src/main/java/com/github/andiim/orchidscan/app/data/firebase/LogService.kt rename to app/src/main/java/com/github/andiim/plantscan/app/data/firebase/LogService.kt index 7a61dda2..133a8031 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/data/firebase/LogService.kt +++ b/app/src/main/java/com/github/andiim/plantscan/app/data/firebase/LogService.kt @@ -1,4 +1,4 @@ -package com.github.andiim.orchidscan.app.data.firebase +package com.github.andiim.plantscan.app.data.firebase interface LogService { fun logNonFatalCrash(throwable: Throwable) diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/data/firebase/PlantDatabase.kt b/app/src/main/java/com/github/andiim/plantscan/app/data/firebase/PlantDatabase.kt similarity index 69% rename from app/src/main/java/com/github/andiim/orchidscan/app/data/firebase/PlantDatabase.kt rename to app/src/main/java/com/github/andiim/plantscan/app/data/firebase/PlantDatabase.kt index 013e30a6..afcf0753 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/data/firebase/PlantDatabase.kt +++ b/app/src/main/java/com/github/andiim/plantscan/app/data/firebase/PlantDatabase.kt @@ -1,7 +1,7 @@ -package com.github.andiim.orchidscan.app.data.firebase +package com.github.andiim.plantscan.app.data.firebase import androidx.paging.PagingData -import com.github.andiim.orchidscan.app.data.model.Plant +import com.github.andiim.plantscan.app.data.model.Plant import kotlinx.coroutines.flow.Flow interface PlantDatabase { diff --git a/app/src/main/java/com/github/andiim/plantscan/app/data/firebase/implement/AccountServiceImpl.kt b/app/src/main/java/com/github/andiim/plantscan/app/data/firebase/implement/AccountServiceImpl.kt new file mode 100644 index 00000000..38cc2fa1 --- /dev/null +++ b/app/src/main/java/com/github/andiim/plantscan/app/data/firebase/implement/AccountServiceImpl.kt @@ -0,0 +1,40 @@ +package com.github.andiim.plantscan.app.data.firebase.implement + +import com.github.andiim.plantscan.app.data.firebase.AccountService +import com.github.andiim.plantscan.app.data.model.User +import javax.inject.Inject +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flowOf + +class AccountServiceImpl @Inject constructor() : AccountService { + override val currentUserId: String + get() = "1" + override val hasUser: Boolean + get() = true + override val currentUser: Flow + get() = flowOf(User(id = "1", isAnonymous = true)) + + override suspend fun authenticate(email: String, password: String) { + TODO("Not yet implemented") + } + + override suspend fun sendRecoveryEmail(email: String) { + TODO("Not yet implemented") + } + + override suspend fun createAnonymousAccount() { + TODO("Not yet implemented") + } + + override suspend fun linkAccount(email: String, password: String) { + TODO("Not yet implemented") + } + + override suspend fun deleteAccount() { + TODO("Not yet implemented") + } + + override suspend fun signOut() { + TODO("Not yet implemented") + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/plantscan/app/data/firebase/implement/ConfigurationServiceImpl.kt b/app/src/main/java/com/github/andiim/plantscan/app/data/firebase/implement/ConfigurationServiceImpl.kt new file mode 100644 index 00000000..4e41ac54 --- /dev/null +++ b/app/src/main/java/com/github/andiim/plantscan/app/data/firebase/implement/ConfigurationServiceImpl.kt @@ -0,0 +1,11 @@ +package com.github.andiim.plantscan.app.data.firebase.implement + +import com.github.andiim.plantscan.app.data.firebase.ConfigurationService +import javax.inject.Inject + +class ConfigurationServiceImpl @Inject constructor(): ConfigurationService { + override suspend fun fetchConfiguration(): Boolean = true + + override val isShowTaskEditButtonConfig: Boolean + get() = true +} \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/plantscan/app/data/firebase/implement/LogServiceImpl.kt b/app/src/main/java/com/github/andiim/plantscan/app/data/firebase/implement/LogServiceImpl.kt new file mode 100644 index 00000000..940ef396 --- /dev/null +++ b/app/src/main/java/com/github/andiim/plantscan/app/data/firebase/implement/LogServiceImpl.kt @@ -0,0 +1,10 @@ +package com.github.andiim.plantscan.app.data.firebase.implement + +import com.github.andiim.plantscan.app.data.firebase.LogService +import javax.inject.Inject + +class LogServiceImpl @Inject constructor(): LogService { + override fun logNonFatalCrash(throwable: Throwable) { + TODO("Not yet implemented") + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/plantscan/app/data/firebase/implement/PlantDatabaseImpl.kt b/app/src/main/java/com/github/andiim/plantscan/app/data/firebase/implement/PlantDatabaseImpl.kt new file mode 100644 index 00000000..6a702b1d --- /dev/null +++ b/app/src/main/java/com/github/andiim/plantscan/app/data/firebase/implement/PlantDatabaseImpl.kt @@ -0,0 +1,21 @@ +package com.github.andiim.plantscan.app.data.firebase.implement + +import androidx.paging.PagingData +import com.github.andiim.plantscan.app.data.firebase.PlantDatabase +import com.github.andiim.plantscan.app.data.model.Plant +import javax.inject.Inject +import kotlinx.coroutines.flow.Flow + +class PlantDatabaseImpl @Inject constructor() : PlantDatabase { + override fun getAllPlant(): Flow> { + TODO("Not yet implemented") + } + + override fun getMyPlant(): Flow> { + TODO("Not yet implemented") + } + + override fun searchPlant(query: String): Flow> { + TODO("Not yet implemented") + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/data/model/Image.kt b/app/src/main/java/com/github/andiim/plantscan/app/data/model/Image.kt similarity index 64% rename from app/src/main/java/com/github/andiim/orchidscan/app/data/model/Image.kt rename to app/src/main/java/com/github/andiim/plantscan/app/data/model/Image.kt index 1d42ca46..f1977672 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/data/model/Image.kt +++ b/app/src/main/java/com/github/andiim/plantscan/app/data/model/Image.kt @@ -1,3 +1,3 @@ -package com.github.andiim.orchidscan.app.data.model +package com.github.andiim.plantscan.app.data.model data class Image(val attribution: String = "", val file: String = "", val name: String = "") diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/data/model/Plant.kt b/app/src/main/java/com/github/andiim/plantscan/app/data/model/Plant.kt similarity index 82% rename from app/src/main/java/com/github/andiim/orchidscan/app/data/model/Plant.kt rename to app/src/main/java/com/github/andiim/plantscan/app/data/model/Plant.kt index 759d91b0..9adf9ae0 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/data/model/Plant.kt +++ b/app/src/main/java/com/github/andiim/plantscan/app/data/model/Plant.kt @@ -1,4 +1,4 @@ -package com.github.andiim.orchidscan.app.data.model +package com.github.andiim.plantscan.app.data.model data class Plant( val id: String = "", diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/data/model/PlantDetail.kt b/app/src/main/java/com/github/andiim/plantscan/app/data/model/PlantDetail.kt similarity index 66% rename from app/src/main/java/com/github/andiim/orchidscan/app/data/model/PlantDetail.kt rename to app/src/main/java/com/github/andiim/plantscan/app/data/model/PlantDetail.kt index 0b2d4ee3..a5ef6a43 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/data/model/PlantDetail.kt +++ b/app/src/main/java/com/github/andiim/plantscan/app/data/model/PlantDetail.kt @@ -1,4 +1,4 @@ -package com.github.andiim.orchidscan.app.data.model +package com.github.andiim.plantscan.app.data.model data class PlantDetail( val classification: Taxonomy? = null, diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/data/model/Taxonomy.kt b/app/src/main/java/com/github/andiim/plantscan/app/data/model/Taxonomy.kt similarity index 78% rename from app/src/main/java/com/github/andiim/orchidscan/app/data/model/Taxonomy.kt rename to app/src/main/java/com/github/andiim/plantscan/app/data/model/Taxonomy.kt index 6ca5f5b7..5a5df321 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/data/model/Taxonomy.kt +++ b/app/src/main/java/com/github/andiim/plantscan/app/data/model/Taxonomy.kt @@ -1,4 +1,4 @@ -package com.github.andiim.orchidscan.app.data.model +package com.github.andiim.plantscan.app.data.model data class Taxonomy( val id: String = "", diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/data/model/User.kt b/app/src/main/java/com/github/andiim/plantscan/app/data/model/User.kt similarity index 57% rename from app/src/main/java/com/github/andiim/orchidscan/app/data/model/User.kt rename to app/src/main/java/com/github/andiim/plantscan/app/data/model/User.kt index b313877c..26846451 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/data/model/User.kt +++ b/app/src/main/java/com/github/andiim/plantscan/app/data/model/User.kt @@ -1,3 +1,3 @@ -package com.github.andiim.orchidscan.app.data.model +package com.github.andiim.plantscan.app.data.model data class User(val id: String = "", val isAnonymous: Boolean = true) diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/di/DebugModule.kt b/app/src/main/java/com/github/andiim/plantscan/app/di/DebugModule.kt similarity index 86% rename from app/src/main/java/com/github/andiim/orchidscan/app/di/DebugModule.kt rename to app/src/main/java/com/github/andiim/plantscan/app/di/DebugModule.kt index 3fd2105f..ad9be34c 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/di/DebugModule.kt +++ b/app/src/main/java/com/github/andiim/plantscan/app/di/DebugModule.kt @@ -1,4 +1,4 @@ -package com.github.andiim.orchidscan.app.di +package com.github.andiim.plantscan.app.di import dagger.Module import dagger.Provides diff --git a/app/src/main/java/com/github/andiim/plantscan/app/di/ServiceModule.kt b/app/src/main/java/com/github/andiim/plantscan/app/di/ServiceModule.kt new file mode 100644 index 00000000..98d03b40 --- /dev/null +++ b/app/src/main/java/com/github/andiim/plantscan/app/di/ServiceModule.kt @@ -0,0 +1,30 @@ +package com.github.andiim.plantscan.app.di + +import com.github.andiim.plantscan.app.data.firebase.AccountService +import com.github.andiim.plantscan.app.data.firebase.ConfigurationService +import com.github.andiim.plantscan.app.data.firebase.LogService +import com.github.andiim.plantscan.app.data.firebase.PlantDatabase +import com.github.andiim.plantscan.app.data.firebase.implement.AccountServiceImpl +import com.github.andiim.plantscan.app.data.firebase.implement.ConfigurationServiceImpl +import com.github.andiim.plantscan.app.data.firebase.implement.LogServiceImpl +import com.github.andiim.plantscan.app.data.firebase.implement.PlantDatabaseImpl +import dagger.Binds +import dagger.Module +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent + +@Module +@InstallIn(SingletonComponent::class) +abstract class ServiceModule { + @Binds + abstract fun provideAccountService(service: AccountServiceImpl): AccountService + + @Binds + abstract fun provideLogService(service: LogServiceImpl): LogService + + @Binds + abstract fun providePlantDatabase(service: PlantDatabaseImpl): PlantDatabase + + @Binds + abstract fun provideConfigurationService(service: ConfigurationServiceImpl): ConfigurationService +} \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/di/TimberDebugTree.kt b/app/src/main/java/com/github/andiim/plantscan/app/di/TimberDebugTree.kt similarity index 93% rename from app/src/main/java/com/github/andiim/orchidscan/app/di/TimberDebugTree.kt rename to app/src/main/java/com/github/andiim/plantscan/app/di/TimberDebugTree.kt index 86ba7e32..5def13a5 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/di/TimberDebugTree.kt +++ b/app/src/main/java/com/github/andiim/plantscan/app/di/TimberDebugTree.kt @@ -1,4 +1,4 @@ -package com.github.andiim.orchidscan.app.di +package com.github.andiim.plantscan.app.di import android.annotation.SuppressLint import android.util.Log diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/BottomBarComposable.kt b/app/src/main/java/com/github/andiim/plantscan/app/ui/common/composables/BottomBarComposable.kt similarity index 87% rename from app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/BottomBarComposable.kt rename to app/src/main/java/com/github/andiim/plantscan/app/ui/common/composables/BottomBarComposable.kt index 9ae5353f..68e9c435 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/BottomBarComposable.kt +++ b/app/src/main/java/com/github/andiim/plantscan/app/ui/common/composables/BottomBarComposable.kt @@ -1,4 +1,4 @@ -package com.github.andiim.orchidscan.app.ui.common.composables +package com.github.andiim.plantscan.app.ui.common.composables import androidx.annotation.StringRes import androidx.compose.foundation.layout.RowScope @@ -12,9 +12,9 @@ import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.res.stringResource import androidx.navigation.NavDestination.Companion.hierarchy import androidx.navigation.compose.currentBackStackEntryAsState -import com.github.andiim.orchidscan.app.ui.navigation.Direction -import com.github.andiim.orchidscan.app.ui.navigation.NavigationObject -import com.github.andiim.orchidscan.app.PlantScanAppState +import com.github.andiim.plantscan.app.ui.navigation.Direction +import com.github.andiim.plantscan.app.ui.navigation.NavigationObject +import com.github.andiim.plantscan.app.PlantScanAppState @Composable fun BottomBar(state: PlantScanAppState) { diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/ButtonComposable.kt b/app/src/main/java/com/github/andiim/plantscan/app/ui/common/composables/ButtonComposable.kt similarity index 91% rename from app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/ButtonComposable.kt rename to app/src/main/java/com/github/andiim/plantscan/app/ui/common/composables/ButtonComposable.kt index 669157eb..91f29d12 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/ButtonComposable.kt +++ b/app/src/main/java/com/github/andiim/plantscan/app/ui/common/composables/ButtonComposable.kt @@ -1,4 +1,4 @@ -package com.github.andiim.orchidscan.app.ui.common.composables +package com.github.andiim.plantscan.app.ui.common.composables import android.content.res.Configuration import androidx.annotation.StringRes @@ -15,9 +15,9 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.sp -import com.github.andiim.orchidscan.app.ui.common.extensions.basicButton -import com.github.andiim.orchidscan.app.ui.theme.PlantScanTheme -import com.github.andiim.orchidscan.app.R.string as AppText +import com.github.andiim.plantscan.app.ui.common.extensions.basicButton +import com.github.andiim.plantscan.app.ui.theme.PlantScanTheme +import com.github.andiim.plantscan.app.R.string as AppText @Composable fun BasicTextButton(@StringRes text: Int, modifier: Modifier, action: () -> Unit) { diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/DropdownComposable.kt b/app/src/main/java/com/github/andiim/plantscan/app/ui/common/composables/DropdownComposable.kt similarity index 93% rename from app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/DropdownComposable.kt rename to app/src/main/java/com/github/andiim/plantscan/app/ui/common/composables/DropdownComposable.kt index 217260f2..5bb42574 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/DropdownComposable.kt +++ b/app/src/main/java/com/github/andiim/plantscan/app/ui/common/composables/DropdownComposable.kt @@ -1,4 +1,4 @@ -package com.github.andiim.orchidscan.app.ui.common.composables +package com.github.andiim.plantscan.app.ui.common.composables import android.content.res.Configuration import androidx.annotation.StringRes @@ -29,9 +29,9 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import com.github.andiim.orchidscan.app.ui.common.extensions.dropdownSelector -import com.github.andiim.orchidscan.app.ui.theme.PlantScanTheme -import com.github.andiim.orchidscan.app.R.string as AppText +import com.github.andiim.plantscan.app.ui.common.extensions.dropdownSelector +import com.github.andiim.plantscan.app.ui.theme.PlantScanTheme +import com.github.andiim.plantscan.app.R.string as AppText @Composable @OptIn(ExperimentalMaterial3Api::class) @@ -85,7 +85,8 @@ fun DropdownSelector( label = { Text(stringResource(label)) }, onValueChange = {}, trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = isExpanded) }, - colors = dropdownColors()) + colors = dropdownColors() + ) ExposedDropdownMenu(expanded = isExpanded, onDismissRequest = { isExpanded = false }) { options.forEach { selectionOption -> diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/PermissionDialogComposable.kt b/app/src/main/java/com/github/andiim/plantscan/app/ui/common/composables/PermissionDialogComposable.kt similarity index 92% rename from app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/PermissionDialogComposable.kt rename to app/src/main/java/com/github/andiim/plantscan/app/ui/common/composables/PermissionDialogComposable.kt index 9a8ec0f0..fbda9198 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/PermissionDialogComposable.kt +++ b/app/src/main/java/com/github/andiim/plantscan/app/ui/common/composables/PermissionDialogComposable.kt @@ -1,4 +1,4 @@ -package com.github.andiim.orchidscan.app.ui.common.composables +package com.github.andiim.plantscan.app.ui.common.composables import android.content.res.Configuration import androidx.compose.foundation.layout.Column @@ -24,10 +24,10 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import com.github.andiim.orchidscan.app.ui.common.extensions.alertDialog -import com.github.andiim.orchidscan.app.ui.common.extensions.textButton -import com.github.andiim.orchidscan.app.ui.theme.PlantScanTheme -import com.github.andiim.orchidscan.app.R.string as AppText +import com.github.andiim.plantscan.app.ui.common.extensions.alertDialog +import com.github.andiim.plantscan.app.ui.common.extensions.textButton +import com.github.andiim.plantscan.app.ui.theme.PlantScanTheme +import com.github.andiim.plantscan.app.R.string as AppText @OptIn(ExperimentalMaterial3Api::class) @Composable diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/PlantItem.kt b/app/src/main/java/com/github/andiim/plantscan/app/ui/common/composables/PlantItem.kt similarity index 93% rename from app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/PlantItem.kt rename to app/src/main/java/com/github/andiim/plantscan/app/ui/common/composables/PlantItem.kt index b46c8647..a3f3def5 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/PlantItem.kt +++ b/app/src/main/java/com/github/andiim/plantscan/app/ui/common/composables/PlantItem.kt @@ -1,4 +1,4 @@ -package com.github.andiim.orchidscan.app.ui.common.composables +package com.github.andiim.plantscan.app.ui.common.composables import android.content.res.Configuration import androidx.compose.foundation.clickable @@ -22,9 +22,9 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import com.github.andiim.orchidscan.app.data.model.Image -import com.github.andiim.orchidscan.app.data.model.Plant -import com.github.andiim.orchidscan.app.ui.theme.PlantScanTheme +import com.github.andiim.plantscan.app.data.model.Image +import com.github.andiim.plantscan.app.data.model.Plant +import com.github.andiim.plantscan.app.ui.theme.PlantScanTheme @Composable fun PlantItem(plant: Plant, onClick: (Plant) -> Unit = {}) { diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/PlantPagedList.kt b/app/src/main/java/com/github/andiim/plantscan/app/ui/common/composables/PlantPagedList.kt similarity index 96% rename from app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/PlantPagedList.kt rename to app/src/main/java/com/github/andiim/plantscan/app/ui/common/composables/PlantPagedList.kt index c2a2b7d0..ebe248b5 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/PlantPagedList.kt +++ b/app/src/main/java/com/github/andiim/plantscan/app/ui/common/composables/PlantPagedList.kt @@ -1,4 +1,4 @@ -package com.github.andiim.orchidscan.app.ui.common.composables +package com.github.andiim.plantscan.app.ui.common.composables import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box @@ -22,7 +22,7 @@ import androidx.paging.LoadState import androidx.paging.compose.LazyPagingItems import androidx.paging.compose.itemContentType import androidx.paging.compose.itemKey -import com.github.andiim.orchidscan.app.data.model.Plant +import com.github.andiim.plantscan.app.data.model.Plant @Composable fun PlantPagedList(plants: LazyPagingItems, onItemClick: (Plant) -> Unit) { diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/TextFieldComposable.kt b/app/src/main/java/com/github/andiim/plantscan/app/ui/common/composables/TextFieldComposable.kt similarity index 95% rename from app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/TextFieldComposable.kt rename to app/src/main/java/com/github/andiim/plantscan/app/ui/common/composables/TextFieldComposable.kt index 7ad59fce..24fe2d11 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/TextFieldComposable.kt +++ b/app/src/main/java/com/github/andiim/plantscan/app/ui/common/composables/TextFieldComposable.kt @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package com.github.andiim.orchidscan.app.ui.common.composables +package com.github.andiim.plantscan.app.ui.common.composables import android.content.res.Configuration import androidx.annotation.StringRes @@ -45,9 +45,9 @@ import androidx.compose.ui.text.input.PasswordVisualTransformation import androidx.compose.ui.text.input.VisualTransformation import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import com.github.andiim.orchidscan.app.ui.theme.PlantScanTheme -import com.github.andiim.orchidscan.app.R.drawable as AppIcon -import com.github.andiim.orchidscan.app.R.string as AppText +import com.github.andiim.plantscan.app.ui.theme.PlantScanTheme +import com.github.andiim.plantscan.app.R.drawable as AppIcon +import com.github.andiim.plantscan.app.R.string as AppText @Composable fun BasicField( diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/ToolbarComposable.kt b/app/src/main/java/com/github/andiim/plantscan/app/ui/common/composables/ToolbarComposable.kt similarity index 92% rename from app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/ToolbarComposable.kt rename to app/src/main/java/com/github/andiim/plantscan/app/ui/common/composables/ToolbarComposable.kt index b8fe19a3..fb2385b5 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/composables/ToolbarComposable.kt +++ b/app/src/main/java/com/github/andiim/plantscan/app/ui/common/composables/ToolbarComposable.kt @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package com.github.andiim.orchidscan.app.ui.common.composables +package com.github.andiim.plantscan.app.ui.common.composables import android.content.res.Configuration import androidx.annotation.DrawableRes @@ -35,9 +35,9 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview -import com.github.andiim.orchidscan.app.ui.theme.PlantScanTheme -import com.github.andiim.orchidscan.app.R.drawable as AppIcon -import com.github.andiim.orchidscan.app.R.string as AppText +import com.github.andiim.plantscan.app.ui.theme.PlantScanTheme +import com.github.andiim.plantscan.app.R.drawable as AppIcon +import com.github.andiim.plantscan.app.R.string as AppText @OptIn(ExperimentalMaterial3Api::class) @Composable diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/extensions/ModifierExtension.kt b/app/src/main/java/com/github/andiim/plantscan/app/ui/common/extensions/ModifierExtension.kt similarity index 95% rename from app/src/main/java/com/github/andiim/orchidscan/app/ui/common/extensions/ModifierExtension.kt rename to app/src/main/java/com/github/andiim/plantscan/app/ui/common/extensions/ModifierExtension.kt index 42fef268..dab2497f 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/extensions/ModifierExtension.kt +++ b/app/src/main/java/com/github/andiim/plantscan/app/ui/common/extensions/ModifierExtension.kt @@ -1,4 +1,4 @@ -package com.github.andiim.orchidscan.app.ui.common.extensions +package com.github.andiim.plantscan.app.ui.common.extensions import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/snackbar/SnackbarManager.kt b/app/src/main/java/com/github/andiim/plantscan/app/ui/common/snackbar/SnackbarManager.kt similarity index 90% rename from app/src/main/java/com/github/andiim/orchidscan/app/ui/common/snackbar/SnackbarManager.kt rename to app/src/main/java/com/github/andiim/plantscan/app/ui/common/snackbar/SnackbarManager.kt index 59a430ac..f85f8a72 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/snackbar/SnackbarManager.kt +++ b/app/src/main/java/com/github/andiim/plantscan/app/ui/common/snackbar/SnackbarManager.kt @@ -1,4 +1,4 @@ -package com.github.andiim.orchidscan.app.ui.common.snackbar +package com.github.andiim.plantscan.app.ui.common.snackbar import androidx.annotation.StringRes import kotlinx.coroutines.flow.MutableStateFlow diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/snackbar/SnackbarMessage.kt b/app/src/main/java/com/github/andiim/plantscan/app/ui/common/snackbar/SnackbarMessage.kt similarity index 88% rename from app/src/main/java/com/github/andiim/orchidscan/app/ui/common/snackbar/SnackbarMessage.kt rename to app/src/main/java/com/github/andiim/plantscan/app/ui/common/snackbar/SnackbarMessage.kt index d712229b..5be4c107 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/common/snackbar/SnackbarMessage.kt +++ b/app/src/main/java/com/github/andiim/plantscan/app/ui/common/snackbar/SnackbarMessage.kt @@ -1,8 +1,8 @@ -package com.github.andiim.orchidscan.app.ui.common.snackbar +package com.github.andiim.plantscan.app.ui.common.snackbar import android.content.res.Resources import androidx.annotation.StringRes -import com.github.andiim.orchidscan.app.R +import com.github.andiim.plantscan.app.R sealed class SnackbarMessage { class StringSnackbar(val message: String) : SnackbarMessage() diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/navigation/Direction.kt b/app/src/main/java/com/github/andiim/plantscan/app/ui/navigation/Direction.kt similarity index 86% rename from app/src/main/java/com/github/andiim/orchidscan/app/ui/navigation/Direction.kt rename to app/src/main/java/com/github/andiim/plantscan/app/ui/navigation/Direction.kt index 0937f012..b0ebd04f 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/navigation/Direction.kt +++ b/app/src/main/java/com/github/andiim/plantscan/app/ui/navigation/Direction.kt @@ -1,6 +1,6 @@ -package com.github.andiim.orchidscan.app.ui.navigation +package com.github.andiim.plantscan.app.ui.navigation -import com.github.andiim.orchidscan.app.data.model.Plant +import com.github.andiim.plantscan.app.data.model.Plant sealed class Direction(val route: String) { object MainNav : Direction("main_navigation") diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/navigation/Navigation.kt b/app/src/main/java/com/github/andiim/plantscan/app/ui/navigation/Navigation.kt similarity index 80% rename from app/src/main/java/com/github/andiim/orchidscan/app/ui/navigation/Navigation.kt rename to app/src/main/java/com/github/andiim/plantscan/app/ui/navigation/Navigation.kt index bb63f58a..55e80d0c 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/navigation/Navigation.kt +++ b/app/src/main/java/com/github/andiim/plantscan/app/ui/navigation/Navigation.kt @@ -1,4 +1,4 @@ -package com.github.andiim.orchidscan.app.ui.navigation +package com.github.andiim.plantscan.app.ui.navigation import androidx.compose.runtime.Composable import androidx.compose.runtime.remember @@ -10,23 +10,23 @@ import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.navArgument import androidx.navigation.navigation -import com.github.andiim.orchidscan.app.PlantScanAppState -import com.github.andiim.orchidscan.app.ui.screens.auth.login.LoginScreen -import com.github.andiim.orchidscan.app.ui.screens.auth.login.LoginViewModel -import com.github.andiim.orchidscan.app.ui.screens.auth.signUp.SignUpScreen -import com.github.andiim.orchidscan.app.ui.screens.auth.signUp.SignUpViewModel -import com.github.andiim.orchidscan.app.ui.screens.detail.DetailScreen -import com.github.andiim.orchidscan.app.ui.screens.detail.DetailViewModel -import com.github.andiim.orchidscan.app.ui.screens.home.findPlant.FindPlantElement -import com.github.andiim.orchidscan.app.ui.screens.home.findPlant.FindPlantViewModel -import com.github.andiim.orchidscan.app.ui.screens.home.myGarden.MyGardenElement -import com.github.andiim.orchidscan.app.ui.screens.home.myGarden.MyGardenViewModel -import com.github.andiim.orchidscan.app.ui.screens.home.settings.SettingsElement -import com.github.andiim.orchidscan.app.ui.screens.home.settings.SettingsViewModel -import com.github.andiim.orchidscan.app.ui.screens.list.PlantListScreen -import com.github.andiim.orchidscan.app.ui.screens.list.PlantListViewModel -import com.github.andiim.orchidscan.app.ui.screens.splash.SplashScreen -import com.github.andiim.orchidscan.app.ui.screens.web.WebScreen +import com.github.andiim.plantscan.app.PlantScanAppState +import com.github.andiim.plantscan.app.ui.screens.auth.login.LoginScreen +import com.github.andiim.plantscan.app.ui.screens.auth.login.LoginViewModel +import com.github.andiim.plantscan.app.ui.screens.auth.signUp.SignUpScreen +import com.github.andiim.plantscan.app.ui.screens.auth.signUp.SignUpViewModel +import com.github.andiim.plantscan.app.ui.screens.detail.DetailScreen +import com.github.andiim.plantscan.app.ui.screens.detail.DetailViewModel +import com.github.andiim.plantscan.app.ui.screens.home.findPlant.FindPlantElement +import com.github.andiim.plantscan.app.ui.screens.home.findPlant.FindPlantViewModel +import com.github.andiim.plantscan.app.ui.screens.home.myGarden.MyGardenElement +import com.github.andiim.plantscan.app.ui.screens.home.myGarden.MyGardenViewModel +import com.github.andiim.plantscan.app.ui.screens.home.settings.SettingsElement +import com.github.andiim.plantscan.app.ui.screens.home.settings.SettingsViewModel +import com.github.andiim.plantscan.app.ui.screens.list.PlantListScreen +import com.github.andiim.plantscan.app.ui.screens.list.PlantListViewModel +import com.github.andiim.plantscan.app.ui.screens.splash.SplashScreen +import com.github.andiim.plantscan.app.ui.screens.web.WebScreen @Composable fun SetupRootNavGraph(appState: PlantScanAppState, modifier: Modifier = Modifier) { diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/navigation/NavigationItem.kt b/app/src/main/java/com/github/andiim/plantscan/app/ui/navigation/NavigationItem.kt similarity index 78% rename from app/src/main/java/com/github/andiim/orchidscan/app/ui/navigation/NavigationItem.kt rename to app/src/main/java/com/github/andiim/plantscan/app/ui/navigation/NavigationItem.kt index 556567e7..67a4b078 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/navigation/NavigationItem.kt +++ b/app/src/main/java/com/github/andiim/plantscan/app/ui/navigation/NavigationItem.kt @@ -1,4 +1,4 @@ -package com.github.andiim.orchidscan.app.ui.navigation +package com.github.andiim.plantscan.app.ui.navigation import androidx.annotation.StringRes import androidx.compose.ui.graphics.vector.ImageVector diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/navigation/NavigationObject.kt b/app/src/main/java/com/github/andiim/plantscan/app/ui/navigation/NavigationObject.kt similarity index 88% rename from app/src/main/java/com/github/andiim/orchidscan/app/ui/navigation/NavigationObject.kt rename to app/src/main/java/com/github/andiim/plantscan/app/ui/navigation/NavigationObject.kt index 15f1725e..e95e6756 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/navigation/NavigationObject.kt +++ b/app/src/main/java/com/github/andiim/plantscan/app/ui/navigation/NavigationObject.kt @@ -1,10 +1,10 @@ -package com.github.andiim.orchidscan.app.ui.navigation +package com.github.andiim.plantscan.app.ui.navigation import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.List import androidx.compose.material.icons.filled.Search import androidx.compose.material.icons.outlined.LocalFlorist -import com.github.andiim.orchidscan.app.R.string as AppText +import com.github.andiim.plantscan.app.R.string as AppText object NavigationObject { val bottomNavItems = diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/login/LoginScreen.kt b/app/src/main/java/com/github/andiim/plantscan/app/ui/screens/auth/login/LoginScreen.kt similarity index 87% rename from app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/login/LoginScreen.kt rename to app/src/main/java/com/github/andiim/plantscan/app/ui/screens/auth/login/LoginScreen.kt index 2c376c22..8f4056da 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/login/LoginScreen.kt +++ b/app/src/main/java/com/github/andiim/plantscan/app/ui/screens/auth/login/LoginScreen.kt @@ -1,4 +1,4 @@ -package com.github.andiim.orchidscan.app.ui.screens.auth.login +package com.github.andiim.plantscan.app.ui.screens.auth.login import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box @@ -26,15 +26,15 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.hilt.navigation.compose.hiltViewModel -import com.github.andiim.orchidscan.app.R -import com.github.andiim.orchidscan.app.ui.common.composables.BasicButton -import com.github.andiim.orchidscan.app.ui.common.composables.BasicTextButton -import com.github.andiim.orchidscan.app.ui.common.composables.EmailField -import com.github.andiim.orchidscan.app.ui.common.composables.PasswordField -import com.github.andiim.orchidscan.app.ui.common.extensions.basicButton -import com.github.andiim.orchidscan.app.ui.common.extensions.fieldModifier -import com.github.andiim.orchidscan.app.ui.common.extensions.textButton -import com.github.andiim.orchidscan.app.ui.theme.PlantScanTheme +import com.github.andiim.plantscan.app.R +import com.github.andiim.plantscan.app.ui.common.composables.BasicButton +import com.github.andiim.plantscan.app.ui.common.composables.BasicTextButton +import com.github.andiim.plantscan.app.ui.common.composables.EmailField +import com.github.andiim.plantscan.app.ui.common.composables.PasswordField +import com.github.andiim.plantscan.app.ui.common.extensions.basicButton +import com.github.andiim.plantscan.app.ui.common.extensions.fieldModifier +import com.github.andiim.plantscan.app.ui.common.extensions.textButton +import com.github.andiim.plantscan.app.ui.theme.PlantScanTheme @Composable fun LoginScreen( diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/login/LoginState.kt b/app/src/main/java/com/github/andiim/plantscan/app/ui/screens/auth/login/LoginState.kt similarity index 53% rename from app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/login/LoginState.kt rename to app/src/main/java/com/github/andiim/plantscan/app/ui/screens/auth/login/LoginState.kt index b9452ec5..2323f20d 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/login/LoginState.kt +++ b/app/src/main/java/com/github/andiim/plantscan/app/ui/screens/auth/login/LoginState.kt @@ -1,3 +1,3 @@ -package com.github.andiim.orchidscan.app.ui.screens.auth.login +package com.github.andiim.plantscan.app.ui.screens.auth.login data class LoginState(val email: String = "", val password: String = "") \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/login/LoginViewModel.kt b/app/src/main/java/com/github/andiim/plantscan/app/ui/screens/auth/login/LoginViewModel.kt similarity index 74% rename from app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/login/LoginViewModel.kt rename to app/src/main/java/com/github/andiim/plantscan/app/ui/screens/auth/login/LoginViewModel.kt index 5033e586..38e43734 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/login/LoginViewModel.kt +++ b/app/src/main/java/com/github/andiim/plantscan/app/ui/screens/auth/login/LoginViewModel.kt @@ -1,12 +1,12 @@ -package com.github.andiim.orchidscan.app.ui.screens.auth.login - -import com.github.andiim.orchidscan.app.R -import com.github.andiim.orchidscan.app.data.firebase.AccountService -import com.github.andiim.orchidscan.app.data.firebase.LogService -import com.github.andiim.orchidscan.app.ui.common.snackbar.SnackbarManager -import com.github.andiim.orchidscan.app.ui.navigation.Direction -import com.github.andiim.orchidscan.app.ui.screens.viewModels.PlantScanViewModel -import com.github.andiim.orchidscan.library.android.extensions.isValidEmail +package com.github.andiim.plantscan.app.ui.screens.auth.login + +import com.github.andiim.plantscan.app.R +import com.github.andiim.plantscan.app.data.firebase.AccountService +import com.github.andiim.plantscan.app.data.firebase.LogService +import com.github.andiim.plantscan.app.ui.common.snackbar.SnackbarManager +import com.github.andiim.plantscan.app.ui.navigation.Direction +import com.github.andiim.plantscan.app.ui.screens.viewModels.PlantScanViewModel +import com.github.andiim.plantscan.library.android.extensions.isValidEmail import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject import kotlinx.coroutines.flow.MutableStateFlow diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/signUp/SignUpScreen.kt b/app/src/main/java/com/github/andiim/plantscan/app/ui/screens/auth/signUp/SignUpScreen.kt similarity index 76% rename from app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/signUp/SignUpScreen.kt rename to app/src/main/java/com/github/andiim/plantscan/app/ui/screens/auth/signUp/SignUpScreen.kt index 535d234f..321fb467 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/signUp/SignUpScreen.kt +++ b/app/src/main/java/com/github/andiim/plantscan/app/ui/screens/auth/signUp/SignUpScreen.kt @@ -1,4 +1,4 @@ -package com.github.andiim.orchidscan.app.ui.screens.auth.signUp +package com.github.andiim.plantscan.app.ui.screens.auth.signUp import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column @@ -14,15 +14,15 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview import androidx.hilt.navigation.compose.hiltViewModel -import com.github.andiim.orchidscan.app.R -import com.github.andiim.orchidscan.app.ui.common.composables.BasicButton -import com.github.andiim.orchidscan.app.ui.common.composables.BasicToolbar -import com.github.andiim.orchidscan.app.ui.common.composables.EmailField -import com.github.andiim.orchidscan.app.ui.common.composables.PasswordField -import com.github.andiim.orchidscan.app.ui.common.composables.RepeatPasswordField -import com.github.andiim.orchidscan.app.ui.common.extensions.basicButton -import com.github.andiim.orchidscan.app.ui.common.extensions.fieldModifier -import com.github.andiim.orchidscan.app.ui.theme.PlantScanTheme +import com.github.andiim.plantscan.app.R +import com.github.andiim.plantscan.app.ui.common.composables.BasicButton +import com.github.andiim.plantscan.app.ui.common.composables.BasicToolbar +import com.github.andiim.plantscan.app.ui.common.composables.EmailField +import com.github.andiim.plantscan.app.ui.common.composables.PasswordField +import com.github.andiim.plantscan.app.ui.common.composables.RepeatPasswordField +import com.github.andiim.plantscan.app.ui.common.extensions.basicButton +import com.github.andiim.plantscan.app.ui.common.extensions.fieldModifier +import com.github.andiim.plantscan.app.ui.theme.PlantScanTheme @Composable fun SignUpScreen( diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/signUp/SignUpState.kt b/app/src/main/java/com/github/andiim/plantscan/app/ui/screens/auth/signUp/SignUpState.kt similarity index 65% rename from app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/signUp/SignUpState.kt rename to app/src/main/java/com/github/andiim/plantscan/app/ui/screens/auth/signUp/SignUpState.kt index a95dfe55..c225ca51 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/signUp/SignUpState.kt +++ b/app/src/main/java/com/github/andiim/plantscan/app/ui/screens/auth/signUp/SignUpState.kt @@ -1,4 +1,4 @@ -package com.github.andiim.orchidscan.app.ui.screens.auth.signUp +package com.github.andiim.plantscan.app.ui.screens.auth.signUp data class SignUpState( val email: String = "", diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/signUp/SignUpViewModel.kt b/app/src/main/java/com/github/andiim/plantscan/app/ui/screens/auth/signUp/SignUpViewModel.kt similarity index 70% rename from app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/signUp/SignUpViewModel.kt rename to app/src/main/java/com/github/andiim/plantscan/app/ui/screens/auth/signUp/SignUpViewModel.kt index 3d5d40e3..3df5b16d 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/auth/signUp/SignUpViewModel.kt +++ b/app/src/main/java/com/github/andiim/plantscan/app/ui/screens/auth/signUp/SignUpViewModel.kt @@ -1,13 +1,13 @@ -package com.github.andiim.orchidscan.app.ui.screens.auth.signUp - -import com.github.andiim.orchidscan.app.R -import com.github.andiim.orchidscan.app.data.firebase.AccountService -import com.github.andiim.orchidscan.app.data.firebase.LogService -import com.github.andiim.orchidscan.app.ui.common.snackbar.SnackbarManager -import com.github.andiim.orchidscan.app.ui.screens.viewModels.PlantScanViewModel -import com.github.andiim.orchidscan.library.android.extensions.isValidEmail -import com.github.andiim.orchidscan.library.android.extensions.isValidPassword -import com.github.andiim.orchidscan.library.android.extensions.passwordMatches +package com.github.andiim.plantscan.app.ui.screens.auth.signUp + +import com.github.andiim.plantscan.app.R +import com.github.andiim.plantscan.app.data.firebase.AccountService +import com.github.andiim.plantscan.app.data.firebase.LogService +import com.github.andiim.plantscan.app.ui.common.snackbar.SnackbarManager +import com.github.andiim.plantscan.app.ui.screens.viewModels.PlantScanViewModel +import com.github.andiim.plantscan.library.android.extensions.isValidEmail +import com.github.andiim.plantscan.library.android.extensions.isValidPassword +import com.github.andiim.plantscan.library.android.extensions.passwordMatches import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject import kotlinx.coroutines.flow.MutableStateFlow diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/detail/DetailScreen.kt b/app/src/main/java/com/github/andiim/plantscan/app/ui/screens/detail/DetailScreen.kt similarity index 81% rename from app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/detail/DetailScreen.kt rename to app/src/main/java/com/github/andiim/plantscan/app/ui/screens/detail/DetailScreen.kt index fd05cf11..c21ad555 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/detail/DetailScreen.kt +++ b/app/src/main/java/com/github/andiim/plantscan/app/ui/screens/detail/DetailScreen.kt @@ -1,10 +1,10 @@ -package com.github.andiim.orchidscan.app.ui.screens.detail +package com.github.andiim.plantscan.app.ui.screens.detail import androidx.compose.material3.Surface import androidx.compose.runtime.Composable import androidx.compose.ui.tooling.preview.Preview import androidx.hilt.navigation.compose.hiltViewModel -import com.github.andiim.orchidscan.app.ui.theme.PlantScanTheme +import com.github.andiim.plantscan.app.ui.theme.PlantScanTheme @Composable fun DetailScreen( diff --git a/app/src/main/java/com/github/andiim/plantscan/app/ui/screens/detail/DetailViewModel.kt b/app/src/main/java/com/github/andiim/plantscan/app/ui/screens/detail/DetailViewModel.kt new file mode 100644 index 00000000..885d0d8d --- /dev/null +++ b/app/src/main/java/com/github/andiim/plantscan/app/ui/screens/detail/DetailViewModel.kt @@ -0,0 +1,12 @@ +package com.github.andiim.plantscan.app.ui.screens.detail + +import com.github.andiim.plantscan.app.data.firebase.LogService +import com.github.andiim.plantscan.app.ui.screens.viewModels.PlantScanViewModel +import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject + +@HiltViewModel +class DetailViewModel @Inject +constructor(logService: LogService) : PlantScanViewModel(logService) { + +} \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/detect/DetectScreen.kt b/app/src/main/java/com/github/andiim/plantscan/app/ui/screens/detect/DetectScreen.kt similarity index 80% rename from app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/detect/DetectScreen.kt rename to app/src/main/java/com/github/andiim/plantscan/app/ui/screens/detect/DetectScreen.kt index 8d4909d5..4e15a8d9 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/detect/DetectScreen.kt +++ b/app/src/main/java/com/github/andiim/plantscan/app/ui/screens/detect/DetectScreen.kt @@ -1,10 +1,10 @@ -package com.github.andiim.orchidscan.app.ui.screens.detect +package com.github.andiim.plantscan.app.ui.screens.detect import androidx.compose.material3.Surface import androidx.compose.runtime.Composable import androidx.compose.ui.tooling.preview.Preview import androidx.hilt.navigation.compose.hiltViewModel -import com.github.andiim.orchidscan.app.ui.theme.PlantScanTheme +import com.github.andiim.plantscan.app.ui.theme.PlantScanTheme @Composable fun DetectScreen( diff --git a/app/src/main/java/com/github/andiim/plantscan/app/ui/screens/detect/DetectViewModel.kt b/app/src/main/java/com/github/andiim/plantscan/app/ui/screens/detect/DetectViewModel.kt new file mode 100644 index 00000000..348d80f5 --- /dev/null +++ b/app/src/main/java/com/github/andiim/plantscan/app/ui/screens/detect/DetectViewModel.kt @@ -0,0 +1,12 @@ +package com.github.andiim.plantscan.app.ui.screens.detect + +import com.github.andiim.plantscan.app.data.firebase.LogService +import com.github.andiim.plantscan.app.ui.screens.viewModels.PlantScanViewModel +import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject + +@HiltViewModel +class DetectViewModel @Inject constructor(logService: LogService) : + PlantScanViewModel(logService) { + +} \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/findPlant/FindPlantElement.kt b/app/src/main/java/com/github/andiim/plantscan/app/ui/screens/home/findPlant/FindPlantElement.kt similarity index 93% rename from app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/findPlant/FindPlantElement.kt rename to app/src/main/java/com/github/andiim/plantscan/app/ui/screens/home/findPlant/FindPlantElement.kt index b5a241d4..63face96 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/findPlant/FindPlantElement.kt +++ b/app/src/main/java/com/github/andiim/plantscan/app/ui/screens/home/findPlant/FindPlantElement.kt @@ -1,4 +1,4 @@ -package com.github.andiim.orchidscan.app.ui.screens.home.findPlant +package com.github.andiim.plantscan.app.ui.screens.home.findPlant import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box @@ -35,12 +35,12 @@ import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.paging.PagingData import androidx.paging.compose.collectAsLazyPagingItems -import com.github.andiim.orchidscan.app.data.model.Plant -import com.github.andiim.orchidscan.app.ui.common.composables.PlantPagedList -import com.github.andiim.orchidscan.app.ui.theme.PlantScanTheme +import com.github.andiim.plantscan.app.data.model.Plant +import com.github.andiim.plantscan.app.ui.common.composables.PlantPagedList +import com.github.andiim.plantscan.app.ui.theme.PlantScanTheme import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flowOf -import com.github.andiim.orchidscan.app.R.string as AppText +import com.github.andiim.plantscan.app.R.string as AppText @Composable fun FindPlantElement( diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/findPlant/FindPlantViewModel.kt b/app/src/main/java/com/github/andiim/plantscan/app/ui/screens/home/findPlant/FindPlantViewModel.kt similarity index 82% rename from app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/findPlant/FindPlantViewModel.kt rename to app/src/main/java/com/github/andiim/plantscan/app/ui/screens/home/findPlant/FindPlantViewModel.kt index f7f127a9..12c6b74a 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/findPlant/FindPlantViewModel.kt +++ b/app/src/main/java/com/github/andiim/plantscan/app/ui/screens/home/findPlant/FindPlantViewModel.kt @@ -1,12 +1,12 @@ -package com.github.andiim.orchidscan.app.ui.screens.home.findPlant +package com.github.andiim.plantscan.app.ui.screens.home.findPlant import androidx.lifecycle.viewModelScope import androidx.paging.PagingData import androidx.paging.cachedIn -import com.github.andiim.orchidscan.app.data.firebase.LogService -import com.github.andiim.orchidscan.app.data.firebase.PlantDatabase -import com.github.andiim.orchidscan.app.data.model.Plant -import com.github.andiim.orchidscan.app.ui.screens.viewModels.PlantScanViewModel +import com.github.andiim.plantscan.app.data.firebase.LogService +import com.github.andiim.plantscan.app.data.firebase.PlantDatabase +import com.github.andiim.plantscan.app.data.model.Plant +import com.github.andiim.plantscan.app.ui.screens.viewModels.PlantScanViewModel import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject import kotlinx.coroutines.FlowPreview diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/myGarden/MyGardenElement.kt b/app/src/main/java/com/github/andiim/plantscan/app/ui/screens/home/myGarden/MyGardenElement.kt similarity index 77% rename from app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/myGarden/MyGardenElement.kt rename to app/src/main/java/com/github/andiim/plantscan/app/ui/screens/home/myGarden/MyGardenElement.kt index f93e2641..81f568ff 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/myGarden/MyGardenElement.kt +++ b/app/src/main/java/com/github/andiim/plantscan/app/ui/screens/home/myGarden/MyGardenElement.kt @@ -1,4 +1,4 @@ -package com.github.andiim.orchidscan.app.ui.screens.home.myGarden +package com.github.andiim.plantscan.app.ui.screens.home.myGarden import androidx.compose.material3.Surface import androidx.compose.runtime.Composable @@ -6,9 +6,9 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.hilt.navigation.compose.hiltViewModel import androidx.paging.PagingData import androidx.paging.compose.collectAsLazyPagingItems -import com.github.andiim.orchidscan.app.data.model.Plant -import com.github.andiim.orchidscan.app.ui.common.composables.PlantPagedList -import com.github.andiim.orchidscan.app.ui.theme.PlantScanTheme +import com.github.andiim.plantscan.app.data.model.Plant +import com.github.andiim.plantscan.app.ui.common.composables.PlantPagedList +import com.github.andiim.plantscan.app.ui.theme.PlantScanTheme import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flowOf diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/myGarden/MyGardenViewModel.kt b/app/src/main/java/com/github/andiim/plantscan/app/ui/screens/home/myGarden/MyGardenViewModel.kt similarity index 57% rename from app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/myGarden/MyGardenViewModel.kt rename to app/src/main/java/com/github/andiim/plantscan/app/ui/screens/home/myGarden/MyGardenViewModel.kt index 753ec5bc..9817bb50 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/myGarden/MyGardenViewModel.kt +++ b/app/src/main/java/com/github/andiim/plantscan/app/ui/screens/home/myGarden/MyGardenViewModel.kt @@ -1,10 +1,10 @@ -package com.github.andiim.orchidscan.app.ui.screens.home.myGarden +package com.github.andiim.plantscan.app.ui.screens.home.myGarden import androidx.lifecycle.viewModelScope import androidx.paging.cachedIn -import com.github.andiim.orchidscan.app.data.firebase.LogService -import com.github.andiim.orchidscan.app.data.firebase.PlantDatabase -import com.github.andiim.orchidscan.app.ui.screens.viewModels.PlantScanViewModel +import com.github.andiim.plantscan.app.data.firebase.LogService +import com.github.andiim.plantscan.app.data.firebase.PlantDatabase +import com.github.andiim.plantscan.app.ui.screens.viewModels.PlantScanViewModel import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/settings/SettingsElement.kt b/app/src/main/java/com/github/andiim/plantscan/app/ui/screens/home/settings/SettingsElement.kt similarity index 86% rename from app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/settings/SettingsElement.kt rename to app/src/main/java/com/github/andiim/plantscan/app/ui/screens/home/settings/SettingsElement.kt index 085b8528..7b21a7b0 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/settings/SettingsElement.kt +++ b/app/src/main/java/com/github/andiim/plantscan/app/ui/screens/home/settings/SettingsElement.kt @@ -1,4 +1,4 @@ -package com.github.andiim.orchidscan.app.ui.screens.home.settings +package com.github.andiim.plantscan.app.ui.screens.home.settings import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer @@ -20,15 +20,15 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.hilt.navigation.compose.hiltViewModel -import com.github.andiim.orchidscan.app.R -import com.github.andiim.orchidscan.app.ui.common.composables.BasicToolbar -import com.github.andiim.orchidscan.app.ui.common.composables.DangerousCardEditor -import com.github.andiim.orchidscan.app.ui.common.composables.DialogCancelButton -import com.github.andiim.orchidscan.app.ui.common.composables.DialogConfirmButton -import com.github.andiim.orchidscan.app.ui.common.composables.RegularCardEditor -import com.github.andiim.orchidscan.app.ui.common.extensions.card -import com.github.andiim.orchidscan.app.ui.common.extensions.spacer -import com.github.andiim.orchidscan.app.ui.theme.PlantScanTheme +import com.github.andiim.plantscan.app.R +import com.github.andiim.plantscan.app.ui.common.composables.BasicToolbar +import com.github.andiim.plantscan.app.ui.common.composables.DangerousCardEditor +import com.github.andiim.plantscan.app.ui.common.composables.DialogCancelButton +import com.github.andiim.plantscan.app.ui.common.composables.DialogConfirmButton +import com.github.andiim.plantscan.app.ui.common.composables.RegularCardEditor +import com.github.andiim.plantscan.app.ui.common.extensions.card +import com.github.andiim.plantscan.app.ui.common.extensions.spacer +import com.github.andiim.plantscan.app.ui.theme.PlantScanTheme @Composable fun SettingsElement( diff --git a/app/src/main/java/com/github/andiim/plantscan/app/ui/screens/home/settings/SettingsUiState.kt b/app/src/main/java/com/github/andiim/plantscan/app/ui/screens/home/settings/SettingsUiState.kt new file mode 100644 index 00000000..0218783e --- /dev/null +++ b/app/src/main/java/com/github/andiim/plantscan/app/ui/screens/home/settings/SettingsUiState.kt @@ -0,0 +1,3 @@ +package com.github.andiim.plantscan.app.ui.screens.home.settings + +class SettingsUiState(val isAnonymousAccount: Boolean = true) \ No newline at end of file diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/settings/SettingsViewModel.kt b/app/src/main/java/com/github/andiim/plantscan/app/ui/screens/home/settings/SettingsViewModel.kt similarity index 73% rename from app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/settings/SettingsViewModel.kt rename to app/src/main/java/com/github/andiim/plantscan/app/ui/screens/home/settings/SettingsViewModel.kt index addc31ee..5ea7b491 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/home/settings/SettingsViewModel.kt +++ b/app/src/main/java/com/github/andiim/plantscan/app/ui/screens/home/settings/SettingsViewModel.kt @@ -1,9 +1,9 @@ -package com.github.andiim.orchidscan.app.ui.screens.home.settings +package com.github.andiim.plantscan.app.ui.screens.home.settings -import com.github.andiim.orchidscan.app.data.firebase.AccountService -import com.github.andiim.orchidscan.app.data.firebase.LogService -import com.github.andiim.orchidscan.app.ui.navigation.Direction -import com.github.andiim.orchidscan.app.ui.screens.viewModels.PlantScanViewModel +import com.github.andiim.plantscan.app.data.firebase.AccountService +import com.github.andiim.plantscan.app.data.firebase.LogService +import com.github.andiim.plantscan.app.ui.navigation.Direction +import com.github.andiim.plantscan.app.ui.screens.viewModels.PlantScanViewModel import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject import kotlinx.coroutines.flow.map diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/list/PlantListScreen.kt b/app/src/main/java/com/github/andiim/plantscan/app/ui/screens/list/PlantListScreen.kt similarity index 80% rename from app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/list/PlantListScreen.kt rename to app/src/main/java/com/github/andiim/plantscan/app/ui/screens/list/PlantListScreen.kt index e64deb1e..b505146a 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/list/PlantListScreen.kt +++ b/app/src/main/java/com/github/andiim/plantscan/app/ui/screens/list/PlantListScreen.kt @@ -1,4 +1,4 @@ -package com.github.andiim.orchidscan.app.ui.screens.list +package com.github.andiim.plantscan.app.ui.screens.list import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.ArrowBack @@ -11,13 +11,13 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.hilt.navigation.compose.hiltViewModel import androidx.paging.PagingData import androidx.paging.compose.collectAsLazyPagingItems -import com.github.andiim.orchidscan.app.data.model.Plant -import com.github.andiim.orchidscan.app.ui.common.composables.BasicToolbar -import com.github.andiim.orchidscan.app.ui.common.composables.PlantPagedList -import com.github.andiim.orchidscan.app.ui.theme.PlantScanTheme +import com.github.andiim.plantscan.app.data.model.Plant +import com.github.andiim.plantscan.app.ui.common.composables.BasicToolbar +import com.github.andiim.plantscan.app.ui.common.composables.PlantPagedList +import com.github.andiim.plantscan.app.ui.theme.PlantScanTheme import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flowOf -import com.github.andiim.orchidscan.app.R.string as AppText +import com.github.andiim.plantscan.app.R.string as AppText @Composable fun PlantListScreen( diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/list/PlantListViewModel.kt b/app/src/main/java/com/github/andiim/plantscan/app/ui/screens/list/PlantListViewModel.kt similarity index 58% rename from app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/list/PlantListViewModel.kt rename to app/src/main/java/com/github/andiim/plantscan/app/ui/screens/list/PlantListViewModel.kt index 261281fd..7e4f8b23 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/list/PlantListViewModel.kt +++ b/app/src/main/java/com/github/andiim/plantscan/app/ui/screens/list/PlantListViewModel.kt @@ -1,10 +1,10 @@ -package com.github.andiim.orchidscan.app.ui.screens.list +package com.github.andiim.plantscan.app.ui.screens.list import androidx.lifecycle.viewModelScope import androidx.paging.cachedIn -import com.github.andiim.orchidscan.app.data.firebase.LogService -import com.github.andiim.orchidscan.app.data.firebase.PlantDatabase -import com.github.andiim.orchidscan.app.ui.screens.viewModels.PlantScanViewModel +import com.github.andiim.plantscan.app.data.firebase.LogService +import com.github.andiim.plantscan.app.data.firebase.PlantDatabase +import com.github.andiim.plantscan.app.ui.screens.viewModels.PlantScanViewModel import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/splash/SplashScreen.kt b/app/src/main/java/com/github/andiim/plantscan/app/ui/screens/splash/SplashScreen.kt similarity index 89% rename from app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/splash/SplashScreen.kt rename to app/src/main/java/com/github/andiim/plantscan/app/ui/screens/splash/SplashScreen.kt index 661c2949..5acfcfba 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/splash/SplashScreen.kt +++ b/app/src/main/java/com/github/andiim/plantscan/app/ui/screens/splash/SplashScreen.kt @@ -1,4 +1,4 @@ -package com.github.andiim.orchidscan.app.ui.screens.splash +package com.github.andiim.plantscan.app.ui.screens.splash import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement @@ -18,10 +18,10 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.hilt.navigation.compose.hiltViewModel -import com.github.andiim.orchidscan.app.R -import com.github.andiim.orchidscan.app.ui.common.composables.BasicButton -import com.github.andiim.orchidscan.app.ui.common.extensions.basicButton -import com.github.andiim.orchidscan.app.ui.theme.PlantScanTheme +import com.github.andiim.plantscan.app.R +import com.github.andiim.plantscan.app.ui.common.composables.BasicButton +import com.github.andiim.plantscan.app.ui.common.extensions.basicButton +import com.github.andiim.plantscan.app.ui.theme.PlantScanTheme import kotlinx.coroutines.delay private const val SPLASH_TIMEOUT = 1000L diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/splash/SplashViewModel.kt b/app/src/main/java/com/github/andiim/plantscan/app/ui/screens/splash/SplashViewModel.kt similarity index 73% rename from app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/splash/SplashViewModel.kt rename to app/src/main/java/com/github/andiim/plantscan/app/ui/screens/splash/SplashViewModel.kt index c83a2ffc..494679d3 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/splash/SplashViewModel.kt +++ b/app/src/main/java/com/github/andiim/plantscan/app/ui/screens/splash/SplashViewModel.kt @@ -1,11 +1,11 @@ -package com.github.andiim.orchidscan.app.ui.screens.splash +package com.github.andiim.plantscan.app.ui.screens.splash import androidx.compose.runtime.mutableStateOf -import com.github.andiim.orchidscan.app.data.firebase.AccountService -import com.github.andiim.orchidscan.app.data.firebase.ConfigurationService -import com.github.andiim.orchidscan.app.data.firebase.LogService -import com.github.andiim.orchidscan.app.ui.navigation.Direction -import com.github.andiim.orchidscan.app.ui.screens.viewModels.PlantScanViewModel +import com.github.andiim.plantscan.app.data.firebase.AccountService +import com.github.andiim.plantscan.app.data.firebase.ConfigurationService +import com.github.andiim.plantscan.app.data.firebase.LogService +import com.github.andiim.plantscan.app.ui.navigation.Direction +import com.github.andiim.plantscan.app.ui.screens.viewModels.PlantScanViewModel import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/PlantScanViewModel.kt b/app/src/main/java/com/github/andiim/plantscan/app/ui/screens/viewModels/PlantScanViewModel.kt similarity index 68% rename from app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/PlantScanViewModel.kt rename to app/src/main/java/com/github/andiim/plantscan/app/ui/screens/viewModels/PlantScanViewModel.kt index 9139586d..caec403f 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/viewModels/PlantScanViewModel.kt +++ b/app/src/main/java/com/github/andiim/plantscan/app/ui/screens/viewModels/PlantScanViewModel.kt @@ -1,10 +1,10 @@ -package com.github.andiim.orchidscan.app.ui.screens.viewModels +package com.github.andiim.plantscan.app.ui.screens.viewModels import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.github.andiim.orchidscan.app.data.firebase.LogService -import com.github.andiim.orchidscan.app.ui.common.snackbar.SnackbarManager -import com.github.andiim.orchidscan.app.ui.common.snackbar.SnackbarMessage.Companion.toSnackbarMessage +import com.github.andiim.plantscan.app.data.firebase.LogService +import com.github.andiim.plantscan.app.ui.common.snackbar.SnackbarManager +import com.github.andiim.plantscan.app.ui.common.snackbar.SnackbarMessage.Companion.toSnackbarMessage import kotlinx.coroutines.CoroutineExceptionHandler import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/web/WebScreen.kt b/app/src/main/java/com/github/andiim/plantscan/app/ui/screens/web/WebScreen.kt similarity index 96% rename from app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/web/WebScreen.kt rename to app/src/main/java/com/github/andiim/plantscan/app/ui/screens/web/WebScreen.kt index 28806d37..0c12a52a 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/screens/web/WebScreen.kt +++ b/app/src/main/java/com/github/andiim/plantscan/app/ui/screens/web/WebScreen.kt @@ -1,4 +1,4 @@ -package com.github.andiim.orchidscan.app.ui.screens.web +package com.github.andiim.plantscan.app.ui.screens.web import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/theme/Color.kt b/app/src/main/java/com/github/andiim/plantscan/app/ui/theme/Color.kt similarity index 98% rename from app/src/main/java/com/github/andiim/orchidscan/app/ui/theme/Color.kt rename to app/src/main/java/com/github/andiim/plantscan/app/ui/theme/Color.kt index 91837084..cc7e76e5 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/theme/Color.kt +++ b/app/src/main/java/com/github/andiim/plantscan/app/ui/theme/Color.kt @@ -1,4 +1,4 @@ -package com.github.andiim.orchidscan.app.ui.theme +package com.github.andiim.plantscan.app.ui.theme import androidx.compose.ui.graphics.Color diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/theme/Shapes.kt b/app/src/main/java/com/github/andiim/plantscan/app/ui/theme/Shapes.kt similarity index 93% rename from app/src/main/java/com/github/andiim/orchidscan/app/ui/theme/Shapes.kt rename to app/src/main/java/com/github/andiim/plantscan/app/ui/theme/Shapes.kt index 6cacc30f..9e583f58 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/theme/Shapes.kt +++ b/app/src/main/java/com/github/andiim/plantscan/app/ui/theme/Shapes.kt @@ -1,4 +1,4 @@ -package com.github.andiim.orchidscan.app.ui.theme +package com.github.andiim.plantscan.app.ui.theme import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.MaterialTheme diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/theme/Theme.kt b/app/src/main/java/com/github/andiim/plantscan/app/ui/theme/Theme.kt similarity index 98% rename from app/src/main/java/com/github/andiim/orchidscan/app/ui/theme/Theme.kt rename to app/src/main/java/com/github/andiim/plantscan/app/ui/theme/Theme.kt index 9b711a13..a8abc16e 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/theme/Theme.kt +++ b/app/src/main/java/com/github/andiim/plantscan/app/ui/theme/Theme.kt @@ -1,4 +1,4 @@ -package com.github.andiim.orchidscan.app.ui.theme +package com.github.andiim.plantscan.app.ui.theme import android.app.Activity import android.os.Build diff --git a/app/src/main/java/com/github/andiim/orchidscan/app/ui/theme/Type.kt b/app/src/main/java/com/github/andiim/plantscan/app/ui/theme/Type.kt similarity index 90% rename from app/src/main/java/com/github/andiim/orchidscan/app/ui/theme/Type.kt rename to app/src/main/java/com/github/andiim/plantscan/app/ui/theme/Type.kt index 1ec95b91..0928501f 100644 --- a/app/src/main/java/com/github/andiim/orchidscan/app/ui/theme/Type.kt +++ b/app/src/main/java/com/github/andiim/plantscan/app/ui/theme/Type.kt @@ -1,4 +1,4 @@ -package com.github.andiim.orchidscan.app.ui.theme +package com.github.andiim.plantscan.app.ui.theme import androidx.compose.material3.Typography import androidx.compose.ui.text.TextStyle diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml new file mode 100644 index 00000000..3c9fb6b7 --- /dev/null +++ b/app/src/main/res/values-night/themes.xml @@ -0,0 +1,34 @@ + + + + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 030098fe..d628e646 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -1,6 +1,67 @@ - #6200EE - #3700B3 - #03DAC5 + + + #FFAF0095 + #FFFFFFFF + #FFFFD7EE + #FF3A0030 + #FF87458A + #FFFFFFFF + #FFFFD6FB + #FF36003D + #FF456812 + #FFFFFFFF + #FFC5F08B + #FF102000 + #FFBA1A1A + #FFFFDAD6 + #FFFFFFFF + #FF410002 + #FFF9FFE8 + #FF112000 + #FFF9FFE8 + #FF112000 + #FFEFDEE6 + #FF4F444A + #FF81737A + #FFD4FF97 + #FF203600 + #FFFFADE4 + #FF000000 + #FFAF0095 + #FFD2C2CA + #FF000000 + + + #FFFFADE4 + #FF5F0050 + #FF860071 + #FFFFD7EE + #FFFAACF9 + #FF521458 + #FF6C2D70 + #FFFFD6FB + #FFAAD472 + #FF203700 + #FF304F00 + #FFC5F08B + #FFFFB4AB + #FF93000A + #FF690005 + #FFFFDAD6 + #FF112000 + #FFC6F08A + #FF112000 + #FFC6F08A + #FF4F444A + #FFD2C2CA + #FF9B8D94 + #FF112000 + #FFC6F08A + #FFAF0095 + #FF000000 + #FFFFADE4 + #FF4F444A + #FF000000 diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml deleted file mode 100644 index 5885930d..00000000 --- a/app/src/main/res/values/styles.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml new file mode 100644 index 00000000..4bda1630 --- /dev/null +++ b/app/src/main/res/values/themes.xml @@ -0,0 +1,57 @@ + + + + + + + + + +