diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index 31caf4a..5cd220e 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -11,8 +11,8 @@ android {
applicationId = "com.cgprograms.dnslock"
minSdk = 29
targetSdk = 34
- versionCode = 5
- versionName = "3.1.0"
+ versionCode = 6
+ versionName = "4.0.0"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables {
diff --git a/app/release/baselineProfiles/0/app-release.dm b/app/release/baselineProfiles/0/app-release.dm
index 78b869a..ccbd4af 100644
Binary files a/app/release/baselineProfiles/0/app-release.dm and b/app/release/baselineProfiles/0/app-release.dm differ
diff --git a/app/release/baselineProfiles/1/app-release.dm b/app/release/baselineProfiles/1/app-release.dm
index 2f17844..59d507d 100644
Binary files a/app/release/baselineProfiles/1/app-release.dm and b/app/release/baselineProfiles/1/app-release.dm differ
diff --git a/app/release/output-metadata.json b/app/release/output-metadata.json
index e666c30..01ac564 100644
--- a/app/release/output-metadata.json
+++ b/app/release/output-metadata.json
@@ -11,8 +11,8 @@
"type": "SINGLE",
"filters": [],
"attributes": [],
- "versionCode": 5,
- "versionName": "3.1.0",
+ "versionCode": 6,
+ "versionName": "4.0.0",
"outputFile": "app-release.apk"
}
],
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index b7d980d..7d01127 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -9,6 +9,7 @@
+
@@ -38,13 +39,13 @@
-
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/cgprograms/dnslock/MyDeviceAdminReceiver.kt b/app/src/main/java/com/cgprograms/dnslock/MyDeviceAdminReceiver.kt
index 4898388..6b0e230 100644
--- a/app/src/main/java/com/cgprograms/dnslock/MyDeviceAdminReceiver.kt
+++ b/app/src/main/java/com/cgprograms/dnslock/MyDeviceAdminReceiver.kt
@@ -7,6 +7,7 @@ import android.content.Context
import android.content.Intent
import android.os.UserManager
+
class MyDeviceAdminReceiver : DeviceAdminReceiver() {
override fun onEnabled(context: Context, intent: Intent) {
super.onEnabled(context, intent)
@@ -16,6 +17,8 @@ class MyDeviceAdminReceiver : DeviceAdminReceiver() {
dpm.addUserRestriction(adminComponent, UserManager.DISALLOW_CONFIG_PRIVATE_DNS)
dpm.addUserRestriction(adminComponent, UserManager.DISALLOW_CONFIG_WIFI)
+
+ context.startService(Intent(context, TorMonitorService::class.java))
}
override fun onDisabled(context: Context, intent: Intent) {
diff --git a/app/src/main/java/com/cgprograms/dnslock/TorMonitorService.kt b/app/src/main/java/com/cgprograms/dnslock/TorMonitorService.kt
new file mode 100644
index 0000000..83cf104
--- /dev/null
+++ b/app/src/main/java/com/cgprograms/dnslock/TorMonitorService.kt
@@ -0,0 +1,63 @@
+package com.cgprograms.dnslock
+
+import android.app.Service
+import android.app.admin.DevicePolicyManager
+import android.app.usage.UsageEvents
+import android.app.usage.UsageStatsManager
+import android.content.ComponentName
+import android.content.Context
+import android.content.Intent
+import android.os.Handler
+import android.os.IBinder
+import android.os.Looper
+
+class TorMonitorService : Service() {
+
+ private val handler = Handler(Looper.getMainLooper())
+ private val checkInterval: Long = 60000
+
+ private val checkTorRunnable = object : Runnable {
+ override fun run() {
+ checkTorUsage()
+ handler.postDelayed(this, checkInterval)
+ }
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+ handler.post(checkTorRunnable)
+ }
+
+ override fun onDestroy() {
+ super.onDestroy()
+ handler.removeCallbacks(checkTorRunnable)
+ }
+
+ override fun onBind(intent: Intent?): IBinder? {
+ return null
+ }
+
+ private fun checkTorUsage() {
+ val usageStatsManager = getSystemService(Context.USAGE_STATS_SERVICE) as UsageStatsManager
+ val currentTime = System.currentTimeMillis()
+ val usageEvents = usageStatsManager.queryEvents(currentTime - checkInterval, currentTime)
+
+ while (usageEvents.hasNextEvent()) {
+ val event = UsageEvents.Event()
+ usageEvents.getNextEvent(event)
+
+ if (event.eventType == UsageEvents.Event.ACTIVITY_RESUMED) {
+ val packageName = event.packageName
+ if (packageName.contains("torproject") || packageName.contains("torbrowser")) {
+ val dpm = getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager
+ val adminComponent = ComponentName(this, MyDeviceAdminReceiver::class.java)
+
+ dpm.setUninstallBlocked(adminComponent, packageName, true)
+ dpm.setPackagesSuspended(
+ adminComponent, arrayOf(packageName), true
+ )
+ }
+ }
+ }
+ }
+}
\ No newline at end of file