summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/build.gradle2
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/common/ToggleAppsAdapter.kt12
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/domain/usecases/IpScramblingStateUseCase.kt14
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/features/internetprivacy/InternetPrivacyFeature.kt33
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/features/internetprivacy/InternetPrivacyFragment.kt5
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/features/location/FakeLocationFragment.kt18
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/features/trackers/TrackersFeature.kt2
-rw-r--r--dependencies.gradle2
8 files changed, 55 insertions, 33 deletions
diff --git a/app/build.gradle b/app/build.gradle
index a453160..06a4a1d 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -101,7 +101,7 @@ dependencies {
implementation 'foundation.e:privacymodule.trackerfilter:0.1.3'
implementation 'foundation.e:privacymodule.api:0.4.3'
implementation 'foundation.e:privacymodule.e-29:0.4.1'
- implementation 'foundation.e:privacymodule.tor:0.1.1'
+ implementation 'foundation.e:privacymodule.tor:0.2.1'
implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
diff --git a/app/src/main/java/foundation/e/privacycentralapp/common/ToggleAppsAdapter.kt b/app/src/main/java/foundation/e/privacycentralapp/common/ToggleAppsAdapter.kt
index 82f8d43..9d62381 100644
--- a/app/src/main/java/foundation/e/privacycentralapp/common/ToggleAppsAdapter.kt
+++ b/app/src/main/java/foundation/e/privacycentralapp/common/ToggleAppsAdapter.kt
@@ -38,9 +38,10 @@ class ToggleAppsAdapter(
val togglePermission: CheckBox = view.findViewById(R.id.toggle)
- fun bind(item: Pair<ApplicationDescription, Boolean>) {
+ fun bind(item: Pair<ApplicationDescription, Boolean>, isEnabled: Boolean) {
appName.text = item.first.label
togglePermission.isChecked = item.second
+ togglePermission.isEnabled = isEnabled
itemView.findViewById<ImageView>(R.id.icon).setImageDrawable(item.first.icon)
}
@@ -52,6 +53,13 @@ class ToggleAppsAdapter(
notifyDataSetChanged()
}
+ var isEnabled: Boolean = true
+
+ fun setData(list: List<Pair<ApplicationDescription, Boolean>>, isEnabled: Boolean = true) {
+ this.isEnabled = isEnabled
+ dataSet = list
+ }
+
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(parent.context)
.inflate(itemsLayout, parent, false)
@@ -64,7 +72,7 @@ class ToggleAppsAdapter(
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val permission = dataSet[position]
- holder.bind(permission)
+ holder.bind(permission, isEnabled)
}
override fun getItemCount(): Int = dataSet.size
diff --git a/app/src/main/java/foundation/e/privacycentralapp/domain/usecases/IpScramblingStateUseCase.kt b/app/src/main/java/foundation/e/privacycentralapp/domain/usecases/IpScramblingStateUseCase.kt
index 3caab63..9e83eb1 100644
--- a/app/src/main/java/foundation/e/privacycentralapp/domain/usecases/IpScramblingStateUseCase.kt
+++ b/app/src/main/java/foundation/e/privacycentralapp/domain/usecases/IpScramblingStateUseCase.kt
@@ -80,6 +80,18 @@ class IpScramblingStateUseCase(
applySettings(true, hideIp)
}
+ val bypassTorApps: Set<String> get() = ipScramblerModule.appList
+
+ fun toggleBypassTor(packageName: String) {
+ val currentList = bypassTorApps.toMutableSet()
+ if (currentList.contains(packageName)) {
+ currentList.remove(packageName)
+ } else {
+ currentList.add(packageName)
+ }
+ ipScramblerModule.appList = currentList
+ }
+
private fun applySettings(isQuickPrivacyEnabled: Boolean, isIpScramblingEnabled: Boolean) {
when {
isQuickPrivacyEnabled && isIpScramblingEnabled -> when (internetPrivacyMode.value) {
@@ -88,7 +100,7 @@ class IpScramblingStateUseCase(
if (intent != null) {
permissionsPrivacyModule.setVpnPackageAuthorization(appDesc.packageName)
}
- ipScramblerModule.start()
+ ipScramblerModule.start(enableNotification = false)
}
else -> {
Log.d("testQPFlow", "Not starting tor, already in started state")
diff --git a/app/src/main/java/foundation/e/privacycentralapp/features/internetprivacy/InternetPrivacyFeature.kt b/app/src/main/java/foundation/e/privacycentralapp/features/internetprivacy/InternetPrivacyFeature.kt
index 767ac7a..6ff3d27 100644
--- a/app/src/main/java/foundation/e/privacycentralapp/features/internetprivacy/InternetPrivacyFeature.kt
+++ b/app/src/main/java/foundation/e/privacycentralapp/features/internetprivacy/InternetPrivacyFeature.kt
@@ -57,13 +57,13 @@ class InternetPrivacyFeature(
data class State(
val mode: InternetPrivacyMode,
val availableApps: List<ApplicationDescription>,
- val ipScrambledApps: Collection<String>,
+ val bypassTorApps: Collection<String>,
val selectedLocation: String,
val availableLocationIds: List<String>,
val forceRedraw: Boolean = false
) {
fun getApps(): List<Pair<ApplicationDescription, Boolean>> {
- return availableApps.map { it to (it.packageName in ipScrambledApps) }
+ return availableApps.map { it to (it.packageName !in bypassTorApps) }
}
val selectedLocationPosition get() = availableLocationIds.indexOf(selectedLocation)
@@ -89,10 +89,10 @@ class InternetPrivacyFeature(
data class QuickPrivacyUpdatedEffect(val enabled: Boolean) : Effect()
object QuickPrivacyDisabledWarningEffect : Effect()
data class ShowAndroidVpnDisclaimerEffect(val intent: Intent) : Effect()
- data class IpScrambledAppsUpdatedEffect(val ipScrambledApps: Collection<String>) : Effect()
+ data class IpScrambledAppsUpdatedEffect(val bypassTorApps: Collection<String>) : Effect()
data class AvailableAppsListEffect(
val apps: List<ApplicationDescription>,
- val ipScrambledApps: Collection<String>
+ val bypassTorApps: Collection<String>
) : Effect()
data class LocationSelectedEffect(val locationId: String) : Effect()
data class ErrorEffect(val message: String) : Effect()
@@ -107,9 +107,9 @@ class InternetPrivacyFeature(
appListUseCase: AppListUseCase,
availablesLocationsIds: List<String>,
initialState: State = State(
- mode = InternetPrivacyMode.REAL_IP,
+ mode = ipScramblingStateUseCase.internetPrivacyMode.value,
availableApps = emptyList(),
- ipScrambledApps = emptyList(),
+ bypassTorApps = emptyList(),
availableLocationIds = availablesLocationsIds,
selectedLocation = ""
)
@@ -118,10 +118,10 @@ class InternetPrivacyFeature(
reducer = { state, effect ->
when (effect) {
is Effect.ModeUpdatedEffect -> state.copy(mode = effect.mode)
- is Effect.IpScrambledAppsUpdatedEffect -> state.copy(ipScrambledApps = effect.ipScrambledApps)
+ is Effect.IpScrambledAppsUpdatedEffect -> state.copy(bypassTorApps = effect.bypassTorApps)
is Effect.AvailableAppsListEffect -> state.copy(
availableApps = effect.apps,
- ipScrambledApps = effect.ipScrambledApps
+ bypassTorApps = effect.bypassTorApps
)
is Effect.LocationSelectedEffect -> state.copy(selectedLocation = effect.locationId)
Effect.QuickPrivacyDisabledWarningEffect -> state.copy(forceRedraw = !state.forceRedraw)
@@ -134,13 +134,9 @@ class InternetPrivacyFeature(
getQuickPrivacyStateUseCase.quickPrivacyEnabledFlow.map { Effect.QuickPrivacyUpdatedEffect(it) },
ipScramblingStateUseCase.internetPrivacyMode.map { Effect.ModeUpdatedEffect(it) }.shareIn(scope = coroutineScope, started = SharingStarted.Lazily, replay = 0),
appListUseCase.getAppsUsingInternet().map { apps ->
- if (ipScramblerModule.appList.isEmpty()) {
- ipScramblerModule.appList =
- apps.map { it.packageName }.toMutableSet()
- }
Effect.AvailableAppsListEffect(
apps,
- ipScramblerModule.appList
+ ipScramblingStateUseCase.bypassTorApps
)
},
flowOf(Effect.LocationSelectedEffect(ipScramblerModule.exitCountry))
@@ -187,15 +183,8 @@ class InternetPrivacyFeature(
}
action is Action.ToggleAppIpScrambled -> {
- val ipScrambledApps = mutableSetOf<String>()
- ipScrambledApps.addAll(ipScramblerModule.appList)
- if (ipScrambledApps.contains(action.packageName)) {
- ipScrambledApps.remove(action.packageName)
- } else {
- ipScrambledApps.add(action.packageName)
- }
- ipScramblerModule.appList = ipScrambledApps
- flowOf(Effect.IpScrambledAppsUpdatedEffect(ipScrambledApps = ipScrambledApps))
+ ipScramblingStateUseCase.toggleBypassTor(action.packageName)
+ flowOf(Effect.IpScrambledAppsUpdatedEffect(bypassTorApps = ipScramblingStateUseCase.bypassTorApps))
}
action is Action.SelectLocationAction -> {
val locationId = state.availableLocationIds[action.position]
diff --git a/app/src/main/java/foundation/e/privacycentralapp/features/internetprivacy/InternetPrivacyFragment.kt b/app/src/main/java/foundation/e/privacycentralapp/features/internetprivacy/InternetPrivacyFragment.kt
index 3e0b549..f288320 100644
--- a/app/src/main/java/foundation/e/privacycentralapp/features/internetprivacy/InternetPrivacyFragment.kt
+++ b/app/src/main/java/foundation/e/privacycentralapp/features/internetprivacy/InternetPrivacyFragment.kt
@@ -155,7 +155,10 @@ class InternetPrivacyFragment :
// TODO: this should not be mandatory.
binding.apps.post {
- (binding.apps.adapter as ToggleAppsAdapter?)?.dataSet = state.getApps()
+ (binding.apps.adapter as ToggleAppsAdapter?)?.setData(
+ list = state.getApps(),
+ isEnabled = state.mode == InternetPrivacyMode.HIDE_IP
+ )
}
val viewIdsToHide = listOf(
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 60b9bd9..76c586c 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
@@ -222,10 +222,20 @@ class FakeLocationFragment :
@SuppressLint("MissingPermission")
override fun render(state: FakeLocationFeature.State) {
- binding.radioUseRandomLocation.isChecked = (state.mode == LocationMode.RANDOM_LOCATION)
- binding.radioUseSpecificLocation.isChecked =
- (state.mode == LocationMode.SPECIFIC_LOCATION)
- binding.radioUseRealLocation.isChecked = (state.mode == LocationMode.REAL_LOCATION)
+ binding.radioUseRandomLocation.apply {
+ isChecked = state.mode == LocationMode.RANDOM_LOCATION
+ isEnabled = state.isEnabled
+ }
+
+ binding.radioUseSpecificLocation.apply {
+ isChecked = state.mode == LocationMode.SPECIFIC_LOCATION
+ isEnabled = state.isEnabled
+ }
+
+ binding.radioUseRealLocation.apply {
+ isChecked = state.mode == LocationMode.REAL_LOCATION
+ isEnabled = state.isEnabled
+ }
binding.mapView.isEnabled = (state.mode == LocationMode.SPECIFIC_LOCATION)
diff --git a/app/src/main/java/foundation/e/privacycentralapp/features/trackers/TrackersFeature.kt b/app/src/main/java/foundation/e/privacycentralapp/features/trackers/TrackersFeature.kt
index 4728158..64cc71e 100644
--- a/app/src/main/java/foundation/e/privacycentralapp/features/trackers/TrackersFeature.kt
+++ b/app/src/main/java/foundation/e/privacycentralapp/features/trackers/TrackersFeature.kt
@@ -115,7 +115,7 @@ class TrackersFeature(
},
actor = { state, action ->
when (action) {
- Action.InitAction -> merge(
+ Action.InitAction -> merge<TrackersFeature.Effect>(
flow {
val statistics = trackersStatisticsUseCase.getDayMonthYearStatistics()
val counts = trackersStatisticsUseCase.getDayMonthYearCounts()
diff --git a/dependencies.gradle b/dependencies.gradle
index 00c77de..0095881 100644
--- a/dependencies.gradle
+++ b/dependencies.gradle
@@ -19,7 +19,7 @@ libs.leakCanary = "com.squareup.leakcanary:leakcanary-android:2.6"
libs.truth = "com.google.truth:truth:1.1"
-versions.kotlin = "1.5.0"
+versions.kotlin = "1.6.0"
libs.Kotlin = [
stdlib: "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$versions.kotlin",
gradlePlugin: "org.jetbrains.kotlin:kotlin-gradle-plugin:$versions.kotlin",