Add NavBarHelper#isImeShown for NavBar / TaskBar IME icon hits
Bug: 202218289
Test: atest NavigationBarTest#\
testSetImeWindowStatusWhenKeyguardLockingAndImeInsetsChange
Change-Id: I8926cb85942f8831585df88ecfb274dd334ff8dd
This commit is contained in:
@@ -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<AssistManager> mAssistManagerLazy;
|
||||
private final Lazy<Optional<StatusBar>> mStatusBarOptionalLazy;
|
||||
private final UserTracker mUserTracker;
|
||||
private final AccessibilityButtonModeObserver mAccessibilityButtonModeObserver;
|
||||
private final List<NavbarTaskbarStateUpdater> mA11yEventListeners = new ArrayList<>();
|
||||
@@ -98,12 +104,14 @@ public final class NavBarHelper implements
|
||||
AccessibilityButtonModeObserver accessibilityButtonModeObserver,
|
||||
OverviewProxyService overviewProxyService,
|
||||
Lazy<AssistManager> assistManagerLazy,
|
||||
Lazy<Optional<StatusBar>> 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)}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user