Merge "Remote mCurClientInKeyguard dependency in IMMS" into sc-v2-dev am: 53a2aa20d8

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/16324233

Change-Id: I69efedc748c07e0fc07cd8e0645c287c5613bbf7
This commit is contained in:
TreeHugger Robot
2021-11-30 03:32:23 +00:00
committed by Automerger Merge Worker
6 changed files with 88 additions and 21 deletions

View File

@@ -24,12 +24,15 @@ import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_A
import android.content.ContentResolver; import android.content.ContentResolver;
import android.content.Context; import android.content.Context;
import android.database.ContentObserver; import android.database.ContentObserver;
import android.inputmethodservice.InputMethodService;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.os.Looper; import android.os.Looper;
import android.os.UserHandle; import android.os.UserHandle;
import android.provider.Settings; import android.provider.Settings;
import android.view.View;
import android.view.WindowInsets;
import android.view.accessibility.AccessibilityManager; import android.view.accessibility.AccessibilityManager;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
@@ -42,12 +45,14 @@ import com.android.systemui.dump.DumpManager;
import com.android.systemui.recents.OverviewProxyService; import com.android.systemui.recents.OverviewProxyService;
import com.android.systemui.settings.UserTracker; import com.android.systemui.settings.UserTracker;
import com.android.systemui.shared.system.QuickStepContract; import com.android.systemui.shared.system.QuickStepContract;
import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.policy.AccessibilityManagerWrapper; import com.android.systemui.statusbar.policy.AccessibilityManagerWrapper;
import java.io.FileDescriptor; import java.io.FileDescriptor;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Optional;
import javax.inject.Inject; import javax.inject.Inject;
@@ -69,6 +74,7 @@ public final class NavBarHelper implements
Dumpable { Dumpable {
private final AccessibilityManager mAccessibilityManager; private final AccessibilityManager mAccessibilityManager;
private final Lazy<AssistManager> mAssistManagerLazy; private final Lazy<AssistManager> mAssistManagerLazy;
private final Lazy<Optional<StatusBar>> mStatusBarOptionalLazy;
private final UserTracker mUserTracker; private final UserTracker mUserTracker;
private final AccessibilityButtonModeObserver mAccessibilityButtonModeObserver; private final AccessibilityButtonModeObserver mAccessibilityButtonModeObserver;
private final List<NavbarTaskbarStateUpdater> mA11yEventListeners = new ArrayList<>(); private final List<NavbarTaskbarStateUpdater> mA11yEventListeners = new ArrayList<>();
@@ -98,12 +104,14 @@ public final class NavBarHelper implements
AccessibilityButtonModeObserver accessibilityButtonModeObserver, AccessibilityButtonModeObserver accessibilityButtonModeObserver,
OverviewProxyService overviewProxyService, OverviewProxyService overviewProxyService,
Lazy<AssistManager> assistManagerLazy, Lazy<AssistManager> assistManagerLazy,
Lazy<Optional<StatusBar>> statusBarOptionalLazy,
NavigationModeController navigationModeController, NavigationModeController navigationModeController,
UserTracker userTracker, UserTracker userTracker,
DumpManager dumpManager) { DumpManager dumpManager) {
mContext = context; mContext = context;
mAccessibilityManager = accessibilityManager; mAccessibilityManager = accessibilityManager;
mAssistManagerLazy = assistManagerLazy; mAssistManagerLazy = assistManagerLazy;
mStatusBarOptionalLazy = statusBarOptionalLazy;
mUserTracker = userTracker; mUserTracker = userTracker;
accessibilityManagerWrapper.addCallback( accessibilityManagerWrapper.addCallback(
accessibilityManager1 -> NavBarHelper.this.dispatchA11yEventUpdate()); accessibilityManager1 -> NavBarHelper.this.dispatchA11yEventUpdate());
@@ -231,6 +239,19 @@ public final class NavBarHelper implements
updateAssitantAvailability(); 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 * Callbacks will get fired once immediately after registering via
* {@link #registerNavTaskStateUpdater(NavbarTaskbarStateUpdater)} * {@link #registerNavTaskStateUpdater(NavbarTaskbarStateUpdater)}

View File

@@ -72,7 +72,6 @@ import android.graphics.Insets;
import android.graphics.PixelFormat; import android.graphics.PixelFormat;
import android.graphics.Rect; import android.graphics.Rect;
import android.graphics.RectF; import android.graphics.RectF;
import android.inputmethodservice.InputMethodService;
import android.os.Binder; import android.os.Binder;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
@@ -884,7 +883,8 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
if (displayId != mDisplayId) { if (displayId != mDisplayId) {
return; return;
} }
boolean imeShown = (vis & InputMethodService.IME_VISIBLE) != 0; boolean imeShown = mNavBarHelper.isImeShown(vis);
showImeSwitcher = imeShown && showImeSwitcher;
int hints = Utilities.calculateBackDispositionHints(mNavigationIconHints, backDisposition, int hints = Utilities.calculateBackDispositionHints(mNavigationIconHints, backDisposition,
imeShown, showImeSwitcher); imeShown, showImeSwitcher);
if (hints == mNavigationIconHints) return; if (hints == mNavigationIconHints) return;
@@ -1757,4 +1757,4 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
mInputMethodManager); mInputMethodManager);
} }
} }
} }

View File

@@ -41,7 +41,6 @@ import android.content.ComponentCallbacks;
import android.content.Context; import android.content.Context;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.hardware.display.DisplayManager; import android.hardware.display.DisplayManager;
import android.inputmethodservice.InputMethodService;
import android.os.IBinder; import android.os.IBinder;
import android.os.RemoteException; import android.os.RemoteException;
import android.util.Log; import android.util.Log;
@@ -265,7 +264,8 @@ public class TaskbarDelegate implements CommandQueue.Callbacks,
@Override @Override
public void setImeWindowStatus(int displayId, IBinder token, int vis, int backDisposition, public void setImeWindowStatus(int displayId, IBinder token, int vis, int backDisposition,
boolean showImeSwitcher) { boolean showImeSwitcher) {
boolean imeShown = (vis & InputMethodService.IME_VISIBLE) != 0; boolean imeShown = mNavBarHelper.isImeShown(vis);
showImeSwitcher = imeShown && showImeSwitcher;
int hints = Utilities.calculateBackDispositionHints(mNavigationIconHints, backDisposition, int hints = Utilities.calculateBackDispositionHints(mNavigationIconHints, backDisposition,
imeShown, showImeSwitcher); imeShown, showImeSwitcher);
if (hints != mNavigationIconHints) { if (hints != mNavigationIconHints) {

View File

@@ -18,6 +18,7 @@ package com.android.systemui.navigationbar;
import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times; import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; 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.dump.DumpManager;
import com.android.systemui.recents.OverviewProxyService; import com.android.systemui.recents.OverviewProxyService;
import com.android.systemui.settings.UserTracker; import com.android.systemui.settings.UserTracker;
import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.policy.AccessibilityManagerWrapper; import com.android.systemui.statusbar.policy.AccessibilityManagerWrapper;
import org.junit.Before; import org.junit.Before;
@@ -42,6 +44,8 @@ import org.junit.runner.RunWith;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
import java.util.Optional;
import dagger.Lazy; import dagger.Lazy;
@RunWith(AndroidJUnit4.class) @RunWith(AndroidJUnit4.class)
@@ -82,8 +86,8 @@ public class NavBarHelperTest extends SysuiTestCase {
mNavBarHelper = new NavBarHelper(mContext, mAccessibilityManager, mNavBarHelper = new NavBarHelper(mContext, mAccessibilityManager,
mAccessibilityManagerWrapper, mAccessibilityButtonModeObserver, mAccessibilityManagerWrapper, mAccessibilityButtonModeObserver,
mOverviewProxyService, mAssistManagerLazy, mNavigationModeController, mOverviewProxyService, mAssistManagerLazy, () -> Optional.of(mock(StatusBar.class)),
mUserTracker, mDumpManager); mNavigationModeController, mUserTracker, mDumpManager);
} }

View File

@@ -23,17 +23,20 @@ import static android.inputmethodservice.InputMethodService.IME_INVISIBLE;
import static android.inputmethodservice.InputMethodService.IME_VISIBLE; import static android.inputmethodservice.InputMethodService.IME_VISIBLE;
import static android.view.Display.DEFAULT_DISPLAY; import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.DisplayAdjustments.DEFAULT_DISPLAY_ADJUSTMENTS; import static android.view.DisplayAdjustments.DEFAULT_DISPLAY_ADJUSTMENTS;
import static android.view.WindowInsets.Type.ime;
import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.HOME_BUTTON_LONG_PRESS_DURATION_MS; import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.HOME_BUTTON_LONG_PRESS_DURATION_MS;
import static com.android.systemui.navigationbar.NavigationBar.NavBarActionEvent.NAVBAR_ASSIST_LONGPRESS; import static com.android.systemui.navigationbar.NavigationBar.NavBarActionEvent.NAVBAR_ASSIST_LONGPRESS;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Matchers.eq; import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times; import static org.mockito.Mockito.times;
@@ -57,6 +60,7 @@ import android.view.Display;
import android.view.DisplayInfo; import android.view.DisplayInfo;
import android.view.MotionEvent; import android.view.MotionEvent;
import android.view.View; import android.view.View;
import android.view.WindowInsets;
import android.view.WindowManager; import android.view.WindowManager;
import android.view.WindowMetrics; import android.view.WindowMetrics;
import android.view.accessibility.AccessibilityManager; import android.view.accessibility.AccessibilityManager;
@@ -72,6 +76,7 @@ import com.android.systemui.accessibility.AccessibilityButtonModeObserver;
import com.android.systemui.accessibility.SystemActions; import com.android.systemui.accessibility.SystemActions;
import com.android.systemui.assist.AssistManager; import com.android.systemui.assist.AssistManager;
import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.model.SysUiState; import com.android.systemui.model.SysUiState;
import com.android.systemui.navigationbar.gestural.EdgeBackGestureHandler; import com.android.systemui.navigationbar.gestural.EdgeBackGestureHandler;
import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.plugins.statusbar.StatusBarStateController;
@@ -83,8 +88,10 @@ import com.android.systemui.statusbar.NotificationRemoteInputManager;
import com.android.systemui.statusbar.NotificationShadeDepthController; import com.android.systemui.statusbar.NotificationShadeDepthController;
import com.android.systemui.statusbar.phone.AutoHideController; import com.android.systemui.statusbar.phone.AutoHideController;
import com.android.systemui.statusbar.phone.LightBarController; 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.ShadeController;
import com.android.systemui.statusbar.phone.StatusBar; 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.DeviceProvisionedController;
import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.utils.leaks.LeakCheckedTest; import com.android.systemui.utils.leaks.LeakCheckedTest;
@@ -98,6 +105,7 @@ import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
import org.mockito.Spy;
import java.util.Optional; import java.util.Optional;
@@ -130,7 +138,6 @@ public class NavigationBarTest extends SysuiTestCase {
EdgeBackGestureHandler.Factory mEdgeBackGestureHandlerFactory; EdgeBackGestureHandler.Factory mEdgeBackGestureHandlerFactory;
@Mock @Mock
EdgeBackGestureHandler mEdgeBackGestureHandler; EdgeBackGestureHandler mEdgeBackGestureHandler;
@Mock
NavBarHelper mNavBarHelper; NavBarHelper mNavBarHelper;
@Mock @Mock
private LightBarController mLightBarController; private LightBarController mLightBarController;
@@ -148,6 +155,8 @@ public class NavigationBarTest extends SysuiTestCase {
private InputMethodManager mInputMethodManager; private InputMethodManager mInputMethodManager;
@Mock @Mock
private AssistManager mAssistManager; private AssistManager mAssistManager;
@Mock
private StatusBar mStatusBar;
@Rule @Rule
public final LeakCheckedTest.SysuiLeakCheck mLeakCheck = new LeakCheckedTest.SysuiLeakCheck(); public final LeakCheckedTest.SysuiLeakCheck mLeakCheck = new LeakCheckedTest.SysuiLeakCheck();
@@ -172,6 +181,12 @@ public class NavigationBarTest extends SysuiTestCase {
mDependency.injectTestDependency(OverviewProxyService.class, mOverviewProxyService); mDependency.injectTestDependency(OverviewProxyService.class, mOverviewProxyService);
mDependency.injectTestDependency(NavigationModeController.class, mNavigationModeController); mDependency.injectTestDependency(NavigationModeController.class, mNavigationModeController);
TestableLooper.get(this).runWithLooper(() -> { 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); mNavigationBar = createNavBar(mContext);
mExternalDisplayNavigationBar = createNavBar(mSysuiTestableContextExternal); mExternalDisplayNavigationBar = createNavBar(mSysuiTestableContextExternal);
}); });
@@ -256,6 +271,11 @@ public class NavigationBarTest extends SysuiTestCase {
// Create default & external NavBar fragment. // Create default & external NavBar fragment.
NavigationBar defaultNavBar = mNavigationBar; NavigationBar defaultNavBar = mNavigationBar;
NavigationBar externalNavBar = mExternalDisplayNavigationBar; NavigationBar externalNavBar = mExternalDisplayNavigationBar;
NotificationShadeWindowView mockShadeWindowView = mock(NotificationShadeWindowView.class);
WindowInsets windowInsets = new WindowInsets.Builder().setVisible(ime(), false).build();
doReturn(windowInsets).when(mockShadeWindowView).getRootWindowInsets();
doReturn(mockShadeWindowView).when(mStatusBar).getNotificationShadeWindowView();
doReturn(true).when(mockShadeWindowView).isAttachedToWindow();
doNothing().when(defaultNavBar).checkNavBarModes(); doNothing().when(defaultNavBar).checkNavBarModes();
doNothing().when(externalNavBar).checkNavBarModes(); doNothing().when(externalNavBar).checkNavBarModes();
defaultNavBar.createView(null); defaultNavBar.createView(null);
@@ -281,6 +301,40 @@ public class NavigationBarTest extends SysuiTestCase {
assertFalse((defaultNavBar.getNavigationIconHints() & NAVIGATION_HINT_IME_SHOWN) != 0); assertFalse((defaultNavBar.getNavigationIconHints() & NAVIGATION_HINT_IME_SHOWN) != 0);
} }
@Test
public void testSetImeWindowStatusWhenKeyguardLockingAndImeInsetsChange() {
NotificationShadeWindowView mockShadeWindowView = mock(NotificationShadeWindowView.class);
doReturn(mockShadeWindowView).when(mStatusBar).getNotificationShadeWindowView();
doReturn(true).when(mockShadeWindowView).isAttachedToWindow();
doNothing().when(mNavigationBar).checkNavBarModes();
mNavigationBar.createView(null);
WindowInsets windowInsets = new WindowInsets.Builder().setVisible(ime(), false).build();
doReturn(windowInsets).when(mockShadeWindowView).getRootWindowInsets();
// Verify navbar altered back icon when an app is showing IME
mNavigationBar.setImeWindowStatus(DEFAULT_DISPLAY, null, IME_VISIBLE,
BACK_DISPOSITION_DEFAULT, true);
assertTrue((mNavigationBar.getNavigationIconHints() & NAVIGATION_HINT_BACK_ALT) != 0);
assertTrue((mNavigationBar.getNavigationIconHints() & NAVIGATION_HINT_IME_SHOWN) != 0);
// Verify navbar didn't alter and showing back icon when the keyguard is showing without
// requesting IME insets visible.
doReturn(true).when(mStatusBar).isKeyguardShowing();
mNavigationBar.setImeWindowStatus(DEFAULT_DISPLAY, null, IME_VISIBLE,
BACK_DISPOSITION_DEFAULT, true);
assertFalse((mNavigationBar.getNavigationIconHints() & NAVIGATION_HINT_BACK_ALT) != 0);
assertFalse((mNavigationBar.getNavigationIconHints() & NAVIGATION_HINT_IME_SHOWN) != 0);
// Verify navbar altered and showing back icon when the keyguard is showing and
// requesting IME insets visible.
windowInsets = new WindowInsets.Builder().setVisible(ime(), true).build();
doReturn(windowInsets).when(mockShadeWindowView).getRootWindowInsets();
mNavigationBar.setImeWindowStatus(DEFAULT_DISPLAY, null, IME_VISIBLE,
BACK_DISPOSITION_DEFAULT, true);
assertTrue((mNavigationBar.getNavigationIconHints() & NAVIGATION_HINT_BACK_ALT) != 0);
assertTrue((mNavigationBar.getNavigationIconHints() & NAVIGATION_HINT_IME_SHOWN) != 0);
}
@Test @Test
public void testA11yEventAfterDetach() { public void testA11yEventAfterDetach() {
View v = mNavigationBar.createView(null); View v = mNavigationBar.createView(null);
@@ -314,7 +368,7 @@ public class NavigationBarTest extends SysuiTestCase {
Optional.of(mock(Pip.class)), Optional.of(mock(Pip.class)),
Optional.of(mock(LegacySplitScreen.class)), Optional.of(mock(LegacySplitScreen.class)),
Optional.of(mock(Recents.class)), Optional.of(mock(Recents.class)),
() -> Optional.of(mock(StatusBar.class)), () -> Optional.of(mStatusBar),
mock(ShadeController.class), mock(ShadeController.class),
mock(NotificationRemoteInputManager.class), mock(NotificationRemoteInputManager.class),
mock(NotificationShadeDepthController.class), mock(NotificationShadeDepthController.class),

View File

@@ -542,9 +542,6 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
*/ */
private InputMethodSubtype mCurrentSubtype; private InputMethodSubtype mCurrentSubtype;
// Was the keyguard locked when this client became current?
private boolean mCurClientInKeyguard;
/** /**
* {@code true} if the IME has not been mostly hidden via {@link android.view.InsetsController} * {@code true} if the IME has not been mostly hidden via {@link android.view.InsetsController}
*/ */
@@ -2363,14 +2360,9 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
mImeHiddenByDisplayPolicy = false; mImeHiddenByDisplayPolicy = false;
if (mCurClient != cs) { if (mCurClient != cs) {
// Was the keyguard locked when switching over to the new client?
mCurClientInKeyguard = isKeyguardLocked();
// If the client is changing, we need to switch over to the new // If the client is changing, we need to switch over to the new
// one. // one.
unbindCurrentClientLocked(UnbindReason.SWITCH_CLIENT); unbindCurrentClientLocked(UnbindReason.SWITCH_CLIENT);
if (DEBUG) Slog.v(TAG, "switching to client: client="
+ cs.client.asBinder() + " keyguard=" + mCurClientInKeyguard);
// If the screen is on, inform the new client it is active // If the screen is on, inform the new client it is active
if (mIsInteractive) { if (mIsInteractive) {
scheduleSetActiveToClient(cs, true /* active */, false /* fullscreen */, scheduleSetActiveToClient(cs, true /* active */, false /* fullscreen */,
@@ -2875,10 +2867,6 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
// all updateSystemUi happens on system previlege. // all updateSystemUi happens on system previlege.
final long ident = Binder.clearCallingIdentity(); final long ident = Binder.clearCallingIdentity();
try { try {
// apply policy for binder calls
if (vis != 0 && isKeyguardLocked() && !mCurClientInKeyguard) {
vis = 0;
}
if (!mCurPerceptible) { if (!mCurPerceptible) {
vis &= ~InputMethodService.IME_VISIBLE; vis &= ~InputMethodService.IME_VISIBLE;
} }