diff --git a/androidApp/src/main/AndroidManifest.xml b/androidApp/src/main/AndroidManifest.xml index 1ee504a..523eba7 100644 --- a/androidApp/src/main/AndroidManifest.xml +++ b/androidApp/src/main/AndroidManifest.xml @@ -9,6 +9,7 @@ diff --git a/androidApp/src/main/ic_launcher-playstore.png b/androidApp/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000..4daee5a Binary files /dev/null and b/androidApp/src/main/ic_launcher-playstore.png differ diff --git a/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/app/MainApplication.kt b/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/app/MainApplication.kt index e44e617..dca0b37 100644 --- a/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/app/MainApplication.kt +++ b/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/app/MainApplication.kt @@ -1,6 +1,7 @@ package dev.haroldjose.familysharedlist.android.app import android.app.Application +import android.content.Context import dev.haroldjose.familysharedlist.android.dependencyInjection.androidModule import dev.haroldjose.familysharedlist.dataLayer.datasource.local.keyValueStorage.AndroidKeyValueStorageDataSource import dev.haroldjose.familysharedlist.dependencyInjection.modules.appModule @@ -10,6 +11,17 @@ import org.koin.core.context.startKoin class MainApplication : Application() { + init { + instance = this + } + companion object { + private var instance: MainApplication? = null + + fun applicationContext() : Context { + return instance!!.applicationContext + } + } + override fun onCreate() { super.onCreate() diff --git a/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/familyList/viewmodels/FamilyListViewModel.kt b/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/familyList/viewmodels/FamilyListViewModel.kt index 67806b3..a3a2ddd 100644 --- a/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/familyList/viewmodels/FamilyListViewModel.kt +++ b/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/familyList/viewmodels/FamilyListViewModel.kt @@ -29,7 +29,6 @@ class FamilyListViewModel( private val getOrCreateAccountFromLocalUuidUseCase: GetOrCreateAccountFromLocalUuidUseCase, private val getProductByCodeUseCase: GetProductByCodeUseCase ): ViewModel(), IFamilyListViewModel { - private var familyListModelsFull: List by mutableStateOf(arrayListOf()) override var familyListModelsGrouped: Map> by mutableStateOf(mapOf()) override var familyListModels: List by mutableStateOf(arrayListOf()) override var loading:Boolean by mutableStateOf(false) @@ -37,7 +36,11 @@ class FamilyListViewModel( override var selectedItemUuid: String = "" override var quantity: Int by mutableStateOf(1) override var tabIndex: FamilyListPageTabEnum by mutableStateOf(FamilyListPageTabEnum.PENDING) + override var openImageSelectedItem: FamilyListModel? by mutableStateOf(null) + private lateinit var accountModel: AccountModel + private var familyListModelsFull: List by mutableStateOf(arrayListOf()) + override var goToSetting: () -> Unit = {} override var goToQuickInsert: () -> Unit = {} @@ -206,6 +209,10 @@ class FamilyListViewModel( } } + override fun openImage(item: FamilyListModel) { + openImageSelectedItem = item + } + private suspend fun update(item: FamilyListModel){ loading = true updateFamilyListUseCase.execute(item = item) diff --git a/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/familyList/viewmodels/FamilyListViewModelMocked.kt b/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/familyList/viewmodels/FamilyListViewModelMocked.kt index 8845d01..bb3c2f7 100644 --- a/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/familyList/viewmodels/FamilyListViewModelMocked.kt +++ b/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/familyList/viewmodels/FamilyListViewModelMocked.kt @@ -19,6 +19,7 @@ class FamilyListViewModelMocked: ViewModel(), IFamilyListViewModel { override var selectedItemUuid: String = "" override var quantity: Int = 1 override var tabIndex: FamilyListPageTabEnum = FamilyListPageTabEnum.PRIORIZED + override var openImageSelectedItem: FamilyListModel? = Samples.FamilyList.nutella override var goToSetting: () -> Unit = {} override var goToQuickInsert: () -> Unit = {} @@ -43,4 +44,6 @@ class FamilyListViewModelMocked: ViewModel(), IFamilyListViewModel { override suspend fun updateQuantity(uuid: String, quantity: Int) {} override suspend fun updatePrice(uuid: String, price: Double) {} + + override fun openImage(item: FamilyListModel) {} } \ No newline at end of file diff --git a/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/familyList/viewmodels/IFamilyListViewModel.kt b/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/familyList/viewmodels/IFamilyListViewModel.kt index 6b53ae7..3a81019 100644 --- a/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/familyList/viewmodels/IFamilyListViewModel.kt +++ b/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/familyList/viewmodels/IFamilyListViewModel.kt @@ -12,6 +12,7 @@ interface IFamilyListViewModel { var selectedItemUuid: String var quantity: Int var tabIndex: FamilyListPageTabEnum + var openImageSelectedItem: FamilyListModel? var goToSetting: () -> Unit var goToQuickInsert: () -> Unit @@ -30,4 +31,5 @@ interface IFamilyListViewModel { suspend fun updateName(uuid: String, name: String) suspend fun updateQuantity(uuid: String, quantity: Int) suspend fun updatePrice(uuid: String, price: Double) + fun openImage(item: FamilyListModel) } \ No newline at end of file diff --git a/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/familyList/views/FamilyListPage.kt b/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/familyList/views/FamilyListPage.kt index 9395c61..f07bda7 100644 --- a/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/familyList/views/FamilyListPage.kt +++ b/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/familyList/views/FamilyListPage.kt @@ -6,10 +6,14 @@ import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.twotone.List import androidx.compose.material.icons.twotone.CheckCircle import androidx.compose.material.icons.twotone.ShoppingCart +import androidx.compose.material3.BottomSheetDefaults import androidx.compose.material3.BottomSheetScaffold import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon +import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.Scaffold +import androidx.compose.material3.SheetState +import androidx.compose.material3.SheetValue import androidx.compose.material3.Tab import androidx.compose.material3.TabRow import androidx.compose.material3.Text @@ -20,13 +24,15 @@ import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import dev.haroldjose.familysharedlist.android.app.MyApplicationTheme import dev.haroldjose.familysharedlist.android.extensions.toCurrencyFormat import dev.haroldjose.familysharedlist.android.presentationLayer.pages.familyList.viewmodels.FamilyListViewModelMocked import dev.haroldjose.familysharedlist.android.presentationLayer.pages.familyList.viewmodels.IFamilyListViewModel -import dev.haroldjose.familysharedlist.android.presentationLayer.pages.familyList.views.components.FamilyListBottomSheetContent +import dev.haroldjose.familysharedlist.android.presentationLayer.pages.familyList.views.components.FamilyListBottomSheetOpenImage +import dev.haroldjose.familysharedlist.android.presentationLayer.pages.familyList.views.components.FamilyListBottomSheetQrcode import dev.haroldjose.familysharedlist.android.presentationLayer.pages.familyList.views.components.FamilyListTabItemCompletedView import dev.haroldjose.familysharedlist.android.presentationLayer.pages.familyList.views.components.FamilyListTabItemView import dev.haroldjose.familysharedlist.android.presentationLayer.pages.familyList.views.components.FamilyListTopAppBarView @@ -37,16 +43,33 @@ import kotlinx.coroutines.launch fun FamilyListPage( viewModel: IFamilyListViewModel ) { - val bottomSheetScaffoldState = rememberBottomSheetScaffoldState() + val bottomSheetScaffoldState = rememberBottomSheetScaffoldState( + SheetState( + skipPartiallyExpanded = false, + density = LocalDensity.current, + initialValue = SheetValue.PartiallyExpanded, + confirmValueChange = { + if (it == SheetValue.Hidden || it == SheetValue.PartiallyExpanded) { + viewModel.openImageSelectedItem = null + } + true + }, + ) + ) + val coroutineScope = rememberCoroutineScope() LaunchedEffect(key1 = "FamilyListPage") { viewModel.loadData(fromNetwork = true) } + BottomSheetScaffold( scaffoldState = bottomSheetScaffoldState, sheetPeekHeight = 128.dp, - sheetContent = FamilyListBottomSheetContent(bottomSheetScaffoldState, viewModel), + sheetContent = when (viewModel.openImageSelectedItem) { + null -> FamilyListBottomSheetQrcode(bottomSheetScaffoldState, viewModel) + else -> FamilyListBottomSheetOpenImage(bottomSheetScaffoldState, viewModel) + }, content = { Scaffold( topBar = FamilyListTopAppBarView(viewModel) diff --git a/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/familyList/views/components/FamilyListBottomSheetOpenImage.kt b/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/familyList/views/components/FamilyListBottomSheetOpenImage.kt new file mode 100644 index 0000000..2ecdfce --- /dev/null +++ b/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/familyList/views/components/FamilyListBottomSheetOpenImage.kt @@ -0,0 +1,130 @@ +package dev.haroldjose.familysharedlist.android.presentationLayer.pages.familyList.views.components + +import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ColumnScope +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.requiredSize +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.twotone.List +import androidx.compose.material.icons.filled.AddCircle +import androidx.compose.material.icons.twotone.CheckCircle +import androidx.compose.material.icons.twotone.ShoppingCart +import androidx.compose.material3.BottomSheetScaffold +import androidx.compose.material3.BottomSheetScaffoldState +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.LinearProgressIndicator +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Scaffold +import androidx.compose.material3.SheetState +import androidx.compose.material3.SheetValue +import androidx.compose.material3.Tab +import androidx.compose.material3.TabRow +import androidx.compose.material3.Text +import androidx.compose.material3.rememberBottomSheetScaffoldState +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.asImageBitmap +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.input.ImeAction +import androidx.compose.ui.text.input.KeyboardCapitalization +import androidx.compose.ui.text.input.KeyboardType +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import coil.compose.SubcomposeAsyncImage +import dev.haroldjose.familysharedlist.Logger +import dev.haroldjose.familysharedlist.android.R +import dev.haroldjose.familysharedlist.android.app.MyApplicationTheme +import dev.haroldjose.familysharedlist.android.presentationLayer.pages.barcodeScanner.QrScannerScreen +import dev.haroldjose.familysharedlist.android.presentationLayer.pages.familyList.viewmodels.FamilyListViewModelMocked +import dev.haroldjose.familysharedlist.android.presentationLayer.pages.familyList.viewmodels.IFamilyListViewModel +import dev.haroldjose.familysharedlist.android.presentationLayer.pages.familyList.views.FamilyListPageTabEnum +import dev.haroldjose.familysharedlist.android.presentationLayer.pages.familyList.views.components.rowItem.ColumnRigthDefault +import dev.haroldjose.familysharedlist.domainLayer.extensions.Samples +import kotlinx.coroutines.launch + +@Composable +@OptIn(ExperimentalMaterial3Api::class) +fun FamilyListBottomSheetOpenImage( + bottomSheetScaffoldState: BottomSheetScaffoldState, + viewModel: IFamilyListViewModel +): @Composable() (ColumnScope.() -> Unit) { + val imageUrl = viewModel.openImageSelectedItem?.product?.imageUrl ?: + viewModel.openImageSelectedItem?.product?.imageFrontUrl ?: + viewModel.openImageSelectedItem?.product?.imageFrontSmallUrl ?: + "https://gamestation.com.br/wp-content/themes/game-station/images/image-not-found.png" + + LaunchedEffect(key1 = "FamilyListBottomSheetOpenImage") { + bottomSheetScaffoldState.bottomSheetState.expand() + } + + return { + Column( + horizontalAlignment = Alignment.CenterHorizontally + ) { + SubcomposeAsyncImage( + model = imageUrl, + loading = { + CircularProgressIndicator( + modifier = Modifier + .requiredSize(100.dp), + color = Color.LightGray + ) + }, + contentDescription = viewModel.openImageSelectedItem?.product?.productName, + contentScale = ContentScale.Fit, + modifier = Modifier + .fillMaxSize() + .clip(RoundedCornerShape(16.dp)) + .background(Color.White) + .border(BorderStroke(1.dp, Color.Gray), RoundedCornerShape(16.dp)) + .padding(4.dp) + ) + } + } +} + +@OptIn(ExperimentalMaterial3Api::class) +@Preview +@Composable +fun FamilyListBottomSheetOpenImage_Preview() { + val bottomSheetScaffoldState = rememberBottomSheetScaffoldState() + val viewModel = FamilyListViewModelMocked() + MyApplicationTheme { + BottomSheetScaffold( + scaffoldState = bottomSheetScaffoldState, + sheetPeekHeight = 128.dp, + sheetContent = FamilyListBottomSheetOpenImage(bottomSheetScaffoldState, viewModel), + content = { + Text("FamilyListBottomSheetOpenImage_Preview") + } + ) + } +} \ No newline at end of file diff --git a/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/familyList/views/components/FamilyListBottomSheetContent.kt b/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/familyList/views/components/FamilyListBottomSheetQrcode.kt similarity index 86% rename from androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/familyList/views/components/FamilyListBottomSheetContent.kt rename to androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/familyList/views/components/FamilyListBottomSheetQrcode.kt index f19639a..3ec42dc 100644 --- a/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/familyList/views/components/FamilyListBottomSheetContent.kt +++ b/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/familyList/views/components/FamilyListBottomSheetQrcode.kt @@ -12,26 +12,18 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.automirrored.twotone.List import androidx.compose.material.icons.filled.AddCircle -import androidx.compose.material.icons.twotone.CheckCircle -import androidx.compose.material.icons.twotone.ShoppingCart import androidx.compose.material3.BottomSheetScaffold import androidx.compose.material3.BottomSheetScaffoldState import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.OutlinedTextField -import androidx.compose.material3.Scaffold -import androidx.compose.material3.SheetState import androidx.compose.material3.SheetValue -import androidx.compose.material3.Tab -import androidx.compose.material3.TabRow import androidx.compose.material3.Text import androidx.compose.material3.rememberBottomSheetScaffoldState import androidx.compose.runtime.Composable -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -47,19 +39,19 @@ import dev.haroldjose.familysharedlist.android.app.MyApplicationTheme import dev.haroldjose.familysharedlist.android.presentationLayer.pages.barcodeScanner.QrScannerScreen import dev.haroldjose.familysharedlist.android.presentationLayer.pages.familyList.viewmodels.FamilyListViewModelMocked import dev.haroldjose.familysharedlist.android.presentationLayer.pages.familyList.viewmodels.IFamilyListViewModel -import dev.haroldjose.familysharedlist.android.presentationLayer.pages.familyList.views.FamilyListPageTabEnum -import dev.haroldjose.familysharedlist.android.presentationLayer.pages.familyList.views.components.rowItem.ColumnRigthDefault -import dev.haroldjose.familysharedlist.domainLayer.extensions.Samples import kotlinx.coroutines.launch @Composable @OptIn(ExperimentalMaterial3Api::class) -fun FamilyListBottomSheetContent( +fun FamilyListBottomSheetQrcode( bottomSheetScaffoldState: BottomSheetScaffoldState, viewModel: IFamilyListViewModel ): @Composable() (ColumnScope.() -> Unit) { val coroutineScope = rememberCoroutineScope() return { + LaunchedEffect(key1 = "FamilyListBottomSheetOpenImage") { + bottomSheetScaffoldState.bottomSheetState.partialExpand() + } Box( Modifier .fillMaxWidth() @@ -144,16 +136,16 @@ fun FamilyListBottomSheetContent( @OptIn(ExperimentalMaterial3Api::class) @Preview @Composable -fun FamilyListBottomSheetContent_Preview() { +fun FamilyListBottomSheetQrcode_Preview() { val bottomSheetScaffoldState = rememberBottomSheetScaffoldState() val viewModel = FamilyListViewModelMocked() MyApplicationTheme { BottomSheetScaffold( scaffoldState = bottomSheetScaffoldState, sheetPeekHeight = 128.dp, - sheetContent = FamilyListBottomSheetContent(bottomSheetScaffoldState, viewModel), + sheetContent = FamilyListBottomSheetQrcode(bottomSheetScaffoldState, viewModel), content = { - Text("FamilyListBottomSheetContent_Preview") + Text("FamilyListBottomSheetQrcode_Preview") } ) } diff --git a/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/familyList/views/components/rowItem/ColumnLeftDefault.kt b/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/familyList/views/components/rowItem/ColumnLeftDefault.kt index 38f18c0..042a2bb 100644 --- a/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/familyList/views/components/rowItem/ColumnLeftDefault.kt +++ b/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/familyList/views/components/rowItem/ColumnLeftDefault.kt @@ -3,6 +3,7 @@ package dev.haroldjose.familysharedlist.android.presentationLayer.pages.familyLi import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.background import androidx.compose.foundation.border +import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.height @@ -24,12 +25,16 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import coil.compose.SubcomposeAsyncImage import dev.haroldjose.familysharedlist.android.app.MyApplicationTheme +import dev.haroldjose.familysharedlist.android.presentationLayer.pages.familyList.viewmodels.FamilyListViewModel +import dev.haroldjose.familysharedlist.android.presentationLayer.pages.familyList.viewmodels.FamilyListViewModelMocked +import dev.haroldjose.familysharedlist.android.presentationLayer.pages.familyList.viewmodels.IFamilyListViewModel import dev.haroldjose.familysharedlist.domainLayer.extensions.Samples import dev.haroldjose.familysharedlist.domainLayer.models.FamilyListModel @Composable fun ColumnLeftDefault( - item: MutableState + item: MutableState, + viewModel: IFamilyListViewModel ) { Column( verticalArrangement = Arrangement.Center, @@ -41,7 +46,6 @@ fun ColumnLeftDefault( SubcomposeAsyncImage( model = item.value.product?.imageFrontSmallUrl, loading = { - //CircularProgressIndicator() LinearProgressIndicator(color = Color.LightGray) }, contentDescription = item.value.product?.productName, @@ -53,6 +57,9 @@ fun ColumnLeftDefault( .background(Color.White) .border(BorderStroke(1.dp, Color.Gray), RoundedCornerShape(16.dp)) .padding(4.dp) + .clickable { + viewModel.openImage(item.value) + } ) } } @@ -67,7 +74,8 @@ fun ColumnLeftDefault_Preview() { item.value.isPrioritized = false MyApplicationTheme { ColumnLeftDefault( - item = item + item = item, + viewModel = FamilyListViewModelMocked() ) } } diff --git a/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/familyList/views/components/rowItem/FamilyListRowItemWithProduct.kt b/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/familyList/views/components/rowItem/FamilyListRowItemWithProduct.kt index 65a1bdd..bbefe81 100644 --- a/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/familyList/views/components/rowItem/FamilyListRowItemWithProduct.kt +++ b/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/familyList/views/components/rowItem/FamilyListRowItemWithProduct.kt @@ -59,7 +59,8 @@ fun FamilyListRowItemWithProduct( else -> { ColumnLeftDefault( - itemMutable + itemMutable, + viewModel ) ColumnRigthDefault( itemMutable, diff --git a/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/navigator/views/NavigatorView.kt b/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/navigator/views/NavigatorView.kt index b6a2d67..256af96 100644 --- a/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/navigator/views/NavigatorView.kt +++ b/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/navigator/views/NavigatorView.kt @@ -43,7 +43,7 @@ fun NavigatorView( navigatorViewModel.checkIfNeedToCreateNewAccount() } - NavHost(navController = navController, startDestination = ViewRouter.QUICK_INSERT.value) { + NavHost(navController = navController, startDestination = ViewRouter.FAMILY_LIST.value) { composable(ViewRouter.FAMILY_LIST.value) { FamilyListPage(viewModel = familyListViewModel) } diff --git a/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/settings/viewmodels/ISettingsViewModel.kt b/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/settings/viewmodels/ISettingsViewModel.kt index 6f0bf1e..6cc578c 100644 --- a/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/settings/viewmodels/ISettingsViewModel.kt +++ b/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/settings/viewmodels/ISettingsViewModel.kt @@ -16,4 +16,6 @@ interface ISettingsViewModel { suspend fun shareMyCode() suspend fun openAppHomePage() + fun getVersion(): String + } \ No newline at end of file diff --git a/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/settings/viewmodels/SettingsViewModel.kt b/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/settings/viewmodels/SettingsViewModel.kt index 6c9b07c..0dd6521 100644 --- a/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/settings/viewmodels/SettingsViewModel.kt +++ b/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/settings/viewmodels/SettingsViewModel.kt @@ -1,15 +1,19 @@ package dev.haroldjose.familysharedlist.android.presentationLayer.pages.settings.viewmodels +import android.content.pm.PackageInfo +import android.content.pm.PackageManager import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue import androidx.lifecycle.ViewModel +import dev.haroldjose.familysharedlist.android.app.MainApplication import dev.haroldjose.familysharedlist.domainLayer.models.AccountModel import dev.haroldjose.familysharedlist.domainLayer.usecases.account.GetAccountUseCase import dev.haroldjose.familysharedlist.domainLayer.usecases.account.GetLocalAccountUuidUseCase import dev.haroldjose.familysharedlist.domainLayer.usecases.account.SetSharedAccountByCodeUseCase import dev.haroldjose.familysharedlist.getPlatform + class SettingsViewModel( private val getAccountUseCase: GetAccountUseCase, private val getLocalAccountUuidUseCase: GetLocalAccountUuidUseCase, @@ -62,4 +66,19 @@ class SettingsViewModel( override suspend fun openAppHomePage() { getPlatform().openUrlOnDefaultBrowser(url = "https://github.com/haroldjose30/FamilySharedList") } + + + override fun getVersion(): String { + try { + MainApplication.applicationContext().let { + val pInfo: PackageInfo = it.packageManager. getPackageInfo(it.getPackageName(), 0) + val versionName = pInfo.versionName + val longVersionCode = pInfo.longVersionCode + return "Alpha $versionName (b$longVersionCode)" + } + } catch (e: PackageManager.NameNotFoundException) { + e.printStackTrace() + return "" + } + } } \ No newline at end of file diff --git a/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/settings/viewmodels/SettingsViewModelMocked.kt b/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/settings/viewmodels/SettingsViewModelMocked.kt index a5b37a6..b5e8076 100644 --- a/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/settings/viewmodels/SettingsViewModelMocked.kt +++ b/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/settings/viewmodels/SettingsViewModelMocked.kt @@ -24,4 +24,7 @@ class SettingsViewModelMocked(): ViewModel(), ISettingsViewModel { override suspend fun accessSharedAccountWithCode(code: String) {} override suspend fun shareMyCode() {} override suspend fun openAppHomePage() {} + override fun getVersion(): String { + return "1.0.0 (123456)" + } } \ No newline at end of file diff --git a/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/settings/views/SettingsPage.kt b/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/settings/views/SettingsPage.kt index 4054b80..2e1d8fe 100644 --- a/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/settings/views/SettingsPage.kt +++ b/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/settings/views/SettingsPage.kt @@ -1,22 +1,55 @@ package dev.haroldjose.familysharedlist.android.presentationLayer.pages.settings.views +import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.border import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Scaffold import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import dev.haroldjose.familysharedlist.android.R +import dev.haroldjose.familysharedlist.android.app.MyApplicationTheme import dev.haroldjose.familysharedlist.android.presentationLayer.pages.settings.views.components.SettingsItemWithTitleView import dev.haroldjose.familysharedlist.android.presentationLayer.pages.settings.views.components.SettingsItemWithInputTextView import dev.haroldjose.familysharedlist.android.presentationLayer.pages.settings.views.components.SettingsItemWithTitleAndSubtitleView import dev.haroldjose.familysharedlist.android.presentationLayer.pages.settings.views.components.SettingsTopAppBarView import dev.haroldjose.familysharedlist.android.presentationLayer.pages.settings.viewmodels.ISettingsViewModel +import dev.haroldjose.familysharedlist.android.presentationLayer.pages.settings.viewmodels.SettingsViewModelMocked import kotlinx.coroutines.launch +import android.graphics.Bitmap +import android.graphics.Canvas +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.compose.foundation.layout.* +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.ui.Alignment +import androidx.compose.ui.graphics.asImageBitmap +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.text.style.TextOverflow +import androidx.core.content.res.ResourcesCompat + //reference: //https://tomas-repcik.medium.com/making-extensible-settings-screen-in-jetpack-compose-from-scratch-2558170dd24d @Composable @@ -37,10 +70,11 @@ internal fun SettingsPage( .verticalScroll(rememberScrollState()) .padding(it) .padding(16.dp) + .fillMaxSize() ) { SettingsItemWithTitleAndSubtitleView( - title = "Meu código de compartilhamento", + title = "Compartilhar minha conta", subtitle = viewModel.accountShortCodeForShareTitle ) { coroutineScope.launch { @@ -64,7 +98,71 @@ internal fun SettingsPage( viewModel.openAppHomePage() } } + + FamilyListLogo(viewModel) } } } +@Composable +private fun FamilyListLogo( + viewModel: ISettingsViewModel +) { + ResourcesCompat.getDrawable( + LocalContext.current.resources, + R.mipmap.ic_launcher, LocalContext.current.theme + )?.let { drawable -> + val bitmap = Bitmap.createBitmap( + drawable.intrinsicWidth, drawable.intrinsicHeight, + Bitmap.Config.ARGB_8888 + ) + val canvas = Canvas(bitmap) + drawable.setBounds(0, 0, canvas.width, canvas.height) + drawable.draw(canvas) + Column( + modifier = Modifier + .fillMaxSize() + .padding(8.dp), + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally + ) { + Image( + // painter = painterResource(R.mipmap.ic_launcher), + bitmap = bitmap.asImageBitmap(), + "Family List Logo", + modifier = Modifier + .requiredSize(200.dp) + .clip(RoundedCornerShape(16.dp)) + ) + Text( + text = "Family List", + style = MaterialTheme.typography.titleLarge, + modifier = Modifier + .padding(16.dp,16.dp,16.dp,8.dp), + textAlign = TextAlign.Center + ) + + Text( + text = "Lista de compras compartilhada com a sua familia", + style = MaterialTheme.typography.bodySmall, + modifier = Modifier + .padding(16.dp,16.dp,16.dp,8.dp), + textAlign = TextAlign.Center + ) + + Text(text = viewModel.getVersion()) + } + } +} + + +@Preview +@Composable +fun SettingsPage_Preview() { + MyApplicationTheme { + SettingsPage(viewModel = SettingsViewModelMocked()) + } +} + + + diff --git a/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/settings/views/components/SettingsItemWithInputTextView.kt b/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/settings/views/components/SettingsItemWithInputTextView.kt index a9fc658..d21164a 100644 --- a/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/settings/views/components/SettingsItemWithInputTextView.kt +++ b/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/settings/views/components/SettingsItemWithInputTextView.kt @@ -5,14 +5,15 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row 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.automirrored.rounded.KeyboardArrowRight import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Text -import androidx.compose.material3.TextField import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf @@ -20,9 +21,12 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.text.input.KeyboardCapitalization import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.text.toUpperCase import androidx.compose.ui.unit.dp +import java.util.Locale const val maxChar = 5 @Composable @@ -55,15 +59,16 @@ fun SettingsItemWithInputTextView( textAlign = TextAlign.Start, overflow = TextOverflow.Ellipsis, ) - TextField( + OutlinedTextField( value = textFieldState, onValueChange = { - if (it.length <= maxChar) textFieldState = it + if (it.length <= maxChar) textFieldState = it.uppercase() }, placeholder = { Text("ex: XY75K") }, singleLine = true, modifier = Modifier .padding(16.dp,0.dp,16.dp,8.dp), + keyboardOptions = KeyboardOptions(capitalization = KeyboardCapitalization.Words) ) } Spacer(modifier = Modifier.weight(1.0f)) diff --git a/androidApp/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/androidApp/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..036d09b --- /dev/null +++ b/androidApp/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/androidApp/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp b/androidApp/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000..5176500 Binary files /dev/null and b/androidApp/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp differ diff --git a/androidApp/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp b/androidApp/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000..192c360 Binary files /dev/null and b/androidApp/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp differ diff --git a/androidApp/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp b/androidApp/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000..55884bb Binary files /dev/null and b/androidApp/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp differ diff --git a/androidApp/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp b/androidApp/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000..21c70bb Binary files /dev/null and b/androidApp/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp differ diff --git a/androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp b/androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000..353086a Binary files /dev/null and b/androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp differ diff --git a/androidApp/src/main/res/values/ic_launcher_background.xml b/androidApp/src/main/res/values/ic_launcher_background.xml new file mode 100644 index 0000000..43f35a8 --- /dev/null +++ b/androidApp/src/main/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #E5D2C3 + \ No newline at end of file