diff options
14 files changed, 72 insertions, 51 deletions
diff --git a/androidApp/build.gradle.kts b/androidApp/build.gradle.kts index 73b9759..dfa6d29 100644 --- a/androidApp/build.gradle.kts +++ b/androidApp/build.gradle.kts @@ -6,18 +6,22 @@ plugins { } android { - compileSdk = 31 + compileSdk = 34 defaultConfig { applicationId = "net.etbsa.etbsa" minSdk = 21 - targetSdk = 31 - versionCode = 1405 - versionName = "1.3.5" + targetSdk = 34 + versionCode = 1407 + versionName = "1.3.7" ndk { abiFilters.clear() abiFilters += listOf("armeabi-v7a", "arm64-v8a") } } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } buildTypes { getByName("release") { isMinifyEnabled = false @@ -38,26 +42,27 @@ android { isDefault = true } } + namespace = "mx.trackermap.TrackerMap.android" } val googleImplementation by configurations dependencies { implementation(project(":shared")) - implementation("com.google.android.material:material:1.6.0") - implementation("androidx.appcompat:appcompat:1.4.1") + implementation("com.google.android.material:material:1.9.0") + implementation("androidx.appcompat:appcompat:1.6.1") implementation("androidx.constraintlayout:constraintlayout:2.1.4") - implementation("com.squareup.okhttp3:okhttp:4.9.1") + implementation("com.squareup.okhttp3:okhttp:4.10.0") implementation("com.github.Zhuinden:live-event:1.2.0") - implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.1") - implementation("androidx.lifecycle:lifecycle-viewmodel-savedstate:2.4.1") - implementation("androidx.preference:preference-ktx:1.2.0") + implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2") + implementation("androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.2") + implementation("androidx.preference:preference-ktx:1.2.1") implementation("io.insert-koin:koin-android:3.1.4") - implementation("androidx.core:core-ktx:1.7.0") - implementation("androidx.activity:activity-ktx:1.4.0") - implementation("androidx.fragment:fragment-ktx:1.4.1") + implementation("androidx.core:core-ktx:1.12.0") + implementation("androidx.activity:activity-ktx:1.7.2") + implementation("androidx.fragment:fragment-ktx:1.6.1") implementation("io.ktor:ktor-client-serialization:1.6.6") - implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.3.1") + implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.4.0") implementation("com.github.zerobranch:SwipeLayout:1.3.1") implementation("com.github.addisonElliott:SegmentedButton:3.1.9") implementation("mil.nga.sf:sf-wkt:1.0.1") diff --git a/androidApp/src/google/AndroidManifest.xml b/androidApp/src/google/AndroidManifest.xml index 5207ee9..c666fc8 100644 --- a/androidApp/src/google/AndroidManifest.xml +++ b/androidApp/src/google/AndroidManifest.xml @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:tools="http://schemas.android.com/tools" - package="mx.trackermap.TrackerMap.android"> + xmlns:tools="http://schemas.android.com/tools"> <application android:name=".GoogleMainApplication" diff --git a/androidApp/src/main/AndroidManifest.xml b/androidApp/src/main/AndroidManifest.xml index 313a4df..0a3a539 100644 --- a/androidApp/src/main/AndroidManifest.xml +++ b/androidApp/src/main/AndroidManifest.xml @@ -1,7 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> -<manifest - xmlns:android="http://schemas.android.com/apk/res/android" - package="mx.trackermap.TrackerMap.android"> +<manifest xmlns:tools="http://schemas.android.com/tools" + xmlns:android="http://schemas.android.com/apk/res/android"> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> @@ -12,7 +11,9 @@ android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" - android:theme="@style/AppTheme"> + android:theme="@style/AppTheme" + android:enableOnBackInvokedCallback="true" + tools:targetApi="tiramisu"> <activity android:name=".session.LoginActivity" android:exported="true"> diff --git a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/details/reports/UnitReportsFragment.kt b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/details/reports/UnitReportsFragment.kt index aab3cfa..65071da 100644 --- a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/details/reports/UnitReportsFragment.kt +++ b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/details/reports/UnitReportsFragment.kt @@ -36,7 +36,6 @@ import androidx.fragment.app.Fragment import androidx.fragment.app.commit import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.card.MaterialCardView -import io.ktor.utils.io.* import kotlinx.coroutines.DelicateCoroutinesApi import kotlinx.datetime.* import kotlinx.datetime.TimeZone @@ -223,6 +222,7 @@ class UnitReportsFragment : Fragment() { } } is ReportController.Report.LoadingReport -> loading() + else -> loading() } } @@ -260,13 +260,13 @@ class UnitReportsFragment : Fragment() { val (from, to) = period.getObjectDates() - fromDatePicker = DatePickerDialog(requireContext(), { p0, p1, p2, p3 -> + fromDatePicker = DatePickerDialog(requireContext(), { _, p1, p2, p3 -> fromPickedDatetime = LocalDateTime(p1, p2 + 1, p3, from.hour, from.minute) fromTimePicker.show() }, from.year, from.monthNumber, from.dayOfMonth) fromDatePicker.datePicker.maxDate = Calendar.getInstance().timeInMillis - fromTimePicker = TimePickerDialog(requireContext(), { p0, p1, p2 -> + fromTimePicker = TimePickerDialog(requireContext(), { _, p1, p2 -> fromPickedDatetime = LocalDateTime( fromPickedDatetime.year, fromPickedDatetime.monthNumber, @@ -275,7 +275,7 @@ class UnitReportsFragment : Fragment() { ) (period as? ReportDates.ReportPeriod.Custom)?.let { val fromInstant = fromPickedDatetime.toInstant(TimeZone.currentSystemDefault()) - val toInstant = Calendar.getInstance().toInstant().toKotlinInstant() + val toInstant = Clock.System.now() val plusMonth = fromInstant.plus(31.toDuration(DurationUnit.DAYS)) /* Make ultra sure that user can't select a period longer than a month */ @@ -293,13 +293,13 @@ class UnitReportsFragment : Fragment() { } }, from.hour, from.minute, false) - toDatePicker = DatePickerDialog(requireContext(), { p0, p1, p2, p3 -> + toDatePicker = DatePickerDialog(requireContext(), { _, p1, p2, p3 -> toPickedDatetime = LocalDateTime(p1, p2 + 1, p3, from.hour, from.minute) toTimePicker.show() }, to.year, to.monthNumber, to.dayOfMonth) toDatePicker.datePicker.maxDate = Calendar.getInstance().timeInMillis - toTimePicker = TimePickerDialog(requireContext(), { p0, p1, p2 -> + toTimePicker = TimePickerDialog(requireContext(), { _, p1, p2 -> toPickedDatetime = LocalDateTime( toPickedDatetime.year, toPickedDatetime.monthNumber, diff --git a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/details/reports/UnitReportsViewModel.kt b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/details/reports/UnitReportsViewModel.kt index 41a6b6d..628ce2f 100644 --- a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/details/reports/UnitReportsViewModel.kt +++ b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/details/reports/UnitReportsViewModel.kt @@ -19,7 +19,7 @@ package mx.trackermap.TrackerMap.android.details.reports import androidx.lifecycle.* import kotlinx.coroutines.DelicateCoroutinesApi -import kotlinx.coroutines.flow.collect +import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.launch import mx.trackermap.TrackerMap.client.models.EventInformation import mx.trackermap.TrackerMap.client.models.Geofence @@ -42,16 +42,17 @@ class UnitReportsViewModel( private val reportController: ReportController by inject() private var _deviceId = savedStateHandle.getLiveData("deviceId", 0) - private val _reportType: MutableLiveData<ReportController.ReportType> = savedStateHandle.getLiveData("reportType", null) + private val _reportType: MutableLiveData<ReportController.ReportType> = + savedStateHandle.getLiveData("reportType", ReportController.ReportType.POSITIONS) private val _reportPeriod: MutableLiveData<ReportDates.ReportPeriod> = - savedStateHandle.getLiveData("reportPeriod", null) - private val _report: MutableLiveData<ReportController.Report> = MutableLiveData() + savedStateHandle.getLiveData("reportPeriod", ReportDates.ReportPeriod.Today()) + private val _report: MutableLiveData<ReportController.Report?> = MutableLiveData() private val _geofences: MutableLiveData<Array<Geofence>> = MutableLiveData(emptyArray()) val deviceId: LiveData<Int> get() = _deviceId val reportType: LiveData<ReportController.ReportType> get() = _reportType val reportPeriod: LiveData<ReportDates.ReportPeriod> get() = _reportPeriod - val report: LiveData<ReportController.Report> get() = _report + val report: LiveData<ReportController.Report?> get() = _report val geofences: LiveData<Array<Geofence>> get() = _geofences init { @@ -82,13 +83,13 @@ class UnitReportsViewModel( } private suspend fun setupReportObserver() { - reportController.reportFlow.collect { + (reportController.reportFlow as StateFlow<ReportController.Report>).collect { _report.value = it } } private suspend fun setupGeofenceObserver() { - geofencesController.geofencesFlow.collect { + (geofencesController.geofencesFlow as StateFlow<Map<Int, Geofence>>).collect { _geofences.value = it.values.toTypedArray() } } diff --git a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapFragment.kt b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapFragment.kt index b04bfbc..4915c49 100644 --- a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapFragment.kt +++ b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapFragment.kt @@ -114,6 +114,12 @@ open class MapFragment : GlobeMapFragment() { hasStarted = false } + override fun onDestroyView() { + super.onDestroyView() + loader?.shutdown() + loader = null + } + override fun mapDidStopMoving( mapControl: MapController?, corners: Array<out Point3d>?, diff --git a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/session/UserInformationViewModel.kt b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/session/UserInformationViewModel.kt index 0d3784c..7a57755 100644 --- a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/session/UserInformationViewModel.kt +++ b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/session/UserInformationViewModel.kt @@ -25,7 +25,7 @@ import androidx.lifecycle.viewModelScope import com.zhuinden.eventemitter.EventEmitter import com.zhuinden.eventemitter.EventSource import kotlinx.coroutines.DelicateCoroutinesApi -import kotlinx.coroutines.flow.collect +import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.launch import mx.trackermap.TrackerMap.client.models.User import mx.trackermap.TrackerMap.controllers.SessionController @@ -57,7 +57,7 @@ class UserInformationViewModel : ViewModel(), KoinComponent { } private suspend fun setupLoginStateObserver() { - sessionController.loginStateFlow.collect { + (sessionController.loginStateFlow as StateFlow<SessionController.LoginState?>).collect { it?.let { loginStateEmitter.emit(it) } @@ -65,7 +65,7 @@ class UserInformationViewModel : ViewModel(), KoinComponent { } private suspend fun setupUserObserver() { - sessionController.userFlow.collect { + (sessionController.userFlow as StateFlow<User?>).collect { it?.let { _user.postValue(it) } diff --git a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/units/UnitsViewModel.kt b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/units/UnitsViewModel.kt index b537c0b..b5ed78d 100644 --- a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/units/UnitsViewModel.kt +++ b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/units/UnitsViewModel.kt @@ -21,7 +21,7 @@ import android.util.Log import androidx.lifecycle.* import com.mousebird.maply.Point2d import kotlinx.coroutines.DelicateCoroutinesApi -import kotlinx.coroutines.flow.collect +import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.launch import mx.trackermap.TrackerMap.client.models.Geofence import mx.trackermap.TrackerMap.client.models.MapLayer @@ -87,14 +87,14 @@ class UnitsViewModel( } private suspend fun setupUnitsObserver() { - unitsController.displayedUnitsFlow.collect { units -> + (unitsController.displayedUnitsFlow as StateFlow<List<UnitInformation>>).collect { units -> Log.d("UnitsViewModel", "Collecting units") this._displayedUnits.value = units } } private suspend fun setupDisplayedUnitsObserver() { - unitsController.unitsFlow.collect { units -> + (unitsController.unitsFlow as StateFlow<List<UnitInformation>>).collect { units -> Log.d("UnitsViewModel", "Collecting displayed units") this._units.value = units updateSelectedUnit() @@ -102,7 +102,7 @@ class UnitsViewModel( } private suspend fun setupGeofenceObserver() { - geofenceController.geofencesFlow.collect { + (geofenceController.geofencesFlow as StateFlow<Map<Int, Geofence>>).collect { Log.d("UnitsViewModel", "Collecting geofences") this._geofences.postValue(it) } diff --git a/build.gradle.kts b/build.gradle.kts index 21ecdbc..7d1f0e2 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -6,10 +6,10 @@ buildscript { maven("https://jitpack.io") } dependencies { - classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.10") - classpath("org.jetbrains.kotlin:kotlin-serialization:1.6.0") - classpath("com.android.tools.build:gradle:7.0.4") - classpath("com.google.gms:google-services:4.3.10") + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.0") + classpath("org.jetbrains.kotlin:kotlin-serialization:1.9.0") + classpath("com.android.tools.build:gradle:8.1.1") + classpath("com.google.gms:google-services:4.3.15") } } diff --git a/gradle.properties b/gradle.properties index 3211eb8..0556818 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,4 +10,7 @@ android.useAndroidX=true #MPP kotlin.mpp.enableGranularSourceSetsMetadata=true kotlin.native.enableDependencyPropagation=false -kotlin.mpp.enableCInteropCommonization=true
\ No newline at end of file +kotlin.mpp.enableCInteropCommonization=true +android.defaults.buildfeatures.buildconfig=true +android.nonTransitiveRClass=false +android.nonFinalResIds=false
\ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index cede901..8424d98 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Fri Dec 03 21:13:43 CST 2021 distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip distributionPath=wrapper/dists zipStorePath=wrapper/dists zipStoreBase=GRADLE_USER_HOME diff --git a/shared/build.gradle.kts b/shared/build.gradle.kts index 2488cde..94b8f09 100644 --- a/shared/build.gradle.kts +++ b/shared/build.gradle.kts @@ -8,7 +8,9 @@ kotlin { val ktor_version = "1.6.6" val settings_version = "0.8.1" - android() + androidTarget() + + jvmToolchain(17) listOf( iosX64(), @@ -56,14 +58,18 @@ kotlin { } android { - compileSdk = 31 + compileSdk = 34 sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml") defaultConfig { minSdk = 21 - targetSdk = 31 ndk { abiFilters.clear() abiFilters += listOf("armeabi-v7a", "arm64-v8a") } } + namespace = "mx.trackermap.TrackerMap" + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } }
\ No newline at end of file diff --git a/shared/src/androidMain/AndroidManifest.xml b/shared/src/androidMain/AndroidManifest.xml index f480b0f..568741e 100644 --- a/shared/src/androidMain/AndroidManifest.xml +++ b/shared/src/androidMain/AndroidManifest.xml @@ -1,2 +1,2 @@ <?xml version="1.0" encoding="utf-8"?> -<manifest package="mx.trackermap.TrackerMap" />
\ No newline at end of file +<manifest />
\ No newline at end of file diff --git a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/controllers/SessionController.kt b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/controllers/SessionController.kt index 0faaa72..a63bba2 100644 --- a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/controllers/SessionController.kt +++ b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/controllers/SessionController.kt @@ -138,7 +138,7 @@ class SessionController( private suspend fun unregisterFcmToken(token: String) { print("Unregister FCM token: $token\n") try { - userFlow.value?.let { user -> + sessionApi.sessionGet().let { user -> val attributes = user.attributes.toMutableMap() attributes["notificationTokens"]?.content?.let { tokens -> if (tokens.contains("$token,")) { |