mirror of
https://github.com/barbeau/gpstest.git
synced 2025-12-05 18:46:30 -06:00
Compare commits
25 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
90e0d9f9be | ||
|
|
80b6848a09 | ||
|
|
c5a3d684e6 | ||
|
|
f549508ad3 | ||
|
|
a3dfa50b99 | ||
|
|
640bd4b9a7 | ||
|
|
2b1ed93629 | ||
|
|
148b609e37 | ||
|
|
acea0e0249 | ||
|
|
9fd28d5a61 | ||
|
|
4ac38c380f | ||
|
|
3b23f9514b | ||
|
|
726481d50c | ||
|
|
c304bc8fdb | ||
|
|
6eaabe2f8c | ||
|
|
6994b33a8c | ||
|
|
25902ed60f | ||
|
|
1eb6ed9477 | ||
|
|
acc19cff01 | ||
|
|
8a700e987e | ||
|
|
4e7c77fbb2 | ||
|
|
91378d5f79 | ||
|
|
5d4a0f9a60 | ||
|
|
8f07afeb83 | ||
|
|
2196e66428 |
14
.github/dependabot.yml
vendored
Normal file
14
.github/dependabot.yml
vendored
Normal file
@@ -0,0 +1,14 @@
|
||||
version: 2
|
||||
updates:
|
||||
- package-ecosystem: "github-actions"
|
||||
directory: "/"
|
||||
commit-message:
|
||||
prefix: "actions-update"
|
||||
labels: [ 'enhancement' ]
|
||||
schedule:
|
||||
interval: "daily"
|
||||
groups:
|
||||
actions-dependencies:
|
||||
applies-to: version-updates
|
||||
patterns:
|
||||
- "*"
|
||||
155
.github/workflows/android.yml
vendored
155
.github/workflows/android.yml
vendored
@@ -12,27 +12,146 @@ on:
|
||||
|
||||
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
|
||||
jobs:
|
||||
test:
|
||||
runs-on: macos-latest
|
||||
unit-test:
|
||||
name: Perform checks
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Harden the runner (audit mode)
|
||||
uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3
|
||||
with:
|
||||
egress-policy: audit
|
||||
|
||||
- name: Checkout the code
|
||||
uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
|
||||
|
||||
- name: Setup Java
|
||||
uses: actions/setup-java@f2beeb24e141e01a676f977032f5a29d81c9e27e # v5.1.0
|
||||
with:
|
||||
distribution: 'temurin'
|
||||
java-version: 17
|
||||
|
||||
- name: Setup Gradle and cache
|
||||
uses: gradle/actions/setup-gradle@4d9f0ba0025fe599b4ebab900eb7f3a1d93ef4c2 # v5.0.0
|
||||
with:
|
||||
gradle-version: wrapper
|
||||
|
||||
- name: Run checks
|
||||
run: ./gradlew check
|
||||
|
||||
- name: Upload SARIF report
|
||||
uses: github/codeql-action/upload-sarif@fe4161a26a8629af62121b670040955b330f9af2 # v3.29.5
|
||||
if: success() || failure()
|
||||
with:
|
||||
sarif_file: GPSTest/build/reports/lint-results-googleDebug.sarif
|
||||
category: lint
|
||||
|
||||
build:
|
||||
name: Build debug APK
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Harden the runner (audit mode)
|
||||
uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3
|
||||
with:
|
||||
egress-policy: audit
|
||||
|
||||
- name: Checkout the code
|
||||
uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
|
||||
|
||||
- name: Setup Java
|
||||
uses: actions/setup-java@f2beeb24e141e01a676f977032f5a29d81c9e27e # v5.1.0
|
||||
with:
|
||||
java-version: 17
|
||||
distribution: 'temurin'
|
||||
|
||||
- name: Setup Android SDK
|
||||
uses: android-actions/setup-android@9fc6c4e9069bf8d3d10b2204b1fb8f6ef7065407 # v3.2.2
|
||||
with:
|
||||
log-accepted-android-sdk-licenses: false
|
||||
|
||||
- name: Setup Gradle and cache
|
||||
uses: gradle/actions/setup-gradle@4d9f0ba0025fe599b4ebab900eb7f3a1d93ef4c2 # v5.0.0
|
||||
with:
|
||||
gradle-version: wrapper
|
||||
cache-read-only: true
|
||||
|
||||
- name: Build app
|
||||
run: ./gradlew assembleDebug --stacktrace
|
||||
|
||||
- name: Upload APKs
|
||||
uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
|
||||
with:
|
||||
name: apks
|
||||
path: |
|
||||
GPSTest/build/outputs/apk/
|
||||
wear/build/outputs/apk/
|
||||
|
||||
instrumentation-test:
|
||||
name: Run instrumented tests
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
api-level: [24, 29]
|
||||
api-level: [24, 29, 33]
|
||||
target: [default, google_apis]
|
||||
tasks: [connectedGoogleDebugAndroidTest, connectedOsmdroidDebugAndroidTest]
|
||||
steps:
|
||||
- name: checkout
|
||||
uses: actions/checkout@v2
|
||||
- name: Harden the runner (audit mode)
|
||||
uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3
|
||||
with:
|
||||
egress-policy: audit
|
||||
|
||||
- name: Setup Java
|
||||
uses: actions/setup-java@v2
|
||||
with:
|
||||
java-version: 17
|
||||
distribution: 'adopt'
|
||||
- name: Checkout the code
|
||||
uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
|
||||
|
||||
- name: run tests
|
||||
uses: reactivecircus/android-emulator-runner@v2
|
||||
with:
|
||||
api-level: ${{ matrix.api-level }}
|
||||
target: ${{ matrix.target }}
|
||||
arch: x86_64
|
||||
profile: Nexus 6
|
||||
script: ./gradlew test check connectedCheck -x lint --stacktrace
|
||||
- name: Enable KVM
|
||||
run: |
|
||||
echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
|
||||
sudo udevadm control --reload-rules
|
||||
sudo udevadm trigger --name-match=kvm
|
||||
|
||||
- name: Setup Java
|
||||
uses: actions/setup-java@f2beeb24e141e01a676f977032f5a29d81c9e27e # v5.1.0
|
||||
with:
|
||||
java-version: 17
|
||||
distribution: 'temurin'
|
||||
|
||||
- name: Setup Gradle and cache
|
||||
uses: gradle/actions/setup-gradle@4d9f0ba0025fe599b4ebab900eb7f3a1d93ef4c2 # v5.0.0
|
||||
with:
|
||||
gradle-version: wrapper
|
||||
cache-read-only: true
|
||||
|
||||
- name: Configure AVD cache
|
||||
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
|
||||
id: avd-cache
|
||||
with:
|
||||
path: |
|
||||
~/.android/avd/*
|
||||
~/.android/adb*
|
||||
key: avd-${{ matrix.target }}-${{ matrix.api-level }}
|
||||
|
||||
- name: Create AVD and generate snapshot for caching
|
||||
if: steps.avd-cache.outputs.cache-hit != 'true'
|
||||
uses: reactivecircus/android-emulator-runner@b530d96654c385303d652368551fb075bc2f0b6b # v2.35.0
|
||||
with:
|
||||
api-level: ${{ matrix.api-level }}
|
||||
target: ${{ matrix.target }}
|
||||
force-avd-creation: false
|
||||
emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none -no-metrics
|
||||
disable-animations: false
|
||||
script: echo "Generated AVD snapshot for caching."
|
||||
arch: x86_64
|
||||
profile: Nexus 6
|
||||
|
||||
- name: Run instrumentation tests
|
||||
uses: reactivecircus/android-emulator-runner@b530d96654c385303d652368551fb075bc2f0b6b # v2.35.0
|
||||
with:
|
||||
api-level: ${{ matrix.api-level }}
|
||||
target: ${{ matrix.target }}
|
||||
force-avd-creation: false
|
||||
emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none -no-metrics
|
||||
disable-animations: true
|
||||
script: |
|
||||
adb wait-for-device
|
||||
./gradlew ${{ matrix.tasks }} -x lint --stacktrace && killall -INT crashpad_handler || true
|
||||
arch: x86_64
|
||||
profile: Nexus 6
|
||||
|
||||
2
.github/workflows/transifex.yml
vendored
2
.github/workflows/transifex.yml
vendored
@@ -17,7 +17,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout repo
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v6
|
||||
- name: Run script to push English strings to Transifex
|
||||
run: |
|
||||
chmod +x ./scripts/push-to-transifex.sh
|
||||
|
||||
170
.gitignore
vendored
170
.gitignore
vendored
@@ -1,5 +1,167 @@
|
||||
.gradle
|
||||
/local.properties
|
||||
/.idea/
|
||||
# Created by https://www.toptal.com/developers/gitignore/api/android,androidstudio
|
||||
# Edit at https://www.toptal.com/developers/gitignore?templates=android,androidstudio
|
||||
|
||||
### Android ###
|
||||
# Gradle files
|
||||
.gradle/
|
||||
build/
|
||||
|
||||
# Local configuration file (sdk path, etc)
|
||||
local.properties
|
||||
|
||||
# Log/OS Files
|
||||
*.log
|
||||
|
||||
# Android Studio generated files and folders
|
||||
captures/
|
||||
.externalNativeBuild/
|
||||
.cxx/
|
||||
*.apk
|
||||
output.json
|
||||
|
||||
# IntelliJ
|
||||
*.iml
|
||||
.DS_Store
|
||||
.idea/
|
||||
misc.xml
|
||||
deploymentTargetDropDown.xml
|
||||
render.experimental.xml
|
||||
|
||||
# Keystore files
|
||||
*.jks
|
||||
*.keystore
|
||||
|
||||
# Google Services (e.g. APIs or Firebase)
|
||||
google-services.json
|
||||
|
||||
# Android Profiling
|
||||
*.hprof
|
||||
|
||||
### Android Patch ###
|
||||
gen-external-apklibs
|
||||
|
||||
# Replacement of .externalNativeBuild directories introduced
|
||||
# with Android Studio 3.5.
|
||||
|
||||
### AndroidStudio ###
|
||||
# Covers files to be ignored for android development using Android Studio.
|
||||
|
||||
# Built application files
|
||||
*.ap_
|
||||
*.aab
|
||||
|
||||
# Files for the ART/Dalvik VM
|
||||
*.dex
|
||||
|
||||
# Java class files
|
||||
*.class
|
||||
|
||||
# Generated files
|
||||
bin/
|
||||
gen/
|
||||
out/
|
||||
|
||||
# Gradle files
|
||||
.gradle
|
||||
|
||||
# Signing files
|
||||
.signing/
|
||||
|
||||
# Local configuration file (sdk path, etc)
|
||||
|
||||
# Proguard folder generated by Eclipse
|
||||
proguard/
|
||||
|
||||
# Log Files
|
||||
|
||||
# Android Studio
|
||||
/*/build/
|
||||
/*/local.properties
|
||||
/*/out
|
||||
/*/*/build
|
||||
/*/*/production
|
||||
.navigation/
|
||||
*.ipr
|
||||
*~
|
||||
*.swp
|
||||
|
||||
# Keystore files
|
||||
|
||||
# Google Services (e.g. APIs or Firebase)
|
||||
# google-services.json
|
||||
|
||||
# Android Patch
|
||||
|
||||
# External native build folder generated in Android Studio 2.2 and later
|
||||
.externalNativeBuild
|
||||
|
||||
# NDK
|
||||
obj/
|
||||
|
||||
# IntelliJ IDEA
|
||||
*.iws
|
||||
/out/
|
||||
|
||||
# User-specific configurations
|
||||
.idea/caches/
|
||||
.idea/libraries/
|
||||
.idea/shelf/
|
||||
.idea/workspace.xml
|
||||
.idea/tasks.xml
|
||||
.idea/.name
|
||||
.idea/compiler.xml
|
||||
.idea/copyright/profiles_settings.xml
|
||||
.idea/encodings.xml
|
||||
.idea/misc.xml
|
||||
.idea/modules.xml
|
||||
.idea/scopes/scope_settings.xml
|
||||
.idea/dictionaries
|
||||
.idea/vcs.xml
|
||||
.idea/jsLibraryMappings.xml
|
||||
.idea/datasources.xml
|
||||
.idea/dataSources.ids
|
||||
.idea/sqlDataSources.xml
|
||||
.idea/dynamic.xml
|
||||
.idea/uiDesigner.xml
|
||||
.idea/assetWizardSettings.xml
|
||||
.idea/gradle.xml
|
||||
.idea/jarRepositories.xml
|
||||
.idea/navEditor.xml
|
||||
|
||||
# Legacy Eclipse project files
|
||||
.classpath
|
||||
.project
|
||||
.cproject
|
||||
.settings/
|
||||
|
||||
# Mobile Tools for Java (J2ME)
|
||||
.mtj.tmp/
|
||||
|
||||
# Package Files #
|
||||
*.war
|
||||
*.ear
|
||||
|
||||
# virtual machine crash logs (Reference: http://www.java.com/en/download/help/error_hotspot.xml)
|
||||
hs_err_pid*
|
||||
|
||||
## Plugin-specific files:
|
||||
|
||||
# mpeltonen/sbt-idea plugin
|
||||
.idea_modules/
|
||||
|
||||
# JIRA plugin
|
||||
atlassian-ide-plugin.xml
|
||||
|
||||
# Mongo Explorer plugin
|
||||
.idea/mongoSettings.xml
|
||||
|
||||
# Crashlytics plugin (for Android Studio and IntelliJ)
|
||||
com_crashlytics_export_strings.xml
|
||||
crashlytics.properties
|
||||
crashlytics-build.properties
|
||||
fabric.properties
|
||||
|
||||
### AndroidStudio Patch ###
|
||||
|
||||
!/gradle/wrapper/gradle-wrapper.jar
|
||||
|
||||
# End of https://www.toptal.com/developers/gitignore/api/android,androidstudio
|
||||
@@ -2,17 +2,18 @@ apply plugin: 'com.android.application'
|
||||
apply plugin: 'kotlin-android'
|
||||
apply plugin: 'kotlin-kapt'
|
||||
apply plugin: 'dagger.hilt.android.plugin'
|
||||
apply plugin: 'org.jetbrains.kotlin.plugin.compose'
|
||||
|
||||
android {
|
||||
compileSdkVersion 33
|
||||
|
||||
defaultConfig {
|
||||
minSdkVersion 24
|
||||
targetSdkVersion 33
|
||||
targetSdkVersion 34
|
||||
multiDexEnabled true
|
||||
// versionCode scheme - first two digits are minSdkVersion, last three digits are build number
|
||||
versionCode 24098
|
||||
versionName "3.10.4"
|
||||
versionCode 24099
|
||||
versionName "3.10.5"
|
||||
|
||||
vectorDrawables.useSupportLibrary = true
|
||||
|
||||
@@ -55,7 +56,8 @@ android {
|
||||
}
|
||||
|
||||
lintOptions {
|
||||
disable 'MissingTranslation', 'ExtraTranslation'
|
||||
sarifReport true
|
||||
disable 'MissingTranslation', 'ExtraTranslation', 'StringFormatInvalid'
|
||||
}
|
||||
|
||||
if (project.hasProperty("secure.properties")
|
||||
@@ -130,6 +132,10 @@ android {
|
||||
viewBinding true
|
||||
}
|
||||
|
||||
buildFeatures {
|
||||
buildConfig = true
|
||||
}
|
||||
|
||||
// Gradle automatically adds 'android.test.runner' as a dependency.
|
||||
useLibrary 'android.test.runner'
|
||||
|
||||
@@ -160,7 +166,7 @@ dependencies {
|
||||
// Uploading device properties on user request
|
||||
implementation 'androidx.core:core-ktx:1.10.0-rc01'
|
||||
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.2'
|
||||
implementation 'commons-io:commons-io:2.8.0'
|
||||
implementation 'commons-io:commons-io:2.14.0'
|
||||
|
||||
// Share dialog
|
||||
implementation 'androidx.viewpager2:viewpager2:1.0.0'
|
||||
|
||||
@@ -20,7 +20,10 @@ import android.location.Location
|
||||
import androidx.test.InstrumentationRegistry.getTargetContext
|
||||
import androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner
|
||||
import com.android.gpstest.library.util.IOUtils
|
||||
import junit.framework.Assert.*
|
||||
import junit.framework.Assert.assertEquals
|
||||
import junit.framework.Assert.assertFalse
|
||||
import junit.framework.Assert.assertNull
|
||||
import junit.framework.Assert.assertTrue
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
|
||||
|
||||
@@ -15,6 +15,10 @@
|
||||
*/
|
||||
package com.android.gpstest;
|
||||
|
||||
import static androidx.test.InstrumentationRegistry.getTargetContext;
|
||||
import static junit.framework.Assert.assertFalse;
|
||||
import static junit.framework.Assert.assertTrue;
|
||||
|
||||
import android.content.res.Configuration;
|
||||
import android.content.res.Resources;
|
||||
|
||||
@@ -27,10 +31,6 @@ import org.junit.runner.RunWith;
|
||||
|
||||
import java.util.Locale;
|
||||
|
||||
import static androidx.test.InstrumentationRegistry.getTargetContext;
|
||||
import static junit.framework.Assert.assertFalse;
|
||||
import static junit.framework.Assert.assertTrue;
|
||||
|
||||
@RunWith(AndroidJUnit4ClassRunner.class)
|
||||
public class LocationUtilsTest {
|
||||
|
||||
|
||||
@@ -15,6 +15,8 @@
|
||||
*/
|
||||
package com.android.gpstest;
|
||||
|
||||
import static junit.framework.Assert.assertEquals;
|
||||
|
||||
import androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner;
|
||||
|
||||
import com.android.gpstest.library.util.MathUtils;
|
||||
@@ -24,8 +26,6 @@ import org.junit.runner.RunWith;
|
||||
|
||||
import java.io.UnsupportedEncodingException;
|
||||
|
||||
import static junit.framework.Assert.assertEquals;
|
||||
|
||||
@RunWith(AndroidJUnit4ClassRunner.class)
|
||||
public class MathUtilsAndroidTest {
|
||||
|
||||
|
||||
@@ -15,14 +15,21 @@
|
||||
*/
|
||||
package com.android.gpstest
|
||||
|
||||
import android.location.GnssMeasurement.*
|
||||
import android.location.GnssMeasurement.ADR_STATE_CYCLE_SLIP
|
||||
import android.location.GnssMeasurement.ADR_STATE_HALF_CYCLE_REPORTED
|
||||
import android.location.GnssMeasurement.ADR_STATE_HALF_CYCLE_RESOLVED
|
||||
import android.location.GnssMeasurement.ADR_STATE_RESET
|
||||
import android.location.GnssMeasurement.ADR_STATE_UNKNOWN
|
||||
import android.location.GnssMeasurement.ADR_STATE_VALID
|
||||
import android.os.Build
|
||||
import androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner
|
||||
import com.android.gpstest.library.model.GnssType
|
||||
import com.android.gpstest.library.model.SatelliteStatus
|
||||
import com.android.gpstest.library.model.SbasType
|
||||
import com.android.gpstest.library.util.SatelliteUtils
|
||||
import org.junit.Assert.*
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Assert.assertFalse
|
||||
import org.junit.Assert.assertTrue
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
|
||||
|
||||
@@ -17,19 +17,27 @@
|
||||
package com.android.gpstest
|
||||
|
||||
import android.app.Application
|
||||
import android.content.Context
|
||||
import android.os.Build
|
||||
import android.preference.PreferenceManager
|
||||
import androidx.arch.core.executor.testing.InstantTaskExecutorRule
|
||||
import androidx.test.InstrumentationRegistry
|
||||
import androidx.test.InstrumentationRegistry.getTargetContext
|
||||
import androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner
|
||||
import com.android.gpstest.library.data.*
|
||||
import com.android.gpstest.library.data.LocationRepository
|
||||
import com.android.gpstest.library.data.SharedAntennaManager
|
||||
import com.android.gpstest.library.data.SharedGnssMeasurementManager
|
||||
import com.android.gpstest.library.data.SharedGnssStatusManager
|
||||
import com.android.gpstest.library.data.SharedLocationManager
|
||||
import com.android.gpstest.library.data.SharedNavMessageManager
|
||||
import com.android.gpstest.library.data.SharedNmeaManager
|
||||
import com.android.gpstest.library.data.SharedSensorManager
|
||||
import com.android.gpstest.library.model.GnssType
|
||||
import com.android.gpstest.library.model.SbasType
|
||||
import com.android.gpstest.library.ui.SignalInfoViewModel
|
||||
import kotlinx.coroutines.GlobalScope
|
||||
import org.junit.Assert.*
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Assert.assertFalse
|
||||
import org.junit.Assert.assertTrue
|
||||
import org.junit.Rule
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
|
||||
@@ -35,22 +35,30 @@ import com.android.gpstest.Application
|
||||
import com.android.gpstest.Application.Companion.prefs
|
||||
import com.android.gpstest.R
|
||||
import com.android.gpstest.library.data.LocationRepository
|
||||
import com.android.gpstest.library.util.MathUtils
|
||||
import com.android.gpstest.library.util.PreferenceUtil
|
||||
import com.android.gpstest.map.MapConstants
|
||||
import com.android.gpstest.map.MapViewModelController
|
||||
import com.android.gpstest.map.MapViewModelController.MapInterface
|
||||
import com.android.gpstest.map.OnMapClickListener
|
||||
import com.android.gpstest.util.MapUtils
|
||||
import com.android.gpstest.library.util.MathUtils
|
||||
import com.android.gpstest.library.util.PreferenceUtil
|
||||
import com.google.android.gms.common.ConnectionResult
|
||||
import com.google.android.gms.common.GoogleApiAvailability
|
||||
import com.google.android.gms.maps.CameraUpdateFactory
|
||||
import com.google.android.gms.maps.GoogleMap
|
||||
import com.google.android.gms.maps.GoogleMap.*
|
||||
import com.google.android.gms.maps.GoogleMap.OnCameraChangeListener
|
||||
import com.google.android.gms.maps.GoogleMap.OnMapLongClickListener
|
||||
import com.google.android.gms.maps.GoogleMap.OnMyLocationButtonClickListener
|
||||
import com.google.android.gms.maps.LocationSource
|
||||
import com.google.android.gms.maps.LocationSource.OnLocationChangedListener
|
||||
import com.google.android.gms.maps.SupportMapFragment
|
||||
import com.google.android.gms.maps.model.*
|
||||
import com.google.android.gms.maps.model.CameraPosition
|
||||
import com.google.android.gms.maps.model.LatLng
|
||||
import com.google.android.gms.maps.model.MapStyleOptions
|
||||
import com.google.android.gms.maps.model.Marker
|
||||
import com.google.android.gms.maps.model.MarkerOptions
|
||||
import com.google.android.gms.maps.model.Polyline
|
||||
import com.google.android.gms.maps.model.PolylineOptions
|
||||
import com.google.maps.android.SphericalUtil
|
||||
import com.google.maps.android.ktx.awaitMap
|
||||
import dagger.hilt.android.AndroidEntryPoint
|
||||
|
||||
@@ -28,6 +28,9 @@
|
||||
<!-- Required for notifications on T+ -->
|
||||
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
|
||||
|
||||
<!-- Required for the location service when targeting API 34 and up -->
|
||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_LOCATION" />
|
||||
|
||||
<application
|
||||
android:name=".Application"
|
||||
android:label="@string/app_name"
|
||||
|
||||
@@ -50,7 +50,12 @@ import com.android.gpstest.library.data.LocationRepository
|
||||
import com.android.gpstest.library.model.SatelliteGroup
|
||||
import com.android.gpstest.library.model.SatelliteMetadata
|
||||
import com.android.gpstest.library.util.FormatUtils.toNotificationTitle
|
||||
import com.android.gpstest.library.util.IOUtils.*
|
||||
import com.android.gpstest.library.util.IOUtils.deleteOldFiles
|
||||
import com.android.gpstest.library.util.IOUtils.forcePsdsInjection
|
||||
import com.android.gpstest.library.util.IOUtils.forceTimeInjection
|
||||
import com.android.gpstest.library.util.IOUtils.writeMeasurementToLogcat
|
||||
import com.android.gpstest.library.util.IOUtils.writeNavMessageToAndroidStudio
|
||||
import com.android.gpstest.library.util.IOUtils.writeNmeaToAndroidStudio
|
||||
import com.android.gpstest.library.util.LibUIUtils.toNotificationSummary
|
||||
import com.android.gpstest.library.util.PreferenceUtil
|
||||
import com.android.gpstest.library.util.PreferenceUtil.isCsvLoggingEnabled
|
||||
@@ -73,13 +78,18 @@ import com.android.gpstest.library.util.SatelliteUtil.toSatelliteStatus
|
||||
import com.android.gpstest.library.util.SatelliteUtils
|
||||
import com.android.gpstest.ui.MainActivity
|
||||
import dagger.hilt.android.AndroidEntryPoint
|
||||
import java.io.File
|
||||
import java.util.*
|
||||
import javax.inject.Inject
|
||||
import kotlinx.coroutines.*
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
||||
import kotlinx.coroutines.GlobalScope
|
||||
import kotlinx.coroutines.Job
|
||||
import kotlinx.coroutines.delay
|
||||
import kotlinx.coroutines.flow.launchIn
|
||||
import kotlinx.coroutines.flow.map
|
||||
import kotlinx.coroutines.flow.onEach
|
||||
import kotlinx.coroutines.launch
|
||||
import java.io.File
|
||||
import java.util.Date
|
||||
import javax.inject.Inject
|
||||
|
||||
/**
|
||||
* Service tracks location, logs to files, and shows a notification to the user.
|
||||
|
||||
@@ -10,9 +10,12 @@ import android.provider.MediaStore;
|
||||
import android.provider.MediaStore.Downloads;
|
||||
import android.util.Log;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.annotation.RequiresApi;
|
||||
|
||||
import com.android.gpstest.Application;
|
||||
import com.android.gpstest.R;
|
||||
|
||||
import java.io.BufferedWriter;
|
||||
import java.io.File;
|
||||
import java.io.FileWriter;
|
||||
|
||||
@@ -49,9 +49,9 @@ import com.android.gpstest.chart.DistanceValueFormatter;
|
||||
import com.android.gpstest.library.model.AvgError;
|
||||
import com.android.gpstest.library.model.MeasuredError;
|
||||
import com.android.gpstest.library.util.IOUtils;
|
||||
import com.android.gpstest.library.util.LibUIUtils;
|
||||
import com.android.gpstest.library.util.MathUtils;
|
||||
import com.android.gpstest.library.util.PreferenceUtils;
|
||||
import com.android.gpstest.library.util.LibUIUtils;
|
||||
import com.android.gpstest.util.UIUtils;
|
||||
import com.github.mikephil.charting.charts.LineChart;
|
||||
import com.github.mikephil.charting.components.Legend;
|
||||
|
||||
@@ -40,9 +40,9 @@ class ShareDialogFragment : DialogFragment() {
|
||||
}
|
||||
|
||||
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
|
||||
val view = activity!!.layoutInflater.inflate(R.layout.share, null)
|
||||
val view = requireActivity().layoutInflater.inflate(R.layout.share, null)
|
||||
setRetainInstance(true)
|
||||
val builder = AlertDialog.Builder(activity!!)
|
||||
val builder = AlertDialog.Builder(requireActivity())
|
||||
.setTitle(R.string.share)
|
||||
.setView(view)
|
||||
.setNeutralButton(R.string.main_help_close) { dialog, _ -> }
|
||||
|
||||
@@ -18,8 +18,8 @@ import com.android.gpstest.Application.Companion.prefs
|
||||
import com.android.gpstest.R
|
||||
import com.android.gpstest.library.model.CoordinateType
|
||||
import com.android.gpstest.library.util.IOUtils
|
||||
import com.android.gpstest.library.util.PreferenceUtils
|
||||
import com.android.gpstest.library.util.LibUIUtils
|
||||
import com.android.gpstest.library.util.PreferenceUtils
|
||||
import com.google.android.material.button.MaterialButton
|
||||
import com.google.android.material.chip.Chip
|
||||
import com.google.android.material.chip.ChipGroup
|
||||
|
||||
@@ -2,7 +2,6 @@ package com.android.gpstest.ui.share
|
||||
|
||||
import android.content.Intent
|
||||
import android.net.Uri
|
||||
import android.os.Build
|
||||
import android.os.Bundle
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
@@ -17,7 +16,6 @@ import com.android.gpstest.library.util.LibUIUtils
|
||||
import com.google.android.material.button.MaterialButton
|
||||
import java.io.File
|
||||
import java.util.*
|
||||
import kotlin.collections.ArrayList
|
||||
|
||||
class ShareLogFragment : Fragment() {
|
||||
|
||||
@@ -91,7 +89,7 @@ class ShareLogFragment : Fragment() {
|
||||
val uri = IOUtils.getUriFromFile(activity, BuildConfig.APPLICATION_ID, files?.get(0))
|
||||
val intent = Intent(Intent.ACTION_GET_CONTENT)
|
||||
intent.data = uri
|
||||
activity!!.startActivityForResult(intent, LibUIUtils.PICKFILE_REQUEST_CODE)
|
||||
requireActivity().startActivityForResult(intent, LibUIUtils.PICKFILE_REQUEST_CODE)
|
||||
// Dismiss the dialog - it will be re-created in the callback to GpsTestActivity
|
||||
listener.onFileBrowse()
|
||||
}
|
||||
|
||||
@@ -68,7 +68,7 @@ class UploadDeviceInfoFragment : Fragment() {
|
||||
uploadNoLocationTextView.visibility = View.GONE
|
||||
|
||||
if (Geocoder.isPresent()) {
|
||||
val geocoder = Geocoder(context!!)
|
||||
val geocoder = Geocoder(requireContext())
|
||||
var addresses: List<Address>? = emptyList()
|
||||
try {
|
||||
addresses = geocoder.getFromLocation(location.latitude, location.longitude, 1)
|
||||
|
||||
@@ -44,23 +44,23 @@ import com.android.gpstest.Application
|
||||
import com.android.gpstest.Application.Companion.app
|
||||
import com.android.gpstest.Application.Companion.prefs
|
||||
import com.android.gpstest.R
|
||||
import com.android.gpstest.library.data.FixState
|
||||
import com.android.gpstest.library.data.LocationRepository
|
||||
import com.android.gpstest.databinding.GpsSkyBinding
|
||||
import com.android.gpstest.databinding.GpsSkyLegendCardBinding
|
||||
import com.android.gpstest.databinding.GpsSkySignalMeterBinding
|
||||
import com.android.gpstest.library.data.FixState
|
||||
import com.android.gpstest.library.data.LocationRepository
|
||||
import com.android.gpstest.library.model.SatelliteMetadata
|
||||
import com.android.gpstest.library.model.SatelliteStatus
|
||||
import com.android.gpstest.library.ui.SignalInfoViewModel
|
||||
import com.android.gpstest.ui.status.Filter
|
||||
import com.android.gpstest.ui.theme.AppTheme
|
||||
import com.android.gpstest.library.util.LibUIUtils
|
||||
import com.android.gpstest.library.util.MathUtils
|
||||
import com.android.gpstest.library.util.PreferenceUtil
|
||||
import com.android.gpstest.library.util.PreferenceUtil.darkTheme
|
||||
import com.android.gpstest.library.util.PreferenceUtils
|
||||
import com.android.gpstest.library.util.PreferenceUtils.clearGnssFilter
|
||||
import com.android.gpstest.library.util.PreferenceUtils.gnssFilter
|
||||
import com.android.gpstest.library.util.LibUIUtils
|
||||
import com.android.gpstest.ui.status.Filter
|
||||
import com.android.gpstest.ui.theme.AppTheme
|
||||
import dagger.hilt.android.AndroidEntryPoint
|
||||
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
||||
import kotlinx.coroutines.Job
|
||||
@@ -314,7 +314,9 @@ class SkyFragment : Fragment() {
|
||||
legend.skyLegendShapeLine15a,
|
||||
legend.skyLegendShapeLine15b,
|
||||
legend.skyLegendShapeLine16a,
|
||||
legend.skyLegendShapeLine16b
|
||||
legend.skyLegendShapeLine16b,
|
||||
legend.skyLegendShapeLine17a,
|
||||
legend.skyLegendShapeLine17b
|
||||
)
|
||||
|
||||
// Shape Legend shapes
|
||||
@@ -331,7 +333,8 @@ class SkyFragment : Fragment() {
|
||||
legend.skyLegendDiamond4,
|
||||
legend.skyLegendDiamond5,
|
||||
legend.skyLegendDiamond6,
|
||||
legend.skyLegendDiamond7
|
||||
legend.skyLegendDiamond7,
|
||||
legend.skyLegendDiamond8
|
||||
)
|
||||
}
|
||||
|
||||
@@ -584,4 +587,4 @@ class SkyFragment : Fragment() {
|
||||
companion object {
|
||||
const val TAG = "GpsSkyFragment"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,15 +23,36 @@ import android.text.TextUtils
|
||||
import android.text.format.DateFormat
|
||||
import android.widget.Toast
|
||||
import androidx.annotation.StringRes
|
||||
import androidx.compose.animation.*
|
||||
import androidx.compose.animation.AnimatedVisibility
|
||||
import androidx.compose.animation.ExperimentalAnimationApi
|
||||
import androidx.compose.animation.expandVertically
|
||||
import androidx.compose.animation.scaleIn
|
||||
import androidx.compose.animation.scaleOut
|
||||
import androidx.compose.animation.shrinkVertically
|
||||
import androidx.compose.foundation.background
|
||||
import androidx.compose.foundation.clickable
|
||||
import androidx.compose.foundation.horizontalScroll
|
||||
import androidx.compose.foundation.layout.*
|
||||
import androidx.compose.foundation.layout.Arrangement
|
||||
import androidx.compose.foundation.layout.Box
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.Row
|
||||
import androidx.compose.foundation.layout.fillMaxWidth
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.foundation.layout.wrapContentHeight
|
||||
import androidx.compose.foundation.layout.wrapContentWidth
|
||||
import androidx.compose.foundation.rememberScrollState
|
||||
import androidx.compose.foundation.shape.RoundedCornerShape
|
||||
import androidx.compose.material.*
|
||||
import androidx.compose.runtime.*
|
||||
import androidx.compose.material.AlertDialog
|
||||
import androidx.compose.material.Card
|
||||
import androidx.compose.material.Icon
|
||||
import androidx.compose.material.MaterialTheme
|
||||
import androidx.compose.material.Text
|
||||
import androidx.compose.material.TextButton
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.runtime.setValue
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.draw.clip
|
||||
@@ -56,11 +77,10 @@ import com.android.gpstest.library.data.FixState
|
||||
import com.android.gpstest.library.model.CoordinateType
|
||||
import com.android.gpstest.library.model.DilutionOfPrecision
|
||||
import com.android.gpstest.library.model.SatelliteMetadata
|
||||
import com.android.gpstest.library.util.*
|
||||
import com.android.gpstest.library.util.DateTimeUtils
|
||||
import com.android.gpstest.library.util.FormatUtils.formatAccuracy
|
||||
import com.android.gpstest.library.util.FormatUtils.formatAltitude
|
||||
import com.android.gpstest.library.util.FormatUtils.formatAltitudeMsl
|
||||
import com.android.gpstest.ui.components.LinkifyText
|
||||
import com.android.gpstest.library.util.FormatUtils.formatBearing
|
||||
import com.android.gpstest.library.util.FormatUtils.formatBearingAccuracy
|
||||
import com.android.gpstest.library.util.FormatUtils.formatDoP
|
||||
@@ -69,10 +89,14 @@ import com.android.gpstest.library.util.FormatUtils.formatLatOrLon
|
||||
import com.android.gpstest.library.util.FormatUtils.formatNumSats
|
||||
import com.android.gpstest.library.util.FormatUtils.formatSpeed
|
||||
import com.android.gpstest.library.util.FormatUtils.formatSpeedAccuracy
|
||||
import com.android.gpstest.library.util.IOUtils
|
||||
import com.android.gpstest.library.util.LibUIUtils
|
||||
import com.android.gpstest.library.util.PreferenceUtil.coordinateFormat
|
||||
import com.android.gpstest.library.util.PreferenceUtil.shareIncludeAltitude
|
||||
import com.android.gpstest.library.util.PreferenceUtils
|
||||
import com.android.gpstest.library.util.PreferenceUtils.gnssFilter
|
||||
import com.android.gpstest.library.util.SatelliteUtil.isVerticalAccuracySupported
|
||||
import com.android.gpstest.ui.components.LinkifyText
|
||||
import java.text.SimpleDateFormat
|
||||
|
||||
@Preview
|
||||
|
||||
@@ -17,7 +17,12 @@
|
||||
package com.android.gpstest.ui.status
|
||||
|
||||
import android.os.Bundle
|
||||
import android.view.*
|
||||
import android.view.LayoutInflater
|
||||
import android.view.Menu
|
||||
import android.view.MenuInflater
|
||||
import android.view.MenuItem
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.compose.ui.platform.ComposeView
|
||||
import androidx.compose.ui.platform.ViewCompositionStrategy
|
||||
import androidx.fragment.app.Fragment
|
||||
@@ -26,8 +31,8 @@ import com.android.gpstest.Application.Companion.app
|
||||
import com.android.gpstest.Application.Companion.prefs
|
||||
import com.android.gpstest.R
|
||||
import com.android.gpstest.library.ui.SignalInfoViewModel
|
||||
import com.android.gpstest.ui.theme.AppTheme
|
||||
import com.android.gpstest.library.util.PreferenceUtil.darkTheme
|
||||
import com.android.gpstest.ui.theme.AppTheme
|
||||
import com.android.gpstest.util.UIUtils.showSortByDialog
|
||||
import dagger.hilt.android.AndroidEntryPoint
|
||||
|
||||
|
||||
@@ -18,8 +18,23 @@ package com.android.gpstest.ui.status
|
||||
import android.location.Location
|
||||
import androidx.annotation.DrawableRes
|
||||
import androidx.annotation.StringRes
|
||||
import androidx.compose.foundation.*
|
||||
import androidx.compose.foundation.layout.*
|
||||
import androidx.compose.foundation.BorderStroke
|
||||
import androidx.compose.foundation.Image
|
||||
import androidx.compose.foundation.border
|
||||
import androidx.compose.foundation.clickable
|
||||
import androidx.compose.foundation.horizontalScroll
|
||||
import androidx.compose.foundation.layout.Arrangement
|
||||
import androidx.compose.foundation.layout.Box
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.Row
|
||||
import androidx.compose.foundation.layout.Spacer
|
||||
import androidx.compose.foundation.layout.defaultMinSize
|
||||
import androidx.compose.foundation.layout.fillMaxSize
|
||||
import androidx.compose.foundation.layout.fillMaxWidth
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.foundation.layout.wrapContentHeight
|
||||
import androidx.compose.foundation.rememberScrollState
|
||||
import androidx.compose.foundation.verticalScroll
|
||||
import androidx.compose.material.Card
|
||||
import androidx.compose.material.MaterialTheme
|
||||
import androidx.compose.material.Text
|
||||
@@ -45,7 +60,11 @@ import com.android.gpstest.Application.Companion.app
|
||||
import com.android.gpstest.Application.Companion.prefs
|
||||
import com.android.gpstest.R
|
||||
import com.android.gpstest.library.data.FixState
|
||||
import com.android.gpstest.library.model.*
|
||||
import com.android.gpstest.library.model.DilutionOfPrecision
|
||||
import com.android.gpstest.library.model.GnssType
|
||||
import com.android.gpstest.library.model.SatelliteMetadata
|
||||
import com.android.gpstest.library.model.SatelliteStatus
|
||||
import com.android.gpstest.library.model.SbasType
|
||||
import com.android.gpstest.library.ui.SignalInfoViewModel
|
||||
import com.android.gpstest.library.util.CarrierFreqUtils
|
||||
import com.android.gpstest.library.util.MathUtils
|
||||
|
||||
@@ -26,10 +26,10 @@ import android.graphics.drawable.Drawable;
|
||||
import android.util.AttributeSet;
|
||||
import android.widget.ScrollView;
|
||||
|
||||
import com.android.gpstest.R;
|
||||
|
||||
import androidx.core.view.ViewCompat;
|
||||
|
||||
import com.android.gpstest.R;
|
||||
|
||||
/**
|
||||
* A layout that draws something in the insets passed to {@link #fitSystemWindows(android.graphics.Rect)},
|
||||
* i.e. the area above UI chrome
|
||||
|
||||
@@ -100,7 +100,7 @@
|
||||
android:layout_gravity="center_vertical"
|
||||
android:layout_margin="5dp"
|
||||
app:srcCompat="@drawable/square"
|
||||
android:contentDescription="@string/square"/>/>
|
||||
android:contentDescription="@string/square"/>
|
||||
|
||||
<View
|
||||
android:id="@+id/sky_legend_shape_line2a"
|
||||
|
||||
@@ -15,14 +15,14 @@
|
||||
*/
|
||||
package com.android.gpstest.util;
|
||||
|
||||
import static junit.framework.Assert.assertEquals;
|
||||
import static junit.framework.Assert.assertNull;
|
||||
|
||||
import com.android.gpstest.library.model.DilutionOfPrecision;
|
||||
import com.android.gpstest.library.util.NmeaUtils;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import static junit.framework.Assert.assertEquals;
|
||||
import static junit.framework.Assert.assertNull;
|
||||
|
||||
public class NmeaUtilsTest {
|
||||
/**
|
||||
* Test getting altitude above mean sea level (geoid) from NMEA sentences
|
||||
|
||||
@@ -4,17 +4,18 @@ buildscript {
|
||||
compose_version = '1.2.0-alpha05'
|
||||
wear_compose_version = '1.0.2'
|
||||
}
|
||||
ext.kotlin_version = '1.8.0'
|
||||
ext.hilt_version = '2.45'
|
||||
ext.kotlin_version = '2.1.0'
|
||||
ext.hilt_version = '2.56.2'
|
||||
repositories {
|
||||
google()
|
||||
mavenCentral()
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:8.7.2'
|
||||
classpath 'com.android.tools.build:gradle:8.11.1'
|
||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
||||
// Hilt for dependency injection
|
||||
classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version"
|
||||
classpath 'org.jetbrains.kotlin:compose-compiler-gradle-plugin:2.1.0'
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,23 +1,25 @@
|
||||
No ads, and no trackers - GPSTest displays real-time information for GNSS and SBAS satellites in view of your device. A vital open-source testing tool for platform engineers, developers, and power users, GPSTest can also assist in understanding why your GPS/GNSS isn't working.
|
||||
|
||||
Supports dual-frequency* GNSS for:
|
||||
• GPS (USA Navstar) (L1, L2, L3, L4, L5)
|
||||
• Galileo (European Union) (E1, E5, E5a, E5b, E6)
|
||||
• GLONASS (Russia) (L1, L2, L3, L5)
|
||||
• QZSS (Japan) (L1, L2, L5, L6)
|
||||
• BeiDou/COMPASS (China) (B1I, B2a, B2b, B3I)
|
||||
• IRNSS/NavIC (India) (L1, L5, S)
|
||||
• Various satellite-based augmentation systems SBAS (e.g., GAGAN, Anik F1, Galaxy 15, Inmarsat 3-F2, Inmarsat 4-F3, SES-5) (L1, L5)
|
||||
|
||||
* GPS (USA Navstar) (L1, L2, L3, L4, L5)
|
||||
* Galileo (European Union) (E1, E5, E5a, E5b, E6)
|
||||
* GLONASS (Russia) (L1, L2, L3, L5)
|
||||
* QZSS (Japan) (L1, L2, L5, L6)
|
||||
* BeiDou/COMPASS (China) (B1I, B2a, B2b, B3I)
|
||||
* IRNSS/NavIC (India) (L1, L5, S)
|
||||
* Various satellite-based augmentation systems SBAS (e.g., GAGAN, Anik F1, Galaxy 15, Inmarsat 3-F2, Inmarsat 4-F3, SES-5) (L1, L5)
|
||||
|
||||
*Dual-frequency GNSS requires device hardware support and Android 8.0 Oreo or higher. More at https://medium.com/@sjbarbeau/dual-frequency-gnss-on-android-devices-152b8826e1c.
|
||||
|
||||
The "Accuracy" feature lets you measure the error in your device's position against your *actual* location (entered by you). Other apps show you the *estimated* accuracy, which is generated by your device. GPSTest lets you to compare this estimated accuracy to *actual* accuracy!
|
||||
|
||||
Menu options:
|
||||
• Inject Time Data - Injects Time assistance data for GPS into the platform, using information from a Network Time Protocol (NTP) server
|
||||
• Inject PSDS Data - Injects Predicted Satellite Data Service (PSDS) assistance data for GNSS into the platform, using information from a PSDS server. Note that some devices don't use PSDS for assistance data - if this is your device, you'll see a message saying "Platform does not support injecting PSDS data". PSDS is the generic term for products like [XTRA assistance data](https://www.qualcomm.com/news/releases/2007/02/qualcomm-introduces-gpsonextra-assistance-expand-capabilities-standalone).
|
||||
• Clear Assist Data - Clears all assistance data used for GNSS, including NTP and XTRA data (Note: if you select this option to fix broken GNSS on your device, for GPS to work again you may need to ‘Inject Time’ and ‘Inject PSDS’ data. You may also see a large delay until your device acquires a fix again, so please use this feature with caution.)
|
||||
• Settings - Switch between light and dark themes, change map tile type, auto-start GPS on startup, minimum time and distance between GPS updates, keep screen on.
|
||||
|
||||
* Inject Time Data - Injects Time assistance data for GPS into the platform, using information from a Network Time Protocol (NTP) server
|
||||
* Inject PSDS Data - Injects Predicted Satellite Data Service (PSDS) assistance data for GNSS into the platform, using information from a PSDS server. Note that some devices don't use PSDS for assistance data - if this is your device, you'll see a message saying "Platform does not support injecting PSDS data". PSDS is the generic term for products like [XTRA assistance data](https://www.qualcomm.com/news/releases/2007/02/qualcomm-introduces-gpsonextra-assistance-expand-capabilities-standalone).
|
||||
* Clear Assist Data - Clears all assistance data used for GNSS, including NTP and XTRA data (Note: if you select this option to fix broken GNSS on your device, for GPS to work again you may need to ‘Inject Time’ and ‘Inject PSDS’ data. You may also see a large delay until your device acquires a fix again, so please use this feature with caution.)
|
||||
* Settings - Switch between light and dark themes, change map tile type, auto-start GPS on startup, minimum time and distance between GPS updates, keep screen on.
|
||||
|
||||
Beta versions:
|
||||
https://play.google.com/apps/testing/com.android.gpstest
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
org.gradle.daemon=true
|
||||
org.gradle.parallel=true
|
||||
org.gradle.configureondemand=true
|
||||
org.gradle.caching=false
|
||||
org.gradle.caching=true
|
||||
org.gradle.jvmargs=-Xmx3g -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 -XX:+UseParallelGC
|
||||
android.enableJetifier=true
|
||||
android.useAndroidX=true
|
||||
android.defaults.buildfeatures.buildconfig=true
|
||||
android.nonTransitiveRClass=false
|
||||
android.nonFinalResIds=false
|
||||
2
gradle/wrapper/gradle-wrapper.properties
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
@@ -1,6 +1,6 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip
|
||||
networkTimeout=10000
|
||||
validateDistributionUrl=true
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
|
||||
@@ -22,8 +22,9 @@ android {
|
||||
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt'
|
||||
}
|
||||
}
|
||||
lint {
|
||||
disable "JvmStaticProvidesInObjectDetector", "FieldSiteTargetOnQualifierAnnotation", "ModuleCompanionObjects", "ModuleCompanionObjectsNotInModuleParent"
|
||||
|
||||
lintOptions {
|
||||
disable "JvmStaticProvidesInObjectDetector", "FieldSiteTargetOnQualifierAnnotation", "ModuleCompanionObjects", "ModuleCompanionObjectsNotInModuleParent", 'StringFormatInvalid', 'MissingTranslation', 'ExtraTranslation', 'ExpiredTargetSdkVersion'
|
||||
}
|
||||
|
||||
buildFeatures {
|
||||
|
||||
@@ -1,13 +1,11 @@
|
||||
package com.android.library
|
||||
|
||||
import androidx.test.platform.app.InstrumentationRegistry
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||
|
||||
import androidx.test.platform.app.InstrumentationRegistry
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
|
||||
import org.junit.Assert.*
|
||||
|
||||
/**
|
||||
* Instrumented test, which will execute on an Android device.
|
||||
*
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<manifest>
|
||||
|
||||
</manifest>
|
||||
@@ -36,7 +36,6 @@ import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.SharingStarted
|
||||
import kotlinx.coroutines.flow.callbackFlow
|
||||
import kotlinx.coroutines.flow.shareIn
|
||||
import java.util.*
|
||||
|
||||
private const val TAG = "SharedAntennaManager"
|
||||
|
||||
|
||||
@@ -36,7 +36,12 @@ import com.android.gpstest.library.util.hasPermission
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
||||
import kotlinx.coroutines.channels.awaitClose
|
||||
import kotlinx.coroutines.flow.*
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
import kotlinx.coroutines.flow.SharingStarted
|
||||
import kotlinx.coroutines.flow.StateFlow
|
||||
import kotlinx.coroutines.flow.callbackFlow
|
||||
import kotlinx.coroutines.flow.shareIn
|
||||
|
||||
private const val TAG = "SharedGnssMeasurementManager"
|
||||
|
||||
|
||||
@@ -33,7 +33,12 @@ import com.android.gpstest.library.util.hasPermission
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
||||
import kotlinx.coroutines.channels.awaitClose
|
||||
import kotlinx.coroutines.flow.*
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
import kotlinx.coroutines.flow.SharingStarted
|
||||
import kotlinx.coroutines.flow.StateFlow
|
||||
import kotlinx.coroutines.flow.callbackFlow
|
||||
import kotlinx.coroutines.flow.shareIn
|
||||
import java.util.concurrent.TimeUnit
|
||||
|
||||
private const val TAG = "SharedGnssStatusManager"
|
||||
|
||||
@@ -29,7 +29,12 @@ import com.android.gpstest.library.util.hasPermission
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
||||
import kotlinx.coroutines.channels.awaitClose
|
||||
import kotlinx.coroutines.flow.*
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
import kotlinx.coroutines.flow.SharingStarted
|
||||
import kotlinx.coroutines.flow.StateFlow
|
||||
import kotlinx.coroutines.flow.callbackFlow
|
||||
import kotlinx.coroutines.flow.shareIn
|
||||
|
||||
private const val TAG = "SharedLocationManager"
|
||||
|
||||
|
||||
@@ -19,7 +19,11 @@ import android.Manifest
|
||||
import android.annotation.SuppressLint
|
||||
import android.content.Context
|
||||
import android.content.SharedPreferences
|
||||
import android.hardware.*
|
||||
import android.hardware.GeomagneticField
|
||||
import android.hardware.Sensor
|
||||
import android.hardware.SensorEvent
|
||||
import android.hardware.SensorEventListener
|
||||
import android.hardware.SensorManager
|
||||
import android.hardware.display.DisplayManager
|
||||
import android.location.LocationManager
|
||||
import android.util.Log
|
||||
|
||||
@@ -3,7 +3,13 @@ package com.android.gpstest.library.di
|
||||
import android.content.Context
|
||||
import android.content.SharedPreferences
|
||||
import android.preference.PreferenceManager
|
||||
import com.android.gpstest.library.data.*
|
||||
import com.android.gpstest.library.data.SharedAntennaManager
|
||||
import com.android.gpstest.library.data.SharedGnssMeasurementManager
|
||||
import com.android.gpstest.library.data.SharedGnssStatusManager
|
||||
import com.android.gpstest.library.data.SharedLocationManager
|
||||
import com.android.gpstest.library.data.SharedNavMessageManager
|
||||
import com.android.gpstest.library.data.SharedNmeaManager
|
||||
import com.android.gpstest.library.data.SharedSensorManager
|
||||
import dagger.Module
|
||||
import dagger.Provides
|
||||
import dagger.hilt.InstallIn
|
||||
|
||||
@@ -28,7 +28,13 @@ import androidx.lifecycle.viewModelScope
|
||||
import com.android.gpstest.library.data.FirstFixState
|
||||
import com.android.gpstest.library.data.FixState
|
||||
import com.android.gpstest.library.data.LocationRepository
|
||||
import com.android.gpstest.library.model.*
|
||||
import com.android.gpstest.library.model.DilutionOfPrecision
|
||||
import com.android.gpstest.library.model.GnssType
|
||||
import com.android.gpstest.library.model.Satellite
|
||||
import com.android.gpstest.library.model.SatelliteGroup
|
||||
import com.android.gpstest.library.model.SatelliteMetadata
|
||||
import com.android.gpstest.library.model.SatelliteStatus
|
||||
import com.android.gpstest.library.model.SbasType
|
||||
import com.android.gpstest.library.util.CarrierFreqUtils.getCarrierFrequencyLabel
|
||||
import com.android.gpstest.library.util.FormatUtils.formatTtff
|
||||
import com.android.gpstest.library.util.NmeaUtils
|
||||
|
||||
@@ -9,7 +9,12 @@ import android.location.Location
|
||||
import android.os.Build
|
||||
import androidx.annotation.RequiresApi
|
||||
import com.android.gpstest.library.R
|
||||
import com.android.gpstest.library.model.*
|
||||
import com.android.gpstest.library.model.CoordinateType
|
||||
import com.android.gpstest.library.model.DilutionOfPrecision
|
||||
import com.android.gpstest.library.model.Orientation
|
||||
import com.android.gpstest.library.model.SatelliteGroup
|
||||
import com.android.gpstest.library.model.SatelliteMetadata
|
||||
import com.android.gpstest.library.model.SatelliteStatus
|
||||
import com.android.gpstest.library.util.SatelliteUtil.isBearingAccuracySupported
|
||||
import com.android.gpstest.library.util.SatelliteUtil.isSpeedAccuracySupported
|
||||
import com.android.gpstest.library.util.SatelliteUtil.isVerticalAccuracySupported
|
||||
|
||||
@@ -21,6 +21,7 @@ import android.annotation.TargetApi;
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
import android.content.res.Resources;
|
||||
|
||||
import com.android.gpstest.library.R;
|
||||
import com.android.gpstest.library.model.GnssType;
|
||||
|
||||
|
||||
@@ -19,8 +19,16 @@ import android.annotation.SuppressLint
|
||||
import android.location.GnssStatus
|
||||
import android.location.Location
|
||||
import android.os.Build
|
||||
import com.android.gpstest.library.model.*
|
||||
import com.android.gpstest.library.util.CarrierFreqUtils.*
|
||||
import com.android.gpstest.library.model.GnssType
|
||||
import com.android.gpstest.library.model.Satellite
|
||||
import com.android.gpstest.library.model.SatelliteGroup
|
||||
import com.android.gpstest.library.model.SatelliteMetadata
|
||||
import com.android.gpstest.library.model.SatelliteStatus
|
||||
import com.android.gpstest.library.model.SbasType
|
||||
import com.android.gpstest.library.util.CarrierFreqUtils.CF_UNKNOWN
|
||||
import com.android.gpstest.library.util.CarrierFreqUtils.CF_UNSUPPORTED
|
||||
import com.android.gpstest.library.util.CarrierFreqUtils.getCarrierFrequencyLabel
|
||||
import com.android.gpstest.library.util.CarrierFreqUtils.isPrimaryCarrier
|
||||
import com.android.gpstest.library.util.SatelliteUtils.createGnssSatelliteKey
|
||||
|
||||
object SatelliteUtil {
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
package com.android.library
|
||||
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Test
|
||||
|
||||
import org.junit.Assert.*
|
||||
|
||||
/**
|
||||
* Example local unit test, which will execute on the development machine (host).
|
||||
*
|
||||
|
||||
@@ -3,6 +3,7 @@ plugins {
|
||||
id 'org.jetbrains.kotlin.android'
|
||||
id 'kotlin-kapt'
|
||||
id 'dagger.hilt.android.plugin'
|
||||
id 'org.jetbrains.kotlin.plugin.compose'
|
||||
}
|
||||
|
||||
android {
|
||||
|
||||
@@ -37,4 +37,4 @@
|
||||
</activity>
|
||||
</application>
|
||||
|
||||
</manifest>
|
||||
</manifest>
|
||||
|
||||
@@ -13,12 +13,15 @@ import androidx.activity.compose.setContent
|
||||
import androidx.activity.viewModels
|
||||
import androidx.annotation.DrawableRes
|
||||
import androidx.annotation.StringRes
|
||||
import androidx.compose.animation.AnimatedVisibility
|
||||
import androidx.compose.foundation.BorderStroke
|
||||
import androidx.compose.foundation.Image
|
||||
import androidx.compose.foundation.border
|
||||
import androidx.compose.foundation.layout.*
|
||||
import androidx.compose.material.LinearProgressIndicator
|
||||
import androidx.compose.foundation.layout.Box
|
||||
import androidx.compose.foundation.layout.Row
|
||||
import androidx.compose.foundation.layout.defaultMinSize
|
||||
import androidx.compose.foundation.layout.fillMaxWidth
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.foundation.layout.wrapContentHeight
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
@@ -34,13 +37,19 @@ import androidx.core.app.ActivityCompat
|
||||
import androidx.lifecycle.Lifecycle
|
||||
import androidx.lifecycle.flowWithLifecycle
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
import androidx.wear.compose.material.*
|
||||
import androidx.wear.compose.material.Text
|
||||
import com.android.gpstest.Application.Companion.prefs
|
||||
import com.android.gpstest.library.data.FixState
|
||||
import com.android.gpstest.library.data.LocationRepository
|
||||
import com.android.gpstest.library.model.*
|
||||
import com.android.gpstest.library.model.GnssType
|
||||
import com.android.gpstest.library.model.SatelliteStatus
|
||||
import com.android.gpstest.library.model.SbasType
|
||||
import com.android.gpstest.library.ui.SignalInfoViewModel
|
||||
import com.android.gpstest.library.util.*
|
||||
import com.android.gpstest.library.util.CarrierFreqUtils
|
||||
import com.android.gpstest.library.util.LibUIUtils
|
||||
import com.android.gpstest.library.util.MathUtils
|
||||
import com.android.gpstest.library.util.PermissionUtils
|
||||
import com.android.gpstest.library.util.PreferenceUtil
|
||||
import com.android.gpstest.library.util.PreferenceUtils
|
||||
import dagger.hilt.android.AndroidEntryPoint
|
||||
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
||||
import kotlinx.coroutines.Job
|
||||
|
||||
@@ -23,7 +23,14 @@ import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.input.rotary.onRotaryScrollEvent
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.wear.compose.material.*
|
||||
import androidx.wear.compose.material.AutoCenteringParams
|
||||
import androidx.wear.compose.material.PositionIndicator
|
||||
import androidx.wear.compose.material.Scaffold
|
||||
import androidx.wear.compose.material.ScalingLazyColumn
|
||||
import androidx.wear.compose.material.Text
|
||||
import androidx.wear.compose.material.TimeSource
|
||||
import androidx.wear.compose.material.TimeText
|
||||
import androidx.wear.compose.material.rememberScalingLazyListState
|
||||
import com.android.gpstest.Application
|
||||
import com.android.gpstest.library.data.FixState
|
||||
import com.android.gpstest.library.model.CoordinateType
|
||||
|
||||
Reference in New Issue
Block a user