diff --git a/petWalk/petWalk.xcodeproj/project.pbxproj b/petWalk/petWalk.xcodeproj/project.pbxproj index bf96c8f..9879b15 100644 --- a/petWalk/petWalk.xcodeproj/project.pbxproj +++ b/petWalk/petWalk.xcodeproj/project.pbxproj @@ -10,6 +10,8 @@ 12C10A382DF7508E18097A18 /* Pods_petWalkWatchKitApp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3E8216F4C4042A5D1D20E015 /* Pods_petWalkWatchKitApp.framework */; }; 21E38BE86C850874828E4AF9 /* Pods_petWalkUITests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 87DE13B055A0DF53CC3B0EA0 /* Pods_petWalkUITests.framework */; }; 350127BB27C2606A00AB2B1D /* PetDataView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 350127BA27C2606900AB2B1D /* PetDataView.swift */; }; + 35094B3127E3E33A0035D7B7 /* PetDataViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35094B3027E3E33A0035D7B7 /* PetDataViewModel.swift */; }; + 35094B3327E3E4920035D7B7 /* PetDataViewConfigurator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35094B3227E3E4920035D7B7 /* PetDataViewConfigurator.swift */; }; 35338BD727CD6E58007ECF47 /* SaveTotalStepsUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35338BD627CD6E58007ECF47 /* SaveTotalStepsUseCase.swift */; }; 35338BD927CD7397007ECF47 /* GetAccumulatedDailyStepsUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35338BD827CD7397007ECF47 /* GetAccumulatedDailyStepsUseCase.swift */; }; 35434FE327832D8E0024FB5A /* petWalkApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35434FE227832D8E0024FB5A /* petWalkApp.swift */; }; @@ -22,7 +24,7 @@ 3543500427832D900024FB5A /* petWalkWatchKitApp.app in Embed Watch Content */ = {isa = PBXBuildFile; fileRef = 3543500327832D900024FB5A /* petWalkWatchKitApp.app */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 3543500927832D910024FB5A /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 3543500827832D910024FB5A /* Assets.xcassets */; }; 3543500F27832D910024FB5A /* petWalkWatchKitExtension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 3543500E27832D910024FB5A /* petWalkWatchKitExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; - 3543501427832D910024FB5A /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3543501327832D910024FB5A /* ContentView.swift */; }; + 3543501427832D910024FB5A /* PetView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3543501327832D910024FB5A /* PetView.swift */; }; 3543501627832D910024FB5A /* petWalkApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3543501527832D910024FB5A /* petWalkApp.swift */; }; 3543501827832D910024FB5A /* ComplicationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3543501727832D910024FB5A /* ComplicationController.swift */; }; 3543501A27832D920024FB5A /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 3543501927832D920024FB5A /* Assets.xcassets */; }; @@ -30,11 +32,11 @@ 3543503227832D920024FB5A /* petWalk_WatchKit_AppUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3543503127832D920024FB5A /* petWalk_WatchKit_AppUITests.swift */; }; 3543503427832D920024FB5A /* petWalk_WatchKit_AppUITestsLaunchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3543503327832D920024FB5A /* petWalk_WatchKit_AppUITestsLaunchTests.swift */; }; 355EA4C827B053CA00461F2F /* UserDefaultsDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 355EA4C727B053CA00461F2F /* UserDefaultsDataSource.swift */; }; - 355EA4CA27B0564300461F2F /* SaveDailyStepsUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 355EA4C927B0564300461F2F /* SaveDailyStepsUseCase.swift */; }; + 355EA4CA27B0564300461F2F /* SaveAccumulatedDailyStepsUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 355EA4C927B0564300461F2F /* SaveAccumulatedDailyStepsUseCase.swift */; }; 355EA4CF27B056DF00461F2F /* UserDefaultsRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 355EA4CE27B056DF00461F2F /* UserDefaultsRepository.swift */; }; 355EA4D227B0645A00461F2F /* HealthStorieRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 355EA4D127B0645A00461F2F /* HealthStorieRepository.swift */; }; 355EA4D427B0661200461F2F /* GetDailyStepsUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 355EA4D327B0661200461F2F /* GetDailyStepsUseCase.swift */; }; - 355EA4D627B0673200461F2F /* ContentViewConfigurator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 355EA4D527B0673200461F2F /* ContentViewConfigurator.swift */; }; + 355EA4D627B0673200461F2F /* PetViewConfigurator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 355EA4D527B0673200461F2F /* PetViewConfigurator.swift */; }; 355EA4D827B069E200461F2F /* RequestDailyStepsPermissionUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 355EA4D727B069E200461F2F /* RequestDailyStepsPermissionUseCase.swift */; }; 3563C31F27D0188A00DF8E08 /* GetAccumulatedDailyStepsUseCaseTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3563C31E27D0188A00DF8E08 /* GetAccumulatedDailyStepsUseCaseTest.swift */; }; 3563C32127D018A000DF8E08 /* SaveTotalStepsUseCaseTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3563C32027D018A000DF8E08 /* SaveTotalStepsUseCaseTest.swift */; }; @@ -42,7 +44,7 @@ 3596938B278B42E600B68BEF /* HealthStoreDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3596938A278B42E600B68BEF /* HealthStoreDataSource.swift */; }; 3596938F278B473400B68BEF /* HealthKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3596938E278B473400B68BEF /* HealthKit.framework */; }; 35969392278B47A300B68BEF /* HealthKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 35969391278B47A300B68BEF /* HealthKit.framework */; }; - 35969397278B4E2A00B68BEF /* ContentViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35969396278B4E2A00B68BEF /* ContentViewModel.swift */; }; + 35969397278B4E2A00B68BEF /* PetViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35969396278B4E2A00B68BEF /* PetViewModel.swift */; }; 3596E92C27BE9CB100B41828 /* HealthDataSourceTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3596E92B27BE9CB100B41828 /* HealthDataSourceTest.swift */; }; 35AB46FF278A185000401FB7 /* Pets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35AB46FE278A185000401FB7 /* Pets.swift */; }; 35BF2E1C27BEC407000922BF /* GetDailyStepsUseCaseTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35BF2E1B27BEC407000922BF /* GetDailyStepsUseCaseTest.swift */; }; @@ -139,6 +141,8 @@ 25817A511D849BE1016DC106 /* Pods_petWalk_WatchKit_App.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_petWalk_WatchKit_App.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 290ED32978534F5D38F9751C /* Pods-petWalkWatchKitExtension.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-petWalkWatchKitExtension.release.xcconfig"; path = "Target Support Files/Pods-petWalkWatchKitExtension/Pods-petWalkWatchKitExtension.release.xcconfig"; sourceTree = ""; }; 350127BA27C2606900AB2B1D /* PetDataView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PetDataView.swift; sourceTree = ""; }; + 35094B3027E3E33A0035D7B7 /* PetDataViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PetDataViewModel.swift; sourceTree = ""; }; + 35094B3227E3E4920035D7B7 /* PetDataViewConfigurator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PetDataViewConfigurator.swift; sourceTree = ""; }; 35338BD627CD6E58007ECF47 /* SaveTotalStepsUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SaveTotalStepsUseCase.swift; sourceTree = ""; }; 35338BD827CD7397007ECF47 /* GetAccumulatedDailyStepsUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetAccumulatedDailyStepsUseCase.swift; sourceTree = ""; }; 353A6CF927B5C60F0076FB92 /* Pods_petWalk_WatchKit_Extension.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Pods_petWalk_WatchKit_Extension.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -156,7 +160,7 @@ 3543500327832D900024FB5A /* petWalkWatchKitApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = petWalkWatchKitApp.app; sourceTree = BUILT_PRODUCTS_DIR; }; 3543500827832D910024FB5A /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 3543500E27832D910024FB5A /* petWalkWatchKitExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = petWalkWatchKitExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; - 3543501327832D910024FB5A /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; + 3543501327832D910024FB5A /* PetView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PetView.swift; sourceTree = ""; }; 3543501527832D910024FB5A /* petWalkApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = petWalkApp.swift; sourceTree = ""; }; 3543501727832D910024FB5A /* ComplicationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComplicationController.swift; sourceTree = ""; }; 3543501927832D920024FB5A /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; @@ -167,11 +171,11 @@ 3543503127832D920024FB5A /* petWalk_WatchKit_AppUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = petWalk_WatchKit_AppUITests.swift; sourceTree = ""; }; 3543503327832D920024FB5A /* petWalk_WatchKit_AppUITestsLaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = petWalk_WatchKit_AppUITestsLaunchTests.swift; sourceTree = ""; }; 355EA4C727B053CA00461F2F /* UserDefaultsDataSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserDefaultsDataSource.swift; sourceTree = ""; }; - 355EA4C927B0564300461F2F /* SaveDailyStepsUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SaveDailyStepsUseCase.swift; sourceTree = ""; }; + 355EA4C927B0564300461F2F /* SaveAccumulatedDailyStepsUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SaveAccumulatedDailyStepsUseCase.swift; sourceTree = ""; }; 355EA4CE27B056DF00461F2F /* UserDefaultsRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserDefaultsRepository.swift; sourceTree = ""; }; 355EA4D127B0645A00461F2F /* HealthStorieRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HealthStorieRepository.swift; sourceTree = ""; }; 355EA4D327B0661200461F2F /* GetDailyStepsUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetDailyStepsUseCase.swift; sourceTree = ""; }; - 355EA4D527B0673200461F2F /* ContentViewConfigurator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentViewConfigurator.swift; sourceTree = ""; }; + 355EA4D527B0673200461F2F /* PetViewConfigurator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PetViewConfigurator.swift; sourceTree = ""; }; 355EA4D727B069E200461F2F /* RequestDailyStepsPermissionUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RequestDailyStepsPermissionUseCase.swift; sourceTree = ""; }; 3563C31E27D0188A00DF8E08 /* GetAccumulatedDailyStepsUseCaseTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetAccumulatedDailyStepsUseCaseTest.swift; sourceTree = ""; }; 3563C32027D018A000DF8E08 /* SaveTotalStepsUseCaseTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SaveTotalStepsUseCaseTest.swift; sourceTree = ""; }; @@ -181,7 +185,7 @@ 3596938E278B473400B68BEF /* HealthKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = HealthKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS15.2.sdk/System/Library/Frameworks/HealthKit.framework; sourceTree = DEVELOPER_DIR; }; 35969390278B47A300B68BEF /* petWalkWatchKitExtension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = petWalkWatchKitExtension.entitlements; sourceTree = ""; }; 35969391278B47A300B68BEF /* HealthKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = HealthKit.framework; path = Platforms/WatchOS.platform/Developer/SDKs/WatchOS8.3.sdk/System/Library/Frameworks/HealthKit.framework; sourceTree = DEVELOPER_DIR; }; - 35969396278B4E2A00B68BEF /* ContentViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentViewModel.swift; sourceTree = ""; }; + 35969396278B4E2A00B68BEF /* PetViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PetViewModel.swift; sourceTree = ""; }; 3596E92B27BE9CB100B41828 /* HealthDataSourceTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HealthDataSourceTest.swift; sourceTree = ""; }; 35AB46FE278A185000401FB7 /* Pets.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Pets.swift; sourceTree = ""; }; 35BF2E1B27BEC407000922BF /* GetDailyStepsUseCaseTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetDailyStepsUseCaseTest.swift; sourceTree = ""; }; @@ -443,7 +447,7 @@ 35338BD827CD7397007ECF47 /* GetAccumulatedDailyStepsUseCase.swift */, 355EA4D327B0661200461F2F /* GetDailyStepsUseCase.swift */, 355EA4D727B069E200461F2F /* RequestDailyStepsPermissionUseCase.swift */, - 355EA4C927B0564300461F2F /* SaveDailyStepsUseCase.swift */, + 355EA4C927B0564300461F2F /* SaveAccumulatedDailyStepsUseCase.swift */, 35338BD627CD6E58007ECF47 /* SaveTotalStepsUseCase.swift */, ); path = UseCase; @@ -507,7 +511,7 @@ isa = PBXGroup; children = ( 35FE1DBB2789C7060087ECCA /* PetAnimationScene.swift */, - 3543501327832D910024FB5A /* ContentView.swift */, + 3543501327832D910024FB5A /* PetView.swift */, 350127BA27C2606900AB2B1D /* PetDataView.swift */, ); path = View; @@ -516,8 +520,10 @@ 35969395278B4DE300B68BEF /* ViewModel */ = { isa = PBXGroup; children = ( - 35969396278B4E2A00B68BEF /* ContentViewModel.swift */, - 355EA4D527B0673200461F2F /* ContentViewConfigurator.swift */, + 35969396278B4E2A00B68BEF /* PetViewModel.swift */, + 355EA4D527B0673200461F2F /* PetViewConfigurator.swift */, + 35094B3027E3E33A0035D7B7 /* PetDataViewModel.swift */, + 35094B3227E3E4920035D7B7 /* PetDataViewConfigurator.swift */, ); path = ViewModel; sourceTree = ""; @@ -706,8 +712,8 @@ isa = PBXNativeTarget; buildConfigurationList = 3543504827832D920024FB5A /* Build configuration list for PBXNativeTarget "petWalkWatchKitAppTests" */; buildPhases = ( - D7D14272C4314CE9DB0A7A61 /* [CP] Check Pods Manifest.lock */, 359A549E27B5AD0D00C55BF6 /* ShellScript */, + D7D14272C4314CE9DB0A7A61 /* [CP] Check Pods Manifest.lock */, 3543501F27832D920024FB5A /* Sources */, 3543502027832D920024FB5A /* Frameworks */, 3543502127832D920024FB5A /* Resources */, @@ -1064,22 +1070,24 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 35094B3327E3E4920035D7B7 /* PetDataViewConfigurator.swift in Sources */, 3543501627832D910024FB5A /* petWalkApp.swift in Sources */, 3596938B278B42E600B68BEF /* HealthStoreDataSource.swift in Sources */, - 355EA4D627B0673200461F2F /* ContentViewConfigurator.swift in Sources */, + 355EA4D627B0673200461F2F /* PetViewConfigurator.swift in Sources */, 35338BD727CD6E58007ECF47 /* SaveTotalStepsUseCase.swift in Sources */, - 3543501427832D910024FB5A /* ContentView.swift in Sources */, + 3543501427832D910024FB5A /* PetView.swift in Sources */, 35BF2E2327BEC93D000922BF /* UserDefaultsKeys.swift in Sources */, - 35969397278B4E2A00B68BEF /* ContentViewModel.swift in Sources */, + 35969397278B4E2A00B68BEF /* PetViewModel.swift in Sources */, 350127BB27C2606A00AB2B1D /* PetDataView.swift in Sources */, 355EA4D427B0661200461F2F /* GetDailyStepsUseCase.swift in Sources */, 355EA4C827B053CA00461F2F /* UserDefaultsDataSource.swift in Sources */, 35FE1DBC2789C7060087ECCA /* PetAnimationScene.swift in Sources */, - 355EA4CA27B0564300461F2F /* SaveDailyStepsUseCase.swift in Sources */, + 355EA4CA27B0564300461F2F /* SaveAccumulatedDailyStepsUseCase.swift in Sources */, 35AB46FF278A185000401FB7 /* Pets.swift in Sources */, 355EA4D227B0645A00461F2F /* HealthStorieRepository.swift in Sources */, 355EA4CF27B056DF00461F2F /* UserDefaultsRepository.swift in Sources */, 355EA4D827B069E200461F2F /* RequestDailyStepsPermissionUseCase.swift in Sources */, + 35094B3127E3E33A0035D7B7 /* PetDataViewModel.swift in Sources */, 35338BD927CD7397007ECF47 /* GetAccumulatedDailyStepsUseCase.swift in Sources */, 357A5E0F27B5D0AB0020B71C /* AutoMockable.swift in Sources */, 3543501827832D910024FB5A /* ComplicationController.swift in Sources */, diff --git a/petWalk/petWalk.xcworkspace/xcuserdata/javier.galera.xcuserdatad/UserInterfaceState.xcuserstate b/petWalk/petWalk.xcworkspace/xcuserdata/javier.galera.xcuserdatad/UserInterfaceState.xcuserstate index d14c85c..d4cf23e 100644 Binary files a/petWalk/petWalk.xcworkspace/xcuserdata/javier.galera.xcuserdatad/UserInterfaceState.xcuserstate and b/petWalk/petWalk.xcworkspace/xcuserdata/javier.galera.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/petWalk/petWalk.xcworkspace/xcuserdata/javier.galera.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/petWalk/petWalk.xcworkspace/xcuserdata/javier.galera.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist index 4ae27a4..c235d23 100644 --- a/petWalk/petWalk.xcworkspace/xcuserdata/javier.galera.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ b/petWalk/petWalk.xcworkspace/xcuserdata/javier.galera.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -3,4 +3,22 @@ uuid = "4E7C9AB4-8BA9-4F56-B4D4-14ED8DCB03B3" type = "0" version = "2.0"> + + + + + + diff --git a/petWalk/petWalkWatchKitAppTests/Data/Repository/UserDefaultsRepositoryTest.swift b/petWalk/petWalkWatchKitAppTests/Data/Repository/UserDefaultsRepositoryTest.swift index 9a666b5..e5401d6 100644 --- a/petWalk/petWalkWatchKitAppTests/Data/Repository/UserDefaultsRepositoryTest.swift +++ b/petWalk/petWalkWatchKitAppTests/Data/Repository/UserDefaultsRepositoryTest.swift @@ -23,7 +23,7 @@ class UserDefaultsRepositoryTest: XCTestCase { func testThatDailyStepsAreSavedOnMemory_When_SaveDailyStepsIsCalled() throws { let stepsMocked = 10 - sut.saveDailySteps(stepsMocked) + sut.saveAccumulatedDailySteps(stepsMocked) XCTAssertEqual(1, dataSource.setCallsCount) XCTAssertEqual(10, dataSource.setParamValueReceived as! Int) diff --git a/petWalk/petWalkWatchKitAppTests/Design/ContentViewModelTest.swift b/petWalk/petWalkWatchKitAppTests/Design/ContentViewModelTest.swift index dcb9b6d..900d723 100644 --- a/petWalk/petWalkWatchKitAppTests/Design/ContentViewModelTest.swift +++ b/petWalk/petWalkWatchKitAppTests/Design/ContentViewModelTest.swift @@ -9,9 +9,9 @@ import XCTest @testable import petWalkWatchKitExtension class ContentViewModelTest: XCTestCase { - private var sut: ContentViewModel! + private var sut: PetViewModel! private var requestDailyStepsPermissionUseCaseMock: RequestDailyStepsPermissionUseCaseMock! - private var saveDailyStepsUseCaseMock: SaveDailyStepsUseCaseMock! + private var saveDailyStepsUseCaseMock: SaveAccumulatedDailyStepsUseCaseMock! private var saveTotalDailyStepsUseCaseMock : SaveTotalStepsUseCaseMock! private var getDailyStepsUseCaseMock: GetDailyStepsUseCaseMock! private var getAccumulatedDailyStepsUseCase: GetAccumulatedDailyStepsUseCaseMock! @@ -20,13 +20,13 @@ class ContentViewModelTest: XCTestCase { try super.setUpWithError() requestDailyStepsPermissionUseCaseMock = RequestDailyStepsPermissionUseCaseMock() - saveDailyStepsUseCaseMock = SaveDailyStepsUseCaseMock() + saveDailyStepsUseCaseMock = SaveAccumulatedDailyStepsUseCaseMock() saveTotalDailyStepsUseCaseMock = SaveTotalStepsUseCaseMock() getDailyStepsUseCaseMock = GetDailyStepsUseCaseMock() getAccumulatedDailyStepsUseCase = GetAccumulatedDailyStepsUseCaseMock() - sut = ContentViewModel(requestDailyStepsPermissionUseCase: requestDailyStepsPermissionUseCaseMock, - saveDailyStepsUseCase: saveDailyStepsUseCaseMock, + sut = PetViewModel(requestDailyStepsPermissionUseCase: requestDailyStepsPermissionUseCaseMock, + saveAccumulatedDailyStepsUseCase: saveDailyStepsUseCaseMock, saveTotalDailyStepsUseCase: saveTotalDailyStepsUseCaseMock, getDailyStepsUseCase: getDailyStepsUseCaseMock, getAccumulatedDailyStepsUseCase: getAccumulatedDailyStepsUseCase) diff --git a/petWalk/petWalkWatchKitAppTests/Domain/SaveDailyStepsUseCaseTest.swift b/petWalk/petWalkWatchKitAppTests/Domain/SaveDailyStepsUseCaseTest.swift index f1c865d..ab0daf1 100644 --- a/petWalk/petWalkWatchKitAppTests/Domain/SaveDailyStepsUseCaseTest.swift +++ b/petWalk/petWalkWatchKitAppTests/Domain/SaveDailyStepsUseCaseTest.swift @@ -9,14 +9,14 @@ import XCTest @testable import petWalkWatchKitExtension class SaveDailyStepsUseCaseTest: XCTestCase { - private var sut: SaveDailyStepsUseCase! + private var sut: SaveAccumulatedDailyStepsUseCase! private var repository: UserDefaultsRepositoryMock! override func setUpWithError() throws { try super.setUpWithError() repository = UserDefaultsRepositoryMock() - sut = SaveDailyStepsUseCaseImplementation(repository: repository) + sut = SaveAccumulatedDailyStepsUseCaseImplementation(repository: repository) } func testThatDailyStepsAndDateAreSavedOnMemory_When_ExecuteIsCalled() { diff --git a/petWalk/petWalkWatchKitExtension/Data/DataSources/HealthStoreDataSource.swift b/petWalk/petWalkWatchKitExtension/Data/DataSources/HealthStoreDataSource.swift index f9f2be3..88e4796 100644 --- a/petWalk/petWalkWatchKitExtension/Data/DataSources/HealthStoreDataSource.swift +++ b/petWalk/petWalkWatchKitExtension/Data/DataSources/HealthStoreDataSource.swift @@ -27,9 +27,15 @@ class HealthStoreDataSourceImplementation: HealthStoreDataSource { try await withCheckedThrowingContinuation { continuation in let stepType = HKQuantityType.quantityType(forIdentifier: .stepCount)! - guard let healthStore = healthStore else { return continuation.resume(returning: false) } + guard let healthStore = healthStore else { + continuation.resume(returning: false) + return + } healthStore.requestAuthorization(toShare: [], read: [stepType]) { success, error in + if let error = error { + continuation.resume(throwing: error) + } continuation.resume(returning: success) } } diff --git a/petWalk/petWalkWatchKitExtension/Data/Repositories/UserDefaultsRepository.swift b/petWalk/petWalkWatchKitExtension/Data/Repositories/UserDefaultsRepository.swift index 6069e18..56a6eca 100644 --- a/petWalk/petWalkWatchKitExtension/Data/Repositories/UserDefaultsRepository.swift +++ b/petWalk/petWalkWatchKitExtension/Data/Repositories/UserDefaultsRepository.swift @@ -1,7 +1,7 @@ import Foundation protocol UserDefaultsRepository: AutoMockable { - func saveDailySteps(_ steps: Int) + func saveAccumulatedDailySteps(_ steps: Int) func saveTotalSteps(_ steps: Int) func saveDateDailySteps(_ date: Date) func getAccumulatedDailySteps() -> Int @@ -16,7 +16,7 @@ class UserDefaultsRepositoryImplementation: UserDefaultsRepository { self.userDefaultDataSource = userDefaultDataSource } - func saveDailySteps(_ steps: Int) { + func saveAccumulatedDailySteps(_ steps: Int) { userDefaultDataSource.set(value: steps, forKey: .accumulatedDailySteps) } diff --git a/petWalk/petWalkWatchKitExtension/Design/View/PetDataView.swift b/petWalk/petWalkWatchKitExtension/Design/View/PetDataView.swift index 9c629c0..f86088a 100644 --- a/petWalk/petWalkWatchKitExtension/Design/View/PetDataView.swift +++ b/petWalk/petWalkWatchKitExtension/Design/View/PetDataView.swift @@ -8,17 +8,71 @@ import SwiftUI struct PetDataView: View { + private let petDataViewConfigurator = PetDataViewConfigurator() + @State var dailySteps: Int + @State var newExp: Int + @State var expNextLevel: Int = 100 + + + @ObservedObject var petDataViewModel: PetDataViewModel + + init() { + petDataViewModel = petDataViewConfigurator.configure() + newExp = petDataViewModel.animationDailySteps + } var body: some View { - HStack { - Text("Exp: \(dailySteps)") + ZStack { + VStack { + Text("Exp: \(dailySteps)") + Text("Next Lvl: \(expNextLevel - dailySteps)") + } + Animation(newExp: $newExp, expNextLevel: $expNextLevel) } + .onAppear { + petDataViewModel.calculateAnimationDailySteps(dailySteps) + } + } +} + +struct Animation: View { + private let endCircleShape = 0.8 + + @State var previousExp = 0.0 + @State var progressUntilNextLevel = 0.0 + + @Binding var newExp: Int + @Binding var expNextLevel: Int + + var body: some View { + ZStack { + Circle() + .fill(Color.clear) + .overlay( + Circle() + .trim(from: self.previousExp, to: self.progressUntilNextLevel) + .rotation(Angle(degrees: 125)) + .stroke(style: StrokeStyle(lineWidth: 12, lineCap: .round, lineJoin: .round)) + .fill(Color.red) + ) + } + .animation(.spring(response: 2.0, dampingFraction: 1.0, blendDuration: 1.0), value: self.progressUntilNextLevel) + .onAppear { + self.progressUntilNextLevel = (Double(newExp) * endCircleShape) / Double(expNextLevel) + + // Save progressUntilNextLevel as newPreviousExp + } + } + + private func calculateNewPath() { + + } } struct PetDataView_Previews: PreviewProvider { static var previews: some View { - PetDataView(dailySteps: 10) + PetDataView() } } diff --git a/petWalk/petWalkWatchKitExtension/Design/View/ContentView.swift b/petWalk/petWalkWatchKitExtension/Design/View/PetView.swift similarity index 79% rename from petWalk/petWalkWatchKitExtension/Design/View/ContentView.swift rename to petWalk/petWalkWatchKitExtension/Design/View/PetView.swift index 4862e6f..844407b 100644 --- a/petWalk/petWalkWatchKitExtension/Design/View/ContentView.swift +++ b/petWalk/petWalkWatchKitExtension/Design/View/PetView.swift @@ -1,5 +1,5 @@ // -// ContentView.swift +// PetView.swift // petWalk WatchKit Extension // // Created by Galera, Javier on 3/1/22. @@ -7,13 +7,13 @@ import SwiftUI -struct ContentView: View { +struct PetView: View { private let petMock = Swordman(name: "Beldrick") - private let contentViewConfigurator = ContentViewConfigurator() + private let contentViewConfigurator = PetViewConfigurator() private let deviceSize = WKInterfaceDevice.current().screenBounds - @ObservedObject var contentViewModel: ContentViewModel + @ObservedObject var contentViewModel: PetViewModel init() { self.contentViewModel = contentViewConfigurator.configure() @@ -59,11 +59,11 @@ struct ItemBarMenu: View { var imageName: String var valueText: String - @EnvironmentObject var contentViewModel: ContentViewModel + @EnvironmentObject var contentViewModel: PetViewModel var body: some View { HStack { - NavigationLink(destination: PetDataView(dailySteps: contentViewModel.currentSteps)) { + NavigationLink(destination: PetDataView()) { Image(imageName) .resizable() .frame(width: 25, @@ -78,9 +78,7 @@ struct ItemBarMenu: View { } struct ContentView_Previews: PreviewProvider { - let contentViewModel = ContentViewConfigurator().configure() - static var previews: some View { - ContentView() + PetView() } } diff --git a/petWalk/petWalkWatchKitExtension/Design/ViewModel/PetDataViewConfigurator.swift b/petWalk/petWalkWatchKitExtension/Design/ViewModel/PetDataViewConfigurator.swift new file mode 100644 index 0000000..386080d --- /dev/null +++ b/petWalk/petWalkWatchKitExtension/Design/ViewModel/PetDataViewConfigurator.swift @@ -0,0 +1,18 @@ +// +// PetDataViewConfigurator.swift +// petWalkWatchKitExtension +// +// Created by Galera, Javier on 17/3/22. +// + +import Foundation + +class PetDataViewConfigurator { + func configure() -> PetDataViewModel { + let userDefaultDataSource = UserDefaultsDataSourceImplementation() + let userDefaultRepository = UserDefaultsRepositoryImplementation(userDefaultDataSource: userDefaultDataSource) + let getAccumulatedDailyStepsUseCase = GetAccumulatedDailyStepsUseCaseImplementation(repository: userDefaultRepository) + + return PetDataViewModel(getAccumulatedDailyStepsUseCase: getAccumulatedDailyStepsUseCase) + } +} diff --git a/petWalk/petWalkWatchKitExtension/Design/ViewModel/PetDataViewModel.swift b/petWalk/petWalkWatchKitExtension/Design/ViewModel/PetDataViewModel.swift new file mode 100644 index 0000000..38495dd --- /dev/null +++ b/petWalk/petWalkWatchKitExtension/Design/ViewModel/PetDataViewModel.swift @@ -0,0 +1,23 @@ +// +// PetDataViewModel.swift +// petWalkWatchKitExtension +// +// Created by Galera, Javier on 17/3/22. +// + +import Foundation + +class PetDataViewModel: ObservableObject { + @Published var animationDailySteps: Int = 0 + + private var getAccumulatedDailyStepsUseCase: GetAccumulatedDailyStepsUseCase + + init(getAccumulatedDailyStepsUseCase: GetAccumulatedDailyStepsUseCase) { + self.getAccumulatedDailyStepsUseCase = getAccumulatedDailyStepsUseCase + } + + func calculateAnimationDailySteps(_ steps: Int) { + let accumulatedDailySteps = self.getAccumulatedDailyStepsUseCase.execute() + self.animationDailySteps = steps - accumulatedDailySteps + } +} diff --git a/petWalk/petWalkWatchKitExtension/Design/ViewModel/ContentViewConfigurator.swift b/petWalk/petWalkWatchKitExtension/Design/ViewModel/PetViewConfigurator.swift similarity index 76% rename from petWalk/petWalkWatchKitExtension/Design/ViewModel/ContentViewConfigurator.swift rename to petWalk/petWalkWatchKitExtension/Design/ViewModel/PetViewConfigurator.swift index 71ae207..787b00b 100644 --- a/petWalk/petWalkWatchKitExtension/Design/ViewModel/ContentViewConfigurator.swift +++ b/petWalk/petWalkWatchKitExtension/Design/ViewModel/PetViewConfigurator.swift @@ -7,8 +7,8 @@ import Foundation -class ContentViewConfigurator { - @MainActor func configure() -> ContentViewModel { +class PetViewConfigurator { + @MainActor func configure() -> PetViewModel { let healthStoreDataSource = HealthStoreDataSourceImplementation() let healthStoreRepository = HealthStoreRepositoryImplementation(dataSource: healthStoreDataSource) @@ -18,15 +18,15 @@ class ContentViewConfigurator { let userDefaultDataSource = UserDefaultsDataSourceImplementation() let userDefaultRepository = UserDefaultsRepositoryImplementation(userDefaultDataSource: userDefaultDataSource) - let saveDailyStepsUseCase = SaveDailyStepsUseCaseImplementation(repository: userDefaultRepository) + let saveAccumulatedDailyStepsUseCase = SaveAccumulatedDailyStepsUseCaseImplementation(repository: userDefaultRepository) let saveTotalStepsUseCase = SaveTotalStepsUseCaseImplementation(repository: userDefaultRepository) let getAccumulatedDailyStepsUseCase = GetAccumulatedDailyStepsUseCaseImplementation(repository: userDefaultRepository) - return ContentViewModel(requestDailyStepsPermissionUseCase: requestDailyStepsPermissionUseCase, - saveDailyStepsUseCase: saveDailyStepsUseCase, + return PetViewModel(requestDailyStepsPermissionUseCase: requestDailyStepsPermissionUseCase, + saveAccumulatedDailyStepsUseCase: saveAccumulatedDailyStepsUseCase, saveTotalDailyStepsUseCase: saveTotalStepsUseCase, getDailyStepsUseCase: getDailyStepsUseCase, getAccumulatedDailyStepsUseCase: getAccumulatedDailyStepsUseCase) diff --git a/petWalk/petWalkWatchKitExtension/Design/ViewModel/ContentViewModel.swift b/petWalk/petWalkWatchKitExtension/Design/ViewModel/PetViewModel.swift similarity index 71% rename from petWalk/petWalkWatchKitExtension/Design/ViewModel/ContentViewModel.swift rename to petWalk/petWalkWatchKitExtension/Design/ViewModel/PetViewModel.swift index c0dbccd..37cd51b 100644 --- a/petWalk/petWalkWatchKitExtension/Design/ViewModel/ContentViewModel.swift +++ b/petWalk/petWalkWatchKitExtension/Design/ViewModel/PetViewModel.swift @@ -8,19 +8,19 @@ import Foundation @MainActor -class ContentViewModel: ObservableObject { +class PetViewModel: ObservableObject { @Published var currentSteps: Int = 0 var animationDailySteps: Int = 0 private var requestDailyStepsPermissionUseCase: RequestDailyStepsPermissionUseCase - private var saveDailyStepsUseCase: SaveDailyStepsUseCase + private var saveAccumulatedDailyStepsUseCase: SaveAccumulatedDailyStepsUseCase private var saveTotalDailyStepsUseCase: SaveTotalStepsUseCase private var getDailyStepsUseCase: GetDailyStepsUseCase private var getAccumulatedDailyStepsUseCase: GetAccumulatedDailyStepsUseCase - init(requestDailyStepsPermissionUseCase: RequestDailyStepsPermissionUseCase, saveDailyStepsUseCase: SaveDailyStepsUseCase, saveTotalDailyStepsUseCase: SaveTotalStepsUseCase, getDailyStepsUseCase: GetDailyStepsUseCase, getAccumulatedDailyStepsUseCase: GetAccumulatedDailyStepsUseCase) { + init(requestDailyStepsPermissionUseCase: RequestDailyStepsPermissionUseCase, saveAccumulatedDailyStepsUseCase: SaveAccumulatedDailyStepsUseCase, saveTotalDailyStepsUseCase: SaveTotalStepsUseCase, getDailyStepsUseCase: GetDailyStepsUseCase, getAccumulatedDailyStepsUseCase: GetAccumulatedDailyStepsUseCase) { self.requestDailyStepsPermissionUseCase = requestDailyStepsPermissionUseCase - self.saveDailyStepsUseCase = saveDailyStepsUseCase + self.saveAccumulatedDailyStepsUseCase = saveAccumulatedDailyStepsUseCase self.saveTotalDailyStepsUseCase = saveTotalDailyStepsUseCase self.getDailyStepsUseCase = getDailyStepsUseCase self.getAccumulatedDailyStepsUseCase = getAccumulatedDailyStepsUseCase @@ -32,15 +32,16 @@ class ContentViewModel: ObservableObject { if permission { try await getDailySteps() } + // TODO: Manage no permission } catch { print (error) } } - func getDailySteps() async throws { + func getDailySteps() async throws { // TODO: Probably this should be on PetDataViewModel let steps = try await getDailyStepsUseCase.execute() calculateAnimationDailySteps(steps) - saveDailyStepsUseCase.execute(steps) + saveAccumulatedDailyStepsUseCase.execute(steps) saveTotalDailyStepsUseCase.execute(steps) currentSteps = steps } diff --git a/petWalk/petWalkWatchKitExtension/Design/petWalkApp.swift b/petWalk/petWalkWatchKitExtension/Design/petWalkApp.swift index 196306c..e1c1c55 100644 --- a/petWalk/petWalkWatchKitExtension/Design/petWalkApp.swift +++ b/petWalk/petWalkWatchKitExtension/Design/petWalkApp.swift @@ -10,11 +10,10 @@ import SwiftUI @main struct petWalkApp: App { - var body: some Scene { WindowGroup { NavigationView { - ContentView() + PetView() } } } diff --git a/petWalk/petWalkWatchKitExtension/Domain/UseCase/SaveDailyStepsUseCase.swift b/petWalk/petWalkWatchKitExtension/Domain/UseCase/SaveAccumulatedDailyStepsUseCase.swift similarity index 59% rename from petWalk/petWalkWatchKitExtension/Domain/UseCase/SaveDailyStepsUseCase.swift rename to petWalk/petWalkWatchKitExtension/Domain/UseCase/SaveAccumulatedDailyStepsUseCase.swift index b3a2ca7..074dca4 100644 --- a/petWalk/petWalkWatchKitExtension/Domain/UseCase/SaveDailyStepsUseCase.swift +++ b/petWalk/petWalkWatchKitExtension/Domain/UseCase/SaveAccumulatedDailyStepsUseCase.swift @@ -1,10 +1,10 @@ import Foundation -protocol SaveDailyStepsUseCase: AutoMockable { +protocol SaveAccumulatedDailyStepsUseCase: AutoMockable { func execute(_ steps: Int) } -class SaveDailyStepsUseCaseImplementation: SaveDailyStepsUseCase { +class SaveAccumulatedDailyStepsUseCaseImplementation: SaveAccumulatedDailyStepsUseCase { private var repository: UserDefaultsRepository public init(repository: UserDefaultsRepository) { @@ -12,7 +12,7 @@ class SaveDailyStepsUseCaseImplementation: SaveDailyStepsUseCase { } func execute(_ steps: Int) { - repository.saveDailySteps(steps) + repository.saveAccumulatedDailySteps(steps) repository.saveDateDailySteps(Date()) } }