diff options
| author | Guillaume Jacquart <guillaume.jacquart@hoodbrains.com> | 2022-02-24 07:46:24 +0000 |
|---|---|---|
| committer | Guillaume Jacquart <guillaume.jacquart@hoodbrains.com> | 2022-02-24 07:46:24 +0000 |
| commit | 323d28aa26beace64186a33a0557e2e7ad4771af (patch) | |
| tree | 97446224925c34be4ed09e6d0ce679275f698726 /app/src/main/java/foundation/e/privacycentralapp/features | |
| parent | 6abf3b8bbcec463dcea8acbba63872d587ff2779 (diff) | |
| parent | 650a067529cdf65cc9a9130c91511adfb4b64c98 (diff) | |
| download | advanced-privacy-323d28aa26beace64186a33a0557e2e7ad4771af.tar.gz | |
Merge branch 'UX_trackers_updates' into 'main'
Access trackers list when QP disabled: #4591, #4596, #4601
See merge request e/privacy-central/privacycentralapp!17
Diffstat (limited to 'app/src/main/java/foundation/e/privacycentralapp/features')
11 files changed, 65 insertions, 57 deletions
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 b434bb4..87f5e42 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 @@ -130,7 +130,6 @@ class DashboardFeature( } }, actor = { _: State, action: Action -> - Log.d("Feature", "action: $action") when (action) { Action.TogglePrivacyAction -> { getPrivacyStateUseCase.toggle() @@ -186,8 +185,7 @@ class DashboardFeature( ) } }, - singleEventProducer = { state, _, effect -> - Log.d("DashboardFeature", "$state, $effect") + singleEventProducer = { _, _, effect -> when (effect) { is Effect.OpenFakeMyLocationEffect -> SingleEvent.NavigateToLocationSingleEvent 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 6ff3d27..8d50980 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 @@ -24,6 +24,7 @@ import foundation.e.flowmvi.Actor import foundation.e.flowmvi.Reducer import foundation.e.flowmvi.SingleEventProducer import foundation.e.flowmvi.feature.BaseFeature +import foundation.e.privacycentralapp.R import foundation.e.privacycentralapp.domain.entities.InternetPrivacyMode import foundation.e.privacycentralapp.domain.usecases.AppListUseCase import foundation.e.privacycentralapp.domain.usecases.GetQuickPrivacyStateUseCase @@ -71,7 +72,7 @@ class InternetPrivacyFeature( sealed class SingleEvent { data class StartAndroidVpnActivityEvent(val intent: Intent) : SingleEvent() - data class ErrorEvent(val error: String) : SingleEvent() + data class ErrorEvent(val error: Any) : SingleEvent() } sealed class Action { @@ -201,7 +202,7 @@ class InternetPrivacyFeature( singleEventProducer = { _, action, effect -> when { effect is Effect.ErrorEffect -> SingleEvent.ErrorEvent(effect.message) - effect == Effect.QuickPrivacyDisabledWarningEffect -> SingleEvent.ErrorEvent("Enabled Quick Privacy to use functionalities") + effect == Effect.QuickPrivacyDisabledWarningEffect -> SingleEvent.ErrorEvent(error = R.string.ipscrambling_error_quickprivacy_disabled) action is Action.UseHiddenIPAction && effect is Effect.ShowAndroidVpnDisclaimerEffect -> 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 f288320..07e0627 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 @@ -34,6 +34,7 @@ import foundation.e.privacycentralapp.common.NavToolbarFragment import foundation.e.privacycentralapp.common.ToggleAppsAdapter import foundation.e.privacycentralapp.databinding.FragmentInternetActivityPolicyBinding import foundation.e.privacycentralapp.domain.entities.InternetPrivacyMode +import foundation.e.privacycentralapp.extensions.toText import foundation.e.privacycentralapp.extensions.viewModelProviderFactoryOf import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.collect @@ -62,7 +63,7 @@ class InternetPrivacyFragment : viewModel.internetPrivacyFeature.singleEvents.collect { event -> when (event) { is InternetPrivacyFeature.SingleEvent.ErrorEvent -> { - displayToast(event.error) + displayToast(event.error.toText(requireContext())) } is InternetPrivacyFeature.SingleEvent.StartAndroidVpnActivityEvent -> { launchAndroidVpnDisclaimer.launch(event.intent) 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 76c586c..6821a33 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 @@ -22,7 +22,6 @@ import android.content.Context import android.location.Location import android.os.Bundle import android.text.Editable -import android.util.Log import android.view.View import android.widget.Toast import androidx.annotation.NonNull @@ -171,7 +170,6 @@ class FakeLocationFragment : val lat = binding.edittextLatitude.text.toString().toFloat() val lon = binding.edittextLongitude.text.toString().toFloat() if (lat <= 90f && lat >= -90f && lon <= 180f && lon >= -180f) { - Log.e("UpdateText", "") mapboxMap?.moveCamera( CameraUpdateFactory.newLatLng( LatLng(lat.toDouble(), lon.toDouble()) 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 f38e50f..00e3fb7 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 @@ -22,9 +22,8 @@ import foundation.e.flowmvi.Actor import foundation.e.flowmvi.Reducer import foundation.e.flowmvi.SingleEventProducer import foundation.e.flowmvi.feature.BaseFeature +import foundation.e.privacycentralapp.domain.entities.TrackersPeriodicStatistics import foundation.e.privacycentralapp.domain.usecases.AppListUseCase -import foundation.e.privacycentralapp.domain.usecases.GetQuickPrivacyStateUseCase -import foundation.e.privacycentralapp.domain.usecases.TrackersPeriodicStatistics import foundation.e.privacycentralapp.domain.usecases.TrackersStatisticsUseCase import foundation.e.privacymodules.permissions.data.ApplicationDescription import foundation.e.privacymodules.trackers.Tracker @@ -88,7 +87,6 @@ class TrackersFeature( fun create( initialState: State = State(), coroutineScope: CoroutineScope, - getPrivacyStateUseCase: GetQuickPrivacyStateUseCase, trackersStatisticsUseCase: TrackersStatisticsUseCase, appListUseCase: AppListUseCase ) = TrackersFeature( @@ -130,11 +128,9 @@ class TrackersFeature( ) is Action.ClickAppAction -> flowOf( - if (getPrivacyStateUseCase.isQuickPrivacyEnabled) { - state.apps?.find { it.packageName == action.packageName }?.let { - Effect.OpenAppDetailsEffect(it) - } ?: run { Effect.ErrorEffect("Can't find back app.") } - } else Effect.QuickPrivacyDisabledWarningEffect + state.apps?.find { it.packageName == action.packageName }?.let { + Effect.OpenAppDetailsEffect(it) + } ?: run { Effect.ErrorEffect("Can't find back app.") } ) is Action.FetchStatistics -> flow { trackersStatisticsUseCase.getDayMonthYearStatistics() diff --git a/app/src/main/java/foundation/e/privacycentralapp/features/trackers/TrackersFragment.kt b/app/src/main/java/foundation/e/privacycentralapp/features/trackers/TrackersFragment.kt index 088787c..3b22f89 100644 --- a/app/src/main/java/foundation/e/privacycentralapp/features/trackers/TrackersFragment.kt +++ b/app/src/main/java/foundation/e/privacycentralapp/features/trackers/TrackersFragment.kt @@ -34,7 +34,7 @@ import foundation.e.privacycentralapp.common.GraphHolder import foundation.e.privacycentralapp.common.NavToolbarFragment import foundation.e.privacycentralapp.databinding.FragmentTrackersBinding import foundation.e.privacycentralapp.databinding.TrackersItemGraphBinding -import foundation.e.privacycentralapp.domain.usecases.TrackersPeriodicStatistics +import foundation.e.privacycentralapp.domain.entities.TrackersPeriodicStatistics import foundation.e.privacycentralapp.extensions.viewModelProviderFactoryOf import foundation.e.privacycentralapp.features.trackers.apptrackers.AppTrackersFragment import kotlinx.coroutines.flow.Flow diff --git a/app/src/main/java/foundation/e/privacycentralapp/features/trackers/TrackersViewModel.kt b/app/src/main/java/foundation/e/privacycentralapp/features/trackers/TrackersViewModel.kt index 12b66d4..e3a97cc 100644 --- a/app/src/main/java/foundation/e/privacycentralapp/features/trackers/TrackersViewModel.kt +++ b/app/src/main/java/foundation/e/privacycentralapp/features/trackers/TrackersViewModel.kt @@ -17,19 +17,16 @@ package foundation.e.privacycentralapp.features.trackers -import android.util.Log import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import foundation.e.privacycentralapp.common.Factory import foundation.e.privacycentralapp.domain.usecases.AppListUseCase -import foundation.e.privacycentralapp.domain.usecases.GetQuickPrivacyStateUseCase import foundation.e.privacycentralapp.domain.usecases.TrackersStatisticsUseCase import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.launch class TrackersViewModel( - private val getQuickPrivacyStateUseCase: GetQuickPrivacyStateUseCase, private val trackersStatisticsUseCase: TrackersStatisticsUseCase, private val appListUseCase: AppListUseCase ) : ViewModel() { @@ -40,14 +37,13 @@ class TrackersViewModel( val trackersFeature: TrackersFeature by lazy { TrackersFeature.create( coroutineScope = viewModelScope, - getPrivacyStateUseCase = getQuickPrivacyStateUseCase, + trackersStatisticsUseCase = trackersStatisticsUseCase, appListUseCase = appListUseCase ) } fun submitAction(action: TrackersFeature.Action) { - Log.d("TrackersViewModel", "submitting action") viewModelScope.launch { _actions.emit(action) } @@ -55,12 +51,11 @@ class TrackersViewModel( } class TrackersViewModelFactory( - private val getQuickPrivacyStateUseCase: GetQuickPrivacyStateUseCase, private val trackersStatisticsUseCase: TrackersStatisticsUseCase, private val appListUseCase: AppListUseCase ) : Factory<TrackersViewModel> { override fun create(): TrackersViewModel { - return TrackersViewModel(getQuickPrivacyStateUseCase, trackersStatisticsUseCase, appListUseCase) + return TrackersViewModel(trackersStatisticsUseCase, appListUseCase) } } 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 18cbb93..ff0c9db 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 @@ -22,6 +22,8 @@ import foundation.e.flowmvi.Actor import foundation.e.flowmvi.Reducer import foundation.e.flowmvi.SingleEventProducer import foundation.e.flowmvi.feature.BaseFeature +import foundation.e.privacycentralapp.R +import foundation.e.privacycentralapp.domain.usecases.GetQuickPrivacyStateUseCase import foundation.e.privacycentralapp.domain.usecases.TrackersStateUseCase import foundation.e.privacycentralapp.domain.usecases.TrackersStatisticsUseCase import foundation.e.privacymodules.permissions.data.ApplicationDescription @@ -51,7 +53,8 @@ class AppTrackersFeature( val appDesc: ApplicationDescription? = null, val isBlockingActivated: Boolean = false, val trackers: List<Tracker>? = null, - val whitelist: List<String>? = null + val whitelist: List<String>? = null, + val isQuickPrivacyEnabled: Boolean = false ) { fun getTrackersStatus(): List<Pair<Tracker, Boolean>>? { if (trackers != null && whitelist != null) { @@ -63,7 +66,7 @@ class AppTrackersFeature( } sealed class SingleEvent { - data class ErrorEvent(val error: String) : SingleEvent() + data class ErrorEvent(val error: Any) : SingleEvent() object NewStatisticsAvailableSingleEvent : SingleEvent() } @@ -75,18 +78,15 @@ class AppTrackersFeature( } sealed class Effect { + object NoEffect : Effect() + data class ErrorEffect(val message: String) : Effect() data class SetAppEffect(val appDesc: ApplicationDescription) : Effect() data class AppTrackersBlockingActivatedEffect(val isBlockingActivated: Boolean) : Effect() - data class AvailableTrackersListEffect( - // val isBlockingActivated: Boolean, - val trackers: List<Tracker>, - // val whitelist: List<String> - ) : Effect() + data class AvailableTrackersListEffect(val trackers: List<Tracker>) : Effect() data class TrackersWhitelistUpdateEffect(val whitelist: List<String>) : Effect() - - // object QuickPrivacyDisabledWarningEffect : Effect() - data class ErrorEffect(val message: String) : Effect() object NewStatisticsAvailablesEffect : Effect() + data class QuickPrivacyUpdatedEffect(val enabled: Boolean) : Effect() + object QuickPrivacyDisabledWarningEffect : Effect() } companion object { @@ -94,7 +94,8 @@ class AppTrackersFeature( initialState: State = State(), coroutineScope: CoroutineScope, trackersStateUseCase: TrackersStateUseCase, - trackersStatisticsUseCase: TrackersStatisticsUseCase + trackersStatisticsUseCase: TrackersStatisticsUseCase, + getQuickPrivacyStateUseCase: GetQuickPrivacyStateUseCase ) = AppTrackersFeature( initialState, coroutineScope, reducer = { state, effect -> @@ -107,6 +108,8 @@ class AppTrackersFeature( is Effect.TrackersWhitelistUpdateEffect -> state.copy(whitelist = effect.whitelist) + is Effect.QuickPrivacyUpdatedEffect -> + state.copy(isQuickPrivacyEnabled = effect.enabled) is Effect.ErrorEffect -> state else -> state } @@ -138,6 +141,9 @@ class AppTrackersFeature( }, trackersStatisticsUseCase.listenUpdates().map { Effect.NewStatisticsAvailablesEffect + }, + getQuickPrivacyStateUseCase.quickPrivacyEnabledFlow.map { + Effect.QuickPrivacyUpdatedEffect(it) } ) } @@ -156,20 +162,24 @@ class AppTrackersFeature( } } ?: run { flowOf(Effect.ErrorEffect("No appDesc.")) } is Action.ToggleTrackerAction -> { - state.appDesc?.uid?.let { appUid -> - flow { - trackersStateUseCase.blockTracker( - appUid, - action.tracker, - action.isBlocked - ) - emit( - Effect.TrackersWhitelistUpdateEffect( - trackersStateUseCase.getTrackersWhitelistIds(appUid) + if (!state.isQuickPrivacyEnabled) { + flowOf(Effect.QuickPrivacyDisabledWarningEffect) + } else if (state.isBlockingActivated) { + state.appDesc?.uid?.let { appUid -> + flow { + trackersStateUseCase.blockTracker( + appUid, + action.tracker, + action.isBlocked ) - ) - } - } ?: run { flowOf(Effect.ErrorEffect("No appDesc.")) } + emit( + Effect.TrackersWhitelistUpdateEffect( + trackersStateUseCase.getTrackersWhitelistIds(appUid) + ) + ) + } + } ?: run { flowOf(Effect.ErrorEffect("No appDesc.")) } + } else flowOf(Effect.NoEffect) } is Action.FetchStatistics -> flowOf( state.appDesc?.uid?.let { @@ -184,6 +194,8 @@ class AppTrackersFeature( singleEventProducer = { _, _, effect -> when (effect) { is Effect.ErrorEffect -> SingleEvent.ErrorEvent(effect.message) + is Effect.QuickPrivacyDisabledWarningEffect -> + SingleEvent.ErrorEvent(R.string.apptrackers_error_quickprivacy_disabled) is Effect.NewStatisticsAvailablesEffect -> SingleEvent.NewStatisticsAvailableSingleEvent else -> null 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 5b09be5..1f339ee 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 @@ -31,6 +31,7 @@ import foundation.e.privacycentralapp.PrivacyCentralApplication import foundation.e.privacycentralapp.R import foundation.e.privacycentralapp.common.NavToolbarFragment import foundation.e.privacycentralapp.databinding.ApptrackersFragmentBinding +import foundation.e.privacycentralapp.extensions.toText import foundation.e.privacycentralapp.extensions.viewModelProviderFactoryOf import foundation.e.privacycentralapp.features.trackers.apptrackers.AppTrackersFeature.Action import foundation.e.privacycentralapp.features.trackers.apptrackers.AppTrackersFeature.SingleEvent @@ -70,7 +71,8 @@ class AppTrackersFragment : lifecycleScope.launchWhenStarted { viewModel.feature.singleEvents.collect { event -> when (event) { - is SingleEvent.ErrorEvent -> displayToast(event.error) + is SingleEvent.ErrorEvent -> + displayToast(event.error.toText(requireContext())) is SingleEvent.NewStatisticsAvailableSingleEvent -> { viewModel.submitAction(Action.FetchStatistics) } @@ -128,7 +130,10 @@ class AppTrackersFragment : if (!trackersStatus.isNullOrEmpty()) { binding.trackers.isVisible = true binding.trackers.post { - (binding.trackers.adapter as ToggleTrackersAdapter?)?.updateDataSet(trackersStatus, state.isBlockingActivated) + (binding.trackers.adapter as ToggleTrackersAdapter?)?.updateDataSet( + trackersStatus, + state.isBlockingActivated && state.isQuickPrivacyEnabled + ) } binding.noTrackersYet.isVisible = false } else { diff --git a/app/src/main/java/foundation/e/privacycentralapp/features/trackers/apptrackers/AppTrackersViewModel.kt b/app/src/main/java/foundation/e/privacycentralapp/features/trackers/apptrackers/AppTrackersViewModel.kt index 37fdb85..995aa80 100644 --- a/app/src/main/java/foundation/e/privacycentralapp/features/trackers/apptrackers/AppTrackersViewModel.kt +++ b/app/src/main/java/foundation/e/privacycentralapp/features/trackers/apptrackers/AppTrackersViewModel.kt @@ -17,10 +17,10 @@ package foundation.e.privacycentralapp.features.trackers.apptrackers -import android.util.Log import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import foundation.e.privacycentralapp.common.Factory +import foundation.e.privacycentralapp.domain.usecases.GetQuickPrivacyStateUseCase import foundation.e.privacycentralapp.domain.usecases.TrackersStateUseCase import foundation.e.privacycentralapp.domain.usecases.TrackersStatisticsUseCase import kotlinx.coroutines.flow.MutableSharedFlow @@ -29,7 +29,8 @@ import kotlinx.coroutines.launch class AppTrackersViewModel( private val trackersStateUseCase: TrackersStateUseCase, - private val trackersStatisticsUseCase: TrackersStatisticsUseCase + private val trackersStatisticsUseCase: TrackersStatisticsUseCase, + private val getQuickPrivacyStateUseCase: GetQuickPrivacyStateUseCase ) : ViewModel() { private val _actions = MutableSharedFlow<AppTrackersFeature.Action>() @@ -39,12 +40,12 @@ class AppTrackersViewModel( AppTrackersFeature.create( coroutineScope = viewModelScope, trackersStateUseCase = trackersStateUseCase, - trackersStatisticsUseCase = trackersStatisticsUseCase + trackersStatisticsUseCase = trackersStatisticsUseCase, + getQuickPrivacyStateUseCase = getQuickPrivacyStateUseCase, ) } fun submitAction(action: AppTrackersFeature.Action) { - Log.d("TrackersViewModel", "submitting action") viewModelScope.launch { _actions.emit(action) } @@ -53,10 +54,11 @@ class AppTrackersViewModel( class AppTrackersViewModelFactory( private val trackersStateUseCase: TrackersStateUseCase, - private val trackersStatisticsUseCase: TrackersStatisticsUseCase + private val trackersStatisticsUseCase: TrackersStatisticsUseCase, + private val getQuickPrivacyStateUseCase: GetQuickPrivacyStateUseCase ) : Factory<AppTrackersViewModel> { override fun create(): AppTrackersViewModel { - return AppTrackersViewModel(trackersStateUseCase, trackersStatisticsUseCase) + return AppTrackersViewModel(trackersStateUseCase, trackersStatisticsUseCase, getQuickPrivacyStateUseCase) } } diff --git a/app/src/main/java/foundation/e/privacycentralapp/features/trackers/apptrackers/ToggleTrackersAdapter.kt b/app/src/main/java/foundation/e/privacycentralapp/features/trackers/apptrackers/ToggleTrackersAdapter.kt index 95ea094..0ab3987 100644 --- a/app/src/main/java/foundation/e/privacycentralapp/features/trackers/apptrackers/ToggleTrackersAdapter.kt +++ b/app/src/main/java/foundation/e/privacycentralapp/features/trackers/apptrackers/ToggleTrackersAdapter.kt @@ -58,7 +58,7 @@ class ToggleTrackersAdapter( val view = LayoutInflater.from(parent.context) .inflate(itemsLayout, parent, false) val holder = ViewHolder(view) - holder.toggle.setOnClickListener { + holder.itemView.setOnClickListener { listener(dataSet[holder.adapterPosition].first, holder.toggle.isChecked) } return holder |
