From 94380655dfbefa1825db0c3413433ef3b22e8a42 Mon Sep 17 00:00:00 2001 From: Matthew Ng Date: Mon, 8 Apr 2019 13:43:07 -0700 Subject: [PATCH] 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 --- .../systemui/statusbar/car/CarStatusBar.java | 10 ++++++---- .../statusbar/NavigationBarController.java | 16 ++++++++++++---- .../phone/NavigationBarFragment.java | 1 + .../systemui/statusbar/phone/StatusBar.java | 19 +++++++------------ .../NavigationBarControllerTest.java | 12 ++++++------ 5 files changed, 32 insertions(+), 26 deletions(-) diff --git a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java index 44e8874f83869..efebfc2a4a1e8 100644 --- a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java +++ b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java @@ -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() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NavigationBarController.java b/packages/SystemUI/src/com/android/systemui/statusbar/NavigationBarController.java index c833ded6a85f0..907b3ad08c8c2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NavigationBarController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NavigationBarController.java @@ -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); + } }); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java index 591b1b48ddc28..9eecdb9244485 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java @@ -316,6 +316,7 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback if (savedInstanceState != null) { mNavigationBarView.getLightTransitionsController().restoreState(savedInstanceState); } + mNavigationBarView.setNavigationIconHints(mNavigationIconHints); prepareNavigationBarView(); checkNavBarModes(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index aaaf3edfba689..9fccf9132fc87 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -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()); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NavigationBarControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NavigationBarControllerTest.java index 34a726d526a31..7d2ccdc8f0a98 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NavigationBarControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NavigationBarControllerTest.java @@ -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() {