summaryrefslogtreecommitdiff
path: root/app/src
diff options
context:
space:
mode:
Diffstat (limited to 'app/src')
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/DependencyContainer.kt16
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/data/repositories/LocalStateRepository.kt7
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/domain/entities/InternetPrivacyMode.kt22
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/domain/entities/LocationMode.kt22
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/domain/usecases/GetQuickPrivacyStateUseCase.kt8
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/dummy/CityDataSource.kt1
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/dummy/DummyDataSource.kt10
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/dummy/Extensions.kt2
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/features/dashboard/DashboardFeature.kt186
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/features/dashboard/DashboardFragment.kt230
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/features/dashboard/DashboardViewModel.kt18
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/features/dashboard/QuickProtectionFragment.kt2
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/features/internetprivacy/InternetPrivacyFeature.kt13
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/features/internetprivacy/InternetPrivacyFragment.kt4
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/features/location/FakeLocationFeature.kt2
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/features/location/FakeLocationFragment.kt4
-rw-r--r--app/src/main/res/drawable/ic_apps_permissions.xml36
-rw-r--r--app/src/main/res/drawable/ic_internet_activity.xml48
-rw-r--r--app/src/main/res/drawable/ic_my_location.xml36
-rw-r--r--app/src/main/res/drawable/ic_privacy_toggle.xml22
-rw-r--r--app/src/main/res/drawable/ic_quick_privacy_off.pngbin0 -> 99093 bytes
-rw-r--r--app/src/main/res/drawable/ic_quick_privacy_on.pngbin0 -> 90230 bytes
-rw-r--r--app/src/main/res/drawable/ic_tracked.xml63
-rw-r--r--app/src/main/res/layout/dashboard_item_submenu_button.xml83
-rw-r--r--app/src/main/res/layout/fragment_dashboard.xml472
-rw-r--r--app/src/main/res/layout/fragment_internet_activity_policy.xml2
-rw-r--r--app/src/main/res/values/colors.xml12
-rw-r--r--app/src/main/res/values/strings.xml42
-rw-r--r--app/src/main/res/values/themes.xml4
29 files changed, 759 insertions, 608 deletions
diff --git a/app/src/main/java/foundation/e/privacycentralapp/DependencyContainer.kt b/app/src/main/java/foundation/e/privacycentralapp/DependencyContainer.kt
index 1ab848c..17967db 100644
--- a/app/src/main/java/foundation/e/privacycentralapp/DependencyContainer.kt
+++ b/app/src/main/java/foundation/e/privacycentralapp/DependencyContainer.kt
@@ -20,6 +20,9 @@ package foundation.e.privacycentralapp
import android.app.Application
import android.content.Context
import android.os.Process
+import foundation.e.privacycentralapp.data.repositories.LocalStateRepository
+import foundation.e.privacycentralapp.domain.usecases.GetQuickPrivacyStateUseCase
+import foundation.e.privacycentralapp.features.dashboard.DashBoardViewModelFactory
import foundation.e.privacycentralapp.features.internetprivacy.InternetPrivacyViewModelFactory
import foundation.e.privacycentralapp.features.location.FakeLocationViewModelFactory
import foundation.e.privacycentralapp.features.location.LocationApiDelegate
@@ -40,6 +43,7 @@ class DependencyContainer constructor(val app: Application) {
val context: Context by lazy { app.applicationContext }
+ // Drivers
private val fakeLocationModule: IFakeLocation by lazy { FakeLocation(app.applicationContext) }
private val permissionsModule by lazy { PermissionsPrivacyModule(app.applicationContext) }
private val ipScramblerModule: IIpScramblerModule by lazy { IpScramblerModule(app.applicationContext) }
@@ -57,6 +61,18 @@ class DependencyContainer constructor(val app: Application) {
LocationApiDelegate(fakeLocationModule, permissionsModule, appDesc)
}
+ // Repositories
+ private val localStateRepository by lazy { LocalStateRepository(context) }
+
+ // Usecases
+ private val getQuickPrivacyStateUseCase by lazy {
+ GetQuickPrivacyStateUseCase(localStateRepository)
+ }
+
+ val dashBoardViewModelFactory by lazy {
+ DashBoardViewModelFactory(getQuickPrivacyStateUseCase)
+ }
+
val fakeLocationViewModelFactory by lazy {
FakeLocationViewModelFactory(locationApi)
}
diff --git a/app/src/main/java/foundation/e/privacycentralapp/data/repositories/LocalStateRepository.kt b/app/src/main/java/foundation/e/privacycentralapp/data/repositories/LocalStateRepository.kt
index 390044b..3cabae7 100644
--- a/app/src/main/java/foundation/e/privacycentralapp/data/repositories/LocalStateRepository.kt
+++ b/app/src/main/java/foundation/e/privacycentralapp/data/repositories/LocalStateRepository.kt
@@ -31,10 +31,7 @@ class LocalStateRepository(context: Context) {
get() = sharedPref.getBoolean(KEY_QUICK_PRIVACY, false)
set(value) = set(KEY_QUICK_PRIVACY, value)
-
private fun set(key: String, value: Boolean) {
- sharedPref.edit().putBoolean(key, value).apply()
+ sharedPref.edit().putBoolean(key, value).commit()
}
-
-
-} \ No newline at end of file
+}
diff --git a/app/src/main/java/foundation/e/privacycentralapp/domain/entities/InternetPrivacyMode.kt b/app/src/main/java/foundation/e/privacycentralapp/domain/entities/InternetPrivacyMode.kt
new file mode 100644
index 0000000..879c435
--- /dev/null
+++ b/app/src/main/java/foundation/e/privacycentralapp/domain/entities/InternetPrivacyMode.kt
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2021 E FOUNDATION
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+package foundation.e.privacycentralapp.domain.entities
+
+enum class InternetPrivacyMode {
+ REAL_IP, HIDE_IP
+}
diff --git a/app/src/main/java/foundation/e/privacycentralapp/domain/entities/LocationMode.kt b/app/src/main/java/foundation/e/privacycentralapp/domain/entities/LocationMode.kt
new file mode 100644
index 0000000..dbb9b0a
--- /dev/null
+++ b/app/src/main/java/foundation/e/privacycentralapp/domain/entities/LocationMode.kt
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2021 E FOUNDATION
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+package foundation.e.privacycentralapp.domain.entities
+
+enum class LocationMode {
+ REAL_LOCATION, RANDOM_LOCATION, CUSTOM_LOCATION
+}
diff --git a/app/src/main/java/foundation/e/privacycentralapp/domain/usecases/GetQuickPrivacyStateUseCase.kt b/app/src/main/java/foundation/e/privacycentralapp/domain/usecases/GetQuickPrivacyStateUseCase.kt
index 746ead4..20ac0d9 100644
--- a/app/src/main/java/foundation/e/privacycentralapp/domain/usecases/GetQuickPrivacyStateUseCase.kt
+++ b/app/src/main/java/foundation/e/privacycentralapp/domain/usecases/GetQuickPrivacyStateUseCase.kt
@@ -19,6 +19,12 @@ package foundation.e.privacycentralapp.domain.usecases
import foundation.e.privacycentralapp.data.repositories.LocalStateRepository
-class GetQuickPrivacyStateUseCase(localStateRepository: LocalStateRepository) {
+class GetQuickPrivacyStateUseCase(private val localStateRepository: LocalStateRepository) {
val isQuickPrivacyEnabled = localStateRepository.isQuickPrivacyEnabled
+
+ fun toggle(): Boolean {
+ val newState = !localStateRepository.isQuickPrivacyEnabled
+ localStateRepository.isQuickPrivacyEnabled = newState
+ return newState
+ }
}
diff --git a/app/src/main/java/foundation/e/privacycentralapp/dummy/CityDataSource.kt b/app/src/main/java/foundation/e/privacycentralapp/dummy/CityDataSource.kt
index 3bb2f12..988c7f4 100644
--- a/app/src/main/java/foundation/e/privacycentralapp/dummy/CityDataSource.kt
+++ b/app/src/main/java/foundation/e/privacycentralapp/dummy/CityDataSource.kt
@@ -17,6 +17,7 @@
package foundation.e.privacycentralapp.dummy
+import foundation.e.privacycentralapp.domain.entities.LocationMode
import kotlin.random.Random
data class City(val name: String, val latitude: Double, val longitude: Double) {
diff --git a/app/src/main/java/foundation/e/privacycentralapp/dummy/DummyDataSource.kt b/app/src/main/java/foundation/e/privacycentralapp/dummy/DummyDataSource.kt
index fe61354..246854b 100644
--- a/app/src/main/java/foundation/e/privacycentralapp/dummy/DummyDataSource.kt
+++ b/app/src/main/java/foundation/e/privacycentralapp/dummy/DummyDataSource.kt
@@ -18,6 +18,8 @@
package foundation.e.privacycentralapp.dummy
import foundation.e.privacycentralapp.R
+import foundation.e.privacycentralapp.domain.entities.InternetPrivacyMode
+import foundation.e.privacycentralapp.domain.entities.LocationMode
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlin.random.Random
@@ -52,14 +54,6 @@ data class Permission(
val packagesAllowed: Set<String> = emptySet()
)
-enum class LocationMode {
- REAL_LOCATION, RANDOM_LOCATION, CUSTOM_LOCATION
-}
-
-enum class InternetPrivacyMode {
- REAL_IP, HIDE_IP
-}
-
data class Location(val mode: LocationMode, val latitude: Double, val longitude: Double)
object DummyDataSource {
diff --git a/app/src/main/java/foundation/e/privacycentralapp/dummy/Extensions.kt b/app/src/main/java/foundation/e/privacycentralapp/dummy/Extensions.kt
index 133ad84..91a52ca 100644
--- a/app/src/main/java/foundation/e/privacycentralapp/dummy/Extensions.kt
+++ b/app/src/main/java/foundation/e/privacycentralapp/dummy/Extensions.kt
@@ -19,6 +19,8 @@ package foundation.e.privacycentralapp.dummy
import android.content.Context
import foundation.e.privacycentralapp.R
+import foundation.e.privacycentralapp.domain.entities.InternetPrivacyMode
+import foundation.e.privacycentralapp.domain.entities.LocationMode
fun LocationMode.mapToString(context: Context): String = when (this) {
LocationMode.REAL_LOCATION -> context.getString(R.string.real_location_mode)
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 c26fce1..a461b65 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
@@ -22,15 +22,11 @@ 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.dummy.DummyDataSource
-import foundation.e.privacycentralapp.dummy.InternetPrivacyMode
-import foundation.e.privacycentralapp.dummy.LocationMode
-import foundation.e.privacycentralapp.dummy.TrackersDataSource
+import foundation.e.privacycentralapp.domain.entities.InternetPrivacyMode
+import foundation.e.privacycentralapp.domain.entities.LocationMode
+import foundation.e.privacycentralapp.domain.usecases.GetQuickPrivacyStateUseCase
import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.flowOf
-import kotlinx.coroutines.flow.map
-import kotlinx.coroutines.flow.merge
// Define a state machine for Dashboard Feature
class DashboardFeature(
@@ -46,20 +42,23 @@ class DashboardFeature(
initialState, actor, reducer, coroutineScope, { message -> Log.d("DashboardFeature", message) },
singleEventProducer
) {
- sealed class State {
- object InitialState : State()
- object LoadingDashboardState : State()
- data class DashboardState(
- val trackersCount: Int,
- val activeTrackersCount: Int,
- val totalApps: Int,
- val permissionCount: Int,
- val appsUsingLocationPerm: Int,
- val locationMode: LocationMode,
- val internetPrivacyMode: InternetPrivacyMode
+ sealed class State() {
+ object LoadingState : State()
+ data class DisabledState(
+ val totalGraph: Int = 230,
+ // val graphData
+ val trackersCount: Int = 77,
+ val activeTrackersCount: Int = 22
+ ) : State()
+ data class EnabledState(
+ val isAllTrackersBlocked: Boolean = false,
+ val locationMode: LocationMode = LocationMode.CUSTOM_LOCATION,
+ val internetPrivacyMode: InternetPrivacyMode,
+ val totalGraph: Int = 150,
+ // val graphData
+ val trackersCount: Int = 80,
+ val activeTrackersCount: Int = 10
) : State()
-
- object QuickProtectionState : State()
}
sealed class SingleEvent {
@@ -71,9 +70,10 @@ class DashboardFeature(
}
sealed class Action {
- object ShowQuickPrivacyProtectionInfoAction : Action()
- object ObserveDashboardAction : Action()
- object ShowDashboardAction : Action()
+ object TogglePrivacyAction : Action()
+ // object ShowQuickPrivacyProtectionInfoAction : Action()
+ // object ObserveDashboardAction : Action()
+ // object ShowDashboardAction : Action()
object ShowFakeMyLocationAction : Action()
object ShowInternetActivityPrivacyAction : Action()
object ShowAppsPermissions : Action()
@@ -81,6 +81,8 @@ class DashboardFeature(
}
sealed class Effect {
+ data class UpdateStateEffect(val isEnabled: Boolean) : Effect()
+
object OpenQuickPrivacyProtectionEffect : Effect()
data class OpenDashboardEffect(
val trackersCount: Int,
@@ -98,6 +100,7 @@ class DashboardFeature(
data class UpdateLocationModeEffect(val mode: LocationMode) : Effect()
data class UpdateInternetActivityModeEffect(val mode: InternetPrivacyMode) : Effect()
data class UpdateAppsUsingLocationPermEffect(val apps: Int) : Effect()
+
object OpenFakeMyLocationEffect : Effect()
object OpenInternetActivityPrivacyEffect : Effect()
object OpenAppsPermissionsEffect : Effect()
@@ -105,14 +108,38 @@ class DashboardFeature(
}
companion object {
- fun create(initialState: State, coroutineScope: CoroutineScope): DashboardFeature =
+ fun create(
+ coroutineScope: CoroutineScope,
+ getPrivacyStateUseCase: GetQuickPrivacyStateUseCase
+ ): DashboardFeature =
DashboardFeature(
- initialState,
+ initialState = State.DisabledState(),
coroutineScope,
reducer = { state, effect ->
- when (effect) {
- Effect.OpenQuickPrivacyProtectionEffect -> State.QuickProtectionState
- is Effect.OpenDashboardEffect -> State.DashboardState(
+ if (state is State.LoadingState) state
+ else when (effect) {
+ is Effect.UpdateStateEffect -> when {
+ effect.isEnabled && state is State.EnabledState
+ || !effect.isEnabled && state is State.DisabledState -> state
+ effect.isEnabled && state is State.DisabledState -> State.EnabledState(
+ isAllTrackersBlocked = false,
+ locationMode = LocationMode.REAL_LOCATION,
+ internetPrivacyMode = InternetPrivacyMode.REAL_IP,
+ totalGraph = state.totalGraph,
+ // val graphData
+ trackersCount = state.trackersCount,
+ activeTrackersCount = state.activeTrackersCount
+ )
+ !effect.isEnabled && state is State.EnabledState -> State.DisabledState(
+ totalGraph = state.totalGraph,
+ // val graphData
+ trackersCount = state.trackersCount,
+ activeTrackersCount = state.activeTrackersCount
+ )
+ else -> state
+ }
+
+ /*is Effect.OpenDashboardEffect -> State.DashboardState(
effect.trackersCount,
effect.activeTrackersCount,
effect.totalApps,
@@ -120,46 +147,57 @@ class DashboardFeature(
effect.appsUsingLocationPerm,
effect.locationMode,
effect.internetPrivacyMode
- )
- Effect.LoadingDashboardEffect -> {
- if (state is State.InitialState) {
- State.LoadingDashboardState
- } else state
- }
- is Effect.UpdateActiveTrackersCountEffect -> {
- if (state is State.DashboardState) {
- state.copy(activeTrackersCount = effect.count)
- } else state
- }
- is Effect.UpdateTotalTrackersCountEffect -> {
- if (state is State.DashboardState) {
- state.copy(trackersCount = effect.count)
- } else state
- }
- is Effect.UpdateInternetActivityModeEffect -> {
- if (state is State.DashboardState) {
- state.copy(internetPrivacyMode = effect.mode)
- } else state
- }
- is Effect.UpdateLocationModeEffect -> {
- if (state is State.DashboardState) {
- state.copy(locationMode = effect.mode)
+ )
+ Effect.LoadingDashboardEffect -> {
+ if (state is State.InitialState) {
+ State.LoadingDashboardState
+ } else state
+ }
+ is Effect.UpdateActiveTrackersCountEffect -> {
+ if (state is State.DashboardState) {
+ state.copy(activeTrackersCount = effect.count)
+ } else state
+ }
+ is Effect.UpdateTotalTrackersCountEffect -> {
+ if (state is State.DashboardState) {
+ state.copy(trackersCount = effect.count)
+ } else state
+ }
+ is Effect.UpdateInternetActivityModeEffect -> {
+ if (state is State.DashboardState) {
+ state.copy(internetPrivacyMode = effect.mode)
+ } else state
+ }
+ is Effect.UpdateLocationModeEffect -> {
+ if (state is State.DashboardState) {
+ state.copy(locationMode = effect.mode)
+ } else state
+ }
+ is Effect.UpdateAppsUsingLocationPermEffect -> if (state is State.DashboardState) {
+ state.copy(appsUsingLocationPerm = effect.apps)
} else state
- }
- is Effect.UpdateAppsUsingLocationPermEffect -> if (state is State.DashboardState) {
- state.copy(appsUsingLocationPerm = effect.apps)
- } else state
- Effect.OpenFakeMyLocationEffect -> state
- Effect.OpenAppsPermissionsEffect -> state
- Effect.OpenInternetActivityPrivacyEffect -> state
- Effect.OpenTrackersEffect -> state
+ Effect.OpenFakeMyLocationEffect -> state
+ Effect.OpenAppsPermissionsEffect -> state
+ Effect.OpenInternetActivityPrivacyEffect -> state
+ Effect.OpenTrackersEffect -> state
+ */
+
+ else -> state
}
},
- actor = { _: State, action: Action ->
+ actor = { state: State, action: Action ->
Log.d("Feature", "action: $action")
when (action) {
- Action.ObserveDashboardAction -> merge(
+ Action.TogglePrivacyAction -> {
+ if (state != State.LoadingState) {
+ flowOf(Effect.UpdateStateEffect(getPrivacyStateUseCase.toggle()))
+ } else {
+ flowOf(Effect.UpdateStateEffect(getPrivacyStateUseCase.isQuickPrivacyEnabled))
+ }
+ }
+
+ /*Action.ObserveDashboardAction -> merge(
TrackersDataSource.trackers.map {
var activeTrackersCount: Int = 0
outer@ for (tracker in it) {
@@ -201,7 +239,7 @@ class DashboardFeature(
DummyDataSource.internetActivityMode.value
)
)
- }
+ }*/
Action.ShowFakeMyLocationAction -> flowOf(Effect.OpenFakeMyLocationEffect)
Action.ShowAppsPermissions -> flowOf(Effect.OpenAppsPermissionsEffect)
Action.ShowInternetActivityPrivacyAction -> flowOf(
@@ -212,17 +250,17 @@ class DashboardFeature(
},
singleEventProducer = { state, _, effect ->
Log.d("DashboardFeature", "$state, $effect")
- if (state is State.DashboardState && effect is Effect.OpenFakeMyLocationEffect)
- SingleEvent.NavigateToLocationSingleEvent
- else if (state is State.QuickProtectionState && effect is Effect.OpenQuickPrivacyProtectionEffect)
- SingleEvent.NavigateToQuickProtectionSingleEvent
- else if (state is State.DashboardState && effect is Effect.OpenInternetActivityPrivacyEffect)
- SingleEvent.NavigateToInternetActivityPrivacySingleEvent
- else if (state is State.DashboardState && effect is Effect.OpenAppsPermissionsEffect)
- SingleEvent.NavigateToPermissionsSingleEvent
- else if (state is State.DashboardState && effect is Effect.OpenTrackersEffect)
- SingleEvent.NavigateToTrackersSingleEvent
- else null
+ when (effect) {
+ is Effect.OpenFakeMyLocationEffect ->
+ SingleEvent.NavigateToLocationSingleEvent
+ is Effect.OpenInternetActivityPrivacyEffect ->
+ SingleEvent.NavigateToInternetActivityPrivacySingleEvent
+ is Effect.OpenAppsPermissionsEffect ->
+ SingleEvent.NavigateToPermissionsSingleEvent
+ is Effect.OpenTrackersEffect ->
+ SingleEvent.NavigateToTrackersSingleEvent
+ else -> null
+ }
}
)
}
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 e7ce353..3e47a18 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
@@ -17,36 +17,50 @@
package foundation.e.privacycentralapp.features.dashboard
+import android.content.Intent
import android.graphics.Color
import android.os.Bundle
import android.text.Spannable
import android.text.SpannableString
import android.text.style.ForegroundColorSpan
import android.view.View
-import android.widget.ProgressBar
-import android.widget.RelativeLayout
import android.widget.TextView
-import androidx.core.widget.NestedScrollView
+import androidx.core.content.ContextCompat.getColor
import androidx.fragment.app.activityViewModels
import androidx.fragment.app.add
import androidx.fragment.app.commit
import androidx.lifecycle.lifecycleScope
import foundation.e.flowmvi.MVIView
+import foundation.e.privacycentralapp.DependencyContainer
+import foundation.e.privacycentralapp.PrivacyCentralApplication
import foundation.e.privacycentralapp.R
-import foundation.e.privacycentralapp.common.ToolbarFragment
-import foundation.e.privacycentralapp.dummy.mapToString
+import foundation.e.privacycentralapp.common.NavToolbarFragment
+import foundation.e.privacycentralapp.databinding.FragmentDashboardBinding
+import foundation.e.privacycentralapp.domain.entities.InternetPrivacyMode
+import foundation.e.privacycentralapp.domain.entities.LocationMode
+import foundation.e.privacycentralapp.extensions.viewModelProviderFactoryOf
+import foundation.e.privacycentralapp.features.dashboard.DashboardFeature.State.DisabledState
+import foundation.e.privacycentralapp.features.dashboard.DashboardFeature.State.EnabledState
+import foundation.e.privacycentralapp.features.dashboard.DashboardFeature.State.LoadingState
import foundation.e.privacycentralapp.features.internetprivacy.InternetPrivacyFragment
import foundation.e.privacycentralapp.features.location.FakeLocationFragment
-import foundation.e.privacycentralapp.features.permissions.PermissionsFragment
import foundation.e.privacycentralapp.features.trackers.TrackersFragment
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.collect
class DashboardFragment :
- ToolbarFragment(R.layout.fragment_dashboard),
+ NavToolbarFragment(R.layout.fragment_dashboard),
MVIView<DashboardFeature.State, DashboardFeature.Action> {
- private val viewModel: DashboardViewModel by activityViewModels()
+ private val dependencyContainer: DependencyContainer by lazy {
+ (this.requireActivity().application as PrivacyCentralApplication).dependencyContainer
+ }
+
+ private val viewModel: DashboardViewModel by activityViewModels {
+ viewModelProviderFactoryOf { dependencyContainer.dashBoardViewModelFactory.create() }
+ }
+
+ private lateinit var binding: FragmentDashboardBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@@ -78,11 +92,8 @@ class DashboardFragment :
}
}
is DashboardFeature.SingleEvent.NavigateToPermissionsSingleEvent -> {
- requireActivity().supportFragmentManager.commit {
- add<PermissionsFragment>(R.id.container)
- setReorderingAllowed(true)
- addToBackStack("dashboard")
- }
+ val intent = Intent("android.intent.action.MANAGE_PERMISSIONS")
+ requireActivity().startActivity(intent)
}
DashboardFeature.SingleEvent.NavigateToTrackersSingleEvent -> {
requireActivity().supportFragmentManager.commit {
@@ -94,35 +105,37 @@ class DashboardFragment :
}
}
}
- lifecycleScope.launchWhenStarted {
- viewModel.submitAction(DashboardFeature.Action.ShowDashboardAction)
- viewModel.submitAction(DashboardFeature.Action.ObserveDashboardAction)
- }
+ // lifecycleScope.launchWhenStarted {
+ // viewModel.submitAction(DashboardFeature.Action.ShowDashboardAction)
+ // viewModel.submitAction(DashboardFeature.Action.ObserveDashboardAction)
+ // }
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
- addClickToMore(view.findViewById(R.id.personal_leakag_info))
- view.let {
- it.findViewById<TextView>(R.id.tap_to_enable_quick_protection).setOnClickListener {
- viewModel.submitAction(DashboardFeature.Action.ShowQuickPrivacyProtectionInfoAction)
- }
- it.findViewById<RelativeLayout>(R.id.my_location).setOnClickListener {
- viewModel.submitAction(DashboardFeature.Action.ShowFakeMyLocationAction)
- }
- it.findViewById<RelativeLayout>(R.id.internet_activity_privacy).setOnClickListener {
- viewModel.submitAction(DashboardFeature.Action.ShowInternetActivityPrivacyAction)
- }
- it.findViewById<RelativeLayout>(R.id.apps_permissions).setOnClickListener {
- viewModel.submitAction(DashboardFeature.Action.ShowAppsPermissions)
- }
- it.findViewById<RelativeLayout>(R.id.am_i_tracked).setOnClickListener {
- viewModel.submitAction(DashboardFeature.Action.ShowTrackers)
- }
+ binding = FragmentDashboardBinding.bind(view)
+
+ binding.togglePrivacyCentral.setOnClickListener {
+ viewModel.submitAction(DashboardFeature.Action.TogglePrivacyAction)
+ }
+ binding.myLocation.container.setOnClickListener {
+ viewModel.submitAction(DashboardFeature.Action.ShowFakeMyLocationAction)
+ }
+ binding.internetActivityPrivacy.container.setOnClickListener {
+ viewModel.submitAction(DashboardFeature.Action.ShowInternetActivityPrivacyAction)
+ }
+ binding.appsPermissions.container.setOnClickListener {
+ viewModel.submitAction(DashboardFeature.Action.ShowAppsPermissions)
+ }
+
+ binding.amITracked.container.setOnClickListener {
+ viewModel.submitAction(DashboardFeature.Action.ShowTrackers)
}
}
- override fun getTitle(): String = getString(R.string.privacy_dashboard)
+ override fun getTitle(): String {
+ return getString(R.string.dashboard_title)
+ }
private fun addClickToMore(textView: TextView) {
val clickToMore = SpannableString(getString(R.string.click_to_learn_more))
@@ -136,65 +149,96 @@ class DashboardFragment :
}
override fun render(state: DashboardFeature.State) {
- when (state) {
- is DashboardFeature.State.InitialState, is DashboardFeature.State.LoadingDashboardState -> {
- view?.let {
- it.findViewById<ProgressBar>(R.id.loadingSpinner).visibility = View.VISIBLE
- it.findViewById<NestedScrollView>(R.id.scrollContainer).visibility = View.GONE
- }
- }
- is DashboardFeature.State.DashboardState -> {
- view?.let { view ->
- view.findViewById<ProgressBar>(R.id.loadingSpinner).visibility = View.GONE
- view.findViewById<NestedScrollView>(R.id.scrollContainer).visibility =
- View.VISIBLE
- view.findViewById<TextView>(R.id.am_i_tracked_subtitle).text = getString(
- R.string.am_i_tracked_subtitle,
- state.trackersCount,
- state.activeTrackersCount
- )
- view.findViewById<TextView>(R.id.apps_permissions_subtitle).text = getString(
- R.string.apps_permissions_subtitle,
- state.totalApps,
- state.permissionCount
- )
- view.findViewById<TextView>(R.id.my_location_subtitle).let { textView ->
- textView.text = getString(
- R.string.my_location_subtitle,
- state.appsUsingLocationPerm,
- )
- textView.append(
- SpannableString(state.locationMode.mapToString(requireContext()))
- .also {
- it.setSpan(
- ForegroundColorSpan(Color.parseColor("#007fff")),
- 0,
- it.length,
- Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
- )
- }
- )
- }
- view.findViewById<TextView>(R.id.internet_activity_privacy_subtitle)
- .let { textView ->
- textView.text = getString(R.string.internet_activity_privacy_subtitle)
- textView.append(
- SpannableString(state.internetPrivacyMode.mapToString(requireContext()))
- .also {
- it.setSpan(
- ForegroundColorSpan(Color.parseColor("#007fff")),
- 0,
- it.length,
- Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
- )
- }
- )
- }
- }
- }
- DashboardFeature.State.QuickProtectionState -> {
- }
+ val enabled = state is EnabledState
+ binding.stateLabel.text = getString(
+ if (enabled) R.string.dashboard_state_label_on
+ else R.string.dashboard_state_label_off
+ )
+
+ binding.togglePrivacyCentral.setImageResource(
+ if (enabled) R.drawable.ic_quick_privacy_on
+ else R.drawable.ic_quick_privacy_off
+ )
+ binding.stateLabel.setTextColor(
+ getColor(
+ requireContext(),
+ if (enabled) R.color.green_on
+ else R.color.orange_off
+ )
+ )
+
+ val trackersEnabled = state is EnabledState &&
+ state.isAllTrackersBlocked
+ binding.stateTrackers.text = getString(
+ if (trackersEnabled) R.string.dashboard_state_trackers_on
+ else R.string.dashboard_state_trackers_off
+ )
+ binding.stateTrackers.setTextColor(
+ getColor(
+ requireContext(),
+ if (trackersEnabled) R.color.green_on
+ else R.color.black_text
+ )
+ )
+
+ val geolocEnabled = state is EnabledState && state.locationMode != LocationMode.REAL_LOCATION
+ binding.stateGeolocation.text = getString(
+ if (geolocEnabled) R.string.dashboard_state_geolocation_on
+ else R.string.dashboard_state_geolocation_off
+ )
+ binding.stateGeolocation.setTextColor(
+ getColor(
+ requireContext(),
+ if (geolocEnabled) R.color.green_on
+ else R.color.black_text
+ )
+ )
+
+ val ipAddressEnabled = state is EnabledState && state.internetPrivacyMode != InternetPrivacyMode.REAL_IP
+ binding.stateIpAddress.text = getString(
+ if (ipAddressEnabled) R.string.dashboard_state_ipaddress_on
+ else R.string.dashboard_state_ipaddress_off
+ )
+ binding.stateIpAddress.setTextColor(
+ getColor(
+ requireContext(),
+ if (ipAddressEnabled) R.color.green_on
+ else R.color.black_text
+ )
+ )
+
+ // 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)
+ // }
+
+ binding.amITracked.subtitle.text = if (state == LoadingState) ""
+ else {
+ val value = if (state is EnabledState) state.activeTrackersCount
+ else if (state is DisabledState) state.activeTrackersCount
+ else 0 // dummy
+ getString(R.string.dashboard_am_i_tracked_subtitle, 77, value)
}
+
+ binding.myLocation.subtitle.text = getString(
+ if (state is EnabledState &&
+ state.locationMode != LocationMode.REAL_LOCATION
+ )
+ R.string.dashboard_location_subtitle_on
+ else R.string.dashboard_location_subtitle_off
+ )
+
+ binding.internetActivityPrivacy.subtitle.text = getString(
+ if (state is DashboardFeature.State.EnabledState &&
+ state.internetPrivacyMode != InternetPrivacyMode.REAL_IP
+ )
+ R.string.dashboard_internet_activity_privacy_subtitle_on
+ else R.string.dashboard_internet_activity_privacy_subtitle_on
+ )
}
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 3aa104e..c25f215 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
@@ -19,19 +19,23 @@ package foundation.e.privacycentralapp.features.dashboard
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
+import foundation.e.privacycentralapp.common.Factory
+import foundation.e.privacycentralapp.domain.usecases.GetQuickPrivacyStateUseCase
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.asSharedFlow
import kotlinx.coroutines.launch
-class DashboardViewModel : ViewModel() {
+class DashboardViewModel(
+ private val getPrivacyStateUseCase: GetQuickPrivacyStateUseCase
+) : ViewModel() {
private val _actions = MutableSharedFlow<DashboardFeature.Action>()
val actions = _actions.asSharedFlow()
val dashboardFeature: DashboardFeature by lazy {
DashboardFeature.create(
- DashboardFeature.State.InitialState,
- coroutineScope = viewModelScope
+ coroutineScope = viewModelScope,
+ getPrivacyStateUseCase = getPrivacyStateUseCase
)
}
@@ -41,3 +45,11 @@ class DashboardViewModel : ViewModel() {
}
}
}
+
+class DashBoardViewModelFactory(
+ private val getPrivacyStateUseCase: GetQuickPrivacyStateUseCase
+) : Factory<DashboardViewModel> {
+ override fun create(): DashboardViewModel {
+ return DashboardViewModel(getPrivacyStateUseCase)
+ }
+}
diff --git a/app/src/main/java/foundation/e/privacycentralapp/features/dashboard/QuickProtectionFragment.kt b/app/src/main/java/foundation/e/privacycentralapp/features/dashboard/QuickProtectionFragment.kt
index 727afa9..981c8da 100644
--- a/app/src/main/java/foundation/e/privacycentralapp/features/dashboard/QuickProtectionFragment.kt
+++ b/app/src/main/java/foundation/e/privacycentralapp/features/dashboard/QuickProtectionFragment.kt
@@ -32,7 +32,7 @@ class QuickProtectionFragment : NavToolbarFragment(R.layout.fragment_quick_prote
override fun onAttach(context: Context) {
super.onAttach(context)
requireActivity().onBackPressedDispatcher.addCallback(this, true) {
- viewModel.submitAction(DashboardFeature.Action.ShowDashboardAction)
+ // viewModel.submitAction(DashboardFeature.Action.ShowDashboardAction)
this.isEnabled = false
requireActivity().onBackPressed()
}
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 41ce9ad..cbe0a04 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
@@ -239,19 +239,6 @@ class InternetPrivacyFeature(
action is Action.UseHiddenIPAction
&& effect is Effect.ShowAndroidVpnDisclaimerEffect ->
SingleEvent.StartAndroidVpnActivityEvent(effect.intent)
-
- // Action.UseRealIPAction, Action.UseHiddenIPAction -> when (effect) {
- // is Effect.ModeUpdatedEffect -> {
- // if (effect.mode == InternetPrivacyMode.REAL_IP) {
- // SingleEvent.RealIPSelectedEvent
- // } else {
- // SingleEvent.HiddenIPSelectedEvent
- // }
- // }
- // is Effect.ErrorEffect -> {
- // SingleEvent.ErrorEvent(effect.message)
- // }
- // }
else -> null
}
}
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 22e63e3..c2be7b1 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
@@ -35,8 +35,8 @@ import foundation.e.flowmvi.MVIView
import foundation.e.privacycentralapp.DependencyContainer
import foundation.e.privacycentralapp.PrivacyCentralApplication
import foundation.e.privacycentralapp.R
-import foundation.e.privacycentralapp.common.NavToolbarFragment
import foundation.e.privacycentralapp.common.ToggleAppsAdapter
+import foundation.e.privacycentralapp.common.ToolbarFragment
import foundation.e.privacycentralapp.extensions.viewModelProviderFactoryOf
import foundation.e.privacymodules.ipscramblermodule.IIpScramblerModule
import kotlinx.coroutines.flow.Flow
@@ -44,7 +44,7 @@ import kotlinx.coroutines.flow.collect
import java.util.Locale
class InternetPrivacyFragment :
- NavToolbarFragment(R.layout.fragment_internet_activity_policy),
+ ToolbarFragment(R.layout.fragment_internet_activity_policy),
MVIView<InternetPrivacyFeature.State, InternetPrivacyFeature.Action> {
private val dependencyContainer: DependencyContainer by lazy {
diff --git a/app/src/main/java/foundation/e/privacycentralapp/features/location/FakeLocationFeature.kt b/app/src/main/java/foundation/e/privacycentralapp/features/location/FakeLocationFeature.kt
index 9124f85..e9fb078 100644
--- a/app/src/main/java/foundation/e/privacycentralapp/features/location/FakeLocationFeature.kt
+++ b/app/src/main/java/foundation/e/privacycentralapp/features/location/FakeLocationFeature.kt
@@ -23,10 +23,10 @@ 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.LocationMode
import foundation.e.privacycentralapp.dummy.CityDataSource
import foundation.e.privacycentralapp.dummy.DummyDataSource
import foundation.e.privacycentralapp.dummy.Location
-import foundation.e.privacycentralapp.dummy.LocationMode
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.flowOf
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 7281afc..bb9bd26 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
@@ -56,7 +56,7 @@ import foundation.e.privacycentralapp.DependencyContainer
import foundation.e.privacycentralapp.PrivacyCentralApplication
import foundation.e.privacycentralapp.R
import foundation.e.privacycentralapp.common.NavToolbarFragment
-import foundation.e.privacycentralapp.dummy.LocationMode
+import foundation.e.privacycentralapp.domain.entities.LocationMode
import foundation.e.privacycentralapp.extensions.viewModelProviderFactoryOf
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
@@ -178,7 +178,7 @@ class FakeLocationFragment :
Mapbox.getInstance(requireContext(), getString(R.string.mapbox_key))
}
- override fun getTitle(): String = getString(R.string.my_location_title)
+ override fun getTitle(): String = getString(R.string.dashboard_location_title)
private fun displayToast(message: String) {
Toast.makeText(requireContext(), message, Toast.LENGTH_SHORT)
diff --git a/app/src/main/res/drawable/ic_apps_permissions.xml b/app/src/main/res/drawable/ic_apps_permissions.xml
index b7eb1ab..5e7a570 100644
--- a/app/src/main/res/drawable/ic_apps_permissions.xml
+++ b/app/src/main/res/drawable/ic_apps_permissions.xml
@@ -1,22 +1,16 @@
-<!--
- ~ Copyright (C) 2021 E FOUNDATION
- ~
- ~ This program is free software: you can redistribute it and/or modify
- ~ it under the terms of the GNU General Public License as published by
- ~ the Free Software Foundation, either version 3 of the License, or
- ~ (at your option) any later version.
- ~
- ~ This program is distributed in the hope that it will be useful,
- ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
- ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- ~ GNU General Public License for more details.
- ~
- ~ You should have received a copy of the GNU General Public License
- ~ along with this program. If not, see <https://www.gnu.org/licenses/>.
- -->
-
-<vector android:height="23.99944dp" android:viewportHeight="42.738"
- android:viewportWidth="42.739" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
- <path android:fillColor="#fb3846" android:pathData="M42.74,5L42.74,37.738A5,5 0,0 1,37.74 42.738L5.001,42.738A5,5 0,0 1,0.001 37.738L0.001,5A5,5 0,0 1,5.001 0L37.74,0A5,5 0,0 1,42.74 5z"/>
- <path android:fillColor="#fff" android:pathData="M37.541,20.967l-6.692,-2.579v-7.529a2.638,2.638 0,0 0,-1.673 -2.37l-6.972,-2.579a2.5,2.5 0,0 0,-1.743 0l-6.972,2.579a2.638,2.638 0,0 0,-1.673 2.37v7.529l-6.693,2.579a2.41,2.41 0,0 0,-1.6 2.3v7.668a2.529,2.529 0,0 0,1.324 2.3l6.972,3.486a2.66,2.66 0,0 0,2.3 0l7.25,-3.625 7.181,3.625a2.66,2.66 0,0 0,2.3 0l6.971,-3.486a2.589,2.589 0,0 0,1.394 -2.3v-7.668a2.474,2.474 0,0 0,-1.674 -2.3zM28.478,18.457l-5.926,2.231v-4.741l5.926,-2.579zM14.256,10.789l7.111,-2.719 7.111,2.719 -7.111,2.928zM20.112,31.076l-5.926,2.928v-5.507l5.926,-2.719zM20.112,23.268l-7.111,2.858 -7.111,-2.858v-0.07l7.111,-2.649 7.111,2.649zM36.844,31.076l-5.926,2.928v-5.507l5.926,-2.719zM36.844,23.268l-7.111,2.858 -7.111,-2.858v-0.07l7.111,-2.649 7.111,2.649z"/>
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="32dp"
+ android:height="32dp"
+ android:viewportWidth="32"
+ android:viewportHeight="32">
+ <path
+ android:pathData="M25.2477,32H6.7523C3.0261,32 0,28.9739 0,25.2477V6.7523C0,3.0261 3.0261,0 6.7523,0H25.2477C28.9739,0 32,3.0261 32,6.7523V25.2477C32,28.9739 28.9739,32 25.2477,32Z"
+ android:fillColor="#2CCF69"/>
+ <path
+ android:pathData="M15.5561,11.2783C16.4042,11.2783 17.0917,10.5908 17.0917,9.7427C17.0917,8.8946 16.4042,8.207 15.5561,8.207C14.708,8.207 14.0204,8.8946 14.0204,9.7427C14.0204,10.5908 14.708,11.2783 15.5561,11.2783Z"
+ android:fillColor="#ffffff"/>
+ <path
+ android:pathData="M9.0081,11.2376C9.1878,7.7463 12.1103,4.9745 15.607,5.0002L15.6126,5.0002C19.1791,5.0515 22.0825,7.9509 22.0825,11.5492C22.0825,13.8682 20.8794,15.9216 19.0338,17.0852V23.6536C19.0338,25.4451 17.5734,26.9056 15.7819,26.9056H12.8461C12.4096,26.9056 12.0557,26.5517 12.0557,26.1152V22.4567C12.0557,22.0202 12.4096,21.6663 12.8461,21.6663H13.5913V20.3565H12.8461C12.4096,20.3565 12.0557,20.0027 12.0557,19.5661V17.0835C10.138,15.8679 8.8878,13.6911 9.008,11.2395L9.0081,11.2376ZM13.6365,18.7757H14.3818C14.8183,18.7757 15.1722,19.1296 15.1722,19.5661V22.4567C15.1722,22.8933 14.8183,23.2471 14.3818,23.2471H13.6365V25.3248H15.7819C16.7003,25.3248 17.453,24.5721 17.453,23.6536V16.6304C17.453,16.3379 17.6145,16.0694 17.8728,15.9322C19.4504,15.0947 20.5017,13.4398 20.5017,11.5492C20.5017,8.8252 18.3029,6.6214 15.5926,6.5809C12.9483,6.563 10.7237,8.6679 10.5868,11.3179C10.4901,13.2992 11.5766,15.0536 13.2194,15.9336C13.4762,16.0712 13.6365,16.339 13.6365,16.6304V18.7757Z"
+ android:fillColor="#ffffff"
+ android:fillType="evenOdd"/>
</vector>
diff --git a/app/src/main/res/drawable/ic_internet_activity.xml b/app/src/main/res/drawable/ic_internet_activity.xml
index ef34960..83695ad 100644
--- a/app/src/main/res/drawable/ic_internet_activity.xml
+++ b/app/src/main/res/drawable/ic_internet_activity.xml
@@ -1,22 +1,28 @@
-<!--
- ~ Copyright (C) 2021 E FOUNDATION
- ~
- ~ This program is free software: you can redistribute it and/or modify
- ~ it under the terms of the GNU General Public License as published by
- ~ the Free Software Foundation, either version 3 of the License, or
- ~ (at your option) any later version.
- ~
- ~ This program is distributed in the hope that it will be useful,
- ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
- ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- ~ GNU General Public License for more details.
- ~
- ~ You should have received a copy of the GNU General Public License
- ~ along with this program. If not, see <https://www.gnu.org/licenses/>.
- -->
-
-<vector android:height="23.99944dp" android:viewportHeight="42.738"
- android:viewportWidth="42.739" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
- <path android:fillColor="#38d874" android:pathData="M42.74,5L42.74,37.738A5,5 0,0 1,37.74 42.738L5.001,42.738A5,5 0,0 1,0.001 37.738L0.001,5A5,5 0,0 1,5.001 0L37.74,0A5,5 0,0 1,42.74 5z"/>
- <path android:fillColor="#fff" android:pathData="M36.109,7.096h-29.3a3.052,3.052 0,0 0,-3.052 3.052v22.379a3.013,3.013 0,0 0,3.052 3.052h29.3a3.052,3.052 0,0 0,3.052 -3.052v-22.374a3.094,3.094 0,0 0,-3.052 -3.057zM11.896,14.471a0.773,0.773 0,0 1,-0.763 0.763h-2.543a0.735,0.735 0,0 1,-0.763 -0.763v-2.543a0.773,0.773 0,0 1,0.763 -0.763h2.543a0.82,0.82 0,0 1,0.763 0.763zM35.096,14.471a0.773,0.773 0,0 1,-0.763 0.763h-15.768a0.735,0.735 0,0 1,-0.763 -0.763v-2.543a0.773,0.773 0,0 1,0.763 -0.763h15.768a0.82,0.82 0,0 1,0.763 0.763z"/>
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="32dp"
+ android:height="32dp"
+ android:viewportWidth="32"
+ android:viewportHeight="32">
+ <path
+ android:pathData="M25.2477,32H6.7523C3.0261,32 0,28.9739 0,25.2477V6.7523C0,3.0261 3.0261,0 6.7523,0H25.2477C28.9739,0 32,3.0261 32,6.7523V25.2477C32,28.9739 28.9739,32 25.2477,32Z"
+ android:fillColor="#E83A52"/>
+ <group>
+ <clip-path
+ android:pathData="M4.8222,4.9889h22.3556v22.0222h-22.3556z"/>
+ <path
+ android:pathData="M15.2445,6.5444C10.3407,6.5444 6.3778,10.5073 6.3778,15.4111C6.3778,20.3149 10.3407,24.2778 15.2445,24.2778C15.5862,24.2778 15.8679,24.2767 16.1417,24.2402C16.5675,24.1834 16.9586,24.4825 17.0154,24.9083C17.0722,25.3341 16.773,25.7253 16.3473,25.7821C15.9624,25.8334 15.5852,25.8334 15.2645,25.8333H15.2445C9.4816,25.8333 4.8222,21.174 4.8222,15.4111C4.8222,9.6482 9.4816,4.9889 15.2445,4.9889C19.8085,4.9889 23.6734,7.9197 25.0899,11.977C25.2315,12.3825 25.0175,12.8261 24.6119,12.9677C24.2064,13.1092 23.7628,12.8952 23.6213,12.4897C22.4155,9.0358 19.1249,6.5444 15.2445,6.5444Z"
+ android:fillColor="#ffffff"
+ android:fillType="evenOdd"/>
+ <path
+ android:pathData="M13.5411,5.7011C13.6019,5.2758 13.9958,4.9804 14.4211,5.0411L14.3111,5.8111C14.4211,5.0411 14.4216,5.0412 14.4222,5.0413L14.4233,5.0414L14.4257,5.0418L14.431,5.0426C14.4348,5.0432 14.439,5.0439 14.4437,5.0446C14.453,5.0462 14.4641,5.0482 14.4768,5.0506C14.5022,5.0555 14.5343,5.0623 14.5719,5.0717C14.6467,5.0904 14.7456,5.1199 14.8583,5.1656C15.0811,5.2558 15.3777,5.4176 15.6411,5.7032C16.2182,6.3287 16.4313,7.3064 15.9836,8.6751L15.9829,8.6774C15.7301,9.442 15.3812,10.0242 14.9484,10.4629C14.5143,10.9029 14.0302,11.1635 13.5596,11.3321C13.1302,11.486 12.6943,11.5682 12.3391,11.6351C12.3169,11.6393 12.295,11.6434 12.2734,11.6475C11.8789,11.7222 11.6026,11.7811 11.3801,11.8784C10.8627,12.1076 10.6103,12.3518 10.4644,12.5768C10.3102,12.8148 10.2269,13.1039 10.163,13.5162C10.1432,13.6444 10.1261,13.7863 10.1078,13.9394C10.0154,14.7092 9.889,15.7618 9.2005,16.7791C8.5419,17.7603 7.8238,18.3353 7.2446,18.6667C6.9565,18.8315 6.7062,18.9343 6.5192,18.9972C6.4258,19.0286 6.3481,19.0502 6.2892,19.0646C6.2599,19.0718 6.2351,19.0773 6.2155,19.0813C6.2057,19.0833 6.1972,19.0849 6.1899,19.0863L6.1801,19.088L6.1759,19.0888L6.174,19.0891L6.1731,19.0892C6.1727,19.0893 6.1723,19.0894 6.0444,18.3222L6.1723,19.0894C5.7486,19.16 5.3478,18.8738 5.2772,18.4501C5.2072,18.0301 5.4878,17.6328 5.9052,17.557C5.9074,17.5565 5.912,17.5555 5.9187,17.5538C5.9375,17.5492 5.9731,17.5397 6.023,17.5229C6.1229,17.4893 6.2795,17.4267 6.472,17.3166C6.8537,17.0982 7.3907,16.6846 7.9096,15.9111L7.9116,15.9082C8.372,15.2286 8.4516,14.6033 8.5469,13.8548C8.5703,13.6709 8.5946,13.4796 8.6258,13.2782C8.7008,12.7933 8.8258,12.2449 9.1591,11.7307C9.5007,11.2038 10.0146,10.7816 10.7519,10.4554L10.7542,10.4544L10.7542,10.4544C11.1649,10.2742 11.6162,10.1887 11.9841,10.1191L12.0149,10.1133C12.3983,10.0407 12.7243,9.9791 13.0348,9.8678C13.3392,9.7587 13.6065,9.6082 13.8411,9.3704C14.0769,9.1314 14.3139,8.7696 14.5056,8.1903C14.8351,7.1822 14.5817,6.8489 14.4977,6.7579C14.4306,6.6851 14.348,6.6372 14.2742,6.6073C14.2387,6.5929 14.21,6.5847 14.1943,6.5807C14.1901,6.5797 14.1871,6.579 14.1853,6.5786C13.7686,6.5105 13.4811,6.121 13.5411,5.7011Z"
+ android:fillColor="#ffffff"
+ android:fillType="evenOdd"/>
+ <path
+ android:pathData="M21.0166,12.3187C21.3113,12.0567 21.7553,12.0567 22.05,12.3187L22.6465,12.8488C23.6838,13.7477 25.0352,14.2555 26.4,14.2555C26.8295,14.2555 27.1777,14.6037 27.1777,15.0333V20.2111C27.1777,22.1577 26.2279,23.9534 24.6162,25.0535L21.9709,26.854C21.7069,27.0338 21.3597,27.0338 21.0957,26.854L18.4526,25.055C18.4524,25.0549 18.4523,25.0548 18.4521,25.0546C16.8613,23.9767 15.8889,22.1581 15.8889,20.2111V15.0333C15.8889,14.6037 16.2371,14.2555 16.6666,14.2555C18.0604,14.2555 19.3861,13.7656 20.4169,12.8517C20.417,12.8516 20.4171,12.8515 20.4173,12.8514L21.0166,12.3187ZM21.5333,13.9406L21.4493,14.0152C20.3209,15.0159 18.9228,15.6149 17.4444,15.7704V20.2111C17.4444,21.6416 18.1606,22.9783 19.3251,23.7671L19.3265,23.7681L21.5333,25.2702L23.7393,23.7687C23.7394,23.7686 23.7395,23.7685 23.7396,23.7684C24.9277,22.9574 25.6222,21.6421 25.6222,20.2111V15.7684C24.1525,15.607 22.7446,14.9937 21.6235,14.0207L21.6166,14.0146L21.5333,13.9406Z"
+ android:fillColor="#ffffff"
+ android:fillType="evenOdd"/>
+ <path
+ android:pathData="M22.7556,18.6334C22.7556,17.9667 22.2,17.4111 21.5334,17.4111C20.8667,17.4111 20.3112,17.9667 20.3112,18.6334C20.3112,19.1 20.5778,19.5222 20.9778,19.7222L20.4667,22.1H22.6L22.0889,19.7C22.4889,19.5 22.7556,19.1 22.7556,18.6334Z"
+ android:fillColor="#ffffff"/>
+ </group>
</vector>
diff --git a/app/src/main/res/drawable/ic_my_location.xml b/app/src/main/res/drawable/ic_my_location.xml
index 3b04dc4..5d70d16 100644
--- a/app/src/main/res/drawable/ic_my_location.xml
+++ b/app/src/main/res/drawable/ic_my_location.xml
@@ -1,22 +1,16 @@
-<!--
- ~ Copyright (C) 2021 E FOUNDATION
- ~
- ~ This program is free software: you can redistribute it and/or modify
- ~ it under the terms of the GNU General Public License as published by
- ~ the Free Software Foundation, either version 3 of the License, or
- ~ (at your option) any later version.
- ~
- ~ This program is distributed in the hope that it will be useful,
- ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
- ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- ~ GNU General Public License for more details.
- ~
- ~ You should have received a copy of the GNU General Public License
- ~ along with this program. If not, see <https://www.gnu.org/licenses/>.
- -->
-
-<vector android:height="23.99944dp" android:viewportHeight="42.738"
- android:viewportWidth="42.739" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
- <path android:fillColor="#fc7222" android:pathData="M42.74,5L42.74,37.738A5,5 0,0 1,37.74 42.738L5.001,42.738A5,5 0,0 1,0.001 37.738L0.001,5A5,5 0,0 1,5.001 0L37.74,0A5,5 0,0 1,42.74 5z"/>
- <path android:fillColor="#fff" android:pathData="M21.369,3.651a13.318,13.318 0,0 0,-13.271 13.27c0,5.322 1.728,6.912 11.888,21.5a1.685,1.685 0,0 0,2.7 0c10.16,-14.584 11.957,-16.173 11.957,-21.5a13.364,13.364 0,0 0,-13.271 -13.27zM21.369,27.98a2.183,2.183 0,0 1,-2.212 -2.212,2.227 2.227,0 0,1 2.212,-2.212 2.274,2.274 0,0 1,2.212 2.212,2.227 2.227,0 0,1 -2.212,2.212zM23.169,20.17v0.138a1.079,1.079 0,0 1,-1.106 1.037h-1.106a1.079,1.079 0,0 1,-1.106 -1.037v-1.175a1.562,1.562 0,0 1,0.968 -1.451c2.074,-1.037 3.456,-1.866 3.456,-2.972a2.722,2.722 0,0 0,-2.773 -2.765,2.737 2.737,0 0,0 -2.626,2 1.038,1.038 0,0 1,-1.037 0.76h-1.175a1.112,1.112 0,0 1,-1.106 -1.313,6.146 6.146,0 0,1 5.944,-4.764 6.038,6.038 0,0 1,6.082 6.082c0,2.834 -2.281,4.354 -4.424,5.46z"/>
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="32dp"
+ android:height="32dp"
+ android:viewportWidth="32"
+ android:viewportHeight="32">
+ <path
+ android:pathData="M25.2477,32H6.7523C3.0261,32 0,28.9739 0,25.2477V6.7523C0,3.0261 3.0261,0 6.7523,0H25.2477C28.9739,0 32,3.0261 32,6.7523V25.2477C32,28.9739 28.9739,32 25.2477,32Z"
+ android:fillColor="#FF7301"/>
+ <path
+ android:pathData="M19.3889,7.4919C17.9615,6.6073 16.4265,6.3452 14.7625,6.6699L14.7533,6.6717C12.8779,7.0145 11.4371,8.0103 10.3985,9.6181C9.509,11.0139 9.1879,12.5373 9.4312,14.1792L9.4322,14.1862C9.5334,14.9151 9.759,15.6425 10.0425,16.3839L10.0431,16.3856C10.6928,18.0964 11.6086,19.7149 12.6323,21.295L12.6326,21.2954C13.6023,22.794 14.6852,24.232 15.8402,25.6323C15.8894,25.6861 15.9385,25.7407 15.9877,25.796L16.5304,25.1516C17.7358,23.6557 18.885,22.1068 19.8751,20.4785L19.8792,20.4719C20.8997,18.8302 21.763,17.182 22.2993,15.3806C22.616,14.3032 22.7484,13.256 22.5715,12.2142L22.5713,12.213C22.2242,10.151 21.1797,8.5705 19.3975,7.4971L19.3889,7.4919ZM16.7214,27.3789L16.7213,27.3791L16.7212,27.3794L16.721,27.3797L16.7209,27.3799L16.7208,27.3802L16.7207,27.3805L16.7205,27.3807L16.7204,27.381L16.7203,27.3813L16.7201,27.3815L16.72,27.3818L16.7199,27.3821L16.7197,27.3823L16.7196,27.3826L16.7195,27.3828L16.7193,27.3831L16.7192,27.3834L16.7188,27.3842L16.7187,27.3844L16.7185,27.3847L16.7183,27.3852C16.5999,27.6221 16.3707,27.7839 16.1079,27.8162C15.8451,27.8486 15.5835,27.7472 15.4112,27.5461C15.3711,27.4994 15.3319,27.4536 15.2934,27.4085C15.0661,27.143 14.8635,26.9062 14.6608,26.6851C14.6516,26.675 14.6426,26.6647 14.6339,26.6542C13.4452,25.214 12.3194,23.7212 11.3054,22.1542C10.2517,20.5278 9.2708,18.8044 8.5656,16.9476C8.2624,16.1547 7.9917,15.3028 7.8669,14.4073C7.5692,12.3927 7.9706,10.4854 9.0668,8.7663L9.0692,8.7626C10.3332,6.8046 12.1424,5.5432 14.4644,5.1175C16.5007,4.7212 18.4405,5.0458 20.2173,6.1455C22.407,7.4659 23.7097,9.4526 24.1302,11.9507C24.3594,13.3019 24.1759,14.6025 23.8155,15.8278L23.8147,15.8303C23.2223,17.821 22.2799,19.604 21.2238,21.3032C20.1834,23.0136 18.9867,24.623 17.7559,26.1502C17.7523,26.1546 17.7487,26.159 17.745,26.1633L16.7214,27.3789Z"
+ android:fillColor="#ffffff"
+ android:fillType="evenOdd"/>
+ <path
+ android:pathData="M18.6535,13.1659C18.6535,11.698 17.4566,10.4785 15.921,10.5237C14.4757,10.5688 13.324,11.7657 13.324,13.1885C13.3466,14.6563 14.5886,15.9436 16.1468,15.8307C17.5696,15.7403 18.6761,14.566 18.6535,13.1659Z"
+ android:fillColor="#ffffff"/>
</vector>
diff --git a/app/src/main/res/drawable/ic_privacy_toggle.xml b/app/src/main/res/drawable/ic_privacy_toggle.xml
deleted file mode 100644
index 6a0f647..0000000
--- a/app/src/main/res/drawable/ic_privacy_toggle.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<!--
- ~ Copyright (C) 2021 E FOUNDATION
- ~
- ~ This program is free software: you can redistribute it and/or modify
- ~ it under the terms of the GNU General Public License as published by
- ~ the Free Software Foundation, either version 3 of the License, or
- ~ (at your option) any later version.
- ~
- ~ This program is distributed in the hope that it will be useful,
- ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
- ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- ~ GNU General Public License for more details.
- ~
- ~ You should have received a copy of the GNU General Public License
- ~ along with this program. If not, see <https://www.gnu.org/licenses/>.
- -->
-
-<vector android:height="84dp" android:viewportHeight="84.406"
- android:viewportWidth="84.406" android:width="84dp" xmlns:android="http://schemas.android.com/apk/res/android">
- <path android:fillColor="#38d874" android:pathData="M84.406,42L84.406,42.406A42,42 0,0 1,42.406 84.406L42,84.406A42,42 0,0 1,0 42.406L0,42A42,42 0,0 1,42 0L42.406,0A42,42 0,0 1,84.406 42z"/>
- <path android:fillColor="#fff" android:pathData="M42.118,13.695a6.476,6.476 0,0 0,-2.114 0.334l-21.358,8.9a5.324,5.324 0,0 0,-3.225 4.9c0,22.136 12.68,37.376 24.583,42.382a5.284,5.284 0,0 0,4.115 0c9.566,-4 24.7,-17.687 24.7,-42.382a5.432,5.432 0,0 0,-3.338 -4.9l-21.358,-8.9a6.3,6.3 0,0 0,-2.005 -0.334zM41.1739,27.31h1.888a1.432,1.432 0,0 1,1.413 1.413v14.142a1.4,1.4 0,0 1,-1.413 1.416h-1.888a1.362,1.362 0,0 1,-1.413 -1.416L39.7608,28.72a1.394,1.394 0,0 1,1.411 -1.41zM34.1319,30.292a1.4,1.4 0,0 1,1.5 0.67l0.943,1.65a1.432,1.432 0,0 1,-0.351 1.827,9.9 9.9,0 0,0 5.89,17.854 9.933,9.933 0,0 0,9.9 -9.958,10.115 10.115,0 0,0 -4.065,-7.9 1.437,1.437 0,0 1,-0.354 -1.827l0.944,-1.65a1.4,1.4 0,0 1,2.059 -0.412,14.585 14.585,0 1,1 -17.032,0 1.432,1.432 0,0 1,0.562 -0.258z"/>
-</vector>
diff --git a/app/src/main/res/drawable/ic_quick_privacy_off.png b/app/src/main/res/drawable/ic_quick_privacy_off.png
new file mode 100644
index 0000000..90f1b04
--- /dev/null
+++ b/app/src/main/res/drawable/ic_quick_privacy_off.png
Binary files differ
diff --git a/app/src/main/res/drawable/ic_quick_privacy_on.png b/app/src/main/res/drawable/ic_quick_privacy_on.png
new file mode 100644
index 0000000..99f6719
--- /dev/null
+++ b/app/src/main/res/drawable/ic_quick_privacy_on.png
Binary files differ
diff --git a/app/src/main/res/drawable/ic_tracked.xml b/app/src/main/res/drawable/ic_tracked.xml
index 9aa4736..6cef537 100644
--- a/app/src/main/res/drawable/ic_tracked.xml
+++ b/app/src/main/res/drawable/ic_tracked.xml
@@ -1,22 +1,43 @@
-<!--
- ~ Copyright (C) 2021 E FOUNDATION
- ~
- ~ This program is free software: you can redistribute it and/or modify
- ~ it under the terms of the GNU General Public License as published by
- ~ the Free Software Foundation, either version 3 of the License, or
- ~ (at your option) any later version.
- ~
- ~ This program is distributed in the hope that it will be useful,
- ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
- ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- ~ GNU General Public License for more details.
- ~
- ~ You should have received a copy of the GNU General Public License
- ~ along with this program. If not, see <https://www.gnu.org/licenses/>.
- -->
-
-<vector android:height="23.99944dp" android:viewportHeight="42.738"
- android:viewportWidth="42.739" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
- <path android:fillColor="#007fff" android:pathData="M42.74,5L42.74,37.738A5,5 0,0 1,37.74 42.738L5.001,42.738A5,5 0,0 1,0.001 37.738L0.001,5A5,5 0,0 1,5.001 0L37.74,0A5,5 0,0 1,42.74 5z"/>
- <path android:fillColor="#fff" android:pathData="M27.929,25.118h-3.749a1.887,1.887 0,0 0,-1.875 1.874v7.5a1.85,1.85 0,0 0,1.875 1.874h3.749a1.887,1.887 0,0 0,1.874 -1.874v-7.5a1.927,1.927 0,0 0,-1.874 -1.874zM26.992,33.553h-1.874v-5.623h1.874zM37.302,17.621h-3.749a1.887,1.887 0,0 0,-1.875 1.874v15a1.85,1.85 0,0 0,1.875 1.874h3.749a1.888,1.888 0,0 0,1.875 -1.874v-15a1.927,1.927 0,0 0,-1.875 -1.874zM36.365,33.553h-1.875v-13.121h1.875zM18.5579,17.621h-3.749a1.887,1.887 0,0 0,-1.875 1.874v15a1.85,1.85 0,0 0,1.875 1.874h3.749a1.888,1.888 0,0 0,1.875 -1.874v-15a1.927,1.927 0,0 0,-1.875 -1.874zM17.6209,33.553h-1.874v-13.121h1.874zM9.1859,26.993h-3.751a1.887,1.887 0,0 0,-1.875 1.874v5.623a1.851,1.851 0,0 0,1.875 1.874h3.749a1.887,1.887 0,0 0,1.874 -1.874v-5.623a1.927,1.927 0,0 0,-1.874 -1.875zM8.2489,33.553h-1.875v-3.749h1.875zM7.3119,21.369a2.812,2.812 0,0 0,2.812 -2.812,2.941 2.941,0 0,0 -0.117,-0.7l5.916,-5.916a3.094,3.094 0,0 0,0.762 0.059,2.974 2.974,0 0,0 1,-0.176l5.565,4.452v0.41a2.776,2.776 0,0 0,2.812 2.812,2.812 2.812,0 0,0 2.812,-2.812c0,-0.117 -0.059,-0.234 -0.059,-0.41l5.565,-4.452a3.064,3.064 0,0 0,1.054 0.176,2.812 2.812,0 0,0 2.812,-2.812 2.851,2.851 0,0 0,-2.812 -2.812,2.812 2.812,0 0,0 -2.812,2.812v0.469l-5.565,4.452a3.081,3.081 0,0 0,-1.054 -0.234,3.077 3.077,0 0,0 -1,0.234l-5.565,-4.452c0,-0.176 0.059,-0.293 0.059,-0.469a2.851,2.851 0,0 0,-2.812 -2.812,2.812 2.812,0 0,0 -2.812,2.812 3.092,3.092 0,0 0,0.059 0.761l-5.916,5.916a2.943,2.943 0,0 0,-0.7 -0.117,2.812 2.812,0 0,0 -2.812,2.812 2.776,2.776 0,0 0,2.806 2.809z"/>
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="32dp"
+ android:height="32dp"
+ android:viewportWidth="32"
+ android:viewportHeight="32">
+ <path
+ android:pathData="M25.2477,32H6.7523C3.0261,32 0,28.9739 0,25.2477V6.7523C0,3.0261 3.0261,0 6.7523,0H25.2477C28.9739,0 32,3.0261 32,6.7523V25.2477C32,28.9739 28.9739,32 25.2477,32Z"
+ android:fillColor="#0088ED"/>
+ <group>
+ <clip-path
+ android:pathData="M8.1222,5.5667h15.7556v20.8667h-15.7556z"/>
+ <path
+ android:pathData="M23.1,26.4333C22.6778,26.4333 22.3222,26.0778 22.3222,25.6556L22.3222,16C22.3222,15.5778 22.6778,15.2222 23.1,15.2222C23.5222,15.2222 23.8778,15.5778 23.8778,16V25.6556C23.8778,26.0778 23.5444,26.4333 23.1,26.4333Z"
+ android:fillColor="#ffffff"/>
+ <path
+ android:pathData="M18.3667,26.4334C17.9445,26.4334 17.5889,26.0778 17.5889,25.6556L17.5889,19C17.5889,18.5778 17.9445,18.2222 18.3667,18.2222C18.7889,18.2222 19.1445,18.5778 19.1445,19V25.6556C19.1445,26.0778 18.8111,26.4334 18.3667,26.4334Z"
+ android:fillColor="#ffffff"/>
+ <path
+ android:pathData="M13.6333,26.4334C13.2111,26.4334 12.8555,26.0779 12.8555,25.6556V21.5C12.8555,21.0778 13.2111,20.7222 13.6333,20.7222C14.0555,20.7222 14.4111,21.0778 14.4111,21.5V25.6334C14.4111,26.0779 14.0555,26.4334 13.6333,26.4334Z"
+ android:fillColor="#ffffff"/>
+ <path
+ android:pathData="M8.9,26.4334C8.4778,26.4334 8.1222,26.0778 8.1222,25.6556V24C8.1222,23.5778 8.4778,23.2222 8.9,23.2222C9.3222,23.2222 9.6778,23.5556 9.6778,24V25.6556C9.6778,26.0778 9.3222,26.4334 8.9,26.4334Z"
+ android:fillColor="#ffffff"/>
+ </group>
+ <path
+ android:pathData="M18.3667,13m-1.6056,0a1.6056,1.6056 0,1 1,3.2112 0a1.6056,1.6056 0,1 1,-3.2112 0"
+ android:fillColor="#ffffff"/>
+ <path
+ android:pathData="M8,13L13.0909,8L18.5455,13L24,8"
+ android:strokeWidth="1.6"
+ android:fillColor="#00000000"
+ android:strokeColor="#ffffff"
+ android:strokeLineCap="round"/>
+ <path
+ android:pathData="M13.0886,8m-1.6056,0a1.6056,1.6056 0,1 1,3.2112 0a1.6056,1.6056 0,1 1,-3.2112 0"
+ android:fillColor="#ffffff"/>
+ <path
+ android:pathData="M8,13m-1.6056,0a1.6056,1.6056 0,1 1,3.2112 0a1.6056,1.6056 0,1 1,-3.2112 0"
+ android:fillColor="#ffffff"/>
+ <path
+ android:pathData="M23.8778,8m-1.6056,0a1.6056,1.6056 0,1 1,3.2112 0a1.6056,1.6056 0,1 1,-3.2112 0"
+ android:fillColor="#ffffff"/>
</vector>
diff --git a/app/src/main/res/layout/dashboard_item_submenu_button.xml b/app/src/main/res/layout/dashboard_item_submenu_button.xml
new file mode 100644
index 0000000..8802bca
--- /dev/null
+++ b/app/src/main/res/layout/dashboard_item_submenu_button.xml
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+ ~ Copyright (C) 2021 E FOUNDATION
+ ~
+ ~ This program is free software: you can redistribute it and/or modify
+ ~ it under the terms of the GNU General Public License as published by
+ ~ the Free Software Foundation, either version 3 of the License, or
+ ~ (at your option) any later version.
+ ~
+ ~ This program is distributed in the hope that it will be useful,
+ ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ ~ GNU General Public License for more details.
+ ~
+ ~ You should have received a copy of the GNU General Public License
+ ~ along with this program. If not, see <https://www.gnu.org/licenses/>.
+ -->
+
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ >
+ <data>
+ <variable name="icon" type="android.graphics.drawable.Drawable" />
+ <variable name="title" type="String" />
+ <variable name="subTitle" type="String" />
+ </data>
+ <androidx.constraintlayout.widget.ConstraintLayout
+ android:id="@+id/container"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:padding="16dp"
+ android:background="?attr/selectableItemBackground"
+ >
+ <ImageView
+ android:id="@+id/icon"
+ android:layout_height="32dp"
+ android:layout_width="32dp"
+ android:src="@{icon}"
+ app:layout_constraintLeft_toLeftOf="parent"
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintBottom_toBottomOf="parent"
+ />
+
+ <ImageView
+ android:id="@+id/chevron"
+ android:layout_height="24dp"
+ android:layout_width="24dp"
+ android:src="@drawable/ic_chevron_right_24dp"
+ app:layout_constraintRight_toRightOf="parent"
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintBottom_toBottomOf="parent"
+ />
+
+ <TextView
+ android:id="@+id/title"
+ android:layout_height="wrap_content"
+ android:layout_width="0dp"
+ android:text="@{title}"
+ app:layout_constraintLeft_toRightOf="@+id/icon"
+ app:layout_constraintRight_toLeftOf="@+id/chevron"
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintBottom_toTopOf="@+id/subtitle"
+ app:layout_constraintVertical_chainStyle="packed"
+ android:layout_marginStart="24dp"
+ android:textColor="@color/black"
+ android:textSize="16sp"
+ />
+
+ <TextView
+ android:id="@+id/subtitle"
+ android:layout_height="wrap_content"
+ android:layout_width="0dp"
+ app:layout_constraintLeft_toRightOf="@+id/icon"
+ app:layout_constraintRight_toLeftOf="@+id/chevron"
+ app:layout_constraintTop_toBottomOf="@+id/title"
+ app:layout_constraintBottom_toBottomOf="parent"
+ android:layout_marginStart="24dp"
+ android:text="@{subTitle}"
+ android:textColor="@color/grey_text"
+ android:textSize="14sp"
+ />
+
+ </androidx.constraintlayout.widget.ConstraintLayout>
+</layout> \ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_dashboard.xml b/app/src/main/res/layout/fragment_dashboard.xml
index effd992..077eaf1 100644
--- a/app/src/main/res/layout/fragment_dashboard.xml
+++ b/app/src/main/res/layout/fragment_dashboard.xml
@@ -1,26 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
+<layout>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_height="match_parent"
android:layout_width="match_parent"
>
-
<include layout="@layout/topbar" />
-
- <ProgressBar
- android:id="@+id/loadingSpinner"
- android:indeterminate="true"
- android:layout_gravity="center"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- />
-
<androidx.core.widget.NestedScrollView
android:id="@+id/scrollContainer"
android:layout_height="match_parent"
android:layout_width="match_parent"
- android:visibility="gone"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
>
@@ -30,314 +20,222 @@
android:layout_height="match_parent"
android:layout_width="match_parent"
android:orientation="vertical"
- tools:context=".main.MainActivity"
>
<TextView
- android:gravity="center"
- android:layout_gravity="center_horizontal"
- android:layout_height="wrap_content"
+ android:id="@+id/state_label"
android:layout_width="match_parent"
- android:paddingBottom="16dp"
- android:paddingLeft="32dp"
- android:paddingRight="32dp"
- android:paddingTop="16dp"
- android:text="@string/privacy_dashboard_info"
- android:textColor="@color/black"
- android:textSize="14sp"
- />
-
- <ImageView
- android:id="@+id/togglePrivacyCentral"
- android:layout_height="96dp"
- android:layout_marginBottom="16dp"
- android:layout_marginTop="16dp"
- android:layout_width="96dp"
- android:src="@drawable/ic_privacy_toggle"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="24dp"
+ android:layout_marginBottom="4dp"
+ android:text="@string/dashboard_state_label_off"
+ android:textColor="@color/orange_off"
+ android:gravity="center"
/>
-
<TextView
- android:drawableEnd="@drawable/ic_chevron_right_24dp"
- android:fontFamily="sans-serif-medium"
- android:gravity="center"
- android:id="@+id/tap_to_enable_quick_protection"
- android:layout_gravity="center_horizontal"
- android:layout_height="wrap_content"
android:layout_width="match_parent"
- android:paddingBottom="16dp"
- android:paddingLeft="32dp"
- android:paddingRight="32dp"
- android:paddingTop="16dp"
- android:text="@string/tap_to_enable_quick_protection"
- android:textColor="@color/black"
- android:textSize="14sp"
+ android:layout_height="wrap_content"
+ android:text="@string/dashboard_change_state_explanations"
+ android:gravity="center"
+ android:textSize="12sp"
+ android:textColor="@color/grey_text_2"
/>
<ImageView
- android:layout_height="160dp"
- android:layout_width="match_parent"
- android:src="@drawable/dummy_leakage_analytics"
- />
-
- <TextView
- android:gravity="center"
- android:id="@+id/personal_leakag_info"
- android:layout_gravity="center_horizontal"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:paddingBottom="16dp"
- android:paddingLeft="32dp"
- android:paddingRight="32dp"
- android:text="@string/personal_leakage_info"
- android:textColor="@color/black"
- android:textSize="12sp"
+ android:id="@+id/toggle_privacy_central"
+ android:layout_height="120dp"
+ android:layout_margin="32dp"
+ android:layout_width="120dp"
+ android:src="@drawable/ic_quick_privacy_off"
+ android:scaleType="fitCenter"
+ android:background="?attr/selectableItemBackgroundBorderless"
/>
<LinearLayout
- android:background="#f9f9f9"
- android:layout_height="match_parent"
android:layout_width="match_parent"
- android:orientation="vertical"
- >
-
- <RelativeLayout
- android:id="@+id/am_i_tracked"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:padding="16dp"
+ android:layout_marginBottom="32dp">
+ <LinearLayout
+ android:layout_width="0dp"
android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:paddingBottom="16dp"
- android:paddingLeft="32dp"
- android:paddingRight="32dp"
- android:paddingTop="16dp"
- >
-
- <ImageView
- android:id="@+id/am_i_tracked_icon"
- android:layout_alignParentStart="true"
- android:layout_centerVertical="true"
- android:layout_height="36dp"
- android:layout_width="36dp"
- android:src="@drawable/ic_tracked"
+ android:layout_weight="1"
+ android:orientation="vertical"
+ android:gravity="center">
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/dashboard_state_trackers_label"
+ android:textSize="12sp"
+ android:textColor="@color/grey_text"
+ android:layout_marginBottom="8dp"
/>
-
- <LinearLayout
+ <TextView
+ android:id="@+id/state_trackers"
+ android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_toEndOf="@+id/am_i_tracked_icon"
- android:layout_toStartOf="@+id/am_i_tracked_chevron"
- android:layout_width="match_parent"
- android:orientation="vertical"
- android:paddingEnd="32dp"
- android:paddingStart="16dp"
- >
-
- <TextView
- android:fontFamily="sans-serif-medium"
- android:id="@+id/am_i_tracked_title"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:text="@string/am_i_tracked_title"
- android:textColor="@color/black"
- android:textSize="16sp"
- />
-
- <TextView
- android:id="@+id/am_i_tracked_subtitle"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:text="@string/am_i_tracked_subtitle"
- android:textColor="@color/black"
- android:textSize="14sp"
- />
- </LinearLayout>
-
- <ImageView
- android:id="@+id/am_i_tracked_chevron"
- android:layout_alignParentEnd="true"
- android:layout_centerVertical="true"
- android:layout_height="24dp"
- android:layout_width="24dp"
- android:src="@drawable/ic_chevron_right_24dp"
+ android:text="@string/dashboard_state_trackers_off"
+ android:textSize="12sp"
+ android:textColor="@color/black_text"
+ android:textAllCaps="true"
/>
- </RelativeLayout>
-
- <RelativeLayout
- android:id="@+id/apps_permissions"
+ </LinearLayout>
+ <LinearLayout
+ android:layout_width="0dp"
android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:paddingBottom="16dp"
- android:paddingLeft="32dp"
- android:paddingRight="32dp"
- android:paddingTop="16dp"
- >
-
- <ImageView
- android:id="@+id/apps_permissions_icon"
- android:layout_alignParentStart="true"
- android:layout_centerVertical="true"
- android:layout_height="36dp"
- android:layout_width="36dp"
- android:src="@drawable/ic_apps_permissions"
+ android:layout_weight="1"
+ android:orientation="vertical"
+ android:gravity="center">
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/dashboard_state_geolocation_label"
+ android:textSize="12sp"
+ android:textColor="@color/grey_text"
+ android:layout_marginBottom="8dp"
/>
-
- <LinearLayout
+ <TextView
+ android:id="@+id/state_geolocation"
+ android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_toEndOf="@+id/apps_permissions_icon"
- android:layout_toStartOf="@+id/apps_permissions_chevron"
- android:layout_width="match_parent"
- android:orientation="vertical"
- android:paddingEnd="32dp"
- android:paddingStart="16dp"
- >
-
- <TextView
- android:fontFamily="sans-serif-medium"
- android:id="@+id/apps_permissions_title"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:text="@string/apps_permissions_title"
- android:textColor="@color/black"
- android:textSize="16sp"
- />
-
- <TextView
- android:id="@+id/apps_permissions_subtitle"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:text="@string/apps_permissions_subtitle"
- android:textColor="@color/black"
- android:textSize="14sp"
- />
- </LinearLayout>
-
- <ImageView
- android:id="@+id/apps_permissions_chevron"
- android:layout_alignParentEnd="true"
- android:layout_centerVertical="true"
- android:layout_height="24dp"
- android:layout_width="24dp"
- android:src="@drawable/ic_chevron_right_24dp"
+ android:text="@string/dashboard_state_geolocation_off"
+ android:textSize="12sp"
+ android:textColor="@color/black_text"
+ android:textAllCaps="true"
/>
- </RelativeLayout>
-
- <RelativeLayout
- android:id="@+id/my_location"
+ </LinearLayout>
+ <LinearLayout
+ android:layout_width="0dp"
android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:paddingBottom="16dp"
- android:paddingLeft="32dp"
- android:paddingRight="32dp"
- android:paddingTop="16dp"
- >
-
- <ImageView
- android:id="@+id/my_location_icon"
- android:layout_alignParentStart="true"
- android:layout_centerVertical="true"
- android:layout_height="36dp"
- android:layout_width="36dp"
- android:src="@drawable/ic_my_location"
+ android:layout_weight="1"
+ android:orientation="vertical"
+ android:gravity="center">
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/dashboard_state_ipaddress_label"
+ android:textSize="12sp"
+ android:textColor="@color/grey_text"
+ android:layout_marginBottom="8dp"
/>
-
- <LinearLayout
+ <TextView
+ android:id="@+id/state_ip_address"
+ android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_toEndOf="@+id/my_location_icon"
- android:layout_toStartOf="@+id/my_location_chevron"
- android:layout_width="match_parent"
- android:orientation="vertical"
- android:paddingEnd="32dp"
- android:paddingStart="16dp"
- >
-
- <TextView
- android:fontFamily="sans-serif-medium"
- android:id="@+id/my_location_title"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:text="@string/my_location_title"
- android:textColor="@color/black"
- android:textSize="16sp"
- />
+ android:text="@string/dashboard_state_ipaddress_off"
+ android:textSize="12sp"
+ android:textColor="@color/black_text"
+ android:textAllCaps="true"
+ />
+ </LinearLayout>
+ </LinearLayout>
- <TextView
- android:id="@+id/my_location_subtitle"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:text="@string/my_location_subtitle"
- android:textColor="@color/black"
- android:textSize="14sp"
- />
- </LinearLayout>
- <ImageView
- android:id="@+id/my_location_chevron"
- android:layout_alignParentEnd="true"
- android:layout_centerVertical="true"
- android:layout_height="24dp"
- android:layout_width="24dp"
- android:src="@drawable/ic_chevron_right_24dp"
- />
- </RelativeLayout>
+ <androidx.constraintlayout.widget.ConstraintLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:padding="16dp">
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/dashboard_graph_label"
+ app:layout_constraintLeft_toLeftOf="parent"
+ app:layout_constraintTop_toTopOf="parent"
+ />
- <RelativeLayout
- android:id="@+id/internet_activity_privacy"
+ <TextView
+ android:id="@+id/graph_period"
android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:text="@string/dashboard_graph_period"
+ android:textSize="14sp"
+ android:textColor="@color/grey_text_2"
+ app:layout_constraintRight_toRightOf="parent"
+ app:layout_constraintTop_toTopOf="parent"
+ />
+
+<!-- <TextView-->
+<!-- android:id="@+id/graph_total"-->
+<!-- android:layout_width="wrap_content"-->
+<!-- android:layout_height="wrap_content"-->
+<!-- android:text="200 hits"-->
+<!-- app:layout_constraintRight_toRightOf="parent"-->
+<!-- app:layout_constraintTop_toBottomOf="@+id/graph_period"-->
+<!-- />-->
+ <ImageView
+ android:id="@+id/graph"
+ android:layout_height="160dp"
android:layout_width="match_parent"
- android:paddingBottom="16dp"
- android:paddingLeft="32dp"
- android:paddingRight="32dp"
- android:paddingTop="16dp"
- >
-
- <ImageView
- android:id="@+id/internet_activity_privacy_icon"
- android:layout_alignParentStart="true"
- android:layout_centerVertical="true"
- android:layout_height="36dp"
- android:layout_width="36dp"
- android:src="@drawable/ic_internet_activity"
- />
-
- <LinearLayout
- android:layout_height="wrap_content"
- android:layout_toEndOf="@+id/internet_activity_privacy_icon"
- android:layout_toStartOf="@+id/internet_activity_privacy_chevron"
- android:layout_width="match_parent"
- android:orientation="vertical"
- android:paddingEnd="32dp"
- android:paddingStart="16dp"
- >
-
- <TextView
- android:fontFamily="sans-serif-medium"
- android:id="@+id/internet_activity_privacy_title"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:text="@string/internet_activity_privacy_title"
- android:textColor="@color/black"
- android:textSize="16sp"
- />
-
- <TextView
- android:id="@+id/internet_activity_privacy_subtitle"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:text="@string/internet_activity_privacy_subtitle"
- android:textColor="@color/black"
- android:textSize="14sp"
- />
- </LinearLayout>
+ android:src="@drawable/dummy_leakage_analytics"
+ app:layout_constraintTop_toBottomOf="@+id/graph_period"
+ />
+ </androidx.constraintlayout.widget.ConstraintLayout>
+
+ <include
+ layout="@layout/dashboard_item_submenu_button"
+ android:id="@+id/am_i_tracked"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ app:icon="@{@drawable/ic_tracked}"
+ app:title="@{@string/dashboard_am_i_tracked_title}"
+ app:subTitle='@{""}'
+ />
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="1dp"
+ android:layout_marginStart="48dp"
+ android:background="@color/grey_divider"
+ />
- <ImageView
- android:id="@+id/internet_activity_privacy_chevron"
- android:layout_alignParentEnd="true"
- android:layout_centerVertical="true"
- android:layout_height="24dp"
- android:layout_width="24dp"
- android:src="@drawable/ic_chevron_right_24dp"
- />
- </RelativeLayout>
+ <include
+ layout="@layout/dashboard_item_submenu_button"
+ android:id="@+id/apps_permissions"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ app:icon="@{@drawable/ic_apps_permissions}"
+ app:title="@{@string/dashboard_apps_permissions_title}"
+ app:subTitle='@{@string/dashboard_apps_permissions_subtitle}'
+ />
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="1dp"
+ android:layout_marginStart="72dp"
+ android:background="@color/grey_divider"
+ />
- </LinearLayout>
+ <include
+ layout="@layout/dashboard_item_submenu_button"
+ android:id="@+id/my_location"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ app:icon="@{@drawable/ic_my_location}"
+ app:title="@{@string/dashboard_location_title}"
+ app:subTitle='@{@string/dashboard_location_subtitle_off}'
+ />
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="1dp"
+ android:layout_marginStart="72dp"
+ android:background="@color/grey_divider"
+ />
+ <include
+ layout="@layout/dashboard_item_submenu_button"
+ android:id="@+id/internet_activity_privacy"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ app:icon="@{@drawable/ic_internet_activity}"
+ app:title="@{@string/dashboard_internet_activity_privacy_title}"
+ app:subTitle='@{@string/dashboard_internet_activity_privacy_subtitle_off}'
+ />
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="1dp"
+ android:layout_marginStart="72dp"
+ android:background="@color/grey_divider"
+ />
</LinearLayout>
</androidx.core.widget.NestedScrollView>
-</androidx.coordinatorlayout.widget.CoordinatorLayout> \ No newline at end of file
+</androidx.coordinatorlayout.widget.CoordinatorLayout>
+</layout> \ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_internet_activity_policy.xml b/app/src/main/res/layout/fragment_internet_activity_policy.xml
index 12094ab..2c7e102 100644
--- a/app/src/main/res/layout/fragment_internet_activity_policy.xml
+++ b/app/src/main/res/layout/fragment_internet_activity_policy.xml
@@ -57,7 +57,7 @@
android:layout_width="wrap_content"
android:paddingBottom="8dp"
android:paddingTop="16dp"
- android:text="@string/internet_activity_privacy_title"
+ android:text="@string/dashboard_internet_activity_privacy_title"
android:textColor="@color/black"
android:textSize="14sp"
/>
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index 4f45122..2a16240 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -9,4 +9,16 @@
<color name="white">#FFFFFFFF</color>
<color name="accent">@lineageos.platform:color/color_default_accent</color>
+
+ <color name="black_text">#DE000000</color>
+
+ <color name="grey_text">#99000000</color>
+ <color name="grey_text_2">#61000000</color>
+ <color name="grey_divider">#14212121</color>
+
+ <color name="orange_off">#FC7222</color>
+ <color name="green_on">#169659</color>
+
+
+
</resources> \ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index d18ccf5..f6bcf72 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -1,17 +1,37 @@
<resources>
<string name="app_name">PrivacyCentralApp</string>
- <string name="privacy_dashboard_info">Privacy dashboard helps you control and better protect your privacy</string>
- <string name="tap_to_enable_quick_protection">Tap to enable quick privacy protection</string>
- <string name="personal_leakage_info">Personal data leakage over past 24 hours. </string>
- <string name="am_i_tracked_title">Am I tracked?</string>
- <string name="am_i_tracked_subtitle">Currently there are %1$d trackers in your apps, %2$d trackers are active</string>
- <string name="apps_permissions_title">Apps Permissions</string>
- <string name="apps_permissions_subtitle">%1$d apps are requesting %2$d permissions</string>
- <string name="my_location_title">My Location</string>
- <string name="my_location_subtitle">"%1$d apps are using location permission\nCurrent location mode: "</string>
+
+ <!-- Dashboard -->
+ <string name="dashboard_title">Quick Privacy</string>
+ <string name="dashboard_state_label_off">Your online privacy is not protected</string>
+ <string name="dashboard_state_label_on">Your online privacy is now protected!</string>
+ <string name="dashboard_change_state_explanations">Tap to enable your privacy preferences</string>
+ <string name="dashboard_state_trackers_label">Trackers:</string>
+ <string name="dashboard_state_trackers_off">Vulnerable</string>
+ <string name="dashboard_state_trackers_on">Denied</string>
+ <string name="dashboard_state_geolocation_label">Geolocation:</string>
+ <string name="dashboard_state_geolocation_off">Exposed</string>
+ <string name="dashboard_state_geolocation_on">Fake</string>
+ <string name="dashboard_state_ipaddress_label">IP address:</string>
+ <string name="dashboard_state_ipaddress_off">Exposed</string>
+ <string name="dashboard_state_ipaddress_on">Hidden</string>
+ <string name="dashboard_graph_label">Personal data leakage</string>
+ <string name="dashboard_graph_period">Last 24 hours</string>
+ <string name="dashboard_graph_total">%d hits</string>
+
+ <string name="dashboard_am_i_tracked_title">Am I tracked?</string>
+ <string name="dashboard_am_i_tracked_subtitle">%1$d app trackers, %2$d active trackers</string>
+ <string name="dashboard_apps_permissions_title">Apps Permissions</string>
+ <string name="dashboard_apps_permissions_subtitle">Manage your permissions</string>
+ <string name="dashboard_location_title">Geolocation mode</string>
+ <string name="dashboard_location_subtitle_off">Real geolocation</string>
+ <string name="dashboard_location_subtitle_on">Fake geolocation</string>
+ <string name="dashboard_internet_activity_privacy_title">My internet activity privacy</string>
+ <string name="dashboard_internet_activity_privacy_subtitle_off">Real IP address exposed</string>
+ <string name="dashboard_internet_activity_privacy_subtitle_on">Real IP address hidden</string>
+
+ <!-- -->
<string name="internet_activity_privacy">Internet Activity Privacy</string>
- <string name="internet_activity_privacy_title">My Internet Activity Privacy</string>
- <string name="internet_activity_privacy_subtitle">"Current internet activity mode: "</string>
<string name="quick_protection_info">Quick protection enables these settings when turned on</string>
<string name="quick_protection_settings_list"> - All trackers are turned off.\n- Your geolocation will be faked.\n- Your real IP address will be hidden.</string>
<string name="learn_more">Learn more</string>
diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml
index 3a7bad8..1e20ab1 100644
--- a/app/src/main/res/values/themes.xml
+++ b/app/src/main/res/values/themes.xml
@@ -8,5 +8,9 @@
<item name="colorControlNormal">#007fff</item>
<!-- Status bar color. -->
<!-- Customize your theme here. -->
+ <item name="android:textColor">@color/black_text</item>
+ <item name="android:textSize">16sp</item>
</style>
+
+ <!-- fonts : roboto 400 -->
</resources> \ No newline at end of file