CRITICAL BUGFIXES: - IMPL_014: JSON/Markdown Timestamp Sync - Server mtime source of truth - IMPL_015: SyncStatus PENDING Fix - Set before JSON serialization - IMPL_001: Deletion Tracker Race Condition - Mutex-based sync - IMPL_002: ISO8601 Timezone Parsing - Multi-format support - IMPL_003: Memory Leak Prevention - SafeSardine Closeable - IMPL_004: E-Tag Batch Caching - ~50-100ms performance gain FEATURES: - Auto-updating timestamps in UI (every 30s) - Performance optimizations for Staggered Grid scrolling BUILD: - versionCode: 19 - versionName: 1.7.2 This release prepares for a new cross-platform Markdown editor (Web, Desktop Windows + Linux, Mobile) with proper JSON ↔ Markdown synchronization and resolves critical sync issues for external editor integration.
98 lines
3.9 KiB
Kotlin
98 lines
3.9 KiB
Kotlin
package dev.dettmer.simplenotes
|
|
|
|
import android.app.Application
|
|
import android.content.Context
|
|
import dev.dettmer.simplenotes.utils.Logger
|
|
import dev.dettmer.simplenotes.sync.NetworkMonitor
|
|
import dev.dettmer.simplenotes.utils.NotificationHelper
|
|
import dev.dettmer.simplenotes.utils.Constants
|
|
|
|
class SimpleNotesApplication : Application() {
|
|
|
|
companion object {
|
|
private const val TAG = "SimpleNotesApp"
|
|
}
|
|
|
|
lateinit var networkMonitor: NetworkMonitor // Public access für SettingsActivity
|
|
|
|
/**
|
|
* 🌍 v1.7.1: Apply app locale to Application Context
|
|
*
|
|
* This ensures ViewModels and other components using Application Context
|
|
* get the correct locale-specific strings.
|
|
*/
|
|
override fun attachBaseContext(base: Context) {
|
|
// Apply the app locale before calling super
|
|
// This is handled by AppCompatDelegate which reads from system storage
|
|
super.attachBaseContext(base)
|
|
}
|
|
|
|
override fun onCreate() {
|
|
super.onCreate()
|
|
|
|
val prefs = getSharedPreferences(Constants.PREFS_NAME, Context.MODE_PRIVATE)
|
|
|
|
// 🔧 Hotfix v1.6.2: Migrate offline mode setting BEFORE any ViewModel initialization
|
|
// This prevents the offline mode bug where users updating from v1.5.0 incorrectly
|
|
// appear as offline even though they have a configured server
|
|
migrateOfflineModeSetting(prefs)
|
|
|
|
// File-Logging ZUERST aktivieren (damit alle Logs geschrieben werden!)
|
|
if (prefs.getBoolean("file_logging_enabled", false)) {
|
|
Logger.enableFileLogging(this)
|
|
Logger.d(TAG, "📝 File logging enabled at Application startup")
|
|
}
|
|
|
|
Logger.d(TAG, "🚀 Application onCreate()")
|
|
|
|
// Initialize notification channel
|
|
NotificationHelper.createNotificationChannel(this)
|
|
Logger.d(TAG, "✅ Notification channel created")
|
|
|
|
// Initialize NetworkMonitor (WorkManager-based)
|
|
// VORTEIL: WorkManager läuft auch ohne aktive App!
|
|
networkMonitor = NetworkMonitor(applicationContext)
|
|
|
|
// Start WorkManager periodic sync
|
|
// Dies läuft im Hintergrund auch wenn App geschlossen ist
|
|
networkMonitor.startMonitoring()
|
|
|
|
Logger.d(TAG, "✅ WorkManager-based auto-sync initialized")
|
|
}
|
|
|
|
override fun onTerminate() {
|
|
super.onTerminate()
|
|
|
|
Logger.d(TAG, "🛑 Application onTerminate()")
|
|
|
|
// WorkManager läuft weiter auch nach onTerminate!
|
|
// Nur bei deaktiviertem Auto-Sync stoppen wir es
|
|
}
|
|
|
|
/**
|
|
* 🔧 Hotfix v1.6.2: Migrate offline mode setting for updates from v1.5.0
|
|
*
|
|
* Problem: KEY_OFFLINE_MODE didn't exist in v1.5.0, but MainViewModel
|
|
* and NoteEditorViewModel use `true` as default, causing existing users
|
|
* with configured servers to appear in offline mode after update.
|
|
*
|
|
* Fix: Set the key BEFORE any ViewModel is initialized based on whether
|
|
* a server was already configured.
|
|
*/
|
|
private fun migrateOfflineModeSetting(prefs: android.content.SharedPreferences) {
|
|
if (!prefs.contains(Constants.KEY_OFFLINE_MODE)) {
|
|
val serverUrl = prefs.getString(Constants.KEY_SERVER_URL, null)
|
|
val hasServerConfig = !serverUrl.isNullOrEmpty() &&
|
|
serverUrl != "http://" &&
|
|
serverUrl != "https://"
|
|
|
|
// If server was configured → offlineMode = false (continue syncing)
|
|
// If no server → offlineMode = true (new users / offline users)
|
|
val offlineModeValue = !hasServerConfig
|
|
prefs.edit().putBoolean(Constants.KEY_OFFLINE_MODE, offlineModeValue).apply()
|
|
|
|
Logger.i(TAG, "🔄 Migrated offline_mode_enabled: hasServer=$hasServerConfig → offlineMode=$offlineModeValue")
|
|
}
|
|
}
|
|
}
|