summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/features/location/FakeLocationFeature.kt27
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/features/location/FakeLocationFragment.kt68
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/features/location/LocationApiDelegate.kt62
3 files changed, 97 insertions, 60 deletions
diff --git a/app/src/main/java/foundation/e/privacycentralapp/features/location/FakeLocationFeature.kt b/app/src/main/java/foundation/e/privacycentralapp/features/location/FakeLocationFeature.kt
index d94f71c..59f56c8 100644
--- a/app/src/main/java/foundation/e/privacycentralapp/features/location/FakeLocationFeature.kt
+++ b/app/src/main/java/foundation/e/privacycentralapp/features/location/FakeLocationFeature.kt
@@ -54,10 +54,13 @@ class FakeLocationFeature(
data class ErrorEvent(val error: String) : SingleEvent()
}
- sealed class Action {
+ sealed class Action() {
data class UpdateLocationAction(val latLng: LatLng) : Action()
- object UseRealLocationAction : Action()
- data class UseRandomLocationAction(val cities: Array<String>) : Action() {
+ data class UseRealLocationAction(val locationApiDelegate: LocationApiDelegate) : Action()
+ data class UseRandomLocationAction(
+ val locationApiDelegate: LocationApiDelegate,
+ val cities: Array<String>
+ ) : Action() {
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (javaClass != other?.javaClass) return false
@@ -74,8 +77,12 @@ class FakeLocationFeature(
}
}
- object UseSpecificLocationAction : Action()
- data class SetFakeLocationAction(val latitude: Double, val longitude: Double) : Action()
+ data class UseSpecificLocationAction(val locationApiDelegate: LocationApiDelegate) : Action()
+ data class SetFakeLocationAction(
+ val locationApiDelegate: LocationApiDelegate,
+ val latitude: Double,
+ val longitude: Double
+ ) : Action()
}
sealed class Effect {
@@ -139,7 +146,7 @@ class FakeLocationFeature(
action.latitude,
action.longitude
)
- // TODO: Call fake location api with specific coordinates here.
+ action.locationApiDelegate.setFakeLocation(action.latitude, action.longitude)
val success = DummyDataSource.setLocationMode(
LocationMode.CUSTOM_LOCATION,
location
@@ -156,7 +163,7 @@ class FakeLocationFeature(
}
is Action.UseRandomLocationAction -> {
val randomCity = CityDataSource.getRandomCity(action.cities)
- // TODO: Call fake location api with random location here.
+ action.locationApiDelegate.setFakeLocation(randomCity.latitude, randomCity.longitude)
val success = DummyDataSource.setLocationMode(
LocationMode.RANDOM_LOCATION,
randomCity.toRandomLocation()
@@ -171,8 +178,8 @@ class FakeLocationFeature(
)
}
}
- Action.UseRealLocationAction -> {
- // TODO: Call turn off fake location api here.
+ is Action.UseRealLocationAction -> {
+ action.locationApiDelegate.stopFakeLocation()
val success = DummyDataSource.setLocationMode(LocationMode.REAL_LOCATION)
if (success) {
flowOf(
@@ -184,7 +191,7 @@ class FakeLocationFeature(
)
}
}
- Action.UseSpecificLocationAction -> {
+ is Action.UseSpecificLocationAction -> {
flowOf(Effect.SpecificLocationSelectedEffect)
}
}
diff --git a/app/src/main/java/foundation/e/privacycentralapp/features/location/FakeLocationFragment.kt b/app/src/main/java/foundation/e/privacycentralapp/features/location/FakeLocationFragment.kt
index 502dd3d..ff15e31 100644
--- a/app/src/main/java/foundation/e/privacycentralapp/features/location/FakeLocationFragment.kt
+++ b/app/src/main/java/foundation/e/privacycentralapp/features/location/FakeLocationFragment.kt
@@ -18,7 +18,6 @@
package foundation.e.privacycentralapp.features.location
import android.annotation.SuppressLint
-import android.app.AppOpsManager
import android.content.Context
import android.os.Bundle
import android.os.Looper
@@ -59,14 +58,13 @@ import com.mapbox.mapboxsdk.maps.Style
import foundation.e.flowmvi.MVIView
import foundation.e.privacycentralapp.R
import foundation.e.privacycentralapp.dummy.LocationMode
-import kotlinx.coroutines.Job
-import kotlinx.coroutines.delay
-import kotlinx.coroutines.ensureActive
import foundation.e.privacymodules.location.FakeLocation
import foundation.e.privacymodules.location.IFakeLocation
import foundation.e.privacymodules.permissions.PermissionsPrivacyModule
-import foundation.e.privacymodules.permissions.data.AppOpModes
import foundation.e.privacymodules.permissions.data.ApplicationDescription
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.ensureActive
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.launch
@@ -152,6 +150,10 @@ class FakeLocationFragment :
)
}
+ private val locationApiDelegate by lazy {
+ LocationApiDelegate(fakeLocationModule, permissionsModule, appDesc)
+ }
+
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
lifecycleScope.launchWhenStarted {
@@ -164,7 +166,6 @@ class FakeLocationFragment :
displayToast("Random location selected")
hoveringMarker?.visibility = View.GONE
isCameraMoved = false
- setLondonLocation()
}
is FakeLocationFeature.SingleEvent.SpecificLocationSavedEvent -> {
// Hide camera hover marker when custom location is picked from map.
@@ -180,7 +181,6 @@ class FakeLocationFragment :
displayToast("Real location selected")
hoveringMarker?.visibility = View.GONE
isCameraMoved = false
- setRealLocation()
}
}
}
@@ -197,39 +197,6 @@ class FakeLocationFragment :
.show()
}
- private fun setFakeLocation(latitude: Double, longitude: Double) {
- if (permissionsModule.getAppOpMode(appDesc, AppOpsManager.OPSTR_MOCK_LOCATION) != AppOpModes.ALLOWED) {
- permissionsModule.setAppOpMode(
- appDesc, AppOpsManager.OPSTR_MOCK_LOCATION,
- AppOpModes.ALLOWED
- )
- }
- try {
- fakeLocationModule.startFakeLocation()
- } catch (e: Exception) {
- Log.e("FakeLoc", "Can't startFakeLocation", e)
- }
- fakeLocationModule.setFakeLocation(latitude, longitude)
- }
-
- private fun setRealLocation() {
- try {
- permissionsModule.setAppOpMode(
- appDesc, AppOpsManager.OPSTR_MOCK_LOCATION,
- AppOpModes.IGNORED
- )
- fakeLocationModule.stopFakeLocation()
- displayToast("Real location selected")
- } catch (e: Exception) {
- Log.e("FakeLoc", "Can't stop FakeLocation", e)
- }
- }
-
- private fun setLondonLocation() {
- displayToast("Random location selected")
- setFakeLocation(51.5287718, -0.2416803)
- }
-
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val toolbar = view.findViewById<Toolbar>(R.id.toolbar)
@@ -313,32 +280,33 @@ class FakeLocationFragment :
}
}
- private fun saveSpecificLocation(latitude: Double, longitude: Double) {
- setFakeLocation(latitude, longitude)
- viewModel.submitAction(
- FakeLocationFeature.Action.SetFakeLocationAction(latitude, longitude)
- )
- }
-
private fun toggleLocationType(radioButton: View?) {
if (radioButton is RadioButton) {
val checked = radioButton.isChecked
when (radioButton.id) {
R.id.radio_use_real_location ->
if (checked) {
- viewModel.submitAction(FakeLocationFeature.Action.UseRealLocationAction)
+ viewModel.submitAction(
+ FakeLocationFeature.Action.UseRealLocationAction(
+ locationApiDelegate
+ )
+ )
}
R.id.radio_use_random_location ->
if (checked) {
viewModel.submitAction(
FakeLocationFeature.Action.UseRandomLocationAction(
- resources.getStringArray(R.array.cities)
+ locationApiDelegate, resources.getStringArray(R.array.cities)
)
)
}
R.id.radio_use_specific_location ->
if (checked) {
- viewModel.submitAction(FakeLocationFeature.Action.UseSpecificLocationAction)
+ viewModel.submitAction(
+ FakeLocationFeature.Action.UseSpecificLocationAction(
+ locationApiDelegate
+ )
+ )
}
}
}
diff --git a/app/src/main/java/foundation/e/privacycentralapp/features/location/LocationApiDelegate.kt b/app/src/main/java/foundation/e/privacycentralapp/features/location/LocationApiDelegate.kt
new file mode 100644
index 0000000..efacae2
--- /dev/null
+++ b/app/src/main/java/foundation/e/privacycentralapp/features/location/LocationApiDelegate.kt
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2021 E FOUNDATION
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+package foundation.e.privacycentralapp.features.location
+
+import android.app.AppOpsManager
+import android.util.Log
+import foundation.e.privacymodules.location.IFakeLocation
+import foundation.e.privacymodules.permissions.PermissionsPrivacyModule
+import foundation.e.privacymodules.permissions.data.AppOpModes
+import foundation.e.privacymodules.permissions.data.ApplicationDescription
+import java.lang.Exception
+
+class LocationApiDelegate(
+ private val fakeLocationModule: IFakeLocation,
+ private val permissionsModule: PermissionsPrivacyModule,
+ private val appDesc: ApplicationDescription
+) {
+
+ private val TAG = LocationApiDelegate::class.simpleName
+
+ fun setFakeLocation(latitude: Double, longitude: Double) {
+ if (permissionsModule.getAppOpMode(appDesc, AppOpsManager.OPSTR_MOCK_LOCATION) != AppOpModes.ALLOWED) {
+ permissionsModule.setAppOpMode(
+ appDesc, AppOpsManager.OPSTR_MOCK_LOCATION,
+ AppOpModes.ALLOWED
+ )
+ }
+ try {
+ fakeLocationModule.startFakeLocation()
+ } catch (e: Exception) {
+ Log.e(TAG, "Can't startFakeLocation", e)
+ }
+ fakeLocationModule.setFakeLocation(latitude, longitude)
+ }
+
+ fun stopFakeLocation() {
+ try {
+ permissionsModule.setAppOpMode(
+ appDesc, AppOpsManager.OPSTR_MOCK_LOCATION,
+ AppOpModes.IGNORED
+ )
+ fakeLocationModule.stopFakeLocation()
+ } catch (e: Exception) {
+ Log.e(TAG, "Can't stop FakeLocation", e)
+ }
+ }
+}