diff --git a/androidApp/src/main/AndroidManifest.xml b/androidApp/src/main/AndroidManifest.xml index 08d01dd..3779918 100644 --- a/androidApp/src/main/AndroidManifest.xml +++ b/androidApp/src/main/AndroidManifest.xml @@ -20,6 +20,8 @@ + \ No newline at end of file diff --git a/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/app/MainActivity.kt b/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/app/MainActivity.kt index 3247d93..6a62b66 100644 --- a/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/app/MainActivity.kt +++ b/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/app/MainActivity.kt @@ -13,6 +13,7 @@ import com.google.firebase.analytics.ktx.analytics import com.google.firebase.ktx.Firebase import dev.haroldjose.familysharedlist.AndroidPlatform import dev.haroldjose.familysharedlist.android.presentationLayer.pages.navigator.views.NavigatorPage +import dev.haroldjose.familysharedlist.android.presentationLayer.pages.navigator.views.Router import org.koin.androidx.compose.KoinAndroidContext import org.koin.core.annotation.KoinExperimentalAPI @@ -26,6 +27,8 @@ class MainActivity : ComponentActivity() { AndroidPlatform.androidContextForKmm = this AndroidPlatform.isDebuggable = (0 != applicationInfo.flags and ApplicationInfo.FLAG_DEBUGGABLE) + + var initialRoute = handleInitialRoute() setContent { MyApplicationTheme { Surface( @@ -33,10 +36,28 @@ class MainActivity : ComponentActivity() { color = MaterialTheme.colorScheme.background ) { KoinAndroidContext() { - NavigatorPage() + NavigatorPage( + initialRoute = initialRoute + ) } } } } } + + private fun handleInitialRoute(): Router { + + //handle shortcuts + val shortcutValue = intent.getStringExtra("shortcut_key") + when (shortcutValue) { + + Router.QUICK_INSERT.value -> { + return Router.QUICK_INSERT + } + + else -> { + return Router.FAMILY_LIST + } + } + } } \ No newline at end of file diff --git a/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/navigator/viewmodels/INavigatorViewModel.kt b/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/navigator/viewmodels/INavigatorViewModel.kt index 4adb0c9..58b0e7f 100644 --- a/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/navigator/viewmodels/INavigatorViewModel.kt +++ b/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/navigator/viewmodels/INavigatorViewModel.kt @@ -1,9 +1,10 @@ package dev.haroldjose.familysharedlist.android.presentationLayer.pages.navigator.viewmodels import androidx.navigation.NavHostController +import dev.haroldjose.familysharedlist.android.presentationLayer.pages.navigator.views.Router interface INavigatorViewModel { var viewState: NavigatorViewState - suspend fun checkIfNeedToCreateNewAccount(navController: NavHostController) + suspend fun checkIfNeedToCreateNewAccount(navController: NavHostController, initialRoute: Router) } \ No newline at end of file diff --git a/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/navigator/viewmodels/NavigatorViewModel.kt b/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/navigator/viewmodels/NavigatorViewModel.kt index 0b124fd..7f4d39e 100644 --- a/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/navigator/viewmodels/NavigatorViewModel.kt +++ b/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/navigator/viewmodels/NavigatorViewModel.kt @@ -5,7 +5,7 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue import androidx.lifecycle.ViewModel import androidx.navigation.NavHostController -import dev.haroldjose.familysharedlist.android.presentationLayer.pages.navigator.views.NavigatorRouter +import dev.haroldjose.familysharedlist.android.presentationLayer.pages.navigator.views.Router import dev.haroldjose.familysharedlist.domainLayer.usecases.account.GetOrCreateAccountFromLocalUuidUseCase import dev.haroldjose.familysharedlist.services.firebase.IFirebaseCrashlytics @@ -15,12 +15,12 @@ class NavigatorViewModel( ): ViewModel(), INavigatorViewModel { override var viewState: NavigatorViewState by mutableStateOf(NavigatorViewState.Initial) - override suspend fun checkIfNeedToCreateNewAccount(navController: NavHostController) { + override suspend fun checkIfNeedToCreateNewAccount(navController: NavHostController, initialRoute: Router) { viewState = NavigatorViewState.Loading try { getOrCreateAccountFromLocalUuidUseCase.execute() viewState = NavigatorViewState.Success - navController.navigate(NavigatorRouter.FAMILY_LIST.value) + navController.navigate(initialRoute.value) } catch (e: Throwable) { crashlytics.record(e) viewState = NavigatorViewState.Error(e.message ?: "Ocorreu um erro inesperado. Tente novamente.") diff --git a/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/navigator/viewmodels/NavigatorViewModelMock.kt b/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/navigator/viewmodels/NavigatorViewModelMock.kt index b881033..9d4ef7c 100644 --- a/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/navigator/viewmodels/NavigatorViewModelMock.kt +++ b/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/navigator/viewmodels/NavigatorViewModelMock.kt @@ -2,8 +2,9 @@ package dev.haroldjose.familysharedlist.android.presentationLayer.pages.navigato import androidx.lifecycle.ViewModel import androidx.navigation.NavHostController +import dev.haroldjose.familysharedlist.android.presentationLayer.pages.navigator.views.Router class NavigatorViewModelMock(): ViewModel(), INavigatorViewModel { override var viewState: NavigatorViewState = NavigatorViewState.Initial - override suspend fun checkIfNeedToCreateNewAccount(navController: NavHostController) {} + override suspend fun checkIfNeedToCreateNewAccount(navController: NavHostController,initialRoute: Router) {} } \ No newline at end of file diff --git a/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/navigator/views/NavigatorPage.kt b/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/navigator/views/NavigatorPage.kt index 31e981e..2898e65 100644 --- a/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/navigator/views/NavigatorPage.kt +++ b/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/navigator/views/NavigatorPage.kt @@ -40,32 +40,33 @@ fun NavigatorPage( navigatorViewModel: INavigatorViewModel = koinViewModel(), quickInsertListViewModel: IQuickInsertListViewModel = koinViewModel(), settingsViewModel: ISettingsViewModel = koinViewModel(), - familyListViewModel: IFamilyListViewModel = koinViewModel() + familyListViewModel: IFamilyListViewModel = koinViewModel(), + initialRoute: Router ) { val coroutineScope: CoroutineScope = rememberCoroutineScope() val navController: NavHostController = rememberNavController() - quickInsertListViewModel.goToFamilyListPage = { navController.navigate(NavigatorRouter.FAMILY_LIST.value) } - settingsViewModel.goBack = { navController.navigate(NavigatorRouter.FAMILY_LIST.value) } - familyListViewModel.goToSetting = { navController.navigate(NavigatorRouter.SETTINGS.value) } - familyListViewModel.goToQuickInsert = { navController.navigate(NavigatorRouter.QUICK_INSERT.value) } + quickInsertListViewModel.goToFamilyListPage = { navController.navigate(Router.FAMILY_LIST.value) } + settingsViewModel.goBack = { navController.navigate(Router.FAMILY_LIST.value) } + familyListViewModel.goToSetting = { navController.navigate(Router.SETTINGS.value) } + familyListViewModel.goToQuickInsert = { navController.navigate(Router.QUICK_INSERT.value) } LaunchedEffect(key1 = "NavigatorView") { - navigatorViewModel.checkIfNeedToCreateNewAccount(navController) + navigatorViewModel.checkIfNeedToCreateNewAccount(navController, initialRoute) } - NavHost(navController = navController, startDestination = NavigatorRouter.NAVIGATOR.value) { - composable(NavigatorRouter.FAMILY_LIST.value) { + NavHost(navController = navController, startDestination = Router.NAVIGATOR.value) { + composable(Router.FAMILY_LIST.value) { FamilyListPage(familyListViewModel) } - composable(NavigatorRouter.SETTINGS.value) { + composable(Router.SETTINGS.value) { SettingsPage(settingsViewModel) } - composable(NavigatorRouter.QUICK_INSERT.value) { + composable(Router.QUICK_INSERT.value) { QuickInsertListPage(quickInsertListViewModel) } - composable(NavigatorRouter.NAVIGATOR.value) { - LoadingOrErrorPage(navController, coroutineScope, navigatorViewModel) + composable(Router.NAVIGATOR.value) { + LoadingOrErrorPage(navController, coroutineScope, navigatorViewModel, initialRoute) } } } @@ -74,7 +75,8 @@ fun NavigatorPage( private fun LoadingOrErrorPage( navController: NavHostController, coroutineScope: CoroutineScope, - navigatorViewModel: INavigatorViewModel + navigatorViewModel: INavigatorViewModel, + initialRoute: Router ) { when (navigatorViewModel.viewState) { is NavigatorViewState.Initial, NavigatorViewState.Loading, NavigatorViewState.Success -> CircularProgressIndicator( @@ -85,7 +87,8 @@ private fun LoadingOrErrorPage( is NavigatorViewState.Error -> ErrorPage((navigatorViewModel.viewState as NavigatorViewState.Error).message) { coroutineScope.launch { navigatorViewModel.checkIfNeedToCreateNewAccount( - navController + navController, + initialRoute ) } } @@ -100,7 +103,8 @@ fun FamilyListPage_Preview() { navigatorViewModel = NavigatorViewModelMock(), quickInsertListViewModel = QuickInsertListViewModelMocked(), settingsViewModel = SettingsViewModelMocked(), - familyListViewModel= FamilyListViewModelMocked() + familyListViewModel= FamilyListViewModelMocked(), + initialRoute = Router.NAVIGATOR ) } } diff --git a/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/navigator/views/NavigatorRouter.kt b/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/navigator/views/Router.kt similarity index 81% rename from androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/navigator/views/NavigatorRouter.kt rename to androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/navigator/views/Router.kt index 609b282..b3b2fac 100644 --- a/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/navigator/views/NavigatorRouter.kt +++ b/androidApp/src/main/java/dev/haroldjose/familysharedlist/android/presentationLayer/pages/navigator/views/Router.kt @@ -1,6 +1,6 @@ package dev.haroldjose.familysharedlist.android.presentationLayer.pages.navigator.views -enum class NavigatorRouter(val value: String) { +enum class Router(val value: String) { FAMILY_LIST("family_list"), SETTINGS("setting"), QUICK_INSERT("quick_insert"), diff --git a/androidApp/src/main/res/values/strings.xml b/androidApp/src/main/res/values/strings.xml index d10ccb4..d05f20e 100644 --- a/androidApp/src/main/res/values/strings.xml +++ b/androidApp/src/main/res/values/strings.xml @@ -1,4 +1,7 @@ Family List + Inclusão rápida + crie vários itens de uma só vez + indisponível no momento \ No newline at end of file diff --git a/androidApp/src/main/res/xml/shortcuts.xml b/androidApp/src/main/res/xml/shortcuts.xml new file mode 100644 index 0000000..147ec60 --- /dev/null +++ b/androidApp/src/main/res/xml/shortcuts.xml @@ -0,0 +1,16 @@ + + + + + + + \ No newline at end of file diff --git a/iosApp/iosApp.xcodeproj/project.pbxproj b/iosApp/iosApp.xcodeproj/project.pbxproj index 1fc1392..7857969 100644 --- a/iosApp/iosApp.xcodeproj/project.pbxproj +++ b/iosApp/iosApp.xcodeproj/project.pbxproj @@ -44,6 +44,9 @@ 527A6A102BE5C0EE000C565D /* NavigatorViewState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 527A6A0F2BE5C0EE000C565D /* NavigatorViewState.swift */; }; 527A6A122BE5C3C7000C565D /* FamilyListViewState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 527A6A112BE5C3C7000C565D /* FamilyListViewState.swift */; }; 527A6A142BE6DC0F000C565D /* FirebaseCrashlytics.swift in Sources */ = {isa = PBXBuildFile; fileRef = 527A6A132BE6DC0F000C565D /* FirebaseCrashlytics.swift */; }; + 5296515B2BED7F9B005F5E19 /* RouterType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5296515A2BED7F9B005F5E19 /* RouterType.swift */; }; + 5296515D2BED8C14005F5E19 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5296515C2BED8C14005F5E19 /* SceneDelegate.swift */; }; + 5296515F2BED8C79005F5E19 /* RouterService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5296515E2BED8C79005F5E19 /* RouterService.swift */; }; 52B326972BDD689A00D12B05 /* FirebaseAnalytics.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52B326962BDD689A00D12B05 /* FirebaseAnalytics.swift */; }; 52B326992BDD736A00D12B05 /* nativeModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52B326982BDD736A00D12B05 /* nativeModule.swift */; }; 52BD908C2BC0B6DE00C88B84 /* FamilyListPageTabEnum.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52BD908B2BC0B6DE00C88B84 /* FamilyListPageTabEnum.swift */; }; @@ -127,6 +130,9 @@ 527A6A0F2BE5C0EE000C565D /* NavigatorViewState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigatorViewState.swift; sourceTree = ""; }; 527A6A112BE5C3C7000C565D /* FamilyListViewState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FamilyListViewState.swift; sourceTree = ""; }; 527A6A132BE6DC0F000C565D /* FirebaseCrashlytics.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirebaseCrashlytics.swift; sourceTree = ""; }; + 5296515A2BED7F9B005F5E19 /* RouterType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RouterType.swift; sourceTree = ""; }; + 5296515C2BED8C14005F5E19 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; + 5296515E2BED8C79005F5E19 /* RouterService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RouterService.swift; sourceTree = ""; }; 52B326962BDD689A00D12B05 /* FirebaseAnalytics.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirebaseAnalytics.swift; sourceTree = ""; }; 52B326982BDD736A00D12B05 /* nativeModule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = nativeModule.swift; sourceTree = ""; }; 52BD908B2BC0B6DE00C88B84 /* FamilyListPageTabEnum.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FamilyListPageTabEnum.swift; sourceTree = ""; }; @@ -310,6 +316,15 @@ path = error; sourceTree = ""; }; + 529651602BED8D8E005F5E19 /* router */ = { + isa = PBXGroup; + children = ( + 5296515E2BED8C79005F5E19 /* RouterService.swift */, + 5296515A2BED7F9B005F5E19 /* RouterType.swift */, + ); + path = router; + sourceTree = ""; + }; 52B326952BDD688900D12B05 /* services */ = { isa = PBXGroup; children = ( @@ -531,6 +546,7 @@ 52FD81A02BBDD72500D6FEE3 /* iOSApp+configureIsRunningUITests.swift */, 52385F362BC1C7E4009E46F4 /* AppConstants.swift */, 523509F82BD3273100BC2F51 /* AppDelegate.swift */, + 5296515C2BED8C14005F5E19 /* SceneDelegate.swift */, ); path = app; sourceTree = ""; @@ -538,6 +554,7 @@ 52FD81B22BBDD87300D6FEE3 /* presentationLayer */ = { isa = PBXGroup; children = ( + 529651602BED8D8E005F5E19 /* router */, 52FD81B32BBDD8E500D6FEE3 /* components */, 52FD818D2BBDD72500D6FEE3 /* pages */, ); @@ -771,9 +788,11 @@ 523E95EE2BE9B76300ECEBBF /* year+month+day.swift in Sources */, 52FD81A52BBDD72500D6FEE3 /* LazyKoin.swift in Sources */, 52FD81B52BBDDA9E00D6FEE3 /* QuantitySelectionView.swift in Sources */, + 5296515D2BED8C14005F5E19 /* SceneDelegate.swift in Sources */, 524120D22BEAF86F00C1E1D3 /* CurrencyField.swift in Sources */, 52FD81B82BBDE1B100D6FEE3 /* QuickInsertListPage.swift in Sources */, 523D9BD72BE81C010014A86F /* toCurrencyFormat.swift in Sources */, + 5296515F2BED8C79005F5E19 /* RouterService.swift in Sources */, 52D7B6D12BC7433E00037A17 /* isDigitsOnly.swift in Sources */, 523D9BD02BE7D5B40014A86F /* ColumnRigthEditingName.swift in Sources */, 52385F372BC1C7E4009E46F4 /* AppConstants.swift in Sources */, @@ -804,6 +823,7 @@ 52385F2F2BC1B2BD009E46F4 /* ListBackgroundClearModifier.swift in Sources */, 52DE60A32BBF522000C12669 /* SettingsItemWithInputTextView.swift in Sources */, 524120D02BEAE43200C1E1D3 /* FamilyListBottomSheetOpenImage.swift in Sources */, + 5296515B2BED7F9B005F5E19 /* RouterType.swift in Sources */, 52FD81BA2BBDE23F00D6FEE3 /* QuickInsertListViewModelProtocol.swift in Sources */, 52FD81AC2BBDD72600D6FEE3 /* toInt32.swift in Sources */, ); diff --git a/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/100.png b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/100.png new file mode 100644 index 0000000..5d6f1e1 Binary files /dev/null and b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/100.png differ diff --git a/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/1024.png b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/1024.png new file mode 100644 index 0000000..f2590de Binary files /dev/null and b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/1024.png differ diff --git a/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/114.png b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/114.png new file mode 100644 index 0000000..5565f86 Binary files /dev/null and b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/114.png differ diff --git a/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/120.png b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/120.png new file mode 100644 index 0000000..dd42ce4 Binary files /dev/null and b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/120.png differ diff --git a/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/128.png b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/128.png new file mode 100644 index 0000000..0a5dd9a Binary files /dev/null and b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/128.png differ diff --git a/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/144.png b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/144.png new file mode 100644 index 0000000..9bbf622 Binary files /dev/null and b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/144.png differ diff --git a/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/152.png b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/152.png new file mode 100644 index 0000000..930a560 Binary files /dev/null and b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/152.png differ diff --git a/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/16.png b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/16.png new file mode 100644 index 0000000..7e92046 Binary files /dev/null and b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/16.png differ diff --git a/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/167.png b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/167.png new file mode 100644 index 0000000..df8ad30 Binary files /dev/null and b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/167.png differ diff --git a/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/180.png b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/180.png new file mode 100644 index 0000000..9acc945 Binary files /dev/null and b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/180.png differ diff --git a/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/20.png b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/20.png new file mode 100644 index 0000000..83f4106 Binary files /dev/null and b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/20.png differ diff --git a/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/256.png b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/256.png new file mode 100644 index 0000000..79b085c Binary files /dev/null and b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/256.png differ diff --git a/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/29.png b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/29.png new file mode 100644 index 0000000..eab5962 Binary files /dev/null and b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/29.png differ diff --git a/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/32.png b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/32.png new file mode 100644 index 0000000..144df85 Binary files /dev/null and b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/32.png differ diff --git a/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/40.png b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/40.png new file mode 100644 index 0000000..d9d522f Binary files /dev/null and b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/40.png differ diff --git a/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/50.png b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/50.png new file mode 100644 index 0000000..82d24b8 Binary files /dev/null and b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/50.png differ diff --git a/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/512.png b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/512.png new file mode 100644 index 0000000..8063225 Binary files /dev/null and b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/512.png differ diff --git a/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/57.png b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/57.png new file mode 100644 index 0000000..46ed0a3 Binary files /dev/null and b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/57.png differ diff --git a/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/58.png b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/58.png new file mode 100644 index 0000000..5d1646c Binary files /dev/null and b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/58.png differ diff --git a/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/60.png b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/60.png new file mode 100644 index 0000000..48e8388 Binary files /dev/null and b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/60.png differ diff --git a/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/64.png b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/64.png new file mode 100644 index 0000000..c929197 Binary files /dev/null and b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/64.png differ diff --git a/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/72.png b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/72.png new file mode 100644 index 0000000..bcf9066 Binary files /dev/null and b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/72.png differ diff --git a/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/76.png b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/76.png new file mode 100644 index 0000000..d935151 Binary files /dev/null and b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/76.png differ diff --git a/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/80.png b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/80.png new file mode 100644 index 0000000..bcd972a Binary files /dev/null and b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/80.png differ diff --git a/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/87.png b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/87.png new file mode 100644 index 0000000..e6a7feb Binary files /dev/null and b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/87.png differ diff --git a/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json index fb88a39..5c82812 100644 --- a/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,98 +1 @@ -{ - "images" : [ - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "20x20" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "20x20" - }, - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "29x29" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "29x29" - }, - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "40x40" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "40x40" - }, - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "60x60" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "60x60" - }, - { - "idiom" : "ipad", - "scale" : "1x", - "size" : "20x20" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "20x20" - }, - { - "idiom" : "ipad", - "scale" : "1x", - "size" : "29x29" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "29x29" - }, - { - "idiom" : "ipad", - "scale" : "1x", - "size" : "40x40" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "40x40" - }, - { - "idiom" : "ipad", - "scale" : "1x", - "size" : "76x76" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "76x76" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "83.5x83.5" - }, - { - "idiom" : "ios-marketing", - "scale" : "1x", - "size" : "1024x1024" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} \ No newline at end of file +{"images":[{"size":"60x60","expected-size":"180","filename":"180.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"40x40","expected-size":"80","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"40x40","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"60x60","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"57x57","expected-size":"57","filename":"57.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"29x29","expected-size":"29","filename":"29.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"87","filename":"87.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"57x57","expected-size":"114","filename":"114.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"60","filename":"60.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"1024x1024","filename":"1024.png","expected-size":"1024","idiom":"ios-marketing","folder":"Assets.xcassets/AppIcon.appiconset/","scale":"1x"},{"size":"40x40","expected-size":"80","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"72x72","expected-size":"72","filename":"72.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"76x76","expected-size":"152","filename":"152.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"50x50","expected-size":"100","filename":"100.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"76x76","expected-size":"76","filename":"76.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"29x29","expected-size":"29","filename":"29.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"50x50","expected-size":"50","filename":"50.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"72x72","expected-size":"144","filename":"144.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"40x40","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"83.5x83.5","expected-size":"167","filename":"167.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"20x20","expected-size":"20","filename":"20.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"20x20","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"128x128","expected-size":"128","filename":"128.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"256x256","expected-size":"256","filename":"256.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"128x128","expected-size":"256","filename":"256.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"256x256","expected-size":"512","filename":"512.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"32x32","expected-size":"32","filename":"32.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"512x512","expected-size":"512","filename":"512.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"16x16","expected-size":"16","filename":"16.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"16x16","expected-size":"32","filename":"32.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"32x32","expected-size":"64","filename":"64.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"512x512","expected-size":"1024","filename":"1024.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"}]} \ No newline at end of file diff --git a/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/app-icon-1024.png b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/app-icon-1024.png deleted file mode 100644 index 53fc536..0000000 Binary files a/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/app-icon-1024.png and /dev/null differ diff --git a/iosApp/iosApp/Info.plist b/iosApp/iosApp/Info.plist index fa910fd..279e78a 100644 --- a/iosApp/iosApp/Info.plist +++ b/iosApp/iosApp/Info.plist @@ -39,6 +39,17 @@ UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight + UIApplicationShortcutItems + + + UIApplicationShortcutItemType + dev.haroldjose.familysharedlist.ios.quick_insert + UIApplicationShortcutItemTitle + Inclusão rápida + UIApplicationShortcutItemSubtitle + crie vários itens de uma só vez + + UISupportedInterfaceOrientations~ipad UIInterfaceOrientationPortrait diff --git a/iosApp/iosApp/app/AppDelegate.swift b/iosApp/iosApp/app/AppDelegate.swift index 72510fa..5035003 100644 --- a/iosApp/iosApp/app/AppDelegate.swift +++ b/iosApp/iosApp/app/AppDelegate.swift @@ -5,6 +5,9 @@ import FirebaseCore import shared class AppDelegate: NSObject, UIApplicationDelegate { + + private let routerService = RouterService.shared + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool { FirebaseApp.configure() @@ -14,6 +17,25 @@ class AppDelegate: NSObject, UIApplicationDelegate { nativeModules: [nativeModule], appDeclaration: { _ in } ) + + if let shortcutItem = launchOptions?[UIApplication.LaunchOptionsKey.shortcutItem] as? UIApplicationShortcutItem { + _ = routerService.handleShortCutItem(shortcutItem) + } + return true } + + func application(_ application: UIApplication, performActionFor shortcutItem: UIApplicationShortcutItem, completionHandler: @escaping (Bool) -> Void) { + let handled = routerService.handleShortCutItem(shortcutItem) + completionHandler(handled) + } + + func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { + if let shortcutItem = options.shortcutItem { + _ = routerService.handleShortCutItem(shortcutItem) + } + let configuration = UISceneConfiguration(name: connectingSceneSession.configuration.name, sessionRole: connectingSceneSession.role) + configuration.delegateClass = SceneDelegate.self + return configuration + } } diff --git a/iosApp/iosApp/app/SceneDelegate.swift b/iosApp/iosApp/app/SceneDelegate.swift new file mode 100644 index 0000000..4523eb2 --- /dev/null +++ b/iosApp/iosApp/app/SceneDelegate.swift @@ -0,0 +1,20 @@ +import Foundation +import UIKit + +class SceneDelegate: NSObject, UIWindowSceneDelegate { + + private let routerService = RouterService.shared + + func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { + + if let shortcutItem = connectionOptions.shortcutItem { + _ = routerService.handleShortCutItem(shortcutItem) + } + } + + func windowScene(_ windowScene: UIWindowScene, performActionFor shortcutItem: UIApplicationShortcutItem, completionHandler: @escaping (Bool) -> Void) { + + _ = routerService.handleShortCutItem(shortcutItem) + completionHandler(true) + } +} diff --git a/iosApp/iosApp/app/iOSApp.swift b/iosApp/iosApp/app/iOSApp.swift index 4d880a0..e798471 100644 --- a/iosApp/iosApp/app/iOSApp.swift +++ b/iosApp/iosApp/app/iOSApp.swift @@ -1,18 +1,19 @@ import SwiftUI import shared - @main struct iOSApp: App { @UIApplicationDelegateAdaptor(AppDelegate.self) var delegate @Environment(\.scenePhase) private var scenePhase - + private let routerService = RouterService.shared + var body: some Scene { WindowGroup { NavigatorPage(viewModel: ResolverApp().resolve()) + .environmentObject(routerService) }.onChange(of: scenePhase) { phase in switch phase { diff --git a/iosApp/iosApp/presentationLayer/pages/navigator/views/NavigatorPage.swift b/iosApp/iosApp/presentationLayer/pages/navigator/views/NavigatorPage.swift index 7186d5a..e898420 100644 --- a/iosApp/iosApp/presentationLayer/pages/navigator/views/NavigatorPage.swift +++ b/iosApp/iosApp/presentationLayer/pages/navigator/views/NavigatorPage.swift @@ -3,8 +3,7 @@ import SwiftUI struct NavigatorPage: View where NavViewModel: NavigatorViewModelProtocol { @StateObject var viewModel: NavViewModel - - @State private var router: ViewRouter = ViewRouter.familyList + @EnvironmentObject var routerService: RouterService var body: some View { NavigationView { @@ -24,46 +23,39 @@ struct NavigatorPage: View where NavViewModel: NavigatorViewModelP private func NavigatorView() -> some View { Group { - switch router { + switch routerService.router { case .familyList: - FamilyListPage(router: router) + FamilyListPage() case .settings: - SettingsPage(router: router) + SettingsPage() case .quickInsert: - QuickInsertListPage(router: router) + QuickInsertListPage() case .debug: Text("onDebug") } } } - private func QuickInsertListPage(router: ViewRouter) -> some View { + private func QuickInsertListPage() -> some View { let viewModel: QuickInsertListViewModel = ResolverApp().resolve() - viewModel.goToFamilyListPage = { self.router = .familyList } + viewModel.goToFamilyListPage = { self.routerService.router = .familyList } return Family_List.QuickInsertListPage(viewModel: viewModel) } - private func SettingsPage(router: ViewRouter) -> some View { + private func SettingsPage() -> some View { let viewModel: SettingsViewModel = ResolverApp().resolve() - viewModel.goBack = { self.router = .familyList } + viewModel.goBack = { self.routerService.router = .familyList } return Family_List.SettingsPage(viewModel: viewModel) } - private func FamilyListPage(router: ViewRouter) -> some View { + private func FamilyListPage() -> some View { let viewModel: FamilyListViewModel = ResolverApp().resolve() - viewModel.goToSetting = { self.router = .settings } - viewModel.goToQuickInsert = { self.router = .quickInsert } + viewModel.goToSetting = { self.routerService.router = .settings } + viewModel.goToQuickInsert = { self.routerService.router = .quickInsert } return Family_List.FamilyListPage(viewModel: viewModel) } } -enum ViewRouter { - case familyList - case settings - case quickInsert - case debug -} - #Preview { NavigationView { NavigatorPage( diff --git a/iosApp/iosApp/presentationLayer/router/RouterService.swift b/iosApp/iosApp/presentationLayer/router/RouterService.swift new file mode 100644 index 0000000..1b42478 --- /dev/null +++ b/iosApp/iosApp/presentationLayer/router/RouterService.swift @@ -0,0 +1,20 @@ +import Foundation +import UIKit + +class RouterService: ObservableObject { + private init() {} + static let shared = RouterService() + @Published var router: RouterType = .familyList + + func handleShortCutItem(_ shortcutItem: UIApplicationShortcutItem) -> Bool { + if shortcutItem.type == RouterType.quickInsert.rawValue { + router = .quickInsert + return true + } + return false + } +} + + + + diff --git a/iosApp/iosApp/presentationLayer/router/RouterType.swift b/iosApp/iosApp/presentationLayer/router/RouterType.swift new file mode 100644 index 0000000..55bea9c --- /dev/null +++ b/iosApp/iosApp/presentationLayer/router/RouterType.swift @@ -0,0 +1,6 @@ +enum RouterType: String { + case familyList = "dev.haroldjose.familysharedlist.ios.family_list" + case settings = "dev.haroldjose.familysharedlist.ios.settings" + case quickInsert = "dev.haroldjose.familysharedlist.ios.quick_insert" + case debug +}