summaryrefslogtreecommitdiff
path: root/permissionse
diff options
context:
space:
mode:
Diffstat (limited to 'permissionse')
-rw-r--r--permissionse/.gitignore1
-rw-r--r--permissionse/build.gradle36
-rw-r--r--permissionse/consumer-rules.pro0
-rw-r--r--permissionse/libs/hidden-apis-stub/.gitignore1
-rw-r--r--permissionse/libs/hidden-apis-stub/build.gradle35
-rw-r--r--permissionse/libs/hidden-apis-stub/src/main/AndroidManifest.xml24
-rw-r--r--permissionse/libs/hidden-apis-stub/src/main/java/android/app/AppOpsManager.java46
-rw-r--r--permissionse/libs/hidden-apis-stub/src/main/java/android/content/pm/PackageManager.java54
-rw-r--r--permissionse/libs/hidden-apis-stub/src/main/java/android/net/IConnectivityManager.java65
-rw-r--r--permissionse/libs/hidden-apis-stub/src/main/java/android/net/VpnManager.java53
-rw-r--r--permissionse/libs/hidden-apis-stub/src/main/java/android/os/ServiceManager.java24
-rw-r--r--permissionse/libs/hidden-apis-stub/src/main/java/android/os/UserHandle.java24
-rw-r--r--permissionse/proguard-rules.pro21
-rw-r--r--permissionse/src/main/AndroidManifest.xml36
-rw-r--r--permissionse/src/main/java/foundation/e/privacymodules/permissions/PermissionsPrivacyModule.kt139
15 files changed, 559 insertions, 0 deletions
diff --git a/permissionse/.gitignore b/permissionse/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/permissionse/.gitignore
@@ -0,0 +1 @@
+/build \ No newline at end of file
diff --git a/permissionse/build.gradle b/permissionse/build.gradle
new file mode 100644
index 0000000..8ca0754
--- /dev/null
+++ b/permissionse/build.gradle
@@ -0,0 +1,36 @@
+apply plugin: 'com.android.library'
+apply plugin: 'kotlin-android'
+
+android {
+ compileSdkVersion buildConfig.compileSdk
+
+ defaultConfig {
+ minSdkVersion buildConfig.minSdk
+ targetSdkVersion buildConfig.targetSdk
+
+ consumerProguardFiles "consumer-rules.pro"
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+}
+
+dependencies {
+ compileOnly project(':permissionse:libs:hidden-apis-stub')
+
+ implementation(
+ Libs.Kotlin.stdlib,
+ Libs.AndroidX.coreKtx,
+ Libs.Coroutines.core
+ )
+
+ implementation project(':privacymodule-api')
+}
diff --git a/permissionse/consumer-rules.pro b/permissionse/consumer-rules.pro
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/permissionse/consumer-rules.pro
diff --git a/permissionse/libs/hidden-apis-stub/.gitignore b/permissionse/libs/hidden-apis-stub/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/permissionse/libs/hidden-apis-stub/.gitignore
@@ -0,0 +1 @@
+/build \ No newline at end of file
diff --git a/permissionse/libs/hidden-apis-stub/build.gradle b/permissionse/libs/hidden-apis-stub/build.gradle
new file mode 100644
index 0000000..b239e6f
--- /dev/null
+++ b/permissionse/libs/hidden-apis-stub/build.gradle
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2022 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/>.
+ */
+
+plugins {
+ id 'com.android.library'
+}
+
+android {
+ compileSdk 31
+}
+
+
+java {
+ sourceCompatibility = JavaVersion.VERSION_1_7
+ targetCompatibility = JavaVersion.VERSION_1_7
+}
+
+dependencies {
+ implementation 'org.jetbrains:annotations:15.0'
+ implementation 'androidx.annotation:annotation:1.5.0'
+}
diff --git a/permissionse/libs/hidden-apis-stub/src/main/AndroidManifest.xml b/permissionse/libs/hidden-apis-stub/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..61f315a
--- /dev/null
+++ b/permissionse/libs/hidden-apis-stub/src/main/AndroidManifest.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2022 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/>.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ package="foundation.e.advancedprivacy.hidden.apis"
+ tools:ignore="ProtectedPermissions">
+
+</manifest>
diff --git a/permissionse/libs/hidden-apis-stub/src/main/java/android/app/AppOpsManager.java b/permissionse/libs/hidden-apis-stub/src/main/java/android/app/AppOpsManager.java
new file mode 100644
index 0000000..0343312
--- /dev/null
+++ b/permissionse/libs/hidden-apis-stub/src/main/java/android/app/AppOpsManager.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2022 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 android.app;
+
+import android.annotation.TargetApi;
+
+import androidx.annotation.DeprecatedSinceApi;
+import androidx.annotation.NonNull;
+
+// Stub based on:
+// https://gitlab.e.foundation/e/os/android_frameworks_base/-/blob/[SDK_VERSION]/core/java/android/app/AppOpsManager.java
+public class AppOpsManager {
+
+ public static final int OP_NONE = -1;
+
+ @TargetApi(29)
+ @DeprecatedSinceApi(
+ api = 33,
+ message = "Check disponibility in SDK33"
+ )
+ public static int strOpToOp(@NonNull String op) {
+ return 0;
+ }
+
+ @TargetApi(29)
+ @DeprecatedSinceApi(
+ api = 33,
+ message = "Check disponibility in SDK33"
+ )
+ public void setMode(int code, int uid, String packageName, int mode) {}
+}
diff --git a/permissionse/libs/hidden-apis-stub/src/main/java/android/content/pm/PackageManager.java b/permissionse/libs/hidden-apis-stub/src/main/java/android/content/pm/PackageManager.java
new file mode 100644
index 0000000..1c4f527
--- /dev/null
+++ b/permissionse/libs/hidden-apis-stub/src/main/java/android/content/pm/PackageManager.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2022 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 android.content.pm;
+
+import android.annotation.TargetApi;
+import android.os.UserHandle;
+
+import androidx.annotation.DeprecatedSinceApi;
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresPermission;
+
+// Stub based on:
+// https://gitlab.e.foundation/e/os/android_frameworks_base/-/blob/[SDK_VERSION]/core/java/android/content/pm/PackageManager.java
+public abstract class PackageManager {
+
+ @TargetApi(29)
+ @DeprecatedSinceApi(
+ api = 33,
+ message = "Check disponibility in SDK33"
+ )
+ @RequiresPermission("android.permission.GRANT_RUNTIME_PERMISSIONS")
+ public abstract void grantRuntimePermission(
+ @NonNull String packageName,
+ @NonNull String permissionName,
+ @NonNull UserHandle user
+ );
+
+ @TargetApi(29)
+ @DeprecatedSinceApi(
+ api = 33,
+ message = "Check disponibility in SDK33"
+ )
+ @RequiresPermission("android.permission.REVOKE_RUNTIME_PERMISSIONS")
+ public abstract void revokeRuntimePermission(
+ @NonNull String packageName,
+ @NonNull String permissionName,
+ @NonNull UserHandle user
+ );
+}
diff --git a/permissionse/libs/hidden-apis-stub/src/main/java/android/net/IConnectivityManager.java b/permissionse/libs/hidden-apis-stub/src/main/java/android/net/IConnectivityManager.java
new file mode 100644
index 0000000..d7f6ccf
--- /dev/null
+++ b/permissionse/libs/hidden-apis-stub/src/main/java/android/net/IConnectivityManager.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2022 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 android.net;
+
+import android.annotation.TargetApi;
+
+import android.os.Binder;
+import android.os.IBinder;
+import android.os.RemoteException;
+
+import androidx.annotation.DeprecatedSinceApi;
+
+// Stub based on:
+// https://gitlab.e.foundation/e/os/android_frameworks_base/-/blob/[SDK_VERSION]/core/java/android/net/IConnectivityManager.java
+public interface IConnectivityManager {
+
+ @TargetApi(29)
+ @DeprecatedSinceApi(
+ api = 31,
+ message = "TODO"
+ )
+ boolean prepareVpn(String oldPackage, String newPackage, int userId) throws RemoteException;
+
+ @TargetApi(29)
+ @DeprecatedSinceApi(
+ api = 30,
+ message = "Use instead setVpnPackageAuthorization(String packageName, int userId, int vpnType)"
+ )
+ void setVpnPackageAuthorization(String packageName, int userId, boolean authorized) throws RemoteException;
+
+ @TargetApi(30)
+ @DeprecatedSinceApi(
+ api = 31,
+ message = "Moved to android.net.VpnManager"
+ )
+ void setVpnPackageAuthorization(String packageName, int userId, int vpnType) throws RemoteException;
+
+ @TargetApi(29)
+ @DeprecatedSinceApi(
+ api = 31,
+ message = "TODO"
+ )
+ String getAlwaysOnVpnPackage(int userId) throws RemoteException;
+
+ public abstract static class Stub extends Binder implements IConnectivityManager {
+ public static IConnectivityManager asInterface(IBinder obj) {
+ return null;
+ }
+ }
+}
diff --git a/permissionse/libs/hidden-apis-stub/src/main/java/android/net/VpnManager.java b/permissionse/libs/hidden-apis-stub/src/main/java/android/net/VpnManager.java
new file mode 100644
index 0000000..7cc9b6a
--- /dev/null
+++ b/permissionse/libs/hidden-apis-stub/src/main/java/android/net/VpnManager.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2022 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 android.net;
+
+import android.annotation.TargetApi;
+
+import androidx.annotation.DeprecatedSinceApi;
+import androidx.annotation.Nullable;
+
+// Stub based on:
+// https://gitlab.e.foundation/e/os/android_frameworks_base/-/blob/[SDK_VERSION]/core/java/android/net/VpnManager.java
+public class VpnManager {
+ public static final int TYPE_VPN_SERVICE = 1;
+
+ @TargetApi(31)
+ @DeprecatedSinceApi(
+ api = 33,
+ message = "Check disponibility in SDK33"
+ )
+ public boolean prepareVpn(
+ @Nullable String oldPackage,
+ @Nullable String newPackage,
+ int userId
+ ) {
+ return true;
+ }
+
+ @TargetApi(31)
+ @DeprecatedSinceApi(
+ api = 33,
+ message = "Check disponibility in SDK33"
+ )
+ public void setVpnPackageAuthorization(
+ String packageName,
+ int userId,
+ int vpnType
+ ) {}
+}
diff --git a/permissionse/libs/hidden-apis-stub/src/main/java/android/os/ServiceManager.java b/permissionse/libs/hidden-apis-stub/src/main/java/android/os/ServiceManager.java
new file mode 100644
index 0000000..4696b79
--- /dev/null
+++ b/permissionse/libs/hidden-apis-stub/src/main/java/android/os/ServiceManager.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2022 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 android.os;
+
+public class ServiceManager {
+ public static IBinder getService(String name) {
+ return null;
+ }
+}
diff --git a/permissionse/libs/hidden-apis-stub/src/main/java/android/os/UserHandle.java b/permissionse/libs/hidden-apis-stub/src/main/java/android/os/UserHandle.java
new file mode 100644
index 0000000..df56daf
--- /dev/null
+++ b/permissionse/libs/hidden-apis-stub/src/main/java/android/os/UserHandle.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2022 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 android.os;
+
+public class UserHandle {
+ public static /*@UserIdInt*/ int myUserId() {
+ return 0;
+ }
+}
diff --git a/permissionse/proguard-rules.pro b/permissionse/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/permissionse/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile \ No newline at end of file
diff --git a/permissionse/src/main/AndroidManifest.xml b/permissionse/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..6a7e416
--- /dev/null
+++ b/permissionse/src/main/AndroidManifest.xml
@@ -0,0 +1,36 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ package="foundation.e.privacymodules.e">
+
+ <uses-permission android:name="android.permission.MANAGE_APP_OPS_MODES"
+ tools:ignore="ProtectedPermissions" />
+ <uses-permission
+ android:name="android.permission.GRANT_RUNTIME_PERMISSIONS"
+ tools:ignore="ProtectedPermissions"
+ />
+ <uses-permission
+ android:name="android.permission.REVOKE_RUNTIME_PERMISSIONS"
+ tools:ignore="ProtectedPermissions"
+ />
+
+ <!-- The following permission have privileged protection level.
+ These permissions are granted only if the app is privileged by the system,
+ like installed in /system/priv-app and a privapp-permissions in /system/etc/permissions/
+ (see eprivavymoduledemo for an example) -->
+ <uses-permission
+ android:name="android.permission.UPDATE_APP_OPS_STATS"
+ tools:ignore="ProtectedPermissions"
+ />
+ <uses-permission android:name="android.permission.WATCH_APPOPS"
+ tools:ignore="ProtectedPermissions"
+ />
+ <uses-permission
+ android:name="android.permission.GET_APP_OPS_STATS"
+ tools:ignore="ProtectedPermissions"
+ />
+ <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"
+ tools:ignore="ProtectedPermissions"
+ />
+ <uses-permission android:name="android.permission.CONTROL_VPN"
+ tools:ignore="ProtectedPermissions" />
+</manifest>
diff --git a/permissionse/src/main/java/foundation/e/privacymodules/permissions/PermissionsPrivacyModule.kt b/permissionse/src/main/java/foundation/e/privacymodules/permissions/PermissionsPrivacyModule.kt
new file mode 100644
index 0000000..fe5b7ac
--- /dev/null
+++ b/permissionse/src/main/java/foundation/e/privacymodules/permissions/PermissionsPrivacyModule.kt
@@ -0,0 +1,139 @@
+package foundation.e.privacymodules.permissions
+
+import android.annotation.TargetApi
+import android.app.AppOpsManager
+import android.app.AppOpsManager.OP_NONE
+import android.app.AppOpsManager.strOpToOp
+import android.content.Context
+import android.net.IConnectivityManager
+import android.net.VpnManager
+import android.net.VpnManager.TYPE_VPN_SERVICE
+import android.os.Build
+import android.os.ServiceManager
+import android.os.UserHandle
+import android.util.Log
+import foundation.e.privacymodules.permissions.data.AppOpModes
+import foundation.e.privacymodules.permissions.data.ApplicationDescription
+
+/**
+ * Implements [IPermissionsPrivacyModule] with all privileges of a system app.
+ */
+class PermissionsPrivacyModule(context: Context): APermissionsPrivacyModule(context) {
+
+ private val appOpsManager: AppOpsManager get()
+ = context.getSystemService(Context.APP_OPS_SERVICE) as AppOpsManager
+
+ /**
+ * @see IPermissionsPrivacyModule.toggleDangerousPermission
+ * Always return true, permission is set using privileged capacities.
+ */
+ override fun toggleDangerousPermission(
+ appDesc: ApplicationDescription,
+ permissionName: String,
+ grant: Boolean
+ ): Boolean {
+ try {
+ if (grant) {
+ context.packageManager.grantRuntimePermission(
+ appDesc.packageName,
+ permissionName,
+ android.os.Process.myUserHandle()
+ )
+ } else {
+ context.packageManager.revokeRuntimePermission(
+ appDesc.packageName,
+ permissionName,
+ android.os.Process.myUserHandle()
+ )
+ }
+ } catch (e: Exception) {
+ Log.e("Permissions-e", "Exception while setting permission", e)
+ return false
+ }
+
+ return true
+ }
+
+ override fun setAppOpMode(
+ appDesc: ApplicationDescription,
+ appOpPermissionName: String,
+ status: AppOpModes
+ ): Boolean {
+ val op = strOpToOp(appOpPermissionName)
+ if (op != OP_NONE) {
+ appOpsManager.setMode(op, appDesc.uid, appDesc.packageName, status.modeValue)
+ }
+ return true
+ }
+
+ override fun setVpnPackageAuthorization(packageName: String): Boolean {
+ return when(Build.VERSION.SDK_INT) {
+ 29 -> setVpnPackageAuthorizationSDK29(packageName)
+ 30 -> setVpnPackageAuthorizationSDK30(packageName)
+ 31, 32 -> setVpnPackageAuthorizationSDK32(packageName)
+ else -> {
+ Log.e("Permissions-e", "Bad android sdk version")
+ false
+ }
+ }
+ }
+
+ @TargetApi(29)
+ private fun setVpnPackageAuthorizationSDK29(packageName: String): Boolean {
+ val service: IConnectivityManager = IConnectivityManager.Stub.asInterface(
+ ServiceManager.getService(Context.CONNECTIVITY_SERVICE))
+
+ try {
+ if (service.prepareVpn(null, packageName, UserHandle.myUserId())) {
+ // Authorize this app to initiate VPN connections in the future without user
+ // intervention.
+ service.setVpnPackageAuthorization(packageName, UserHandle.myUserId(), true)
+ return true
+ }
+ } catch (e: java.lang.Exception) {
+ Log.e("Permissions-e", "Exception while setting VpnPackageAuthorization", e)
+ } catch (e: NoSuchMethodError) {
+ Log.e("Permissions-e", "Bad android sdk version", e)
+ }
+ return false
+ }
+
+ @TargetApi(30)
+ private fun setVpnPackageAuthorizationSDK30(packageName: String): Boolean {
+ val service: IConnectivityManager = IConnectivityManager.Stub.asInterface(
+ ServiceManager.getService(Context.CONNECTIVITY_SERVICE))
+
+ try {
+ if (service.prepareVpn(null, packageName, UserHandle.myUserId())) {
+ // Authorize this app to initiate VPN connections in the future without user
+ // intervention.
+ service.setVpnPackageAuthorization(packageName, UserHandle.myUserId(), TYPE_VPN_SERVICE)
+ return true
+ }
+ } catch (e: java.lang.Exception) {
+ Log.e("Permissions-e", "Exception while setting VpnPackageAuthorization", e)
+ } catch (e: NoSuchMethodError) {
+ Log.e("Permissions-e", "Bad android sdk version", e)
+ }
+ return false
+ }
+
+ @TargetApi(31)
+ private fun setVpnPackageAuthorizationSDK32(packageName: String): Boolean {
+ val vpnManager = context.getSystemService(Context.VPN_MANAGEMENT_SERVICE) as VpnManager
+
+ try {
+ if (vpnManager.prepareVpn(null, packageName, UserHandle.myUserId())) {
+ // Authorize this app to initiate VPN connections in the future without user
+ // intervention.
+ vpnManager.setVpnPackageAuthorization(packageName, UserHandle.myUserId(), TYPE_VPN_SERVICE)
+ return true
+ }
+ } catch (e: java.lang.Exception) {
+ Log.e("Permissions-e", "Exception while setting VpnPackageAuthorization", e)
+ } catch (e: NoSuchMethodError) {
+ Log.e("Permissions-e", "Bad android sdk version", e)
+ }
+ return false
+ }
+}