From 1317fa29306806c89d85241d0aa6f03318742059 Mon Sep 17 00:00:00 2001 From: Ming-Shin Lu Date: Fri, 26 Nov 2021 11:30:30 +0800 Subject: [PATCH] Add NavBarHelper#isImeShown for NavBar / TaskBar IME icon hits Bug: 202218289 Test: atest NavigationBarTest#\ testSetImeWindowStatusWhenKeyguardLockingAndImeInsetsChange Change-Id: I8926cb85942f8831585df88ecfb274dd334ff8dd --- .../systemui/navigationbar/NavBarHelper.java | 21 +++++++++++++++++++ .../systemui/navigationbar/NavigationBar.java | 13 +----------- .../navigationbar/TaskbarDelegate.java | 4 ++-- .../navigationbar/NavBarHelperTest.java | 8 +++++-- .../navigationbar/NavigationBarTest.java | 10 ++++++++- 5 files changed, 39 insertions(+), 17 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavBarHelper.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavBarHelper.java index 23062d805fd6f..25337b6d52a1c 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavBarHelper.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavBarHelper.java @@ -24,12 +24,15 @@ import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_A import android.content.ContentResolver; import android.content.Context; import android.database.ContentObserver; +import android.inputmethodservice.InputMethodService; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.UserHandle; import android.provider.Settings; +import android.view.View; +import android.view.WindowInsets; import android.view.accessibility.AccessibilityManager; import androidx.annotation.NonNull; @@ -42,12 +45,14 @@ import com.android.systemui.dump.DumpManager; import com.android.systemui.recents.OverviewProxyService; import com.android.systemui.settings.UserTracker; import com.android.systemui.shared.system.QuickStepContract; +import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.policy.AccessibilityManagerWrapper; import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; +import java.util.Optional; import javax.inject.Inject; @@ -69,6 +74,7 @@ public final class NavBarHelper implements Dumpable { private final AccessibilityManager mAccessibilityManager; private final Lazy mAssistManagerLazy; + private final Lazy> mStatusBarOptionalLazy; private final UserTracker mUserTracker; private final AccessibilityButtonModeObserver mAccessibilityButtonModeObserver; private final List mA11yEventListeners = new ArrayList<>(); @@ -98,12 +104,14 @@ public final class NavBarHelper implements AccessibilityButtonModeObserver accessibilityButtonModeObserver, OverviewProxyService overviewProxyService, Lazy assistManagerLazy, + Lazy> statusBarOptionalLazy, NavigationModeController navigationModeController, UserTracker userTracker, DumpManager dumpManager) { mContext = context; mAccessibilityManager = accessibilityManager; mAssistManagerLazy = assistManagerLazy; + mStatusBarOptionalLazy = statusBarOptionalLazy; mUserTracker = userTracker; accessibilityManagerWrapper.addCallback( accessibilityManager1 -> NavBarHelper.this.dispatchA11yEventUpdate()); @@ -231,6 +239,19 @@ public final class NavBarHelper implements updateAssitantAvailability(); } + /** + * @return Whether the IME is shown on top of the screen given the {@code vis} flag of + * {@link InputMethodService} and the keyguard states. + */ + public boolean isImeShown(int vis) { + View shadeWindowView = mStatusBarOptionalLazy.get().get().getNotificationShadeWindowView(); + boolean isKeyguardShowing = mStatusBarOptionalLazy.get().get().isKeyguardShowing(); + boolean imeVisibleOnShade = shadeWindowView != null && shadeWindowView.isAttachedToWindow() + && shadeWindowView.getRootWindowInsets().isVisible(WindowInsets.Type.ime()); + return imeVisibleOnShade + || (!isKeyguardShowing && (vis & InputMethodService.IME_VISIBLE) != 0); + } + /** * Callbacks will get fired once immediately after registering via * {@link #registerNavTaskStateUpdater(NavbarTaskbarStateUpdater)} diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java index 75ef8dee41e8f..8026df747ff65 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java @@ -71,7 +71,6 @@ import android.graphics.Insets; import android.graphics.PixelFormat; import android.graphics.Rect; import android.graphics.RectF; -import android.inputmethodservice.InputMethodService; import android.os.Binder; import android.os.Bundle; import android.os.Handler; @@ -93,7 +92,6 @@ import android.view.MotionEvent; import android.view.Surface; import android.view.View; import android.view.ViewTreeObserver; -import android.view.WindowInsets; import android.view.WindowInsetsController.Appearance; import android.view.WindowInsetsController.Behavior; import android.view.WindowManager; @@ -884,17 +882,8 @@ public class NavigationBar implements View.OnAttachStateChangeListener, if (displayId != mDisplayId) { return; } - boolean imeVisibleOnShade = mStatusBarOptionalLazy.get().map(statusBar -> { - View shadeWindowView = statusBar.getNotificationShadeWindowView(); - return shadeWindowView.isAttachedToWindow() - && shadeWindowView.getRootWindowInsets().isVisible(WindowInsets.Type.ime()); - }).orElse(false); - boolean isKeyguardShowing = mStatusBarOptionalLazy.get().map( - StatusBar::isKeyguardShowing).orElse(false); - boolean imeShown = imeVisibleOnShade - || (!isKeyguardShowing && (vis & InputMethodService.IME_VISIBLE) != 0); + boolean imeShown = mNavBarHelper.isImeShown(vis); showImeSwitcher = imeShown && showImeSwitcher; - int hints = Utilities.calculateBackDispositionHints(mNavigationIconHints, backDisposition, imeShown, showImeSwitcher); if (hints == mNavigationIconHints) return; diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java b/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java index fb9b8eb23de10..8fb394c06ba11 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java @@ -41,7 +41,6 @@ import android.content.ComponentCallbacks; import android.content.Context; import android.content.res.Configuration; import android.hardware.display.DisplayManager; -import android.inputmethodservice.InputMethodService; import android.os.IBinder; import android.os.RemoteException; import android.util.Log; @@ -265,7 +264,8 @@ public class TaskbarDelegate implements CommandQueue.Callbacks, @Override public void setImeWindowStatus(int displayId, IBinder token, int vis, int backDisposition, boolean showImeSwitcher) { - boolean imeShown = (vis & InputMethodService.IME_VISIBLE) != 0; + boolean imeShown = mNavBarHelper.isImeShown(vis); + showImeSwitcher = imeShown && showImeSwitcher; int hints = Utilities.calculateBackDispositionHints(mNavigationIconHints, backDisposition, imeShown, showImeSwitcher); if (hints != mNavigationIconHints) { diff --git a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavBarHelperTest.java b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavBarHelperTest.java index ed5b8cb1a7fe0..a445d6f4e5c5b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavBarHelperTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavBarHelperTest.java @@ -18,6 +18,7 @@ package com.android.systemui.navigationbar; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -34,6 +35,7 @@ import com.android.systemui.assist.AssistManager; import com.android.systemui.dump.DumpManager; import com.android.systemui.recents.OverviewProxyService; import com.android.systemui.settings.UserTracker; +import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.policy.AccessibilityManagerWrapper; import org.junit.Before; @@ -42,6 +44,8 @@ import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import java.util.Optional; + import dagger.Lazy; @RunWith(AndroidJUnit4.class) @@ -82,8 +86,8 @@ public class NavBarHelperTest extends SysuiTestCase { mNavBarHelper = new NavBarHelper(mContext, mAccessibilityManager, mAccessibilityManagerWrapper, mAccessibilityButtonModeObserver, - mOverviewProxyService, mAssistManagerLazy, mNavigationModeController, - mUserTracker, mDumpManager); + mOverviewProxyService, mAssistManagerLazy, () -> Optional.of(mock(StatusBar.class)), + mNavigationModeController, mUserTracker, mDumpManager); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java index e038b6e6dfb3e..5003013358be1 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java @@ -76,6 +76,7 @@ import com.android.systemui.accessibility.AccessibilityButtonModeObserver; import com.android.systemui.accessibility.SystemActions; import com.android.systemui.assist.AssistManager; import com.android.systemui.broadcast.BroadcastDispatcher; +import com.android.systemui.dump.DumpManager; import com.android.systemui.model.SysUiState; import com.android.systemui.navigationbar.gestural.EdgeBackGestureHandler; import com.android.systemui.plugins.statusbar.StatusBarStateController; @@ -90,6 +91,7 @@ import com.android.systemui.statusbar.phone.LightBarController; import com.android.systemui.statusbar.phone.NotificationShadeWindowView; import com.android.systemui.statusbar.phone.ShadeController; import com.android.systemui.statusbar.phone.StatusBar; +import com.android.systemui.statusbar.policy.AccessibilityManagerWrapper; import com.android.systemui.statusbar.policy.DeviceProvisionedController; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.utils.leaks.LeakCheckedTest; @@ -103,6 +105,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import org.mockito.Spy; import java.util.Optional; @@ -135,7 +138,6 @@ public class NavigationBarTest extends SysuiTestCase { EdgeBackGestureHandler.Factory mEdgeBackGestureHandlerFactory; @Mock EdgeBackGestureHandler mEdgeBackGestureHandler; - @Mock NavBarHelper mNavBarHelper; @Mock private LightBarController mLightBarController; @@ -179,6 +181,12 @@ public class NavigationBarTest extends SysuiTestCase { mDependency.injectTestDependency(OverviewProxyService.class, mOverviewProxyService); mDependency.injectTestDependency(NavigationModeController.class, mNavigationModeController); TestableLooper.get(this).runWithLooper(() -> { + mNavBarHelper = spy(new NavBarHelper(mContext, mock(AccessibilityManager.class), + mock(AccessibilityManagerWrapper.class), + mock(AccessibilityButtonModeObserver.class), mOverviewProxyService, + () -> mock(AssistManager.class), () -> Optional.of(mStatusBar), + mock(NavigationModeController.class), mock(UserTracker.class), + mock(DumpManager.class))); mNavigationBar = createNavBar(mContext); mExternalDisplayNavigationBar = createNavBar(mSysuiTestableContextExternal); });