Loading .gitlab-ci.yml +2 −2 Original line number Diff line number Diff line Loading @@ -55,7 +55,7 @@ quality-analysis: build-debug: stage: build script: - ./gradlew assembleDebug - ./gradlew :app:assembleDebug rules: - if: '$CI_PIPELINE_SOURCE == "schedule"' when: never Loading Loading @@ -91,7 +91,7 @@ test-debug: build-full: stage: build script: - ./gradlew assembleRelease - ./gradlew :app:assembleRelease rules: - if: '$CI_PIPELINE_SOURCE == "schedule"' when: never Loading app/build.gradle +5 −0 Original line number Diff line number Diff line /* * Copyright (C) 2023 MURENA SAS * Copyright (C) 2022 E FOUNDATION * * This program is free software: you can redistribute it and/or modify Loading @@ -19,6 +20,7 @@ plugins { id 'com.android.application' id 'kotlin-android' id 'kotlin-kapt' id 'androidx.navigation.safeargs.kotlin' } def getSentryDsn = { -> Loading Loading @@ -162,6 +164,9 @@ dependencies { Libs.AndroidX.work, Libs.material, Libs.AndroidX.navigation.fragmentKtx, Libs.AndroidX.navigation.uiKtx, Libs.Retrofit.retrofit, Libs.Retrofit.scalars, Loading app/src/main/java/foundation/e/advancedprivacy/DependencyContainer.kt +3 −3 Original line number Diff line number Diff line Loading @@ -41,7 +41,7 @@ import foundation.e.advancedprivacy.features.dashboard.DashboardViewModel import foundation.e.advancedprivacy.features.internetprivacy.InternetPrivacyViewModel import foundation.e.advancedprivacy.features.location.FakeLocationViewModel import foundation.e.advancedprivacy.features.trackers.TrackersViewModel import foundation.e.advancedprivacy.features.trackers.apptrackers.AppTrackersFragment import foundation.e.advancedprivacy.features.trackers.apptrackers.AppTrackersFragmentArgs import foundation.e.advancedprivacy.features.trackers.apptrackers.AppTrackersViewModel import foundation.e.privacymodules.fakelocation.FakeLocationModule import foundation.e.privacymodules.ipscrambler.IpScramblerModule Loading Loading @@ -172,8 +172,8 @@ class ViewModelsFactory( override fun <T : ViewModel> create(modelClass: Class<T>, extras: CreationExtras): T { return when (modelClass) { AppTrackersViewModel::class.java -> { val app = extras[DEFAULT_ARGS_KEY]?.getInt(AppTrackersFragment.PARAM_APP_UID)?.let { appListUseCase.getApp(it) val app = extras[DEFAULT_ARGS_KEY]?.let { appListUseCase.getApp(AppTrackersFragmentArgs.fromBundle(it).appUid) } ?: appListUseCase.dummySystemApp AppTrackersViewModel( Loading app/src/main/java/foundation/e/advancedprivacy/Notifications.kt +12 −14 Original line number Diff line number Diff line /* * Copyright (C) 2023 MURENA SAS * Copyright (C) 2022 MURENA SAS * * This program is free software: you can redistribute it and/or modify Loading @@ -21,7 +22,6 @@ import android.app.NotificationChannel import android.app.NotificationManager import android.app.PendingIntent import android.content.Context import android.content.Intent import androidx.annotation.StringRes import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat Loading Loading @@ -54,8 +54,9 @@ object Notifications { icon = R.drawable.ic_notification_logo, title = R.string.first_notification_title, description = R.string.first_notification_summary, destinationIntent = context.packageManager.getLaunchIntentForPackage(context.packageName) pendingIntent = MainActivity.deepLinkBuilder(context) .setDestination(R.id.dashboardFragment) .createPendingIntent() ) ) .setAutoCancel(true) Loading Loading @@ -140,7 +141,9 @@ object Notifications { icon = R.drawable.ic_fmd_bad, title = R.string.notifications_fake_location_title, description = R.string.notifications_fake_location_content, destinationIntent = MainActivity.createFakeLocationIntent(context), pendingIntent = MainActivity.deepLinkBuilder(context) .addDestination(R.id.fakeLocationFragment) .createPendingIntent() ) ) MainFeatures.IP_SCRAMBLING -> showFlagNotification( Loading @@ -151,7 +154,9 @@ object Notifications { icon = R.drawable.ic_language, title = R.string.notifications_ipscrambling_title, description = R.string.notifications_ipscrambling_content, destinationIntent = MainActivity.createIpScramblingIntent(context), pendingIntent = MainActivity.deepLinkBuilder(context) .addDestination(R.id.internetPrivacyFragment) .createPendingIntent() ) ) else -> {} Loading Loading @@ -184,7 +189,7 @@ object Notifications { val icon: Int, val title: Int, val description: Int, val destinationIntent: Intent? val pendingIntent: PendingIntent? ) private fun notificationBuilder( Loading @@ -196,14 +201,7 @@ object Notifications { .setPriority(NotificationCompat.PRIORITY_LOW) .setContentTitle(context.getString(content.title)) .setStyle(NotificationCompat.BigTextStyle().bigText(context.getString(content.description))) content.destinationIntent?.let { it.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK val pendingIntent: PendingIntent = PendingIntent.getActivity( context, 0, it, PendingIntent.FLAG_IMMUTABLE ) builder.setContentIntent(pendingIntent) } content.pendingIntent?.let { builder.setContentIntent(it) } return builder } Loading app/src/main/java/foundation/e/advancedprivacy/common/NavToolbarFragment.kt +30 −7 Original line number Diff line number Diff line /* * Copyright (C) 2023 MURENA SAS * Copyright (C) 2021 E FOUNDATION * * This program is free software: you can redistribute it and/or modify Loading @@ -17,17 +18,39 @@ package foundation.e.advancedprivacy.common import android.os.Bundle import android.view.View import androidx.annotation.LayoutRes import androidx.fragment.app.Fragment import androidx.navigation.fragment.findNavController import com.google.android.material.appbar.MaterialToolbar import foundation.e.advancedprivacy.R abstract class NavToolbarFragment(@LayoutRes contentLayoutId: Int) : ToolbarFragment(contentLayoutId) { abstract class NavToolbarFragment(@LayoutRes contentLayoutId: Int) : Fragment(contentLayoutId) { override fun setupToolbar(toolbar: MaterialToolbar) { super.setupToolbar(toolbar) toolbar.apply { setNavigationOnClickListener { requireActivity().onBackPressed() /** * @return title to be used in toolbar */ open fun getTitle(): CharSequence { return findNavController().currentDestination?.label ?: "" } fun setTitle(title: CharSequence?) { getToolbar()?.title = title } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) setupToolbar(view.findViewById(R.id.toolbar)) } open fun setupToolbar(toolbar: MaterialToolbar) { toolbar.title = getTitle() toolbar.setNavigationOnClickListener { requireActivity().onBackPressed() } } fun getToolbar(): MaterialToolbar? = view?.findViewById(R.id.toolbar) } Loading
.gitlab-ci.yml +2 −2 Original line number Diff line number Diff line Loading @@ -55,7 +55,7 @@ quality-analysis: build-debug: stage: build script: - ./gradlew assembleDebug - ./gradlew :app:assembleDebug rules: - if: '$CI_PIPELINE_SOURCE == "schedule"' when: never Loading Loading @@ -91,7 +91,7 @@ test-debug: build-full: stage: build script: - ./gradlew assembleRelease - ./gradlew :app:assembleRelease rules: - if: '$CI_PIPELINE_SOURCE == "schedule"' when: never Loading
app/build.gradle +5 −0 Original line number Diff line number Diff line /* * Copyright (C) 2023 MURENA SAS * Copyright (C) 2022 E FOUNDATION * * This program is free software: you can redistribute it and/or modify Loading @@ -19,6 +20,7 @@ plugins { id 'com.android.application' id 'kotlin-android' id 'kotlin-kapt' id 'androidx.navigation.safeargs.kotlin' } def getSentryDsn = { -> Loading Loading @@ -162,6 +164,9 @@ dependencies { Libs.AndroidX.work, Libs.material, Libs.AndroidX.navigation.fragmentKtx, Libs.AndroidX.navigation.uiKtx, Libs.Retrofit.retrofit, Libs.Retrofit.scalars, Loading
app/src/main/java/foundation/e/advancedprivacy/DependencyContainer.kt +3 −3 Original line number Diff line number Diff line Loading @@ -41,7 +41,7 @@ import foundation.e.advancedprivacy.features.dashboard.DashboardViewModel import foundation.e.advancedprivacy.features.internetprivacy.InternetPrivacyViewModel import foundation.e.advancedprivacy.features.location.FakeLocationViewModel import foundation.e.advancedprivacy.features.trackers.TrackersViewModel import foundation.e.advancedprivacy.features.trackers.apptrackers.AppTrackersFragment import foundation.e.advancedprivacy.features.trackers.apptrackers.AppTrackersFragmentArgs import foundation.e.advancedprivacy.features.trackers.apptrackers.AppTrackersViewModel import foundation.e.privacymodules.fakelocation.FakeLocationModule import foundation.e.privacymodules.ipscrambler.IpScramblerModule Loading Loading @@ -172,8 +172,8 @@ class ViewModelsFactory( override fun <T : ViewModel> create(modelClass: Class<T>, extras: CreationExtras): T { return when (modelClass) { AppTrackersViewModel::class.java -> { val app = extras[DEFAULT_ARGS_KEY]?.getInt(AppTrackersFragment.PARAM_APP_UID)?.let { appListUseCase.getApp(it) val app = extras[DEFAULT_ARGS_KEY]?.let { appListUseCase.getApp(AppTrackersFragmentArgs.fromBundle(it).appUid) } ?: appListUseCase.dummySystemApp AppTrackersViewModel( Loading
app/src/main/java/foundation/e/advancedprivacy/Notifications.kt +12 −14 Original line number Diff line number Diff line /* * Copyright (C) 2023 MURENA SAS * Copyright (C) 2022 MURENA SAS * * This program is free software: you can redistribute it and/or modify Loading @@ -21,7 +22,6 @@ import android.app.NotificationChannel import android.app.NotificationManager import android.app.PendingIntent import android.content.Context import android.content.Intent import androidx.annotation.StringRes import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat Loading Loading @@ -54,8 +54,9 @@ object Notifications { icon = R.drawable.ic_notification_logo, title = R.string.first_notification_title, description = R.string.first_notification_summary, destinationIntent = context.packageManager.getLaunchIntentForPackage(context.packageName) pendingIntent = MainActivity.deepLinkBuilder(context) .setDestination(R.id.dashboardFragment) .createPendingIntent() ) ) .setAutoCancel(true) Loading Loading @@ -140,7 +141,9 @@ object Notifications { icon = R.drawable.ic_fmd_bad, title = R.string.notifications_fake_location_title, description = R.string.notifications_fake_location_content, destinationIntent = MainActivity.createFakeLocationIntent(context), pendingIntent = MainActivity.deepLinkBuilder(context) .addDestination(R.id.fakeLocationFragment) .createPendingIntent() ) ) MainFeatures.IP_SCRAMBLING -> showFlagNotification( Loading @@ -151,7 +154,9 @@ object Notifications { icon = R.drawable.ic_language, title = R.string.notifications_ipscrambling_title, description = R.string.notifications_ipscrambling_content, destinationIntent = MainActivity.createIpScramblingIntent(context), pendingIntent = MainActivity.deepLinkBuilder(context) .addDestination(R.id.internetPrivacyFragment) .createPendingIntent() ) ) else -> {} Loading Loading @@ -184,7 +189,7 @@ object Notifications { val icon: Int, val title: Int, val description: Int, val destinationIntent: Intent? val pendingIntent: PendingIntent? ) private fun notificationBuilder( Loading @@ -196,14 +201,7 @@ object Notifications { .setPriority(NotificationCompat.PRIORITY_LOW) .setContentTitle(context.getString(content.title)) .setStyle(NotificationCompat.BigTextStyle().bigText(context.getString(content.description))) content.destinationIntent?.let { it.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK val pendingIntent: PendingIntent = PendingIntent.getActivity( context, 0, it, PendingIntent.FLAG_IMMUTABLE ) builder.setContentIntent(pendingIntent) } content.pendingIntent?.let { builder.setContentIntent(it) } return builder } Loading
app/src/main/java/foundation/e/advancedprivacy/common/NavToolbarFragment.kt +30 −7 Original line number Diff line number Diff line /* * Copyright (C) 2023 MURENA SAS * Copyright (C) 2021 E FOUNDATION * * This program is free software: you can redistribute it and/or modify Loading @@ -17,17 +18,39 @@ package foundation.e.advancedprivacy.common import android.os.Bundle import android.view.View import androidx.annotation.LayoutRes import androidx.fragment.app.Fragment import androidx.navigation.fragment.findNavController import com.google.android.material.appbar.MaterialToolbar import foundation.e.advancedprivacy.R abstract class NavToolbarFragment(@LayoutRes contentLayoutId: Int) : ToolbarFragment(contentLayoutId) { abstract class NavToolbarFragment(@LayoutRes contentLayoutId: Int) : Fragment(contentLayoutId) { override fun setupToolbar(toolbar: MaterialToolbar) { super.setupToolbar(toolbar) toolbar.apply { setNavigationOnClickListener { requireActivity().onBackPressed() /** * @return title to be used in toolbar */ open fun getTitle(): CharSequence { return findNavController().currentDestination?.label ?: "" } fun setTitle(title: CharSequence?) { getToolbar()?.title = title } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) setupToolbar(view.findViewById(R.id.toolbar)) } open fun setupToolbar(toolbar: MaterialToolbar) { toolbar.title = getTitle() toolbar.setNavigationOnClickListener { requireActivity().onBackPressed() } } fun getToolbar(): MaterialToolbar? = view?.findViewById(R.id.toolbar) }