diff options
23 files changed, 339 insertions, 277 deletions
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<TrackersFeature.State, TrackersFeature.Action> { - 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<RecyclerView>(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<RecyclerView>(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<RecyclerView>(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<TrackersFeature.State, TrackersFeature.Action> { - 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 @@ <?xml version="1.0" encoding="utf-8"?> <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" + android:layout_width="match_parent" />
\ 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 @@ <androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" - android:layout_width="match_parent" android:layout_height="match_parent" + android:layout_width="match_parent" > - <include layout="@layout/topbar"/> + <include layout="@layout/topbar" /> <ProgressBar android:id="@+id/loadingSpinner" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center" android:indeterminate="true" + android:layout_gravity="center" + android:layout_height="wrap_content" + android:layout_width="wrap_content" /> <androidx.core.widget.NestedScrollView android:id="@+id/scrollContainer" - android:layout_width="match_parent" android:layout_height="match_parent" + android:layout_width="match_parent" android:visibility="gone" app:layout_behavior="@string/appbar_scrolling_view_behavior" > <LinearLayout - android:layout_width="match_parent" - android:layout_height="match_parent" android:background="@color/white" android:gravity="center_horizontal" + android:layout_height="match_parent" + android:layout_width="match_parent" 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:layout_gravity="center_horizontal" + android:layout_height="wrap_content" + android:layout_width="match_parent" + android:paddingBottom="16dp" android:paddingLeft="32dp" - android:paddingTop="16dp" android:paddingRight="32dp" - android:paddingBottom="16dp" + android:paddingTop="16dp" android:text="@string/privacy_dashboard_info" android:textColor="@color/black" android:textSize="14sp" @@ -49,91 +49,91 @@ <ImageView android:id="@+id/togglePrivacyCentral" - android:layout_width="96dp" android:layout_height="96dp" - android:layout_marginTop="16dp" android:layout_marginBottom="16dp" + android:layout_marginTop="16dp" + android:layout_width="96dp" 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:id="@+id/tap_to_enable_quick_protection" + android:layout_gravity="center_horizontal" + android:layout_height="wrap_content" + android:layout_width="match_parent" + android:paddingBottom="16dp" android:paddingLeft="32dp" - android:paddingTop="16dp" android:paddingRight="32dp" - android:paddingBottom="16dp" + android:paddingTop="16dp" android:text="@string/tap_to_enable_quick_protection" android:textColor="@color/black" android:textSize="14sp" /> <ImageView - android:layout_width="match_parent" android:layout_height="160dp" + android:layout_width="match_parent" android:src="@drawable/dummy_leakage_analytics" /> <TextView + android:gravity="center" android:id="@+id/personal_leakag_info" - android:layout_width="match_parent" - android:layout_height="wrap_content" android:layout_gravity="center_horizontal" - android:gravity="center" + android:layout_height="wrap_content" + android:layout_width="match_parent" + android:paddingBottom="16dp" android:paddingLeft="32dp" android:paddingRight="32dp" - android:paddingBottom="16dp" android:text="@string/personal_leakage_info" android:textColor="@color/black" android:textSize="12sp" /> <LinearLayout - android:layout_width="match_parent" - android:layout_height="match_parent" android:background="#f9f9f9" + android:layout_height="match_parent" + android:layout_width="match_parent" android:orientation="vertical" > <RelativeLayout android:id="@+id/am_i_tracked" - android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_width="match_parent" + android:paddingBottom="16dp" android:paddingLeft="32dp" - android:paddingTop="16dp" android:paddingRight="32dp" - android:paddingBottom="16dp" + android:paddingTop="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:layout_height="36dp" + android:layout_width="36dp" 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:layout_toStartOf="@+id/am_i_tracked_chevron" + android:layout_width="match_parent" android:orientation="vertical" - android:paddingStart="16dp" android:paddingEnd="32dp" + android:paddingStart="16dp" > <TextView + android:fontFamily="sans-serif-medium" android:id="@+id/am_i_tracked_title" - android:layout_width="match_parent" android:layout_height="wrap_content" - android:fontFamily="sans-serif-medium" + android:layout_width="match_parent" android:text="@string/am_i_tracked_title" android:textColor="@color/black" android:textSize="16sp" @@ -141,8 +141,8 @@ <TextView android:id="@+id/am_i_tracked_subtitle" - android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_width="match_parent" android:text="@string/am_i_tracked_subtitle" android:textColor="@color/black" android:textSize="14sp" @@ -151,48 +151,48 @@ <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:layout_height="24dp" + android:layout_width="24dp" 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:layout_width="match_parent" + android:paddingBottom="16dp" android:paddingLeft="32dp" - android:paddingTop="16dp" android:paddingRight="32dp" - android:paddingBottom="16dp" + android:paddingTop="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:layout_height="36dp" + android:layout_width="36dp" 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:layout_toStartOf="@+id/apps_permissions_chevron" + android:layout_width="match_parent" android:orientation="vertical" - android:paddingStart="16dp" android:paddingEnd="32dp" + android:paddingStart="16dp" > <TextView + android:fontFamily="sans-serif-medium" android:id="@+id/apps_permissions_title" - android:layout_width="match_parent" android:layout_height="wrap_content" - android:fontFamily="sans-serif-medium" + android:layout_width="match_parent" android:text="@string/apps_permissions_title" android:textColor="@color/black" android:textSize="16sp" @@ -200,8 +200,8 @@ <TextView android:id="@+id/apps_permissions_subtitle" - android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_width="match_parent" android:text="@string/apps_permissions_subtitle" android:textColor="@color/black" android:textSize="14sp" @@ -210,48 +210,48 @@ <ImageView android:id="@+id/apps_permissions_chevron" - android:layout_width="24dp" - android:layout_height="24dp" android:layout_alignParentEnd="true" android:layout_centerVertical="true" + android:layout_height="24dp" + android:layout_width="24dp" 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:layout_width="match_parent" + android:paddingBottom="16dp" android:paddingLeft="32dp" - android:paddingTop="16dp" android:paddingRight="32dp" - android:paddingBottom="16dp" + android:paddingTop="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:layout_height="36dp" + android:layout_width="36dp" android:src="@drawable/ic_my_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:layout_toStartOf="@+id/my_location_chevron" + android:layout_width="match_parent" android:orientation="vertical" - android:paddingStart="16dp" android:paddingEnd="32dp" + android:paddingStart="16dp" > <TextView + android:fontFamily="sans-serif-medium" android:id="@+id/my_location_title" - android:layout_width="match_parent" android:layout_height="wrap_content" - android:fontFamily="sans-serif-medium" + android:layout_width="match_parent" android:text="@string/my_location_title" android:textColor="@color/black" android:textSize="16sp" @@ -259,8 +259,8 @@ <TextView android:id="@+id/my_location_subtitle" - android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_width="match_parent" android:text="@string/my_location_subtitle" android:textColor="@color/black" android:textSize="14sp" @@ -269,48 +269,48 @@ <ImageView android:id="@+id/my_location_chevron" - android:layout_width="24dp" - android:layout_height="24dp" android:layout_alignParentEnd="true" android:layout_centerVertical="true" + android:layout_height="24dp" + android:layout_width="24dp" 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:layout_width="match_parent" + android:paddingBottom="16dp" android:paddingLeft="32dp" - android:paddingTop="16dp" android:paddingRight="32dp" - android:paddingBottom="16dp" + android:paddingTop="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:layout_height="36dp" + android:layout_width="36dp" 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:layout_toStartOf="@+id/internet_activity_privacy_chevron" + android:layout_width="match_parent" android:orientation="vertical" - android:paddingStart="16dp" android:paddingEnd="32dp" + android:paddingStart="16dp" > <TextView + android:fontFamily="sans-serif-medium" android:id="@+id/internet_activity_privacy_title" - android:layout_width="match_parent" android:layout_height="wrap_content" - android:fontFamily="sans-serif-medium" + android:layout_width="match_parent" android:text="@string/internet_activity_privacy_title" android:textColor="@color/black" android:textSize="16sp" @@ -318,8 +318,8 @@ <TextView android:id="@+id/internet_activity_privacy_subtitle" - android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_width="match_parent" android:text="@string/internet_activity_privacy_subtitle" android:textColor="@color/black" android:textSize="14sp" @@ -328,10 +328,10 @@ <ImageView android:id="@+id/internet_activity_privacy_chevron" - android:layout_width="24dp" - android:layout_height="24dp" android:layout_alignParentEnd="true" android:layout_centerVertical="true" |