Add native Android components for daily notification plugin integration: - TimeSafariApplication: Custom Application class to register native fetcher - TimeSafariNativeFetcher: Implements NativeNotificationContentFetcher interface - network_security_config.xml: Allow cleartext for local development Configuration updates: - AndroidManifest.xml: Link custom Application class, add required permissions - build.gradle: Add Java 17 compile options and required dependencies - capacitor.config.ts: Add DailyNotification plugin configuration - NativeNotificationService.ts: Use "daily_" prefixed ID for schedule rollover Note: Subsequent notification scheduling after first fire still has issues that require further investigation. Co-authored-by: Cursor <cursoragent@cursor.com>
142 lines
3.1 KiB
TypeScript
142 lines
3.1 KiB
TypeScript
import { CapacitorConfig } from '@capacitor/cli';
|
|
|
|
const config: CapacitorConfig = {
|
|
appId: 'app.timesafari',
|
|
appName: 'TimeSafari',
|
|
webDir: 'dist',
|
|
server: {
|
|
cleartext: true
|
|
},
|
|
plugins: {
|
|
App: {
|
|
appUrlOpen: {
|
|
handlers: [
|
|
{
|
|
url: 'timesafari://*',
|
|
autoVerify: true
|
|
}
|
|
]
|
|
}
|
|
},
|
|
SplashScreen: {
|
|
launchShowDuration: 3000,
|
|
launchAutoHide: true,
|
|
backgroundColor: '#ffffff',
|
|
androidSplashResourceName: 'splash',
|
|
androidScaleType: 'CENTER_CROP',
|
|
showSpinner: false,
|
|
androidSpinnerStyle: 'large',
|
|
iosSpinnerStyle: 'small',
|
|
spinnerColor: '#999999',
|
|
splashFullScreen: true,
|
|
splashImmersive: true
|
|
},
|
|
CapSQLite: {
|
|
iosDatabaseLocation: 'Library/CapacitorDatabase',
|
|
iosIsEncryption: false,
|
|
iosBiometric: {
|
|
biometricAuth: false,
|
|
biometricTitle: 'Biometric login for TimeSafari'
|
|
},
|
|
androidIsEncryption: false,
|
|
androidBiometric: {
|
|
biometricAuth: false,
|
|
biometricTitle: 'Biometric login for TimeSafari'
|
|
},
|
|
electronIsEncryption: false
|
|
},
|
|
DailyNotification: {
|
|
debugMode: true,
|
|
enableNotifications: true,
|
|
timesafariConfig: {
|
|
activeDid: '', // Will be set dynamically from user's DID
|
|
endpoints: {
|
|
projectsLastUpdated: 'https://api.endorser.ch/api/v2/report/plansLastUpdatedBetween'
|
|
},
|
|
starredProjectsConfig: {
|
|
enabled: true,
|
|
starredPlanHandleIds: [],
|
|
fetchInterval: '0 8 * * *'
|
|
}
|
|
},
|
|
networkConfig: {
|
|
timeout: 30000,
|
|
retryAttempts: 3,
|
|
retryDelay: 1000
|
|
},
|
|
contentFetch: {
|
|
enabled: true,
|
|
schedule: '0 8 * * *',
|
|
fetchLeadTimeMinutes: 5
|
|
}
|
|
}
|
|
},
|
|
ios: {
|
|
contentInset: 'never',
|
|
allowsLinkPreview: true,
|
|
scrollEnabled: true,
|
|
limitsNavigationsToAppBoundDomains: true,
|
|
backgroundColor: '#ffffff',
|
|
allowNavigation: [
|
|
'*.timesafari.app',
|
|
'*.jsdelivr.net',
|
|
'api.endorser.ch'
|
|
]
|
|
},
|
|
android: {
|
|
allowMixedContent: true,
|
|
captureInput: true,
|
|
webContentsDebuggingEnabled: false,
|
|
allowNavigation: [
|
|
'*.timesafari.app',
|
|
'*.jsdelivr.net',
|
|
'api.endorser.ch',
|
|
'10.0.2.2:3000'
|
|
]
|
|
},
|
|
electron: {
|
|
deepLinking: {
|
|
schemes: ['timesafari']
|
|
},
|
|
buildOptions: {
|
|
appId: 'app.timesafari',
|
|
productName: 'TimeSafari',
|
|
directories: {
|
|
output: 'dist-electron-packages'
|
|
},
|
|
files: [
|
|
'dist/**/*',
|
|
'electron/**/*'
|
|
],
|
|
mac: {
|
|
category: 'public.app-category.productivity',
|
|
target: [
|
|
{
|
|
target: 'dmg',
|
|
arch: ['x64', 'arm64']
|
|
}
|
|
]
|
|
},
|
|
win: {
|
|
target: [
|
|
{
|
|
target: 'nsis',
|
|
arch: ['x64']
|
|
}
|
|
]
|
|
},
|
|
linux: {
|
|
target: [
|
|
{
|
|
target: 'AppImage',
|
|
arch: ['x64']
|
|
}
|
|
],
|
|
category: 'Utility'
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
export default config;
|