diff --git a/android/app/src/main/kotlin/com/traccar/traccar_client/storage/AppDatabase.kt b/android/app/src/main/kotlin/com/traccar/traccar_client/storage/AppDatabase.kt new file mode 100644 index 0000000..eb60153 --- /dev/null +++ b/android/app/src/main/kotlin/com/traccar/traccar_client/storage/AppDatabase.kt @@ -0,0 +1,33 @@ +package com.traccar.traccar_client.storage + +import android.content.Context +import androidx.room.Database +import androidx.room.Room +import androidx.room.RoomDatabase + +@Database( + entities = [LocationEntity::class, EventLogEntity::class], + version = 1, + exportSchema = false +) +abstract class AppDatabase : RoomDatabase() { + abstract fun locationDao(): LocationDao + abstract fun eventLogDao(): EventLogDao + + companion object { + @Volatile + private var INSTANCE: AppDatabase? = null + + fun getInstance(context: Context): AppDatabase { + return INSTANCE ?: synchronized(this) { + val instance = Room.databaseBuilder( + context.applicationContext, + AppDatabase::class.java, + "traccar_client_db" + ).build() + INSTANCE = instance + instance + } + } + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/com/traccar/traccar_client/storage/EventLogDao.kt b/android/app/src/main/kotlin/com/traccar/traccar_client/storage/EventLogDao.kt new file mode 100644 index 0000000..5c0a292 --- /dev/null +++ b/android/app/src/main/kotlin/com/traccar/traccar_client/storage/EventLogDao.kt @@ -0,0 +1,21 @@ +package com.traccar.traccar_client.storage + +import androidx.room.Dao +import androidx.room.Insert +import androidx.room.Query +import kotlinx.coroutines.flow.Flow + +@Dao +interface EventLogDao { + @Insert + suspend fun insert(entry: EventLogEntity): Long + + @Query("SELECT * FROM event_log ORDER BY timestamp DESC LIMIT 100") + fun getRecentEvents(): Flow> + + @Query("SELECT * FROM event_log ORDER BY timestamp DESC LIMIT :limit") + suspend fun getRecentEventsList(limit: Int): List + + @Query("DELETE FROM event_log WHERE timestamp < :beforeTimestamp") + suspend fun deleteOlderThan(beforeTimestamp: Long) +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/com/traccar/traccar_client/storage/EventLogEntity.kt b/android/app/src/main/kotlin/com/traccar/traccar_client/storage/EventLogEntity.kt new file mode 100644 index 0000000..6eabb63 --- /dev/null +++ b/android/app/src/main/kotlin/com/traccar/traccar_client/storage/EventLogEntity.kt @@ -0,0 +1,13 @@ +package com.traccar.traccar_client.storage + +import androidx.room.Entity +import androidx.room.PrimaryKey + +@Entity(tableName = "event_log") +data class EventLogEntity( + @PrimaryKey(autoGenerate = true) + val id: Long = 0, + val timestamp: Long, + val eventType: String, + val message: String +) \ No newline at end of file diff --git a/android/app/src/main/kotlin/com/traccar/traccar_client/storage/LocationDao.kt b/android/app/src/main/kotlin/com/traccar/traccar_client/storage/LocationDao.kt new file mode 100644 index 0000000..c5d6553 --- /dev/null +++ b/android/app/src/main/kotlin/com/traccar/traccar_client/storage/LocationDao.kt @@ -0,0 +1,31 @@ +package com.traccar.traccar_client.storage + +import androidx.room.Dao +import androidx.room.Insert +import androidx.room.Query +import androidx.room.Update +import kotlinx.coroutines.flow.Flow + +@Dao +interface LocationDao { + @Insert + suspend fun insert(location: LocationEntity): Long + + @Query("SELECT * FROM locations WHERE synced = 0 ORDER BY timestamp ASC") + suspend fun getUnsyncedLocations(): List + + @Query("UPDATE locations SET synced = 1 WHERE id = :id") + suspend fun markAsSynced(id: Long) + + @Query("UPDATE locations SET synced = 1 WHERE id IN (:ids)") + suspend fun markAllAsSynced(ids: List) + + @Query("SELECT * FROM locations ORDER BY timestamp DESC LIMIT 1") + fun getLastLocation(): Flow + + @Query("SELECT COUNT(*) FROM locations WHERE synced = 0") + suspend fun getUnsyncedCount(): Int + + @Query("DELETE FROM locations WHERE synced = 1 AND timestamp < :beforeTimestamp") + suspend fun deleteSyncedOlderThan(beforeTimestamp: Long) +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/com/traccar/traccar_client/storage/LocationEntity.kt b/android/app/src/main/kotlin/com/traccar/traccar_client/storage/LocationEntity.kt new file mode 100644 index 0000000..f1a3800 --- /dev/null +++ b/android/app/src/main/kotlin/com/traccar/traccar_client/storage/LocationEntity.kt @@ -0,0 +1,19 @@ +package com.traccar.traccar_client.storage + +import androidx.room.Entity +import androidx.room.PrimaryKey + +@Entity(tableName = "locations") +data class LocationEntity( + @PrimaryKey(autoGenerate = true) + val id: Long = 0, + val timestamp: Long, + val latitude: Double, + val longitude: Double, + val accuracy: Float?, + val speed: Float?, + val heading: Float?, + val altitude: Double?, + val isMoving: Boolean, + val synced: Boolean = false +) \ No newline at end of file