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

Commit 94380655 authored by Matthew Ng's avatar Matthew Ng
Browse files

Reapply nav hints when systemui crashes or killed

When nav bar is killed or crashes and ime shows, systemui gets restarted
and will not receive any navigation bar hints. Use a callback to wait
for navigation bar to be created and then send the hints to it.

Bug: 112934365
Test: manual
Change-Id: Iee0d76da89bacd99a473ec2e7dec52539e3333ec
parent 1970cfdd
Loading
Loading
Loading
Loading
+6 −4
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.systemui.statusbar.car;

import android.annotation.Nullable;
import android.app.ActivityManager;
import android.app.ActivityTaskManager;
import android.car.drivingstate.CarDrivingStateEvent;
@@ -39,6 +40,7 @@ import com.android.car.notification.CarUxRestrictionManagerWrapper;
import com.android.car.notification.NotificationClickHandlerFactory;
import com.android.car.notification.NotificationViewController;
import com.android.car.notification.PreprocessingManager;
import com.android.internal.statusbar.RegisterStatusBarResult;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.systemui.BatteryMeterView;
import com.android.systemui.CarSystemUIFactory;
@@ -259,8 +261,8 @@ public class CarStatusBar extends StatusBar implements


    @Override
    protected void makeStatusBarView() {
        super.makeStatusBarView();
    protected void makeStatusBarView(@Nullable RegisterStatusBarResult result) {
        super.makeStatusBarView(result);
        mHvacController = new HvacController(mContext);

        CarSystemUIFactory factory = SystemUIFactory.getInstance();
@@ -432,7 +434,7 @@ public class CarStatusBar extends StatusBar implements
    }

    @Override
    protected void createNavigationBar() {
    protected void createNavigationBar(@Nullable RegisterStatusBarResult result) {
        mShowBottom = mContext.getResources().getBoolean(R.bool.config_enableBottomNavigationBar);
        mShowLeft = mContext.getResources().getBoolean(R.bool.config_enableLeftNavigationBar);
        mShowRight = mContext.getResources().getBoolean(R.bool.config_enableRightNavigationBar);
@@ -443,7 +445,7 @@ public class CarStatusBar extends StatusBar implements

        // There has been a car customized nav bar on the default display, so just create nav bars
        // on external displays.
        mNavigationBarController.createNavigationBars(false /* includeDefaultDisplay */);
        mNavigationBarController.createNavigationBars(false /* includeDefaultDisplay */, result);
    }

    private void buildNavBarContent() {
+12 −4
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@ import android.view.View;
import android.view.WindowManagerGlobal;

import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.statusbar.RegisterStatusBarResult;
import com.android.systemui.Dependency;
import com.android.systemui.plugins.DarkIconDispatcher;
import com.android.systemui.statusbar.CommandQueue.Callbacks;
@@ -81,7 +82,7 @@ public class NavigationBarController implements Callbacks {
    @Override
    public void onDisplayReady(int displayId) {
        Display display = mDisplayManager.getDisplay(displayId);
        createNavigationBar(display);
        createNavigationBar(display, null);
    }

    // TODO(b/117478341): I use {@code includeDefaultDisplay} to make this method compatible to
@@ -91,11 +92,12 @@ public class NavigationBarController implements Callbacks {
     *
     * @param includeDefaultDisplay {@code true} to create navigation bar on default display.
     */
    public void createNavigationBars(final boolean includeDefaultDisplay) {
    public void createNavigationBars(final boolean includeDefaultDisplay,
            RegisterStatusBarResult result) {
        Display[] displays = mDisplayManager.getDisplays();
        for (Display display : displays) {
            if (includeDefaultDisplay || display.getDisplayId() != DEFAULT_DISPLAY) {
                createNavigationBar(display);
                createNavigationBar(display, result);
            }
        }
    }
@@ -107,7 +109,7 @@ public class NavigationBarController implements Callbacks {
     * @param display the display to add navigation bar on.
     */
    @VisibleForTesting
    void createNavigationBar(Display display) {
    void createNavigationBar(Display display, RegisterStatusBarResult result) {
        if (display == null) {
            return;
        }
@@ -151,6 +153,12 @@ public class NavigationBarController implements Callbacks {
            navBar.setAutoHideController(autoHideController);
            navBar.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
            mNavigationBars.append(displayId, navBar);

            if (result != null) {
                navBar.setImeWindowStatus(display.getDisplayId(), result.mImeToken,
                        result.mImeWindowVis, result.mImeBackDisposition,
                        result.mShowImeSwitcher);
            }
        });
    }

+1 −0
Original line number Diff line number Diff line
@@ -316,6 +316,7 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback
        if (savedInstanceState != null) {
            mNavigationBarView.getLightTransitionsController().restoreState(savedInstanceState);
        }
        mNavigationBarView.setNavigationIconHints(mNavigationIconHints);

        prepareNavigationBarView();
        checkNavBarModes();
+7 −12
Original line number Diff line number Diff line
@@ -660,7 +660,6 @@ public class StatusBar extends SystemUI implements DemoMode,
        mDisplayId = mDisplay.getDisplayId();
        updateDisplaySize();

        Resources res = mContext.getResources();
        mVibrateOnOpening = mContext.getResources().getBoolean(
                R.bool.config_vibrateOnIconAnimation);
        mVibratorHelper = Dependency.get(VibratorHelper.class);
@@ -696,7 +695,7 @@ public class StatusBar extends SystemUI implements DemoMode,
            ex.rethrowFromSystemServer();
        }

        createAndAddWindows();
        createAndAddWindows(result);

        // Make sure we always have the most current wallpaper info.
        IntentFilter wallpaperChangedFilter = new IntentFilter(Intent.ACTION_WALLPAPER_CHANGED);
@@ -778,7 +777,7 @@ public class StatusBar extends SystemUI implements DemoMode,
    // ================================================================================
    // Constructing the view
    // ================================================================================
    protected void makeStatusBarView() {
    protected void makeStatusBarView(@Nullable RegisterStatusBarResult result) {
        final Context context = mContext;
        updateDisplaySize(); // populates mDisplayMetrics
        updateResources();
@@ -871,7 +870,7 @@ public class StatusBar extends SystemUI implements DemoMode,
        mNotificationLogger.setHeadsUpManager(mHeadsUpManager);
        putComponent(HeadsUpManager.class, mHeadsUpManager);

        createNavigationBar();
        createNavigationBar(result);

        if (ENABLE_LOCKSCREEN_WALLPAPER) {
            mLockscreenWallpaper = new LockscreenWallpaper(mContext, this, mHandler);
@@ -1118,8 +1117,8 @@ public class StatusBar extends SystemUI implements DemoMode,

    // TODO(b/117478341): This was left such that CarStatusBar can override this method.
    // Try to remove this.
    protected void createNavigationBar() {
        mNavigationBarController.createNavigationBars(true /* includeDefaultDisplay */);
    protected void createNavigationBar(@Nullable RegisterStatusBarResult result) {
        mNavigationBarController.createNavigationBars(true /* includeDefaultDisplay */, result);
    }

    /**
@@ -2401,12 +2400,8 @@ public class StatusBar extends SystemUI implements DemoMode,
        pw.println(BarTransitions.modeToString(transitions.getMode()));
    }

    public void createAndAddWindows() {
        addStatusBarWindow();
    }

    private void addStatusBarWindow() {
        makeStatusBarView();
    public void createAndAddWindows(@Nullable RegisterStatusBarResult result) {
        makeStatusBarView(result);
        mStatusBarWindowController = Dependency.get(StatusBarWindowController.class);
        mStatusBarWindowController.add(mStatusBarWindow, getStatusBarHeight());
    }
+6 −6
Original line number Diff line number Diff line
@@ -96,21 +96,21 @@ public class NavigationBarControllerTest extends SysuiTestCase {
    @Test
    public void testCreateNavigationBarsIncludeDefaultTrue() {
        initializeDisplayManager();
        doNothing().when(mNavigationBarController).createNavigationBar(any());
        doNothing().when(mNavigationBarController).createNavigationBar(any(), any());

        mNavigationBarController.createNavigationBars(true);
        mNavigationBarController.createNavigationBars(true, null);

        verify(mNavigationBarController).createNavigationBar(any(Display.class));
        verify(mNavigationBarController).createNavigationBar(any(Display.class), any());
    }

    @Test
    public void testCreateNavigationBarsIncludeDefaultFalse() {
        initializeDisplayManager();
        doNothing().when(mNavigationBarController).createNavigationBar(any());
        doNothing().when(mNavigationBarController).createNavigationBar(any(), any());

        mNavigationBarController.createNavigationBars(false);
        mNavigationBarController.createNavigationBars(false, null);

        verify(mNavigationBarController, never()).createNavigationBar(any());
        verify(mNavigationBarController, never()).createNavigationBar(any(), any());
    }

    private void initializeDisplayManager() {