diff options
author | Leonard Kugis <leonard@kug.is> | 2023-12-23 00:52:30 +0100 |
---|---|---|
committer | Leonard Kugis <leonard@kug.is> | 2023-12-23 00:52:30 +0100 |
commit | eab77a885f6cca1d785ca57c4cd9182dc1a898cf (patch) | |
tree | 7dba714b870895220d815368d7762212ff10c5eb /app/src/main/java/foundation/e/advancedprivacy/features | |
parent | 98df413858d1ac577f9c510a9490f382b3f848b4 (diff) | |
download | advanced-privacy-eab77a885f6cca1d785ca57c4cd9182dc1a898cf.tar.gz |
Implemented altitude/speed/jitter parameters
Diffstat (limited to 'app/src/main/java/foundation/e/advancedprivacy/features')
3 files changed, 74 insertions, 5 deletions
diff --git a/app/src/main/java/foundation/e/advancedprivacy/features/location/FakeLocationFragment.kt b/app/src/main/java/foundation/e/advancedprivacy/features/location/FakeLocationFragment.kt index 1c629c2..2b054ab 100644 --- a/app/src/main/java/foundation/e/advancedprivacy/features/location/FakeLocationFragment.kt +++ b/app/src/main/java/foundation/e/advancedprivacy/features/location/FakeLocationFragment.kt @@ -244,6 +244,31 @@ class FakeLocationFragment : NavToolbarFragment(R.layout.fragment_fake_location) } } + private fun updateMockLocationParameters() { + viewModel.submitAction( + Action.UpdateMockLocationParameters( + binding.altitude.text.toString().toFloat(), + binding.speed.text.toString().toFloat(), + binding.jitter.text.toString().toFloat(), + ) + ) + } + + @Suppress("UNUSED_PARAMETER") + private fun onAltitudeTextChanged(editable: Editable?) { + updateMockLocationParameters() + } + + @Suppress("UNUSED_PARAMETER") + private fun onSpeedTextChanged(editable: Editable?) { + updateMockLocationParameters() + } + + @Suppress("UNUSED_PARAMETER") + private fun onJitterTextChanged(editable: Editable?) { + updateMockLocationParameters() + } + @Suppress("UNUSED_PARAMETER") private fun onLatTextChanged(editable: Editable?) { if (!binding.edittextLatitude.isFocused || @@ -291,6 +316,9 @@ class FakeLocationFragment : NavToolbarFragment(R.layout.fragment_fake_location) } } + binding.altitude.addTextChangedListener(afterTextChanged = ::onAltitudeTextChanged) + binding.speed.addTextChangedListener(afterTextChanged = ::onSpeedTextChanged) + binding.jitter.addTextChangedListener(afterTextChanged = ::onJitterTextChanged) binding.edittextLatitude.addTextChangedListener(afterTextChanged = ::onLatTextChanged) binding.edittextLongitude.addTextChangedListener(afterTextChanged = ::onLonTextChanged) binding.edittextLatitude.onFocusChangeListener = latLonOnFocusChangeListener @@ -307,6 +335,19 @@ class FakeLocationFragment : NavToolbarFragment(R.layout.fragment_fake_location) binding.mapView.isEnabled = (state.mode == LocationMode.SPECIFIC_LOCATION) + binding.altitude.isEnabled = state.mode == LocationMode.SPECIFIC_LOCATION + binding.speed.isEnabled = state.mode == LocationMode.SPECIFIC_LOCATION + binding.jitter.isEnabled = state.mode == LocationMode.SPECIFIC_LOCATION + + if(!binding.altitude.isFocused) + binding.altitude.setText(state.altitude?.toString()) + + if(!binding.speed.isFocused) + binding.speed.setText(state.speed?.toString()) + + if(!binding.jitter.isFocused) + binding.jitter.setText(state.jitter?.toString()) + if (state.mode == LocationMode.REAL_LOCATION) { binding.centeredMarker.isVisible = false } else { diff --git a/app/src/main/java/foundation/e/advancedprivacy/features/location/FakeLocationState.kt b/app/src/main/java/foundation/e/advancedprivacy/features/location/FakeLocationState.kt index baa672b..12ebecf 100644 --- a/app/src/main/java/foundation/e/advancedprivacy/features/location/FakeLocationState.kt +++ b/app/src/main/java/foundation/e/advancedprivacy/features/location/FakeLocationState.kt @@ -23,6 +23,10 @@ import foundation.e.advancedprivacy.domain.entities.LocationMode data class FakeLocationState( val mode: LocationMode = LocationMode.REAL_LOCATION, val currentLocation: Location? = null, + val altitude: Float? = null, + val speed: Float? = null, + val jitter: Float? = null, + val joystick: Boolean = false, val specificLatitude: Float? = null, val specificLongitude: Float? = null, val forceRefresh: Boolean = false, diff --git a/app/src/main/java/foundation/e/advancedprivacy/features/location/FakeLocationViewModel.kt b/app/src/main/java/foundation/e/advancedprivacy/features/location/FakeLocationViewModel.kt index deca4c1..29bfbfa 100644 --- a/app/src/main/java/foundation/e/advancedprivacy/features/location/FakeLocationViewModel.kt +++ b/app/src/main/java/foundation/e/advancedprivacy/features/location/FakeLocationViewModel.kt @@ -52,24 +52,32 @@ class FakeLocationViewModel( val singleEvents = _singleEvents.asSharedFlow() private val specificLocationInputFlow = MutableSharedFlow<Action.SetSpecificLocationAction>() + private val mockLocationParametersInputFlow = MutableSharedFlow<Action.UpdateMockLocationParameters>() @OptIn(FlowPreview::class) suspend fun doOnStartedState() = withContext(Dispatchers.Main) { launch { merge( - fakeLocationStateUseCase.configuredLocationMode.map { (mode, lat, lon) -> + fakeLocationStateUseCase.configuredLocationMode.map { ss -> _state.update { s -> s.copy( - mode = mode, - specificLatitude = lat, - specificLongitude = lon + mode = ss.mode, + altitude = ss.altitude, + speed = ss.speed, + jitter = ss.jitter, + specificLatitude = ss.specificLatitude, + specificLongitude = ss.specificLongitude ) } }, specificLocationInputFlow .debounce(SET_SPECIFIC_LOCATION_DELAY).map { action -> fakeLocationStateUseCase.setSpecificLocation(action.latitude, action.longitude) - } + }, + mockLocationParametersInputFlow + .debounce(SET_SPECIFIC_LOCATION_DELAY).map { action -> + fakeLocationStateUseCase.setFakeLocationParameters(action.altitude, action.speed, action.jitter) + }, ).collect {} } } @@ -82,6 +90,8 @@ class FakeLocationViewModel( is Action.UseRandomLocationAction -> fakeLocationStateUseCase.setRandomLocation() is Action.UseRealLocationAction -> fakeLocationStateUseCase.stopFakeLocation() + is Action.UpdateMockLocationParameters -> updateMockLocationParameters(action) + is Action.UseJoystick -> enableJoystick() } } @@ -96,6 +106,14 @@ class FakeLocationViewModel( specificLocationInputFlow.emit(action) } + private suspend fun updateMockLocationParameters(action: Action.UpdateMockLocationParameters) { + mockLocationParametersInputFlow.emit(action) + } + + private suspend fun enableJoystick() { + + } + sealed class SingleEvent { object RequestLocationPermission : SingleEvent() data class ErrorEvent(val error: String) : SingleEvent() @@ -106,6 +124,12 @@ class FakeLocationViewModel( object StopListeningLocation : Action() object UseRealLocationAction : Action() object UseRandomLocationAction : Action() + object UseJoystick : Action() + data class UpdateMockLocationParameters( + val altitude: Float, + val speed: Float, + val jitter: Float + ) : Action() data class SetSpecificLocationAction( val latitude: Float, val longitude: Float |