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

Commit 491914c1 authored by Riddle Hsu's avatar Riddle Hsu
Browse files

Fix leakage of DisplayContent referenced from TransitionController

Unlike AppTransition which is associated DisplayContent, the
TransitionController is a global instance. So it needs to unregister
the listener when the display is removed.

Bug: 214991741
Test: Start/stop screen recording multiple times (create virtual
      display). The heap dump of system server should not contain
      many DisplayContent instances.
Change-Id: I44e2a794981fc114ada0ce98cd2471adf623d856
parent 99f9addc
Loading
Loading
Loading
Loading
+0 −2
Original line number Original line Diff line number Diff line
@@ -1067,8 +1067,6 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp


        mAppTransition = new AppTransition(mWmService.mContext, mWmService, this);
        mAppTransition = new AppTransition(mWmService.mContext, mWmService, this);
        mAppTransition.registerListenerLocked(mWmService.mActivityManagerAppTransitionNotifier);
        mAppTransition.registerListenerLocked(mWmService.mActivityManagerAppTransitionNotifier);
        mTransitionController.registerLegacyListener(
                mWmService.mActivityManagerAppTransitionNotifier);
        mAppTransition.registerListenerLocked(mFixedRotationTransitionListener);
        mAppTransition.registerListenerLocked(mFixedRotationTransitionListener);
        mAppTransitionController = new AppTransitionController(mWmService, this);
        mAppTransitionController = new AppTransitionController(mWmService, this);
        mUnknownAppVisibilityController = new UnknownAppVisibilityController(mWmService, this);
        mUnknownAppVisibilityController = new UnknownAppVisibilityController(mWmService, this);
+1 −0
Original line number Original line Diff line number Diff line
@@ -3311,6 +3311,7 @@ public class DisplayPolicy {
    }
    }


    void release() {
    void release() {
        mDisplayContent.mTransitionController.unregisterLegacyListener(mAppTransitionListener);
        mHandler.post(mGestureNavigationSettingsObserver::unregister);
        mHandler.post(mGestureNavigationSettingsObserver::unregister);
    }
    }


+4 −0
Original line number Original line Diff line number Diff line
@@ -430,6 +430,10 @@ class TransitionController {
        mLegacyListeners.add(listener);
        mLegacyListeners.add(listener);
    }
    }


    void unregisterLegacyListener(WindowManagerInternal.AppTransitionListener listener) {
        mLegacyListeners.remove(listener);
    }

    void dispatchLegacyAppTransitionPending() {
    void dispatchLegacyAppTransitionPending() {
        for (int i = 0; i < mLegacyListeners.size(); ++i) {
        for (int i = 0; i < mLegacyListeners.size(); ++i) {
            mLegacyListeners.get(i).onAppTransitionPendingLocked();
            mLegacyListeners.get(i).onAppTransitionPendingLocked();
+1 −0
Original line number Original line Diff line number Diff line
@@ -137,6 +137,7 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub


    void setWindowManager(WindowManagerService wms) {
    void setWindowManager(WindowManagerService wms) {
        mTransitionController = new TransitionController(mService, wms.mTaskSnapshotController);
        mTransitionController = new TransitionController(mService, wms.mTaskSnapshotController);
        mTransitionController.registerLegacyListener(wms.mActivityManagerAppTransitionNotifier);
    }
    }


    TransitionController getTransitionController() {
    TransitionController getTransitionController() {