From f4fe8a4d881deef7e43ffe296df804c8c2c7a657 Mon Sep 17 00:00:00 2001 From: Amit Kumar Date: Wed, 16 Jun 2021 00:33:46 +0530 Subject: Add tracker UI and integrate lineage blocker service --- .../e/privacycentralapp/dummy/DummyDataSource.kt | 1 + .../privacycentralapp/dummy/TrackersDataSource.kt | 93 ++++++++++++++++++++++ 2 files changed, 94 insertions(+) create mode 100644 app/src/main/java/foundation/e/privacycentralapp/dummy/TrackersDataSource.kt (limited to 'app/src/main/java/foundation/e/privacycentralapp/dummy') 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..dd6112d 100644 --- a/app/src/main/java/foundation/e/privacycentralapp/dummy/DummyDataSource.kt +++ b/app/src/main/java/foundation/e/privacycentralapp/dummy/DummyDataSource.kt @@ -227,4 +227,5 @@ object DummyDataSource { _appsUsingLocationPerm.value = _populatedPermissions.value[permissionId].packagesAllowed } } + } diff --git a/app/src/main/java/foundation/e/privacycentralapp/dummy/TrackersDataSource.kt b/app/src/main/java/foundation/e/privacycentralapp/dummy/TrackersDataSource.kt new file mode 100644 index 0000000..9485a26 --- /dev/null +++ b/app/src/main/java/foundation/e/privacycentralapp/dummy/TrackersDataSource.kt @@ -0,0 +1,93 @@ +/* + * 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 . + */ + +package foundation.e.privacycentralapp.dummy + +import foundation.e.privacycentralapp.R +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import lineageos.blockers.BlockerInterface + +data class TrackedApp(val appName: String, val isEnabled: Boolean, val iconId: Int) + +data class Tracker( + val name: String, + val domain: String? = null, + val ipAddress: String? = null, + val trackedApps: List +) + +object TrackersDataSource { + + private lateinit var blockerService: BlockerInterface + + val facebook = TrackedApp("Facebook", true, R.drawable.ic_facebook) + val firefox = TrackedApp("Firefox", true, R.drawable.ic_facebook) + val google = TrackedApp("Google", true, R.drawable.ic_facebook) + val whatsapp = TrackedApp("Whatsapp", true, R.drawable.ic_facebook) + val blisslauncher = TrackedApp("BlissLauncher", true, R.drawable.ic_facebook) + val youtube = TrackedApp("Youtube", true, R.drawable.ic_facebook) + + val crashlytics = Tracker( + "Google Crashlytics (Demo)", + domain = "google.com", + trackedApps = listOf(facebook, firefox) + ) + + val facebookAds = Tracker( + "Facebook (Demo)", + domain = "google.com", + trackedApps = listOf(facebook, whatsapp) + ) + val rubiconTracker = Tracker( + "Rubicon Projects", + domain = "google.com", + trackedApps = listOf(google, blisslauncher, youtube) + ) + val googleAnalytics = Tracker( + "Google Analytics", + domain = "google.com", + trackedApps = listOf(facebook, firefox) + ) + + val _trackers = + MutableStateFlow(listOf(crashlytics, facebookAds, rubiconTracker, googleAnalytics)) + val trackers = _trackers.asStateFlow() + + fun injectBlockerService(blockerInterface: BlockerInterface) { + this.blockerService = blockerInterface + } + + fun toggleTracker(tracker: Tracker, enable: Boolean): Boolean { + val result = if (!enable) { + blockerService.blockDomain(tracker.domain) + } else { + blockerService.unblockDomain(tracker.domain) + } + + if (result) { + _trackers.value = _trackers.value.map { + if (it.name == tracker.name) { + it.copy(trackedApps = it.trackedApps.map { app -> + app.copy(isEnabled = enable) + }) + } else it + } + } + return result + } +} \ No newline at end of file -- cgit v1.2.3 From e40866d03008ec6dafa0016a31ee4c9e820032df Mon Sep 17 00:00:00 2001 From: Amit Kumar Date: Wed, 16 Jun 2021 01:57:50 +0530 Subject: Fix UI bugs and reformat code --- app/build.gradle | 4 + .../e/privacycentralapp/dummy/DummyDataSource.kt | 1 - .../privacycentralapp/dummy/TrackersDataSource.kt | 10 +- .../features/dashboard/DashboardFeature.kt | 2 +- .../features/trackers/TrackerAppsAdapter.kt | 6 +- .../features/trackers/TrackerAppsFragment.kt | 38 +++-- .../features/trackers/TrackersFeature.kt | 6 +- .../features/trackers/TrackersFragment.kt | 8 +- .../features/trackers/TrackersViewModel.kt | 2 +- app/src/main/res/layout/activity_main.xml | 2 +- app/src/main/res/layout/fragment_dashboard.xml | 160 ++++++++++----------- app/src/main/res/layout/fragment_fake_location.xml | 6 +- .../layout/fragment_internet_activity_policy.xml | 46 +++--- .../main/res/layout/fragment_permission_apps.xml | 56 ++++---- app/src/main/res/layout/fragment_permissions.xml | 30 ++-- .../main/res/layout/fragment_quick_protection.xml | 91 ++++++------ app/src/main/res/layout/fragment_tracker_apps.xml | 56 ++++---- app/src/main/res/layout/fragment_trackers.xml | 30 ++-- app/src/main/res/layout/item_app_toggle.xml | 22 +-- app/src/main/res/layout/item_permission.xml | 30 ++-- app/src/main/res/layout/topbar.xml | 6 +- app/src/main/res/values/strings.xml | 2 +- scripts/sign_and_push.sh | 2 +- 23 files changed, 339 insertions(+), 277 deletions(-) (limited to 'app/src/main/java/foundation/e/privacycentralapp/dummy') diff --git a/app/build.gradle b/app/build.gradle index 8c18e06..8d94e2b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -80,6 +80,10 @@ android { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } + + aaptOptions { + additionalParameters '-I', 'app/libs/e-ui-sdk-1.0.1-q.jar' + } } dependencies { 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 dd6112d..fe61354 100644 --- a/app/src/main/java/foundation/e/privacycentralapp/dummy/DummyDataSource.kt +++ b/app/src/main/java/foundation/e/privacycentralapp/dummy/DummyDataSource.kt @@ -227,5 +227,4 @@ object DummyDataSource { _appsUsingLocationPerm.value = _populatedPermissions.value[permissionId].packagesAllowed } } - } diff --git a/app/src/main/java/foundation/e/privacycentralapp/dummy/TrackersDataSource.kt b/app/src/main/java/foundation/e/privacycentralapp/dummy/TrackersDataSource.kt index 9485a26..07822bb 100644 --- a/app/src/main/java/foundation/e/privacycentralapp/dummy/TrackersDataSource.kt +++ b/app/src/main/java/foundation/e/privacycentralapp/dummy/TrackersDataSource.kt @@ -82,12 +82,14 @@ object TrackersDataSource { if (result) { _trackers.value = _trackers.value.map { if (it.name == tracker.name) { - it.copy(trackedApps = it.trackedApps.map { app -> - app.copy(isEnabled = enable) - }) + it.copy( + trackedApps = it.trackedApps.map { app -> + app.copy(isEnabled = enable) + } + ) } else it } } return result } -} \ No newline at end of file +} 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 a273b88..c26fce1 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 @@ -164,7 +164,7 @@ class DashboardFeature( var activeTrackersCount: Int = 0 outer@ for (tracker in it) { for (app in tracker.trackedApps) { - if(!app.isEnabled) { + if (!app.isEnabled) { continue@outer } } diff --git a/app/src/main/java/foundation/e/privacycentralapp/features/trackers/TrackerAppsAdapter.kt b/app/src/main/java/foundation/e/privacycentralapp/features/trackers/TrackerAppsAdapter.kt index 04e3f04..ae236b9 100644 --- a/app/src/main/java/foundation/e/privacycentralapp/features/trackers/TrackerAppsAdapter.kt +++ b/app/src/main/java/foundation/e/privacycentralapp/features/trackers/TrackerAppsAdapter.kt @@ -43,8 +43,10 @@ class TrackerAppsAdapter( val view = LayoutInflater.from(parent.context) .inflate(R.layout.item_app_toggle, parent, false) val holder = TrackerViewHolder(view) - holder.toggleBlocker.setOnCheckedChangeListener { _, isChecked -> - listener(tracker, isChecked) + holder.toggleBlocker.setOnClickListener { + if (it is Switch) { + listener(tracker, it.isChecked) + } } return holder } diff --git a/app/src/main/java/foundation/e/privacycentralapp/features/trackers/TrackerAppsFragment.kt b/app/src/main/java/foundation/e/privacycentralapp/features/trackers/TrackerAppsFragment.kt index 67ae0cc..53c26a9 100644 --- a/app/src/main/java/foundation/e/privacycentralapp/features/trackers/TrackerAppsFragment.kt +++ b/app/src/main/java/foundation/e/privacycentralapp/features/trackers/TrackerAppsFragment.kt @@ -18,8 +18,10 @@ package foundation.e.privacycentralapp.features.trackers import android.os.Bundle +import android.util.Log +import android.view.View import android.widget.Toast -import androidx.fragment.app.viewModels +import androidx.fragment.app.activityViewModels import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView @@ -33,7 +35,9 @@ class TrackerAppsFragment : NavToolbarFragment(R.layout.fragment_tracker_apps), MVIView { - private val viewModel: TrackersViewModel by viewModels() + private val viewModel: TrackersViewModel by activityViewModels() + + private val TAG = "TrackerAppsFragment" override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -44,6 +48,11 @@ class TrackerAppsFragment : viewModel.trackersFeature.singleEvents.collect { event -> when (event) { is TrackersFeature.SingleEvent.ErrorEvent -> displayToast(event.error) + is TrackersFeature.SingleEvent.BlockerErrorEvent -> { + displayToast("Couldn't toggle") + // Re-render the current state to reset the switches. + render(viewModel.trackersFeature.state.value) + } } } } @@ -56,19 +65,24 @@ class TrackerAppsFragment : override fun getTitle(): String = getString(R.string.tracker) + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + view.findViewById(R.id.recylcer_view_tracker_apps)?.apply { + layoutManager = LinearLayoutManager(requireContext()) + setHasFixedSize(true) + } + } + override fun render(state: TrackersFeature.State) { + Log.d(TAG, "render() called with: state = $state") state.currentSelectedTracker?.let { tracker -> - view?.findViewById(R.id.recylcer_view_tracker_apps)?.apply { - layoutManager = LinearLayoutManager(requireContext()) - setHasFixedSize(true) - adapter = TrackerAppsAdapter(tracker) { tracker, grant -> - viewModel.submitAction( - TrackersFeature.Action.ToggleTrackerAction( - tracker, - grant - ) + view?.findViewById(R.id.recylcer_view_tracker_apps)?.adapter = TrackerAppsAdapter(tracker) { it, grant -> + viewModel.submitAction( + TrackersFeature.Action.ToggleTrackerAction( + it, + grant ) - } + ) } getToolbar()?.title = tracker.name } diff --git a/app/src/main/java/foundation/e/privacycentralapp/features/trackers/TrackersFeature.kt b/app/src/main/java/foundation/e/privacycentralapp/features/trackers/TrackersFeature.kt index f9fbf63..4a08328 100644 --- a/app/src/main/java/foundation/e/privacycentralapp/features/trackers/TrackersFeature.kt +++ b/app/src/main/java/foundation/e/privacycentralapp/features/trackers/TrackersFeature.kt @@ -40,7 +40,7 @@ class TrackersFeature( actor, reducer, coroutineScope, - { message -> Log.d("PermissionsFeature", message) }, + { message -> Log.d("TrackersFeature", message) }, singleEventProducer ) { data class State( @@ -112,7 +112,9 @@ class TrackersFeature( singleEventProducer = { _, _, effect -> when (effect) { is Effect.ErrorEffect -> SingleEvent.ErrorEvent(effect.message) - is Effect.TrackerToggleEffect -> SingleEvent.BlockerErrorEvent + is Effect.TrackerToggleEffect -> { + if (!effect.result) SingleEvent.BlockerErrorEvent else null + } else -> null } } diff --git a/app/src/main/java/foundation/e/privacycentralapp/features/trackers/TrackersFragment.kt b/app/src/main/java/foundation/e/privacycentralapp/features/trackers/TrackersFragment.kt index d0242d3..00fefb6 100644 --- a/app/src/main/java/foundation/e/privacycentralapp/features/trackers/TrackersFragment.kt +++ b/app/src/main/java/foundation/e/privacycentralapp/features/trackers/TrackersFragment.kt @@ -19,9 +19,9 @@ package foundation.e.privacycentralapp.features.trackers import android.os.Bundle import android.view.View +import androidx.fragment.app.activityViewModels import androidx.fragment.app.add import androidx.fragment.app.commit -import androidx.fragment.app.viewModels import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView @@ -34,7 +34,7 @@ class TrackersFragment : NavToolbarFragment(R.layout.fragment_trackers), MVIView { - private val viewModel: TrackersViewModel by viewModels() + private val viewModel: TrackersViewModel by activityViewModels() private lateinit var trackersAdapter: TrackersAdapter override fun onCreate(savedInstanceState: Bundle?) { @@ -59,9 +59,7 @@ class TrackersFragment : } } - override fun getTitle(): String { - return getString(R.string.trackers) - } + override fun getTitle() = getString(R.string.trackers) override fun render(state: TrackersFeature.State) { if (state.currentSelectedTracker != null) { diff --git a/app/src/main/java/foundation/e/privacycentralapp/features/trackers/TrackersViewModel.kt b/app/src/main/java/foundation/e/privacycentralapp/features/trackers/TrackersViewModel.kt index 79ae146..d75d6ec 100644 --- a/app/src/main/java/foundation/e/privacycentralapp/features/trackers/TrackersViewModel.kt +++ b/app/src/main/java/foundation/e/privacycentralapp/features/trackers/TrackersViewModel.kt @@ -37,4 +37,4 @@ class TrackersViewModel : ViewModel() { _actions.emit(action) } } -} \ No newline at end of file +} diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 7013496..2627a32 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,6 +1,6 @@ \ 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 dc79878..effd992 100644 --- a/app/src/main/res/layout/fragment_dashboard.xml +++ b/app/src/main/res/layout/fragment_dashboard.xml @@ -2,46 +2,46 @@ - + diff --git a/app/src/main/res/layout/fragment_fake_location.xml b/app/src/main/res/layout/fragment_fake_location.xml index 40324a1..d60513b 100644 --- a/app/src/main/res/layout/fragment_fake_location.xml +++ b/app/src/main/res/layout/fragment_fake_location.xml @@ -8,7 +8,7 @@ android:layout_width="match_parent" > - + @@ -29,9 +29,9 @@ android:layout_gravity="center_horizontal" android:layout_height="wrap_content" android:layout_width="match_parent" - android:paddingTop="16dp" android:paddingLeft="32dp" android:paddingRight="32dp" + android:paddingTop="16dp" android:text="@string/fake_location_info" android:textColor="@color/black" android:textSize="14sp" 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 7a5d8b5..c3021df 100644 --- a/app/src/main/res/layout/fragment_internet_activity_policy.xml +++ b/app/src/main/res/layout/fragment_internet_activity_policy.xml @@ -2,23 +2,23 @@ - + + + android:textSize="14sp" + /> + + android:textSize="14sp" + /> diff --git a/app/src/main/res/layout/fragment_permission_apps.xml b/app/src/main/res/layout/fragment_permission_apps.xml index 760c891..db61e93 100644 --- a/app/src/main/res/layout/fragment_permission_apps.xml +++ b/app/src/main/res/layout/fragment_permission_apps.xml @@ -2,37 +2,45 @@ - + - - + android:orientation="vertical" + tools:context=".main.MainActivity" + > - - + + + + + \ 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 index a452570..7ca4b43 100644 --- a/app/src/main/res/layout/fragment_permissions.xml +++ b/app/src/main/res/layout/fragment_permissions.xml @@ -2,16 +2,22 @@ - + + + + /> + \ 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 index d57a101..569f9b1 100644 --- a/app/src/main/res/layout/fragment_quick_protection.xml +++ b/app/src/main/res/layout/fragment_quick_protection.xml @@ -1,59 +1,70 @@ - + - - + android:orientation="vertical" + tools:context=".main.MainActivity" + > + + + + + + + - - + /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_tracker_apps.xml b/app/src/main/res/layout/fragment_tracker_apps.xml index bb31b5b..3341d95 100644 --- a/app/src/main/res/layout/fragment_tracker_apps.xml +++ b/app/src/main/res/layout/fragment_tracker_apps.xml @@ -2,37 +2,45 @@ - + - - + android:orientation="vertical" + tools:context=".main.MainActivity" + > - - + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_trackers.xml b/app/src/main/res/layout/fragment_trackers.xml index 13fcab3..591b2b6 100644 --- a/app/src/main/res/layout/fragment_trackers.xml +++ b/app/src/main/res/layout/fragment_trackers.xml @@ -2,23 +2,23 @@ - + + + /> \ No newline at end of file diff --git a/app/src/main/res/layout/item_app_toggle.xml b/app/src/main/res/layout/item_app_toggle.xml index 7d02ec0..d0f565f 100644 --- a/app/src/main/res/layout/item_app_toggle.xml +++ b/app/src/main/res/layout/item_app_toggle.xml @@ -2,33 +2,33 @@ \ 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 index 8f54f64..66d4213 100644 --- a/app/src/main/res/layout/item_permission.xml +++ b/app/src/main/res/layout/item_permission.xml @@ -17,57 +17,57 @@ \ No newline at end of file diff --git a/app/src/main/res/layout/topbar.xml b/app/src/main/res/layout/topbar.xml index 9142d79..a493b3b 100644 --- a/app/src/main/res/layout/topbar.xml +++ b/app/src/main/res/layout/topbar.xml @@ -18,20 +18,20 @@ --> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index eb799d1..3105ddb 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -42,7 +42,7 @@ Quick Protection Privacy Dashboard Click to learn more - \"Apps Permission\" + Apps Permission Trackers See trackers usage over time and manage trackers available in applications Following trackers are in use diff --git a/scripts/sign_and_push.sh b/scripts/sign_and_push.sh index dd37f2a..035a47b 100755 --- a/scripts/sign_and_push.sh +++ b/scripts/sign_and_push.sh @@ -10,7 +10,7 @@ adb root wait ${!} adb devices wait ${!} -adb install -r build/outputs/apk/e/debug/PrivacyCentral-e-debug-1.0.0-alpha.apk +adb install -r app/build/outputs/apk/e/debug/PrivacyCentral-e-debug-1.0.0-alpha.apk wait ${!} adb remount && adb push privapp-permissions-foundation.e.privacycentralapp.xml system/etc/permissions wait ${!} -- cgit v1.2.3 From c5c030693c40c912881feb5ecca5913a83a4bb55 Mon Sep 17 00:00:00 2001 From: Amit Kumar Date: Wed, 16 Jun 2021 21:36:37 +0530 Subject: Add descriptive name to dummy trackers --- .../foundation/e/privacycentralapp/dummy/TrackersDataSource.kt | 10 +++++----- .../e/privacycentralapp/features/trackers/TrackersFeature.kt | 7 +++++-- 2 files changed, 10 insertions(+), 7 deletions(-) (limited to 'app/src/main/java/foundation/e/privacycentralapp/dummy') diff --git a/app/src/main/java/foundation/e/privacycentralapp/dummy/TrackersDataSource.kt b/app/src/main/java/foundation/e/privacycentralapp/dummy/TrackersDataSource.kt index 07822bb..13def5a 100644 --- a/app/src/main/java/foundation/e/privacycentralapp/dummy/TrackersDataSource.kt +++ b/app/src/main/java/foundation/e/privacycentralapp/dummy/TrackersDataSource.kt @@ -43,19 +43,19 @@ object TrackersDataSource { val youtube = TrackedApp("Youtube", true, R.drawable.ic_facebook) val crashlytics = Tracker( - "Google Crashlytics (Demo)", + "Google Crashlytics Demo (google.com) ", domain = "google.com", trackedApps = listOf(facebook, firefox) ) val facebookAds = Tracker( - "Facebook (Demo)", - domain = "google.com", + "Facebook IP Demo", + domain = "157.240.16.35", trackedApps = listOf(facebook, whatsapp) ) val rubiconTracker = Tracker( - "Rubicon Projects", - domain = "google.com", + "Rubicon Projects (block google)", + domain = "google", trackedApps = listOf(google, blisslauncher, youtube) ) val googleAnalytics = Tracker( diff --git a/app/src/main/java/foundation/e/privacycentralapp/features/trackers/TrackersFeature.kt b/app/src/main/java/foundation/e/privacycentralapp/features/trackers/TrackersFeature.kt index 4a08328..ec7b67a 100644 --- a/app/src/main/java/foundation/e/privacycentralapp/features/trackers/TrackersFeature.kt +++ b/app/src/main/java/foundation/e/privacycentralapp/features/trackers/TrackersFeature.kt @@ -80,7 +80,10 @@ class TrackersFeature( is Effect.TrackersLoadedEffect -> State(effect.trackers) is Effect.TrackerSelectedEffect -> state.copy(currentSelectedTracker = effect.tracker) is Effect.ErrorEffect -> state - is Effect.TrackerToggleEffect -> state + is Effect.TrackerToggleEffect -> { + Log.d("Tracker effect", "$state") + state + } } }, actor = { state, action -> @@ -99,7 +102,7 @@ class TrackersFeature( is Action.ToggleTrackerAction -> { if (state.currentSelectedTracker != null) { val result = TrackersDataSource.toggleTracker( - state.currentSelectedTracker, + action.tracker, action.grant ) flowOf(Effect.TrackerToggleEffect(result)) -- cgit v1.2.3 From 7f57ef4177a1bef77e82cc6123aa9691edb56f89 Mon Sep 17 00:00:00 2001 From: Amit Kumar Date: Fri, 18 Jun 2021 15:57:46 +0530 Subject: Fix bug with tracker state --- .../privacycentralapp/dummy/TrackersDataSource.kt | 10 ++++++++++ .../features/trackers/TrackerAppsFragment.kt | 13 ++++++++++-- .../features/trackers/TrackersFeature.kt | 18 ++++++++++++++++- .../features/trackers/TrackersFragment.kt | 23 +++++++++++----------- .../features/trackers/TrackersViewModel.kt | 2 ++ .../foundation/e/flowmvi/feature/BaseFeature.kt | 2 +- 6 files changed, 52 insertions(+), 16 deletions(-) (limited to 'app/src/main/java/foundation/e/privacycentralapp/dummy') diff --git a/app/src/main/java/foundation/e/privacycentralapp/dummy/TrackersDataSource.kt b/app/src/main/java/foundation/e/privacycentralapp/dummy/TrackersDataSource.kt index 13def5a..7ba7c5b 100644 --- a/app/src/main/java/foundation/e/privacycentralapp/dummy/TrackersDataSource.kt +++ b/app/src/main/java/foundation/e/privacycentralapp/dummy/TrackersDataSource.kt @@ -72,6 +72,16 @@ object TrackersDataSource { this.blockerService = blockerInterface } + fun getTracker(name: String): Tracker? { + try { + return _trackers.value.first { + it.name == name + } + } catch (e: NoSuchElementException) { + return null + } + } + fun toggleTracker(tracker: Tracker, enable: Boolean): Boolean { val result = if (!enable) { blockerService.blockDomain(tracker.domain) diff --git a/app/src/main/java/foundation/e/privacycentralapp/features/trackers/TrackerAppsFragment.kt b/app/src/main/java/foundation/e/privacycentralapp/features/trackers/TrackerAppsFragment.kt index 53c26a9..fff24dc 100644 --- a/app/src/main/java/foundation/e/privacycentralapp/features/trackers/TrackerAppsFragment.kt +++ b/app/src/main/java/foundation/e/privacycentralapp/features/trackers/TrackerAppsFragment.kt @@ -21,7 +21,7 @@ import android.os.Bundle import android.util.Log import android.view.View import android.widget.Toast -import androidx.fragment.app.activityViewModels +import androidx.fragment.app.viewModels import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView @@ -35,7 +35,7 @@ class TrackerAppsFragment : NavToolbarFragment(R.layout.fragment_tracker_apps), MVIView { - private val viewModel: TrackersViewModel by activityViewModels() + private val viewModel: TrackersViewModel by viewModels() private val TAG = "TrackerAppsFragment" @@ -56,6 +56,15 @@ class TrackerAppsFragment : } } } + lifecycleScope.launchWhenStarted { + viewModel.submitAction( + TrackersFeature.Action.ObserveTracker( + requireArguments().getString( + "TRACKER" + ) + ) + ) + } } private fun displayToast(message: String) { diff --git a/app/src/main/java/foundation/e/privacycentralapp/features/trackers/TrackersFeature.kt b/app/src/main/java/foundation/e/privacycentralapp/features/trackers/TrackersFeature.kt index ec7b67a..9400181 100644 --- a/app/src/main/java/foundation/e/privacycentralapp/features/trackers/TrackersFeature.kt +++ b/app/src/main/java/foundation/e/privacycentralapp/features/trackers/TrackersFeature.kt @@ -60,6 +60,7 @@ class TrackersFeature( val tracker: Tracker, val grant: Boolean ) : Action() + data class ObserveTracker(val tracker: String?) : Action() } sealed class Effect { @@ -67,6 +68,7 @@ class TrackersFeature( data class TrackerSelectedEffect(val tracker: Tracker) : Effect() data class TrackerToggleEffect(val result: Boolean) : Effect() data class ErrorEffect(val message: String) : Effect() + data class TrackerLoadedEffect(val tracker: Tracker) : Effect() } companion object { @@ -81,9 +83,11 @@ class TrackersFeature( is Effect.TrackerSelectedEffect -> state.copy(currentSelectedTracker = effect.tracker) is Effect.ErrorEffect -> state is Effect.TrackerToggleEffect -> { - Log.d("Tracker effect", "$state") state } + is Effect.TrackerLoadedEffect -> { + state.copy(currentSelectedTracker = effect.tracker) + } } }, actor = { state, action -> @@ -110,6 +114,18 @@ class TrackersFeature( flowOf(Effect.ErrorEffect("Can't toggle tracker")) } } + is Action.ObserveTracker -> { + if (action.tracker == null) { + flowOf(Effect.ErrorEffect("Null tracker id passed")) + } else { + val tracker = TrackersDataSource.getTracker(action.tracker) + if (tracker != null) { + flowOf(Effect.TrackerLoadedEffect(tracker)) + } else { + flowOf(Effect.ErrorEffect("Can't find tracker with name ${action.tracker}")) + } + } + } } }, singleEventProducer = { _, _, effect -> diff --git a/app/src/main/java/foundation/e/privacycentralapp/features/trackers/TrackersFragment.kt b/app/src/main/java/foundation/e/privacycentralapp/features/trackers/TrackersFragment.kt index 00fefb6..e3dc941 100644 --- a/app/src/main/java/foundation/e/privacycentralapp/features/trackers/TrackersFragment.kt +++ b/app/src/main/java/foundation/e/privacycentralapp/features/trackers/TrackersFragment.kt @@ -19,9 +19,10 @@ package foundation.e.privacycentralapp.features.trackers import android.os.Bundle import android.view.View -import androidx.fragment.app.activityViewModels +import androidx.core.os.bundleOf import androidx.fragment.app.add import androidx.fragment.app.commit +import androidx.fragment.app.viewModels import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView @@ -34,7 +35,7 @@ class TrackersFragment : NavToolbarFragment(R.layout.fragment_trackers), MVIView { - private val viewModel: TrackersViewModel by activityViewModels() + private val viewModel: TrackersViewModel by viewModels() private lateinit var trackersAdapter: TrackersAdapter override fun onCreate(savedInstanceState: Bundle?) { @@ -50,7 +51,13 @@ class TrackersFragment : override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) trackersAdapter = TrackersAdapter { - viewModel.submitAction(TrackersFeature.Action.SetSelectedTracker(it)) + requireActivity().supportFragmentManager.commit { + val bundle = bundleOf("TRACKER" to it.name) + add(R.id.container, args = bundle) + setReorderingAllowed(true) + addToBackStack("trackers") + } + // viewModel.submitAction(TrackersFeature.Action.SetSelectedTracker(it)) } view.findViewById(R.id.recylcer_view_trackers)?.apply { layoutManager = LinearLayoutManager(requireContext()) @@ -62,15 +69,7 @@ class TrackersFragment : override fun getTitle() = getString(R.string.trackers) override fun render(state: TrackersFeature.State) { - if (state.currentSelectedTracker != null) { - requireActivity().supportFragmentManager.commit { - add(R.id.container) - setReorderingAllowed(true) - addToBackStack("trackers") - } - } else { - trackersAdapter.setData(state.trackers) - } + trackersAdapter.setData(state.trackers) } override fun actions(): Flow = viewModel.actions diff --git a/app/src/main/java/foundation/e/privacycentralapp/features/trackers/TrackersViewModel.kt b/app/src/main/java/foundation/e/privacycentralapp/features/trackers/TrackersViewModel.kt index d75d6ec..ee89887 100644 --- a/app/src/main/java/foundation/e/privacycentralapp/features/trackers/TrackersViewModel.kt +++ b/app/src/main/java/foundation/e/privacycentralapp/features/trackers/TrackersViewModel.kt @@ -17,6 +17,7 @@ package foundation.e.privacycentralapp.features.trackers +import android.util.Log import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import kotlinx.coroutines.flow.MutableSharedFlow @@ -33,6 +34,7 @@ class TrackersViewModel : ViewModel() { } fun submitAction(action: TrackersFeature.Action) { + Log.d("TrackersViewModel", "submitting action") viewModelScope.launch { _actions.emit(action) } diff --git a/flow-mvi/src/main/java/foundation/e/flowmvi/feature/BaseFeature.kt b/flow-mvi/src/main/java/foundation/e/flowmvi/feature/BaseFeature.kt index 8dec0c4..c60373f 100644 --- a/flow-mvi/src/main/java/foundation/e/flowmvi/feature/BaseFeature.kt +++ b/flow-mvi/src/main/java/foundation/e/flowmvi/feature/BaseFeature.kt @@ -120,7 +120,7 @@ open class BaseFeature callerCoroutineScope.launch { - logger.invoke("Received action $action") + logger.invoke("Received action $action $this") actor.invoke(_state.value, action) .onEach { effect -> mutex.withLock { -- cgit v1.2.3 From 3553baaa0b85785b755d4466168a2c35019b2a83 Mon Sep 17 00:00:00 2001 From: Amit Kumar Date: Mon, 21 Jun 2021 14:36:47 +0000 Subject: Use hexed domain instead of simple string --- .../foundation/e/privacycentralapp/dummy/TrackersDataSource.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'app/src/main/java/foundation/e/privacycentralapp/dummy') diff --git a/app/src/main/java/foundation/e/privacycentralapp/dummy/TrackersDataSource.kt b/app/src/main/java/foundation/e/privacycentralapp/dummy/TrackersDataSource.kt index 7ba7c5b..6224719 100644 --- a/app/src/main/java/foundation/e/privacycentralapp/dummy/TrackersDataSource.kt +++ b/app/src/main/java/foundation/e/privacycentralapp/dummy/TrackersDataSource.kt @@ -44,23 +44,23 @@ object TrackersDataSource { val crashlytics = Tracker( "Google Crashlytics Demo (google.com) ", - domain = "google.com", + domain = "|06|google|03|com", trackedApps = listOf(facebook, firefox) ) val facebookAds = Tracker( "Facebook IP Demo", - domain = "157.240.16.35", + domain = "|08|facebook|03|com", trackedApps = listOf(facebook, whatsapp) ) val rubiconTracker = Tracker( "Rubicon Projects (block google)", - domain = "google", + domain = "|03|www|06|google|03|com", trackedApps = listOf(google, blisslauncher, youtube) ) val googleAnalytics = Tracker( "Google Analytics", - domain = "google.com", + domain = "google", trackedApps = listOf(facebook, firefox) ) -- cgit v1.2.3 From ddc57b6e1fb8017bb6360f5d10290f6d05f33113 Mon Sep 17 00:00:00 2001 From: Amit Kumar Date: Tue, 22 Jun 2021 06:12:36 +0000 Subject: Update trackers' domain names --- .../e/privacycentralapp/dummy/TrackersDataSource.kt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'app/src/main/java/foundation/e/privacycentralapp/dummy') diff --git a/app/src/main/java/foundation/e/privacycentralapp/dummy/TrackersDataSource.kt b/app/src/main/java/foundation/e/privacycentralapp/dummy/TrackersDataSource.kt index 6224719..d3f168c 100644 --- a/app/src/main/java/foundation/e/privacycentralapp/dummy/TrackersDataSource.kt +++ b/app/src/main/java/foundation/e/privacycentralapp/dummy/TrackersDataSource.kt @@ -43,24 +43,24 @@ object TrackersDataSource { val youtube = TrackedApp("Youtube", true, R.drawable.ic_facebook) val crashlytics = Tracker( - "Google Crashlytics Demo (google.com) ", - domain = "|06|google|03|com", + "Google Crashlytics", + domain = "|11|crashlytics|03|com", trackedApps = listOf(facebook, firefox) ) val facebookAds = Tracker( - "Facebook IP Demo", + "Facebook Analytics", domain = "|08|facebook|03|com", trackedApps = listOf(facebook, whatsapp) ) val rubiconTracker = Tracker( - "Rubicon Projects (block google)", - domain = "|03|www|06|google|03|com", + "Rubicon Projects", + domain = "|03|ads|14|rubiconproject|03|com", trackedApps = listOf(google, blisslauncher, youtube) ) val googleAnalytics = Tracker( "Google Analytics", - domain = "google", + domain = "|16|google-analytics|03|com", trackedApps = listOf(facebook, firefox) ) -- cgit v1.2.3 From f522c4615503120b5e62e45405e8c6c3b18e5e4a Mon Sep 17 00:00:00 2001 From: Amit Kumar Date: Tue, 22 Jun 2021 07:11:41 +0000 Subject: Fix incorrect hex codes --- .../java/foundation/e/privacycentralapp/dummy/TrackersDataSource.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'app/src/main/java/foundation/e/privacycentralapp/dummy') diff --git a/app/src/main/java/foundation/e/privacycentralapp/dummy/TrackersDataSource.kt b/app/src/main/java/foundation/e/privacycentralapp/dummy/TrackersDataSource.kt index d3f168c..b6f319c 100644 --- a/app/src/main/java/foundation/e/privacycentralapp/dummy/TrackersDataSource.kt +++ b/app/src/main/java/foundation/e/privacycentralapp/dummy/TrackersDataSource.kt @@ -44,7 +44,7 @@ object TrackersDataSource { val crashlytics = Tracker( "Google Crashlytics", - domain = "|11|crashlytics|03|com", + domain = "|0b|crashlytics|03|com", trackedApps = listOf(facebook, firefox) ) @@ -55,12 +55,12 @@ object TrackersDataSource { ) val rubiconTracker = Tracker( "Rubicon Projects", - domain = "|03|ads|14|rubiconproject|03|com", + domain = "|03|ads|0e|rubiconproject|03|com", trackedApps = listOf(google, blisslauncher, youtube) ) val googleAnalytics = Tracker( "Google Analytics", - domain = "|16|google-analytics|03|com", + domain = "|10|google-analytics|03|com", trackedApps = listOf(facebook, firefox) ) -- cgit v1.2.3