a7c5ed713a
- Request POST_NOTIFICATIONS permission at runtime in MainActivity (primary fix for notifications never appearing on Android 13+ phones including Android 16) - Register all 4 notification channels eagerly in SyncFlowApp.onCreate() instead of lazily inside workers - Add FOREGROUND_SERVICE_SHORT_SERVICE permission + shortService foreground type for Android 16 foreground service compatibility - Add global activity Log tab (new tab 2 in main nav) showing all sync events across all pairs, grouped by date with pair name, event icon, and file detail - Fix FileWatchService ON_CHANGE detection: ContentObserver on SAF tree URIs only fires for SAF-API writes, not raw filesystem writes. Now resolves primary:/* tree URIs to /storage/emulated/0/* and uses FileObserver for reliable detection - Bump version to 1.0.21 (build 22) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
30 lines
999 B
Kotlin
30 lines
999 B
Kotlin
package com.syncflow.ui.log
|
|
|
|
import androidx.lifecycle.ViewModel
|
|
import androidx.lifecycle.viewModelScope
|
|
import com.syncflow.data.db.SyncEventDao
|
|
import com.syncflow.data.db.SyncPairDao
|
|
import com.syncflow.data.db.entities.SyncEventEntity
|
|
import dagger.hilt.android.lifecycle.HiltViewModel
|
|
import kotlinx.coroutines.flow.SharingStarted
|
|
import kotlinx.coroutines.flow.combine
|
|
import kotlinx.coroutines.flow.stateIn
|
|
import javax.inject.Inject
|
|
|
|
data class LogEntry(val event: SyncEventEntity, val pairName: String)
|
|
|
|
@HiltViewModel
|
|
class LogViewModel @Inject constructor(
|
|
syncEventDao: SyncEventDao,
|
|
syncPairDao: SyncPairDao,
|
|
) : ViewModel() {
|
|
|
|
val entries = combine(
|
|
syncEventDao.observeAll(500),
|
|
syncPairDao.observeAll(),
|
|
) { events, pairs ->
|
|
val pairNames = pairs.associateBy({ it.id }, { it.name })
|
|
events.map { LogEntry(it, pairNames[it.syncPairId] ?: "Unknown") }
|
|
}.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), emptyList())
|
|
}
|