This commit is contained in:
Daniel Arantes Loverde
2026-02-06 09:51:53 -03:00
parent 379bb35cfa
commit 92c2a67736
13 changed files with 574 additions and 138 deletions

View File

@@ -1,9 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- This AndroidManifest.xml template was generated by Skip -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools">
<!-- example permissions for using device location -->
<!-- <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> -->
<!-- <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<!-- permissions needed for using the internet or an embedded WebKit browser -->
<uses-permission android:name="android.permission.INTERNET" />

View File

@@ -8,6 +8,9 @@ import skip.ui.*
import android.Manifest
import android.app.Application
import android.graphics.Color as AndroidColor
import android.content.pm.PackageManager
import android.location.Location
import android.location.LocationManager
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.activity.SystemBarStyle
@@ -26,6 +29,7 @@ import androidx.compose.ui.graphics.luminance
import androidx.compose.ui.platform.LocalContext
import androidx.compose.material3.MaterialTheme
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
internal val logger: SkipLogger = SkipLogger(subsystem = "pedi.foods", category = "PediFoods")
@@ -50,6 +54,11 @@ open class AndroidAppMain: Application {
/// AndroidAppMain is initial `androidx.appcompat.app.AppCompatActivity`, and must match `activity android:name` in the AndroidMainfest.xml file.
open class MainActivity: AppCompatActivity {
private val locationRequestCode = 4201
private val locationPermissionDeniedKey = "location_permission_denied"
private val locationLatitudeKey = "last_location_lat"
private val locationLongitudeKey = "last_location_lng"
constructor() {
}
@@ -68,17 +77,7 @@ open class MainActivity: AppCompatActivity {
}
AppDelegate.shared.onLaunch()
// Example of requesting permissions on startup.
// These must match the permissions in the AndroidManifest.xml file.
//let permissions = listOf(
// Manifest.permission.ACCESS_COARSE_LOCATION,
// Manifest.permission.ACCESS_FINE_LOCATION
// Manifest.permission.CAMERA,
// Manifest.permission.WRITE_EXTERNAL_STORAGE,
//)
//let requestTag = 1
//ActivityCompat.requestPermissions(self, permissions.toTypedArray(), requestTag)
requestLocationPermissionsIfNeeded()
}
override fun onStart() {
@@ -127,6 +126,65 @@ open class MainActivity: AppCompatActivity {
override fun onRequestPermissionsResult(requestCode: Int, permissions: kotlin.Array<String>, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
logger.info("onRequestPermissionsResult: ${requestCode}")
if (requestCode == locationRequestCode) {
val granted = grantResults.isNotEmpty() && grantResults.all { it == PackageManager.PERMISSION_GRANTED }
val prefs = getSharedPreferences("${packageName}_preferences", MODE_PRIVATE)
prefs.edit().putBoolean(locationPermissionDeniedKey, !granted).apply()
if (granted) {
cacheLastKnownLocation()
}
}
}
private fun requestLocationPermissionsIfNeeded() {
val fine = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
val coarse = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)
val granted = fine == PackageManager.PERMISSION_GRANTED || coarse == PackageManager.PERMISSION_GRANTED
if (granted) {
val prefs = getSharedPreferences("${packageName}_preferences", MODE_PRIVATE)
prefs.edit().putBoolean(locationPermissionDeniedKey, false).apply()
cacheLastKnownLocation()
return
}
ActivityCompat.requestPermissions(
this,
arrayOf(Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION),
locationRequestCode
)
}
private fun cacheLastKnownLocation() {
val manager = getSystemService(LOCATION_SERVICE) as? LocationManager ?: return
val fineGranted = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
val coarseGranted = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED
if (!fineGranted && !coarseGranted) {
return
}
val providers = listOf(LocationManager.GPS_PROVIDER, LocationManager.NETWORK_PROVIDER)
var best: Location? = null
for (provider in providers) {
val candidate = try {
manager.getLastKnownLocation(provider)
} catch (_: SecurityException) {
null
} catch (_: Exception) {
null
}
if (candidate != null && (best == null || candidate.accuracy < best!!.accuracy)) {
best = candidate
}
}
if (best != null) {
val prefs = getSharedPreferences("${packageName}_preferences", MODE_PRIVATE)
prefs.edit()
.putString(locationLatitudeKey, best.latitude.toString())
.putString(locationLongitudeKey, best.longitude.toString())
.putBoolean(locationPermissionDeniedKey, false)
.apply()
}
}
companion object {