diff --git a/app/src/main/kotlin/farm/hobbs/kioskbrowser/AdminActivity.kt b/app/src/main/kotlin/farm/hobbs/kioskbrowser/AdminActivity.kt index 972b0bd..e5be313 100644 --- a/app/src/main/kotlin/farm/hobbs/kioskbrowser/AdminActivity.kt +++ b/app/src/main/kotlin/farm/hobbs/kioskbrowser/AdminActivity.kt @@ -6,6 +6,7 @@ import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity import androidx.datastore.preferences.core.edit import androidx.datastore.preferences.core.stringPreferencesKey +import farm.hobbs.kioskbrowser.analytics.AnalyticsManager import farm.hobbs.kioskbrowser.databinding.ActivityAdminBinding import kotlinx.coroutines.flow.first import kotlinx.coroutines.runBlocking @@ -15,11 +16,14 @@ import android.widget.EditText class AdminActivity : AppCompatActivity() { private lateinit var binding: ActivityAdminBinding + private lateinit var analytics: AnalyticsManager private val adminPin = "1234" // Default PIN - should be configurable override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + analytics = AnalyticsManager.getInstance(this) + // Require PIN before showing settings showPinDialog() } @@ -36,8 +40,10 @@ class AdminActivity : AppCompatActivity() { .setView(input) .setPositiveButton("OK") { _, _ -> if (verifyPin(input.text.toString())) { + analytics.logAdminAccess(success = true) setupUI() } else { + analytics.logAdminAccess(success = false) Toast.makeText(this, "Invalid PIN", Toast.LENGTH_SHORT).show() finish() } diff --git a/app/src/main/kotlin/farm/hobbs/kioskbrowser/MainActivity.kt b/app/src/main/kotlin/farm/hobbs/kioskbrowser/MainActivity.kt index 7b0c86f..9dfb15c 100644 --- a/app/src/main/kotlin/farm/hobbs/kioskbrowser/MainActivity.kt +++ b/app/src/main/kotlin/farm/hobbs/kioskbrowser/MainActivity.kt @@ -23,6 +23,7 @@ import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.datastore.preferences.core.stringPreferencesKey import androidx.datastore.preferences.preferencesDataStore +import farm.hobbs.kioskbrowser.analytics.AnalyticsManager import farm.hobbs.kioskbrowser.databinding.ActivityMainBinding import kotlinx.coroutines.flow.first import kotlinx.coroutines.runBlocking @@ -33,13 +34,16 @@ class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding private lateinit var webView: WebView + private lateinit var analytics: AnalyticsManager private val idleHandler = Handler(Looper.getMainLooper()) private var idleTimeoutMs = 300_000L // 5 minutes default private var homepage = "https://hobbs.farm" private var whitelist = listOf("hobbs.farm") + private var sessionStartTime = 0L private val idleRunnable = Runnable { + analytics.logIdleReset() loadHomepage() clearSession() } @@ -50,6 +54,11 @@ class MainActivity : AppCompatActivity() { binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) + // Initialize analytics + analytics = AnalyticsManager.getInstance(this) + sessionStartTime = System.currentTimeMillis() + analytics.logSessionStart() + setupFullscreen() loadSettings() setupWebView() @@ -121,6 +130,7 @@ class MainActivity : AppCompatActivity() { override fun onPageFinished(view: WebView?, url: String?) { super.onPageFinished(view, url) resetIdleTimer() + url?.let { analytics.logPageView(it) } } } @@ -182,6 +192,12 @@ class MainActivity : AppCompatActivity() { super.onPause() idleHandler.removeCallbacks(idleRunnable) } + + override fun onDestroy() { + super.onDestroy() + val durationMs = System.currentTimeMillis() - sessionStartTime + analytics.logSessionEnd("app_close", durationMs) + } // Secret admin gesture: triple-tap top-left corner to open settings private var tapCount = 0