diff options
| author | jacquarg <guillaume.jacquart@hoodbrains.com> | 2021-11-08 09:40:00 +0100 |
|---|---|---|
| committer | jacquarg <guillaume.jacquart@hoodbrains.com> | 2021-11-12 17:47:23 +0100 |
| commit | 187f4fdece966798dbd017d64b8f865b34dc28ed (patch) | |
| tree | 40786f1ac62dc40798ceca31cb369375d4fe2bcd /app/src/main/java/foundation/e/privacycentralapp/domain | |
| parent | 5891ac8ea718dcb40014f5a90d2672f902eb6c55 (diff) | |
| download | advanced-privacy-187f4fdece966798dbd017d64b8f865b34dc28ed.tar.gz | |
UI fixes on location
Diffstat (limited to 'app/src/main/java/foundation/e/privacycentralapp/domain')
| -rw-r--r-- | app/src/main/java/foundation/e/privacycentralapp/domain/usecases/FakeLocationStateUseCase.kt | 123 |
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) + } } |
