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

Commit 0d47a03b authored by Nate Myren's avatar Nate Myren
Browse files

Only initialize PermissionUsageHelper lazily or when requested

This should fix a memory leak caused by automatically registering a
PermissionManager

Bug: 204222680
Test: manual
Change-Id: I94c6da3dd89e8b158552e94c94e4d0fb3f5d6f0d
Merged-In: I94c6da3dd89e8b158552e94c94e4d0fb3f5d6f0d
parent cec06948
Loading
Loading
Loading
Loading
+25 −6
Original line number Diff line number Diff line
@@ -159,8 +159,6 @@ public final class PermissionManager {
        mPermissionManager = IPermissionManager.Stub.asInterface(ServiceManager.getServiceOrThrow(
                "permissionmgr"));
        mLegacyPermissionManager = context.getSystemService(LegacyPermissionManager.class);
        //TODO ntmyren: there should be a way to only enable the watcher when requested
        mUsageHelper = new PermissionUsageHelper(context);
    }

    /**
@@ -871,6 +869,29 @@ public final class PermissionManager {
        return mSplitPermissionInfos;
    }

    /**
     * Initialize the PermissionUsageHelper, which will register active app op listeners
     *
     * @hide
     */
    public void initializeUsageHelper() {
        if (mUsageHelper == null) {
            mUsageHelper = new PermissionUsageHelper(mContext);
        }
    }

    /**
     * Teardown the PermissionUsageHelper, removing listeners
     *
     * @hide
     */
    public void tearDownUsageHelper() {
        if (mUsageHelper != null) {
            mUsageHelper.tearDown();
            mUsageHelper = null;
        }
    }

    /**
     * @return A list of permission groups currently or recently used by all apps by all users in
     * the current profile group.
@@ -881,7 +902,7 @@ public final class PermissionManager {
    @NonNull
    @RequiresPermission(Manifest.permission.GET_APP_OPS_STATS)
    public List<PermGroupUsage> getIndicatorAppOpUsageData() {
        return mUsageHelper.getOpUsageData(new AudioManager().isMicrophoneMute());
        return getIndicatorAppOpUsageData(new AudioManager().isMicrophoneMute());
    }

    /**
@@ -896,9 +917,7 @@ public final class PermissionManager {
    @RequiresPermission(Manifest.permission.GET_APP_OPS_STATS)
    public List<PermGroupUsage> getIndicatorAppOpUsageData(boolean micMuted) {
        // Lazily initialize the usage helper
        if (mUsageHelper == null) {
            mUsageHelper = new PermissionUsageHelper(mContext);
        }
        initializeUsageHelper();
        return mUsageHelper.getOpUsageData(micMuted);
    }

+5 −0
Original line number Diff line number Diff line
@@ -176,6 +176,11 @@ public class PermissionUsageHelper implements AppOpsManager.OnOpActiveChangedLis
        return mUserContexts.get(user);
    }

    public void tearDown() {
        mAppOpsManager.stopWatchingActive(this);
        mAppOpsManager.stopWatchingStarted(this);
    }

    @Override
    public void onOpActiveChanged(@NonNull String op, int uid, @NonNull String packageName,
            boolean active) {
+5 −1
Original line number Diff line number Diff line
@@ -442,7 +442,11 @@ public class FrameworkServicesModule {
    @Provides
    @Singleton
    static PermissionManager providePermissionManager(Context context) {
        return context.getSystemService(PermissionManager.class);
        PermissionManager pm = context.getSystemService(PermissionManager.class);
        if (pm != null) {
            pm.initializeUsageHelper();
        }
        return pm;
    }

    @Provides