I'm Irfan.
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
(bitcoin:18ijfsv5fcDKQ6CTe4wycKxZMmti4oUXjW
)
Know your geo coordinates using on-device GPS and Network location providers
License: GNU Affero General Public License v3.0
Would it be possible to also include the UnifiedNlp Nominatim backend if installed, so one could see if it properly resolves?
What about adding a small compass if the phone has the sensor?
Could you please replace the APK at release v1.05 with a signed one? My updater complains:
DOES NOT VERIFY
ERROR: Missing META-INF/MANIFEST.MF
2024-01-01 03:31:38,057 ERROR:
repo/com.mirfatif.mylocation_105.apk:
2024-01-01 03:31:38,279 WARNING: Archiving com.mirfatif.mylocation_105.apk with invalid signature!
I have not yet absorbed all the API docuemntation, but I suspect many others are also unclear on what I'm writing about. It may also be that the details in this issue are off.
There is a network provider interface in AOSP, and my understanding is that UnifiedNLP provides an implementation of that, so apps that use the AOSP interface can function. There is also Google Play location serivces, which is nearly always accessed by including proprietary code in the app, and offers FusedLocation.
Given that MyLocation is on f-droid, I'm assuming that it lacks code for the Play API, and thus Network is the AOSP Network interface, and of course MyLocation doesn't know if that's implemented by Play Services, by standalone UnifiedNLP, or by UnifiedNLP-as-part-of-microg . That's not 100% clear from the README.
This also makes me wonder if the app has a non-Free build flavor that does query Play services, and especially if there is Free library support to query that, so that the f-droid version could make the queries, presumably possibly answered differently from straight Network even on systems with microg.
I mentioned a lot of things, but this issue is really meant to be that someone who mostly understands the landscape will not be 100% clear on which interface is being used. Thanks for having published this; while I'm nitpicking this is the best tool to debug by a wide margin.
...as lsparanoid is not available in a trusted maven repo: https://gitlab.com/fdroid/fdroiddata/-/jobs/5618400469#L822
Now, I'm trying to remove it:
- sed -i -e '/lsparanoid/d' ../buildSrc/build.gradle.kts ../buildSrc/src/main/kotlin/java-android-lib-conventions.gradle.kts
../buildSrc/src/main/kotlin/android-lib-conventions.gradle.kts ../gradle/libs.versions.toml
- sed -i -e '/lsparanoid {/,/^}/d' -e '/lsparanoid/d' build.gradle ../buildSrc/src/main/kotlin/apk-conventions.gradle.kts
...but fails with:
...
> Task :buildSrc:compileKotlin
e: file:///home/vagrant/build/com.mirfatif.mylocation/buildSrc/src/main/kotlin/apk-conventions.gradle.kts:6:1 Expression 'andro
id' cannot be invoked as a function. The function 'invoke()' is not found
e: file:///home/vagrant/build/com.mirfatif.mylocation/buildSrc/src/main/kotlin/apk-conventions.gradle.kts:6:1 Unresolved refere
nce. None of the following candidates is applicable because of receiver type mismatch:
internal val ComPluginGroup.android: ComAndroidPluginGroup defined in gradle.kotlin.dsl.plugins._6149f5dcd4467557eac003b2cbf171
dc in file PluginSpecBuilders.kt
internal val OrgJetbrainsKotlinPlatformPluginGroup.android: PluginDependencySpec defined in gradle.kotlin.dsl.plugins._6149f5dc
d4467557eac003b2cbf171dc in file PluginSpecBuilders.kt
internal val OrgJetbrainsKotlinPluginGroup.android: PluginDependencySpec defined in gradle.kotlin.dsl.plugins._6149f5dcd4467557
eac003b2cbf171dc in file PluginSpecBuilders.kt
internal val PluginDependenciesSpec.android: PluginDependencySpec defined in gradle.kotlin.dsl.plugins._6149f5dcd4467557eac003b
2cbf171dc in file PluginSpecBuilders.kt
e: file:///home/vagrant/build/com.mirfatif.mylocation/buildSrc/src/main/kotlin/apk-conventions.gradle.kts:7:3 Unresolved refere
nce: compileSdk
e: file:///home/vagrant/build/com.mirfatif.mylocation/buildSrc/src/main/kotlin/apk-conventions.gradle.kts:8:3 Unresolved refere
nce: buildToolsVersion
e: file:///home/vagrant/build/com.mirfatif.mylocation/buildSrc/src/main/kotlin/apk-conventions.gradle.kts:10:3 Unresolved refer
ence: defaultConfig
e: file:///home/vagrant/build/com.mirfatif.mylocation/buildSrc/src/main/kotlin/apk-conventions.gradle.kts:11:5 Unresolved refer
ence: minSdk
e: file:///home/vagrant/build/com.mirfatif.mylocation/buildSrc/src/main/kotlin/apk-conventions.gradle.kts:12:5 Unresolved refer
ence: targetSdk
e: file:///home/vagrant/build/com.mirfatif.mylocation/buildSrc/src/main/kotlin/apk-conventions.gradle.kts:14:5 Unresolved refer
ence: multiDexEnabled
e: file:///home/vagrant/build/com.mirfatif.mylocation/buildSrc/src/main/kotlin/apk-conventions.gradle.kts:17:3 Unresolved refer
ence: compileOptions
e: file:///home/vagrant/build/com.mirfatif.mylocation/buildSrc/src/main/kotlin/apk-conventions.gradle.kts:18:5 Unresolved refer
ence: sourceCompatibility
e: file:///home/vagrant/build/com.mirfatif.mylocation/buildSrc/src/main/kotlin/apk-conventions.gradle.kts:19:5 Unresolved refer
ence: targetCompatibility
e: file:///home/vagrant/build/com.mirfatif.mylocation/buildSrc/src/main/kotlin/apk-conventions.gradle.kts:21:5 Unresolved reference: isCoreLibraryDesugaringEnabled
e: file:///home/vagrant/build/com.mirfatif.mylocation/buildSrc/src/main/kotlin/apk-conventions.gradle.kts:24:3 Unresolved reference: kotlinOptions
e: file:///home/vagrant/build/com.mirfatif.mylocation/buildSrc/src/main/kotlin/apk-conventions.gradle.kts:24:17 Variable expected
e: file:///home/vagrant/build/com.mirfatif.mylocation/buildSrc/src/main/kotlin/apk-conventions.gradle.kts:26:3 Unresolved reference: buildTypes
e: file:///home/vagrant/build/com.mirfatif.mylocation/buildSrc/src/main/kotlin/apk-conventions.gradle.kts:27:5 Unresolved reference: release
e: file:///home/vagrant/build/com.mirfatif.mylocation/buildSrc/src/main/kotlin/apk-conventions.gradle.kts:28:7 Unresolved reference: isMinifyEnabled
e: file:///home/vagrant/build/com.mirfatif.mylocation/buildSrc/src/main/kotlin/apk-conventions.gradle.kts:29:7 Unresolved reference: isShrinkResources
e: file:///home/vagrant/build/com.mirfatif.mylocation/buildSrc/src/main/kotlin/apk-conventions.gradle.kts:31:7 Unresolved reference: proguardFiles
e: file:///home/vagrant/build/com.mirfatif.mylocation/buildSrc/src/main/kotlin/apk-conventions.gradle.kts:31:21 Unresolved reference: getDefaultProguardFile
e: file:///home/vagrant/build/com.mirfatif.mylocation/buildSrc/src/main/kotlin/apk-conventions.gradle.kts:35:3 Unresolved reference: dependenciesInfo
e: file:///home/vagrant/build/com.mirfatif.mylocation/buildSrc/src/main/kotlin/apk-conventions.gradle.kts:35:20 Variable expected
e: file:///home/vagrant/build/com.mirfatif.mylocation/buildSrc/src/main/kotlin/apk-conventions.gradle.kts:37:3 Unresolved reference: buildFeatures
e: file:///home/vagrant/build/com.mirfatif.mylocation/buildSrc/src/main/kotlin/apk-conventions.gradle.kts:38:5 Unresolved reference: viewBinding
e: file:///home/vagrant/build/com.mirfatif.mylocation/buildSrc/src/main/kotlin/apk-conventions.gradle.kts:39:5 Unresolved reference: dataBinding
e: file:///home/vagrant/build/com.mirfatif.mylocation/buildSrc/src/main/kotlin/apk-conventions.gradle.kts:40:5 Unresolved reference: buildConfig
e: file:///home/vagrant/build/com.mirfatif.mylocation/buildSrc/src/main/kotlin/apk-conventions.gradle.kts:41:5 Unresolved reference: compose
e: file:///home/vagrant/build/com.mirfatif.mylocation/buildSrc/src/main/kotlin/apk-conventions.gradle.kts:44:3 Unresolved reference: composeOptions
e: file:///home/vagrant/build/com.mirfatif.mylocation/buildSrc/src/main/kotlin/apk-conventions.gradle.kts:45:5 Unresolved reference: kotlinCompilerExtensionVersion
e: file:///home/vagrant/build/com.mirfatif.mylocation/buildSrc/src/main/kotlin/apk-conventions.gradle.kts:48:3 Unresolved reference: packaging
e: file:///home/vagrant/build/com.mirfatif.mylocation/buildSrc/src/main/kotlin/apk-conventions.gradle.kts:50:15 Unresolved reference: excludes
e: file:///home/vagrant/build/com.mirfatif.mylocation/buildSrc/src/main/kotlin/apk-conventions.gradle.kts:50:24 Unresolved reference: +=
e: file:///home/vagrant/build/com.mirfatif.mylocation/buildSrc/src/main/kotlin/apk-conventions.gradle.kts:55:3 Unresolved reference: implementation
e: file:///home/vagrant/build/com.mirfatif.mylocation/buildSrc/src/main/kotlin/apk-conventions.gradle.kts:56:3 Unresolved reference: implementation
e: file:///home/vagrant/build/com.mirfatif.mylocation/buildSrc/src/main/kotlin/apk-conventions.gradle.kts:57:3 Unresolved reference: coreLibraryDesugaring
> Task :buildSrc:compileKotlin FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':buildSrc:compileKotlin'.
> A failure occurred while executing org.jetbrains.kotlin.compilerRunner.GradleCompilerRunnerWithWorkers$GradleKotlinCompilerWorkAction
> Compilation error. See log for more details
/LE: fyi https://gitlab.com/fdroid/fdroiddata/-/commit/dca51868c959aa54e9572509030ffc83d0841063
Using an online map would be a security problem by leaking location, so I'm suggesting adding a local map that can show all of the locations simultaneously. For an example of behavior (and likely some usable code), see SatStat which can show GPS in red and Network in blue, with error circles
I usually see DD.ddddd for latitude and longitude. This is ~1m and I think it's the right choice. But sometimes I see only 4 digits, and I'm guessing this means "5th digit of value is zero" rather than "there is some reason to think only 4 should be shown.
The concrete suggestion is thus to use a print format that always shows 5 digits, even if the fifth digit is 0.
My scanner just reported el/short_description.txt
having 98 chars. Fastlane allows for max 80 chars, so it will be truncated mid-word exactly at position 80. You might wish to adjust this so it doesn't look weird 😉
Very handy app. I primarily use it (especially the Lock G[NS]S
toggle feature) during various surveying (OSM, collecting data for the likes of MLS, …) and general tinkering.
To that end, I would find it useful to interrogate the passive location provider (as a separate UI section to GNSS, network, UnifiedNLP).
Several apps I use regularly are (deliberately) configured to use the passive provider only. So, being able to easily query the same data they're using, would be helpful, especially for parameter-tuning.
Thanks for your attention.
when app is in background and phone is in sleep mode. You probably need to request permission background location for Android10+
Can you please add the altitude?
When using this as a debug tool, the dynamic behavior from startup is very interesting. For example I think I saw DejaVu first report cell-based location and then after wifi scan completed a better location.
Inspired by GPSTest, it would be nice to have a persistent setting for logs, and if set, then on each invocation a log file would be written to Downloads/MyLocation/yyyymmddThhmmss.json (UTC!) or something like that, and have records perhaps (in json but logically like):
time=t event=start
time=t event=location provider=foo lat=x lon=y hae=z accuracy=w
time=t event=disable provider=gps
time=t event=end
with the hope that some scripts in contrib could process this, but even humans reading it would be very useful.
On CalyxOS, UnifiedNLP is present via microg, and the Mozilla and DejaVu backends are preinstalled. I have configured Mozilla off in settings, to prevent location (wifi list) from being sent to Mozilla. (In addition to paranoia, I find that because I usually navigate to places with osmand, DejaVu has learned wifi for most places, and it therefore is sufficient 99% of the time.)
On starting MyLocation (f-droid, up to date today), I see that it reports a location value from DejaVu and one from Mozilla. In most respects this is great and useful detail, but it violates my configured policy not to use Mozilla. I'm really unclear on if Mozilla is operating in the background anyway always, or whether the query from MyLocation causes it to wake up and send wifi info to a server, but I'm assuming for now that this is triggered behavior.
For a fix, I suggest either
I'm guessing that network location is showing "Not Supported" because I have google play services disabled on a "de-googled" stock Android 11. I'm suffering without location tagging photos or navigation, but I can't just install LineageOS on this phone (yet).
The readme.md says "On the devices with Google Play Services installed, NLP usually uses Google Location Service at backend." I installed an NLP backend, but that didn't help.
Due to the word "usually", I'm hoping there's a way to use network location without Google Location Service. And then it's a question of whether or not this app can provide network location to other apps.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.