From 590e1592da1852729eda0fb270842d2ed522dd54 Mon Sep 17 00:00:00 2001 From: Johannes Millan Date: Mon, 12 Jan 2026 15:26:01 +0100 Subject: [PATCH] feat(ios): add iOS platform support via Capacitor Add iOS MVP with core functionality using Capacitor-first approach: Platform Abstraction Layer: - Add CapacitorPlatformService for unified platform detection - Add PlatformCapabilities model with per-platform feature flags - Add CapacitorNotificationService wrapping LocalNotifications plugin - Add CapacitorReminderService for cross-platform reminder scheduling iOS Support: - Add Capacitor iOS project with proper configuration - Configure Info.plist for notifications and background modes - Add app icon and splash screen assets - Enable CapacitorHttp for WebDAV sync (avoids CORS issues) Refactoring: - Update android.effects.ts to use CapacitorReminderService - Update notify.service.ts to support iOS notifications - Update startup.service.ts with platform-aware initialization - Update sync-form.const.ts to hide CORS info on native platforms - Update webdav-http-adapter.ts to use CapacitorHttp on iOS MVP includes: task management, scheduled notifications, Dropbox sync, WebDAV sync, share-out, dark mode. Excludes: background tracking, widgets, local file sync, share-in (post-MVP features). --- capacitor.config.ts | 11 +- ios/.gitignore | 13 + ios/App/App.xcodeproj/project.pbxproj | 408 ++++++++++++++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 + ios/App/App/AppDelegate.swift | 49 +++ .../AppIcon.appiconset/AppIcon-512@2x.png | Bin 0 -> 112225 bytes .../AppIcon.appiconset/Contents.json | 14 + ios/App/App/Assets.xcassets/Contents.json | 6 + .../Splash.imageset/Contents.json | 23 + .../Splash.imageset/splash-2732x2732-1.png | Bin 0 -> 49143 bytes .../Splash.imageset/splash-2732x2732-2.png | Bin 0 -> 49143 bytes .../Splash.imageset/splash-2732x2732.png | Bin 0 -> 49143 bytes .../App/Base.lproj/LaunchScreen.storyboard | 32 ++ ios/App/App/Base.lproj/Main.storyboard | 19 + ios/App/App/Info.plist | 56 +++ ios/App/Podfile | 28 ++ package-lock.json | 11 +- package.json | 1 + src/app/core/notify/notify.service.ts | 59 ++- .../capacitor-notification.service.spec.ts | 143 ++++++ .../capacitor-notification.service.ts | 235 ++++++++++ .../capacitor-platform.service.spec.ts | 64 +++ .../platform/capacitor-platform.service.ts | 169 ++++++++ .../capacitor-reminder.service.spec.ts | 185 ++++++++ .../platform/capacitor-reminder.service.ts | 228 ++++++++++ src/app/core/platform/index.ts | 4 + .../platform/platform-capabilities.model.ts | 124 ++++++ src/app/core/startup/startup.service.ts | 16 +- .../features/android/store/android.effects.ts | 100 ++--- .../config/form-cfgs/sync-form.const.ts | 4 +- .../file-based/webdav/webdav-http-adapter.ts | 22 +- src/app/util/is-native-platform.ts | 19 + 32 files changed, 1942 insertions(+), 109 deletions(-) create mode 100644 ios/.gitignore create mode 100644 ios/App/App.xcodeproj/project.pbxproj create mode 100644 ios/App/App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 ios/App/App/AppDelegate.swift create mode 100644 ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png create mode 100644 ios/App/App/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 ios/App/App/Assets.xcassets/Contents.json create mode 100644 ios/App/App/Assets.xcassets/Splash.imageset/Contents.json create mode 100644 ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-1.png create mode 100644 ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-2.png create mode 100644 ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732.png create mode 100644 ios/App/App/Base.lproj/LaunchScreen.storyboard create mode 100644 ios/App/App/Base.lproj/Main.storyboard create mode 100644 ios/App/App/Info.plist create mode 100644 ios/App/Podfile create mode 100644 src/app/core/platform/capacitor-notification.service.spec.ts create mode 100644 src/app/core/platform/capacitor-notification.service.ts create mode 100644 src/app/core/platform/capacitor-platform.service.spec.ts create mode 100644 src/app/core/platform/capacitor-platform.service.ts create mode 100644 src/app/core/platform/capacitor-reminder.service.spec.ts create mode 100644 src/app/core/platform/capacitor-reminder.service.ts create mode 100644 src/app/core/platform/index.ts create mode 100644 src/app/core/platform/platform-capabilities.model.ts create mode 100644 src/app/util/is-native-platform.ts diff --git a/capacitor.config.ts b/capacitor.config.ts index 9f030fbeb..3532a3215 100644 --- a/capacitor.config.ts +++ b/capacitor.config.ts @@ -2,16 +2,25 @@ import type { CapacitorConfig } from '@capacitor/cli'; const config: CapacitorConfig = { appId: 'com.superproductivity.superproductivity', - appName: 'super-productivity', + appName: 'Super Productivity', webDir: 'dist/browser', plugins: { CapacitorHttp: { enabled: true, }, LocalNotifications: { + // Android-specific: small icon for notification smallIcon: 'ic_stat_sp', }, }, + ios: { + // Content inset for safe areas (notch, home indicator) + contentInset: 'automatic', + // Allow inline media playback + allowsLinkPreview: true, + // Scroll behavior + scrollEnabled: true, + }, }; export default config; diff --git a/ios/.gitignore b/ios/.gitignore new file mode 100644 index 000000000..f47029973 --- /dev/null +++ b/ios/.gitignore @@ -0,0 +1,13 @@ +App/build +App/Pods +App/output +App/App/public +DerivedData +xcuserdata + +# Cordova plugins for Capacitor +capacitor-cordova-ios-plugins + +# Generated Config files +App/App/capacitor.config.json +App/App/config.xml diff --git a/ios/App/App.xcodeproj/project.pbxproj b/ios/App/App.xcodeproj/project.pbxproj new file mode 100644 index 000000000..f9e7370f2 --- /dev/null +++ b/ios/App/App.xcodeproj/project.pbxproj @@ -0,0 +1,408 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 48; + objects = { + +/* Begin PBXBuildFile section */ + 2FAD9763203C412B000D30F8 /* config.xml in Resources */ = {isa = PBXBuildFile; fileRef = 2FAD9762203C412B000D30F8 /* config.xml */; }; + 50379B232058CBB4000EE86E /* capacitor.config.json in Resources */ = {isa = PBXBuildFile; fileRef = 50379B222058CBB4000EE86E /* capacitor.config.json */; }; + 504EC3081FED79650016851F /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504EC3071FED79650016851F /* AppDelegate.swift */; }; + 504EC30D1FED79650016851F /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 504EC30B1FED79650016851F /* Main.storyboard */; }; + 504EC30F1FED79650016851F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 504EC30E1FED79650016851F /* Assets.xcassets */; }; + 504EC3121FED79650016851F /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 504EC3101FED79650016851F /* LaunchScreen.storyboard */; }; + 50B271D11FEDC1A000F3C39B /* public in Resources */ = {isa = PBXBuildFile; fileRef = 50B271D01FEDC1A000F3C39B /* public */; }; + A084ECDBA7D38E1E42DFC39D /* Pods_App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF277DCFFFF123FFC6DF26C7 /* Pods_App.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 2FAD9762203C412B000D30F8 /* config.xml */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = config.xml; sourceTree = ""; }; + 50379B222058CBB4000EE86E /* capacitor.config.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = capacitor.config.json; sourceTree = ""; }; + 504EC3041FED79650016851F /* App.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = App.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 504EC3071FED79650016851F /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 504EC30C1FED79650016851F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 504EC30E1FED79650016851F /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 504EC3111FED79650016851F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 504EC3131FED79650016851F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 50B271D01FEDC1A000F3C39B /* public */ = {isa = PBXFileReference; lastKnownFileType = folder; path = public; sourceTree = ""; }; + AF277DCFFFF123FFC6DF26C7 /* Pods_App.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_App.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + AF51FD2D460BCFE21FA515B2 /* Pods-App.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App.release.xcconfig"; path = "Pods/Target Support Files/Pods-App/Pods-App.release.xcconfig"; sourceTree = ""; }; + FC68EB0AF532CFC21C3344DD /* Pods-App.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App.debug.xcconfig"; path = "Pods/Target Support Files/Pods-App/Pods-App.debug.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 504EC3011FED79650016851F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + A084ECDBA7D38E1E42DFC39D /* Pods_App.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 27E2DDA53C4D2A4D1A88CE4A /* Frameworks */ = { + isa = PBXGroup; + children = ( + AF277DCFFFF123FFC6DF26C7 /* Pods_App.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 504EC2FB1FED79650016851F = { + isa = PBXGroup; + children = ( + 504EC3061FED79650016851F /* App */, + 504EC3051FED79650016851F /* Products */, + 7F8756D8B27F46E3366F6CEA /* Pods */, + 27E2DDA53C4D2A4D1A88CE4A /* Frameworks */, + ); + sourceTree = ""; + }; + 504EC3051FED79650016851F /* Products */ = { + isa = PBXGroup; + children = ( + 504EC3041FED79650016851F /* App.app */, + ); + name = Products; + sourceTree = ""; + }; + 504EC3061FED79650016851F /* App */ = { + isa = PBXGroup; + children = ( + 50379B222058CBB4000EE86E /* capacitor.config.json */, + 504EC3071FED79650016851F /* AppDelegate.swift */, + 504EC30B1FED79650016851F /* Main.storyboard */, + 504EC30E1FED79650016851F /* Assets.xcassets */, + 504EC3101FED79650016851F /* LaunchScreen.storyboard */, + 504EC3131FED79650016851F /* Info.plist */, + 2FAD9762203C412B000D30F8 /* config.xml */, + 50B271D01FEDC1A000F3C39B /* public */, + ); + path = App; + sourceTree = ""; + }; + 7F8756D8B27F46E3366F6CEA /* Pods */ = { + isa = PBXGroup; + children = ( + FC68EB0AF532CFC21C3344DD /* Pods-App.debug.xcconfig */, + AF51FD2D460BCFE21FA515B2 /* Pods-App.release.xcconfig */, + ); + name = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 504EC3031FED79650016851F /* App */ = { + isa = PBXNativeTarget; + buildConfigurationList = 504EC3161FED79650016851F /* Build configuration list for PBXNativeTarget "App" */; + buildPhases = ( + 6634F4EFEBD30273BCE97C65 /* [CP] Check Pods Manifest.lock */, + 504EC3001FED79650016851F /* Sources */, + 504EC3011FED79650016851F /* Frameworks */, + 504EC3021FED79650016851F /* Resources */, + 9592DBEFFC6D2A0C8D5DEB22 /* [CP] Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = App; + productName = App; + productReference = 504EC3041FED79650016851F /* App.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 504EC2FC1FED79650016851F /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0920; + LastUpgradeCheck = 0920; + TargetAttributes = { + 504EC3031FED79650016851F = { + CreatedOnToolsVersion = 9.2; + LastSwiftMigration = 1100; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 504EC2FF1FED79650016851F /* Build configuration list for PBXProject "App" */; + compatibilityVersion = "Xcode 8.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 504EC2FB1FED79650016851F; + packageReferences = ( + ); + productRefGroup = 504EC3051FED79650016851F /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 504EC3031FED79650016851F /* App */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 504EC3021FED79650016851F /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 504EC3121FED79650016851F /* LaunchScreen.storyboard in Resources */, + 50B271D11FEDC1A000F3C39B /* public in Resources */, + 504EC30F1FED79650016851F /* Assets.xcassets in Resources */, + 50379B232058CBB4000EE86E /* capacitor.config.json in Resources */, + 504EC30D1FED79650016851F /* Main.storyboard in Resources */, + 2FAD9763203C412B000D30F8 /* config.xml in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 6634F4EFEBD30273BCE97C65 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-App-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 9592DBEFFC6D2A0C8D5DEB22 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-App/Pods-App-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 504EC3001FED79650016851F /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 504EC3081FED79650016851F /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 504EC30B1FED79650016851F /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 504EC30C1FED79650016851F /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 504EC3101FED79650016851F /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 504EC3111FED79650016851F /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 504EC3141FED79650016851F /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 504EC3151FED79650016851F /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 504EC3171FED79650016851F /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = FC68EB0AF532CFC21C3344DD /* Pods-App.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + INFOPLIST_FILE = App/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + MARKETING_VERSION = 1.0; + OTHER_SWIFT_FLAGS = "$(inherited) \"-D\" \"COCOAPODS\" \"-DDEBUG\""; + PRODUCT_BUNDLE_IDENTIFIER = com.superproductivity.superproductivity; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 504EC3181FED79650016851F /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = AF51FD2D460BCFE21FA515B2 /* Pods-App.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + INFOPLIST_FILE = App/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.superproductivity.superproductivity; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = ""; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 504EC2FF1FED79650016851F /* Build configuration list for PBXProject "App" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 504EC3141FED79650016851F /* Debug */, + 504EC3151FED79650016851F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 504EC3161FED79650016851F /* Build configuration list for PBXNativeTarget "App" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 504EC3171FED79650016851F /* Debug */, + 504EC3181FED79650016851F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 504EC2FC1FED79650016851F /* Project object */; +} diff --git a/ios/App/App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/App/App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000..18d981003 --- /dev/null +++ b/ios/App/App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ios/App/App/AppDelegate.swift b/ios/App/App/AppDelegate.swift new file mode 100644 index 000000000..c3cd83b5c --- /dev/null +++ b/ios/App/App/AppDelegate.swift @@ -0,0 +1,49 @@ +import UIKit +import Capacitor + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + // Override point for customization after application launch. + return true + } + + func applicationWillResignActive(_ application: UIApplication) { + // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. + // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. + } + + func applicationDidEnterBackground(_ application: UIApplication) { + // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. + } + + func applicationWillEnterForeground(_ application: UIApplication) { + // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. + } + + func applicationDidBecomeActive(_ application: UIApplication) { + // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. + } + + func applicationWillTerminate(_ application: UIApplication) { + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. + } + + func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool { + // Called when the app was launched with a url. Feel free to add additional processing here, + // but if you want the App API to support tracking app url opens, make sure to keep this call + return ApplicationDelegateProxy.shared.application(app, open: url, options: options) + } + + func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool { + // Called when the app was launched with an activity, including Universal Links. + // Feel free to add additional processing here, but if you want the App API to support + // tracking app url opens, make sure to keep this call + return ApplicationDelegateProxy.shared.application(application, continue: userActivity, restorationHandler: restorationHandler) + } + +} diff --git a/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png b/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..cc4b54330ddf92c2f7d57e7b198c7e522045d404 GIT binary patch literal 112225 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�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 CdQn0E literal 0 HcmV?d00001 diff --git a/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-2.png b/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-2.png new file mode 100644 index 0000000000000000000000000000000000000000..75f8858157bfbe101867049c89939d1f2c2bbbf0 GIT binary patch literal 49143 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�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 CdQn0E literal 0 HcmV?d00001 diff --git a/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732.png b/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732.png new file mode 100644 index 0000000000000000000000000000000000000000..75f8858157bfbe101867049c89939d1f2c2bbbf0 GIT binary patch literal 49143 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�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 CdQn0E literal 0 HcmV?d00001 diff --git a/ios/App/App/Base.lproj/LaunchScreen.storyboard b/ios/App/App/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 000000000..e7ae5d780 --- /dev/null +++ b/ios/App/App/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/App/App/Base.lproj/Main.storyboard b/ios/App/App/Base.lproj/Main.storyboard new file mode 100644 index 000000000..b44df7be8 --- /dev/null +++ b/ios/App/App/Base.lproj/Main.storyboard @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/ios/App/App/Info.plist b/ios/App/App/Info.plist new file mode 100644 index 000000000..b65062ed3 --- /dev/null +++ b/ios/App/App/Info.plist @@ -0,0 +1,56 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + Super Productivity + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + $(MARKETING_VERSION) + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + NSUserNotificationsUsageDescription + Super Productivity uses notifications to remind you about tasks and scheduled events. + UIBackgroundModes + + fetch + remote-notification + + + diff --git a/ios/App/Podfile b/ios/App/Podfile new file mode 100644 index 000000000..9dfc79201 --- /dev/null +++ b/ios/App/Podfile @@ -0,0 +1,28 @@ +require_relative '../../node_modules/@capacitor/ios/scripts/pods_helpers' + +platform :ios, '14.0' +use_frameworks! + +# workaround to avoid Xcode caching of Pods that requires +# Product -> Clean Build Folder after new Cordova plugins installed +# Requires CocoaPods 1.6 or newer +install! 'cocoapods', :disable_input_output_paths => true + +def capacitor_pods + pod 'Capacitor', :path => '../../node_modules/@capacitor/ios' + pod 'CapacitorCordova', :path => '../../node_modules/@capacitor/ios' + pod 'CapacitorApp', :path => '../../node_modules/@capacitor/app' + pod 'CapacitorFilesystem', :path => '../../node_modules/@capacitor/filesystem' + pod 'CapacitorLocalNotifications', :path => '../../node_modules/@capacitor/local-notifications' + pod 'CapacitorShare', :path => '../../node_modules/@capacitor/share' + pod 'CapawesomeCapacitorBackgroundTask', :path => '../../node_modules/@capawesome/capacitor-background-task' +end + +target 'App' do + capacitor_pods + # Add your Pods here +end + +post_install do |installer| + assertDeploymentTarget(installer) +end diff --git a/package-lock.json b/package-lock.json index 2d67c5d7a..c9885f384 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,7 @@ "packages/*" ], "dependencies": { + "@capacitor/ios": "^7.4.4", "electron-dl": "^3.5.2", "electron-localshortcut": "^3.2.1", "electron-log": "^5.4.3", @@ -5826,7 +5827,6 @@ "version": "7.4.3", "resolved": "https://registry.npmjs.org/@capacitor/core/-/core-7.4.3.tgz", "integrity": "sha512-wCWr8fQ9Wxn0466vPg7nMn0tivbNVjNy1yL4GvDSIZuZx7UpU2HeVGNe9QjN/quEd+YLRFeKEBLBw619VqUiNg==", - "dev": true, "license": "MIT", "dependencies": { "tslib": "^2.1.0" @@ -5843,6 +5843,15 @@ "@capacitor/core": ">=7.0.0" } }, + "node_modules/@capacitor/ios": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@capacitor/ios/-/ios-7.4.4.tgz", + "integrity": "sha512-Xp3bGWlSQAwsZGngRMWTdoD2agdMV12Whnm+/xsYPxfQSj+Tksbr7r/8Mso7VWkpnTKO4iMlx762g3PjW+wi4w==", + "license": "MIT", + "peerDependencies": { + "@capacitor/core": "^7.4.0" + } + }, "node_modules/@capacitor/local-notifications": { "version": "7.0.1", "dev": true, diff --git a/package.json b/package.json index badc49887..e24f26cc6 100644 --- a/package.json +++ b/package.json @@ -136,6 +136,7 @@ "@ctrl/tinycolor": "4.1.0" }, "dependencies": { + "@capacitor/ios": "^7.4.4", "electron-dl": "^3.5.2", "electron-localshortcut": "^3.2.1", "electron-log": "^5.4.3", diff --git a/src/app/core/notify/notify.service.ts b/src/app/core/notify/notify.service.ts index af9b2a02b..4869b6515 100644 --- a/src/app/core/notify/notify.service.ts +++ b/src/app/core/notify/notify.service.ts @@ -5,10 +5,10 @@ import { IS_ELECTRON } from '../../app.constants'; import { IS_MOBILE } from '../../util/is-mobile'; import { TranslateService } from '@ngx-translate/core'; import { UiHelperService } from '../../features/ui-helper/ui-helper.service'; -import { IS_ANDROID_WEB_VIEW } from '../../util/is-android-web-view'; import { Log } from '../log'; -import { LocalNotifications } from '@capacitor/local-notifications'; import { generateNotificationId } from '../../features/android/android-notification-id.util'; +import { CapacitorNotificationService } from '../platform/capacitor-notification.service'; +import { CapacitorPlatformService } from '../platform/capacitor-platform.service'; @Injectable({ providedIn: 'root', @@ -16,6 +16,8 @@ import { generateNotificationId } from '../../features/android/android-notificat export class NotifyService { private _translateService = inject(TranslateService); private _uiHelperService = inject(UiHelperService); + private _platformService = inject(CapacitorPlatformService); + private _notificationService = inject(CapacitorNotificationService); async notifyDesktop(options: NotifyModel): Promise { if (!IS_MOBILE) { @@ -53,48 +55,29 @@ export class NotifyService { body, }); } - } else if (IS_ANDROID_WEB_VIEW) { + } else if (this._platformService.isNative) { + // Use Capacitor LocalNotifications for iOS and Android try { - // Check permissions - const checkResult = await LocalNotifications.checkPermissions(); - let displayPermissionGranted = checkResult.display === 'granted'; - - // Request permissions if not granted - if (!displayPermissionGranted) { - const requestResult = await LocalNotifications.requestPermissions(); - displayPermissionGranted = requestResult.display === 'granted'; - if (!displayPermissionGranted) { - Log.warn('NotifyService: Notification permission not granted'); - return; - } - } - // Generate a deterministic notification ID from title and body // Use a prefix to distinguish plugin notifications from reminders const notificationKey = `plugin-notification:${title}:${body}`; const notificationId = generateNotificationId(notificationKey); - // Schedule an immediate notification - await LocalNotifications.schedule({ - notifications: [ - { - id: notificationId, - title, - body, - schedule: { - at: new Date(Date.now() + 1000), // Show after 1 second - allowWhileIdle: true, - }, - }, - ], - }); - - Log.log('NotifyService: Android notification scheduled successfully', { + const success = await this._notificationService.schedule({ id: notificationId, title, + body, }); + + if (success) { + Log.log('NotifyService: Mobile notification scheduled successfully', { + id: notificationId, + title, + platform: this._platformService.platform, + }); + } } catch (error) { - Log.err('NotifyService: Failed to show Android notification', error); + Log.err('NotifyService: Failed to show mobile notification', error); } } else if (this._isBasicNotificationSupport()) { const permission = await Notification.requestPermission(); @@ -122,8 +105,14 @@ export class NotifyService { }, options.duration || 10000); return instance; } + } else { + Log.warn('NotifyService: No notification method available', { + platform: this._platformService.platform, + isNative: this._platformService.isNative, + hasServiceWorker: this._isServiceWorkerAvailable(), + hasBasicNotification: this._isBasicNotificationSupport(), + }); } - Log.err('No notifications supported'); return undefined; } diff --git a/src/app/core/platform/capacitor-notification.service.spec.ts b/src/app/core/platform/capacitor-notification.service.spec.ts new file mode 100644 index 000000000..2f4aaca18 --- /dev/null +++ b/src/app/core/platform/capacitor-notification.service.spec.ts @@ -0,0 +1,143 @@ +import { TestBed } from '@angular/core/testing'; +import { CapacitorNotificationService } from './capacitor-notification.service'; +import { CapacitorPlatformService } from './capacitor-platform.service'; + +describe('CapacitorNotificationService', () => { + let service: CapacitorNotificationService; + let platformServiceSpy: jasmine.SpyObj; + + beforeEach(() => { + // Create a spy for CapacitorPlatformService + platformServiceSpy = jasmine.createSpyObj( + 'CapacitorPlatformService', + ['hasCapability', 'isIOS', 'isAndroid'], + { + platform: 'web', + isNative: false, + isMobile: false, + capabilities: { + backgroundTracking: false, + backgroundFocusTimer: false, + localFileSync: false, + homeWidget: false, + scheduledNotifications: false, + webdavSync: true, + shareOut: true, + shareIn: false, + darkMode: true, + }, + }, + ); + + TestBed.configureTestingModule({ + providers: [ + CapacitorNotificationService, + { provide: CapacitorPlatformService, useValue: platformServiceSpy }, + ], + }); + service = TestBed.inject(CapacitorNotificationService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); + + describe('isAvailable', () => { + it('should return false when scheduledNotifications capability is false', () => { + expect(service.isAvailable).toBe(false); + }); + + it('should return true when scheduledNotifications capability is true', () => { + // Create a new spy with notifications enabled + const nativeServiceSpy = jasmine.createSpyObj( + 'CapacitorPlatformService', + ['hasCapability'], + { + capabilities: { + scheduledNotifications: true, + }, + }, + ); + + TestBed.resetTestingModule(); + TestBed.configureTestingModule({ + providers: [ + CapacitorNotificationService, + { provide: CapacitorPlatformService, useValue: nativeServiceSpy }, + ], + }); + const nativeService = TestBed.inject(CapacitorNotificationService); + expect(nativeService.isAvailable).toBe(true); + }); + }); + + describe('requestPermissions', () => { + it('should return false when not available', async () => { + const result = await service.requestPermissions(); + expect(result).toBe(false); + }); + }); + + describe('checkPermissions', () => { + it('should return false when not available', async () => { + const result = await service.checkPermissions(); + expect(result).toBe(false); + }); + }); + + describe('ensurePermissions', () => { + it('should return false when not available', async () => { + const result = await service.ensurePermissions(); + expect(result).toBe(false); + }); + }); + + describe('schedule', () => { + it('should return false when not available', async () => { + const result = await service.schedule({ + id: 1, + title: 'Test', + body: 'Test body', + }); + expect(result).toBe(false); + }); + }); + + describe('cancel', () => { + it('should return false when not available', async () => { + const result = await service.cancel(1); + expect(result).toBe(false); + }); + }); + + describe('cancelMultiple', () => { + it('should return false when not available', async () => { + const result = await service.cancelMultiple([1, 2, 3]); + expect(result).toBe(false); + }); + + it('should return false for empty array', async () => { + const result = await service.cancelMultiple([]); + expect(result).toBe(false); + }); + }); + + describe('getPending', () => { + it('should return empty array when not available', async () => { + const result = await service.getPending(); + expect(result).toEqual([]); + }); + }); + + describe('addActionListener', () => { + it('should not throw when not available', async () => { + await expectAsync(service.addActionListener(() => {})).toBeResolved(); + }); + }); + + describe('removeAllListeners', () => { + it('should not throw when not available', async () => { + await expectAsync(service.removeAllListeners()).toBeResolved(); + }); + }); +}); diff --git a/src/app/core/platform/capacitor-notification.service.ts b/src/app/core/platform/capacitor-notification.service.ts new file mode 100644 index 000000000..f117291e7 --- /dev/null +++ b/src/app/core/platform/capacitor-notification.service.ts @@ -0,0 +1,235 @@ +import { inject, Injectable } from '@angular/core'; +import { LocalNotifications, ScheduleOptions } from '@capacitor/local-notifications'; +import { Log } from '../log'; +import { CapacitorPlatformService } from './capacitor-platform.service'; + +export interface ScheduleNotificationOptions { + id: number; + title: string; + body: string; + /** + * When to show the notification. If not provided, shows immediately. + */ + scheduleAt?: Date; + /** + * Extra data to attach to the notification + */ + extra?: Record; + /** + * Whether to allow notification when device is idle (Android) + */ + allowWhileIdle?: boolean; +} + +/** + * Service for managing local notifications via Capacitor. + * + * This service provides a unified interface for scheduling and canceling + * local notifications on iOS and Android. + */ +@Injectable({ + providedIn: 'root', +}) +export class CapacitorNotificationService { + private _platformService = inject(CapacitorPlatformService); + + /** + * Check if notifications are available on this platform + */ + get isAvailable(): boolean { + return this._platformService.capabilities.scheduledNotifications; + } + + /** + * Request notification permissions from the user + */ + async requestPermissions(): Promise { + if (!this.isAvailable) { + return false; + } + + try { + const result = await LocalNotifications.requestPermissions(); + return result.display === 'granted'; + } catch (error) { + Log.err('CapacitorNotificationService: Failed to request permissions', error); + return false; + } + } + + /** + * Check current notification permission status + */ + async checkPermissions(): Promise { + if (!this.isAvailable) { + return false; + } + + try { + const result = await LocalNotifications.checkPermissions(); + return result.display === 'granted'; + } catch (error) { + Log.err('CapacitorNotificationService: Failed to check permissions', error); + return false; + } + } + + /** + * Ensure permissions are granted, requesting if necessary + */ + async ensurePermissions(): Promise { + const hasPermission = await this.checkPermissions(); + if (hasPermission) { + return true; + } + return this.requestPermissions(); + } + + /** + * Schedule a local notification + */ + async schedule(options: ScheduleNotificationOptions): Promise { + if (!this.isAvailable) { + Log.warn( + 'CapacitorNotificationService: Notifications not available on this platform', + ); + return false; + } + + const hasPermission = await this.ensurePermissions(); + if (!hasPermission) { + Log.warn('CapacitorNotificationService: Notification permission not granted'); + return false; + } + + try { + const scheduleOptions: ScheduleOptions = { + notifications: [ + { + id: options.id, + title: options.title, + body: options.body, + extra: options.extra, + schedule: options.scheduleAt + ? { + at: options.scheduleAt, + allowWhileIdle: options.allowWhileIdle ?? true, + } + : { + // Schedule for 1 second from now for immediate notifications + at: new Date(Date.now() + 1000), + allowWhileIdle: options.allowWhileIdle ?? true, + }, + }, + ], + }; + + await LocalNotifications.schedule(scheduleOptions); + + Log.log('CapacitorNotificationService: Notification scheduled', { + id: options.id, + title: options.title, + scheduleAt: options.scheduleAt, + }); + + return true; + } catch (error) { + Log.err('CapacitorNotificationService: Failed to schedule notification', error); + return false; + } + } + + /** + * Cancel a scheduled notification by ID + */ + async cancel(notificationId: number): Promise { + if (!this.isAvailable) { + return false; + } + + try { + await LocalNotifications.cancel({ + notifications: [{ id: notificationId }], + }); + + Log.log('CapacitorNotificationService: Notification cancelled', { + id: notificationId, + }); + + return true; + } catch (error) { + Log.err('CapacitorNotificationService: Failed to cancel notification', error); + return false; + } + } + + /** + * Cancel multiple scheduled notifications + */ + async cancelMultiple(notificationIds: number[]): Promise { + if (!this.isAvailable || notificationIds.length === 0) { + return false; + } + + try { + await LocalNotifications.cancel({ + notifications: notificationIds.map((id) => ({ id })), + }); + + Log.log('CapacitorNotificationService: Notifications cancelled', { + ids: notificationIds, + }); + + return true; + } catch (error) { + Log.err('CapacitorNotificationService: Failed to cancel notifications', error); + return false; + } + } + + /** + * Get all pending notifications + */ + async getPending(): Promise<{ id: number }[]> { + if (!this.isAvailable) { + return []; + } + + try { + const result = await LocalNotifications.getPending(); + return result.notifications; + } catch (error) { + Log.err('CapacitorNotificationService: Failed to get pending notifications', error); + return []; + } + } + + /** + * Register a listener for notification actions + */ + async addActionListener( + callback: (notification: { id: number; extra?: Record }) => void, + ): Promise { + if (!this.isAvailable) { + return; + } + + await LocalNotifications.addListener('localNotificationActionPerformed', (event) => { + callback({ + id: event.notification.id, + extra: event.notification.extra, + }); + }); + } + + /** + * Remove all notification listeners + */ + async removeAllListeners(): Promise { + if (!this.isAvailable) { + return; + } + + await LocalNotifications.removeAllListeners(); + } +} diff --git a/src/app/core/platform/capacitor-platform.service.spec.ts b/src/app/core/platform/capacitor-platform.service.spec.ts new file mode 100644 index 000000000..e390ccab7 --- /dev/null +++ b/src/app/core/platform/capacitor-platform.service.spec.ts @@ -0,0 +1,64 @@ +import { TestBed } from '@angular/core/testing'; +import { CapacitorPlatformService } from './capacitor-platform.service'; + +describe('CapacitorPlatformService', () => { + let service: CapacitorPlatformService; + + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [CapacitorPlatformService], + }); + service = TestBed.inject(CapacitorPlatformService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); + + it('should detect platform type', () => { + expect(service.platform).toBeDefined(); + expect(['ios', 'android', 'web', 'electron']).toContain(service.platform); + }); + + it('should have capabilities object', () => { + expect(service.capabilities).toBeDefined(); + expect(typeof service.capabilities.scheduledNotifications).toBe('boolean'); + expect(typeof service.capabilities.webdavSync).toBe('boolean'); + expect(typeof service.capabilities.shareOut).toBe('boolean'); + }); + + it('should have consistent platform checks', () => { + // Only one platform method should return true + const platformChecks = [ + service.isIOS(), + service.isAndroid(), + service.isElectron(), + service.isWeb(), + ]; + const trueCount = platformChecks.filter((x) => x).length; + expect(trueCount).toBe(1); + }); + + it('should check capability via hasCapability method', () => { + expect(service.hasCapability('webdavSync')).toBe(service.capabilities.webdavSync); + expect(service.hasCapability('scheduledNotifications')).toBe( + service.capabilities.scheduledNotifications, + ); + }); + + describe('in web environment', () => { + // These tests run in Karma which is a web browser + it('should detect web platform in test environment', () => { + // In Karma test runner, we're in a web context + expect(service.platform).toBe('web'); + expect(service.isWeb()).toBe(true); + expect(service.isNative).toBe(false); + }); + + it('should have web capabilities', () => { + expect(service.capabilities.backgroundTracking).toBe(false); + expect(service.capabilities.localFileSync).toBe(false); + expect(service.capabilities.webdavSync).toBe(true); + }); + }); +}); diff --git a/src/app/core/platform/capacitor-platform.service.ts b/src/app/core/platform/capacitor-platform.service.ts new file mode 100644 index 000000000..d548d6025 --- /dev/null +++ b/src/app/core/platform/capacitor-platform.service.ts @@ -0,0 +1,169 @@ +import { Injectable } from '@angular/core'; +import { Capacitor } from '@capacitor/core'; +import { + ANDROID_CAPABILITIES, + ELECTRON_CAPABILITIES, + IOS_CAPABILITIES, + PlatformCapabilities, + PlatformType, + WEB_CAPABILITIES, +} from './platform-capabilities.model'; + +/** + * Service for detecting platform and exposing platform-specific capabilities. + * + * This service provides a unified interface for platform detection and feature + * availability, replacing scattered IS_ANDROID_WEB_VIEW checks throughout the codebase. + * + * Usage: + * ```typescript + * if (this.platformService.capabilities.scheduledNotifications) { + * // Schedule notification using Capacitor plugin + * } + * ``` + */ +@Injectable({ + providedIn: 'root', +}) +export class CapacitorPlatformService { + /** + * The current platform type + */ + readonly platform: PlatformType; + + /** + * Whether running in a native Capacitor context (iOS or Android) + */ + readonly isNative: boolean; + + /** + * Whether running in a mobile context (iOS or Android, native or PWA) + */ + readonly isMobile: boolean; + + /** + * Platform capabilities for conditional feature enabling + */ + readonly capabilities: PlatformCapabilities; + + constructor() { + this.platform = this._detectPlatform(); + // Include legacy Android WebView in isNative check + this.isNative = Capacitor.isNativePlatform() || this._isAndroidWebView(); + this.isMobile = this.platform === 'ios' || this.platform === 'android'; + this.capabilities = this._getCapabilities(); + } + + /** + * Check if a specific capability is available + */ + hasCapability(capability: keyof PlatformCapabilities): boolean { + return this.capabilities[capability]; + } + + /** + * Check if running on iOS + */ + isIOS(): boolean { + return this.platform === 'ios'; + } + + /** + * Check if running on Android + */ + isAndroid(): boolean { + return this.platform === 'android'; + } + + /** + * Check if running in Electron + */ + isElectron(): boolean { + return this.platform === 'electron'; + } + + /** + * Check if running in web browser (not Electron, not native mobile) + */ + isWeb(): boolean { + return this.platform === 'web'; + } + + /** + * Detect the current platform + */ + private _detectPlatform(): PlatformType { + // Check for Electron first (it also has navigator) + if (this._isElectron()) { + return 'electron'; + } + + // Check for native Capacitor platforms + if (Capacitor.isNativePlatform()) { + const platform = Capacitor.getPlatform(); + if (platform === 'ios') { + return 'ios'; + } + if (platform === 'android') { + return 'android'; + } + } + + // Check for Android WebView (legacy check for existing Android implementation) + if (this._isAndroidWebView()) { + return 'android'; + } + + // Check for iOS in browser context (iPad, iPhone) + if (this._isIOSBrowser()) { + // Running in iOS browser, not native - treat as web + return 'web'; + } + + return 'web'; + } + + /** + * Get capabilities for the current platform + */ + private _getCapabilities(): PlatformCapabilities { + switch (this.platform) { + case 'ios': + return IOS_CAPABILITIES; + case 'android': + return ANDROID_CAPABILITIES; + case 'electron': + return ELECTRON_CAPABILITIES; + default: + return WEB_CAPABILITIES; + } + } + + /** + * Check if running in Electron + */ + private _isElectron(): boolean { + return navigator.userAgent.toLowerCase().indexOf(' electron/') > -1; + } + + /** + * Check if running in Android WebView (legacy detection) + */ + private _isAndroidWebView(): boolean { + return !!(window as any).SUPAndroid; + } + + /** + * Check if running in iOS browser (not native) + */ + private _isIOSBrowser(): boolean { + // Check user agent for iOS devices + const userAgent = navigator.userAgent; + const isIOSUserAgent = + /iPad|iPhone|iPod/.test(userAgent) || + // iPad on iOS 13+ reports as Mac with touch support + (userAgent.includes('Mac') && 'ontouchend' in document); + + return isIOSUserAgent; + } +} diff --git a/src/app/core/platform/capacitor-reminder.service.spec.ts b/src/app/core/platform/capacitor-reminder.service.spec.ts new file mode 100644 index 000000000..8999cffec --- /dev/null +++ b/src/app/core/platform/capacitor-reminder.service.spec.ts @@ -0,0 +1,185 @@ +import { TestBed } from '@angular/core/testing'; +import { CapacitorReminderService } from './capacitor-reminder.service'; +import { CapacitorPlatformService } from './capacitor-platform.service'; +import { CapacitorNotificationService } from './capacitor-notification.service'; + +describe('CapacitorReminderService', () => { + let service: CapacitorReminderService; + let platformServiceSpy: jasmine.SpyObj; + let notificationServiceSpy: jasmine.SpyObj; + + beforeEach(() => { + // Create spies for dependencies + platformServiceSpy = jasmine.createSpyObj( + 'CapacitorPlatformService', + ['hasCapability', 'isIOS', 'isAndroid'], + { + platform: 'web', + isNative: false, + isMobile: false, + capabilities: { + backgroundTracking: false, + backgroundFocusTimer: false, + localFileSync: false, + homeWidget: false, + scheduledNotifications: false, + webdavSync: true, + shareOut: true, + shareIn: false, + darkMode: true, + }, + }, + ); + + notificationServiceSpy = jasmine.createSpyObj('CapacitorNotificationService', [ + 'ensurePermissions', + 'cancel', + 'cancelMultiple', + ]); + notificationServiceSpy.ensurePermissions.and.returnValue(Promise.resolve(true)); + notificationServiceSpy.cancel.and.returnValue(Promise.resolve(true)); + notificationServiceSpy.cancelMultiple.and.returnValue(Promise.resolve(true)); + + TestBed.configureTestingModule({ + providers: [ + CapacitorReminderService, + { provide: CapacitorPlatformService, useValue: platformServiceSpy }, + { provide: CapacitorNotificationService, useValue: notificationServiceSpy }, + ], + }); + service = TestBed.inject(CapacitorReminderService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); + + describe('isAvailable', () => { + it('should return false when scheduledNotifications capability is false', () => { + expect(service.isAvailable).toBe(false); + }); + + it('should return true when scheduledNotifications capability is true', () => { + const nativePlatformSpy = jasmine.createSpyObj( + 'CapacitorPlatformService', + ['hasCapability', 'isIOS'], + { + platform: 'ios', + isNative: true, + capabilities: { + scheduledNotifications: true, + }, + }, + ); + + TestBed.resetTestingModule(); + TestBed.configureTestingModule({ + providers: [ + CapacitorReminderService, + { provide: CapacitorPlatformService, useValue: nativePlatformSpy }, + { provide: CapacitorNotificationService, useValue: notificationServiceSpy }, + ], + }); + const nativeService = TestBed.inject(CapacitorReminderService); + expect(nativeService.isAvailable).toBe(true); + }); + }); + + describe('scheduleReminder', () => { + it('should return false when not available', async () => { + const result = await service.scheduleReminder({ + notificationId: 1, + reminderId: 'task-1', + relatedId: 'task-1', + title: 'Test Reminder', + reminderType: 'TASK', + triggerAtMs: Date.now() + 60000, + }); + expect(result).toBe(false); + }); + }); + + describe('cancelReminder', () => { + it('should return false when not available', async () => { + const result = await service.cancelReminder(1); + expect(result).toBe(false); + }); + }); + + describe('cancelMultipleReminders', () => { + it('should return false when not available', async () => { + const result = await service.cancelMultipleReminders([1, 2, 3]); + expect(result).toBe(false); + }); + + it('should return false for empty array', async () => { + const result = await service.cancelMultipleReminders([]); + expect(result).toBe(false); + }); + }); + + describe('ensurePermissions', () => { + it('should return false when not available', async () => { + const result = await service.ensurePermissions(); + expect(result).toBe(false); + }); + }); + + describe('with native platform', () => { + let nativeService: CapacitorReminderService; + let nativePlatformSpy: jasmine.SpyObj; + + beforeEach(() => { + nativePlatformSpy = jasmine.createSpyObj( + 'CapacitorPlatformService', + ['hasCapability', 'isIOS'], + { + platform: 'ios', + isNative: true, + isMobile: true, + capabilities: { + backgroundTracking: false, + backgroundFocusTimer: false, + localFileSync: false, + homeWidget: false, + scheduledNotifications: true, + webdavSync: true, + shareOut: true, + shareIn: false, + darkMode: true, + }, + }, + ); + nativePlatformSpy.isIOS.and.returnValue(true); + + TestBed.resetTestingModule(); + TestBed.configureTestingModule({ + providers: [ + CapacitorReminderService, + { provide: CapacitorPlatformService, useValue: nativePlatformSpy }, + { provide: CapacitorNotificationService, useValue: notificationServiceSpy }, + ], + }); + nativeService = TestBed.inject(CapacitorReminderService); + }); + + it('should be available on native platform', () => { + expect(nativeService.isAvailable).toBe(true); + }); + + it('should call notificationService.cancel when cancelling reminder', async () => { + await nativeService.cancelReminder(123); + expect(notificationServiceSpy.cancel).toHaveBeenCalledWith(123); + }); + + it('should call notificationService.cancelMultiple when cancelling multiple reminders', async () => { + await nativeService.cancelMultipleReminders([1, 2, 3]); + expect(notificationServiceSpy.cancelMultiple).toHaveBeenCalledWith([1, 2, 3]); + }); + + it('should call notificationService.ensurePermissions when ensuring permissions', async () => { + await nativeService.ensurePermissions(); + expect(notificationServiceSpy.ensurePermissions).toHaveBeenCalled(); + }); + }); +}); diff --git a/src/app/core/platform/capacitor-reminder.service.ts b/src/app/core/platform/capacitor-reminder.service.ts new file mode 100644 index 000000000..9ced8d102 --- /dev/null +++ b/src/app/core/platform/capacitor-reminder.service.ts @@ -0,0 +1,228 @@ +import { inject, Injectable } from '@angular/core'; +import { LocalNotifications } from '@capacitor/local-notifications'; +import { Log } from '../log'; +import { CapacitorPlatformService } from './capacitor-platform.service'; +import { CapacitorNotificationService } from './capacitor-notification.service'; +import { IS_ANDROID_WEB_VIEW } from '../../util/is-android-web-view'; +import { androidInterface } from '../../features/android/android-interface'; + +export interface ScheduleReminderOptions { + /** + * Unique notification ID (numeric) + */ + notificationId: number; + /** + * Reminder identifier (string, e.g., task ID) + */ + reminderId: string; + /** + * Related entity ID (string, e.g., task ID) + */ + relatedId: string; + /** + * Notification title + */ + title: string; + /** + * Type of reminder (e.g., 'TASK') + */ + reminderType: string; + /** + * Timestamp when the reminder should trigger (in milliseconds) + */ + triggerAtMs: number; +} + +/** + * Service for scheduling reminders across platforms. + * + * On Android: Uses native AlarmManager via androidInterface for precise timing + * On iOS: Uses Capacitor LocalNotifications for scheduled notifications + */ +@Injectable({ + providedIn: 'root', +}) +export class CapacitorReminderService { + private _platformService = inject(CapacitorPlatformService); + private _notificationService = inject(CapacitorNotificationService); + + /** + * Check if reminder scheduling is available on this platform + */ + get isAvailable(): boolean { + return this._platformService.capabilities.scheduledNotifications; + } + + /** + * Schedule a reminder notification + */ + async scheduleReminder(options: ScheduleReminderOptions): Promise { + if (!this.isAvailable) { + Log.warn('CapacitorReminderService: Scheduled notifications not available'); + return false; + } + + const now = Date.now(); + const triggerAt = options.triggerAtMs <= now ? now + 1000 : options.triggerAtMs; + + // On Android, use native AlarmManager for precision + if (IS_ANDROID_WEB_VIEW && androidInterface.scheduleNativeReminder) { + try { + androidInterface.scheduleNativeReminder( + options.notificationId, + options.reminderId, + options.relatedId, + options.title, + options.reminderType, + triggerAt, + ); + Log.log('CapacitorReminderService: Android reminder scheduled', { + notificationId: options.notificationId, + title: options.title, + triggerAt: new Date(triggerAt).toISOString(), + }); + return true; + } catch (error) { + Log.err('CapacitorReminderService: Failed to schedule Android reminder', error); + return false; + } + } + + // On iOS (and Android as fallback), use Capacitor LocalNotifications + if (this._platformService.isNative) { + try { + const hasPermission = await this._notificationService.ensurePermissions(); + if (!hasPermission) { + Log.warn('CapacitorReminderService: Notification permission not granted'); + return false; + } + + await LocalNotifications.schedule({ + notifications: [ + { + id: options.notificationId, + title: options.title, + body: `Reminder: ${options.title}`, + schedule: { + at: new Date(triggerAt), + allowWhileIdle: true, + }, + extra: { + reminderId: options.reminderId, + relatedId: options.relatedId, + reminderType: options.reminderType, + }, + }, + ], + }); + + Log.log('CapacitorReminderService: iOS reminder scheduled', { + notificationId: options.notificationId, + title: options.title, + triggerAt: new Date(triggerAt).toISOString(), + }); + return true; + } catch (error) { + Log.err('CapacitorReminderService: Failed to schedule iOS reminder', error); + return false; + } + } + + Log.warn('CapacitorReminderService: No reminder implementation for platform', { + platform: this._platformService.platform, + }); + return false; + } + + /** + * Cancel a scheduled reminder + */ + async cancelReminder(notificationId: number): Promise { + if (!this.isAvailable) { + return false; + } + + // On Android, use native cancellation + if (IS_ANDROID_WEB_VIEW && androidInterface.cancelNativeReminder) { + try { + androidInterface.cancelNativeReminder(notificationId); + Log.log('CapacitorReminderService: Android reminder cancelled', { + notificationId, + }); + return true; + } catch (error) { + Log.err('CapacitorReminderService: Failed to cancel Android reminder', error); + return false; + } + } + + // On iOS (and Android as fallback), use Capacitor LocalNotifications + if (this._platformService.isNative) { + return this._notificationService.cancel(notificationId); + } + + return false; + } + + /** + * Cancel multiple scheduled reminders + */ + async cancelMultipleReminders(notificationIds: number[]): Promise { + if (!this.isAvailable || notificationIds.length === 0) { + return false; + } + + // On Android, cancel each individually + if (IS_ANDROID_WEB_VIEW && androidInterface.cancelNativeReminder) { + try { + for (const id of notificationIds) { + androidInterface.cancelNativeReminder(id); + } + Log.log('CapacitorReminderService: Android reminders cancelled', { + count: notificationIds.length, + }); + return true; + } catch (error) { + Log.err('CapacitorReminderService: Failed to cancel Android reminders', error); + return false; + } + } + + // On iOS (and Android as fallback), use batch cancellation + if (this._platformService.isNative) { + return this._notificationService.cancelMultiple(notificationIds); + } + + return false; + } + + /** + * Ensure notification permissions are granted. + * Also handles Android 12+ exact alarm permissions. + */ + async ensurePermissions(): Promise { + if (!this.isAvailable) { + return false; + } + + const hasPermission = await this._notificationService.ensurePermissions(); + if (!hasPermission) { + return false; + } + + // On Android 12+, also check exact alarm permission + if (IS_ANDROID_WEB_VIEW) { + try { + const exactAlarmStatus = await LocalNotifications.checkExactNotificationSetting(); + if (exactAlarmStatus?.exact_alarm !== 'granted') { + await LocalNotifications.changeExactNotificationSetting(); + } + } catch (error) { + // Non-fatal - exact alarms may not be available on all devices + Log.warn('CapacitorReminderService: Exact alarm check failed', error); + } + } + + return true; + } +} diff --git a/src/app/core/platform/index.ts b/src/app/core/platform/index.ts new file mode 100644 index 000000000..5afaa8337 --- /dev/null +++ b/src/app/core/platform/index.ts @@ -0,0 +1,4 @@ +export * from './platform-capabilities.model'; +export * from './capacitor-platform.service'; +export * from './capacitor-notification.service'; +export * from './capacitor-reminder.service'; diff --git a/src/app/core/platform/platform-capabilities.model.ts b/src/app/core/platform/platform-capabilities.model.ts new file mode 100644 index 000000000..d9e25a9c2 --- /dev/null +++ b/src/app/core/platform/platform-capabilities.model.ts @@ -0,0 +1,124 @@ +/** + * Platform types supported by the application + */ +export type PlatformType = 'ios' | 'android' | 'web' | 'electron'; + +/** + * Runtime capabilities that vary by platform. + * Used to conditionally enable/disable features in the UI. + */ +export interface PlatformCapabilities { + /** + * Whether the platform supports background time tracking notifications. + * Android only - uses foreground service. + */ + readonly backgroundTracking: boolean; + + /** + * Whether the platform supports background focus mode timer. + * Android only - uses foreground service. + */ + readonly backgroundFocusTimer: boolean; + + /** + * Whether the platform supports local file sync (Storage Access Framework). + * Android only for MVP. + */ + readonly localFileSync: boolean; + + /** + * Whether the platform supports home screen widgets. + * Android only for MVP. + */ + readonly homeWidget: boolean; + + /** + * Whether the platform supports scheduled local notifications. + * iOS and Android via Capacitor LocalNotifications plugin. + */ + readonly scheduledNotifications: boolean; + + /** + * Whether the platform supports WebDAV sync. + * All platforms - uses CapacitorHttp on mobile, fetch on web. + */ + readonly webdavSync: boolean; + + /** + * Whether the platform supports sharing content to other apps. + * iOS and Android via Capacitor Share plugin, Web via Web Share API. + */ + readonly shareOut: boolean; + + /** + * Whether the platform supports receiving shared content from other apps. + * Android only for MVP. iOS requires Share Extension (post-MVP). + */ + readonly shareIn: boolean; + + /** + * Whether the platform supports native dark mode detection. + * All platforms support this. + */ + readonly darkMode: boolean; +} + +/** + * Default capabilities for web browser + */ +export const WEB_CAPABILITIES: PlatformCapabilities = { + backgroundTracking: false, + backgroundFocusTimer: false, + localFileSync: false, + homeWidget: false, + scheduledNotifications: false, // Service worker notifications only + webdavSync: true, + shareOut: true, // Web Share API + shareIn: false, + darkMode: true, +}; + +/** + * Capabilities for Electron desktop app + */ +export const ELECTRON_CAPABILITIES: PlatformCapabilities = { + backgroundTracking: true, // Tray icon + backgroundFocusTimer: true, // Always visible window + localFileSync: true, // Native file system + homeWidget: false, + scheduledNotifications: true, // Native notifications + webdavSync: true, + shareOut: true, + shareIn: false, + darkMode: true, +}; + +/** + * Capabilities for Android via Capacitor + */ +export const ANDROID_CAPABILITIES: PlatformCapabilities = { + backgroundTracking: true, // Foreground service + backgroundFocusTimer: true, // Foreground service + localFileSync: true, // Storage Access Framework + homeWidget: true, // AppWidgetProvider + scheduledNotifications: true, // LocalNotifications plugin + webdavSync: true, // CapacitorHttp + shareOut: true, // Share plugin + shareIn: true, // Intent filter + darkMode: true, +}; + +/** + * Capabilities for iOS via Capacitor (MVP) + */ +export const IOS_CAPABILITIES: PlatformCapabilities = { + backgroundTracking: false, // Not supported in MVP + backgroundFocusTimer: false, // Not supported in MVP + localFileSync: false, // Not supported in MVP + homeWidget: false, // Not supported in MVP + scheduledNotifications: true, // LocalNotifications plugin + webdavSync: true, // CapacitorHttp + shareOut: true, // Share plugin + shareIn: false, // Requires Share Extension (post-MVP) + darkMode: true, +}; diff --git a/src/app/core/startup/startup.service.ts b/src/app/core/startup/startup.service.ts index a3278d6c7..588aa29a8 100644 --- a/src/app/core/startup/startup.service.ts +++ b/src/app/core/startup/startup.service.ts @@ -11,7 +11,6 @@ import { BannerService } from '../banner/banner.service'; import { UiHelperService } from '../../features/ui-helper/ui-helper.service'; import { ChromeExtensionInterfaceService } from '../chrome-extension-interface/chrome-extension-interface.service'; import { ProjectService } from '../../features/project/project.service'; -import { IS_ANDROID_WEB_VIEW } from '../../util/is-android-web-view'; import { IS_ELECTRON } from '../../app.constants'; import { Log } from '../log'; import { T } from '../../t.const'; @@ -27,6 +26,7 @@ import { IPC } from '../../../../electron/shared-with-frontend/ipc-events.const' import { IpcRendererEvent } from 'electron'; import { environment } from '../../../environments/environment'; import { TrackingReminderService } from '../../features/tracking-reminder/tracking-reminder.service'; +import { CapacitorPlatformService } from '../platform/capacitor-platform.service'; const w = window as Window & { productivityTips?: string[][]; randomIndex?: number }; @@ -51,6 +51,7 @@ export class StartupService { private _projectService = inject(ProjectService); private _trackingReminderService = inject(TrackingReminderService); private _opLogStore = inject(OperationLogStoreService); + private _platformService = inject(CapacitorPlatformService); constructor() { // Initialize electron error handler in an effect @@ -77,7 +78,8 @@ export class StartupService { } async init(): Promise { - if (!IS_ANDROID_WEB_VIEW && !IS_ELECTRON) { + // Skip single instance check for native mobile apps and Electron + if (!this._platformService.isNative && !IS_ELECTRON) { const isSingle = await this._checkIsSingleInstance(); if (!isSingle) { this._showMultiInstanceBlocker(); @@ -140,7 +142,8 @@ export class StartupService { } }); - if (!IS_ANDROID_WEB_VIEW) { + // Chrome extension only works in web browser, not native mobile apps + if (!this._platformService.isNative) { this._chromeExtensionInterfaceService.init(); } } @@ -148,7 +151,8 @@ export class StartupService { private async _initBackups(): Promise { // if completely fresh instance check for local backups - if (IS_ELECTRON || IS_ANDROID_WEB_VIEW) { + // Local backups are available on Electron and native mobile (iOS/Android) + if (IS_ELECTRON || this._platformService.isNative) { const stateCache = await this._opLogStore.loadStateCache(); // If no state cache exists, this is a fresh instance - offer to restore from backup if (!stateCache) { @@ -258,8 +262,8 @@ export class StartupService { if (granted) { Log.log('Persistent store granted'); } - // NOTE: we never execute for android web view, because it is always true - else if (!IS_ANDROID_WEB_VIEW) { + // NOTE: we never show this warning for native mobile apps, because persistence is always granted + else if (!this._platformService.isNative) { const msg = T.GLOBAL_SNACK.PERSISTENCE_DISALLOWED; Log.warn('Persistence not allowed'); this._snackService.open({ msg }); diff --git a/src/app/features/android/store/android.effects.ts b/src/app/features/android/store/android.effects.ts index ab024fd14..3433bf315 100644 --- a/src/app/features/android/store/android.effects.ts +++ b/src/app/features/android/store/android.effects.ts @@ -2,7 +2,6 @@ import { inject, Injectable } from '@angular/core'; import { createEffect } from '@ngrx/effects'; import { switchMap, tap } from 'rxjs/operators'; import { timer } from 'rxjs'; -import { LocalNotifications } from '@capacitor/local-notifications'; import { SnackService } from '../../../core/snack/snack.service'; import { IS_ANDROID_WEB_VIEW } from '../../../util/is-android-web-view'; import { DroidLog } from '../../../core/log'; @@ -12,6 +11,8 @@ import { TaskService } from '../../tasks/task.service'; import { TaskAttachmentService } from '../../tasks/task-attachment/task-attachment.service'; import { Store } from '@ngrx/store'; import { selectAllTasksWithReminder } from '../../tasks/store/task.selectors'; +import { CapacitorReminderService } from '../../../core/platform/capacitor-reminder.service'; +import { CapacitorPlatformService } from '../../../core/platform/capacitor-platform.service'; // TODO send message to electron when current task changes here @@ -24,28 +25,29 @@ export class AndroidEffects { private _taskService = inject(TaskService); private _taskAttachmentService = inject(TaskAttachmentService); private _store = inject(Store); + private _reminderService = inject(CapacitorReminderService); + private _platformService = inject(CapacitorPlatformService); // Single-shot guard so we don't spam the user with duplicate warnings. private _hasShownNotificationWarning = false; - private _hasCheckedExactAlarm = false; // Track scheduled reminder IDs to cancel removed ones private _scheduledReminderIds = new Set(); + /** + * Check notification permissions on startup for mobile platforms. + * Shows a warning if permissions are not granted. + */ askPermissionsIfNotGiven$ = - IS_ANDROID_WEB_VIEW && + this._platformService.isNative && createEffect( () => timer(DELAY_PERMISSIONS).pipe( - tap(async (v) => { + tap(async () => { try { - const checkResult = await LocalNotifications.checkPermissions(); - DroidLog.log('AndroidEffects: initial permission check', checkResult); - const displayPermissionGranted = checkResult.display === 'granted'; - if (displayPermissionGranted) { - await this._ensureExactAlarmAccess(); - return; + const hasPermission = await this._reminderService.ensurePermissions(); + DroidLog.log('MobileEffects: initial permission check', { hasPermission }); + if (!hasPermission) { + this._notifyPermissionIssue(); } - // Surface a gentle warning early, but defer the actual permission prompt until we truly need it. - this._notifyPermissionIssue(); } catch (error) { DroidLog.err(error); this._notifyPermissionIssue(error?.toString()); @@ -58,16 +60,17 @@ export class AndroidEffects { ); /** - * Schedule native Android reminders for tasks with remindAt set. + * Schedule reminders for tasks with remindAt set. + * Works on both iOS and Android. * * SYNC-SAFE: This effect is intentionally safe during sync/hydration because: - * - dispatch: false - no store mutations, only native Android API calls + * - dispatch: false - no store mutations, only native API calls * - We WANT notifications scheduled for synced tasks (user-facing functionality) - * - Native AlarmManager calls are idempotent - rescheduling the same reminder is harmless + * - Native scheduling calls are idempotent - rescheduling the same reminder is harmless * - Cancellation of removed reminders correctly handles tasks deleted via sync */ scheduleNotifications$ = - IS_ANDROID_WEB_VIEW && + this._platformService.isNative && createEffect( () => timer(DELAY_SCHEDULE).pipe( @@ -82,11 +85,11 @@ export class AndroidEffects { for (const previousId of this._scheduledReminderIds) { if (!currentReminderIds.has(previousId)) { const notificationId = generateNotificationId(previousId); - DroidLog.log('AndroidEffects: cancelling removed reminder', { + DroidLog.log('MobileEffects: cancelling removed reminder', { relatedId: previousId, notificationId, }); - androidInterface.cancelNativeReminder?.(notificationId); + await this._reminderService.cancelReminder(notificationId); } } @@ -94,44 +97,38 @@ export class AndroidEffects { this._scheduledReminderIds.clear(); return; } - DroidLog.log('AndroidEffects: scheduling reminders natively', { + + DroidLog.log('MobileEffects: scheduling reminders', { reminderCount: tasksWithReminders.length, + platform: this._platformService.platform, }); - // Check permissions first - const checkResult = await LocalNotifications.checkPermissions(); - let displayPermissionGranted = checkResult.display === 'granted'; - if (!displayPermissionGranted) { - const requestResult = await LocalNotifications.requestPermissions(); - displayPermissionGranted = requestResult.display === 'granted'; - if (!displayPermissionGranted) { - this._notifyPermissionIssue(); - return; - } + // Ensure permissions are granted + const hasPermission = await this._reminderService.ensurePermissions(); + if (!hasPermission) { + this._notifyPermissionIssue(); + return; } - await this._ensureExactAlarmAccess(); - // Schedule each reminder using native Android AlarmManager + // Schedule each reminder using the platform-appropriate method for (const task of tasksWithReminders) { const id = generateNotificationId(task.id); - const now = Date.now(); - const scheduleAt = task.remindAt! <= now ? now + 1000 : task.remindAt!; - - androidInterface.scheduleNativeReminder?.( - id, - task.id, - task.id, - task.title, - 'TASK', - scheduleAt, - ); + await this._reminderService.scheduleReminder({ + notificationId: id, + reminderId: task.id, + relatedId: task.id, + title: task.title, + reminderType: 'TASK', + triggerAtMs: task.remindAt!, + }); } // Update tracked IDs this._scheduledReminderIds = currentReminderIds; - DroidLog.log('AndroidEffects: scheduled native reminders', { + DroidLog.log('MobileEffects: scheduled reminders', { reminderCount: tasksWithReminders.length, + platform: this._platformService.platform, }); } catch (error) { DroidLog.err(error); @@ -210,23 +207,6 @@ export class AndroidEffects { { dispatch: false }, ); - private async _ensureExactAlarmAccess(): Promise { - try { - if (this._hasCheckedExactAlarm) { - return; - } - // Android 12+ gates exact alarms behind a separate toggle; surface the settings screen if needed. - const exactAlarmStatus = await LocalNotifications.checkExactNotificationSetting(); - if (exactAlarmStatus?.exact_alarm !== 'granted') { - DroidLog.log(await LocalNotifications.changeExactNotificationSetting()); - } else { - this._hasCheckedExactAlarm = true; - } - } catch (error) { - DroidLog.warn(error); - } - } - private _notifyPermissionIssue(message?: string): void { if (this._hasShownNotificationWarning) { return; diff --git a/src/app/features/config/form-cfgs/sync-form.const.ts b/src/app/features/config/form-cfgs/sync-form.const.ts index 924a438b4..ba19121f3 100644 --- a/src/app/features/config/form-cfgs/sync-form.const.ts +++ b/src/app/features/config/form-cfgs/sync-form.const.ts @@ -6,6 +6,7 @@ import { IS_ANDROID_WEB_VIEW } from '../../../util/is-android-web-view'; import { IS_ELECTRON } from '../../../app.constants'; import { fileSyncDroid, fileSyncElectron } from '../../../op-log/model/model-config'; import { FormlyFieldConfig } from '@ngx-formly/core'; +import { IS_NATIVE_PLATFORM } from '../../../util/is-native-platform'; /** * Creates form fields for WebDAV-based sync providers. @@ -19,7 +20,8 @@ const createWebdavFormFields = (options: { baseUrlDescription: string; }): FormlyFieldConfig[] => { return [ - ...(!IS_ELECTRON && !IS_ANDROID_WEB_VIEW + // Hide CORS info for Electron and native mobile apps (iOS/Android) since they handle CORS natively + ...(!IS_ELECTRON && !IS_NATIVE_PLATFORM ? [ { type: 'tpl', diff --git a/src/app/op-log/sync-providers/file-based/webdav/webdav-http-adapter.ts b/src/app/op-log/sync-providers/file-based/webdav/webdav-http-adapter.ts index 441bd3ea8..f2777495b 100644 --- a/src/app/op-log/sync-providers/file-based/webdav/webdav-http-adapter.ts +++ b/src/app/op-log/sync-providers/file-based/webdav/webdav-http-adapter.ts @@ -9,6 +9,7 @@ import { TooManyRequestsAPIError, } from '../../../core/errors/sync-errors'; import { WebDavHttpStatus } from './webdav.const'; +import { Capacitor } from '@capacitor/core'; // Define and register our WebDAV plugin interface WebDavHttpPluginRequest { @@ -55,23 +56,29 @@ export class WebDavHttpAdapter { 'PROPPATCH', ]; - // Make IS_ANDROID_WEB_VIEW testable by making it a class property + // Make platform checks testable by making them class properties protected get isAndroidWebView(): boolean { return IS_ANDROID_WEB_VIEW; } + protected get isNativePlatform(): boolean { + return Capacitor.isNativePlatform(); + } + async request(options: WebDavHttpRequest): Promise { try { let response: WebDavHttpResponse; - if (this.isAndroidWebView) { + if (this.isNativePlatform) { // Check if this is a WebDAV method const isWebDavMethod = WebDavHttpAdapter.WEBDAV_METHODS.includes( options.method.toUpperCase(), ); - if (isWebDavMethod) { - // Use our custom WebDAV plugin for WebDAV methods + // On Android, use custom WebDavHttp plugin for WebDAV methods (better retry handling) + // On iOS, use CapacitorHttp for all methods (including WebDAV) + if (isWebDavMethod && this.isAndroidWebView) { + // Use our custom WebDAV plugin for WebDAV methods on Android PFLog.log( `${WebDavHttpAdapter.L}.request() using WebDavHttp for ${options.method}`, ); @@ -83,7 +90,12 @@ export class WebDavHttpAdapter { }); response = this._convertWebDavResponse(webdavResponse); } else { - // Use standard CapacitorHttp for regular HTTP methods + // Use standard CapacitorHttp for: + // - All methods on iOS (including WebDAV) + // - Regular HTTP methods on Android + PFLog.log( + `${WebDavHttpAdapter.L}.request() using CapacitorHttp for ${options.method}`, + ); const capacitorResponse = await CapacitorHttp.request({ url: options.url, method: options.method, diff --git a/src/app/util/is-native-platform.ts b/src/app/util/is-native-platform.ts new file mode 100644 index 000000000..9a99395d5 --- /dev/null +++ b/src/app/util/is-native-platform.ts @@ -0,0 +1,19 @@ +import { Capacitor } from '@capacitor/core'; +import { IS_ANDROID_WEB_VIEW } from './is-android-web-view'; + +/** + * Whether running in a native Capacitor context (iOS or Android). + * This can be used in constants that are evaluated at module load time. + */ +export const IS_NATIVE_PLATFORM = Capacitor.isNativePlatform() || IS_ANDROID_WEB_VIEW; + +/** + * Whether running on iOS native (Capacitor). + */ +export const IS_IOS_NATIVE = Capacitor.getPlatform() === 'ios'; + +/** + * Whether running on Android native (Capacitor or WebView). + */ +export const IS_ANDROID_NATIVE = + Capacitor.getPlatform() === 'android' || IS_ANDROID_WEB_VIEW;