Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
buildscript {
ext.kotlin_version = "1.7.10"
ext.kotlin_version = "1.9.24"
repositories {
google()
mavenCentral()
Expand All @@ -8,9 +8,9 @@ buildscript {
}
}
dependencies {
classpath "com.android.tools.build:gradle:7.4.2"
classpath 'com.android.tools.build:gradle:8.11.2'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "org.jetbrains.dokka:dokka-gradle-plugin:1.4.32"
classpath "org.jetbrains.dokka:dokka-gradle-plugin:2.0.0"
}
}

Expand Down
35 changes: 28 additions & 7 deletions example/build.gradle
Original file line number Diff line number Diff line change
@@ -1,30 +1,51 @@
apply plugin: "com.android.application"
apply plugin: "kotlin-android"
apply plugin: "kotlin-android-extensions"

android {
compileSdkVersion 31
compileSdk 36
defaultConfig {
applicationId "io.radar.example"
minSdkVersion 23
targetSdkVersion 31
targetSdkVersion 35
versionCode 1
versionName "1.0"
}
compileOptions {
coreLibraryDesugaringEnabled = true
targetCompatibility = JavaVersion.VERSION_17
sourceCompatibility = JavaVersion.VERSION_17
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro"
}
}
buildFeatures {
buildConfig = true
viewBinding = true
compose = true
}
composeOptions {
kotlinCompilerExtensionVersion = "1.5.14"
}
namespace 'io.radar.example'
}

dependencies {
implementation project(':sdk')
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation 'androidx.appcompat:appcompat:1.4.1'
implementation 'androidx.core:core-ktx:1.7.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.1'
implementation "com.google.android.play:integrity:1.2.0"
// implementation 'com.google.android.gms:play-services-location:21.3.0'
coreLibraryDesugaring "com.android.tools:desugar_jdk_libs:2.1.5"
implementation 'androidx.appcompat:appcompat:1.7.1'
implementation 'androidx.core:core-ktx:1.17.0'
implementation 'androidx.constraintlayout:constraintlayout:2.2.1'
implementation "com.google.android.play:integrity:1.5.0"

implementation platform('androidx.compose:compose-bom:2025.10.00')
implementation 'androidx.compose.ui:ui'
implementation 'androidx.activity:activity-compose'
implementation 'androidx.compose.material3:material3'
implementation 'org.maplibre.gl:android-sdk:12.0.0'
}
8 changes: 5 additions & 3 deletions example/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="io.radar.example">
<manifest xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android">

<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
Expand All @@ -16,7 +16,9 @@
<uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_LOCATION"/>

<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
<uses-permission android:name="android.permission.VIBRATE"/>

<application
android:allowBackup="true"
android:fullBackupOnly="true"
Expand Down
102 changes: 102 additions & 0 deletions example/src/main/java/io/radar/example/GmsMapLibreEngine.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
//package io.radar.example
//
//import android.Manifest
//import android.app.PendingIntent
//import android.content.Context
//import android.os.Looper
//import androidx.annotation.RequiresPermission
//import com.google.android.gms.location.LastLocationRequest
//import com.google.android.gms.location.LocationAvailability
//import com.google.android.gms.location.LocationCallback
//import com.google.android.gms.location.LocationRequest
//import com.google.android.gms.location.LocationResult
//import com.google.android.gms.location.LocationServices
//import com.google.android.gms.location.Priority
//import org.maplibre.android.location.engine.LocationEngine
//import org.maplibre.android.location.engine.LocationEngineCallback
//import org.maplibre.android.location.engine.LocationEngineRequest
//import org.maplibre.android.location.engine.LocationEngineResult
//
//class GmsMapLibreEngine(context: Context): LocationEngine {
// private val callbackMap = HashMap<LocationEngineCallback<LocationEngineResult>, LocationCallback>()
// private val client = LocationServices.getFusedLocationProviderClient(context)
//
// @RequiresPermission(allOf = [Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION])
// override fun getLastLocation(p0: LocationEngineCallback<LocationEngineResult>) {
// println("ENGINE: getLastLocation called")
//
// client.setMockMode(false)
//
// client.getLastLocation(LastLocationRequest.Builder().build()).addOnSuccessListener { location ->
// print("ENGINE: getLastLocation success $location")
// p0.onSuccess(LocationEngineResult.create(location))
// }.addOnFailureListener { exception ->
// print("ENGINE: getLastLocation failed $exception")
// p0.onFailure(exception)
// }
// }
//
// @RequiresPermission(allOf = [Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION])
// override fun requestLocationUpdates(
// p0: LocationEngineRequest,
// p1: LocationEngineCallback<LocationEngineResult>,
// p2: Looper?,
// ) {
// println("ENGINE: requestLocationUpdates called ${p0.priority} ${p0.interval} ${p0.fastestInterval}")
// val priority = when (p0.priority) {
// LocationEngineRequest.PRIORITY_HIGH_ACCURACY -> Priority.PRIORITY_HIGH_ACCURACY
// LocationEngineRequest.PRIORITY_NO_POWER -> Priority.PRIORITY_PASSIVE
// LocationEngineRequest.PRIORITY_LOW_POWER -> Priority.PRIORITY_LOW_POWER
// LocationEngineRequest.PRIORITY_BALANCED_POWER_ACCURACY -> Priority.PRIORITY_BALANCED_POWER_ACCURACY
// else -> Priority.PRIORITY_HIGH_ACCURACY
// }
// val request = LocationRequest.Builder(priority, p0.interval).setMaxUpdateDelayMillis(p0.maxWaitTime).build()
// val callback = object : LocationCallback() {
// override fun onLocationResult(var1: LocationResult) {
// println("ENGINE: location updated")
// p1.onSuccess(LocationEngineResult.create(var1.locations))
// }
//
// override fun onLocationAvailability(p0: LocationAvailability) {
// println("ENGINE: location available")
// }
// }
// callbackMap[p1] = callback
// client.requestLocationUpdates(request, callback, p2)
// }
//
// @RequiresPermission(allOf = [Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION])
// override fun requestLocationUpdates(
// p0: LocationEngineRequest,
// p1: PendingIntent?,
// ) {
// println("ENGINE: requestLocationUpdates intent called $p1")
// if (p1 == null) {
// return
// }
// val priority = when (p0.priority) {
// LocationEngineRequest.PRIORITY_HIGH_ACCURACY -> Priority.PRIORITY_HIGH_ACCURACY
// LocationEngineRequest.PRIORITY_NO_POWER -> Priority.PRIORITY_PASSIVE
// LocationEngineRequest.PRIORITY_LOW_POWER -> Priority.PRIORITY_LOW_POWER
// LocationEngineRequest.PRIORITY_BALANCED_POWER_ACCURACY -> Priority.PRIORITY_BALANCED_POWER_ACCURACY
// else -> Priority.PRIORITY_HIGH_ACCURACY
// }
// val request = LocationRequest.Builder(priority, p0.interval).setMaxUpdateDelayMillis(p0.maxWaitTime).build()
// client.requestLocationUpdates(request, p1)
// }
//
// override fun removeLocationUpdates(p0: LocationEngineCallback<LocationEngineResult>) {
// println("ENGINE: removeLocationUpdates")
// val callback = callbackMap[p0]
// if (callback != null) {
// client.removeLocationUpdates(callback)
// }
// }
//
// override fun removeLocationUpdates(p0: PendingIntent?) {
// println("ENGINE: removeLocationUpdates intent $p0")
// if (p0 != null) {
// client.removeLocationUpdates(p0)
// }
// }
//}
50 changes: 50 additions & 0 deletions example/src/main/java/io/radar/example/LogsView.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package io.radar.example

import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.Button
import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.FontWeight

@Composable
fun LogsView(receiver: MyRadarReceiver) {
val eventScrollState = rememberScrollState()
val logScrollState = rememberScrollState()

Column(modifier = Modifier.fillMaxSize(), verticalArrangement = Arrangement.SpaceEvenly) {
Column(modifier = Modifier.weight(1f)) {
Row {
Text("Logs:", style = TextStyle(fontWeight = FontWeight.Bold))
Button(onClick = { receiver.logs.clear() }) { Text("Clear") }
}
Column(modifier = Modifier.verticalScroll(logScrollState)) {
receiver.logs.map {
HorizontalDivider()
Text(it)
}
}
}
Column(modifier = Modifier.weight(1f)) {
Row {
Text("Events:", style = TextStyle(fontWeight = FontWeight.Bold))
Button(onClick = { receiver.events.clear() }) { Text("Clear") }
}
Column(modifier = Modifier.verticalScroll(eventScrollState)) {
receiver.events.map {
HorizontalDivider()
it.geofence?.let { geofence ->
Text("${it.type} ${geofence.externalId}")
}
}
}
}
}
}
Loading