aboutsummaryrefslogtreecommitdiffstats
path: root/app/src/main/java/foundation/e/privacycentralapp/domain
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/main/java/foundation/e/privacycentralapp/domain')
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/domain/usecases/FakeLocationStateUseCase.kt123
1 files changed, 106 insertions, 17 deletions
diff --git a/app/src/main/java/foundation/e/privacycentralapp/domain/usecases/FakeLocationStateUseCase.kt b/app/src/main/java/foundation/e/privacycentralapp/domain/usecases/FakeLocationStateUseCase.kt
index 02fdb0f..7f288e0 100644
--- a/app/src/main/java/foundation/e/privacycentralapp/domain/usecases/FakeLocationStateUseCase.kt
+++ b/app/src/main/java/foundation/e/privacycentralapp/domain/usecases/FakeLocationStateUseCase.kt
@@ -18,6 +18,11 @@
package foundation.e.privacycentralapp.domain.usecases
import android.app.AppOpsManager
+import android.content.Context
+import android.location.Location
+import android.location.LocationListener
+import android.location.LocationManager
+import android.util.Log
import foundation.e.privacycentralapp.data.repositories.LocalStateRepository
import foundation.e.privacycentralapp.domain.entities.LocationMode
import foundation.e.privacycentralapp.dummy.CityDataSource
@@ -26,19 +31,23 @@ import foundation.e.privacymodules.permissions.PermissionsPrivacyModule
import foundation.e.privacymodules.permissions.data.AppOpModes
import foundation.e.privacymodules.permissions.data.ApplicationDescription
import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.launch
import kotlin.random.Random
class FakeLocationStateUseCase(
private val fakeLocationModule: IFakeLocationModule,
-
private val permissionsModule: PermissionsPrivacyModule,
private val localStateRepository: LocalStateRepository,
private val citiesRepository: CityDataSource,
private val appDesc: ApplicationDescription,
+ private val appContext: Context,
private val coroutineScope: CoroutineScope
) {
+ private val _locationMode = MutableStateFlow(LocationMode.REAL_LOCATION)
+ val locationMode: StateFlow<LocationMode> = _locationMode
init {
coroutineScope.launch {
@@ -48,24 +57,36 @@ class FakeLocationStateUseCase(
}
}
- fun getLocationMode(): LocationMode = when(localStateRepository.fakeLocation) {
- null -> LocationMode.REAL_LOCATION
- in citiesRepository.citiesLocationsList -> LocationMode.RANDOM_LOCATION
- else -> LocationMode.SPECIFIC_LOCATION
+ private val locationManager: LocationManager
+ get() = appContext.getSystemService(Context.LOCATION_SERVICE) as LocationManager
+
+ fun getLocationMode(): Triple<LocationMode, Float?, Float?> {
+ val fakeLocation = localStateRepository.fakeLocation
+ return if (fakeLocation != null && _locationMode.value == LocationMode.SPECIFIC_LOCATION) {
+ Triple(
+ LocationMode.SPECIFIC_LOCATION,
+ fakeLocation.first,
+ fakeLocation.second
+ )
+ } else {
+ Triple(_locationMode.value, null, null)
+ }
}
private fun acquireLocationPermission() {
- permissionsModule.toggleDangerousPermission(appDesc,
- android.Manifest.permission.ACCESS_FINE_LOCATION, true)
-
- // permissionsModule.setAppOpMode(
- // appDesc, AppOpsManager.OPSTR_COARSE_LOCATION,
- // AppOpModes.ALLOWED
- // )
- // permissionsModule.setAppOpMode(
- // appDesc, AppOpsManager.OPSTR_FINE_LOCATION,
- // AppOpModes.ALLOWED
- // )
+ permissionsModule.toggleDangerousPermission(
+ appDesc,
+ android.Manifest.permission.ACCESS_FINE_LOCATION, true
+ )
+
+ // permissionsModule.setAppOpMode(
+ // appDesc, AppOpsManager.OPSTR_COARSE_LOCATION,
+ // AppOpModes.ALLOWED
+ // )
+ // permissionsModule.setAppOpMode(
+ // appDesc, AppOpsManager.OPSTR_FINE_LOCATION,
+ // AppOpModes.ALLOWED
+ // )
}
private fun applySettings(isQuickPrivacyEnabled: Boolean, fakeLocation: Pair<Float, Float>?) {
@@ -74,10 +95,12 @@ class FakeLocationStateUseCase(
permissionsModule.setAppOpMode(appDesc, AppOpsManager.OPSTR_MOCK_LOCATION, AppOpModes.ALLOWED)
}
fakeLocationModule.startFakeLocation()
-
fakeLocationModule.setFakeLocation(fakeLocation.first.toDouble(), fakeLocation.second.toDouble())
+ _locationMode.value = if (fakeLocation in citiesRepository.citiesLocationsList) LocationMode.RANDOM_LOCATION
+ else LocationMode.SPECIFIC_LOCATION
} else {
fakeLocationModule.stopFakeLocation()
+ _locationMode.value = LocationMode.REAL_LOCATION
}
}
@@ -102,4 +125,70 @@ class FakeLocationStateUseCase(
applySettings(true, null)
}
+ private var listener: LocationListener? = null
+
+ val currentLocation = MutableStateFlow<Location?>(null)
+
+ private var localListener = object : LocationListener {
+ val providerName = LocationManager.NETWORK_PROVIDER
+
+ override fun onLocationChanged(location: Location) {
+ Log.e("DebugLoc", "onLocationChanged $location")
+ currentLocation.value = location
+ }
+
+ override fun onProviderEnabled(provider: String?) {
+ Log.e("DebugLoc", "ProvuderEnabled: $provider")
+ reset(provider)
+ }
+
+ override fun onProviderDisabled(provider: String?) {
+ Log.e("DebugLoc", "ProvuderDisabled: $provider")
+ reset(provider)
+ }
+
+ private fun reset(provider: String?) {
+ if (provider == providerName) {
+ stopListeningLocation()
+ currentLocation.value = null
+ startListeningLocation()
+ }
+ }
+ }
+
+ fun startListeningLocation() {
+ requestLocationUpdates(localListener)
+ }
+
+ fun stopListeningLocation() {
+ removeUpdates(localListener)
+ }
+
+ fun requestLocationUpdates(listener: LocationListener) {
+ acquireLocationPermission()
+ try {
+ Log.e("DebugLoc", "requestLocationUpdates")
+ locationManager.requestLocationUpdates(
+ LocationManager.NETWORK_PROVIDER, // TODO: tight this with fakelocation module.
+ 0L,
+ 0f,
+ listener
+ )
+ // locationManager.requestLocationUpdates(
+ // LocationManager.NETWORK_PROVIDER, // TODO: tight this with fakelocation module.
+ // 0L,
+ // 0f,
+ // listener
+ // )
+
+ val location: Location? = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER)
+ location?.let { listener.onLocationChanged(it) }
+ } catch (se: SecurityException) {
+ Log.e("DebugLoc", "Missing permission", se)
+ }
+ }
+
+ fun removeUpdates(listener: LocationListener) {
+ locationManager.removeUpdates(listener)
+ }
}