From 308de20cc72a41311f3b44bd29d402b0cff140ea Mon Sep 17 00:00:00 2001 From: emanuele-f Date: Fri, 31 May 2024 10:00:30 +0200 Subject: [PATCH] Catch possible crash in getUserBadgedIcon Happening on Google Pixel 4 XL, Android 8.1.0 --- .../remote_capture/model/AppDescriptor.java | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/emanuelef/remote_capture/model/AppDescriptor.java b/app/src/main/java/com/emanuelef/remote_capture/model/AppDescriptor.java index 54b33740..d73a370a 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/model/AppDescriptor.java +++ b/app/src/main/java/com/emanuelef/remote_capture/model/AppDescriptor.java @@ -29,6 +29,7 @@ import android.os.UserHandle; import androidx.annotation.Nullable; import com.emanuelef.remote_capture.CaptureService; +import com.emanuelef.remote_capture.Log; import com.emanuelef.remote_capture.interfaces.DrawableLoader; import java.io.Serializable; @@ -41,6 +42,8 @@ public class AppDescriptor implements Comparable, Serializable { private Drawable mIcon; private final DrawableLoader mIconLoader; private String mDescription; + private static final String TAG = "AppDescriptor"; + private static boolean badgedIconFails = false; // NULL for virtual apps PackageManager mPm; @@ -97,8 +100,18 @@ public class AppDescriptor implements Comparable, Serializable { // the badge is added below via getUserHandleForUid mIcon = mPackageInfo.applicationInfo.loadUnbadgedIcon(mPm); - UserHandle handle = UserHandle.getUserHandleForUid(mUid); - mIcon = mPm.getUserBadgedIcon(mIcon, handle); + if (!badgedIconFails) { + try { + UserHandle handle = UserHandle.getUserHandleForUid(mUid); + + // On some systems may throw "java.lang.SecurityException: You need MANAGE_USERS permission to: + // check if specified user a managed profile outside your profile group" + mIcon = mPm.getUserBadgedIcon(mIcon, handle); + } catch (SecurityException e) { + Log.w(TAG, "getUserBadgedIcon failed, using icons without badges: " + e.getMessage()); + badgedIconFails = true; + } + } } else mIcon = mPackageInfo.applicationInfo.loadIcon(mPm);