fix: Notification opens ComposeMainActivity, WiFi-Only toggle in own section
Fixes: 1. Notification click now opens ComposeMainActivity instead of legacy MainActivity 2. WiFi-Only toggle moved to its own 'Network Restriction' section at top of sync settings 3. Added hint explaining WiFi-Connect trigger is not affected by WiFi-Only setting UI Changes: - New section header: 'Network Restriction' / 'Netzwerk-Einschränkung' - WiFi-Only toggle now clearly separated from sync triggers - Info card shows when WiFi-Only is enabled explaining the exception
This commit is contained in:
@@ -68,15 +68,20 @@ class NetworkMonitor(private val context: Context) {
|
|||||||
|
|
||||||
lastConnectedNetworkId = currentNetworkId
|
lastConnectedNetworkId = currentNetworkId
|
||||||
|
|
||||||
// Auto-Sync check
|
// WiFi-Connect Trigger prüfen - NICHT KEY_AUTO_SYNC!
|
||||||
val autoSyncEnabled = prefs.getBoolean(Constants.KEY_AUTO_SYNC, false)
|
// Der Callback ist registriert WEIL KEY_SYNC_TRIGGER_WIFI_CONNECT = true
|
||||||
Logger.d(TAG, " Auto-Sync enabled: $autoSyncEnabled")
|
// Aber defensive Prüfung für den Fall, dass Settings sich geändert haben
|
||||||
|
val wifiConnectEnabled = prefs.getBoolean(
|
||||||
|
Constants.KEY_SYNC_TRIGGER_WIFI_CONNECT,
|
||||||
|
Constants.DEFAULT_TRIGGER_WIFI_CONNECT
|
||||||
|
)
|
||||||
|
Logger.d(TAG, " WiFi-Connect trigger enabled: $wifiConnectEnabled")
|
||||||
|
|
||||||
if (autoSyncEnabled) {
|
if (wifiConnectEnabled) {
|
||||||
Logger.d(TAG, " ✅ Triggering WorkManager...")
|
Logger.d(TAG, " ✅ Triggering WiFi-Connect sync...")
|
||||||
triggerWifiConnectSync()
|
triggerWifiConnectSync()
|
||||||
} else {
|
} else {
|
||||||
Logger.d(TAG, " ❌ Auto-sync disabled - not triggering")
|
Logger.d(TAG, " ⏭️ WiFi-Connect trigger disabled in settings")
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Logger.d(TAG, " ⚠️ Same WiFi network as before - ignoring (no network change)")
|
Logger.d(TAG, " ⚠️ Same WiFi network as before - ignoring (no network change)")
|
||||||
@@ -140,23 +145,55 @@ class NetworkMonitor(private val context: Context) {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Startet WorkManager mit Network Constraints + NetworkCallback
|
* Startet WorkManager mit Network Constraints + NetworkCallback
|
||||||
|
*
|
||||||
|
* 🆕 v1.7.0: Überarbeitete Logik - WiFi-Connect Trigger funktioniert UNABHÄNGIG von KEY_AUTO_SYNC
|
||||||
|
* - KEY_AUTO_SYNC + KEY_SYNC_TRIGGER_PERIODIC → Periodic Sync
|
||||||
|
* - KEY_SYNC_TRIGGER_WIFI_CONNECT → WiFi-Connect Trigger (unabhängig!)
|
||||||
*/
|
*/
|
||||||
fun startMonitoring() {
|
fun startMonitoring() {
|
||||||
val autoSyncEnabled = prefs.getBoolean(Constants.KEY_AUTO_SYNC, false)
|
Logger.d(TAG, "🚀 NetworkMonitor.startMonitoring() called")
|
||||||
|
|
||||||
if (!autoSyncEnabled) {
|
val autoSyncEnabled = prefs.getBoolean(Constants.KEY_AUTO_SYNC, false)
|
||||||
Logger.d(TAG, "Auto-sync disabled - stopping all monitoring")
|
val periodicEnabled = prefs.getBoolean(Constants.KEY_SYNC_TRIGGER_PERIODIC, Constants.DEFAULT_TRIGGER_PERIODIC)
|
||||||
stopMonitoring()
|
val wifiConnectEnabled = prefs.getBoolean(Constants.KEY_SYNC_TRIGGER_WIFI_CONNECT, Constants.DEFAULT_TRIGGER_WIFI_CONNECT)
|
||||||
return
|
|
||||||
|
Logger.d(TAG, " Settings: autoSync=$autoSyncEnabled, periodic=$periodicEnabled, wifiConnect=$wifiConnectEnabled")
|
||||||
|
|
||||||
|
// 1. Periodic Sync (nur wenn KEY_AUTO_SYNC UND KEY_SYNC_TRIGGER_PERIODIC aktiv)
|
||||||
|
if (autoSyncEnabled && periodicEnabled) {
|
||||||
|
Logger.d(TAG, "📅 Starting periodic sync...")
|
||||||
|
startPeriodicSync()
|
||||||
|
} else {
|
||||||
|
WorkManager.getInstance(context).cancelUniqueWork(AUTO_SYNC_WORK_NAME)
|
||||||
|
Logger.d(TAG, "⏭️ Periodic sync disabled (autoSync=$autoSyncEnabled, periodic=$periodicEnabled)")
|
||||||
}
|
}
|
||||||
|
|
||||||
Logger.d(TAG, "🚀 Starting NetworkMonitor (WorkManager + WiFi Callback)")
|
// 2. WiFi-Connect Trigger (🆕 UNABHÄNGIG von KEY_AUTO_SYNC!)
|
||||||
|
if (wifiConnectEnabled) {
|
||||||
// 1. WorkManager für periodic sync
|
Logger.d(TAG, "📶 Starting WiFi monitoring...")
|
||||||
startPeriodicSync()
|
|
||||||
|
|
||||||
// 2. NetworkCallback für WiFi-Connect Detection
|
|
||||||
startWifiMonitoring()
|
startWifiMonitoring()
|
||||||
|
} else {
|
||||||
|
stopWifiMonitoring()
|
||||||
|
Logger.d(TAG, "⏭️ WiFi-Connect trigger disabled")
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. Logging für Debug
|
||||||
|
if (!autoSyncEnabled && !wifiConnectEnabled) {
|
||||||
|
Logger.d(TAG, "🛑 No background triggers active")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 🆕 v1.7.0: Stoppt nur WiFi-Monitoring, nicht den gesamten NetworkMonitor
|
||||||
|
*/
|
||||||
|
private fun stopWifiMonitoring() {
|
||||||
|
try {
|
||||||
|
connectivityManager.unregisterNetworkCallback(networkCallback)
|
||||||
|
Logger.d(TAG, "🛑 WiFi NetworkCallback unregistered")
|
||||||
|
} catch (e: Exception) {
|
||||||
|
// Already unregistered - das ist OK
|
||||||
|
Logger.d(TAG, " WiFi callback already unregistered")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -85,6 +85,31 @@ fun SyncSettingsScreen(
|
|||||||
Spacer(modifier = Modifier.height(8.dp))
|
Spacer(modifier = Modifier.height(8.dp))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ═══════════════════════════════════════════════════════════════
|
||||||
|
// 🆕 v1.7.0: NETZWERK-EINSCHRÄNKUNG Section (Global für alle Trigger)
|
||||||
|
// ═══════════════════════════════════════════════════════════════
|
||||||
|
|
||||||
|
SettingsSectionHeader(text = stringResource(R.string.sync_section_network))
|
||||||
|
|
||||||
|
// WiFi-Only Sync Toggle - Gilt für ALLE Trigger außer WiFi-Connect
|
||||||
|
SettingsSwitch(
|
||||||
|
title = stringResource(R.string.sync_wifi_only_title),
|
||||||
|
subtitle = stringResource(R.string.sync_wifi_only_subtitle),
|
||||||
|
checked = wifiOnlySync,
|
||||||
|
onCheckedChange = { viewModel.setWifiOnlySync(it) },
|
||||||
|
icon = Icons.Default.Wifi,
|
||||||
|
enabled = isServerConfigured
|
||||||
|
)
|
||||||
|
|
||||||
|
// Info-Hinweis dass WiFi-Connect davon ausgenommen ist
|
||||||
|
if (wifiOnlySync && isServerConfigured) {
|
||||||
|
SettingsInfoCard(
|
||||||
|
text = stringResource(R.string.sync_wifi_only_hint)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
SettingsDivider()
|
||||||
|
|
||||||
// ═══════════════════════════════════════════════════════════════
|
// ═══════════════════════════════════════════════════════════════
|
||||||
// SOFORT-SYNC Section
|
// SOFORT-SYNC Section
|
||||||
// ═══════════════════════════════════════════════════════════════
|
// ═══════════════════════════════════════════════════════════════
|
||||||
@@ -111,16 +136,6 @@ fun SyncSettingsScreen(
|
|||||||
enabled = isServerConfigured
|
enabled = isServerConfigured
|
||||||
)
|
)
|
||||||
|
|
||||||
// 🆕 v1.7.0: WiFi-Only Sync Toggle
|
|
||||||
SettingsSwitch(
|
|
||||||
title = stringResource(R.string.sync_wifi_only_title),
|
|
||||||
subtitle = stringResource(R.string.sync_wifi_only_subtitle),
|
|
||||||
checked = wifiOnlySync,
|
|
||||||
onCheckedChange = { viewModel.setWifiOnlySync(it) },
|
|
||||||
icon = Icons.Default.Wifi,
|
|
||||||
enabled = isServerConfigured
|
|
||||||
)
|
|
||||||
|
|
||||||
SettingsDivider()
|
SettingsDivider()
|
||||||
|
|
||||||
// ═══════════════════════════════════════════════════════════════
|
// ═══════════════════════════════════════════════════════════════
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import android.os.Handler
|
|||||||
import android.os.Looper
|
import android.os.Looper
|
||||||
import androidx.core.app.NotificationCompat
|
import androidx.core.app.NotificationCompat
|
||||||
import androidx.core.app.NotificationManagerCompat
|
import androidx.core.app.NotificationManagerCompat
|
||||||
import dev.dettmer.simplenotes.MainActivity
|
import dev.dettmer.simplenotes.ui.main.ComposeMainActivity
|
||||||
|
|
||||||
object NotificationHelper {
|
object NotificationHelper {
|
||||||
|
|
||||||
@@ -58,7 +58,7 @@ object NotificationHelper {
|
|||||||
* Zeigt Erfolgs-Notification nach Sync
|
* Zeigt Erfolgs-Notification nach Sync
|
||||||
*/
|
*/
|
||||||
fun showSyncSuccessNotification(context: Context, syncedCount: Int) {
|
fun showSyncSuccessNotification(context: Context, syncedCount: Int) {
|
||||||
val intent = Intent(context, MainActivity::class.java).apply {
|
val intent = Intent(context, ComposeMainActivity::class.java).apply {
|
||||||
flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
|
flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -154,7 +154,7 @@ object NotificationHelper {
|
|||||||
* Zeigt Notification bei erkanntem Konflikt
|
* Zeigt Notification bei erkanntem Konflikt
|
||||||
*/
|
*/
|
||||||
fun showConflictNotification(context: Context, conflictCount: Int) {
|
fun showConflictNotification(context: Context, conflictCount: Int) {
|
||||||
val intent = Intent(context, MainActivity::class.java)
|
val intent = Intent(context, ComposeMainActivity::class.java)
|
||||||
val pendingIntent = PendingIntent.getActivity(
|
val pendingIntent = PendingIntent.getActivity(
|
||||||
context, 0, intent,
|
context, 0, intent,
|
||||||
PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
|
PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
|
||||||
@@ -229,7 +229,7 @@ object NotificationHelper {
|
|||||||
*/
|
*/
|
||||||
fun showSyncSuccess(context: Context, count: Int) {
|
fun showSyncSuccess(context: Context, count: Int) {
|
||||||
// PendingIntent für App-Öffnung
|
// PendingIntent für App-Öffnung
|
||||||
val intent = Intent(context, MainActivity::class.java).apply {
|
val intent = Intent(context, ComposeMainActivity::class.java).apply {
|
||||||
flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP
|
flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP
|
||||||
}
|
}
|
||||||
val pendingIntent = PendingIntent.getActivity(
|
val pendingIntent = PendingIntent.getActivity(
|
||||||
@@ -260,7 +260,7 @@ object NotificationHelper {
|
|||||||
*/
|
*/
|
||||||
fun showSyncError(context: Context, message: String) {
|
fun showSyncError(context: Context, message: String) {
|
||||||
// PendingIntent für App-Öffnung
|
// PendingIntent für App-Öffnung
|
||||||
val intent = Intent(context, MainActivity::class.java).apply {
|
val intent = Intent(context, ComposeMainActivity::class.java).apply {
|
||||||
flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP
|
flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP
|
||||||
}
|
}
|
||||||
val pendingIntent = PendingIntent.getActivity(
|
val pendingIntent = PendingIntent.getActivity(
|
||||||
@@ -297,7 +297,7 @@ object NotificationHelper {
|
|||||||
*/
|
*/
|
||||||
fun showSyncWarning(context: Context, hoursSinceLastSync: Long) {
|
fun showSyncWarning(context: Context, hoursSinceLastSync: Long) {
|
||||||
// PendingIntent für App-Öffnung
|
// PendingIntent für App-Öffnung
|
||||||
val intent = Intent(context, MainActivity::class.java).apply {
|
val intent = Intent(context, ComposeMainActivity::class.java).apply {
|
||||||
flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP
|
flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP
|
||||||
}
|
}
|
||||||
val pendingIntent = PendingIntent.getActivity(
|
val pendingIntent = PendingIntent.getActivity(
|
||||||
|
|||||||
@@ -206,10 +206,13 @@
|
|||||||
<string name="auto_sync_info">ℹ️ Auto-Sync:\n\n• Prüft alle 30 Min ob Server erreichbar\n• Funktioniert bei jeder WiFi-Verbindung\n• Läuft auch im Hintergrund\n• Minimaler Akkuverbrauch (~0.4%%/Tag)</string>
|
<string name="auto_sync_info">ℹ️ Auto-Sync:\n\n• Prüft alle 30 Min ob Server erreichbar\n• Funktioniert bei jeder WiFi-Verbindung\n• Läuft auch im Hintergrund\n• Minimaler Akkuverbrauch (~0.4%%/Tag)</string>
|
||||||
|
|
||||||
<!-- 🌟 v1.6.0: Configurable Sync Triggers -->
|
<!-- 🌟 v1.6.0: Configurable Sync Triggers -->
|
||||||
|
<string name="sync_section_network">📶 Netzwerk-Einschränkung</string>
|
||||||
<string name="sync_section_instant">📲 Sofort-Sync</string>
|
<string name="sync_section_instant">📲 Sofort-Sync</string>
|
||||||
<string name="sync_section_background">📡 Hintergrund-Sync</string>
|
<string name="sync_section_background">📡 Hintergrund-Sync</string>
|
||||||
<string name="sync_section_advanced">⚙️ Erweitert</string>
|
<string name="sync_section_advanced">⚙️ Erweitert</string>
|
||||||
|
|
||||||
|
<string name="sync_wifi_only_hint">💡 Der WiFi-Connect Trigger ist davon nicht betroffen \u2013 er synchronisiert immer wenn WiFi verbunden wird.</string>
|
||||||
|
|
||||||
<string name="sync_trigger_on_save_title">Nach dem Speichern</string>
|
<string name="sync_trigger_on_save_title">Nach dem Speichern</string>
|
||||||
<string name="sync_trigger_on_save_subtitle">Sync sofort nach jeder Änderung</string>
|
<string name="sync_trigger_on_save_subtitle">Sync sofort nach jeder Änderung</string>
|
||||||
|
|
||||||
@@ -228,7 +231,7 @@
|
|||||||
<!-- 🆕 v1.7.0: WiFi-Only Sync -->
|
<!-- 🆕 v1.7.0: WiFi-Only Sync -->
|
||||||
<string name="sync_wifi_only_title">Sync nur im WLAN</string>
|
<string name="sync_wifi_only_title">Sync nur im WLAN</string>
|
||||||
<string name="sync_wifi_only_subtitle">Sync wird nur durchgeführt wenn WLAN verbunden ist. Spart mobiles Datenvolumen und verhindert lange Wartezeit.</string>
|
<string name="sync_wifi_only_subtitle">Sync wird nur durchgeführt wenn WLAN verbunden ist. Spart mobiles Datenvolumen und verhindert lange Wartezeit.</string>
|
||||||
<string name="sync_wifi_only_hint">Sync nur im WLAN möglich</string>
|
<string name="sync_wifi_only_blocked">Sync nur im WLAN möglich</string>
|
||||||
|
|
||||||
<string name="sync_manual_hint">Manueller Sync (Toolbar/Pull-to-Refresh) ist ebenfalls verfügbar.</string>
|
<string name="sync_manual_hint">Manueller Sync (Toolbar/Pull-to-Refresh) ist ebenfalls verfügbar.</string>
|
||||||
<string name="sync_manual_hint_disabled">Sync ist im Offline-Modus nicht verfügbar.</string>
|
<string name="sync_manual_hint_disabled">Sync ist im Offline-Modus nicht verfügbar.</string>
|
||||||
|
|||||||
@@ -206,10 +206,13 @@
|
|||||||
<string name="auto_sync_info">ℹ️ Auto-Sync:\n\n• Checks every 30 min if server is reachable\n• Works on any WiFi connection\n• Runs in background\n• Minimal battery usage (~0.4%%/day)</string>
|
<string name="auto_sync_info">ℹ️ Auto-Sync:\n\n• Checks every 30 min if server is reachable\n• Works on any WiFi connection\n• Runs in background\n• Minimal battery usage (~0.4%%/day)</string>
|
||||||
|
|
||||||
<!-- 🌟 v1.6.0: Configurable Sync Triggers -->
|
<!-- 🌟 v1.6.0: Configurable Sync Triggers -->
|
||||||
|
<string name="sync_section_network">📶 Network Restriction</string>
|
||||||
<string name="sync_section_instant">📲 Instant Sync</string>
|
<string name="sync_section_instant">📲 Instant Sync</string>
|
||||||
<string name="sync_section_background">📡 Background Sync</string>
|
<string name="sync_section_background">📡 Background Sync</string>
|
||||||
<string name="sync_section_advanced">⚙️ Advanced</string>
|
<string name="sync_section_advanced">⚙️ Advanced</string>
|
||||||
|
|
||||||
|
<string name="sync_wifi_only_hint">💡 WiFi-Connect Trigger is not affected by this setting \u2013 it always syncs when WiFi is connected.</string>
|
||||||
|
|
||||||
<string name="sync_trigger_on_save_title">After Saving</string>
|
<string name="sync_trigger_on_save_title">After Saving</string>
|
||||||
<string name="sync_trigger_on_save_subtitle">Sync immediately after each change</string>
|
<string name="sync_trigger_on_save_subtitle">Sync immediately after each change</string>
|
||||||
|
|
||||||
@@ -228,7 +231,7 @@
|
|||||||
<!-- 🆕 v1.7.0: WiFi-Only Sync -->
|
<!-- 🆕 v1.7.0: WiFi-Only Sync -->
|
||||||
<string name="sync_wifi_only_title">WiFi-only sync</string>
|
<string name="sync_wifi_only_title">WiFi-only sync</string>
|
||||||
<string name="sync_wifi_only_subtitle">Sync only when connected to WiFi. Saves mobile data and prevents long wait times.</string>
|
<string name="sync_wifi_only_subtitle">Sync only when connected to WiFi. Saves mobile data and prevents long wait times.</string>
|
||||||
<string name="sync_wifi_only_hint">Sync only works when connected to WiFi</string>
|
<string name="sync_wifi_only_blocked">Sync only works when connected to WiFi</string>
|
||||||
|
|
||||||
<string name="sync_manual_hint">Manual sync (toolbar/pull-to-refresh) is also available.</string>
|
<string name="sync_manual_hint">Manual sync (toolbar/pull-to-refresh) is also available.</string>
|
||||||
<string name="sync_manual_hint_disabled">Sync is not available in offline mode.</string>
|
<string name="sync_manual_hint_disabled">Sync is not available in offline mode.</string>
|
||||||
|
|||||||
Reference in New Issue
Block a user