diff options
| author | 2019-04-22 12:28:43 -0700 | |
|---|---|---|
| committer | 2019-04-30 14:41:23 -0700 | |
| commit | e439dec155be12865b49602146a89fa87f90fd73 (patch) | |
| tree | 49ccf4874fc24e548f62818a03135aef6472610e | |
| parent | 7f39f77d6c042dcb2889c7ab6db2daf3ca98c635 (diff) | |
Propagate light nav bar info
When SystemUI (notification UI) is pulled down, the windows behind are
dimmed, including navigation bar. At this point of time, navigationbar
color could be controlled by IME and system overrides it.
With this fix, we check if IME is already controlling navbar color.
Change-Id: I9f25860a5b7858f1d17d2921816910a938c656bb
Fix: 122439339
Test: Manually verified using steps in bug.
15 files changed, 117 insertions, 50 deletions
diff --git a/core/java/com/android/internal/statusbar/IStatusBar.aidl b/core/java/com/android/internal/statusbar/IStatusBar.aidl index cfc32cf67016..7e501d27d30f 100644 --- a/core/java/com/android/internal/statusbar/IStatusBar.aidl +++ b/core/java/com/android/internal/statusbar/IStatusBar.aidl @@ -50,9 +50,11 @@ oneway interface IStatusBar * @param mask which flags to change * @param fullscreenBounds the current bounds of the fullscreen stack, in screen coordinates * @param dockedBounds the current bounds of the docked stack, in screen coordinates + * @param navbarColorManagedByIme {@code true} if navigation bar color is managed by IME. */ void setSystemUiVisibility(int displayId, int vis, int fullscreenStackVis, int dockedStackVis, - int mask, in Rect fullscreenBounds, in Rect dockedBounds); + int mask, in Rect fullscreenBounds, in Rect dockedBounds, + boolean navbarColorManagedByIme); void topAppWindowChanged(int displayId, boolean menuVisible); void setImeWindowStatus(int displayId, in IBinder token, int vis, int backDisposition, diff --git a/core/java/com/android/internal/statusbar/RegisterStatusBarResult.java b/core/java/com/android/internal/statusbar/RegisterStatusBarResult.java index ff94264d9b90..6b0f8b2f5dc9 100644 --- a/core/java/com/android/internal/statusbar/RegisterStatusBarResult.java +++ b/core/java/com/android/internal/statusbar/RegisterStatusBarResult.java @@ -39,12 +39,13 @@ public final class RegisterStatusBarResult implements Parcelable { public final IBinder mImeToken; public final Rect mFullscreenStackBounds; public final Rect mDockedStackBounds; + public final boolean mNavbarColorManagedByIme; public RegisterStatusBarResult(ArrayMap<String, StatusBarIcon> icons, int disabledFlags1, int systemUiVisibility, boolean menuVisible, int imeWindowVis, int imeBackDisposition, boolean showImeSwitcher, int disabledFlags2, int fullscreenStackSysUiVisibility, int dockedStackSysUiVisibility, IBinder imeToken, Rect fullscreenStackBounds, - Rect dockedStackBounds) { + Rect dockedStackBounds, boolean navbarColorManagedByIme) { mIcons = new ArrayMap<>(icons); mDisabledFlags1 = disabledFlags1; mSystemUiVisibility = systemUiVisibility; @@ -58,6 +59,7 @@ public final class RegisterStatusBarResult implements Parcelable { mImeToken = imeToken; mFullscreenStackBounds = fullscreenStackBounds; mDockedStackBounds = dockedStackBounds; + mNavbarColorManagedByIme = navbarColorManagedByIme; } @Override @@ -80,6 +82,7 @@ public final class RegisterStatusBarResult implements Parcelable { dest.writeStrongBinder(mImeToken); dest.writeTypedObject(mFullscreenStackBounds, flags); dest.writeTypedObject(mDockedStackBounds, flags); + dest.writeBoolean(mNavbarColorManagedByIme); } /** @@ -103,11 +106,12 @@ public final class RegisterStatusBarResult implements Parcelable { final IBinder imeToken = source.readStrongBinder(); final Rect fullscreenStackBounds = source.readTypedObject(Rect.CREATOR); final Rect dockedStackBounds = source.readTypedObject(Rect.CREATOR); + final boolean navbarColorManagedByIme = source.readBoolean(); return new RegisterStatusBarResult(icons, disabledFlags1, systemUiVisibility, menuVisible, imeWindowVis, imeBackDisposition, showImeSwitcher, disabledFlags2, fullscreenStackSysUiVisibility, dockedStackSysUiVisibility, imeToken, fullscreenStackBounds, - dockedStackBounds); + dockedStackBounds, navbarColorManagedByIme); } @Override diff --git a/core/tests/coretests/src/com/android/internal/statusbar/RegisterStatusBarResultTest.java b/core/tests/coretests/src/com/android/internal/statusbar/RegisterStatusBarResultTest.java index 3cb1e187fef1..b93c3a7a17e2 100644 --- a/core/tests/coretests/src/com/android/internal/statusbar/RegisterStatusBarResultTest.java +++ b/core/tests/coretests/src/com/android/internal/statusbar/RegisterStatusBarResultTest.java @@ -57,7 +57,8 @@ public class RegisterStatusBarResultTest { 0x80 /* dockedStackSysUiVisibility */, new Binder() /* imeToken */, new Rect(0x100, 0x200, 0x400, 0x800) /* fullscreenStackBounds */, - new Rect(0x1000, 0x2000, 0x4000, 0x8000) /* dockedStackBounds */); + new Rect(0x1000, 0x2000, 0x4000, 0x8000) /* dockedStackBounds */, + true /* navbarColorManagedByIme */); final RegisterStatusBarResult copy = clone(original); @@ -80,6 +81,7 @@ public class RegisterStatusBarResultTest { assertThat(copy.mImeToken).isSameAs(original.mImeToken); assertThat(copy.mFullscreenStackBounds).isEqualTo(original.mFullscreenStackBounds); assertThat(copy.mDockedStackBounds).isEqualTo(original.mDockedStackBounds); + assertThat(copy.mNavbarColorManagedByIme).isEqualTo(original.mNavbarColorManagedByIme); } private RegisterStatusBarResult clone(RegisterStatusBarResult original) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java index a688f36b47a6..9f8ab61306e5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java @@ -175,9 +175,11 @@ public class CommandQueue extends IStatusBar.Stub implements CallbackController< * @param fullscreenStackBounds The current bounds of the fullscreen stack, in screen * coordinates. * @param dockedStackBounds The current bounds of the docked stack, in screen coordinates. + * @param navbarColorManagedByIme {@code true} if navigation bar color is managed by IME. */ default void setSystemUiVisibility(int displayId, int vis, int fullscreenStackVis, - int dockedStackVis, int mask, Rect fullscreenStackBounds, Rect dockedStackBounds) { + int dockedStackVis, int mask, Rect fullscreenStackBounds, Rect dockedStackBounds, + boolean navbarColorManagedByIme) { } /** @@ -459,7 +461,8 @@ public class CommandQueue extends IStatusBar.Stub implements CallbackController< @Override public void setSystemUiVisibility(int displayId, int vis, int fullscreenStackVis, - int dockedStackVis, int mask, Rect fullscreenStackBounds, Rect dockedStackBounds) { + int dockedStackVis, int mask, Rect fullscreenStackBounds, Rect dockedStackBounds, + boolean navbarColorManagedByIme) { synchronized (mLock) { // Don't coalesce these, since it might have one time flags set such as // STATUS_BAR_UNHIDE which might get lost. @@ -469,6 +472,7 @@ public class CommandQueue extends IStatusBar.Stub implements CallbackController< args.argi3 = fullscreenStackVis; args.argi4 = dockedStackVis; args.argi5 = mask; + args.argi6 = navbarColorManagedByIme ? 1 : 0; args.arg1 = fullscreenStackBounds; args.arg2 = dockedStackBounds; mHandler.obtainMessage(MSG_SET_SYSTEMUI_VISIBILITY, args).sendToTarget(); @@ -879,7 +883,8 @@ public class CommandQueue extends IStatusBar.Stub implements CallbackController< args = (SomeArgs) msg.obj; for (int i = 0; i < mCallbacks.size(); i++) { mCallbacks.get(i).setSystemUiVisibility(args.argi1, args.argi2, args.argi3, - args.argi4, args.argi5, (Rect) args.arg1, (Rect) args.arg2); + args.argi4, args.argi5, (Rect) args.arg1, (Rect) args.arg2, + args.argi6 == 1); } args.recycle(); break; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoHideController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoHideController.java index fdf8ccee3f62..5912cd7b6433 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoHideController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoHideController.java @@ -95,7 +95,8 @@ public class AutoHideController implements CommandQueue.Callbacks { @Override public void setSystemUiVisibility(int displayId, int vis, int fullscreenStackVis, - int dockedStackVis, int mask, Rect fullscreenStackBounds, Rect dockedStackBounds) { + int dockedStackVis, int mask, Rect fullscreenStackBounds, Rect dockedStackBounds, + boolean navbarColorManagedByIme) { if (displayId != mDisplayId) { return; } @@ -119,7 +120,7 @@ public class AutoHideController implements CommandQueue.Callbacks { if (mSystemUiVisibility != newVal) { mCommandQueue.setSystemUiVisibility(mDisplayId, mSystemUiVisibility, fullscreenStackVis, dockedStackVis, mask, fullscreenStackBounds, - dockedStackBounds); + dockedStackBounds, navbarColorManagedByIme); } notifySystemUiVisibilityChanged(mSystemUiVisibility); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java index b590ca7f4df0..b0b656a1a951 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java @@ -79,6 +79,9 @@ public class LightBarController implements BatteryController.BatteryStateChangeC private final Rect mLastDockedBounds = new Rect(); private boolean mQsCustomizing; + private boolean mDirectReplying; + private boolean mNavbarColorManagedByIme; + @Inject public LightBarController(Context ctx, DarkIconDispatcher darkIconDispatcher, BatteryController batteryController) { @@ -100,7 +103,7 @@ public class LightBarController implements BatteryController.BatteryStateChangeC public void onSystemUiVisibilityChanged(int fullscreenStackVis, int dockedStackVis, int mask, Rect fullscreenStackBounds, Rect dockedStackBounds, boolean sbModeChanged, - int statusBarMode) { + int statusBarMode, boolean navbarColorManagedByIme) { int oldFullscreen = mFullscreenStackVisibility; int newFullscreen = (oldFullscreen & ~mask) | (fullscreenStackVis & mask); int diffFullscreen = newFullscreen ^ oldFullscreen; @@ -122,12 +125,13 @@ public class LightBarController implements BatteryController.BatteryStateChangeC mFullscreenStackVisibility = newFullscreen; mDockedStackVisibility = newDocked; mLastStatusBarMode = statusBarMode; + mNavbarColorManagedByIme = navbarColorManagedByIme; mLastFullscreenBounds.set(fullscreenStackBounds); mLastDockedBounds.set(dockedStackBounds); } public void onNavigationVisibilityChanged(int vis, int mask, boolean nbModeChanged, - int navigationBarMode) { + int navigationBarMode, boolean navbarColorManagedByIme) { int oldVis = mSystemUiVisibility; int newVis = (oldVis & ~mask) | (vis & mask); int diffVis = newVis ^ oldVis; @@ -136,21 +140,24 @@ public class LightBarController implements BatteryController.BatteryStateChangeC boolean last = mNavigationLight; mHasLightNavigationBar = isLight(vis, navigationBarMode, View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR); - mNavigationLight = mHasLightNavigationBar && !mForceDarkForScrim && !mQsCustomizing; + mNavigationLight = mHasLightNavigationBar + && (mDirectReplying && mNavbarColorManagedByIme || !mForceDarkForScrim) + && !mQsCustomizing; if (mNavigationLight != last) { updateNavigation(); } } mSystemUiVisibility = newVis; mLastNavigationBarMode = navigationBarMode; + mNavbarColorManagedByIme = navbarColorManagedByIme; } private void reevaluate() { onSystemUiVisibilityChanged(mFullscreenStackVisibility, mDockedStackVisibility, 0 /* mask */, mLastFullscreenBounds, mLastDockedBounds, - true /* sbModeChange*/, mLastStatusBarMode); + true /* sbModeChange*/, mLastStatusBarMode, mNavbarColorManagedByIme); onNavigationVisibilityChanged(mSystemUiVisibility, 0 /* mask */, true /* nbModeChanged */, - mLastNavigationBarMode); + mLastNavigationBarMode, mNavbarColorManagedByIme); } public void setQsCustomizing(boolean customizing) { @@ -159,6 +166,16 @@ public class LightBarController implements BatteryController.BatteryStateChangeC reevaluate(); } + /** + * Sets whether the direct-reply is in use or not. + * @param directReplying {@code true} when the direct-reply is in-use. + */ + public void setDirectReplying(boolean directReplying) { + if (mDirectReplying == directReplying) return; + mDirectReplying = directReplying; + reevaluate(); + } + public void setScrimState(ScrimState scrimState, float scrimBehindAlpha, GradientColors scrimInFrontColor) { boolean forceDarkForScrimLast = mForceDarkForScrim; @@ -260,7 +277,9 @@ public class LightBarController implements BatteryController.BatteryStateChangeC pw.print(" mLastNavigationBarMode="); pw.println(mLastNavigationBarMode); pw.print(" mForceDarkForScrim="); pw.print(mForceDarkForScrim); - pw.print(" mQsCustomizing="); pw.println(mQsCustomizing); + pw.print(" mQsCustomizing="); pw.print(mQsCustomizing); + pw.print(" mDirectReplying="); pw.println(mDirectReplying); + pw.print(" mNavbarColorManagedByIme="); pw.println(mNavbarColorManagedByIme); pw.println(); 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 de57066d80ba..514cb412c456 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java @@ -512,12 +512,13 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback mAutoHideController.touchAutoHide(); mLightBarController.onNavigationVisibilityChanged(mSystemUiVisibility, 0 /* mask */, - true /* nbModeChanged */, mNavigationBarMode); + true /* nbModeChanged */, mNavigationBarMode, false /* navbarColorManagedByIme */); } @Override public void setSystemUiVisibility(int displayId, int vis, int fullscreenStackVis, - int dockedStackVis, int mask, Rect fullscreenStackBounds, Rect dockedStackBounds) { + int dockedStackVis, int mask, Rect fullscreenStackBounds, Rect dockedStackBounds, + boolean navbarColorManagedByIme) { if (displayId != mDisplayId) { return; } @@ -545,7 +546,7 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback } } mLightBarController.onNavigationVisibilityChanged( - vis, mask, nbModeChanged, mNavigationBarMode); + vis, mask, nbModeChanged, mNavigationBarMode, navbarColorManagedByIme); } private @TransitionMode int computeBarMode(int oldVis, int newVis) { 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 2babfe3ca544..761bc8b5385b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -710,7 +710,8 @@ public class StatusBar extends SystemUI implements DemoMode, setSystemUiVisibility(mDisplayId, result.mSystemUiVisibility, result.mFullscreenStackSysUiVisibility, result.mDockedStackSysUiVisibility, - 0xffffffff, result.mFullscreenStackBounds, result.mDockedStackBounds); + 0xffffffff, result.mFullscreenStackBounds, result.mDockedStackBounds, + result.mNavbarColorManagedByIme); topAppWindowChanged(mDisplayId, result.mMenuVisible); // StatusBarManagerService has a back up of IME token and it's restored here. setImeWindowStatus(mDisplayId, result.mImeToken, result.mImeWindowVis, @@ -2089,7 +2090,8 @@ public class StatusBar extends SystemUI implements DemoMode, @Override // CommandQueue public void setSystemUiVisibility(int displayId, int vis, int fullscreenStackVis, - int dockedStackVis, int mask, Rect fullscreenStackBounds, Rect dockedStackBounds) { + int dockedStackVis, int mask, Rect fullscreenStackBounds, Rect dockedStackBounds, + boolean navbarColorManagedByIme) { if (displayId != mDisplayId) { return; } @@ -2126,7 +2128,8 @@ public class StatusBar extends SystemUI implements DemoMode, } } mLightBarController.onSystemUiVisibilityChanged(fullscreenStackVis, dockedStackVis, - mask, fullscreenStackBounds, dockedStackBounds, sbModeChanged, mStatusBarMode); + mask, fullscreenStackBounds, dockedStackBounds, sbModeChanged, mStatusBarMode, + navbarColorManagedByIme); } @Override @@ -2247,11 +2250,12 @@ public class StatusBar extends SystemUI implements DemoMode, Log.v(TAG, "setLightsOn(" + on + ")"); if (on) { setSystemUiVisibility(mDisplayId, 0, 0, 0, View.SYSTEM_UI_FLAG_LOW_PROFILE, - mLastFullscreenStackBounds, mLastDockedStackBounds); + mLastFullscreenStackBounds, mLastDockedStackBounds, + false /* navbarColorManagedByIme */); } else { setSystemUiVisibility(mDisplayId, View.SYSTEM_UI_FLAG_LOW_PROFILE, 0, 0, View.SYSTEM_UI_FLAG_LOW_PROFILE, mLastFullscreenStackBounds, - mLastDockedStackBounds); + mLastDockedStackBounds, false /* navbarColorManagedByIme */); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java index c1950a21d10f..43795dc08c91 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java @@ -63,6 +63,7 @@ import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.collection.NotificationEntry.EditedSuggestionInfo; import com.android.systemui.statusbar.notification.row.wrapper.NotificationViewWrapper; import com.android.systemui.statusbar.notification.stack.StackStateAnimator; +import com.android.systemui.statusbar.phone.LightBarController; import java.util.function.Consumer; @@ -516,10 +517,12 @@ public class RemoteInputView extends LinearLayout implements View.OnClickListene private final Drawable mBackground; private RemoteInputView mRemoteInputView; boolean mShowImeOnInputConnection; + private LightBarController mLightBarController; public RemoteEditText(Context context, AttributeSet attrs) { super(context, attrs); mBackground = getBackground(); + mLightBarController = Dependency.get(LightBarController.class); } private void defocusIfNeeded(boolean animate) { @@ -558,6 +561,9 @@ public class RemoteInputView extends LinearLayout implements View.OnClickListene if (!focused) { defocusIfNeeded(true /* animate */); } + if (!mRemoteInputView.mRemoved) { + mLightBarController.setDirectReplying(focused); + } } @Override diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java index c2f55e2f9b99..2bde5f678c3b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java @@ -112,19 +112,19 @@ public class CommandQueueTest extends SysuiTestCase { @Test public void testSetSystemUiVisibility() { Rect r = new Rect(); - mCommandQueue.setSystemUiVisibility(DEFAULT_DISPLAY, 1, 2, 3, 4, null, r); + mCommandQueue.setSystemUiVisibility(DEFAULT_DISPLAY, 1, 2, 3, 4, null, r, false); waitForIdleSync(); verify(mCallbacks).setSystemUiVisibility(eq(DEFAULT_DISPLAY), eq(1), eq(2), eq(3), eq(4), - eq(null), eq(r)); + eq(null), eq(r), eq(false)); } @Test public void testSetSystemUiVisibilityForSecondaryDisplay() { Rect r = new Rect(); - mCommandQueue.setSystemUiVisibility(SECONDARY_DISPLAY, 1, 2, 3, 4, null, r); + mCommandQueue.setSystemUiVisibility(SECONDARY_DISPLAY, 1, 2, 3, 4, null, r, false); waitForIdleSync(); verify(mCallbacks).setSystemUiVisibility(eq(SECONDARY_DISPLAY), eq(1), eq(2), eq(3), eq(4), - eq(null), eq(r)); + eq(null), eq(r), eq(false)); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoHideControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoHideControllerTest.java index 1b34a7584994..f614354a7691 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoHideControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoHideControllerTest.java @@ -70,7 +70,7 @@ public class AutoHideControllerTest extends SysuiTestCase { @Test public void testSetSystemUiVisibilityEarlyReturnWithDifferentDisplay() { - mAutoHideController.setSystemUiVisibility(1, 1, 2, 3, 4, null, new Rect()); + mAutoHideController.setSystemUiVisibility(1, 1, 2, 3, 4, null, new Rect(), false); verify(mAutoHideController, never()).notifySystemUiVisibilityChanged(anyInt()); } @@ -78,7 +78,8 @@ public class AutoHideControllerTest extends SysuiTestCase { @Test public void testSetSystemUiVisibilityEarlyReturnWithSameVisibility() { mAutoHideController - .setSystemUiVisibility(DEFAULT_DISPLAY, View.VISIBLE, 2, 3, 4, null, new Rect()); + .setSystemUiVisibility( + DEFAULT_DISPLAY, View.VISIBLE, 2, 3, 4, null, new Rect(), false); verify(mAutoHideController, never()).notifySystemUiVisibilityChanged(anyInt()); } @@ -92,7 +93,7 @@ public class AutoHideControllerTest extends SysuiTestCase { View.SYSTEM_UI_FLAG_FULLSCREEN | View.STATUS_BAR_UNHIDE; mAutoHideController.setSystemUiVisibility( - DEFAULT_DISPLAY, expectedStatus, 2, 3, FULL_MASK, null, new Rect()); + DEFAULT_DISPLAY, expectedStatus, 2, 3, FULL_MASK, null, new Rect(), false); assertEquals("System UI visibility should not be changed", expectedStatus, mAutoHideController.mSystemUiVisibility); @@ -109,7 +110,7 @@ public class AutoHideControllerTest extends SysuiTestCase { mAutoHideController.setSystemUiVisibility( DEFAULT_DISPLAY, View.STATUS_BAR_UNHIDE | View.NAVIGATION_BAR_UNHIDE, - 2, 3, FULL_MASK, null, new Rect()); + 2, 3, FULL_MASK, null, new Rect(), false); int expectedStatus = View.VISIBLE; assertEquals(expectedStatus, mAutoHideController.mSystemUiVisibility); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/RemoteInputViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/RemoteInputViewTest.java index 8bf1606d5b7b..bc468bf2fb82 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/RemoteInputViewTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/RemoteInputViewTest.java @@ -42,6 +42,7 @@ import com.android.systemui.SysuiTestCase; import com.android.systemui.statusbar.NotificationTestHelper; import com.android.systemui.statusbar.RemoteInputController; import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; +import com.android.systemui.statusbar.phone.LightBarController; import com.android.systemui.util.Assert; import org.junit.After; @@ -67,6 +68,7 @@ public class RemoteInputViewTest extends SysuiTestCase { @Mock private RemoteInputController mController; @Mock private ShortcutManager mShortcutManager; @Mock private RemoteInputQuickSettingsDisabler mRemoteInputQuickSettingsDisabler; + @Mock private LightBarController mLightBarController; private BlockingQueueIntentReceiver mReceiver; private RemoteInputView mView; @@ -77,6 +79,8 @@ public class RemoteInputViewTest extends SysuiTestCase { mDependency.injectTestDependency(RemoteInputQuickSettingsDisabler.class, mRemoteInputQuickSettingsDisabler); + mDependency.injectTestDependency(LightBarController.class, + mLightBarController); mReceiver = new BlockingQueueIntentReceiver(); mContext.registerReceiver(mReceiver, new IntentFilter(TEST_ACTION), null, diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java b/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java index b9b5aae03587..7734d6bd30a7 100644 --- a/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java +++ b/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java @@ -77,7 +77,8 @@ public interface StatusBarManagerInternal { void onCameraLaunchGestureDetected(int source); void topAppWindowChanged(int displayId, boolean menuVisible); void setSystemUiVisibility(int displayId, int vis, int fullscreenStackVis, int dockedStackVis, - int mask, Rect fullscreenBounds, Rect dockedBounds, String cause); + int mask, Rect fullscreenBounds, Rect dockedBounds, boolean isNavbarColorManagedByIme, + String cause); void toggleSplitScreen(); void appTransitionFinished(int displayId); diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java index a5656c3e40f0..b2d7084fcd05 100644 --- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java +++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java @@ -262,9 +262,10 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D @Override public void setSystemUiVisibility(int displayId, int vis, int fullscreenStackVis, int dockedStackVis, int mask, Rect fullscreenBounds, Rect dockedBounds, - String cause) { + boolean isNavbarColorManagedByIme, String cause) { StatusBarManagerService.this.setSystemUiVisibility(displayId, vis, fullscreenStackVis, - dockedStackVis, mask, fullscreenBounds, dockedBounds, cause); + dockedStackVis, mask, fullscreenBounds, dockedBounds, isNavbarColorManagedByIme, + cause); } @Override @@ -872,11 +873,13 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D public void setSystemUiVisibility(int displayId, int vis, int mask, String cause) { final UiState state = getUiState(displayId); setSystemUiVisibility(displayId, vis, 0, 0, mask, - state.mFullscreenStackBounds, state.mDockedStackBounds, cause); + state.mFullscreenStackBounds, state.mDockedStackBounds, + state.mNavbarColorManagedByIme, cause); } private void setSystemUiVisibility(int displayId, int vis, int fullscreenStackVis, - int dockedStackVis, int mask, Rect fullscreenBounds, Rect dockedBounds, String cause) { + int dockedStackVis, int mask, Rect fullscreenBounds, Rect dockedBounds, + boolean isNavbarColorManagedByIme, String cause) { // also allows calls from window manager which is in this process. enforceStatusBarService(); @@ -884,7 +887,7 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D synchronized (mLock) { updateUiVisibilityLocked(displayId, vis, fullscreenStackVis, dockedStackVis, mask, - fullscreenBounds, dockedBounds); + fullscreenBounds, dockedBounds, isNavbarColorManagedByIme); disableLocked( displayId, mCurrentUserId, @@ -896,17 +899,19 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D private void updateUiVisibilityLocked(final int displayId, final int vis, final int fullscreenStackVis, final int dockedStackVis, final int mask, - final Rect fullscreenBounds, final Rect dockedBounds) { + final Rect fullscreenBounds, final Rect dockedBounds, + final boolean isNavbarColorManagedByIme) { final UiState state = getUiState(displayId); if (!state.systemUiStateEquals(vis, fullscreenStackVis, dockedStackVis, - fullscreenBounds, dockedBounds)) { + fullscreenBounds, dockedBounds, isNavbarColorManagedByIme)) { state.setSystemUiState(vis, fullscreenStackVis, dockedStackVis, fullscreenBounds, - dockedBounds); + dockedBounds, isNavbarColorManagedByIme); mHandler.post(() -> { if (mBar != null) { try { mBar.setSystemUiVisibility(displayId, vis, fullscreenStackVis, - dockedStackVis, mask, fullscreenBounds, dockedBounds); + dockedStackVis, mask, fullscreenBounds, dockedBounds, + isNavbarColorManagedByIme); } catch (RemoteException ex) { Log.w(TAG, "Can not get StatusBar!"); } @@ -945,6 +950,7 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D private int mImeBackDisposition = 0; private boolean mShowImeSwitcher = false; private IBinder mImeToken = null; + private boolean mNavbarColorManagedByIme = false; private int getDisabled1() { return mDisabled1; @@ -972,21 +978,25 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D } private void setSystemUiState(final int vis, final int fullscreenStackVis, - final int dockedStackVis, final Rect fullscreenBounds, final Rect dockedBounds) { + final int dockedStackVis, final Rect fullscreenBounds, final Rect dockedBounds, + final boolean navbarColorManagedByIme) { mSystemUiVisibility = vis; mFullscreenStackSysUiVisibility = fullscreenStackVis; mDockedStackSysUiVisibility = dockedStackVis; mFullscreenStackBounds.set(fullscreenBounds); mDockedStackBounds.set(dockedBounds); + mNavbarColorManagedByIme = navbarColorManagedByIme; } private boolean systemUiStateEquals(final int vis, final int fullscreenStackVis, - final int dockedStackVis, final Rect fullscreenBounds, final Rect dockedBounds) { + final int dockedStackVis, final Rect fullscreenBounds, final Rect dockedBounds, + final boolean navbarColorManagedByIme) { return mSystemUiVisibility == vis && mFullscreenStackSysUiVisibility == fullscreenStackVis && mDockedStackSysUiVisibility == dockedStackVis && mFullscreenStackBounds.equals(fullscreenBounds) - && mDockedStackBounds.equals(dockedBounds); + && mDockedStackBounds.equals(dockedBounds) + && mNavbarColorManagedByIme == navbarColorManagedByIme; } private void setImeWindowState(final int vis, final int backDisposition, @@ -1051,7 +1061,8 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D state.mImeBackDisposition, state.mShowImeSwitcher, gatherDisableActionsLocked(mCurrentUserId, 2), state.mFullscreenStackSysUiVisibility, state.mDockedStackSysUiVisibility, - state.mImeToken, state.mFullscreenStackBounds, state.mDockedStackBounds); + state.mImeToken, state.mFullscreenStackBounds, state.mDockedStackBounds, + state.mNavbarColorManagedByIme); } } diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java index 3bb365338749..32d0b32956cf 100644 --- a/services/core/java/com/android/server/wm/DisplayPolicy.java +++ b/services/core/java/com/android/server/wm/DisplayPolicy.java @@ -112,7 +112,6 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.Px; import android.app.ActivityManager; -import android.app.ActivityManagerInternal; import android.app.ActivityThread; import android.app.LoadedApk; import android.app.ResourcesManager; @@ -133,6 +132,7 @@ import android.os.SystemClock; import android.os.SystemProperties; import android.os.UserHandle; import android.util.ArraySet; +import android.util.Pair; import android.util.PrintWriterPrinter; import android.util.Slog; import android.view.DisplayCutout; @@ -3113,7 +3113,9 @@ public class DisplayPolicy { WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_HOME, mNonDockedStackBounds); mService.getStackBounds( WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, ACTIVITY_TYPE_STANDARD, mDockedStackBounds); - final int visibility = updateSystemBarsLw(win, mLastSystemUiFlags, tmpVisibility); + final Pair<Integer, Boolean> result = + updateSystemBarsLw(win, mLastSystemUiFlags, tmpVisibility); + final int visibility = result.first; final int diff = visibility ^ mLastSystemUiFlags; final int fullscreenDiff = fullscreenVisibility ^ mLastFullscreenStackSysUiFlags; final int dockedDiff = dockedVisibility ^ mLastDockedStackSysUiFlags; @@ -3133,13 +3135,14 @@ public class DisplayPolicy { mLastDockedStackBounds.set(mDockedStackBounds); final Rect fullscreenStackBounds = new Rect(mNonDockedStackBounds); final Rect dockedStackBounds = new Rect(mDockedStackBounds); + final boolean isNavbarColorManagedByIme = result.second; mHandler.post(() -> { StatusBarManagerInternal statusBar = getStatusBarManagerInternal(); if (statusBar != null) { final int displayId = getDisplayId(); statusBar.setSystemUiVisibility(displayId, visibility, fullscreenVisibility, dockedVisibility, 0xffffffff, fullscreenStackBounds, - dockedStackBounds, win.toString()); + dockedStackBounds, isNavbarColorManagedByIme, win.toString()); statusBar.topAppWindowChanged(displayId, needsMenu); } }); @@ -3222,7 +3225,7 @@ public class DisplayPolicy { return vis; } - private int updateSystemBarsLw(WindowState win, int oldVis, int vis) { + private Pair<Integer, Boolean> updateSystemBarsLw(WindowState win, int oldVis, int vis) { final boolean dockedStackVisible = mDisplayContent.isStackVisible(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY); final boolean freeformStackVisible = @@ -3355,8 +3358,11 @@ public class DisplayPolicy { vis = updateLightNavigationBarLw(vis, mTopFullscreenOpaqueWindowState, mTopFullscreenOpaqueOrDimmingWindowState, mDisplayContent.mInputMethodWindow, navColorWin); + // Navbar color is controlled by the IME. + final boolean isManagedByIme = + navColorWin != null && navColorWin == mDisplayContent.mInputMethodWindow; - return vis; + return Pair.create(vis, isManagedByIme); } private boolean drawsBarBackground(int vis, WindowState win, BarController controller, |