Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cf302900 authored by Jakub Pawlowski's avatar Jakub Pawlowski Committed by android-build-merger
Browse files

Merge "Cache results of getProfileParent calls"

am: d404177a

Change-Id: Iaa0fed5c9e54607727fcd6b3e5246cce4da7c8e2
parents c52ea719 d404177a
Loading
Loading
Loading
Loading
+28 −3
Original line number Diff line number Diff line
@@ -264,6 +264,21 @@ public final class Utils {
                || (Process.SYSTEM_UID == callingUid);
    }

   static Context mParentUserCacheContext = null;
   // Cache location off for 10 users, cache is valid for 2 seconds.
   static LoadingCache<Integer, Integer> mParentUserCache = CacheBuilder.newBuilder()
       .maximumSize(10)
       .expireAfterWrite(2, TimeUnit.SECONDS)
       .build(
           new CacheLoader<Integer, Integer>() {
             public Integer load(Integer callingUser) {
                UserManager um = (UserManager) mParentUserCacheContext.getSystemService(Context.USER_SERVICE);
                UserInfo ui = um.getProfileParent(callingUser);
                int parentUser = (ui != null) ? ui.id : UserHandle.USER_NULL;
                return parentUser;
             }
           });

    public static boolean checkCallerAllowManagedProfiles(Context mContext) {
        if (mContext == null) {
            return checkCaller();
@@ -274,9 +289,19 @@ public final class Utils {
        // Use the Bluetooth process identity when making call to get parent user
        long ident = Binder.clearCallingIdentity();
        try {

            if (mParentUserCacheContext == null)
                mParentUserCacheContext = mContext;

            int parentUser = 0;

            try {
                parentUser = mParentUserCache.get(callingUid);
            } catch (java.util.concurrent.ExecutionException e) {
                UserManager um = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
                UserInfo ui = um.getProfileParent(callingUser);
            int parentUser = (ui != null) ? ui.id : UserHandle.USER_NULL;
                parentUser = (ui != null) ? ui.id : UserHandle.USER_NULL;
            }

            // Always allow SystemUI/System access.
            return (sForegroundUserId == callingUser) || (sForegroundUserId == parentUser)