Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 31f4fec8 authored by Guillaume Jacquart's avatar Guillaume Jacquart
Browse files

5898-Fix fake location crash

parent 8884e042
Loading
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -28,7 +28,7 @@ import android.util.Log
import foundation.e.privacycentralapp.data.repositories.LocalStateRepository
import foundation.e.privacycentralapp.domain.entities.LocationMode
import foundation.e.privacycentralapp.dummy.CityDataSource
import foundation.e.privacymodules.fakelocation.FakeLocationModule
import foundation.e.privacymodules.location.IFakeLocationModule
import foundation.e.privacymodules.permissions.PermissionsPrivacyModule
import foundation.e.privacymodules.permissions.data.AppOpModes
import foundation.e.privacymodules.permissions.data.ApplicationDescription
@@ -39,7 +39,7 @@ import kotlinx.coroutines.launch
import kotlin.random.Random

class FakeLocationStateUseCase(
    private val fakeLocationModule: FakeLocationModule,
    private val fakeLocationModule: IFakeLocationModule,
    private val permissionsModule: PermissionsPrivacyModule,
    private val localStateRepository: LocalStateRepository,
    private val citiesRepository: CityDataSource,
+2 −0
Original line number Diff line number Diff line
@@ -51,4 +51,6 @@ dependencies {
        Libs.AndroidX.coreKtx,
        Libs.Coroutines.core
    )
    implementation project(':privacymodule-api')

}
+32 −16
Original line number Diff line number Diff line
@@ -19,12 +19,15 @@ package foundation.e.privacymodules.fakelocation

import android.content.Context
import android.content.Context.LOCATION_SERVICE
import android.location.Criteria
import android.location.Location
import android.location.LocationManager
import android.location.LocationManager.GPS_PROVIDER
import android.location.LocationManager.NETWORK_PROVIDER
import android.location.provider.ProviderProperties
import android.os.Build
import android.os.SystemClock
import android.util.Log
import foundation.e.privacymodules.location.IFakeLocationModule

/**
 * Implementation of the functionality of fake location.
@@ -32,12 +35,10 @@ import android.util.Log
 *
 * @param context an Android context, to retrieve system services for example.
 */
class FakeLocationModule(protected val context: Context) {

    /**
     * List of all the Location provider that will be mocked.
     */
    private val providers = listOf(LocationManager.NETWORK_PROVIDER, LocationManager.GPS_PROVIDER)
class FakeLocationModule(private val context: Context): IFakeLocationModule {
    companion object {
        private const val TAG = "FakeLocationModule"
    }

    /**
     * Handy accessor to the locationManager service.
@@ -46,18 +47,25 @@ class FakeLocationModule(protected val context: Context) {
    private val locationManager: LocationManager get() =
        context.getSystemService(LOCATION_SERVICE) as LocationManager

    /**
     * List of all the Location provider that will be mocked.
     */
    private val providers = locationManager.allProviders
        .intersect(listOf(GPS_PROVIDER, NETWORK_PROVIDER))

    /**
     * @see IFakeLocationModule.startFakeLocation
     */
    @Synchronized
    fun startFakeLocation() {
    override fun startFakeLocation() {
        providers.forEach { provider ->
            try {
                locationManager.removeTestProvider(provider)
            } catch(e: Exception) {
                Log.d("FakeLocationModule", "Test provider $provider already removed.")
                Log.w(TAG, "Test provider $provider already removed.")
            }


            locationManager.addTestProvider(
                provider,
                false,
@@ -67,12 +75,17 @@ class FakeLocationModule(protected val context: Context) {
                false,
                true,
                true,
                Criteria.POWER_LOW, Criteria.ACCURACY_FINE)
                ProviderProperties.POWER_USAGE_LOW,
                ProviderProperties.ACCURACY_FINE)
            try {
                locationManager.setTestProviderEnabled(provider, true)
            } catch (e: Exception) {
            Log.e(TAG, "Can't enable test $provider", e)
        }
        }
    }

    fun setFakeLocation(latitude: Double, longitude: Double) {
    override fun setFakeLocation(latitude: Double, longitude: Double) {
        context.startService(FakeLocationService.buildFakeLocationIntent(context, latitude, longitude))
    }

@@ -95,22 +108,25 @@ class FakeLocationModule(protected val context: Context) {
                location.verticalAccuracyMeters = 0.1f
                location.speedAccuracyMetersPerSecond = 0.01f
            }

            try {
                locationManager.setTestProviderLocation(provider, location)
            } catch (e: Exception) {
                Log.e(TAG, "Can't set location for test provider $provider", e)
            }
        }
    }

    /**
     * @see IFakeLocationModule.stopFakeLocation
     */
    fun stopFakeLocation() {
    override fun stopFakeLocation() {
        context.stopService(FakeLocationService.buildStopIntent(context))
        providers.forEach { provider ->
            try {
                locationManager.setTestProviderEnabled(provider, false)
                locationManager.removeTestProvider(provider)
            } catch (e: Exception) {
                Log.d("FakeLocationModule", "Test provider $provider already removed.")
                Log.d(TAG, "Test provider $provider already removed.")
            }
        }
    }