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