diff options
12 files changed, 96 insertions, 0 deletions
diff --git a/packages/SystemUI/Android.bp b/packages/SystemUI/Android.bp index e40fcb2a633b..00e1f1ca9ece 100644 --- a/packages/SystemUI/Android.bp +++ b/packages/SystemUI/Android.bp @@ -435,6 +435,7 @@ android_library { "SystemUI-statsd", "SettingsLib", "com_android_systemui_flags_lib", + "flag-junit-base", "androidx.viewpager2_viewpager2", "androidx.legacy_legacy-support-v4", "androidx.recyclerview_recyclerview", diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenuControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenuControllerTest.java index 3da72618fb60..5346db1aa067 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenuControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenuControllerTest.java @@ -19,6 +19,9 @@ package com.android.systemui.accessibility.floatingmenu; import static android.provider.Settings.Secure.ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU; import static android.provider.Settings.Secure.ACCESSIBILITY_BUTTON_MODE_NAVIGATION_BAR; +import static com.android.systemui.Flags.FLAG_FLOATING_MENU_OVERLAPS_NAV_BARS_FLAG; +import static com.android.systemui.flags.SetFlagsRuleExtensionsKt.setFlagDefault; + import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; @@ -87,6 +90,7 @@ public class AccessibilityFloatingMenuControllerTest extends SysuiTestCase { @Before public void setUp() throws Exception { + setFlagDefault(mSetFlagsRule, FLAG_FLOATING_MENU_OVERLAPS_NAV_BARS_FLAG); MockitoAnnotations.initMocks(this); mContextWrapper = new ContextWrapper(mContext) { @Override diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/DismissAnimationControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/DismissAnimationControllerTest.java index fd258e38a00f..3b2ea0f5ce86 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/DismissAnimationControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/DismissAnimationControllerTest.java @@ -16,6 +16,9 @@ package com.android.systemui.accessibility.floatingmenu; +import static com.android.systemui.Flags.FLAG_FLOATING_MENU_OVERLAPS_NAV_BARS_FLAG; +import static com.android.systemui.flags.SetFlagsRuleExtensionsKt.setFlagDefault; + import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; @@ -56,6 +59,7 @@ public class DismissAnimationControllerTest extends SysuiTestCase { @Before public void setUp() throws Exception { + setFlagDefault(mSetFlagsRule, FLAG_FLOATING_MENU_OVERLAPS_NAV_BARS_FLAG); final WindowManager stubWindowManager = mContext.getSystemService(WindowManager.class); final MenuViewModel stubMenuViewModel = new MenuViewModel(mContext, mAccessibilityManager, mock(SecureSettings.class)); diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuAnimationControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuAnimationControllerTest.java index 3a8bcd0ec2f0..76a3153e648a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuAnimationControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuAnimationControllerTest.java @@ -16,6 +16,9 @@ package com.android.systemui.accessibility.floatingmenu; +import static com.android.systemui.Flags.FLAG_FLOATING_MENU_OVERLAPS_NAV_BARS_FLAG; +import static com.android.systemui.flags.SetFlagsRuleExtensionsKt.setFlagDefault; + import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.any; @@ -75,6 +78,7 @@ public class MenuAnimationControllerTest extends SysuiTestCase { @Before public void setUp() throws Exception { + setFlagDefault(mSetFlagsRule, FLAG_FLOATING_MENU_OVERLAPS_NAV_BARS_FLAG); final WindowManager stubWindowManager = mContext.getSystemService(WindowManager.class); final MenuViewAppearance stubMenuViewAppearance = new MenuViewAppearance(mContext, stubWindowManager); @@ -96,6 +100,7 @@ public class MenuAnimationControllerTest extends SysuiTestCase { Prefs.putBoolean(mContext, Prefs.Key.HAS_ACCESSIBILITY_FLOATING_MENU_TUCKED, mLastIsMoveToTucked); mEndListenerCaptor.getAllValues().clear(); + mMenuAnimationController.mPositionAnimations.values().forEach(DynamicAnimation::cancel); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuEduTooltipViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuEduTooltipViewTest.java index 9b819479ec70..83bcd8d50407 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuEduTooltipViewTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuEduTooltipViewTest.java @@ -16,6 +16,9 @@ package com.android.systemui.accessibility.floatingmenu; +import static com.android.systemui.Flags.FLAG_FLOATING_MENU_OVERLAPS_NAV_BARS_FLAG; +import static com.android.systemui.flags.SetFlagsRuleExtensionsKt.setFlagDefault; + import static com.google.common.truth.Truth.assertThat; import android.content.res.Resources; @@ -43,6 +46,7 @@ public class MenuEduTooltipViewTest extends SysuiTestCase { @Before public void setUp() throws Exception { + setFlagDefault(mSetFlagsRule, FLAG_FLOATING_MENU_OVERLAPS_NAV_BARS_FLAG); final WindowManager windowManager = mContext.getSystemService(WindowManager.class); mMenuViewAppearance = new MenuViewAppearance(mContext, windowManager); mMenuEduTooltipView = new MenuEduTooltipView(mContext, mMenuViewAppearance); diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuItemAccessibilityDelegateTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuItemAccessibilityDelegateTest.java index 5764839d160d..e01f1b76df79 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuItemAccessibilityDelegateTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuItemAccessibilityDelegateTest.java @@ -19,6 +19,9 @@ package com.android.systemui.accessibility.floatingmenu; import static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.ACTION_ACCESSIBILITY_FOCUS; import static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.ACTION_CLEAR_ACCESSIBILITY_FOCUS; +import static com.android.systemui.Flags.FLAG_FLOATING_MENU_OVERLAPS_NAV_BARS_FLAG; +import static com.android.systemui.flags.SetFlagsRuleExtensionsKt.setFlagDefault; + import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.doReturn; @@ -72,6 +75,7 @@ public class MenuItemAccessibilityDelegateTest extends SysuiTestCase { @Before public void setUp() { + setFlagDefault(mSetFlagsRule, FLAG_FLOATING_MENU_OVERLAPS_NAV_BARS_FLAG); final WindowManager stubWindowManager = mContext.getSystemService(WindowManager.class); final MenuViewAppearance stubMenuViewAppearance = new MenuViewAppearance(mContext, stubWindowManager); diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuListViewTouchHandlerTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuListViewTouchHandlerTest.java index 98be49f9d493..a88ee108141b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuListViewTouchHandlerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuListViewTouchHandlerTest.java @@ -18,6 +18,9 @@ package com.android.systemui.accessibility.floatingmenu; import static android.view.View.OVER_SCROLL_NEVER; +import static com.android.systemui.Flags.FLAG_FLOATING_MENU_OVERLAPS_NAV_BARS_FLAG; +import static com.android.systemui.flags.SetFlagsRuleExtensionsKt.setFlagDefault; + import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.anyFloat; @@ -33,6 +36,7 @@ import android.view.MotionEvent; import android.view.WindowManager; import android.view.accessibility.AccessibilityManager; +import androidx.dynamicanimation.animation.DynamicAnimation; import androidx.recyclerview.widget.RecyclerView; import androidx.test.filters.SmallTest; @@ -79,6 +83,7 @@ public class MenuListViewTouchHandlerTest extends SysuiTestCase { @Before public void setUp() throws Exception { + setFlagDefault(mSetFlagsRule, FLAG_FLOATING_MENU_OVERLAPS_NAV_BARS_FLAG); final WindowManager windowManager = mContext.getSystemService(WindowManager.class); final MenuViewModel stubMenuViewModel = new MenuViewModel(mContext, mAccessibilityManager, mock(SecureSettings.class)); @@ -213,5 +218,6 @@ public class MenuListViewTouchHandlerTest extends SysuiTestCase { @After public void tearDown() { mMotionEventHelper.recycleEvents(); + mMenuAnimationController.mPositionAnimations.values().forEach(DynamicAnimation::cancel); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayerControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayerControllerTest.java index 31824ecaa432..41e5c209e344 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayerControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayerControllerTest.java @@ -19,6 +19,9 @@ package com.android.systemui.accessibility.floatingmenu; import static android.view.WindowInsets.Type.displayCutout; import static android.view.WindowInsets.Type.systemBars; +import static com.android.systemui.Flags.FLAG_FLOATING_MENU_OVERLAPS_NAV_BARS_FLAG; +import static com.android.systemui.flags.SetFlagsRuleExtensionsKt.setFlagDefault; + import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.verify; @@ -73,6 +76,7 @@ public class MenuViewLayerControllerTest extends SysuiTestCase { @Before public void setUp() throws Exception { + setFlagDefault(mSetFlagsRule, FLAG_FLOATING_MENU_OVERLAPS_NAV_BARS_FLAG); final WindowManager wm = mContext.getSystemService(WindowManager.class); doAnswer(invocation -> wm.getMaximumWindowMetrics()).when( mWindowManager).getMaximumWindowMetrics(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayerTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayerTest.java index 5bb5e01675be..b0776c9a5b58 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayerTest.java @@ -22,7 +22,9 @@ import static android.view.WindowInsets.Type.displayCutout; import static android.view.WindowInsets.Type.ime; import static android.view.WindowInsets.Type.systemBars; +import static com.android.systemui.Flags.FLAG_FLOATING_MENU_OVERLAPS_NAV_BARS_FLAG; import static com.android.systemui.accessibility.floatingmenu.MenuViewLayer.LayerIndex; +import static com.android.systemui.flags.SetFlagsRuleExtensionsKt.setFlagDefault; import static com.google.common.truth.Truth.assertThat; @@ -50,6 +52,7 @@ import android.view.WindowManager; import android.view.WindowMetrics; import android.view.accessibility.AccessibilityManager; +import androidx.dynamicanimation.animation.DynamicAnimation; import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; @@ -110,6 +113,7 @@ public class MenuViewLayerTest extends SysuiTestCase { @Before public void setUp() throws Exception { + setFlagDefault(mSetFlagsRule, FLAG_FLOATING_MENU_OVERLAPS_NAV_BARS_FLAG); final Rect mDisplayBounds = new Rect(); mDisplayBounds.set(/* left= */ 0, /* top= */ 0, DISPLAY_WINDOW_WIDTH, DISPLAY_WINDOW_HEIGHT); @@ -145,6 +149,7 @@ public class MenuViewLayerTest extends SysuiTestCase { UserHandle.USER_CURRENT); mMenuView.updateMenuMoveToTucked(/* isMoveToTucked= */ false); + mMenuAnimationController.mPositionAnimations.values().forEach(DynamicAnimation::cancel); mMenuViewLayer.onDetachedFromWindow(); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuViewTest.java index 5cd0fd0bb42d..ac2bfaf8eddf 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuViewTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuViewTest.java @@ -18,6 +18,9 @@ package com.android.systemui.accessibility.floatingmenu; import static android.app.UiModeManager.MODE_NIGHT_YES; +import static com.android.systemui.Flags.FLAG_FLOATING_MENU_OVERLAPS_NAV_BARS_FLAG; +import static com.android.systemui.flags.SetFlagsRuleExtensionsKt.setFlagDefault; + import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.mock; @@ -67,6 +70,7 @@ public class MenuViewTest extends SysuiTestCase { @Before public void setUp() throws Exception { + setFlagDefault(mSetFlagsRule, FLAG_FLOATING_MENU_OVERLAPS_NAV_BARS_FLAG); mUiModeManager = mContext.getSystemService(UiModeManager.class); mNightMode = mUiModeManager.getNightMode(); mUiModeManager.setNightMode(MODE_NIGHT_YES); diff --git a/packages/SystemUI/tests/src/com/android/systemui/flags/SetFlagsRuleExtensions.kt b/packages/SystemUI/tests/src/com/android/systemui/flags/SetFlagsRuleExtensions.kt new file mode 100644 index 000000000000..bb6786ade21a --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/flags/SetFlagsRuleExtensions.kt @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.flags + +import android.platform.test.flag.junit.SetFlagsRule + +fun SetFlagsRule.setFlagDefault(flagName: String) { + if (getFlagDefault(flagName)) { + enableFlags(flagName) + } else { + disableFlags(flagName) + } +} + +// NOTE: This code uses reflection to gain access to private members of aconfig generated +// classes (in the same way SetFlagsRule does internally) because this is the only way to get +// at the underlying information and read the current value of the flag. +// If aconfig had flag constants with accessible default values, this would be unnecessary. +private fun getFlagDefault(name: String): Boolean { + val flagPackage = name.substringBeforeLast(".") + val featureFlagsImplClass = Class.forName("$flagPackage.FeatureFlagsImpl") + val featureFlagsImpl = featureFlagsImplClass.getConstructor().newInstance() + val flagMethodName = name.substringAfterLast(".").snakeToCamelCase() + val flagGetter = featureFlagsImplClass.getDeclaredMethod(flagMethodName) + return flagGetter.invoke(featureFlagsImpl) as Boolean +} + +private fun String.snakeToCamelCase(): String { + val pattern = "_[a-z]".toRegex() + return replace(pattern) { it.value.last().uppercase() } +} diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/SysuiTestCase.java b/packages/SystemUI/tests/utils/src/com/android/systemui/SysuiTestCase.java index f7e0120d3843..6ef812be0350 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/SysuiTestCase.java +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/SysuiTestCase.java @@ -15,6 +15,8 @@ */ package com.android.systemui; +import static com.android.systemui.Flags.FLAG_EXAMPLE_FLAG; + import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; @@ -25,6 +27,7 @@ import android.os.Handler; import android.os.Looper; import android.os.MessageQueue; import android.os.ParcelFileDescriptor; +import android.platform.test.flag.junit.SetFlagsRule; import android.testing.DexmakerShareClassLoaderRule; import android.testing.LeakCheck; import android.testing.TestWithLooperRule; @@ -68,6 +71,9 @@ public abstract class SysuiTestCase { new AndroidXAnimatorIsolationRule(); @Rule + public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); + + @Rule public SysuiTestableContext mContext = new SysuiTestableContext( InstrumentationRegistry.getContext(), getLeakCheck()); @Rule @@ -88,6 +94,10 @@ public abstract class SysuiTestCase { if (isRobolectricTest()) { mContext = mContext.createDefaultDisplayContext(); } + // Set the value of a single gantry flag inside the com.android.systemui package to + // ensure all flags in that package are faked (and thus require a value to be set). + mSetFlagsRule.disableFlags(FLAG_EXAMPLE_FLAG); + mDependency = SysuiTestDependencyKt.installSysuiTestDependency(mContext); mFakeBroadcastDispatcher = new FakeBroadcastDispatcher( mContext, |