trkpt/app/src/main/java/org/y20k/trackbook/Trackbook.kt
2023-03-11 12:30:24 -08:00

140 lines
No EOL
4.2 KiB
Kotlin

/*
* Trackbook.kt
* Implements the Trackbook class
* Trackbook is the base Application class that sets up day and night theme
*
* This file is part of
* TRACKBOOK - Movement Recorder for Android
*
* Copyright (c) 2016-22 - Y20K.org
* Licensed under the MIT-License
* http://opensource.org/licenses/MIT
*
* Trackbook uses osmdroid - OpenStreetMap-Tools for Android
* https://github.com/osmdroid/osmdroid
*/
package org.y20k.trackbook
import android.Manifest
import android.app.Activity
import android.app.Application
import android.content.pm.PackageManager
import android.database.Cursor
import android.util.Log
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import com.google.android.material.color.DynamicColors
import org.y20k.trackbook.helpers.AppThemeHelper
import org.y20k.trackbook.helpers.LogHelper
import org.y20k.trackbook.helpers.PreferencesHelper
import org.y20k.trackbook.helpers.PreferencesHelper.initPreferences
import java.io.File
interface DatabaseChangedListener
{
fun database_changed()
}
class Trackbook(): Application() {
val database: Database = Database(this)
val homepoints: ArrayList<Homepoint> = ArrayList()
val database_changed_listeners = ArrayList<DatabaseChangedListener>()
fun call_database_changed_listeners()
{
for (listener in this.database_changed_listeners)
{
listener.database_changed()
}
}
override fun onCreate()
{
super.onCreate()
LogHelper.v("VOUSSOIR", "Trackbook application started.")
DynamicColors.applyToActivitiesIfAvailable(this)
// initialize single sharedPreferences object when app is launched
initPreferences()
// set Dark / Light theme state
AppThemeHelper.setTheme(PreferencesHelper.loadThemeSelection())
Log.i("VOUSSOIR", "Device ID = ${PreferencesHelper.load_device_id()}")
}
fun load_database()
{
Log.i("VOUSSOIR", "Trackbook.load_database")
val folder = PreferencesHelper.load_database_folder()
this.database.commit()
if (this.database.ready)
{
this.database.close()
}
if (folder == "")
{
this.database.ready = false
return
}
if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)
{
this.database.connect(File(folder + "/trkpt_${PreferencesHelper.load_device_id()}.db"))
this.load_homepoints()
}
else
{
this.database.ready = false
}
this.call_database_changed_listeners()
}
fun load_homepoints()
{
Log.i("VOUSSOIR", "Trackbook.load_homepoints")
this.homepoints.clear()
homepoint_generator().forEach { homepoint -> this.homepoints.add(homepoint) }
}
fun homepoint_generator() = iterator<Homepoint>
{
if (! database.ready)
{
Log.i("VOUSSOIR", "Trackbook.homepoint_generator: database is not ready.")
return@iterator
}
val cursor: Cursor = database.connection.rawQuery(
"SELECT lat, lon, radius, name FROM homepoints",
arrayOf()
)
Log.i("VOUSSOIR", "Trackbook.homepoint_generator: Got ${cursor.count} homepoints.")
val COLUMN_LAT = cursor.getColumnIndex("lat")
val COLUMN_LON = cursor.getColumnIndex("lon")
val COLUMN_RADIUS = cursor.getColumnIndex("radius")
val COLUMN_NAME = cursor.getColumnIndex("name")
try
{
while (cursor.moveToNext())
{
val homepoint = Homepoint(
latitude=cursor.getDouble(COLUMN_LAT),
longitude=cursor.getDouble(COLUMN_LON),
radius=cursor.getDouble(COLUMN_RADIUS),
name=cursor.getString(COLUMN_NAME),
)
yield(homepoint)
}
}
finally
{
cursor.close();
}
}
override fun onTerminate()
{
super.onTerminate()
LogHelper.v("VOUSSOIR", "Trackbook application terminated.")
database.close()
}
}