diff options
Diffstat (limited to 'app/src/main/java/foundation/e/privacycentralapp')
6 files changed, 53 insertions, 31 deletions
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() |