summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAmit Kumar <amitkma@e.email>2021-05-03 03:17:11 +0530
committerAmit Kumar <amitkma@e.email>2021-05-03 03:17:11 +0530
commit0d036a8742f54eb9ea87e64fdce9ab878f58859b (patch)
tree2ee2ddab1e61f2d436ce1d4401cbe1b032282e37
parent75843f012b09f0f11da4aec10be2f378465a94c2 (diff)
Connect multiple features
-rw-r--r--app/build.gradle4
-rw-r--r--app/src/main/AndroidManifest.xml2
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/common/RightRadioButton.kt43
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/dummy/DummyDataSource.kt141
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/features/dashboard/DashboardActivity.kt49
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/features/dashboard/DashboardFeature.kt38
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/features/dashboard/DashboardFragment.kt95
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/features/dashboard/DashboardViewModel.kt16
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/features/dashboard/QuickProtectionFragment.kt53
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/features/internetprivacy/InternetPrivacyFragment.kt38
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/features/location/FakeMyLocationFragment.kt38
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/features/permissions/PermissionAppsAdapter.kt52
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/features/permissions/PermissionControlFragment.kt59
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/features/permissions/PermissionsAdapter.kt63
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/features/permissions/PermissionsFragment.kt60
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/main/MainActivity.kt65
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/main/MainViewModel.kt22
-rw-r--r--app/src/main/res/drawable/dummy_img_map_picker.pngbin0 -> 339121 bytes
-rw-r--r--app/src/main/res/drawable/ic_body_monitor.xml19
-rw-r--r--app/src/main/res/drawable/ic_calendar.xml10
-rw-r--r--app/src/main/res/drawable/ic_call.xml10
-rw-r--r--app/src/main/res/drawable/ic_facebook.xml31
-rw-r--r--app/src/main/res/drawable/ic_location.xml30
-rw-r--r--app/src/main/res/layout/activity_main.xml286
-rw-r--r--app/src/main/res/layout/fragment_dashboard.xml334
-rw-r--r--app/src/main/res/layout/fragment_fake_location.xml151
-rw-r--r--app/src/main/res/layout/fragment_internet_activity_policy.xml105
-rw-r--r--app/src/main/res/layout/fragment_permission_control.xml46
-rw-r--r--app/src/main/res/layout/fragment_permissions.xml57
-rw-r--r--app/src/main/res/layout/fragment_quick_protection.xml68
-rw-r--r--app/src/main/res/layout/item_permission.xml73
-rw-r--r--app/src/main/res/layout/item_permission_apps.xml44
-rw-r--r--app/src/main/res/values/strings.xml19
-rw-r--r--app/src/main/res/values/themes.xml7
-rw-r--r--dependencies.gradle2
35 files changed, 1754 insertions, 376 deletions
diff --git a/app/build.gradle b/app/build.gradle
index 3e1624b..15fa88c 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -32,9 +32,13 @@ dependencies {
implementation project(":flow-mvi")
implementation Libs.Kotlin.stdlib
implementation Libs.AndroidX.coreKtx
+ implementation Libs.AndroidX.Fragment.fragmentKtx
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation Libs.AndroidX.Lifecycle.runtime
implementation Libs.AndroidX.Lifecycle.viewmodel
+
+ implementation 'com.google.android.material:material:1.3.0'
+
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 585961c..2c3b055 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -10,7 +10,7 @@
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.PrivacyCentralApp">
- <activity android:name=".features.dashboard.DashboardActivity">
+ <activity android:name=".main.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
diff --git a/app/src/main/java/foundation/e/privacycentralapp/common/RightRadioButton.kt b/app/src/main/java/foundation/e/privacycentralapp/common/RightRadioButton.kt
new file mode 100644
index 0000000..bbc108b
--- /dev/null
+++ b/app/src/main/java/foundation/e/privacycentralapp/common/RightRadioButton.kt
@@ -0,0 +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/>.
+ */
+
+package foundation.e.privacycentralapp.common
+
+import android.annotation.SuppressLint
+import android.content.Context
+import android.util.AttributeSet
+import android.widget.RadioButton
+
+/**
+ * A custom [RadioButton] which displays the radio drawable on the right side.
+ */
+@SuppressLint("AppCompatCustomView")
+class RightRadioButton : RadioButton {
+
+ constructor(context: Context) : super(context)
+ constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
+ constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(
+ context,
+ attrs,
+ defStyleAttr
+ )
+
+ // Returns layout direction as right-to-left to draw the compound button on right side.
+ override fun getLayoutDirection(): Int {
+ return LAYOUT_DIRECTION_RTL
+ }
+}
diff --git a/app/src/main/java/foundation/e/privacycentralapp/dummy/DummyDataSource.kt b/app/src/main/java/foundation/e/privacycentralapp/dummy/DummyDataSource.kt
new file mode 100644
index 0000000..65d072a
--- /dev/null
+++ b/app/src/main/java/foundation/e/privacycentralapp/dummy/DummyDataSource.kt
@@ -0,0 +1,141 @@
+/*
+ * 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.dummy
+
+import foundation.e.privacycentralapp.R
+
+// ======================================================//
+//
+// ============ ==== ==== ============
+// ============ ===== ===== ==== ====
+// ==== ====== ====== ==== ====
+// ==== ======= ======= ============
+// ==== ================ ====
+// ==== ==== ====== ==== ====
+// ============ ==== ==== ==== ====
+// ============ ==== == ==== ====
+//
+// ======================================================//
+
+/**
+ * This whole file acts as a dummy source. All data classes and method implementations
+ * are not proper ones and are subject to change anytime.
+ */
+
+/**
+ * Dummmy permission data class.
+ */
+data class Permission(
+ val name: String,
+ val iconId: Int,
+ val packagesRequested: List<String> = emptyList(),
+ val packagesAllowed: List<String> = emptyList()
+)
+
+object DummyDataSource {
+ val permissions = arrayOf("Body Sensor", "Calendar", "Call Logs", "Location")
+ val icons = arrayOf(
+ R.drawable.ic_body_monitor,
+ R.drawable.ic_calendar,
+ R.drawable.ic_call,
+ R.drawable.ic_location
+ )
+
+ val packages = arrayOf(
+ "facebook",
+ "uber",
+ "instagram",
+ "openstreetmap",
+ "truecaller",
+ "netflix",
+ "firefox",
+ "pubg",
+ "amazon",
+ "calendar",
+ "zohomail",
+ "privacycentral"
+ )
+
+ val populatedPermission: List<Permission> by lazy {
+ fetchPermissions()
+ }
+
+ private fun fetchPermissions(): List<Permission> {
+ val result = mutableListOf<Permission>()
+ permissions.forEachIndexed { index, permission ->
+ when (index) {
+ 0 -> result.add(Permission(permission, icons[index]))
+ 1 -> {
+ val randomPackages = getRandomItems(packages, 8)
+ val grantedPackages = getRandomItems(randomPackages, 3)
+ result.add(
+ Permission(
+ permission,
+ icons[index],
+ randomPackages,
+ grantedPackages
+ )
+ )
+ }
+ 2 -> {
+ val randomPackages = getRandomItems(packages, 10)
+ val grantedPackages = getRandomItems(randomPackages, 9)
+ result.add(
+ Permission(
+ permission,
+ icons[index],
+ randomPackages,
+ grantedPackages
+ )
+ )
+ }
+ 3 -> {
+ val randomPackages = getRandomItems(packages, 5)
+ val grantedPackages = getRandomItems(randomPackages, 3)
+ result.add(
+ Permission(
+ permission,
+ icons[index],
+ randomPackages,
+ grantedPackages
+ )
+ )
+ }
+ }
+ }
+ return result
+ }
+
+ private fun <T> getRandomItems(data: Array<T>, limit: Int): List<T> =
+ getRandomItems(data.asList(), limit)
+
+ private fun <T> getRandomItems(data: List<T>, limit: Int): List<T> {
+ val randomItems = mutableSetOf<T>()
+ val localData = data.toMutableList()
+ repeat(limit) {
+ val generated = localData.random()
+ randomItems.add(generated)
+ localData.remove(generated)
+ }
+ return randomItems.toList()
+ }
+
+ fun getPermission(permissionId: Int): Permission {
+ return populatedPermission.get(permissionId)
+ }
+}
diff --git a/app/src/main/java/foundation/e/privacycentralapp/features/dashboard/DashboardActivity.kt b/app/src/main/java/foundation/e/privacycentralapp/features/dashboard/DashboardActivity.kt
deleted file mode 100644
index ef296ce..0000000
--- a/app/src/main/java/foundation/e/privacycentralapp/features/dashboard/DashboardActivity.kt
+++ /dev/null
@@ -1,49 +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/>.
- */
-
-package foundation.e.privacycentralapp.features.dashboard
-
-import android.graphics.Color
-import android.os.Bundle
-import android.text.Spannable
-import android.text.SpannableString
-import android.text.style.ForegroundColorSpan
-import android.widget.TextView
-import androidx.appcompat.app.AppCompatActivity
-import foundation.e.privacycentralapp.R
-
-class DashboardActivity : AppCompatActivity() {
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- setContentView(R.layout.activity_main)
- title = "My Privacy Dashboard"
- setSupportActionBar(findViewById(R.id.toolbar))
-
- addClickToMore(findViewById<TextView>(R.id.personal_leakag_info))
- }
-
- private fun addClickToMore(textView: TextView) {
- val clickToMore = SpannableString("Click to learn more")
- clickToMore.setSpan(
- ForegroundColorSpan(Color.parseColor("#007fff")),
- 0,
- clickToMore.length,
- Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
- )
- textView.append(clickToMore)
- }
-}
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 9b8e28f..ecadea1 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
@@ -23,47 +23,51 @@ import foundation.e.flowmvi.feature.BaseFeature
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.flowOf
-// Define a state machine for HomeFeature
-object HomeFeature {
+// Define a state machine for Dashboard Feature
+object DashboardFeature {
sealed class State {
- object Loading : State()
- object Loaded : State()
+ object DashboardState : State()
+ object QuickProtectionState : State()
}
sealed class SingleEvent {
- object NavigateToQuickProtection : SingleEvent()
- object NavigateToTrackers : SingleEvent()
- object NavigateToInternetActivityPolicy : SingleEvent()
- object NavigateToLocation : SingleEvent()
- object NavigateToPermissionManagement : SingleEvent()
+ object NavigateToQuickProtectionSingleEvent : SingleEvent()
+ object NavigateToTrackersSingleEvent : SingleEvent()
+ object NavigateToInternetActivityPolicySingleEvent : SingleEvent()
+ object NavigateToLocationSingleEvent : SingleEvent()
+ object NavigateToPermissionManagementSingleEvent : SingleEvent()
}
sealed class Action {
- object load : Action()
+ object ShowQuickPrivacyProtectionInfoAction : Action()
+ object ShowDashboardAction : Action()
}
sealed class Effect {
- object LoadingFinished : Effect()
+ object OpenQuickPrivacyProtectionEffect : Effect()
+ object OpenDashboardEffect : Effect()
}
}
-private val reducer: Reducer<HomeFeature.State, HomeFeature.Effect> = { _, effect ->
+private val reducer: Reducer<DashboardFeature.State, DashboardFeature.Effect> = { _, effect ->
when (effect) {
- HomeFeature.Effect.LoadingFinished -> HomeFeature.State.Loaded
+ DashboardFeature.Effect.OpenQuickPrivacyProtectionEffect -> DashboardFeature.State.QuickProtectionState
+ DashboardFeature.Effect.OpenDashboardEffect -> DashboardFeature.State.DashboardState
}
}
-private val actor: Actor<HomeFeature.State, HomeFeature.Action, HomeFeature.Effect> =
+private val actor: Actor<DashboardFeature.State, DashboardFeature.Action, DashboardFeature.Effect> =
{ _, action ->
when (action) {
- HomeFeature.Action.load -> flowOf(HomeFeature.Effect.LoadingFinished)
+ DashboardFeature.Action.ShowQuickPrivacyProtectionInfoAction -> flowOf(DashboardFeature.Effect.OpenQuickPrivacyProtectionEffect)
+ DashboardFeature.Action.ShowDashboardAction -> flowOf(DashboardFeature.Effect.OpenDashboardEffect)
}
}
fun homeFeature(
- initialState: HomeFeature.State = HomeFeature.State.Loading,
+ initialState: DashboardFeature.State = DashboardFeature.State.DashboardState,
coroutineScope: CoroutineScope
-) = BaseFeature<HomeFeature.State, HomeFeature.Action, HomeFeature.Effect, HomeFeature.SingleEvent>(
+) = BaseFeature<DashboardFeature.State, DashboardFeature.Action, DashboardFeature.Effect, DashboardFeature.SingleEvent>(
initialState,
actor,
reducer,
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
new file mode 100644
index 0000000..d6a91b8
--- /dev/null
+++ b/app/src/main/java/foundation/e/privacycentralapp/features/dashboard/DashboardFragment.kt
@@ -0,0 +1,95 @@
+/*
+ * 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.features.dashboard
+
+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.TextView
+import android.widget.Toolbar
+import androidx.fragment.app.Fragment
+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.R
+import kotlinx.coroutines.flow.Flow
+
+class DashboardFragment :
+ Fragment(R.layout.fragment_dashboard),
+ MVIView<DashboardFeature.State, DashboardFeature.Action> {
+
+ private val viewModel: DashboardViewModel by activityViewModels()
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ lifecycleScope.launchWhenStarted {
+ viewModel.homeFeature.takeView(this, this@DashboardFragment)
+ }
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ val toolbar = view.findViewById<Toolbar>(R.id.toolbar)
+ setupToolbar(toolbar)
+ 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)
+ }
+ }
+ }
+
+ private fun setupToolbar(toolbar: Toolbar) {
+ val activity = requireActivity()
+ activity.setActionBar(toolbar)
+ activity.title = "My Privacy Dashboard"
+ }
+
+ private fun addClickToMore(textView: TextView) {
+ val clickToMore = SpannableString("Click to learn more")
+ clickToMore.setSpan(
+ ForegroundColorSpan(Color.parseColor("#007fff")),
+ 0,
+ clickToMore.length,
+ Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
+ )
+ textView.append(clickToMore)
+ }
+
+ override fun render(state: DashboardFeature.State) {
+ when (state) {
+ is DashboardFeature.State.QuickProtectionState -> {
+ requireActivity().supportFragmentManager.commit {
+ add<QuickProtectionFragment>(R.id.container)
+ setReorderingAllowed(true)
+ addToBackStack("dashboard")
+ }
+ }
+ else -> {
+ // TODO: any remaining state must either be handled or needs to be passed down to the UI.
+ }
+ }
+ }
+
+ 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 82c6c11..12696d5 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
@@ -20,11 +20,23 @@ package foundation.e.privacycentralapp.features.dashboard
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import foundation.e.flowmvi.feature.BaseFeature
+import kotlinx.coroutines.flow.MutableSharedFlow
+import kotlinx.coroutines.flow.asSharedFlow
+import kotlinx.coroutines.launch
class DashboardViewModel : ViewModel() {
- val homeFeature: BaseFeature<HomeFeature.State, HomeFeature.Action,
- HomeFeature.Effect, HomeFeature.SingleEvent> by lazy {
+ private val _actions = MutableSharedFlow<DashboardFeature.Action>()
+ val actions = _actions.asSharedFlow()
+
+ val homeFeature: BaseFeature<DashboardFeature.State, DashboardFeature.Action,
+ DashboardFeature.Effect, DashboardFeature.SingleEvent> by lazy {
homeFeature(coroutineScope = viewModelScope)
}
+
+ fun submitAction(action: DashboardFeature.Action) {
+ viewModelScope.launch {
+ _actions.emit(action)
+ }
+ }
}
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
new file mode 100644
index 0000000..c120b49
--- /dev/null
+++ b/app/src/main/java/foundation/e/privacycentralapp/features/dashboard/QuickProtectionFragment.kt
@@ -0,0 +1,53 @@
+/*
+ * 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.features.dashboard
+
+import android.content.Context
+import android.os.Bundle
+import android.view.View
+import android.widget.Toolbar
+import androidx.activity.addCallback
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.activityViewModels
+import foundation.e.privacycentralapp.R
+
+class QuickProtectionFragment : Fragment(R.layout.fragment_quick_protection) {
+
+ private val viewModel: DashboardViewModel by activityViewModels()
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ val toolbar = view.findViewById<Toolbar>(R.id.toolbar)
+ setupToolbar(toolbar)
+ }
+
+ override fun onAttach(context: Context) {
+ super.onAttach(context)
+ requireActivity().onBackPressedDispatcher.addCallback(this, true) {
+ viewModel.submitAction(DashboardFeature.Action.ShowDashboardAction)
+ this.isEnabled = false
+ requireActivity().onBackPressed()
+ }
+ }
+
+ private fun setupToolbar(toolbar: Toolbar) {
+ val activity = requireActivity()
+ activity.setActionBar(toolbar)
+ activity.title = "Quick protection"
+ }
+}
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
new file mode 100644
index 0000000..ddba807
--- /dev/null
+++ b/app/src/main/java/foundation/e/privacycentralapp/features/internetprivacy/InternetPrivacyFragment.kt
@@ -0,0 +1,38 @@
+/*
+ * 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.features.internetprivacy
+
+import android.os.Bundle
+import android.view.View
+import android.widget.Toolbar
+import androidx.fragment.app.Fragment
+import foundation.e.privacycentralapp.R
+
+class InternetPrivacyFragment : Fragment(R.layout.fragment_internet_activity_policy) {
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ val toolbar = view.findViewById<Toolbar>(R.id.toolbar)
+ setupToolbar(toolbar)
+ }
+
+ private fun setupToolbar(toolbar: Toolbar) {
+ val activity = requireActivity()
+ activity.setActionBar(toolbar)
+ activity.title = "My Internet Activity Privacy"
+ }
+}
diff --git a/app/src/main/java/foundation/e/privacycentralapp/features/location/FakeMyLocationFragment.kt b/app/src/main/java/foundation/e/privacycentralapp/features/location/FakeMyLocationFragment.kt
new file mode 100644
index 0000000..24d3951
--- /dev/null
+++ b/app/src/main/java/foundation/e/privacycentralapp/features/location/FakeMyLocationFragment.kt
@@ -0,0 +1,38 @@
+/*
+ * 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.features.location
+
+import android.os.Bundle
+import android.view.View
+import android.widget.Toolbar
+import androidx.fragment.app.Fragment
+import foundation.e.privacycentralapp.R
+
+class FakeMyLocationFragment : Fragment(R.layout.fragment_fake_location) {
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ val toolbar = view.findViewById<Toolbar>(R.id.toolbar)
+ setupToolbar(toolbar)
+ }
+
+ private fun setupToolbar(toolbar: Toolbar) {
+ val activity = requireActivity()
+ activity.setActionBar(toolbar)
+ activity.title = "Fake My Location"
+ }
+}
diff --git a/app/src/main/java/foundation/e/privacycentralapp/features/permissions/PermissionAppsAdapter.kt b/app/src/main/java/foundation/e/privacycentralapp/features/permissions/PermissionAppsAdapter.kt
new file mode 100644
index 0000000..19460cc
--- /dev/null
+++ b/app/src/main/java/foundation/e/privacycentralapp/features/permissions/PermissionAppsAdapter.kt
@@ -0,0 +1,52 @@
+/*
+ * 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.features.permissions
+
+import android.annotation.SuppressLint
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.ImageView
+import android.widget.Switch
+import android.widget.TextView
+import androidx.recyclerview.widget.RecyclerView
+import foundation.e.privacycentralapp.R
+
+class PermissionAppsAdapter(private val dataSet: List<Pair<String, Boolean>>) :
+ RecyclerView.Adapter<PermissionAppsAdapter.PermissionViewHolder>() {
+
+ class PermissionViewHolder(view: View) : RecyclerView.ViewHolder(view) {
+ val appName: TextView = view.findViewById(R.id.app_title)
+ @SuppressLint("UseSwitchCompatOrMaterialCode") val togglePermission: Switch = view.findViewById(R.id.togglePermission)
+ val appIcon: ImageView = view.findViewById(R.id.app_icon)
+ }
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PermissionViewHolder {
+ val view = LayoutInflater.from(parent.context)
+ .inflate(R.layout.item_permission_apps, parent, false)
+ return PermissionViewHolder(view)
+ }
+
+ override fun onBindViewHolder(holder: PermissionViewHolder, position: Int) {
+ val permission = dataSet[position]
+ holder.appName.text = permission.first
+ holder.togglePermission.isChecked = permission.second
+ }
+
+ override fun getItemCount(): Int = dataSet.size
+}
diff --git a/app/src/main/java/foundation/e/privacycentralapp/features/permissions/PermissionControlFragment.kt b/app/src/main/java/foundation/e/privacycentralapp/features/permissions/PermissionControlFragment.kt
new file mode 100644
index 0000000..55e3f88
--- /dev/null
+++ b/app/src/main/java/foundation/e/privacycentralapp/features/permissions/PermissionControlFragment.kt
@@ -0,0 +1,59 @@
+/*
+ * 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.features.permissions
+
+import android.os.Bundle
+import android.view.View
+import android.widget.TextView
+import android.widget.Toolbar
+import androidx.fragment.app.Fragment
+import androidx.recyclerview.widget.LinearLayoutManager
+import androidx.recyclerview.widget.RecyclerView
+import foundation.e.privacycentralapp.R
+import foundation.e.privacycentralapp.dummy.DummyDataSource
+
+class PermissionControlFragment : Fragment(R.layout.fragment_permission_control) {
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ val toolbar = view.findViewById<Toolbar>(R.id.toolbar)
+ setupToolbar(toolbar)
+
+ val permissionId = requireArguments().getInt("PERMISSION_ID")
+ loadData(view, permissionId)
+ }
+
+ private fun loadData(view: View, permissionId: Int) {
+ val recyclerView = view.findViewById<RecyclerView>(R.id.recylcer_view_permission_apps)
+ val permission = DummyDataSource.getPermission(permissionId)
+ val listOfPackages = mutableListOf<Pair<String, Boolean>>()
+ permission.packagesRequested.forEach {
+ listOfPackages.add(it to permission.packagesAllowed.contains(it))
+ }
+ recyclerView.layoutManager = LinearLayoutManager(requireContext())
+ recyclerView.setHasFixedSize(true)
+ recyclerView.adapter = PermissionAppsAdapter(listOfPackages)
+ view.findViewById<TextView>(R.id.permission_control).text =
+ getString(R.string.apps_access_to_permission, permission.name)
+ }
+
+ private fun setupToolbar(toolbar: Toolbar) {
+ val activity = requireActivity()
+ activity.setActionBar(toolbar)
+ activity.title = "My Apps Permission"
+ }
+}
diff --git a/app/src/main/java/foundation/e/privacycentralapp/features/permissions/PermissionsAdapter.kt b/app/src/main/java/foundation/e/privacycentralapp/features/permissions/PermissionsAdapter.kt
new file mode 100644
index 0000000..330a1ac
--- /dev/null
+++ b/app/src/main/java/foundation/e/privacycentralapp/features/permissions/PermissionsAdapter.kt
@@ -0,0 +1,63 @@
+/*
+ * 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.features.permissions
+
+import android.content.Context
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.ImageView
+import android.widget.TextView
+import androidx.recyclerview.widget.RecyclerView
+import foundation.e.privacycentralapp.R
+import foundation.e.privacycentralapp.dummy.Permission
+
+class PermissionsAdapter(
+ private val context: Context,
+ private val dataSet: List<Permission>,
+ private val listener: (Int) -> Unit
+) :
+ RecyclerView.Adapter<PermissionsAdapter.PermissionViewHolder>() {
+
+ class PermissionViewHolder(view: View) : RecyclerView.ViewHolder(view) {
+ val nameView: TextView = view.findViewById(R.id.permission_title)
+ val permissionCountView: TextView = view.findViewById(R.id.permission_count)
+ val permissionIcon: ImageView = view.findViewById(R.id.permission_icon)
+ }
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PermissionViewHolder {
+ val view = LayoutInflater.from(parent.context)
+ .inflate(R.layout.item_permission, parent, false)
+ val holder = PermissionViewHolder(view)
+ view.setOnClickListener { listener(holder.adapterPosition) }
+ return holder
+ }
+
+ override fun onBindViewHolder(holder: PermissionViewHolder, position: Int) {
+ val permission = dataSet[position]
+ holder.nameView.text = permission.name
+ holder.permissionCountView.text = context.getString(
+ R.string.apps_allowed,
+ permission.packagesAllowed.size,
+ permission.packagesRequested.size
+ )
+ holder.permissionIcon.setImageResource(permission.iconId)
+ }
+
+ override fun getItemCount(): Int = dataSet.size
+}
diff --git a/app/src/main/java/foundation/e/privacycentralapp/features/permissions/PermissionsFragment.kt b/app/src/main/java/foundation/e/privacycentralapp/features/permissions/PermissionsFragment.kt
new file mode 100644
index 0000000..27247ea
--- /dev/null
+++ b/app/src/main/java/foundation/e/privacycentralapp/features/permissions/PermissionsFragment.kt
@@ -0,0 +1,60 @@
+/*
+ * 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.features.permissions
+
+import android.os.Bundle
+import android.view.View
+import android.widget.Toolbar
+import androidx.core.os.bundleOf
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.add
+import androidx.fragment.app.commit
+import androidx.recyclerview.widget.LinearLayoutManager
+import androidx.recyclerview.widget.RecyclerView
+import foundation.e.privacycentralapp.R
+import foundation.e.privacycentralapp.dummy.DummyDataSource
+
+class PermissionsFragment : Fragment(R.layout.fragment_permissions) {
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ val toolbar = view.findViewById<Toolbar>(R.id.toolbar)
+ setupToolbar(toolbar)
+
+ loadDataIntoRecyclerView(view.findViewById(R.id.recylcer_view_permissions))
+ }
+
+ private fun loadDataIntoRecyclerView(view: RecyclerView) {
+ val permissions = DummyDataSource.populatedPermission
+ view.layoutManager = LinearLayoutManager(requireContext())
+ view.setHasFixedSize(true)
+ view.adapter = PermissionsAdapter(requireContext(), permissions) { permissionId ->
+ requireActivity().supportFragmentManager.commit {
+ val bundle = bundleOf("PERMISSION_ID" to permissionId)
+ add<PermissionControlFragment>(R.id.container, args = bundle)
+ setReorderingAllowed(true)
+ addToBackStack("permissions")
+ }
+ }
+ }
+
+ private fun setupToolbar(toolbar: Toolbar) {
+ val activity = requireActivity()
+ activity.setActionBar(toolbar)
+ activity.title = "My Apps Permission"
+ }
+}
diff --git a/app/src/main/java/foundation/e/privacycentralapp/main/MainActivity.kt b/app/src/main/java/foundation/e/privacycentralapp/main/MainActivity.kt
new file mode 100644
index 0000000..d5b449f
--- /dev/null
+++ b/app/src/main/java/foundation/e/privacycentralapp/main/MainActivity.kt
@@ -0,0 +1,65 @@
+/*
+ * 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.main
+
+import android.app.Activity
+import android.content.Intent
+import android.os.Bundle
+import androidx.activity.viewModels
+import androidx.fragment.app.FragmentActivity
+import androidx.fragment.app.add
+import androidx.fragment.app.commit
+import foundation.e.privacycentralapp.R
+import foundation.e.privacycentralapp.features.permissions.PermissionsFragment
+
+open class MainActivity : FragmentActivity(R.layout.activity_main) {
+
+ private val viewModel: MainViewModel by viewModels()
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ if (savedInstanceState == null) {
+ supportFragmentManager.commit {
+ setReorderingAllowed(true)
+ add<PermissionsFragment>(R.id.container)
+ }
+ }
+ }
+
+ override fun onPostCreate(savedInstanceState: Bundle?) {
+ super.onPostCreate(savedInstanceState)
+ handleIntent(intent)
+ }
+
+ override fun onNewIntent(intent: Intent) {
+ super.onNewIntent(intent)
+ handleIntent(intent)
+ }
+
+ open fun handleIntent(intent: Intent) {}
+
+ override fun finishAfterTransition() {
+ val resultData = Intent()
+ val result = onPopulateResultIntent(resultData)
+ setResult(result, resultData)
+
+ super.finishAfterTransition()
+ }
+
+ open fun onPopulateResultIntent(intent: Intent): Int = Activity.RESULT_OK
+}
diff --git a/app/src/main/java/foundation/e/privacycentralapp/main/MainViewModel.kt b/app/src/main/java/foundation/e/privacycentralapp/main/MainViewModel.kt
new file mode 100644
index 0000000..7e758b7
--- /dev/null
+++ b/app/src/main/java/foundation/e/privacycentralapp/main/MainViewModel.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.main
+
+import androidx.lifecycle.ViewModel
+
+class MainViewModel : ViewModel()
diff --git a/app/src/main/res/drawable/dummy_img_map_picker.png b/app/src/main/res/drawable/dummy_img_map_picker.png
new file mode 100644
index 0000000..c1cf32b
--- /dev/null
+++ b/app/src/main/res/drawable/dummy_img_map_picker.png
Binary files differ
diff --git a/app/src/main/res/drawable/ic_body_monitor.xml b/app/src/main/res/drawable/ic_body_monitor.xml
new file mode 100644
index 0000000..cbf0d27
--- /dev/null
+++ b/app/src/main/res/drawable/ic_body_monitor.xml
@@ -0,0 +1,19 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24"
+ android:viewportHeight="24"
+ android:tint="@color/black">
+ <path
+ android:fillColor="@android:color/white"
+ android:pathData="M19,3H5C3.9,3 3,3.9 3,5v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2V5C21,3.9 20.1,3 19,3zM12,12c-1.66,0 -3,-1.34 -3,-3s1.34,-3 3,-3s3,1.34 3,3S13.66,12 12,12z"/>
+ <path
+ android:fillColor="@android:color/white"
+ android:pathData="M10,8.5h1v1h-1z"/>
+ <path
+ android:fillColor="@android:color/white"
+ android:pathData="M11.5,8.5h1v1h-1z"/>
+ <path
+ android:fillColor="@android:color/white"
+ android:pathData="M13,8.5h1v1h-1z"/>
+</vector>
diff --git a/app/src/main/res/drawable/ic_calendar.xml b/app/src/main/res/drawable/ic_calendar.xml
new file mode 100644
index 0000000..376c5a4
--- /dev/null
+++ b/app/src/main/res/drawable/ic_calendar.xml
@@ -0,0 +1,10 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24"
+ android:viewportHeight="24"
+ android:tint="@color/black">
+ <path
+ android:fillColor="@android:color/white"
+ android:pathData="M9,11L7,11v2h2v-2zM13,11h-2v2h2v-2zM17,11h-2v2h2v-2zM19,4h-1L18,2h-2v2L8,4L8,2L6,2v2L5,4c-1.11,0 -1.99,0.9 -1.99,2L3,20c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2L21,6c0,-1.1 -0.9,-2 -2,-2zM19,20L5,20L5,9h14v11z"/>
+</vector>
diff --git a/app/src/main/res/drawable/ic_call.xml b/app/src/main/res/drawable/ic_call.xml
new file mode 100644
index 0000000..41d8b40
--- /dev/null
+++ b/app/src/main/res/drawable/ic_call.xml
@@ -0,0 +1,10 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24"
+ android:viewportHeight="24"
+ android:tint="@color/black">
+ <path
+ android:fillColor="@android:color/white"
+ android:pathData="M13,9h-2v2h2L13,9zM17,9h-2v2h2L17,9zM20,15.5c-1.25,0 -2.45,-0.2 -3.57,-0.57 -0.35,-0.11 -0.74,-0.03 -1.02,0.24l-2.2,2.2c-2.83,-1.44 -5.15,-3.75 -6.59,-6.58l2.2,-2.21c0.28,-0.27 0.36,-0.66 0.25,-1.01C8.7,6.45 8.5,5.25 8.5,4c0,-0.55 -0.45,-1 -1,-1L4,3c-0.55,0 -1,0.45 -1,1 0,9.39 7.61,17 17,17 0.55,0 1,-0.45 1,-1v-3.5c0,-0.55 -0.45,-1 -1,-1zM19,9v2h2L21,9h-2z"/>
+</vector>
diff --git a/app/src/main/res/drawable/ic_facebook.xml b/app/src/main/res/drawable/ic_facebook.xml
new file mode 100644
index 0000000..49597b3
--- /dev/null
+++ b/app/src/main/res/drawable/ic_facebook.xml
@@ -0,0 +1,31 @@
+<!--
+ ~ 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 xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="512dp"
+ android:height="512dp"
+ android:viewportWidth="512"
+ android:viewportHeight="512">
+ <path
+ android:pathData="M512,256c0,-141.385 -114.615,-256 -256,-256c-141.385,0 -256,114.615 -256,256c0,127.777 93.616,233.685 216,252.89l0,-178.89l-65,0l0,-74l65,0l0,-56.4c0,-64.16 38.219,-99.6 96.695,-99.6c28.009,0 57.305,5 57.305,5l0,63l-32.281,0c-31.801,0 -41.719,19.733 -41.719,39.978l0,48.022l71,0l-11.35,74l-59.65,0l0,178.89c122.385,-19.205 216,-125.113 216,-252.89Z"
+ android:fillColor="#1877f2"
+ android:fillType="nonZero"/>
+ <path
+ android:pathData="M355.65,330l11.35,-74l-71,0l0,-48.022c0,-20.245 9.917,-39.978 41.719,-39.978l32.281,0l0,-63c0,0 -29.297,-5 -57.305,-5c-58.476,0 -96.695,35.44 -96.695,99.6l0,56.4l-65,0l0,74l65,0l0,178.89c13.033,2.045 26.392,3.11 40,3.11c13.608,0 26.966,-1.065 40,-3.11l0,-178.89l59.65,0Z"
+ android:fillColor="#fff"
+ android:fillType="nonZero"/>
+</vector>
diff --git a/app/src/main/res/drawable/ic_location.xml b/app/src/main/res/drawable/ic_location.xml
index 3b04dc4..e117e22 100644
--- a/app/src/main/res/drawable/ic_location.xml
+++ b/app/src/main/res/drawable/ic_location.xml
@@ -1,22 +1,10 @@
-<!--
- ~ 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="24dp"
+ android:height="24dp"
+ android:viewportWidth="24"
+ android:viewportHeight="24"
+ android:tint="@color/black">
+ <path
+ android:fillColor="@android:color/white"
+ android:pathData="M12,8c-2.21,0 -4,1.79 -4,4s1.79,4 4,4 4,-1.79 4,-4 -1.79,-4 -4,-4zM20.94,11c-0.46,-4.17 -3.77,-7.48 -7.94,-7.94L13,1h-2v2.06C6.83,3.52 3.52,6.83 3.06,11L1,11v2h2.06c0.46,4.17 3.77,7.48 7.94,7.94L11,23h2v-2.06c4.17,-0.46 7.48,-3.77 7.94,-7.94L23,13v-2h-2.06zM12,19c-3.87,0 -7,-3.13 -7,-7s3.13,-7 7,-7 7,3.13 7,7 -3.13,7 -7,7z"/>
</vector>
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index 9bf4396..7013496 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -1,286 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
-<FrameLayout 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"
+<androidx.fragment.app.FragmentContainerView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
- >
-
- <androidx.appcompat.widget.Toolbar
- android:id="@+id/toolbar"
- android:layout_width="match_parent"
- android:layout_height="?android:attr/actionBarSize"
- android:layout_gravity="top|center"
- android:background="@color/white"
- tools:layout_height="56dp"
- />
-
- <androidx.core.widget.NestedScrollView
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_marginTop="?android:attr/actionBarSize"
- >
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:background="@color/white"
- android:gravity="center_horizontal"
- android:orientation="vertical"
- tools:context=".features.dashboard.DashboardActivity"
- >
-
- <TextView
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_gravity="center_horizontal"
- android:gravity="center"
- android:paddingLeft="32dp"
- android:paddingTop="16dp"
- android:paddingRight="32dp"
- android:paddingBottom="16dp"
- android:text="@string/privacy_dashboard_info"
- android:textColor="@color/black"
- android:textSize="14sp"
- />
-
- <ImageView
- android:id="@+id/togglePrivacyCentral"
- android:layout_width="96dp"
- android:layout_height="96dp"
- android:layout_marginTop="16dp"
- android:layout_marginBottom="16dp"
- android:src="@drawable/ic_privacy_toggle"
- />
-
- <TextView
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_gravity="center_horizontal"
- android:drawableEnd="@drawable/ic_chevron_right_24dp"
- android:fontFamily="sans-serif-medium"
- android:gravity="center"
- android:paddingLeft="32dp"
- android:paddingTop="16dp"
- android:paddingRight="32dp"
- android:paddingBottom="16dp"
- android:text="@string/tap_to_enable_quick_protection"
- android:textColor="@color/black"
- android:textSize="14sp"
- />
-
- <ImageView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:src="@drawable/dummy_leakage_analytics"
- />
-
- <TextView
- android:id="@+id/personal_leakag_info"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_gravity="center_horizontal"
- android:gravity="center"
- android:paddingLeft="32dp"
- android:paddingRight="32dp"
- android:text="@string/personal_leakage_info"
- android:textColor="@color/black"
- android:textSize="12sp"
- />
-
- <RelativeLayout
- android:id="@+id/am_i_tracked"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:background="#f9f9f9"
- android:paddingTop="16dp"
- android:paddingBottom="16dp"
- android:paddingLeft="32dp"
- android:paddingRight="32dp">
- <ImageView android:src="@drawable/ic_tracked"
- android:id="@+id/am_i_tracked_icon"
- android:layout_width="36dp"
- android:layout_height="36dp"
- android:layout_centerVertical="true"
- android:layout_alignParentStart="true"/>
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingStart="16dp"
- android:paddingEnd="32dp"
- android:orientation="vertical"
- android:layout_toEndOf="@+id/am_i_tracked_icon"
- android:layout_toStartOf="@+id/am_i_tracked_chevron">
- <TextView
- android:id="@+id/am_i_tracked_title"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:fontFamily="sans-serif-medium"
- android:text="@string/am_i_tracked_title"
- android:textColor="@color/black"
- android:textSize="16sp"
- />
- <TextView
- android:id="@+id/am_i_tracked_subtitle"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="@string/am_i_tracked_subtitle"
- android:textColor="@color/black"
- android:textSize="14sp"
- />
- </LinearLayout>
- <ImageView android:src="@drawable/ic_chevron_right_24dp"
- android:id="@+id/am_i_tracked_chevron"
- android:layout_width="24dp"
- android:layout_height="24dp"
- android:layout_centerVertical="true"
- android:layout_alignParentEnd="true"/>
- </RelativeLayout>
- <RelativeLayout
- android:id="@+id/apps_permissions"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:background="#f9f9f9"
- android:paddingTop="16dp"
- android:paddingBottom="16dp"
- android:paddingLeft="32dp"
- android:paddingRight="32dp">
- <ImageView android:src="@drawable/ic_apps_permissions"
- android:id="@+id/apps_permissions_icon"
- android:layout_width="36dp"
- android:layout_height="36dp"
- android:layout_centerVertical="true"
- android:layout_alignParentStart="true"/>
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingStart="16dp"
- android:paddingEnd="32dp"
- android:orientation="vertical"
- android:layout_toEndOf="@+id/apps_permissions_icon"
- android:layout_toStartOf="@+id/apps_permissions_chevron">
- <TextView
- android:id="@+id/apps_permissions_title"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:fontFamily="sans-serif-medium"
- android:text="@string/apps_permissions_title"
- android:textColor="@color/black"
- android:textSize="16sp"
- />
- <TextView
- android:id="@+id/apps_permissions_subtitle"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="@string/apps_permissions_subtitle"
- android:textColor="@color/black"
- android:textSize="14sp"
- />
- </LinearLayout>
- <ImageView android:src="@drawable/ic_chevron_right_24dp"
- android:id="@+id/apps_permissions_chevron"
- android:layout_width="24dp"
- android:layout_height="24dp"
- android:layout_centerVertical="true"
- android:layout_alignParentEnd="true"/>
- </RelativeLayout>
- <RelativeLayout
- android:id="@+id/my_location"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:background="#f9f9f9"
- android:paddingTop="16dp"
- android:paddingBottom="16dp"
- android:paddingLeft="32dp"
- android:paddingRight="32dp">
- <ImageView android:src="@drawable/ic_location"
- android:id="@+id/my_location_icon"
- android:layout_width="36dp"
- android:layout_height="36dp"
- android:layout_centerVertical="true"
- android:layout_alignParentStart="true"/>
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingStart="16dp"
- android:paddingEnd="32dp"
- android:orientation="vertical"
- android:layout_toEndOf="@+id/my_location_icon"
- android:layout_toStartOf="@+id/my_location_chevron">
- <TextView
- android:id="@+id/my_location_title"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:fontFamily="sans-serif-medium"
- android:text="@string/my_location_title"
- android:textColor="@color/black"
- android:textSize="16sp"
- />
- <TextView
- android:id="@+id/my_location_subtitle"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="@string/my_location_subtitle"
- android:textColor="@color/black"
- android:textSize="14sp"
- />
- </LinearLayout>
- <ImageView android:src="@drawable/ic_chevron_right_24dp"
- android:id="@+id/my_location_chevron"
- android:layout_width="24dp"
- android:layout_height="24dp"
- android:layout_centerVertical="true"
- android:layout_alignParentEnd="true"/>
- </RelativeLayout>
- <RelativeLayout
- android:id="@+id/internet_activity_privacy"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:background="#f9f9f9"
- android:paddingTop="16dp"
- android:paddingBottom="16dp"
- android:paddingLeft="32dp"
- android:paddingRight="32dp">
- <ImageView android:src="@drawable/ic_internet_activity"
- android:id="@+id/internet_activity_privacy_icon"
- android:layout_width="36dp"
- android:layout_height="36dp"
- android:layout_centerVertical="true"
- android:layout_alignParentStart="true"/>
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingStart="16dp"
- android:paddingEnd="32dp"
- android:orientation="vertical"
- android:layout_toEndOf="@+id/internet_activity_privacy_icon"
- android:layout_toStartOf="@+id/internet_activity_privacy_chevron">
- <TextView
- android:id="@+id/internet_activity_privacy_title"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:fontFamily="sans-serif-medium"
- android:text="@string/internet_activity_privacy_title"
- android:textColor="@color/black"
- android:textSize="16sp"
- />
- <TextView
- android:id="@+id/internet_activity_privacy_subtitle"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="@string/internet_activity_privacy_subtitle"
- android:textColor="@color/black"
- android:textSize="14sp"
- />
- </LinearLayout>
- <ImageView android:src="@drawable/ic_chevron_right_24dp"
- android:id="@+id/internet_activity_privacy_chevron"
- android:layout_width="24dp"
- android:layout_height="24dp"
- android:layout_centerVertical="true"
- android:layout_alignParentEnd="true"/>
- </RelativeLayout>
-
- </LinearLayout>
- </androidx.core.widget.NestedScrollView>
-</FrameLayout> \ No newline at end of file
+ /> \ 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
new file mode 100644
index 0000000..ed4de49
--- /dev/null
+++ b/app/src/main/res/layout/fragment_dashboard.xml
@@ -0,0 +1,334 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout 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_width="match_parent"
+ android:layout_height="match_parent"
+ >
+
+ <Toolbar
+ android:id="@+id/toolbar"
+ android:layout_width="match_parent"
+ android:layout_height="?android:attr/actionBarSize"
+ android:layout_gravity="top|center"
+ android:background="@color/white"
+ tools:layout_height="56dp"
+ />
+
+ <androidx.core.widget.NestedScrollView
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_marginTop="?android:attr/actionBarSize"
+ >
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@color/white"
+ android:gravity="center_horizontal"
+ android:orientation="vertical"
+ tools:context=".main.MainActivity"
+ >
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal"
+ android:gravity="center"
+ android:paddingLeft="32dp"
+ android:paddingTop="16dp"
+ android:paddingRight="32dp"
+ android:paddingBottom="16dp"
+ android:text="@string/privacy_dashboard_info"
+ android:textColor="@color/black"
+ android:textSize="14sp"
+ />
+
+ <ImageView
+ android:id="@+id/togglePrivacyCentral"
+ android:layout_width="96dp"
+ android:layout_height="96dp"
+ android:layout_marginTop="16dp"
+ android:layout_marginBottom="16dp"
+ android:src="@drawable/ic_privacy_toggle"
+ />
+
+ <TextView
+ android:id="@+id/tap_to_enable_quick_protection"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal"
+ android:drawableEnd="@drawable/ic_chevron_right_24dp"
+ android:fontFamily="sans-serif-medium"
+ android:gravity="center"
+ android:paddingLeft="32dp"
+ android:paddingTop="16dp"
+ android:paddingRight="32dp"
+ android:paddingBottom="16dp"
+ android:text="@string/tap_to_enable_quick_protection"
+ android:textColor="@color/black"
+ android:textSize="14sp"
+ />
+
+ <ImageView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:src="@drawable/dummy_leakage_analytics"
+ />
+
+ <TextView
+ android:id="@+id/personal_leakag_info"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal"
+ android:gravity="center"
+ android:paddingLeft="32dp"
+ android:paddingRight="32dp"
+ android:text="@string/personal_leakage_info"
+ android:textColor="@color/black"
+ android:textSize="12sp"
+ />
+
+ <RelativeLayout
+ android:id="@+id/am_i_tracked"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:background="#f9f9f9"
+ android:paddingLeft="32dp"
+ android:paddingTop="16dp"
+ android:paddingRight="32dp"
+ android:paddingBottom="16dp"
+ >
+
+ <ImageView
+ android:id="@+id/am_i_tracked_icon"
+ android:layout_width="36dp"
+ android:layout_height="36dp"
+ android:layout_alignParentStart="true"
+ android:layout_centerVertical="true"
+ android:src="@drawable/ic_tracked"
+ />
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_toStartOf="@+id/am_i_tracked_chevron"
+ android:layout_toEndOf="@+id/am_i_tracked_icon"
+ android:orientation="vertical"
+ android:paddingStart="16dp"
+ android:paddingEnd="32dp"
+ >
+
+ <TextView
+ android:id="@+id/am_i_tracked_title"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:fontFamily="sans-serif-medium"
+ android:text="@string/am_i_tracked_title"
+ android:textColor="@color/black"
+ android:textSize="16sp"
+ />
+
+ <TextView
+ android:id="@+id/am_i_tracked_subtitle"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ 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_width="24dp"
+ android:layout_height="24dp"
+ android:layout_alignParentEnd="true"
+ android:layout_centerVertical="true"
+ android:src="@drawable/ic_chevron_right_24dp"
+ />
+ </RelativeLayout>
+
+ <RelativeLayout
+ android:id="@+id/apps_permissions"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:background="#f9f9f9"
+ android:paddingLeft="32dp"
+ android:paddingTop="16dp"
+ android:paddingRight="32dp"
+ android:paddingBottom="16dp"
+ >
+
+ <ImageView
+ android:id="@+id/apps_permissions_icon"
+ android:layout_width="36dp"
+ android:layout_height="36dp"
+ android:layout_alignParentStart="true"
+ android:layout_centerVertical="true"
+ android:src="@drawable/ic_apps_permissions"
+ />
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_toStartOf="@+id/apps_permissions_chevron"
+ android:layout_toEndOf="@+id/apps_permissions_icon"
+ android:orientation="vertical"
+ android:paddingStart="16dp"
+ android:paddingEnd="32dp"
+ >
+
+ <TextView
+ android:id="@+id/apps_permissions_title"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:fontFamily="sans-serif-medium"
+ android:text="@string/apps_permissions_title"
+ android:textColor="@color/black"
+ android:textSize="16sp"
+ />
+
+ <TextView
+ android:id="@+id/apps_permissions_subtitle"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/apps_permissions_subtitle"
+ android:textColor="@color/black"
+ android:textSize="14sp"
+ />
+ </LinearLayout>
+
+ <ImageView
+ android:id="@+id/apps_permissions_chevron"
+ android:layout_width="24dp"
+ android:layout_height="24dp"
+ android:layout_alignParentEnd="true"
+ android:layout_centerVertical="true"
+ android:src="@drawable/ic_chevron_right_24dp"
+ />
+ </RelativeLayout>
+
+ <RelativeLayout
+ android:id="@+id/my_location"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:background="#f9f9f9"
+ android:paddingLeft="32dp"
+ android:paddingTop="16dp"
+ android:paddingRight="32dp"
+ android:paddingBottom="16dp"
+ >
+
+ <ImageView
+ android:id="@+id/my_location_icon"
+ android:layout_width="36dp"
+ android:layout_height="36dp"
+ android:layout_alignParentStart="true"
+ android:layout_centerVertical="true"
+ android:src="@drawable/ic_location"
+ />
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_toStartOf="@+id/my_location_chevron"
+ android:layout_toEndOf="@+id/my_location_icon"
+ android:orientation="vertical"
+ android:paddingStart="16dp"
+ android:paddingEnd="32dp"
+ >
+
+ <TextView
+ android:id="@+id/my_location_title"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:fontFamily="sans-serif-medium"
+ android:text="@string/my_location_title"
+ android:textColor="@color/black"
+ android:textSize="16sp"
+ />
+
+ <TextView
+ android:id="@+id/my_location_subtitle"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/my_location_subtitle"
+ android:textColor="@color/black"
+ android:textSize="14sp"
+ />
+ </LinearLayout>
+
+ <ImageView
+ android:id="@+id/my_location_chevron"
+ android:layout_width="24dp"
+ android:layout_height="24dp"
+ android:layout_alignParentEnd="true"
+ android:layout_centerVertical="true"
+ android:src="@drawable/ic_chevron_right_24dp"
+ />
+ </RelativeLayout>
+
+ <RelativeLayout
+ android:id="@+id/internet_activity_privacy"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:background="#f9f9f9"
+ android:paddingLeft="32dp"
+ android:paddingTop="16dp"
+ android:paddingRight="32dp"
+ android:paddingBottom="16dp"
+ >
+
+ <ImageView
+ android:id="@+id/internet_activity_privacy_icon"
+ android:layout_width="36dp"
+ android:layout_height="36dp"
+ android:layout_alignParentStart="true"
+ android:layout_centerVertical="true"
+ android:src="@drawable/ic_internet_activity"
+ />
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_toStartOf="@+id/internet_activity_privacy_chevron"
+ android:layout_toEndOf="@+id/internet_activity_privacy_icon"
+ android:orientation="vertical"
+ android:paddingStart="16dp"
+ android:paddingEnd="32dp"
+ >
+
+ <TextView
+ android:id="@+id/internet_activity_privacy_title"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:fontFamily="sans-serif-medium"
+ android:text="@string/internet_activity_privacy_title"
+ android:textColor="@color/black"
+ android:textSize="16sp"
+ />
+
+ <TextView
+ android:id="@+id/internet_activity_privacy_subtitle"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/internet_activity_privacy_subtitle"
+ android:textColor="@color/black"
+ android:textSize="14sp"
+ />
+ </LinearLayout>
+
+ <ImageView
+ android:id="@+id/internet_activity_privacy_chevron"
+ android:layout_width="24dp"
+ android:layout_height="24dp"
+ android:layout_alignParentEnd="true"
+ android:layout_centerVertical="true"
+ android:src="@drawable/ic_chevron_right_24dp"
+ />
+ </RelativeLayout>
+
+ </LinearLayout>
+ </androidx.core.widget.NestedScrollView>
+</FrameLayout> \ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_fake_location.xml b/app/src/main/res/layout/fragment_fake_location.xml
new file mode 100644
index 0000000..1b02f86
--- /dev/null
+++ b/app/src/main/res/layout/fragment_fake_location.xml
@@ -0,0 +1,151 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout 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_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@color/white"
+ >
+
+ <Toolbar
+ android:id="@+id/toolbar"
+ android:layout_width="match_parent"
+ android:layout_height="?android:attr/actionBarSize"
+ android:layout_gravity="top|center"
+ android:background="@color/white"
+ tools:layout_height="56dp"
+ />
+
+ <androidx.core.widget.NestedScrollView
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_marginTop="?android:attr/actionBarSize"
+ android:layout_marginBottom="32dp"
+ >
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical"
+ android:paddingLeft="32dp"
+ android:paddingRight="32dp"
+ tools:context=".main.MainActivity"
+ >
+
+ <TextView
+ android:id="@+id/fake_location_info"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal"
+ android:paddingTop="16dp"
+ android:text="@string/fake_location_info"
+ android:textColor="@color/black"
+ android:textSize="14sp"
+ />
+
+ <TextView
+ android:id="@+id/learn_more_fake_location"
+ android:layout_width="wrap_content"
+ android:layout_height="48dp"
+ android:fontFamily="sans-serif-medium"
+ android:gravity="center_vertical"
+ android:text="@string/learn_more"
+ android:textColor="#007fff"
+ android:textSize="14sp"
+ />
+
+ <TextView
+ android:id="@+id/my_location_header"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:fontFamily="sans-serif-medium"
+ android:paddingTop="16dp"
+ android:paddingBottom="8dp"
+ android:text="@string/my_location_title"
+ android:textColor="@color/black"
+ android:textSize="14sp"
+ />
+
+ <RadioGroup
+ android:id="@+id/location_choices"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ >
+
+ <foundation.e.privacycentralapp.common.RightRadioButton
+ android:id="@+id/radio_use_real_location"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/use_real_location"
+ android:textSize="16sp"
+ />
+
+ <foundation.e.privacycentralapp.common.RightRadioButton
+ android:id="@+id/radio_use_random_location"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/use_random_location"
+ android:textSize="16sp"
+ />
+
+ <foundation.e.privacycentralapp.common.RightRadioButton
+ android:id="@+id/radio_use_specific_location"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/use_specific_location"
+ android:textSize="16sp"
+ />
+ </RadioGroup>
+
+ <ImageView
+ android:layout_width="match_parent"
+ android:layout_height="254dp"
+ android:layout_marginTop="32dp"
+ android:layout_marginBottom="32dp"
+ android:src="@drawable/dummy_img_map_picker"
+ />
+
+ <com.google.android.material.textfield.TextInputLayout
+ android:id="@+id/edittext_longitude"
+ style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:hint="@string/longitude"
+ >
+
+ <com.google.android.material.textfield.TextInputEditText
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:inputType="numberDecimal"
+ />
+ </com.google.android.material.textfield.TextInputLayout>
+
+ <com.google.android.material.textfield.TextInputLayout
+ android:id="@+id/edittext_latitude"
+ style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="16dp"
+ android:hint="@string/latitude"
+ >
+
+ <com.google.android.material.textfield.TextInputEditText
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:inputType="numberDecimal"
+ />
+ </com.google.android.material.textfield.TextInputLayout>
+
+ <Button
+ android:id="@+id/button_add_location"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal"
+ android:text="@string/add_location"
+ app:backgroundTint="#007fff"
+ android:layout_marginTop="32dp"
+ />
+ </LinearLayout>
+ </androidx.core.widget.NestedScrollView>
+</FrameLayout> \ 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
new file mode 100644
index 0000000..787ee11
--- /dev/null
+++ b/app/src/main/res/layout/fragment_internet_activity_policy.xml
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout 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_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@color/white"
+ >
+
+ <Toolbar
+ android:id="@+id/toolbar"
+ android:layout_width="match_parent"
+ android:layout_height="?android:attr/actionBarSize"
+ android:layout_gravity="top|center"
+ android:background="@color/white"
+ tools:layout_height="56dp"
+ />
+
+ <androidx.core.widget.NestedScrollView
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_marginTop="?android:attr/actionBarSize"
+ android:layout_marginBottom="32dp"
+ >
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical"
+ android:paddingLeft="32dp"
+ android:paddingRight="32dp"
+ tools:context=".main.MainActivity"
+ >
+
+ <TextView
+ android:id="@+id/internet_activity_privacy_info"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal"
+ android:paddingTop="16dp"
+ android:text="@string/internet_activity_privacy_info"
+ android:textColor="@color/black"
+ android:textSize="14sp"
+ />
+
+ <TextView
+ android:id="@+id/learn_more_internet_activity_privacy_info"
+ android:layout_width="wrap_content"
+ android:layout_height="48dp"
+ android:fontFamily="sans-serif-medium"
+ android:gravity="center_vertical"
+ android:text="@string/learn_more"
+ android:textColor="#007fff"
+ android:textSize="14sp"
+ />
+
+ <TextView
+ android:id="@+id/my_internet_activity_header"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:fontFamily="sans-serif-medium"
+ android:paddingTop="16dp"
+ android:paddingBottom="8dp"
+ android:text="@string/internet_activity_privacy_title"
+ android:textColor="@color/black"
+ android:textSize="14sp"
+ />
+
+ <RadioGroup
+ android:id="@+id/internet_activity_privacy_choices"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ >
+
+ <foundation.e.privacycentralapp.common.RightRadioButton
+ android:id="@+id/radio_use_real_ip"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/use_real_ip"
+ android:textSize="16sp"
+ />
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/i_can_be_tracked"
+ android:textSize="14sp"/>
+
+ <foundation.e.privacycentralapp.common.RightRadioButton
+ android:id="@+id/radio_hide_ip"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/hide_ip"
+ android:textSize="16sp"
+ android:layout_marginTop="8dp"
+ />
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/i_am_anonymous"
+ android:textSize="14sp"/>
+ </RadioGroup>
+ </LinearLayout>
+ </androidx.core.widget.NestedScrollView>
+</FrameLayout> \ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_permission_control.xml b/app/src/main/res/layout/fragment_permission_control.xml
new file mode 100644
index 0000000..2888af0
--- /dev/null
+++ b/app/src/main/res/layout/fragment_permission_control.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout 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_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@color/white"
+ >
+
+ <Toolbar
+ android:id="@+id/toolbar"
+ android:layout_width="match_parent"
+ android:layout_height="?android:attr/actionBarSize"
+ android:layout_gravity="top|center"
+ android:background="@color/white"
+ tools:layout_height="56dp"
+ />
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical"
+ android:layout_marginTop="?android:attr/actionBarSize"
+ tools:context=".main.MainActivity"
+ >
+
+ <TextView
+ android:id="@+id/permission_control"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal"
+ android:paddingTop="16dp"
+ android:paddingBottom="16dp"
+ android:paddingLeft="32dp"
+ android:paddingRight="32dp"
+ android:textColor="@color/black"
+ android:textSize="14sp"
+ />
+
+ <androidx.recyclerview.widget.RecyclerView
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ tools:listitem="@layout/item_permission_apps"
+ android:id="@+id/recylcer_view_permission_apps"/>
+ </LinearLayout>
+</FrameLayout> \ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_permissions.xml b/app/src/main/res/layout/fragment_permissions.xml
new file mode 100644
index 0000000..9d1e972
--- /dev/null
+++ b/app/src/main/res/layout/fragment_permissions.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout 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_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@color/white"
+ >
+
+ <Toolbar
+ android:id="@+id/toolbar"
+ android:layout_width="match_parent"
+ android:layout_height="?android:attr/actionBarSize"
+ android:layout_gravity="top|center"
+ android:background="@color/white"
+ tools:layout_height="56dp"
+ />
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical"
+ android:paddingLeft="32dp"
+ android:paddingRight="32dp"
+ android:layout_marginTop="?android:attr/actionBarSize"
+ tools:context=".main.MainActivity"
+ >
+
+ <TextView
+ android:id="@+id/permission_control"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal"
+ android:paddingTop="16dp"
+ android:text="@string/permission_control_info"
+ android:textColor="@color/black"
+ android:textSize="14sp"
+ />
+
+ <TextView
+ android:id="@+id/learn_more_permissions"
+ android:layout_width="wrap_content"
+ android:layout_height="48dp"
+ android:fontFamily="sans-serif-medium"
+ android:gravity="center_vertical"
+ android:text="@string/learn_more"
+ android:textColor="#007fff"
+ android:textSize="14sp"
+ />
+
+ <androidx.recyclerview.widget.RecyclerView
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ tools:listitem="@layout/item_permission"
+ android:id="@+id/recylcer_view_permissions"/>
+ </LinearLayout>
+</FrameLayout> \ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_quick_protection.xml b/app/src/main/res/layout/fragment_quick_protection.xml
new file mode 100644
index 0000000..e8233ee
--- /dev/null
+++ b/app/src/main/res/layout/fragment_quick_protection.xml
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@color/white"
+ >
+
+ <Toolbar
+ android:id="@+id/toolbar"
+ android:layout_width="match_parent"
+ android:layout_height="?android:attr/actionBarSize"
+ android:layout_gravity="top|center"
+ android:background="@color/white"
+ tools:layout_height="56dp"
+ />
+
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical"
+ android:layout_marginTop="?android:attr/actionBarSize"
+ android:layout_marginBottom="56dp"
+ tools:context=".main.MainActivity"
+ >
+
+ <TextView
+ android:id="@+id/quick_protection_info"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal"
+ android:paddingLeft="32dp"
+ android:paddingRight="32dp"
+ android:paddingTop="16dp"
+ android:text="@string/quick_protection_info"
+ android:textColor="@color/black"
+ android:textSize="14sp"
+ />
+
+ <TextView
+ android:id="@+id/quick_protection_settings_list"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal"
+ android:paddingTop="16dp"
+ android:paddingBottom="16dp"
+ android:paddingLeft="32dp"
+ android:paddingRight="32dp"
+ android:fontFamily="sans-serif-medium"
+ android:text="@string/quick_protection_settings_list"
+ android:textColor="@color/black"
+ android:textSize="14sp"
+ />
+ </LinearLayout>
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="56dp"
+ android:paddingRight="32dp"
+ android:paddingLeft="32dp"
+ android:gravity="center_vertical|right"
+ android:id="@+id/learn_more"
+ android:text="@string/learn_more"
+ android:textColor="#007fff"
+ android:textSize="14sp"
+ android:fontFamily="sans-serif-medium"
+ android:layout_gravity="bottom|right"/>
+</FrameLayout> \ No newline at end of file
diff --git a/app/src/main/res/layout/item_permission.xml b/app/src/main/res/layout/item_permission.xml
new file mode 100644
index 0000000..8f54f64
--- /dev/null
+++ b/app/src/main/res/layout/item_permission.xml
@@ -0,0 +1,73 @@
+<?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/>.
+ -->
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:id="@+id/item_permission"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingTop="16dp"
+ android:paddingBottom="16dp"
+ >
+
+ <ImageView
+ android:id="@+id/permission_icon"
+ android:layout_width="24dp"
+ android:layout_height="24dp"
+ android:layout_alignParentStart="true"
+ android:layout_centerVertical="true"
+ android:src="@drawable/ic_body_monitor"
+ />
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_toStartOf="@+id/chevron"
+ android:layout_toEndOf="@+id/permission_icon"
+ android:orientation="vertical"
+ android:paddingStart="32dp"
+ android:paddingEnd="32dp"
+ >
+
+ <TextView
+ android:id="@+id/permission_title"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:fontFamily="sans-serif-medium"
+ tools:text="Body sensor"
+ android:textColor="@color/black"
+ android:textSize="16sp"
+ />
+
+ <TextView
+ android:id="@+id/permission_count"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ tools:text="3 of 8 apps allowed"
+ android:textSize="14sp"
+ />
+ </LinearLayout>
+
+ <ImageView
+ android:id="@+id/chevron"
+ android:layout_width="24dp"
+ android:layout_height="24dp"
+ android:padding="4dp"
+ android:layout_alignParentEnd="true"
+ android:layout_centerVertical="true"
+ android:src="@drawable/ic_chevron_right_24dp"
+ />
+</RelativeLayout> \ No newline at end of file
diff --git a/app/src/main/res/layout/item_permission_apps.xml b/app/src/main/res/layout/item_permission_apps.xml
new file mode 100644
index 0000000..aec8fec
--- /dev/null
+++ b/app/src/main/res/layout/item_permission_apps.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:id="@+id/item_permission_apps"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingTop="16dp"
+ android:paddingBottom="16dp"
+ android:paddingLeft="32dp"
+ android:paddingRight="32dp"
+ >
+
+ <ImageView
+ android:id="@+id/app_icon"
+ android:layout_width="36dp"
+ android:layout_height="36dp"
+ android:layout_alignParentStart="true"
+ android:layout_centerVertical="true"
+ android:src="@drawable/ic_facebook"
+ />
+
+ <TextView
+ android:id="@+id/app_title"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_centerVertical="true"
+ android:layout_toStartOf="@+id/togglePermission"
+ android:layout_toEndOf="@+id/app_icon"
+ android:fontFamily="sans-serif-medium"
+ android:paddingStart="32dp"
+ android:paddingEnd="32dp"
+ android:textColor="@color/black"
+ android:textSize="16sp"
+ tools:text="Body sensor"
+ />
+
+ <Switch
+ android:id="@+id/togglePermission"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentEnd="true"
+ android:layout_centerVertical="true"
+ />
+</RelativeLayout> \ 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 146bad7..f79852c 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -11,4 +11,23 @@
<string name="my_location_subtitle">"7 apps are using location permission\n Current location mode: "</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>
+ <string name="fake_location_info">Choose if you want to fake your real location when app asks for your geolocation tracking.</string>
+ <string name="use_real_location">Use real location</string>
+ <string name="use_random_location">Use random plausible location</string>
+ <string name="use_specific_location">Use specific location</string>
+ <string name="longitude">Longitude</string>
+ <string name="latitude">Latitude</string>
+ <string name="add_location">Add location</string>
+ <string name="internet_activity_privacy_info">Choose if you want to expose your real IP address or hide when connected to the internet (uses the tor network).</string>
+ <string name="use_real_ip">Use real IP address</string>
+ <string name="i_can_be_tracked">I can be tracked by my IP address.</string>
+ <string name="hide_ip">Hide IP address</string>
+ <string name="i_am_anonymous">I am anonymous on the internet.</string>
+ <string name="permission_control_info">Manage and control apps requesting various permissions.</string>
+
+ <string name="apps_allowed">%1$d of %2$d apps allowed</string>
+ <string name="apps_access_to_permission">Apps which has access to %1$s permission</string>
</resources> \ No newline at end of file
diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml
index e7a4431..3a7bad8 100644
--- a/app/src/main/res/values/themes.xml
+++ b/app/src/main/res/values/themes.xml
@@ -1,8 +1,11 @@
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
- <style name="Theme.PrivacyCentralApp" parent="Theme.AppCompat.DayNight.NoActionBar">
+ <style name="Theme.PrivacyCentralApp" parent="Theme.MaterialComponents.DayNight.NoActionBar">
<!-- Primary brand color. -->
- <item name="colorPrimary">@color/purple_500</item>
+ <item name="colorPrimary">#007fff</item>
+ <item name="colorAccent">#007fff</item>
+ <item name="colorSecondary">#007fff</item>
+ <item name="colorControlNormal">#007fff</item>
<!-- Status bar color. -->
<!-- Customize your theme here. -->
</style>
diff --git a/dependencies.gradle b/dependencies.gradle
index 1787d22..3e5e6ba 100644
--- a/dependencies.gradle
+++ b/dependencies.gradle
@@ -39,7 +39,7 @@ libs.AndroidX = [
coreKtx: "androidx.core:core-ktx:1.5.0-beta01",
]
-versions.fragment = "1.3.0-rc02"
+versions.fragment = "1.3.3"
libs.AndroidX.Fragment = [
fragment: "androidx.fragment:fragment:$versions.fragment",
fragmentKtx: "androidx.fragment:fragment-ktx:$versions.fragment",