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

Commit 17d7c4d0 authored by wilsonshih's avatar wilsonshih
Browse files

Stop monitor back navigation when remote binder died.

So back navigation won't be stuck after shell processs died.

Flag: EXEMPT bugfix
Bug: 388723693
Test: kill systemui during back navigation, verify user can trigger
another back navigation once systemui ready.

Change-Id: I133fa6d9c9c4eb5696fd700d2d0e9b227ba86e13
parent 78702edc
Loading
Loading
Loading
Loading
+24 −0
Original line number Diff line number Diff line
@@ -36,6 +36,7 @@ import static com.android.server.wm.BackNavigationProto.SHOW_WALLPAPER;
import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_PREDICT_BACK;
import static com.android.server.wm.WindowContainer.SYNC_STATE_NONE;

import android.annotation.BinderThread;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.Context;
@@ -44,6 +45,7 @@ import android.content.res.ResourceId;
import android.graphics.Point;
import android.graphics.Rect;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteCallback;
import android.os.RemoteException;
import android.os.SystemProperties;
@@ -705,12 +707,34 @@ class BackNavigationController {
        private WindowState mNavigatingWindow;
        private RemoteCallback mObserver;

        private final IBinder.DeathRecipient mListenerDeathRecipient =
                new IBinder.DeathRecipient() {
                    @Override
                    @BinderThread
                    public void binderDied() {
                        synchronized (mWindowManagerService.mGlobalLock) {
                            stopMonitorForRemote();
                            stopMonitorTransition();
                        }
                    }
                };

        void startMonitor(@NonNull WindowState window, @NonNull RemoteCallback observer) {
            mNavigatingWindow = window;
            mObserver = observer;
            try {
                mObserver.getInterface().asBinder().linkToDeath(mListenerDeathRecipient,
                        0 /* flags */);
            } catch (RemoteException r) {
                Slog.e(TAG, "Failed to link to death");
            }
        }

        void stopMonitorForRemote() {
            if (mObserver != null) {
                mObserver.getInterface().asBinder().unlinkToDeath(mListenerDeathRecipient,
                        0 /* flags */);
            }
            mObserver = null;
        }