aboutsummaryrefslogtreecommitdiffstats
path: root/app/src/main/java/foundation/e/privacycentralapp/features
diff options
context:
space:
mode:
authorjacquarg <guillaume.jacquart@hoodbrains.com>2021-11-12 11:34:57 +0100
committerjacquarg <guillaume.jacquart@hoodbrains.com>2021-11-12 11:51:59 +0100
commit2ea0e99f1bcec61e1a94bb7c35605fca49c53d1c (patch)
treecb4acda9ccb676dd60eb7ab95d3769ff7796622c /app/src/main/java/foundation/e/privacycentralapp/features
parent95f0c8fb06bd1aa57702f56f2c736e9718597080 (diff)
downloadadvanced-privacy-2ea0e99f1bcec61e1a94bb7c35605fca49c53d1c.tar.gz
Integrate trackers module, small UI fixes
Diffstat (limited to 'app/src/main/java/foundation/e/privacycentralapp/features')
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/features/dashboard/DashboardFeature.kt33
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/features/dashboard/DashboardFragment.kt27
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/features/dashboard/DashboardViewModel.kt12
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/features/internetprivacy/InternetPrivacyFeature.kt15
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/features/trackers/TrackersFeature.kt5
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/features/trackers/TrackersFragment.kt2
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/features/trackers/apptrackers/AppTrackersFragment.kt17
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/features/trackers/apptrackers/ToggleTrackersAdapter.kt23
8 files changed, 82 insertions, 52 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 a6ac87a..5185737 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
@@ -26,6 +26,7 @@ import foundation.e.privacycentralapp.domain.entities.InternetPrivacyMode
import foundation.e.privacycentralapp.domain.entities.LocationMode
import foundation.e.privacycentralapp.domain.usecases.GetQuickPrivacyStateUseCase
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
@@ -55,7 +56,7 @@ class DashboardFeature(
val totalGraph: Int? = null,
// val graphData
val trackersCount: Int? = null,
- val activeTrackersCount: Int? = null,
+ val dayTrackersCount: Int? = null,
val dayStatistics: List<Int>? = null
)
@@ -84,7 +85,12 @@ class DashboardFeature(
object NoEffect : Effect()
data class UpdateStateEffect(val isEnabled: Boolean) : Effect()
data class IpScramblingModeUpdatedEffect(val mode: InternetPrivacyMode) : Effect()
- data class TrackersStatisticsUpdatedEffect(val dayStatistics: List<Int>) : Effect()
+ data class TrackersStatisticsUpdatedEffect(
+ val dayStatistics: List<Int>,
+ val dayTrackersCount: Int,
+ val trackersCount: Int
+ ) : Effect()
+ data class TrackersBlockedUpdatedEffect(val areAllTrackersBlocked: Boolean) : Effect()
object OpenQuickPrivacyProtectionEffect : Effect()
data class OpenDashboardEffect(
@@ -115,7 +121,8 @@ class DashboardFeature(
coroutineScope: CoroutineScope,
getPrivacyStateUseCase: GetQuickPrivacyStateUseCase,
ipScramblingStateUseCase: IpScramblingStateUseCase,
- trackersStatisticsUseCase: TrackersStatisticsUseCase
+ trackersStatisticsUseCase: TrackersStatisticsUseCase,
+ trackersStateUseCase: TrackersStateUseCase
): DashboardFeature =
DashboardFeature(
initialState = State(),
@@ -124,8 +131,15 @@ class DashboardFeature(
when (effect) {
is Effect.UpdateStateEffect -> state.copy(isQuickPrivacyEnabled = effect.isEnabled)
is Effect.IpScramblingModeUpdatedEffect -> state.copy(internetPrivacyMode = effect.mode)
- is Effect.TrackersStatisticsUpdatedEffect -> state.copy(dayStatistics = effect.dayStatistics)
+ is Effect.TrackersStatisticsUpdatedEffect -> state.copy(
+ dayStatistics = effect.dayStatistics,
+ dayTrackersCount = effect.dayTrackersCount,
+ trackersCount = effect.trackersCount
+ )
+ is Effect.TrackersBlockedUpdatedEffect -> state.copy(
+ isAllTrackersBlocked = effect.areAllTrackersBlocked
+ )
/*is Effect.OpenDashboardEffect -> State.DashboardState(
effect.trackersCount,
effect.activeTrackersCount,
@@ -190,7 +204,16 @@ class DashboardFeature(
Effect.IpScramblingModeUpdatedEffect(it)
},
flow {
- emit(Effect.TrackersStatisticsUpdatedEffect(trackersStatisticsUseCase.getPastDayTrackersCalls()))
+ emit(
+ Effect.TrackersStatisticsUpdatedEffect(
+ dayStatistics = trackersStatisticsUseCase.getPastDayTrackersCalls(),
+ dayTrackersCount = trackersStatisticsUseCase.getPastDayTrackersCount(),
+ trackersCount = trackersStatisticsUseCase.getTrackersCount()
+ )
+ )
+ },
+ trackersStateUseCase.areAllTrackersBlocked.map {
+ Effect.TrackersBlockedUpdatedEffect(it)
}
)
/*
diff --git a/app/src/main/java/foundation/e/privacycentralapp/features/dashboard/DashboardFragment.kt b/app/src/main/java/foundation/e/privacycentralapp/features/dashboard/DashboardFragment.kt
index 1b4ad39..248e358 100644
--- a/app/src/main/java/foundation/e/privacycentralapp/features/dashboard/DashboardFragment.kt
+++ b/app/src/main/java/foundation/e/privacycentralapp/features/dashboard/DashboardFragment.kt
@@ -209,7 +209,7 @@ class DashboardFragment :
it.mapIndexed { index, value -> BarEntry(index.toFloat(), value.toFloat()) },
getString(R.string.dashboard_graph_trackers_legend)
).apply {
- color = getColor(requireContext(), R.color.purple_chart)
+ color = getColor(requireContext(), R.color.e_blue2)
setDrawValues(false)
}
@@ -217,24 +217,15 @@ class DashboardFragment :
binding.graph.invalidate()
}
- state.trackersCount?.let {
- binding.graphLegend.text = getString(R.string.dashboard_graph_trackers_legend, it)
- }
+ binding.graphLegend.text = getString(R.string.dashboard_graph_trackers_legend, state.trackersCount?.toString() ?: "No")
- // binding.graphTotal.text = if (state == DashboardFeature.State.LoadingState) {
- // ""
- // } else {
- // val value = if (state is DashboardFeature.State.EnabledState) state.totalGraph
- // else if (state is DashboardFeature.State.DisabledState) state.totalGraph
- // else 0 // dummy
- // getString(R.string.dashboard_graph_total, value)
- // }
-
- state.activeTrackersCount?.let {
- binding.amITracked.subtitle.text = getString(R.string.dashboard_am_i_tracked_subtitle, 77, it)
+ if (state.dayTrackersCount != null && state.trackersCount != null) {
+ binding.amITracked.subTitle = getString(R.string.dashboard_am_i_tracked_subtitle, state.trackersCount, state.dayTrackersCount)
+ } else {
+ binding.amITracked.subTitle = getString(R.string.trackers_title)
}
- binding.myLocation.subtitle.text = getString(
+ binding.myLocation.subTitle = getString(
if (state.isQuickPrivacyEnabled &&
state.locationMode != LocationMode.REAL_LOCATION
)
@@ -242,13 +233,15 @@ class DashboardFragment :
else R.string.dashboard_location_subtitle_off
)
- binding.internetActivityPrivacy.subtitle.text = getString(
+ binding.internetActivityPrivacy.subTitle = getString(
if (state.isQuickPrivacyEnabled &&
state.internetPrivacyMode != InternetPrivacyMode.REAL_IP
)
R.string.dashboard_internet_activity_privacy_subtitle_on
else R.string.dashboard_internet_activity_privacy_subtitle_off
)
+
+ binding.executePendingBindings()
}
override fun actions(): Flow<DashboardFeature.Action> = viewModel.actions
diff --git a/app/src/main/java/foundation/e/privacycentralapp/features/dashboard/DashboardViewModel.kt b/app/src/main/java/foundation/e/privacycentralapp/features/dashboard/DashboardViewModel.kt
index fa24b1d..4bf01d7 100644
--- a/app/src/main/java/foundation/e/privacycentralapp/features/dashboard/DashboardViewModel.kt
+++ b/app/src/main/java/foundation/e/privacycentralapp/features/dashboard/DashboardViewModel.kt
@@ -22,6 +22,7 @@ import androidx.lifecycle.viewModelScope
import foundation.e.privacycentralapp.common.Factory
import foundation.e.privacycentralapp.domain.usecases.GetQuickPrivacyStateUseCase
import foundation.e.privacycentralapp.domain.usecases.IpScramblingStateUseCase
+import foundation.e.privacycentralapp.domain.usecases.TrackersStateUseCase
import foundation.e.privacycentralapp.domain.usecases.TrackersStatisticsUseCase
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.asSharedFlow
@@ -30,7 +31,8 @@ import kotlinx.coroutines.launch
class DashboardViewModel(
private val getPrivacyStateUseCase: GetQuickPrivacyStateUseCase,
private val ipScramblingStateUseCase: IpScramblingStateUseCase,
- private val trackersStatisticsUseCase: TrackersStatisticsUseCase
+ private val trackersStatisticsUseCase: TrackersStatisticsUseCase,
+ private val trackersStateUseCase: TrackersStateUseCase
) : ViewModel() {
private val _actions = MutableSharedFlow<DashboardFeature.Action>()
@@ -41,7 +43,8 @@ class DashboardViewModel(
coroutineScope = viewModelScope,
getPrivacyStateUseCase = getPrivacyStateUseCase,
ipScramblingStateUseCase = ipScramblingStateUseCase,
- trackersStatisticsUseCase = trackersStatisticsUseCase
+ trackersStatisticsUseCase = trackersStatisticsUseCase,
+ trackersStateUseCase = trackersStateUseCase
)
}
@@ -55,9 +58,10 @@ class DashboardViewModel(
class DashBoardViewModelFactory(
private val getPrivacyStateUseCase: GetQuickPrivacyStateUseCase,
private val ipScramblingStateUseCase: IpScramblingStateUseCase,
- private val trackersStatisticsUseCase: TrackersStatisticsUseCase
+ private val trackersStatisticsUseCase: TrackersStatisticsUseCase,
+ private val trackersStateUseCase: TrackersStateUseCase
) : Factory<DashboardViewModel> {
override fun create(): DashboardViewModel {
- return DashboardViewModel(getPrivacyStateUseCase, ipScramblingStateUseCase, trackersStatisticsUseCase)
+ return DashboardViewModel(getPrivacyStateUseCase, ipScramblingStateUseCase, trackersStatisticsUseCase, trackersStateUseCase)
}
}
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 f7145d1..e0eb12c 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
@@ -136,19 +136,16 @@ class InternetPrivacyFeature(
when {
action is Action.LoadInternetModeAction -> merge(
getQuickPrivacyStateUseCase.quickPrivacyEnabledFlow.map { Effect.QuickPrivacyUpdatedEffect(it) },
- flowOf(Effect.QuickPrivacyUpdatedEffect(true)),
ipScramblingStateUseCase.internetPrivacyMode.map { Effect.ModeUpdatedEffect(it) }.shareIn(scope = coroutineScope, started = SharingStarted.Lazily, replay = 0),
flowOf(Effect.ModeUpdatedEffect(InternetPrivacyMode.REAL_IP)),
- flow {
- val apps = appListUseCase.getAppsUsingInternet()
+ appListUseCase.getAppsUsingInternet().map { apps ->
if (ipScramblerModule.appList.isEmpty()) {
- ipScramblerModule.appList = apps.map { it.packageName }.toMutableSet()
+ ipScramblerModule.appList =
+ apps.map { it.packageName }.toMutableSet()
}
- emit(
- Effect.AvailableAppsListEffect(
- apps,
- ipScramblerModule.appList
- )
+ Effect.AvailableAppsListEffect(
+ apps,
+ ipScramblerModule.appList
)
},
flow {
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 0120fae..5d20e7c 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
@@ -152,9 +152,8 @@ class TrackersFeature(
)
)
},
- flow {
- val apps = appListUseCase.getAppsUsingInternet()
- emit(Effect.AvailableAppsListEffect(apps))
+ appListUseCase.getAppsUsingInternet().map { apps ->
+ Effect.AvailableAppsListEffect(apps)
}
)
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 a259f0b..25f6d59 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
@@ -144,7 +144,7 @@ class TrackersFragment :
data.mapIndexed { index, value -> BarEntry(index.toFloat(), value.toFloat()) },
getString(R.string.trackers_count_label)
).apply {
- color = ContextCompat.getColor(requireContext(), R.color.purple_chart)
+ color = ContextCompat.getColor(requireContext(), R.color.e_blue2)
setDrawValues(false)
}
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 508aa5a..1c3144d 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
@@ -110,15 +110,24 @@ class AppTrackersFragment :
}
}
- override fun render(state: AppTrackersFeature.State) {
- // binding.blockAllToggle.isChecked = state.isBlockingActivated
+ override fun render(state: State) {
+ binding.blockAllToggle.isChecked = state.isBlockingActivated
- state.getTrackersStatus()?.let {
+ val trackersStatus = state.getTrackersStatus()
+ if (!trackersStatus.isNullOrEmpty()) {
binding.trackers.isVisible = true
binding.trackers.post {
- (binding.trackers.adapter as ToggleTrackersAdapter?)?.dataSet = it
+ (binding.trackers.adapter as ToggleTrackersAdapter?)?.updateDataSet(trackersStatus, state.isBlockingActivated)
}
binding.noTrackersYet.isVisible = false
+ } else {
+ binding.trackers.isVisible = false
+ binding.noTrackersYet.isVisible = true
+ binding.noTrackersYet.text = getString(
+ if (state.isBlockingActivated)
+ R.string.apptrackers_no_trackers_yet_block_on
+ else R.string.apptrackers_no_trackers_yet_block_off
+ )
}
}
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 f23ebf5..b1b3ed6 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
@@ -20,8 +20,8 @@ package foundation.e.privacycentralapp.features.trackers.apptrackers
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
+import android.widget.Switch
import android.widget.TextView
-import androidx.appcompat.widget.SwitchCompat
import androidx.recyclerview.widget.RecyclerView
import foundation.e.privacycentralapp.R
import foundation.e.privacymodules.trackers.Tracker
@@ -32,22 +32,27 @@ class ToggleTrackersAdapter(
) :
RecyclerView.Adapter<ToggleTrackersAdapter.ViewHolder>() {
+ var isEnabled = true
+
class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
val title: TextView = view.findViewById(R.id.title)
- val toggle: SwitchCompat = view.findViewById(R.id.toggle)
+ val toggle: Switch = view.findViewById(R.id.toggle)
- fun bind(item: Pair<Tracker, Boolean>) {
+ fun bind(item: Pair<Tracker, Boolean>, isEnabled: Boolean) {
title.text = item.first.label
toggle.isChecked = item.second
+ toggle.isEnabled = isEnabled
}
}
- var dataSet: List<Pair<Tracker, Boolean>> = emptyList()
- set(value) {
- field = value
- notifyDataSetChanged()
- }
+ private var dataSet: List<Pair<Tracker, Boolean>> = emptyList()
+
+ fun updateDataSet(new: List<Pair<Tracker, Boolean>>, isEnabled: Boolean) {
+ this.isEnabled = isEnabled
+ dataSet = new
+ notifyDataSetChanged()
+ }
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(parent.context)
@@ -61,7 +66,7 @@ class ToggleTrackersAdapter(
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val permission = dataSet[position]
- holder.bind(permission)
+ holder.bind(permission, isEnabled)
}
override fun getItemCount(): Int = dataSet.size