From 14815678aaa5020e81f0cca9274f289e6ac7e2d5 Mon Sep 17 00:00:00 2001 From: jacquarg Date: Tue, 12 Apr 2022 18:55:02 +0200 Subject: 5248 hide whitelist app trackers and fix counts when privacy protection disabled. --- .../data/repositories/AppListsRepository.kt | 5 ++-- .../domain/usecases/TrackersStatisticsUseCase.kt | 33 +++++++++++----------- .../features/dashboard/DashboardFeature.kt | 29 +++++++++---------- .../trackers/apptrackers/AppTrackersFeature.kt | 6 ++-- .../trackers/apptrackers/AppTrackersFragment.kt | 7 ++++- app/src/main/res/layout/apptrackers_fragment.xml | 27 ++++++++++++++++-- 6 files changed, 66 insertions(+), 41 deletions(-) diff --git a/app/src/main/java/foundation/e/privacycentralapp/data/repositories/AppListsRepository.kt b/app/src/main/java/foundation/e/privacycentralapp/data/repositories/AppListsRepository.kt index 72dffe9..4b19083 100644 --- a/app/src/main/java/foundation/e/privacycentralapp/data/repositories/AppListsRepository.kt +++ b/app/src/main/java/foundation/e/privacycentralapp/data/repositories/AppListsRepository.kt @@ -59,9 +59,8 @@ class AppListsRepository( return appDescriptions.value.second } - fun getVisibleAndHiddenApps(): List { - return appDescriptions.value.first + appDescriptions.value.second - } + fun getVisibleAndHiddenApps(): Flow> = getVisibleApps() + .map { it + getHiddenSystemApps() } fun getApplicationDescription(packageName: String): ApplicationDescription? { return appDescriptions.value.first.find { it.packageName == packageName } diff --git a/app/src/main/java/foundation/e/privacycentralapp/domain/usecases/TrackersStatisticsUseCase.kt b/app/src/main/java/foundation/e/privacycentralapp/domain/usecases/TrackersStatisticsUseCase.kt index 55887ed..6b4e098 100644 --- a/app/src/main/java/foundation/e/privacycentralapp/domain/usecases/TrackersStatisticsUseCase.kt +++ b/app/src/main/java/foundation/e/privacycentralapp/domain/usecases/TrackersStatisticsUseCase.kt @@ -28,6 +28,7 @@ import foundation.e.privacymodules.trackers.Tracker import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.callbackFlow +import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.map import java.time.ZonedDateTime import java.time.format.DateTimeFormatter @@ -142,7 +143,8 @@ class TrackersStatisticsUseCase( apps.map { app -> AppWithCounts( app, - blockTrackersPrivacyModule.isWhitelisted(app.uid), + !blockTrackersPrivacyModule.isBlockingEnabled() || + blockTrackersPrivacyModule.isWhitelisted(app.uid), appListsRepository.foldForHiddenSystemApp(app.uid) { trackersCounts.getOrDefault(it, 0) }, @@ -154,23 +156,20 @@ class TrackersStatisticsUseCase( } } - fun getNonBLockedTrackersCount(): Int { - return if (blockTrackersPrivacyModule.isBlockingEnabled()) { - val whiteListedTrackers = mutableSetOf() - - val whiteListedAppUids = blockTrackersPrivacyModule.getWhiteListedApp() - - appListsRepository.getVisibleAndHiddenApps().forEach { app -> - if (app.uid in whiteListedAppUids) { - whiteListedTrackers.addAll(getTrackers(app.uid)) - } else { - whiteListedTrackers.addAll(blockTrackersPrivacyModule.getWhiteList(app.uid)) + fun getNonBlockedTrackersCount(): Flow { + return if (blockTrackersPrivacyModule.isBlockingEnabled()) + appListsRepository.getVisibleAndHiddenApps().map { apps -> + val whiteListedTrackers = mutableSetOf() + val whiteListedAppUids = blockTrackersPrivacyModule.getWhiteListedApp() + apps.forEach { app -> + if (app.uid in whiteListedAppUids) { + whiteListedTrackers.addAll(getTrackers(app.uid)) + } else { + whiteListedTrackers.addAll(blockTrackersPrivacyModule.getWhiteList(app.uid)) + } } + whiteListedTrackers.size } - - whiteListedTrackers.size - } else { - trackTrackersPrivacyModule.getTrackersCount() - } + else flowOf(trackTrackersPrivacyModule.getTrackersCount()) } } diff --git a/app/src/main/java/foundation/e/privacycentralapp/features/dashboard/DashboardFeature.kt b/app/src/main/java/foundation/e/privacycentralapp/features/dashboard/DashboardFeature.kt index e8302f4..ca45393 100644 --- a/app/src/main/java/foundation/e/privacycentralapp/features/dashboard/DashboardFeature.kt +++ b/app/src/main/java/foundation/e/privacycentralapp/features/dashboard/DashboardFeature.kt @@ -30,7 +30,6 @@ import foundation.e.privacycentralapp.domain.usecases.IpScramblingStateUseCase import foundation.e.privacycentralapp.domain.usecases.TrackersStateUseCase import foundation.e.privacycentralapp.domain.usecases.TrackersStatisticsUseCase import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.merge @@ -161,20 +160,20 @@ class DashboardFeature( Effect.OpenInternetActivityPrivacyEffect ) Action.ShowTrackers -> flowOf(Effect.OpenTrackersEffect) - Action.FetchStatistics -> flow { - emit( - trackersStatisticsUseCase.getDayStatistics() - .let { (dayStatistics, trackersCount) -> - Effect.TrackersStatisticsUpdatedEffect( - dayStatistics = dayStatistics.callsBlockedNLeaked, - dayLabels = dayStatistics.periods, - dayTrackersCount = dayStatistics.trackersCount, - trackersCount = trackersCount, - activeTrackersCount = trackersStatisticsUseCase.getNonBLockedTrackersCount() - ) - } - ) - } + Action.FetchStatistics -> + trackersStatisticsUseCase.getNonBlockedTrackersCount() + .map { nonBlockedTrackersCount -> + trackersStatisticsUseCase.getDayStatistics() + .let { (dayStatistics, trackersCount) -> + Effect.TrackersStatisticsUpdatedEffect( + dayStatistics = dayStatistics.callsBlockedNLeaked, + dayLabels = dayStatistics.periods, + dayTrackersCount = dayStatistics.trackersCount, + trackersCount = trackersCount, + activeTrackersCount = nonBlockedTrackersCount + ) + } + } } }, singleEventProducer = { _, _, effect -> diff --git a/app/src/main/java/foundation/e/privacycentralapp/features/trackers/apptrackers/AppTrackersFeature.kt b/app/src/main/java/foundation/e/privacycentralapp/features/trackers/apptrackers/AppTrackersFeature.kt index 270dfcb..c1eef47 100644 --- a/app/src/main/java/foundation/e/privacycentralapp/features/trackers/apptrackers/AppTrackersFeature.kt +++ b/app/src/main/java/foundation/e/privacycentralapp/features/trackers/apptrackers/AppTrackersFeature.kt @@ -66,7 +66,7 @@ class AppTrackersFeature( } fun getTrackersCount() = trackers?.size ?: 0 - fun getBlockedTrackersCount(): Int = if (isBlockingActivated) + fun getBlockedTrackersCount(): Int = if (isQuickPrivacyEnabled && isBlockingActivated) getTrackersCount() - (whitelist?.size ?: 0) else 0 } @@ -160,7 +160,9 @@ class AppTrackersFeature( } ?: flowOf(Effect.ErrorEffect(R.string.apptrackers_error_no_app)) is Action.BlockAllToggleAction -> - state.appDesc?.uid?.let { appUid -> + if (!state.isQuickPrivacyEnabled) { + flowOf(Effect.QuickPrivacyDisabledWarningEffect) + } else state.appDesc?.uid?.let { appUid -> flow { trackersStateUseCase.toggleAppWhitelist(appUid, !action.isBlocked) diff --git a/app/src/main/java/foundation/e/privacycentralapp/features/trackers/apptrackers/AppTrackersFragment.kt b/app/src/main/java/foundation/e/privacycentralapp/features/trackers/apptrackers/AppTrackersFragment.kt index 8e2dc3b..d6edee6 100644 --- a/app/src/main/java/foundation/e/privacycentralapp/features/trackers/apptrackers/AppTrackersFragment.kt +++ b/app/src/main/java/foundation/e/privacycentralapp/features/trackers/apptrackers/AppTrackersFragment.kt @@ -109,6 +109,10 @@ class AppTrackersFragment : viewModel.submitAction(Action.BlockAllToggleAction(binding.blockAllToggle.isChecked)) } + binding.blockAllToggleClicker.setOnClickListener { + viewModel.submitAction(Action.BlockAllToggleAction(false)) + } + binding.trackers.apply { layoutManager = LinearLayoutManager(requireContext()) setHasFixedSize(true) @@ -128,7 +132,6 @@ class AppTrackersFragment : } override fun render(state: State) { - binding.trackersCountSummary.text = if (state.getTrackersCount() == 0) "" else getString( R.string.apptrackers_trackers_count_summary, @@ -137,6 +140,8 @@ class AppTrackersFragment : ) binding.blockAllToggle.isChecked = state.isBlockingActivated + binding.blockAllToggle.isEnabled = state.isQuickPrivacyEnabled + binding.blockAllToggleClicker.isVisible = !state.isQuickPrivacyEnabled binding.trackersListTitle.isVisible = state.isBlockingActivated diff --git a/app/src/main/res/layout/apptrackers_fragment.xml b/app/src/main/res/layout/apptrackers_fragment.xml index b0b9e71..3eb9168 100644 --- a/app/src/main/res/layout/apptrackers_fragment.xml +++ b/app/src/main/res/layout/apptrackers_fragment.xml @@ -60,10 +60,31 @@ android:layout_weight="1" android:text="@string/apptrackers_block_all_toggle" /> - + android:layout_height="wrap_content"> + + + +