summaryrefslogtreecommitdiff
path: root/permissionse
diff options
context:
space:
mode:
Diffstat (limited to 'permissionse')
-rw-r--r--permissionse/libs/hidden-apis-stub/build.gradle2
-rw-r--r--permissionse/libs/hidden-apis-stub/src/main/java/android/content/pm/PackageManager.java25
-rw-r--r--permissionse/libs/hidden-apis-stub/src/main/java/android/content/pm/UserInfo.java36
-rw-r--r--permissionse/libs/hidden-apis-stub/src/main/java/android/os/UserManager.java48
-rw-r--r--permissionse/src/main/AndroidManifest.xml4
-rw-r--r--permissionse/src/main/java/foundation/e/privacymodules/permissions/PermissionsPrivacyModule.kt45
6 files changed, 157 insertions, 3 deletions
diff --git a/permissionse/libs/hidden-apis-stub/build.gradle b/permissionse/libs/hidden-apis-stub/build.gradle
index b239e6f..2043edc 100644
--- a/permissionse/libs/hidden-apis-stub/build.gradle
+++ b/permissionse/libs/hidden-apis-stub/build.gradle
@@ -20,7 +20,7 @@ plugins {
}
android {
- compileSdk 31
+ compileSdkVersion buildConfig.compileSdk
}
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
index 1c4f527..b7209ef 100644
--- 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
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2022 E FOUNDATION
+ * Copyright (C) 2022 MURENA SAS
*
* 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
@@ -18,16 +18,20 @@
package android.content.pm;
import android.annotation.TargetApi;
+import android.graphics.drawable.Drawable;
import android.os.UserHandle;
import androidx.annotation.DeprecatedSinceApi;
import androidx.annotation.NonNull;
import androidx.annotation.RequiresPermission;
+import java.util.List;
+
// 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,
@@ -51,4 +55,23 @@ public abstract class PackageManager {
@NonNull String permissionName,
@NonNull UserHandle user
);
+
+ @TargetApi(29)
+ @DeprecatedSinceApi(
+ api = 33,
+ message = "Check disponibility in SDK33"
+ )
+ @RequiresPermission("android.permission.INTERACT_ACROSS_USERS_FULL")
+ public abstract List<PackageInfo> getInstalledPackagesAsUser(int flags, int userId);
+
+ // Public
+ public abstract List<PackageInfo> getInstalledPackages(int flags);
+
+ @NonNull
+ public abstract Drawable getUserBadgedIcon(
+ @NonNull Drawable drawable,
+ @NonNull UserHandle user
+ );
+
+ public static final int GET_PERMISSIONS = 0x00001000;
}
diff --git a/permissionse/libs/hidden-apis-stub/src/main/java/android/content/pm/UserInfo.java b/permissionse/libs/hidden-apis-stub/src/main/java/android/content/pm/UserInfo.java
new file mode 100644
index 0000000..9418197
--- /dev/null
+++ b/permissionse/libs/hidden-apis-stub/src/main/java/android/content/pm/UserInfo.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2022 MURENA SAS
+ *
+ * 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;
+
+public class UserInfo {
+ public int id;
+
+ @TargetApi(29)
+ @DeprecatedSinceApi(
+ api = 33,
+ message = "Check availability in SDK33"
+ )
+ public UserHandle getUserHandle() {
+ return null;
+ }
+}
diff --git a/permissionse/libs/hidden-apis-stub/src/main/java/android/os/UserManager.java b/permissionse/libs/hidden-apis-stub/src/main/java/android/os/UserManager.java
new file mode 100644
index 0000000..d2e80d4
--- /dev/null
+++ b/permissionse/libs/hidden-apis-stub/src/main/java/android/os/UserManager.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2022 MURENA SAS
+ *
+ * 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;
+
+import android.annotation.TargetApi;
+import android.content.pm.UserInfo;
+
+import androidx.annotation.DeprecatedSinceApi;
+import androidx.annotation.RequiresPermission;
+import java.util.List;
+
+public class UserManager {
+
+ @TargetApi(29)
+ @DeprecatedSinceApi(
+ api = 33,
+ message = "Check availability in SDK33"
+ )
+ @RequiresPermission("android.permission.MANAGE_USERS")
+ public List<UserInfo> getProfiles(int userHandle) {
+ return null;
+ }
+
+ @TargetApi(29)
+ @DeprecatedSinceApi(
+ api = 33,
+ message = "Check availability in SDK33"
+ )
+ @RequiresPermission("android.permission.MANAGE_USERS")
+ public boolean isManagedProfile(int userId) {
+ return false;
+ }
+}
diff --git a/permissionse/src/main/AndroidManifest.xml b/permissionse/src/main/AndroidManifest.xml
index 428a612..3625087 100644
--- a/permissionse/src/main/AndroidManifest.xml
+++ b/permissionse/src/main/AndroidManifest.xml
@@ -35,4 +35,8 @@
tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.CONTROL_ALWAYS_ON_VPN"
tools:ignore="ProtectedPermissions" />
+ <uses-permission android:name="android.permission.MANAGE_USERS"
+ tools:ignore="ProtectedPermissions" />
+ <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL"
+ 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
index c07f367..c2e3e2c 100644
--- a/permissionse/src/main/java/foundation/e/privacymodules/permissions/PermissionsPrivacyModule.kt
+++ b/permissionse/src/main/java/foundation/e/privacymodules/permissions/PermissionsPrivacyModule.kt
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2022 E FOUNDATION
+ * Copyright (C) 2021 E FOUNDATION, 2022 MURENA SAS
*
* 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
@@ -23,12 +23,16 @@ import android.app.AppOpsManager.OP_NONE
import android.app.AppOpsManager.strOpToOp
import android.app.NotificationChannel
import android.content.Context
+import android.content.pm.PackageInfo
+import android.content.pm.PackageManager
+import android.content.pm.UserInfo
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.os.UserManager
import android.util.Log
import foundation.e.privacymodules.permissions.data.AppOpModes
import foundation.e.privacymodules.permissions.data.ApplicationDescription
@@ -157,6 +161,45 @@ class PermissionsPrivacyModule(context: Context) : APermissionsPrivacyModule(con
return false
}
+ private fun getWorkProfile(): UserInfo? {
+ val userManager: UserManager = context.getSystemService(UserManager::class.java)
+ val userId = UserHandle.myUserId()
+ for (user in userManager.getProfiles(UserHandle.myUserId())) {
+ if (user.id != userId && userManager.isManagedProfile(user.id)) {
+ return user
+ }
+ }
+ return null
+ }
+
+ override fun getApplications(
+ filter: ((PackageInfo) -> Boolean)?,
+ withIcon: Boolean
+ ): List<ApplicationDescription> {
+ return context.packageManager
+ .getInstalledPackages(PackageManager.GET_PERMISSIONS)
+ .filter { filter?.invoke(it) ?: true }
+ .map { buildApplicationDescription(it.applicationInfo, withIcon = withIcon) }
+ }
+
+ override fun getWorkProfileApplications(
+ filter: ((PackageInfo) -> Boolean)?,
+ withIcon: Boolean
+ ): List<ApplicationDescription> {
+ val pm = context.packageManager
+ return getWorkProfile()?.let { workProfile ->
+ pm.getInstalledPackagesAsUser(PackageManager.GET_PERMISSIONS, workProfile.id)
+ .filter { filter?.invoke(it) ?: true }
+ .map {
+ val appDesc = buildApplicationDescription(it.applicationInfo, withIcon = withIcon)
+ appDesc.icon = appDesc.icon?.let {
+ pm.getUserBadgedIcon(it, workProfile.getUserHandle())
+ }
+ appDesc
+ }
+ } ?: emptyList()
+ }
+
override fun getAlwaysOnVpnPackage(): String? {
return when (Build.VERSION.SDK_INT) {
29, 30 -> getAlwaysOnVpnPackageSDK29()