summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--app/build.gradle9
-rw-r--r--app/src/androidTest/java/foundation/e/privacycentralapp/ExampleInstrumentedTest.kt39
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/DependencyContainer.kt26
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/PrivacyCentralApplication.kt2
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/UpdateTrackersWorker.kt5
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/common/TextViewHelpers.kt2
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/common/extensions/AnyExtension.kt6
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/data/repositories/LocalStateRepository.kt9
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/domain/entities/TrackerMode.kt2
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/domain/usecases/FakeLocationStateUseCase.kt19
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/domain/usecases/GetQuickPrivacyStateUseCase.kt4
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/domain/usecases/IpScramblingStateUseCase.kt51
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/domain/usecases/TrackersStateUseCase.kt7
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/domain/usecases/TrackersStatisticsUseCase.kt10
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/features/dashboard/DashboardFragment.kt19
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/features/dashboard/DashboardState.kt2
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/features/dashboard/DashboardViewModel.kt23
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/features/internetprivacy/InternetPrivacyFragment.kt3
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/features/internetprivacy/InternetPrivacyState.kt2
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/features/internetprivacy/InternetPrivacyViewModel.kt51
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/features/location/FakeLocationFragment.kt14
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/features/location/FakeLocationState.kt2
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/features/location/FakeLocationViewModel.kt28
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/features/trackers/TrackersState.kt2
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/features/trackers/TrackersViewModel.kt8
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/features/trackers/apptrackers/AppTrackersFragment.kt7
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/features/trackers/apptrackers/AppTrackersState.kt9
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/features/trackers/apptrackers/AppTrackersViewModel.kt96
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/main/MainActivity.kt1
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/widget/Widget.kt1
-rw-r--r--app/src/main/java/foundation/e/privacycentralapp/widget/WidgetUI.kt7
-rw-r--r--app/src/main/res/values/strings.xml2
-rw-r--r--fakelocation/fakelocationdemo/build.gradle2
-rw-r--r--fakelocation/fakelocationdemo/src/main/java/foundation/e/privacymodules/fakelocationdemo/MainActivity.kt29
-rw-r--r--fakelocation/src/main/java/foundation/e/privacymodules/fakelocation/FakeLocationModule.kt12
-rw-r--r--fakelocation/src/main/java/foundation/e/privacymodules/fakelocation/FakeLocationService.kt6
-rw-r--r--permissionse/libs/hidden-apis-stub/src/main/java/android/net/IConnectivityManager.java6
-rw-r--r--permissionse/libs/hidden-apis-stub/src/main/java/android/net/VpnManager.java11
-rw-r--r--permissionse/src/main/AndroidManifest.xml2
-rw-r--r--permissionse/src/main/java/foundation/e/privacymodules/permissions/PermissionsPrivacyModule.kt67
-rw-r--r--permissionsstandalone/build.gradle2
-rw-r--r--permissionsstandalone/src/main/java/foundation/e/privacymodules/permissions/PermissionsPrivacyModule.kt12
-rw-r--r--privacymodule-api/src/main/java/foundation/e/privacymodules/DependencyInjector.kt3
-rw-r--r--privacymodule-api/src/main/java/foundation/e/privacymodules/permissions/APermissionsPrivacyModule.kt36
-rw-r--r--privacymodule-api/src/main/java/foundation/e/privacymodules/permissions/IPermissionsPrivacyModule.kt16
-rw-r--r--privacymodule-api/src/main/java/foundation/e/privacymodules/permissions/data/AppOpModes.kt8
-rw-r--r--privacymodule-api/src/main/java/foundation/e/privacymodules/permissions/data/PermissionDescription.kt2
-rw-r--r--trackers/build.gradle102
-rw-r--r--trackers/src/main/java/foundation/e/privacymodules/trackers/DNSBlockerRunnable.kt305
-rw-r--r--trackers/src/main/java/foundation/e/privacymodules/trackers/DNSBlockerService.kt31
-rw-r--r--trackers/src/main/java/foundation/e/privacymodules/trackers/ForegroundStarter.kt33
-rw-r--r--trackers/src/main/java/foundation/e/privacymodules/trackers/TrackersLogger.kt33
-rw-r--r--trackers/src/main/java/foundation/e/privacymodules/trackers/api/BlockTrackersPrivacyModule.kt39
-rw-r--r--trackers/src/main/java/foundation/e/privacymodules/trackers/api/IBlockTrackersPrivacyModule.kt2
-rw-r--r--trackers/src/main/java/foundation/e/privacymodules/trackers/api/ITrackTrackersPrivacyModule.kt3
-rw-r--r--trackers/src/main/java/foundation/e/privacymodules/trackers/api/TrackTrackersPrivacyModule.kt33
-rw-r--r--trackers/src/main/java/foundation/e/privacymodules/trackers/data/StatsDatabase.kt49
-rw-r--r--trackers/src/main/java/foundation/e/privacymodules/trackers/data/StatsRepository.kt33
-rw-r--r--trackers/src/main/java/foundation/e/privacymodules/trackers/data/TrackersRepository.kt33
-rw-r--r--trackers/src/main/java/foundation/e/privacymodules/trackers/data/WhitelistRepository.kt48
60 files changed, 741 insertions, 685 deletions
diff --git a/app/build.gradle b/app/build.gradle
index d4d6a51..82717d3 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -115,6 +115,10 @@ android {
dataBinding true
viewBinding true
}
+
+ lintOptions {
+ disable 'MissingTranslation'
+ }
}
dependencies {
@@ -130,6 +134,8 @@ dependencies {
implementation 'foundation.e:privacymodule.tor:1.3.0-orbot-16.6.2'
+ implementation 'foundation.e:elib:0.0.1-alpha11'
+
implementation (
Libs.Kotlin.stdlib,
Libs.AndroidX.coreKtx,
@@ -150,9 +156,6 @@ dependencies {
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.9.1'
testImplementation 'junit:junit:4.+'
- androidTestImplementation 'androidx.test.ext:junit:1.1.2'
- androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
- implementation 'foundation.e:elib:0.0.1-alpha11'
}
static def log(Object val) {
diff --git a/app/src/androidTest/java/foundation/e/privacycentralapp/ExampleInstrumentedTest.kt b/app/src/androidTest/java/foundation/e/privacycentralapp/ExampleInstrumentedTest.kt
deleted file mode 100644
index f42f093..0000000
--- a/app/src/androidTest/java/foundation/e/privacycentralapp/ExampleInstrumentedTest.kt
+++ /dev/null
@@ -1,39 +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
-
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.platform.app.InstrumentationRegistry
-import org.junit.Assert
-import org.junit.Test
-import org.junit.runner.RunWith
-
-/**
- * Instrumented test, which will execute on an Android device.
- *
- * See [testing documentation](http://d.android.com/tools/testing).
- */
-@RunWith(AndroidJUnit4::class)
-class ExampleInstrumentedTest {
- @Test
- fun useAppContext() {
- // Context of the app under test.
- val appContext = InstrumentationRegistry.getInstrumentation().targetContext
- Assert.assertEquals("foundation.e.privacycentralapp", appContext.packageName)
- }
-}
diff --git a/app/src/main/java/foundation/e/privacycentralapp/DependencyContainer.kt b/app/src/main/java/foundation/e/privacycentralapp/DependencyContainer.kt
index 2e24d4c..670b81e 100644
--- a/app/src/main/java/foundation/e/privacycentralapp/DependencyContainer.kt
+++ b/app/src/main/java/foundation/e/privacycentralapp/DependencyContainer.kt
@@ -106,15 +106,17 @@ class DependencyContainer(val app: Application) {
)
}
- val viewModelsFactory by lazy { ViewModelsFactory(
- getQuickPrivacyStateUseCase = getQuickPrivacyStateUseCase,
- trackersStatisticsUseCase = trackersStatisticsUseCase,
- trackersStateUseCase = trackersStateUseCase,
- fakeLocationStateUseCase = fakeLocationStateUseCase,
- ipScramblerModule = ipScramblerModule,
- ipScramblingStateUseCase = ipScramblingStateUseCase,
- appListUseCase = appListUseCase
- ) }
+ val viewModelsFactory by lazy {
+ ViewModelsFactory(
+ getQuickPrivacyStateUseCase = getQuickPrivacyStateUseCase,
+ trackersStatisticsUseCase = trackersStatisticsUseCase,
+ trackersStateUseCase = trackersStateUseCase,
+ fakeLocationStateUseCase = fakeLocationStateUseCase,
+ ipScramblerModule = ipScramblerModule,
+ ipScramblingStateUseCase = ipScramblingStateUseCase,
+ appListUseCase = appListUseCase
+ )
+ }
// Background
fun initBackgroundSingletons() {
@@ -140,15 +142,15 @@ class ViewModelsFactory(
private val ipScramblerModule: IIpScramblerModule,
private val ipScramblingStateUseCase: IpScramblingStateUseCase,
private val appListUseCase: AppListUseCase
-): ViewModelProvider.Factory {
+) : ViewModelProvider.Factory {
@Suppress("UNCHECKED_CAST")
override fun <T : ViewModel> create(modelClass: Class<T>, extras: CreationExtras): T {
return when (modelClass) {
AppTrackersViewModel::class.java -> {
val fallbackUid = android.os.Process.myPid()
- val appUid = extras[DEFAULT_ARGS_KEY]?.
- getInt(AppTrackersFragment.PARAM_APP_UID, fallbackUid)?: fallbackUid
+ val appUid = extras[DEFAULT_ARGS_KEY]
+ ?.getInt(AppTrackersFragment.PARAM_APP_UID, fallbackUid) ?: fallbackUid
AppTrackersViewModel(
appUid = appUid,
diff --git a/app/src/main/java/foundation/e/privacycentralapp/PrivacyCentralApplication.kt b/app/src/main/java/foundation/e/privacycentralapp/PrivacyCentralApplication.kt
index b23be3d..28e96e0 100644
--- a/app/src/main/java/foundation/e/privacycentralapp/PrivacyCentralApplication.kt
+++ b/app/src/main/java/foundation/e/privacycentralapp/PrivacyCentralApplication.kt
@@ -19,14 +19,12 @@ package foundation.e.privacycentralapp
import android.app.Application
import com.mapbox.mapboxsdk.Mapbox
-import kotlinx.coroutines.FlowPreview
class PrivacyCentralApplication : Application() {
// Initialize the dependency container.
val dependencyContainer: DependencyContainer by lazy { DependencyContainer(this) }
-
override fun onCreate() {
super.onCreate()
Mapbox.getTelemetry()?.setUserTelemetryRequestState(false)
diff --git a/app/src/main/java/foundation/e/privacycentralapp/UpdateTrackersWorker.kt b/app/src/main/java/foundation/e/privacycentralapp/UpdateTrackersWorker.kt
index c83d8f9..13511da 100644
--- a/app/src/main/java/foundation/e/privacycentralapp/UpdateTrackersWorker.kt
+++ b/app/src/main/java/foundation/e/privacycentralapp/UpdateTrackersWorker.kt
@@ -45,8 +45,9 @@ class UpdateTrackersWorker(appContext: Context, workerParams: WorkerParameters)
fun periodicUpdate(context: Context) {
val request = PeriodicWorkRequestBuilder<UpdateTrackersWorker>(
- 7, TimeUnit.DAYS)
- .setConstraints(constraints).build()
+ 7, TimeUnit.DAYS
+ )
+ .setConstraints(constraints).build()
WorkManager.getInstance(context).enqueueUniquePeriodicWork(
UpdateTrackersWorker::class.qualifiedName ?: "",
diff --git a/app/src/main/java/foundation/e/privacycentralapp/common/TextViewHelpers.kt b/app/src/main/java/foundation/e/privacycentralapp/common/TextViewHelpers.kt
index 25a3633..d85f4a7 100644
--- a/app/src/main/java/foundation/e/privacycentralapp/common/TextViewHelpers.kt
+++ b/app/src/main/java/foundation/e/privacycentralapp/common/TextViewHelpers.kt
@@ -60,4 +60,4 @@ private fun asteriskAsInfoIconSpannable(
}
}
return spannable
-} \ No newline at end of file
+}
diff --git a/app/src/main/java/foundation/e/privacycentralapp/common/extensions/AnyExtension.kt b/app/src/main/java/foundation/e/privacycentralapp/common/extensions/AnyExtension.kt
index 5c73df9..71de99a 100644
--- a/app/src/main/java/foundation/e/privacycentralapp/common/extensions/AnyExtension.kt
+++ b/app/src/main/java/foundation/e/privacycentralapp/common/extensions/AnyExtension.kt
@@ -19,10 +19,4 @@ package foundation.e.privacycentralapp.common.extensions
import android.content.Context
-fun Any.toText(context: Context) = when (this) {
- is Int -> context.getString(this)
- is String -> this
- else -> this.toString()
-}
-
fun Int.dpToPxF(context: Context): Float = this.toFloat() * context.resources.displayMetrics.density
diff --git a/app/src/main/java/foundation/e/privacycentralapp/data/repositories/LocalStateRepository.kt b/app/src/main/java/foundation/e/privacycentralapp/data/repositories/LocalStateRepository.kt
index 672f260..d39ee43 100644
--- a/app/src/main/java/foundation/e/privacycentralapp/data/repositories/LocalStateRepository.kt
+++ b/app/src/main/java/foundation/e/privacycentralapp/data/repositories/LocalStateRepository.kt
@@ -20,6 +20,7 @@ package foundation.e.privacycentralapp.data.repositories
import android.content.Context
import foundation.e.privacycentralapp.domain.entities.InternetPrivacyMode
import foundation.e.privacycentralapp.domain.entities.LocationMode
+import foundation.e.privacymodules.permissions.data.ApplicationDescription
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharedFlow
@@ -51,12 +52,12 @@ class LocalStateRepository(context: Context) {
return isFirstActivation
}
- private val _otherVpnRunning = MutableSharedFlow<Boolean>()
- suspend fun emitOtherVpnRunning() {
- _otherVpnRunning.emit(true)
+ private val _otherVpnRunning = MutableSharedFlow<ApplicationDescription>()
+ suspend fun emitOtherVpnRunning(appDesc: ApplicationDescription) {
+ _otherVpnRunning.emit(appDesc)
}
- val otherVpnRunning: SharedFlow<Boolean> = _otherVpnRunning
+ val otherVpnRunning: SharedFlow<ApplicationDescription> = _otherVpnRunning
var quickPrivacyEnabledFlow: StateFlow<Boolean> = quickPrivacyEnabledMutableFlow
diff --git a/app/src/main/java/foundation/e/privacycentralapp/domain/entities/TrackerMode.kt b/app/src/main/java/foundation/e/privacycentralapp/domain/entities/TrackerMode.kt
index ae70ba3..9f057be 100644
--- a/app/src/main/java/foundation/e/privacycentralapp/domain/entities/TrackerMode.kt
+++ b/app/src/main/java/foundation/e/privacycentralapp/domain/entities/TrackerMode.kt
@@ -19,4 +19,4 @@ package foundation.e.privacycentralapp.domain.entities
enum class TrackerMode {
DENIED, CUSTOM, VULNERABLE
-} \ No newline at end of file
+}
diff --git a/app/src/main/java/foundation/e/privacycentralapp/domain/usecases/FakeLocationStateUseCase.kt b/app/src/main/java/foundation/e/privacycentralapp/domain/usecases/FakeLocationStateUseCase.kt
index 1426891..e9da855 100644
--- a/app/src/main/java/foundation/e/privacycentralapp/domain/usecases/FakeLocationStateUseCase.kt
+++ b/app/src/main/java/foundation/e/privacycentralapp/domain/usecases/FakeLocationStateUseCase.kt
@@ -67,8 +67,8 @@ class FakeLocationStateUseCase(
get() = appContext.getSystemService(Context.LOCATION_SERVICE) as LocationManager
private fun hasAcquireLocationPermission(): Boolean {
- return (appContext.checkSelfPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED)
- || permissionsModule.toggleDangerousPermission(appDesc, android.Manifest.permission.ACCESS_FINE_LOCATION, true)
+ return (appContext.checkSelfPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) ||
+ permissionsModule.toggleDangerousPermission(appDesc, android.Manifest.permission.ACCESS_FINE_LOCATION, true)
}
private fun applySettings(isQuickPrivacyEnabled: Boolean, fakeLocation: Pair<Float, Float>?, isSpecificLocation: Boolean = false) {
@@ -85,8 +85,8 @@ class FakeLocationStateUseCase(
}
private fun hasAcquireMockLocationPermission(): Boolean {
- return (permissionsModule.getAppOpMode(appDesc, AppOpsManager.OPSTR_MOCK_LOCATION) == AppOpModes.ALLOWED)
- || permissionsModule.setAppOpMode(appDesc, AppOpsManager.OPSTR_MOCK_LOCATION, AppOpModes.ALLOWED)
+ return (permissionsModule.getAppOpMode(appDesc, AppOpsManager.OPSTR_MOCK_LOCATION) == AppOpModes.ALLOWED) ||
+ permissionsModule.setAppOpMode(appDesc, AppOpsManager.OPSTR_MOCK_LOCATION, AppOpModes.ALLOWED)
}
fun setSpecificLocation(latitude: Float, longitude: Float) {
@@ -140,7 +140,8 @@ class FakeLocationStateUseCase(
override fun onLocationChanged(location: Location) {
currentLocation.update { previous ->
if ((previous?.time ?: 0) + 1800 < location.time ||
- (previous?.accuracy ?: Float.MAX_VALUE) > location.accuracy) {
+ (previous?.accuracy ?: Float.MAX_VALUE) > location.accuracy
+ ) {
location
} else {
previous
@@ -193,10 +194,10 @@ class FakeLocationStateUseCase(
)
- locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER)?:
- locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER)?.let {
- localListener.onLocationChanged(it)
- }
+ locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER)
+ ?: locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER)?.let {
+ localListener.onLocationChanged(it)
+ }
} catch (se: SecurityException) {
Log.e(TAG, "Missing permission", se)
}
diff --git a/app/src/main/java/foundation/e/privacycentralapp/domain/usecases/GetQuickPrivacyStateUseCase.kt b/app/src/main/java/foundation/e/privacycentralapp/domain/usecases/GetQuickPrivacyStateUseCase.kt
index e1f773f..46e054e 100644
--- a/app/src/main/java/foundation/e/privacycentralapp/domain/usecases/GetQuickPrivacyStateUseCase.kt
+++ b/app/src/main/java/foundation/e/privacycentralapp/domain/usecases/GetQuickPrivacyStateUseCase.kt
@@ -22,6 +22,7 @@ import foundation.e.privacycentralapp.domain.entities.InternetPrivacyMode
import foundation.e.privacycentralapp.domain.entities.LocationMode
import foundation.e.privacycentralapp.domain.entities.QuickPrivacyState
import foundation.e.privacycentralapp.domain.entities.TrackerMode
+import foundation.e.privacymodules.permissions.data.ApplicationDescription
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.SharedFlow
@@ -106,6 +107,5 @@ class GetQuickPrivacyStateUseCase(
localStateRepository.setShowQuickPrivacyDisabledMessage(false)
}
- val otherVpnRunning: SharedFlow<Boolean> = localStateRepository.otherVpnRunning
-
+ val otherVpnRunning: SharedFlow<ApplicationDescription> = localStateRepository.otherVpnRunning
}
diff --git a/app/src/main/java/foundation/e/privacycentralapp/domain/usecases/IpScramblingStateUseCase.kt b/app/src/main/java/foundation/e/privacycentralapp/domain/usecases/IpScramblingStateUseCase.kt
index 3320721..cb9fcd5 100644
--- a/app/src/main/java/foundation/e/privacycentralapp/domain/usecases/IpScramblingStateUseCase.kt
+++ b/