From f1d5b12dd11019508208571db5e5f57f43e3c4b6 Mon Sep 17 00:00:00 2001 From: Guillaume Jacquart Date: Mon, 2 Jan 2023 08:35:20 +0000 Subject: 5648: display trackers for pro-profile app instances. --- permissionse/libs/hidden-apis-stub/build.gradle | 2 +- .../java/android/content/pm/PackageManager.java | 25 ++++++++++- .../src/main/java/android/content/pm/UserInfo.java | 36 ++++++++++++++++ .../src/main/java/android/os/UserManager.java | 48 ++++++++++++++++++++++ permissionse/src/main/AndroidManifest.xml | 4 ++ .../permissions/PermissionsPrivacyModule.kt | 45 +++++++++++++++++++- 6 files changed, 157 insertions(+), 3 deletions(-) create mode 100644 permissionse/libs/hidden-apis-stub/src/main/java/android/content/pm/UserInfo.java create mode 100644 permissionse/libs/hidden-apis-stub/src/main/java/android/os/UserManager.java (limited to 'permissionse') 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 getInstalledPackagesAsUser(int flags, int userId); + + // Public + public abstract List 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 . + */ + +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 . + */ + +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 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" /> + + 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 { + 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 { + 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() -- cgit v1.2.1