Loading packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcutListSearch.java +5 −4 Original line number Diff line number Diff line Loading @@ -97,7 +97,7 @@ import java.util.Map; public final class KeyboardShortcutListSearch { private static final String TAG = KeyboardShortcutListSearch.class.getSimpleName(); private static final Object sLock = new Object(); @VisibleForTesting static KeyboardShortcutListSearch sInstance; @VisibleForTesting public static KeyboardShortcutListSearch sInstance; private static int SHORTCUT_SYSTEM_INDEX = 0; private static int SHORTCUT_INPUT_INDEX = 1; Loading Loading @@ -136,7 +136,7 @@ public final class KeyboardShortcutListSearch { }; private final Handler mHandler = new Handler(Looper.getMainLooper()); @VisibleForTesting Context mContext; @VisibleForTesting public Context mContext; private final IPackageManager mPackageManager; @VisibleForTesting BottomSheetDialog mKeyboardShortcutsBottomSheetDialog; Loading Loading @@ -414,7 +414,7 @@ public final class KeyboardShortcutListSearch { private boolean mImeShortcutsReceived; @VisibleForTesting void showKeyboardShortcuts(int deviceId) { public void showKeyboardShortcuts(int deviceId) { retrieveKeyCharacterMap(deviceId); mAppShortcutsReceived = false; mImeShortcutsReceived = false; Loading Loading @@ -502,7 +502,8 @@ public final class KeyboardShortcutListSearch { return keyboardShortcutMultiMappingGroups; } private void dismissKeyboardShortcuts() { @VisibleForTesting public void dismissKeyboardShortcuts() { if (mKeyboardShortcutsBottomSheetDialog != null) { mKeyboardShortcutsBottomSheetDialog.dismiss(); mKeyboardShortcutsBottomSheetDialog = null; Loading packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcuts.java +5 −4 Original line number Diff line number Diff line Loading @@ -79,7 +79,7 @@ import java.util.List; public final class KeyboardShortcuts { private static final String TAG = KeyboardShortcuts.class.getSimpleName(); private static final Object sLock = new Object(); @VisibleForTesting static KeyboardShortcuts sInstance; @VisibleForTesting public static KeyboardShortcuts sInstance; private WindowManager mWindowManager; private final SparseArray<String> mSpecialCharacterNames = new SparseArray<>(); Loading @@ -93,7 +93,7 @@ public final class KeyboardShortcuts { }; private final Handler mHandler = new Handler(Looper.getMainLooper()); @VisibleForTesting Context mContext; @VisibleForTesting public Context mContext; private final IPackageManager mPackageManager; private final OnClickListener mDialogCloseListener = new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { Loading Loading @@ -373,7 +373,7 @@ public final class KeyboardShortcuts { } @VisibleForTesting void showKeyboardShortcuts(int deviceId) { public void showKeyboardShortcuts(int deviceId) { retrieveKeyCharacterMap(deviceId); mReceivedAppShortcutGroups = null; mReceivedImeShortcutGroups = null; Loading Loading @@ -407,7 +407,8 @@ public final class KeyboardShortcuts { showKeyboardShortcutsDialog(shortcutGroups); } private void dismissKeyboardShortcuts() { @VisibleForTesting public void dismissKeyboardShortcuts() { if (mKeyboardShortcutsDialog != null) { mKeyboardShortcutsDialog.dismiss(); mKeyboardShortcutsDialog = null; Loading packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcutsReceiver.java +13 −6 Original line number Diff line number Diff line Loading @@ -15,6 +15,8 @@ */ package com.android.systemui.statusbar; import static com.android.systemui.Flags.keyboardShortcutHelperRewrite; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; Loading @@ -25,21 +27,22 @@ import com.android.systemui.shared.recents.utilities.Utilities; import javax.inject.Inject; /** * Receiver for the Keyboard Shortcuts Helper. */ /** Receiver for the Keyboard Shortcuts Helper. */ public class KeyboardShortcutsReceiver extends BroadcastReceiver { private boolean mIsShortcutListSearchEnabled; private final FeatureFlags mFeatureFlags; @Inject public KeyboardShortcutsReceiver(FeatureFlags featureFlags) { mIsShortcutListSearchEnabled = featureFlags.isEnabled(Flags.SHORTCUT_LIST_SEARCH_LAYOUT); mFeatureFlags = featureFlags; } @Override public void onReceive(Context context, Intent intent) { if (mIsShortcutListSearchEnabled && Utilities.isLargeScreen(context)) { if (keyboardShortcutHelperRewrite()) { return; } if (isTabletLayoutFlagEnabled() && Utilities.isLargeScreen(context)) { if (Intent.ACTION_SHOW_KEYBOARD_SHORTCUTS.equals(intent.getAction())) { KeyboardShortcutListSearch.show(context, -1 /* deviceId unknown */); } else if (Intent.ACTION_DISMISS_KEYBOARD_SHORTCUTS.equals(intent.getAction())) { Loading @@ -53,4 +56,8 @@ public class KeyboardShortcutsReceiver extends BroadcastReceiver { } } } private boolean isTabletLayoutFlagEnabled() { return mFeatureFlags.isEnabled(Flags.SHORTCUT_LIST_SEARCH_LAYOUT); } } packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java +22 −12 Original line number Diff line number Diff line Loading @@ -26,10 +26,12 @@ import static androidx.core.view.ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_ import static androidx.lifecycle.Lifecycle.State.RESUMED; import static com.android.systemui.Dependency.TIME_TICK_HANDLER_NAME; import static com.android.systemui.Flags.keyboardShortcutHelperRewrite; import static com.android.systemui.Flags.lightRevealMigration; import static com.android.systemui.Flags.newAodTransition; import static com.android.systemui.Flags.truncatedStatusBarIconsFix; import static com.android.systemui.charging.WirelessChargingAnimation.UNKNOWN_BATTERY_LEVEL; import static com.android.systemui.flags.Flags.SHORTCUT_LIST_SEARCH_LAYOUT; import static com.android.systemui.statusbar.NotificationLockscreenUserManager.PERMISSION_SELF; import static com.android.systemui.statusbar.StatusBarState.SHADE; Loading Loading @@ -289,7 +291,6 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { private CentralSurfacesCommandQueueCallbacks mCommandQueueCallbacks; private float mTransitionToFullShadeProgress = 0f; private final NotificationListContainer mNotifListContainer; private final boolean mIsShortcutListSearchEnabled; private final KeyguardStateController.Callback mKeyguardStateControllerCallback = new KeyguardStateController.Callback() { Loading Loading @@ -789,7 +790,6 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { mStatusBarSignalPolicy = statusBarSignalPolicy; mStatusBarHideIconsForBouncerManager = statusBarHideIconsForBouncerManager; mFeatureFlags = featureFlags; mIsShortcutListSearchEnabled = featureFlags.isEnabled(Flags.SHORTCUT_LIST_SEARCH_LAYOUT); mKeyguardUnlockAnimationController = keyguardUnlockAnimationController; mMainExecutor = delayableExecutor; mMessageRouter = messageRouter; Loading Loading @@ -820,10 +820,13 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { // TODO(b/190746471): Find a better home for this. DateTimeView.setReceiverHandler(timeTickHandler); mMessageRouter.subscribeTo(KeyboardShortcutsMessage.class, if (!keyboardShortcutHelperRewrite()) { mMessageRouter.subscribeTo( KeyboardShortcutsMessage.class, data -> toggleKeyboardShortcuts(data.mDeviceId)); mMessageRouter.subscribeTo(MSG_DISMISS_KEYBOARD_SHORTCUTS_MENU, id -> dismissKeyboardShortcuts()); mMessageRouter.subscribeTo( MSG_DISMISS_KEYBOARD_SHORTCUTS_MENU, id -> dismissKeyboardShortcuts()); } mMessageRouter.subscribeTo(AnimateExpandSettingsPanelMessage.class, data -> mCommandQueueCallbacks.animateExpandSettingsPanel(data.mSubpanel)); mMessageRouter.subscribeTo(MSG_LAUNCH_TRANSITION_TIMEOUT, Loading Loading @@ -1872,11 +1875,13 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { String action = intent.getAction(); String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY); if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action)) { if (mIsShortcutListSearchEnabled && Utilities.isLargeScreen(mContext)) { if (!keyboardShortcutHelperRewrite()) { if (shouldUseTabletKeyboardShortcuts()) { KeyboardShortcutListSearch.dismiss(); } else { KeyboardShortcuts.dismiss(); } } mRemoteInputManager.closeRemoteInputs(); if (mLockscreenUserManager.isCurrentProfile(getSendingUserId())) { mShadeLogger.d("ACTION_CLOSE_SYSTEM_DIALOGS intent: closing shade"); Loading Loading @@ -2945,7 +2950,7 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { } protected void toggleKeyboardShortcuts(int deviceId) { if (mIsShortcutListSearchEnabled && Utilities.isLargeScreen(mContext)) { if (shouldUseTabletKeyboardShortcuts()) { KeyboardShortcutListSearch.toggle(mContext, deviceId); } else { KeyboardShortcuts.toggle(mContext, deviceId); Loading @@ -2953,13 +2958,18 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { } protected void dismissKeyboardShortcuts() { if (mIsShortcutListSearchEnabled && Utilities.isLargeScreen(mContext)) { if (shouldUseTabletKeyboardShortcuts()) { KeyboardShortcutListSearch.dismiss(); } else { KeyboardShortcuts.dismiss(); } } private boolean shouldUseTabletKeyboardShortcuts() { return mFeatureFlags.isEnabled(SHORTCUT_LIST_SEARCH_LAYOUT) && Utilities.isLargeScreen(mContext); } private void clearNotificationEffects() { try { mBarService.clearNotificationEffects(); Loading packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyboardShortcutsReceiverTest.java +78 −37 Original line number Diff line number Diff line Loading @@ -16,120 +16,161 @@ package com.android.systemui.statusbar; import static com.android.systemui.Flags.FLAG_KEYBOARD_SHORTCUT_HELPER_REWRITE; import static org.mockito.Mockito.anyInt; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when; import android.content.Intent; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; import com.android.dx.mockito.inline.extended.ExtendedMockito; import com.android.dx.mockito.inline.extended.StaticMockitoSession; import com.android.systemui.SysuiTestCase; import com.android.systemui.flags.FakeFeatureFlags; import com.android.systemui.flags.Flags; import com.android.systemui.shared.recents.utilities.Utilities; import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoSession; import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoRule; import org.mockito.MockitoAnnotations; import org.mockito.quality.Strictness; @SmallTest @RunWith(AndroidJUnit4.class) public class KeyboardShortcutsReceiverTest extends SysuiTestCase { @Rule public MockitoRule mockito = MockitoJUnit.rule(); private static final Intent SHOW_INTENT = new Intent(Intent.ACTION_SHOW_KEYBOARD_SHORTCUTS); private static final Intent DISMISS_INTENT = new Intent(Intent.ACTION_DISMISS_KEYBOARD_SHORTCUTS); private StaticMockitoSession mockitoSession; private KeyboardShortcutsReceiver mKeyboardShortcutsReceiver; private Intent mIntent; private FakeFeatureFlags mFeatureFlags = new FakeFeatureFlags(); private final FakeFeatureFlags mFeatureFlags = new FakeFeatureFlags(); @Mock private KeyboardShortcuts mKeyboardShortcuts; @Mock private KeyboardShortcutListSearch mKeyboardShortcutListSearch; @Before public void setUp() { mIntent = new Intent(Intent.ACTION_SHOW_KEYBOARD_SHORTCUTS); MockitoAnnotations.initMocks(this); mSetFlagsRule.disableFlags(FLAG_KEYBOARD_SHORTCUT_HELPER_REWRITE); mKeyboardShortcuts.mContext = mContext; mKeyboardShortcutListSearch.mContext = mContext; KeyboardShortcuts.sInstance = mKeyboardShortcuts; KeyboardShortcutListSearch.sInstance = mKeyboardShortcutListSearch; mKeyboardShortcutsReceiver = spy(new KeyboardShortcutsReceiver(mFeatureFlags)); } @Test public void onReceive_whenFlagOffDeviceIsTablet_showKeyboardShortcuts() { MockitoSession mockitoSession = ExtendedMockito.mockitoSession() @Before public void startStaticMocking() { mockitoSession = ExtendedMockito.mockitoSession() .spyStatic(Utilities.class) .strictness(Strictness.LENIENT) .startMocking(); } @After public void endStaticMocking() { mockitoSession.finishMocking(); } @Test public void onReceive_whenFlagOffDeviceIsTablet_showKeyboardShortcuts() { mFeatureFlags.set(Flags.SHORTCUT_LIST_SEARCH_LAYOUT, false); mKeyboardShortcutsReceiver = spy(new KeyboardShortcutsReceiver(mFeatureFlags)); when(Utilities.isLargeScreen(mContext)).thenReturn(true); mKeyboardShortcutsReceiver.onReceive(mContext, mIntent); mKeyboardShortcutsReceiver.onReceive(mContext, SHOW_INTENT); verify(mKeyboardShortcuts).showKeyboardShortcuts(anyInt()); verify(mKeyboardShortcutListSearch, never()).showKeyboardShortcuts(anyInt()); mockitoSession.finishMocking(); } @Test public void onReceive_whenFlagOffDeviceIsNotTablet_showKeyboardShortcuts() { MockitoSession mockitoSession = ExtendedMockito.mockitoSession() .spyStatic(Utilities.class) .strictness(Strictness.LENIENT) .startMocking(); mFeatureFlags.set(Flags.SHORTCUT_LIST_SEARCH_LAYOUT, false); mKeyboardShortcutsReceiver = spy(new KeyboardShortcutsReceiver(mFeatureFlags)); when(Utilities.isLargeScreen(mContext)).thenReturn(false); mKeyboardShortcutsReceiver.onReceive(mContext, mIntent); mKeyboardShortcutsReceiver.onReceive(mContext, SHOW_INTENT); verify(mKeyboardShortcuts).showKeyboardShortcuts(anyInt()); verify(mKeyboardShortcutListSearch, never()).showKeyboardShortcuts(anyInt()); mockitoSession.finishMocking(); } @Test public void onReceive_whenFlagOnDeviceIsTablet_showKeyboardShortcutListSearch() { MockitoSession mockitoSession = ExtendedMockito.mockitoSession() .spyStatic(Utilities.class) .strictness(Strictness.LENIENT) .startMocking(); mFeatureFlags.set(Flags.SHORTCUT_LIST_SEARCH_LAYOUT, true); mKeyboardShortcutsReceiver = spy(new KeyboardShortcutsReceiver(mFeatureFlags)); when(Utilities.isLargeScreen(mContext)).thenReturn(true); mKeyboardShortcutsReceiver.onReceive(mContext, mIntent); mKeyboardShortcutsReceiver.onReceive(mContext, SHOW_INTENT); verify(mKeyboardShortcuts, never()).showKeyboardShortcuts(anyInt()); verify(mKeyboardShortcutListSearch).showKeyboardShortcuts(anyInt()); mockitoSession.finishMocking(); } @Test public void onReceive_whenFlagOnDeviceIsNotTablet_showKeyboardShortcuts() { MockitoSession mockitoSession = ExtendedMockito.mockitoSession() .spyStatic(Utilities.class) .strictness(Strictness.LENIENT) .startMocking(); mFeatureFlags.set(Flags.SHORTCUT_LIST_SEARCH_LAYOUT, true); mKeyboardShortcutsReceiver = spy(new KeyboardShortcutsReceiver(mFeatureFlags)); when(Utilities.isLargeScreen(mContext)).thenReturn(false); mKeyboardShortcutsReceiver.onReceive(mContext, mIntent); mKeyboardShortcutsReceiver.onReceive(mContext, SHOW_INTENT); verify(mKeyboardShortcuts).showKeyboardShortcuts(anyInt()); verify(mKeyboardShortcutListSearch, never()).showKeyboardShortcuts(anyInt()); mockitoSession.finishMocking(); } @Test public void onShowIntent_rewriteFlagOn_oldFlagOn_isLargeScreen_doesNotLaunchOldVersions() { mFeatureFlags.set(Flags.SHORTCUT_LIST_SEARCH_LAYOUT, true); mSetFlagsRule.enableFlags(FLAG_KEYBOARD_SHORTCUT_HELPER_REWRITE); when(Utilities.isLargeScreen(mContext)).thenReturn(true); mKeyboardShortcutsReceiver.onReceive(mContext, SHOW_INTENT); verifyZeroInteractions(mKeyboardShortcuts, mKeyboardShortcutListSearch); } @Test public void onShowIntent_rewriteFlagOn_oldFlagOn_isSmallScreen_doesNotLaunchOldVersions() { mFeatureFlags.set(Flags.SHORTCUT_LIST_SEARCH_LAYOUT, true); mSetFlagsRule.enableFlags(FLAG_KEYBOARD_SHORTCUT_HELPER_REWRITE); when(Utilities.isLargeScreen(mContext)).thenReturn(false); mKeyboardShortcutsReceiver.onReceive(mContext, SHOW_INTENT); verifyZeroInteractions(mKeyboardShortcuts, mKeyboardShortcutListSearch); } @Test public void onDismissIntent_rewriteFlagOn_oldFlagOn_isLargeScreen_doesNotDismissOldVersions() { mFeatureFlags.set(Flags.SHORTCUT_LIST_SEARCH_LAYOUT, true); mSetFlagsRule.enableFlags(FLAG_KEYBOARD_SHORTCUT_HELPER_REWRITE); when(Utilities.isLargeScreen(mContext)).thenReturn(true); mKeyboardShortcutsReceiver.onReceive(mContext, DISMISS_INTENT); verifyZeroInteractions(mKeyboardShortcuts, mKeyboardShortcutListSearch); } @Test public void onDismissIntent_rewriteFlagOn_oldFlagOn_isSmallScreen_doesNotDismissOldVersions() { mFeatureFlags.set(Flags.SHORTCUT_LIST_SEARCH_LAYOUT, true); mSetFlagsRule.enableFlags(FLAG_KEYBOARD_SHORTCUT_HELPER_REWRITE); when(Utilities.isLargeScreen(mContext)).thenReturn(false); mKeyboardShortcutsReceiver.onReceive(mContext, DISMISS_INTENT); verifyZeroInteractions(mKeyboardShortcuts, mKeyboardShortcutListSearch); } } Loading
packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcutListSearch.java +5 −4 Original line number Diff line number Diff line Loading @@ -97,7 +97,7 @@ import java.util.Map; public final class KeyboardShortcutListSearch { private static final String TAG = KeyboardShortcutListSearch.class.getSimpleName(); private static final Object sLock = new Object(); @VisibleForTesting static KeyboardShortcutListSearch sInstance; @VisibleForTesting public static KeyboardShortcutListSearch sInstance; private static int SHORTCUT_SYSTEM_INDEX = 0; private static int SHORTCUT_INPUT_INDEX = 1; Loading Loading @@ -136,7 +136,7 @@ public final class KeyboardShortcutListSearch { }; private final Handler mHandler = new Handler(Looper.getMainLooper()); @VisibleForTesting Context mContext; @VisibleForTesting public Context mContext; private final IPackageManager mPackageManager; @VisibleForTesting BottomSheetDialog mKeyboardShortcutsBottomSheetDialog; Loading Loading @@ -414,7 +414,7 @@ public final class KeyboardShortcutListSearch { private boolean mImeShortcutsReceived; @VisibleForTesting void showKeyboardShortcuts(int deviceId) { public void showKeyboardShortcuts(int deviceId) { retrieveKeyCharacterMap(deviceId); mAppShortcutsReceived = false; mImeShortcutsReceived = false; Loading Loading @@ -502,7 +502,8 @@ public final class KeyboardShortcutListSearch { return keyboardShortcutMultiMappingGroups; } private void dismissKeyboardShortcuts() { @VisibleForTesting public void dismissKeyboardShortcuts() { if (mKeyboardShortcutsBottomSheetDialog != null) { mKeyboardShortcutsBottomSheetDialog.dismiss(); mKeyboardShortcutsBottomSheetDialog = null; Loading
packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcuts.java +5 −4 Original line number Diff line number Diff line Loading @@ -79,7 +79,7 @@ import java.util.List; public final class KeyboardShortcuts { private static final String TAG = KeyboardShortcuts.class.getSimpleName(); private static final Object sLock = new Object(); @VisibleForTesting static KeyboardShortcuts sInstance; @VisibleForTesting public static KeyboardShortcuts sInstance; private WindowManager mWindowManager; private final SparseArray<String> mSpecialCharacterNames = new SparseArray<>(); Loading @@ -93,7 +93,7 @@ public final class KeyboardShortcuts { }; private final Handler mHandler = new Handler(Looper.getMainLooper()); @VisibleForTesting Context mContext; @VisibleForTesting public Context mContext; private final IPackageManager mPackageManager; private final OnClickListener mDialogCloseListener = new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { Loading Loading @@ -373,7 +373,7 @@ public final class KeyboardShortcuts { } @VisibleForTesting void showKeyboardShortcuts(int deviceId) { public void showKeyboardShortcuts(int deviceId) { retrieveKeyCharacterMap(deviceId); mReceivedAppShortcutGroups = null; mReceivedImeShortcutGroups = null; Loading Loading @@ -407,7 +407,8 @@ public final class KeyboardShortcuts { showKeyboardShortcutsDialog(shortcutGroups); } private void dismissKeyboardShortcuts() { @VisibleForTesting public void dismissKeyboardShortcuts() { if (mKeyboardShortcutsDialog != null) { mKeyboardShortcutsDialog.dismiss(); mKeyboardShortcutsDialog = null; Loading
packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcutsReceiver.java +13 −6 Original line number Diff line number Diff line Loading @@ -15,6 +15,8 @@ */ package com.android.systemui.statusbar; import static com.android.systemui.Flags.keyboardShortcutHelperRewrite; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; Loading @@ -25,21 +27,22 @@ import com.android.systemui.shared.recents.utilities.Utilities; import javax.inject.Inject; /** * Receiver for the Keyboard Shortcuts Helper. */ /** Receiver for the Keyboard Shortcuts Helper. */ public class KeyboardShortcutsReceiver extends BroadcastReceiver { private boolean mIsShortcutListSearchEnabled; private final FeatureFlags mFeatureFlags; @Inject public KeyboardShortcutsReceiver(FeatureFlags featureFlags) { mIsShortcutListSearchEnabled = featureFlags.isEnabled(Flags.SHORTCUT_LIST_SEARCH_LAYOUT); mFeatureFlags = featureFlags; } @Override public void onReceive(Context context, Intent intent) { if (mIsShortcutListSearchEnabled && Utilities.isLargeScreen(context)) { if (keyboardShortcutHelperRewrite()) { return; } if (isTabletLayoutFlagEnabled() && Utilities.isLargeScreen(context)) { if (Intent.ACTION_SHOW_KEYBOARD_SHORTCUTS.equals(intent.getAction())) { KeyboardShortcutListSearch.show(context, -1 /* deviceId unknown */); } else if (Intent.ACTION_DISMISS_KEYBOARD_SHORTCUTS.equals(intent.getAction())) { Loading @@ -53,4 +56,8 @@ public class KeyboardShortcutsReceiver extends BroadcastReceiver { } } } private boolean isTabletLayoutFlagEnabled() { return mFeatureFlags.isEnabled(Flags.SHORTCUT_LIST_SEARCH_LAYOUT); } }
packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java +22 −12 Original line number Diff line number Diff line Loading @@ -26,10 +26,12 @@ import static androidx.core.view.ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_ import static androidx.lifecycle.Lifecycle.State.RESUMED; import static com.android.systemui.Dependency.TIME_TICK_HANDLER_NAME; import static com.android.systemui.Flags.keyboardShortcutHelperRewrite; import static com.android.systemui.Flags.lightRevealMigration; import static com.android.systemui.Flags.newAodTransition; import static com.android.systemui.Flags.truncatedStatusBarIconsFix; import static com.android.systemui.charging.WirelessChargingAnimation.UNKNOWN_BATTERY_LEVEL; import static com.android.systemui.flags.Flags.SHORTCUT_LIST_SEARCH_LAYOUT; import static com.android.systemui.statusbar.NotificationLockscreenUserManager.PERMISSION_SELF; import static com.android.systemui.statusbar.StatusBarState.SHADE; Loading Loading @@ -289,7 +291,6 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { private CentralSurfacesCommandQueueCallbacks mCommandQueueCallbacks; private float mTransitionToFullShadeProgress = 0f; private final NotificationListContainer mNotifListContainer; private final boolean mIsShortcutListSearchEnabled; private final KeyguardStateController.Callback mKeyguardStateControllerCallback = new KeyguardStateController.Callback() { Loading Loading @@ -789,7 +790,6 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { mStatusBarSignalPolicy = statusBarSignalPolicy; mStatusBarHideIconsForBouncerManager = statusBarHideIconsForBouncerManager; mFeatureFlags = featureFlags; mIsShortcutListSearchEnabled = featureFlags.isEnabled(Flags.SHORTCUT_LIST_SEARCH_LAYOUT); mKeyguardUnlockAnimationController = keyguardUnlockAnimationController; mMainExecutor = delayableExecutor; mMessageRouter = messageRouter; Loading Loading @@ -820,10 +820,13 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { // TODO(b/190746471): Find a better home for this. DateTimeView.setReceiverHandler(timeTickHandler); mMessageRouter.subscribeTo(KeyboardShortcutsMessage.class, if (!keyboardShortcutHelperRewrite()) { mMessageRouter.subscribeTo( KeyboardShortcutsMessage.class, data -> toggleKeyboardShortcuts(data.mDeviceId)); mMessageRouter.subscribeTo(MSG_DISMISS_KEYBOARD_SHORTCUTS_MENU, id -> dismissKeyboardShortcuts()); mMessageRouter.subscribeTo( MSG_DISMISS_KEYBOARD_SHORTCUTS_MENU, id -> dismissKeyboardShortcuts()); } mMessageRouter.subscribeTo(AnimateExpandSettingsPanelMessage.class, data -> mCommandQueueCallbacks.animateExpandSettingsPanel(data.mSubpanel)); mMessageRouter.subscribeTo(MSG_LAUNCH_TRANSITION_TIMEOUT, Loading Loading @@ -1872,11 +1875,13 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { String action = intent.getAction(); String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY); if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action)) { if (mIsShortcutListSearchEnabled && Utilities.isLargeScreen(mContext)) { if (!keyboardShortcutHelperRewrite()) { if (shouldUseTabletKeyboardShortcuts()) { KeyboardShortcutListSearch.dismiss(); } else { KeyboardShortcuts.dismiss(); } } mRemoteInputManager.closeRemoteInputs(); if (mLockscreenUserManager.isCurrentProfile(getSendingUserId())) { mShadeLogger.d("ACTION_CLOSE_SYSTEM_DIALOGS intent: closing shade"); Loading Loading @@ -2945,7 +2950,7 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { } protected void toggleKeyboardShortcuts(int deviceId) { if (mIsShortcutListSearchEnabled && Utilities.isLargeScreen(mContext)) { if (shouldUseTabletKeyboardShortcuts()) { KeyboardShortcutListSearch.toggle(mContext, deviceId); } else { KeyboardShortcuts.toggle(mContext, deviceId); Loading @@ -2953,13 +2958,18 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { } protected void dismissKeyboardShortcuts() { if (mIsShortcutListSearchEnabled && Utilities.isLargeScreen(mContext)) { if (shouldUseTabletKeyboardShortcuts()) { KeyboardShortcutListSearch.dismiss(); } else { KeyboardShortcuts.dismiss(); } } private boolean shouldUseTabletKeyboardShortcuts() { return mFeatureFlags.isEnabled(SHORTCUT_LIST_SEARCH_LAYOUT) && Utilities.isLargeScreen(mContext); } private void clearNotificationEffects() { try { mBarService.clearNotificationEffects(); Loading
packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyboardShortcutsReceiverTest.java +78 −37 Original line number Diff line number Diff line Loading @@ -16,120 +16,161 @@ package com.android.systemui.statusbar; import static com.android.systemui.Flags.FLAG_KEYBOARD_SHORTCUT_HELPER_REWRITE; import static org.mockito.Mockito.anyInt; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when; import android.content.Intent; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; import com.android.dx.mockito.inline.extended.ExtendedMockito; import com.android.dx.mockito.inline.extended.StaticMockitoSession; import com.android.systemui.SysuiTestCase; import com.android.systemui.flags.FakeFeatureFlags; import com.android.systemui.flags.Flags; import com.android.systemui.shared.recents.utilities.Utilities; import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoSession; import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoRule; import org.mockito.MockitoAnnotations; import org.mockito.quality.Strictness; @SmallTest @RunWith(AndroidJUnit4.class) public class KeyboardShortcutsReceiverTest extends SysuiTestCase { @Rule public MockitoRule mockito = MockitoJUnit.rule(); private static final Intent SHOW_INTENT = new Intent(Intent.ACTION_SHOW_KEYBOARD_SHORTCUTS); private static final Intent DISMISS_INTENT = new Intent(Intent.ACTION_DISMISS_KEYBOARD_SHORTCUTS); private StaticMockitoSession mockitoSession; private KeyboardShortcutsReceiver mKeyboardShortcutsReceiver; private Intent mIntent; private FakeFeatureFlags mFeatureFlags = new FakeFeatureFlags(); private final FakeFeatureFlags mFeatureFlags = new FakeFeatureFlags(); @Mock private KeyboardShortcuts mKeyboardShortcuts; @Mock private KeyboardShortcutListSearch mKeyboardShortcutListSearch; @Before public void setUp() { mIntent = new Intent(Intent.ACTION_SHOW_KEYBOARD_SHORTCUTS); MockitoAnnotations.initMocks(this); mSetFlagsRule.disableFlags(FLAG_KEYBOARD_SHORTCUT_HELPER_REWRITE); mKeyboardShortcuts.mContext = mContext; mKeyboardShortcutListSearch.mContext = mContext; KeyboardShortcuts.sInstance = mKeyboardShortcuts; KeyboardShortcutListSearch.sInstance = mKeyboardShortcutListSearch; mKeyboardShortcutsReceiver = spy(new KeyboardShortcutsReceiver(mFeatureFlags)); } @Test public void onReceive_whenFlagOffDeviceIsTablet_showKeyboardShortcuts() { MockitoSession mockitoSession = ExtendedMockito.mockitoSession() @Before public void startStaticMocking() { mockitoSession = ExtendedMockito.mockitoSession() .spyStatic(Utilities.class) .strictness(Strictness.LENIENT) .startMocking(); } @After public void endStaticMocking() { mockitoSession.finishMocking(); } @Test public void onReceive_whenFlagOffDeviceIsTablet_showKeyboardShortcuts() { mFeatureFlags.set(Flags.SHORTCUT_LIST_SEARCH_LAYOUT, false); mKeyboardShortcutsReceiver = spy(new KeyboardShortcutsReceiver(mFeatureFlags)); when(Utilities.isLargeScreen(mContext)).thenReturn(true); mKeyboardShortcutsReceiver.onReceive(mContext, mIntent); mKeyboardShortcutsReceiver.onReceive(mContext, SHOW_INTENT); verify(mKeyboardShortcuts).showKeyboardShortcuts(anyInt()); verify(mKeyboardShortcutListSearch, never()).showKeyboardShortcuts(anyInt()); mockitoSession.finishMocking(); } @Test public void onReceive_whenFlagOffDeviceIsNotTablet_showKeyboardShortcuts() { MockitoSession mockitoSession = ExtendedMockito.mockitoSession() .spyStatic(Utilities.class) .strictness(Strictness.LENIENT) .startMocking(); mFeatureFlags.set(Flags.SHORTCUT_LIST_SEARCH_LAYOUT, false); mKeyboardShortcutsReceiver = spy(new KeyboardShortcutsReceiver(mFeatureFlags)); when(Utilities.isLargeScreen(mContext)).thenReturn(false); mKeyboardShortcutsReceiver.onReceive(mContext, mIntent); mKeyboardShortcutsReceiver.onReceive(mContext, SHOW_INTENT); verify(mKeyboardShortcuts).showKeyboardShortcuts(anyInt()); verify(mKeyboardShortcutListSearch, never()).showKeyboardShortcuts(anyInt()); mockitoSession.finishMocking(); } @Test public void onReceive_whenFlagOnDeviceIsTablet_showKeyboardShortcutListSearch() { MockitoSession mockitoSession = ExtendedMockito.mockitoSession() .spyStatic(Utilities.class) .strictness(Strictness.LENIENT) .startMocking(); mFeatureFlags.set(Flags.SHORTCUT_LIST_SEARCH_LAYOUT, true); mKeyboardShortcutsReceiver = spy(new KeyboardShortcutsReceiver(mFeatureFlags)); when(Utilities.isLargeScreen(mContext)).thenReturn(true); mKeyboardShortcutsReceiver.onReceive(mContext, mIntent); mKeyboardShortcutsReceiver.onReceive(mContext, SHOW_INTENT); verify(mKeyboardShortcuts, never()).showKeyboardShortcuts(anyInt()); verify(mKeyboardShortcutListSearch).showKeyboardShortcuts(anyInt()); mockitoSession.finishMocking(); } @Test public void onReceive_whenFlagOnDeviceIsNotTablet_showKeyboardShortcuts() { MockitoSession mockitoSession = ExtendedMockito.mockitoSession() .spyStatic(Utilities.class) .strictness(Strictness.LENIENT) .startMocking(); mFeatureFlags.set(Flags.SHORTCUT_LIST_SEARCH_LAYOUT, true); mKeyboardShortcutsReceiver = spy(new KeyboardShortcutsReceiver(mFeatureFlags)); when(Utilities.isLargeScreen(mContext)).thenReturn(false); mKeyboardShortcutsReceiver.onReceive(mContext, mIntent); mKeyboardShortcutsReceiver.onReceive(mContext, SHOW_INTENT); verify(mKeyboardShortcuts).showKeyboardShortcuts(anyInt()); verify(mKeyboardShortcutListSearch, never()).showKeyboardShortcuts(anyInt()); mockitoSession.finishMocking(); } @Test public void onShowIntent_rewriteFlagOn_oldFlagOn_isLargeScreen_doesNotLaunchOldVersions() { mFeatureFlags.set(Flags.SHORTCUT_LIST_SEARCH_LAYOUT, true); mSetFlagsRule.enableFlags(FLAG_KEYBOARD_SHORTCUT_HELPER_REWRITE); when(Utilities.isLargeScreen(mContext)).thenReturn(true); mKeyboardShortcutsReceiver.onReceive(mContext, SHOW_INTENT); verifyZeroInteractions(mKeyboardShortcuts, mKeyboardShortcutListSearch); } @Test public void onShowIntent_rewriteFlagOn_oldFlagOn_isSmallScreen_doesNotLaunchOldVersions() { mFeatureFlags.set(Flags.SHORTCUT_LIST_SEARCH_LAYOUT, true); mSetFlagsRule.enableFlags(FLAG_KEYBOARD_SHORTCUT_HELPER_REWRITE); when(Utilities.isLargeScreen(mContext)).thenReturn(false); mKeyboardShortcutsReceiver.onReceive(mContext, SHOW_INTENT); verifyZeroInteractions(mKeyboardShortcuts, mKeyboardShortcutListSearch); } @Test public void onDismissIntent_rewriteFlagOn_oldFlagOn_isLargeScreen_doesNotDismissOldVersions() { mFeatureFlags.set(Flags.SHORTCUT_LIST_SEARCH_LAYOUT, true); mSetFlagsRule.enableFlags(FLAG_KEYBOARD_SHORTCUT_HELPER_REWRITE); when(Utilities.isLargeScreen(mContext)).thenReturn(true); mKeyboardShortcutsReceiver.onReceive(mContext, DISMISS_INTENT); verifyZeroInteractions(mKeyboardShortcuts, mKeyboardShortcutListSearch); } @Test public void onDismissIntent_rewriteFlagOn_oldFlagOn_isSmallScreen_doesNotDismissOldVersions() { mFeatureFlags.set(Flags.SHORTCUT_LIST_SEARCH_LAYOUT, true); mSetFlagsRule.enableFlags(FLAG_KEYBOARD_SHORTCUT_HELPER_REWRITE); when(Utilities.isLargeScreen(mContext)).thenReturn(false); mKeyboardShortcutsReceiver.onReceive(mContext, DISMISS_INTENT); verifyZeroInteractions(mKeyboardShortcuts, mKeyboardShortcutListSearch); } }