diff --git a/Andromida.xcodeproj/project.pbxproj b/Andromida.xcodeproj/project.pbxproj
index 5ad6319..6d4cc78 100644
--- a/Andromida.xcodeproj/project.pbxproj
+++ b/Andromida.xcodeproj/project.pbxproj
@@ -449,7 +449,7 @@
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
- DEVELOPMENT_TEAM = 6R7KLBPBLZ;
+ DEVELOPMENT_TEAM = "$(DEVELOPMENT_TEAM)";
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
ENABLE_USER_SCRIPT_SANDBOXING = YES;
@@ -561,8 +561,8 @@
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.1;
- PRODUCT_BUNDLE_IDENTIFIER = com.mbrucedogs.Andromida;
- PRODUCT_NAME = "$(TARGET_NAME)";
+ PRODUCT_BUNDLE_IDENTIFIER = "$(APP_BUNDLE_IDENTIFIER)";
+ PRODUCT_NAME = "$(PRODUCT_NAME)";
STRING_CATALOG_GENERATE_SYMBOLS = YES;
SWIFT_APPROACHABLE_CONCURRENCY = YES;
SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor;
@@ -597,8 +597,8 @@
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.1;
- PRODUCT_BUNDLE_IDENTIFIER = com.mbrucedogs.Andromida;
- PRODUCT_NAME = "$(TARGET_NAME)";
+ PRODUCT_BUNDLE_IDENTIFIER = "$(APP_BUNDLE_IDENTIFIER)";
+ PRODUCT_NAME = "$(PRODUCT_NAME)";
STRING_CATALOG_GENERATE_SYMBOLS = YES;
SWIFT_APPROACHABLE_CONCURRENCY = YES;
SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor;
@@ -621,7 +621,7 @@
GENERATE_INFOPLIST_FILE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 26.2;
MARKETING_VERSION = 1.1;
- PRODUCT_BUNDLE_IDENTIFIER = com.mbrucedogs.AndromidaTests;
+ PRODUCT_BUNDLE_IDENTIFIER = "$(TESTS_BUNDLE_IDENTIFIER)";
PRODUCT_NAME = "$(TARGET_NAME)";
STRING_CATALOG_GENERATE_SYMBOLS = NO;
SWIFT_APPROACHABLE_CONCURRENCY = YES;
@@ -645,7 +645,7 @@
GENERATE_INFOPLIST_FILE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 26.2;
MARKETING_VERSION = 1.1;
- PRODUCT_BUNDLE_IDENTIFIER = com.mbrucedogs.AndromidaTests;
+ PRODUCT_BUNDLE_IDENTIFIER = "$(TESTS_BUNDLE_IDENTIFIER)";
PRODUCT_NAME = "$(TARGET_NAME)";
STRING_CATALOG_GENERATE_SYMBOLS = NO;
SWIFT_APPROACHABLE_CONCURRENCY = YES;
@@ -667,7 +667,7 @@
DEVELOPMENT_TEAM = 6R7KLBPBLZ;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.1;
- PRODUCT_BUNDLE_IDENTIFIER = com.mbrucedogs.AndromidaUITests;
+ PRODUCT_BUNDLE_IDENTIFIER = "$(UITESTS_BUNDLE_IDENTIFIER)";
PRODUCT_NAME = "$(TARGET_NAME)";
STRING_CATALOG_GENERATE_SYMBOLS = NO;
SWIFT_APPROACHABLE_CONCURRENCY = YES;
@@ -689,7 +689,7 @@
DEVELOPMENT_TEAM = 6R7KLBPBLZ;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.1;
- PRODUCT_BUNDLE_IDENTIFIER = com.mbrucedogs.AndromidaUITests;
+ PRODUCT_BUNDLE_IDENTIFIER = "$(UITESTS_BUNDLE_IDENTIFIER)";
PRODUCT_NAME = "$(TARGET_NAME)";
STRING_CATALOG_GENERATE_SYMBOLS = NO;
SWIFT_APPROACHABLE_CONCURRENCY = YES;
@@ -722,7 +722,7 @@
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 1.1;
- PRODUCT_BUNDLE_IDENTIFIER = com.mbrucedogs.Andromida.AndromidaWidget;
+ PRODUCT_BUNDLE_IDENTIFIER = "$(WIDGET_BUNDLE_IDENTIFIER)";
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
STRING_CATALOG_GENERATE_SYMBOLS = YES;
@@ -755,7 +755,7 @@
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 1.1;
- PRODUCT_BUNDLE_IDENTIFIER = com.mbrucedogs.Andromida.AndromidaWidget;
+ PRODUCT_BUNDLE_IDENTIFIER = "$(WIDGET_BUNDLE_IDENTIFIER)";
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
STRING_CATALOG_GENERATE_SYMBOLS = YES;
diff --git a/Andromida.xcodeproj/xcshareddata/xcschemes/Andromida.xcscheme b/Andromida.xcodeproj/xcshareddata/xcschemes/Andromida.xcscheme
index 3cf4e0b..54a2e7e 100644
--- a/Andromida.xcodeproj/xcshareddata/xcschemes/Andromida.xcscheme
+++ b/Andromida.xcodeproj/xcshareddata/xcschemes/Andromida.xcscheme
@@ -16,7 +16,7 @@
@@ -45,7 +45,7 @@
@@ -62,7 +62,7 @@
diff --git a/Andromida.xcodeproj/xcshareddata/xcschemes/AndromidaWidgetExtension.xcscheme b/Andromida.xcodeproj/xcshareddata/xcschemes/AndromidaWidgetExtension.xcscheme
index d761e6c..a912e3e 100644
--- a/Andromida.xcodeproj/xcshareddata/xcschemes/AndromidaWidgetExtension.xcscheme
+++ b/Andromida.xcodeproj/xcshareddata/xcschemes/AndromidaWidgetExtension.xcscheme
@@ -31,7 +31,7 @@
@@ -72,7 +72,7 @@
@@ -108,7 +108,7 @@
diff --git a/Andromida.xcodeproj/xcuserdata/mattbruce.xcuserdatad/xcschemes/xcschememanagement.plist b/Andromida.xcodeproj/xcuserdata/mattbruce.xcuserdatad/xcschemes/xcschememanagement.plist
index 0d92d80..406d7fe 100644
--- a/Andromida.xcodeproj/xcuserdata/mattbruce.xcuserdatad/xcschemes/xcschememanagement.plist
+++ b/Andromida.xcodeproj/xcuserdata/mattbruce.xcuserdatad/xcschemes/xcschememanagement.plist
@@ -9,6 +9,11 @@
orderHint
1
+ AndromidaTests.xcscheme_^#shared#^_
+
+ orderHint
+ 3
+
AndromidaWidgetExtension.xcscheme_^#shared#^_
orderHint
diff --git a/Andromida/AndromidaApp.swift b/Andromida/AndromidaApp.swift
index 64ca630..33d5c00 100644
--- a/Andromida/AndromidaApp.swift
+++ b/Andromida/AndromidaApp.swift
@@ -12,6 +12,7 @@ struct AndromidaApp: App {
/// Track if user just completed the wizard (to start on Rituals tab)
@State private var justCompletedWizard = false
+ @State private var isTransitioningToRoot = false
init() {
// Register app's color theme for Bedrock components
@@ -55,14 +56,13 @@ struct AndromidaApp: App {
if hasCompletedSetupWizard {
// Main app - start on Rituals tab if just completed wizard
- AppLaunchView(config: .rituals) {
- RootView(
- store: store,
- settingsStore: settingsStore,
- categoryStore: categoryStore,
- initialTab: justCompletedWizard ? .rituals : .today
- )
- }
+ RootView(
+ store: store,
+ settingsStore: settingsStore,
+ categoryStore: categoryStore,
+ initialTab: justCompletedWizard ? .rituals : .today
+ )
+ .transition(.opacity)
} else {
// First-run setup wizard
AppLaunchView(config: .rituals) {
@@ -72,7 +72,7 @@ struct AndromidaApp: App {
reminderScheduler: store.reminderScheduler,
onComplete: {
justCompletedWizard = true
- withAnimation {
+ withAnimation(.easeInOut(duration: 0.5)) {
hasCompletedSetupWizard = true
}
}
diff --git a/Andromida/App/Views/RootView.swift b/Andromida/App/Views/RootView.swift
index 56aadb3..3c225c4 100644
--- a/Andromida/App/Views/RootView.swift
+++ b/Andromida/App/Views/RootView.swift
@@ -9,7 +9,7 @@ struct RootView: View {
@State private var selectedTab: RootTab
@State private var analyticsPrewarmTask: Task?
@State private var isForegroundRefreshing = false
- @State private var isResumingFromBackground = true
+ @State private var isResumingFromBackground = false
private let foregroundRefreshMinimumSeconds: TimeInterval = 0.15
private let debugForegroundRefreshMinimumSeconds: TimeInterval = 0.8
private let debugForegroundRefreshKey = "debugForegroundRefreshNextForeground"
diff --git a/Andromida/Shared/Configuration/AppIdentifiers.swift b/Andromida/Shared/Configuration/AppIdentifiers.swift
index 3b68e0e..051592b 100644
--- a/Andromida/Shared/Configuration/AppIdentifiers.swift
+++ b/Andromida/Shared/Configuration/AppIdentifiers.swift
@@ -17,7 +17,14 @@ enum AppIdentifiers {
Bundle.main.bundleIdentifier ?? "com.mbrucedogs.Andromida"
}
+ // User-facing app name
+ static let appName: String = {
+ Bundle.main.object(forInfoDictionaryKey: "CFBundleDisplayName") as? String
+ ?? Bundle.main.object(forInfoDictionaryKey: "CFBundleName") as? String
+ ?? "Rituals"
+ }()
+
static var widgetBundleIdentifier: String {
- "\(bundleIdentifier).Widget"
+ "\(bundleIdentifier).AndromidaWidget"
}
}
diff --git a/Andromida/Shared/Configuration/Base.xcconfig b/Andromida/Shared/Configuration/Base.xcconfig
index 97e6070..48a76ce 100644
--- a/Andromida/Shared/Configuration/Base.xcconfig
+++ b/Andromida/Shared/Configuration/Base.xcconfig
@@ -6,20 +6,21 @@
// =============================================================================
COMPANY_IDENTIFIER = com.mbrucedogs
-APP_NAME = Andromida
-DEVELOPMENT_TEAM = // Add your Team ID here if needed
+BUNDLE_ID_NAME = Andromida
+PRODUCT_NAME = Rituals
+DEVELOPMENT_TEAM = 6R7KLBPBLZ
// =============================================================================
// DERIVED IDENTIFIERS - DO NOT EDIT
// =============================================================================
-APP_BUNDLE_IDENTIFIER = $(COMPANY_IDENTIFIER).$(APP_NAME)
+APP_BUNDLE_IDENTIFIER = $(COMPANY_IDENTIFIER).$(BUNDLE_ID_NAME)
WATCH_BUNDLE_IDENTIFIER = $(APP_BUNDLE_IDENTIFIER).watchkitapp
APPCLIP_BUNDLE_IDENTIFIER = $(APP_BUNDLE_IDENTIFIER).Clip
-WIDGET_BUNDLE_IDENTIFIER = $(APP_BUNDLE_IDENTIFIER).Widget
+WIDGET_BUNDLE_IDENTIFIER = $(APP_BUNDLE_IDENTIFIER).AndromidaWidget
INTENT_BUNDLE_IDENTIFIER = $(APP_BUNDLE_IDENTIFIER).Intent
-TESTS_BUNDLE_IDENTIFIER = $(COMPANY_IDENTIFIER).$(APP_NAME)Tests
-UITESTS_BUNDLE_IDENTIFIER = $(COMPANY_IDENTIFIER).$(APP_NAME)UITests
+TESTS_BUNDLE_IDENTIFIER = $(COMPANY_IDENTIFIER).$(BUNDLE_ID_NAME)Tests
+UITESTS_BUNDLE_IDENTIFIER = $(COMPANY_IDENTIFIER).$(BUNDLE_ID_NAME)UITests
-APP_GROUP_IDENTIFIER = group.$(COMPANY_IDENTIFIER).$(APP_NAME)
-CLOUDKIT_CONTAINER_IDENTIFIER = iCloud.$(COMPANY_IDENTIFIER).$(APP_NAME)
+APP_GROUP_IDENTIFIER = group.$(COMPANY_IDENTIFIER).$(BUNDLE_ID_NAME)
+CLOUDKIT_CONTAINER_IDENTIFIER = iCloud.$(COMPANY_IDENTIFIER).$(BUNDLE_ID_NAME)
diff --git a/AndromidaWidget/Info.plist b/AndromidaWidget/Info.plist
index e6e0a7d..74a8d99 100644
--- a/AndromidaWidget/Info.plist
+++ b/AndromidaWidget/Info.plist
@@ -7,9 +7,9 @@
NSExtensionPointIdentifier
com.apple.widgetkit-extension
- AppGroupIdentifier
- $(APP_GROUP_IDENTIFIER)
CloudKitContainerIdentifier
$(CLOUDKIT_CONTAINER_IDENTIFIER)
+ AppGroupIdentifier
+ $(APP_GROUP_IDENTIFIER)