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

Commit da1420e2 authored by Winson Chung's avatar Winson Chung
Browse files

Fixing a few more leaky refs to NavBarFragment/View

- Fix issue with fragment container attach listener always
  referencing the first fragment created for the display
- SysUI state callback needs to be unregistered for edge
  back gesture handler as well as it will be recreated

Bug: 160161606
Test: Trigger multiple config/overlay changes and ensure only
      one ref to NavBarFragment/View

Change-Id: I78973909d9714976516c1d2ebd77b9d01c52ba88
parent 6ec33fda
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -809,7 +809,9 @@ public class OverviewProxyService extends CurrentUserTracker implements

    @Override
    public void addCallback(OverviewProxyListener listener) {
        if (!mConnectionCallbacks.contains(listener)) {
            mConnectionCallbacks.add(listener);
        }
        listener.onConnectionChanged(mOverviewProxy != null);
        listener.onNavBarButtonAlphaChanged(mNavBarButtonAlpha, false);
    }
+1 −1
Original line number Diff line number Diff line
@@ -154,7 +154,7 @@ public class NavigationBarController implements Callbacks {
                            Dependency.get(IWindowManager.class));
            navBar.setAutoHideController(autoHideController);
            navBar.restoreAppearanceAndTransientState();
            mNavigationBars.append(displayId, navBar);
            mNavigationBars.put(displayId, navBar);

            if (result != null) {
                navBar.setImeWindowStatus(display.getDisplayId(), result.mImeToken,
+13 −3
Original line number Diff line number Diff line
@@ -121,6 +121,7 @@ public class EdgeBackGestureHandler extends CurrentUserTracker implements Displa

    private final Context mContext;
    private final OverviewProxyService mOverviewProxyService;
    private final SysUiState mSysUiState;
    private final Runnable mStateChangeCallback;

    private final PluginManager mPluginManager;
@@ -197,14 +198,22 @@ public class EdgeBackGestureHandler extends CurrentUserTracker implements Displa
                }
            };

    private final SysUiState.SysUiStateCallback mSysUiStateCallback =
            new SysUiState.SysUiStateCallback() {
        @Override
        public void onSystemUiStateChanged(int sysUiFlags) {
            mSysUiFlags = sysUiFlags;
        }
    };

    public EdgeBackGestureHandler(Context context, OverviewProxyService overviewProxyService,
            SysUiState sysUiFlagContainer, PluginManager pluginManager,
            Runnable stateChangeCallback) {
            SysUiState sysUiState, PluginManager pluginManager, Runnable stateChangeCallback) {
        super(Dependency.get(BroadcastDispatcher.class));
        mContext = context;
        mDisplayId = context.getDisplayId();
        mMainExecutor = context.getMainExecutor();
        mOverviewProxyService = overviewProxyService;
        mSysUiState = sysUiState;
        mPluginManager = pluginManager;
        mStateChangeCallback = stateChangeCallback;
        ComponentName recentsComponentName = ComponentName.unflattenFromString(
@@ -238,7 +247,6 @@ public class EdgeBackGestureHandler extends CurrentUserTracker implements Displa
                mContext.getMainThreadHandler(), mContext, this::onNavigationSettingsChanged);

        updateCurrentUserResources();
        sysUiFlagContainer.addCallback(sysUiFlags -> mSysUiFlags = sysUiFlags);
    }

    public void updateCurrentUserResources() {
@@ -287,6 +295,7 @@ public class EdgeBackGestureHandler extends CurrentUserTracker implements Displa
        mIsAttached = true;
        Dependency.get(ProtoTracer.class).add(this);
        mOverviewProxyService.addCallback(mQuickSwitchListener);
        mSysUiState.addCallback(mSysUiStateCallback);
        updateIsEnabled();
        startTracking();
    }
@@ -298,6 +307,7 @@ public class EdgeBackGestureHandler extends CurrentUserTracker implements Displa
        mIsAttached = false;
        Dependency.get(ProtoTracer.class).remove(this);
        mOverviewProxyService.removeCallback(mQuickSwitchListener);
        mSysUiState.removeCallback(mSysUiStateCallback);
        updateIsEnabled();
        stopTracking();
    }
+9 −2
Original line number Diff line number Diff line
@@ -120,6 +120,7 @@ import com.android.systemui.stackdivider.Divider;
import com.android.systemui.statusbar.AutoHideUiElement;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.CommandQueue.Callbacks;
import com.android.systemui.statusbar.NavigationBarController;
import com.android.systemui.statusbar.NotificationRemoteInputManager;
import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.notification.stack.StackStateAnimator;
@@ -131,6 +132,7 @@ import com.android.systemui.util.LifecycleFragment;

import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.lang.ref.WeakReference;
import java.util.List;
import java.util.Locale;
import java.util.Optional;
@@ -551,6 +553,9 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback
            mOrientationHandle.getViewTreeObserver().removeOnGlobalLayoutListener(
                    mOrientationHandleGlobalLayoutListener);
        }
        mHandler.removeCallbacks(mAutoDim);
        mNavigationBarView = null;
        mOrientationHandle = null;
    }

    @Override
@@ -1459,11 +1464,11 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback
        if (DEBUG) Log.v(TAG, "addNavigationBar: about to add " + navigationBarView);
        if (navigationBarView == null) return null;

        final NavigationBarFragment fragment = FragmentHostManager.get(navigationBarView)
                .create(NavigationBarFragment.class);
        navigationBarView.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
            @Override
            public void onViewAttachedToWindow(View v) {
                final NavigationBarFragment fragment =
                        FragmentHostManager.get(v).create(NavigationBarFragment.class);
                final FragmentHostManager fragmentHost = FragmentHostManager.get(v);
                fragmentHost.getFragmentManager().beginTransaction()
                        .replace(R.id.navigation_bar_frame, fragment, TAG)
@@ -1473,6 +1478,8 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback

            @Override
            public void onViewDetachedFromWindow(View v) {
                final FragmentHostManager fragmentHost = FragmentHostManager.get(v);
                fragmentHost.removeTagListener(TAG, listener);
                FragmentHostManager.removeAndDestroy(v);
                navigationBarView.removeOnAttachStateChangeListener(this);
            }