feat: redesign player with Dynamic Island, compact timer, and fix Live Activity timer drift #2

Merged
millianlmx merged 18 commits from revamp-timer-video-layout into main 2026-05-23 12:24:34 +02:00
Showing only changes of commit 918e663dbf - Show all commits

View File

@@ -32,6 +32,7 @@
5A402D7E31059AB7107B625C /* MusicPlayerViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5505FBD6E001AE3AFD413ADA /* MusicPlayerViewModel.swift */; };
5B01ABC32F9B8FFD006E707D /* MusicActivityAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B01ABC22F9B8FFD006E707D /* MusicActivityAttributes.swift */; };
5B01ABC82F9B90AF006E707D /* ActivityKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5B01ABC62F9B909E006E707D /* ActivityKit.framework */; };
5B10095D2FB7B6EC0033DE89 /* MockPrograms 2.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B10095C2FB7B6EC0033DE89 /* MockPrograms 2.swift */; };
5CE2F2210BEF17AC304F2AC2 /* HealthSnapshot.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1DE8A4DAD846A879B8ED379 /* HealthSnapshot.swift */; };
60503F963221C7FCF719C493 /* ActivityTab.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84123E854DE0BF3E0D4F0912 /* ActivityTab.swift */; };
6060D95D485E4188EAABDDED /* WatchRootView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AEC37E6361DC4C7AE326139 /* WatchRootView.swift */; };
@@ -53,6 +54,13 @@
996E613C0A9906AB88D2AEB6 /* WorkoutCalendarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FAEBB2380DAC8F565F556D41 /* WorkoutCalendarView.swift */; };
9F9695303EEC1516B1845417 /* TabataGoWatchApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9006191EE89D06E6558786E3 /* TabataGoWatchApp.swift */; };
AA17AD2E25DF408ECE100F99 /* PreviewData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7482C05380DE017FF582C28B /* PreviewData.swift */; };
AAA001AAA001AAA001AAA001 /* MusicActivityAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B01ABC22F9B8FFD006E707D /* MusicActivityAttributes.swift */; };
AAA002AAA002AAA002AAA002 /* MusicLiveActivity.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBB001BBB001BBB001BBB001 /* MusicLiveActivity.swift */; };
AAA003AAA003AAA003AAA003 /* TabataGoWidgetBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBB002BBB002BBB002BBB002 /* TabataGoWidgetBundle.swift */; };
AAA004AAA004AAA004AAA004 /* TabataGoWidget.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = BBB004BBB004BBB004BBB004 /* TabataGoWidget.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
AAA005AAA005AAA005AAA005 /* WorkoutActivityAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBB005BBB005BBB005BBB005 /* WorkoutActivityAttributes.swift */; };
AAA006AAA006AAA006AAA006 /* WorkoutActivityAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBB005BBB005BBB005BBB005 /* WorkoutActivityAttributes.swift */; };
AAA007AAA007AAA007AAA007 /* WorkoutLiveActivity.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBB006BBB006BBB006BBB006 /* WorkoutLiveActivity.swift */; };
B4CFD4E752EF66F6535AD173 /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 815C7C1CC22063B7E27F2F9B /* SettingsView.swift */; };
B5591230E8B61A2B18F5DD87 /* WatchConnectivityTypes.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8425C668A3901B0F12DBFCD /* WatchConnectivityTypes.swift */; };
B60D023230A8BA995A812FC3 /* PhoneConnectivityManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25FD149C9626FEC155E8C72E /* PhoneConnectivityManager.swift */; };
@@ -74,13 +82,6 @@
F80248DC6213339BC8F9C9A2 /* TabataGoComplication.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDA5D50FD057EF30BE7915F5 /* TabataGoComplication.swift */; };
FD47EC832E23E0AF1D6FFE47 /* PolicyViews.swift in Sources */ = {isa = PBXBuildFile; fileRef = 525C7E8EC6EF89E00D34672E /* PolicyViews.swift */; };
FE14257B8CFFDC47C72AE079 /* HealthViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63599808389B70FC2F6A43C3 /* HealthViewModel.swift */; };
AAA001AAA001AAA001AAA001 /* MusicActivityAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B01ABC22F9B8FFD006E707D /* MusicActivityAttributes.swift */; };
AAA002AAA002AAA002AAA002 /* MusicLiveActivity.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBB001BBB001BBB001BBB001 /* MusicLiveActivity.swift */; };
AAA003AAA003AAA003AAA003 /* TabataGoWidgetBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBB002BBB002BBB002BBB002 /* TabataGoWidgetBundle.swift */; };
AAA004AAA004AAA004AAA004 /* TabataGoWidget.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = BBB004BBB004BBB004BBB004 /* TabataGoWidget.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
AAA005AAA005AAA005AAA005 /* WorkoutActivityAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBB005BBB005BBB005BBB005 /* WorkoutActivityAttributes.swift */; };
AAA006AAA006AAA006AAA006 /* WorkoutActivityAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBB005BBB005BBB005BBB005 /* WorkoutActivityAttributes.swift */; };
AAA007AAA007AAA007AAA007 /* WorkoutLiveActivity.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBB006BBB006BBB006BBB006 /* WorkoutLiveActivity.swift */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@@ -121,17 +122,7 @@
};
/* End PBXContainerItemProxy section */
DDD002DDD002DDD002DDD002 /* Embed App Extensions */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 13;
files = (
AAA004AAA004AAA004AAA004 /* TabataGoWidget.appex in Embed App Extensions */,
);
name = "Embed App Extensions";
runOnlyForDeploymentPostprocessing = 0;
};
/* Begin PBXCopyFilesBuildPhase section */
76FE977236B376F31232D242 /* Embed Watch Content */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
@@ -154,6 +145,17 @@
name = "Embed Foundation Extensions";
runOnlyForDeploymentPostprocessing = 0;
};
DDD002DDD002DDD002DDD002 /* Embed App Extensions */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 13;
files = (
AAA004AAA004AAA004AAA004 /* TabataGoWidget.appex in Embed App Extensions */,
);
name = "Embed App Extensions";
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
@@ -181,6 +183,7 @@
5ACBDB7D81F575AC5370E82F /* WatchL10n.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchL10n.swift; sourceTree = "<group>"; };
5B01ABC22F9B8FFD006E707D /* MusicActivityAttributes.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MusicActivityAttributes.swift; sourceTree = "<group>"; };
5B01ABC62F9B909E006E707D /* ActivityKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ActivityKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS26.4.sdk/System/Library/Frameworks/ActivityKit.framework; sourceTree = DEVELOPER_DIR; };
5B10095C2FB7B6EC0033DE89 /* MockPrograms 2.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MockPrograms 2.swift"; sourceTree = "<group>"; };
5F5D3568A736B7A326874677 /* Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = Localizable.xcstrings; sourceTree = "<group>"; };
61E5AA44513F793EA7FEBA00 /* Theme.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Theme.swift; sourceTree = "<group>"; };
63599808389B70FC2F6A43C3 /* HealthViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HealthViewModel.swift; sourceTree = "<group>"; };
@@ -208,6 +211,12 @@
B6E64CFB210A549AC85F878D /* WorkoutProgram.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkoutProgram.swift; sourceTree = "<group>"; };
B7EDA5BF7F25E3279A4B1A61 /* TabataGoUITests.xctest */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.cfbundle; path = TabataGoUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
B8E005D62F3B3B80A2A53C2C /* PurchaseViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PurchaseViewModel.swift; sourceTree = "<group>"; };
BBB001BBB001BBB001BBB001 /* MusicLiveActivity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MusicLiveActivity.swift; sourceTree = "<group>"; };
BBB002BBB002BBB002BBB002 /* TabataGoWidgetBundle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabataGoWidgetBundle.swift; sourceTree = "<group>"; };
BBB003BBB003BBB003BBB003 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
BBB004BBB004BBB004BBB004 /* TabataGoWidget.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = TabataGoWidget.appex; sourceTree = BUILT_PRODUCTS_DIR; };
BBB005BBB005BBB005BBB005 /* WorkoutActivityAttributes.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkoutActivityAttributes.swift; sourceTree = "<group>"; };
BBB006BBB006BBB006BBB006 /* WorkoutLiveActivity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkoutLiveActivity.swift; sourceTree = "<group>"; };
BBBBFC7FC6A52DE9908EE4A6 /* WorkoutSession.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkoutSession.swift; sourceTree = "<group>"; };
BD3DF875E3461305DADB554A /* Secrets.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Secrets.xcconfig; sourceTree = "<group>"; };
C4C127C41584515D4EF95CB0 /* Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = Localizable.xcstrings; sourceTree = "<group>"; };
@@ -228,12 +237,6 @@
F8242C26A4F51BE7AA779840 /* RootView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RootView.swift; sourceTree = "<group>"; };
FAEBB2380DAC8F565F556D41 /* WorkoutCalendarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkoutCalendarView.swift; sourceTree = "<group>"; };
FB04FA5E81BD1E52DEFB3AC2 /* HomeTab.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeTab.swift; sourceTree = "<group>"; };
BBB001BBB001BBB001BBB001 /* MusicLiveActivity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MusicLiveActivity.swift; sourceTree = "<group>"; };
BBB002BBB002BBB002BBB002 /* TabataGoWidgetBundle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabataGoWidgetBundle.swift; sourceTree = "<group>"; };
BBB003BBB003BBB003BBB003 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
BBB004BBB004BBB004BBB004 /* TabataGoWidget.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = TabataGoWidget.appex; sourceTree = BUILT_PRODUCTS_DIR; };
BBB005BBB005BBB005BBB005 /* WorkoutActivityAttributes.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkoutActivityAttributes.swift; sourceTree = "<group>"; };
BBB006BBB006BBB006BBB006 /* WorkoutLiveActivity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkoutLiveActivity.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -482,6 +485,17 @@
path = Programs;
sourceTree = "<group>";
};
CCC001CCC001CCC001CCC001 /* TabataGoWidget */ = {
isa = PBXGroup;
children = (
BBB003BBB003BBB003BBB003 /* Info.plist */,
BBB001BBB001BBB001BBB001 /* MusicLiveActivity.swift */,
BBB002BBB002BBB002BBB002 /* TabataGoWidgetBundle.swift */,
BBB006BBB006BBB006BBB006 /* WorkoutLiveActivity.swift */,
);
path = TabataGoWidget;
sourceTree = "<group>";
};
CD710A86C04A7CE744A97D63 /* ViewModels */ = {
isa = PBXGroup;
children = (
@@ -494,17 +508,6 @@
path = ViewModels;
sourceTree = "<group>";
};
CCC001CCC001CCC001CCC001 /* TabataGoWidget */ = {
isa = PBXGroup;
children = (
BBB003BBB003BBB003BBB003 /* Info.plist */,
BBB001BBB001BBB001BBB001 /* MusicLiveActivity.swift */,
BBB002BBB002BBB002BBB002 /* TabataGoWidgetBundle.swift */,
BBB006BBB006BBB006BBB006 /* WorkoutLiveActivity.swift */,
);
path = TabataGoWidget;
sourceTree = "<group>";
};
CE5E34713E694FAEED0F3480 /* Utilities */ = {
isa = PBXGroup;
children = (
@@ -545,6 +548,7 @@
DC96ED5F68F75A02548ECD40 /* Models */ = {
isa = PBXGroup;
children = (
5B10095C2FB7B6EC0033DE89 /* MockPrograms 2.swift */,
F1DE8A4DAD846A879B8ED379 /* HealthSnapshot.swift */,
2C6156C6E0E1A543DAC87A90 /* MusicTrack.swift */,
7482C05380DE017FF582C28B /* PreviewData.swift */,
@@ -630,23 +634,6 @@
productReference = 255972F9906563A0921C47C0 /* TabataGoWatchWidget.appex */;
productType = "com.apple.product-type.app-extension";
};
EEE001EEE001EEE001EEE001 /* TabataGoWidget */ = {
isa = PBXNativeTarget;
buildConfigurationList = III001III001III001III001 /* Build configuration list for PBXNativeTarget "TabataGoWidget" */;
buildPhases = (
DDD001DDD001DDD001DDD001 /* Sources */,
);
buildRules = (
);
dependencies = (
);
name = TabataGoWidget;
packageProductDependencies = (
);
productName = TabataGoWidget;
productReference = BBB004BBB004BBB004BBB004 /* TabataGoWidget.appex */;
productType = "com.apple.product-type.app-extension";
};
92991789C3A5B2A5FACF07A1 /* TabataGo */ = {
isa = PBXNativeTarget;
buildConfigurationList = D920067B8306F17FB19B987C /* Build configuration list for PBXNativeTarget "TabataGo" */;
@@ -709,6 +696,23 @@
productReference = B7EDA5BF7F25E3279A4B1A61 /* TabataGoUITests.xctest */;
productType = "com.apple.product-type.bundle.ui-testing";
};
EEE001EEE001EEE001EEE001 /* TabataGoWidget */ = {
isa = PBXNativeTarget;
buildConfigurationList = III001III001III001III001 /* Build configuration list for PBXNativeTarget "TabataGoWidget" */;
buildPhases = (
DDD001DDD001DDD001DDD001 /* Sources */,
);
buildRules = (
);
dependencies = (
);
name = TabataGoWidget;
packageProductDependencies = (
);
productName = TabataGoWidget;
productReference = BBB004BBB004BBB004BBB004 /* TabataGoWidget.appex */;
productType = "com.apple.product-type.app-extension";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
@@ -814,6 +818,7 @@
files = (
22669D283A2B7C8D5F4FE19F /* ActivityRingView.swift in Sources */,
60503F963221C7FCF719C493 /* ActivityTab.swift in Sources */,
5B10095D2FB7B6EC0033DE89 /* MockPrograms 2.swift in Sources */,
CCCCEFD2D61ED1D7DDB9040C /* AnalyticsService.swift in Sources */,
EE6C591611D52C36ED5E03C6 /* AppState.swift in Sources */,
14578A06877E3D67A49650A9 /* AudioService.swift in Sources */,
@@ -862,6 +867,14 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
D7CD98EDC444042E53355A5B /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
18E74EE69364472DA7F0D9EC /* TabataGoUITests.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
DDD001DDD001DDD001DDD001 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
@@ -874,14 +887,6 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
D7CD98EDC444042E53355A5B /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
18E74EE69364472DA7F0D9EC /* TabataGoUITests.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
@@ -950,6 +955,7 @@
3DD4336C0CCAAAFD3B5F30DF /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
DEVELOPMENT_TEAM = 2MJF39L8VY;
INFOPLIST_FILE = TabataGoWatch/Complications/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
@@ -967,6 +973,7 @@
44F45541FA6C5BFE5CCF517D /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
DEVELOPMENT_TEAM = 2MJF39L8VY;
INFOPLIST_FILE = TabataGoWatch/Complications/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
@@ -1111,6 +1118,7 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_ENTITLEMENTS = TabataGoWatch/Resources/TabataGoWatch.entitlements;
DEVELOPMENT_TEAM = 2MJF39L8VY;
ENABLE_PREVIEWS = YES;
INFOPLIST_FILE = TabataGoWatch/Resources/Info.plist;
PRODUCT_BUNDLE_IDENTIFIER = com.tabatago.app.watchkitapp;
@@ -1143,6 +1151,7 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_ENTITLEMENTS = TabataGoWatch/Resources/TabataGoWatch.entitlements;
DEVELOPMENT_TEAM = 2MJF39L8VY;
ENABLE_PREVIEWS = YES;
INFOPLIST_FILE = TabataGoWatch/Resources/Info.plist;
PRODUCT_BUNDLE_IDENTIFIER = com.tabatago.app.watchkitapp;
@@ -1210,9 +1219,6 @@
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
HHH001HHH001HHH001HHH001 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
@@ -1226,8 +1232,8 @@
"@executable_path/../../Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.tabatago.app.widget;
SKIP_INSTALL = YES;
SDKROOT = iphoneos;
SKIP_INSTALL = YES;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
@@ -1245,8 +1251,8 @@
"@executable_path/../../Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.tabatago.app.widget;
SKIP_INSTALL = YES;
SDKROOT = iphoneos;
SKIP_INSTALL = YES;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Release;